diff --git a/BUILD.gn b/BUILD.gn index fd7e052..9baf7278 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -139,7 +139,6 @@ "//ppapi/examples/url_loader", "//ppapi/examples/video_capture", "//ppapi/examples/video_decode", - "//ppapi/examples/video_effects", "//ppapi/examples/video_encode", "//printing:printing_unittests", "//third_party/SPIRV-Tools/src:SPIRV-Tools",
diff --git a/DEPS b/DEPS index 82d7d8a..4699a83 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '2f53025e8bf18690f7791204ba42c536319c803e', + 'skia_revision': '29a4a684af2525d78a1090fba2d3dea2b6a59fc7', # 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': 'e0a58f83255d1dae907e2ba4564ad8928a7dedf4', + 'v8_revision': '1b573e9fca9fcd54985cb34889d7c895314b9ec3', # 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. @@ -117,7 +117,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '9808d38c032a49476dcb4ce3891d6b8bd2128803', + 'angle_revision': '750e508722a9405278dfb1809f7ce667a3681072', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -129,7 +129,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'a38996be8593ba78d3eb31e30d2d6f7c61990ec6', + 'pdfium_revision': '424621e3129f7029283f72e953fe0c69f982d257', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -157,7 +157,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '2c8e6279a7bfc314f3934bc8d126ecb1e5e284f1', + 'freetype_revision': '9789c75b1a6faf01cbcc34d85bf1bb3f473743b1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -165,7 +165,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '5167fb3f6694b248f26ffac3b3c725cb52834e16', + 'catapult_revision': '638bda3a17c0a74db0e2cbd9a3f68a8419f9e7db', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -181,7 +181,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'feed_revision': '831b51c0ac199fea3278ceb9de361c22486da935', + 'feed_revision': 'b7306ddecfd12d00fad796c0db3425706850b973', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version # and whatever else without interference from each other. @@ -579,7 +579,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '246eeff7e1d8dfecbfcca8406f532076e1d3b876', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8a49a283b96c36a16538c6e3893a5661c987501f', 'condition': 'checkout_linux', }, @@ -594,17 +594,17 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '74d6276bbc07d7cbe1be69660b2216af1ffb38fa', + 'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + 'f64e5e47cf0b18553c5dee4626356c53751e90ec', 'condition': 'checkout_linux', }, 'src/third_party/custom_tabs_client/src': { - 'url': Var('chromium_git') + '/custom-tabs-client.git' + '@' + '81a14bc0885944a65afa81acd00da16cecb74b8b', + 'url': Var('chromium_git') + '/custom-tabs-client.git' + '@' + '7ad890c969e7fcae8cd078c1f109f2aadd0793ee', 'condition': 'checkout_android', }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e323bd9d2263bec69e692526123bacfc2cb84b16', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e6438547360b8cb0469095dffccc53faaac24477', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -943,7 +943,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '2d795663ffcc8744c4283176148ebd8f4400488e', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '1d289218f53f365c35bad517c63c99160558220f', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1098,7 +1098,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '7ca87fb1d3da3b3d2060886e8c58e726d74c8219', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'f18b35284288ac851b77db88df3e2e8d2273db97', + Var('webrtc_git') + '/src.git' + '@' + '62228c41ea17b1f33ab85e80962a931ef74aa593', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1129,7 +1129,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4458ecb45717e79238263aeae8571aef79e73eec', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@09307abef3ddacca9edf94cefe07e56a268bbe9e', 'condition': 'checkout_src_internal', }, @@ -1886,6 +1886,14 @@ '--arch=mips'], }, { + 'name': 'sysroot_mips64', + 'pattern': '.', + 'condition': 'checkout_linux and checkout_mips64', + 'action': ['python', 'src/build/linux/sysroot_scripts/install-sysroot.py', + '--arch=mips64el'], + }, + + { 'name': 'sysroot_x64', 'pattern': '.', 'condition': 'checkout_linux and checkout_x64', @@ -1925,7 +1933,7 @@ { 'name': 'binutils', 'pattern': 'src/third_party/binutils', - 'condition': 'host_os == "linux"', + 'condition': 'host_os == "linux" and host_cpu != "mips64"', 'action': [ 'python', 'src/third_party/binutils/download.py',
diff --git a/WATCHLISTS b/WATCHLISTS index 65d9fd5..e89c378 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -1416,6 +1416,11 @@ 'screen_orientation': { 'filepath': 'screen_orientation', }, + 'security': { + 'filepath': 'base/json/'\ + '|base/memory/.*shared_memory'\ + '|components/cbor/', + }, 'service_worker': { 'filepath': 'content/(browser|renderer|child|common)/service_worker/', }, @@ -2035,8 +2040,7 @@ 'halliwell+watch@chromium.org', 'lcwu+watch@chromium.org'], 'chromecast_public': ['gfhuang+watch@chromium.org'], - 'chromedriver': ['johnchen+watch@chromium.org', - 'kereliuk+watch@chromium.org'], + 'chromedriver': ['johnchen+watch@chromium.org'], 'chromeos': ['oshima+watch@chromium.org'], 'chromeos_attestation': ['dkrahn+watch@chromium.org'], 'chromeos_calculator': ['dharcourt@chromium.org'], @@ -2326,6 +2330,7 @@ 'safe_browsing': ['timvolodine@chromium.org', 'vakh+watch@chromium.org'], 'screen_orientation': ['mlamouri+watch-screen-orientation@chromium.org'], + 'security': ['security-watchlist@chromium.org'], 'service_worker': ['horo+watch@chromium.org', 'jsbell+serviceworker@chromium.org', 'kinuko+serviceworker@chromium.org',
diff --git a/android_webview/browser/aw_variations_service_client.cc b/android_webview/browser/aw_variations_service_client.cc index f7e34e9..7781ad84 100644 --- a/android_webview/browser/aw_variations_service_client.cc +++ b/android_webview/browser/aw_variations_service_client.cc
@@ -28,6 +28,10 @@ AwVariationsServiceClient::~AwVariationsServiceClient() {} +std::string AwVariationsServiceClient::GetApplicationLocale() { + return std::string(); +} + base::Callback<base::Version(void)> AwVariationsServiceClient::GetVersionForSimulationCallback() { return base::BindRepeating(&GetVersionForSimulation);
diff --git a/android_webview/browser/aw_variations_service_client.h b/android_webview/browser/aw_variations_service_client.h index c313038..0caf0fd 100644 --- a/android_webview/browser/aw_variations_service_client.h +++ b/android_webview/browser/aw_variations_service_client.h
@@ -25,6 +25,7 @@ ~AwVariationsServiceClient() override; private: + std::string GetApplicationLocale() override; base::Callback<base::Version(void)> GetVersionForSimulationCallback() override; scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index dce5551..6784ae3 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -101,8 +101,8 @@ private boolean mSpatialNavigationEnabled; // Default depends on device features. private boolean mEnableSupportedHardwareAcceleratedFeatures; private int mMixedContentMode = WebSettings.MIXED_CONTENT_NEVER_ALLOW; - private boolean mCSSHexAlphaColorEnabled = false; - private boolean mScrollTopLeftInteropEnabled = false; + private boolean mCSSHexAlphaColorEnabled; + private boolean mScrollTopLeftInteropEnabled; private boolean mOffscreenPreRaster; private int mDisabledMenuItems = WebSettings.MENU_ITEM_NONE;
diff --git a/android_webview/java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java b/android_webview/java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java index 89d0566..64e8fcb 100644 --- a/android_webview/java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java +++ b/android_webview/java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java
@@ -25,7 +25,7 @@ public class AwMinidumpUploaderDelegate implements MinidumpUploaderDelegate { private final ConnectivityManager mConnectivityManager; - private boolean mPermittedByUser = false; + private boolean mPermittedByUser; @VisibleForTesting public AwMinidumpUploaderDelegate() {
diff --git a/android_webview/java/src/org/chromium/android_webview/services/CrashReceiverService.java b/android_webview/java/src/org/chromium/android_webview/services/CrashReceiverService.java index 4e62b4fc..43e6af9 100644 --- a/android_webview/java/src/org/chromium/android_webview/services/CrashReceiverService.java +++ b/android_webview/java/src/org/chromium/android_webview/services/CrashReceiverService.java
@@ -32,7 +32,7 @@ private static final String WEBVIEW_TMP_CRASH_DIR = "WebView_Crashes_Tmp"; private final Object mCopyingLock = new Object(); - private boolean mIsCopying = false; + private boolean mIsCopying; @Override public void onCreate() {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java index 7e64bc10..31b0b49 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -725,7 +725,7 @@ }); } - private int mCnt = 0; + private int mCnt; private AwAutofillTest mTest; private volatile Integer mSessionValue; private HashMap<MetricsUtils.HistogramDelta, Integer> mSessionDelta;
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc index 5df4fd7..7449b90b 100644 --- a/android_webview/lib/aw_main_delegate.cc +++ b/android_webview/lib/aw_main_delegate.cc
@@ -118,6 +118,9 @@ // metadata and controls. cl->AppendSwitch(switches::kDisableMediaSessionAPI); + // Background Fetch is not supported. + cl->AppendSwitch(switches::kDisableBackgroundFetch); + #if defined(V8_USE_EXTERNAL_STARTUP_DATA) if (cl->GetSwitchValueASCII(switches::kProcessType).empty()) { // Browser process (no type specified).
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java index 1b10e0c..8fce2971 100644 --- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java +++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
@@ -110,7 +110,7 @@ // Each time we make a request, store it here with an int key. onRequestPermissionsResult will // look up the request in order to grant the approprate permissions. private SparseArray<PermissionRequest> mPendingRequests = new SparseArray<PermissionRequest>(); - private int mNextRequestKey = 0; + private int mNextRequestKey; // Work around our wonky API by wrapping a geo permission prompt inside a regular // PermissionRequest.
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewLayoutTestActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewLayoutTestActivity.java index f267f27..bf84d11 100644 --- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewLayoutTestActivity.java +++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewLayoutTestActivity.java
@@ -8,7 +8,6 @@ import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; - import android.webkit.ConsoleMessage; import android.webkit.GeolocationPermissions; import android.webkit.PermissionRequest; @@ -33,8 +32,8 @@ private static final String TEST_FINISHED_SENTINEL = "TEST FINISHED"; private WebView mWebView; - private boolean mFinished = false; - private boolean mGrantPermission = false; + private boolean mFinished; + private boolean mGrantPermission; @Override public void onCreate(Bundle savedInstanceState) {
diff --git a/android_webview/unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java b/android_webview/unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java index d31a3c6..6e046c99 100644 --- a/android_webview/unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java +++ b/android_webview/unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java
@@ -51,7 +51,7 @@ @CalledByNative static InputStream getCountingStream(final int size) { return new InputStream() { - private int mCount = 0; + private int mCount; @Override public int read() {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 62aad965..dbfbfb2a 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1117,8 +1117,6 @@ "wm/drag_window_controller.cc", "wm/drag_window_controller.h", "wm/drag_window_resizer.cc", - "wm/drag_window_resizer_mash.cc", - "wm/drag_window_resizer_mash.h", "wm/event_client_impl.cc", "wm/event_client_impl.h", "wm/focus_rules.cc",
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 35ee3d06..515c02c 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc
@@ -31,7 +31,6 @@ #include "ash/new_window_controller.h" #include "ash/public/cpp/app_list/app_list_constants.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/root_window_controller.h" #include "ash/rotator/window_rotation.h" @@ -805,12 +804,6 @@ } bool CanHandleToggleDockedMagnifier() { - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) { - // TODO: Mash support for the Docked Magnifier https://crbug.com/814481. - NOTIMPLEMENTED(); - return false; - } - return features::IsDockedMagnifierEnabled(); } @@ -928,17 +921,6 @@ } } -bool CanHandleToggleFullscreenMagnifier() { - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) { - // TODO: Mash support for the Fullscreen Magnifier - // https://crbug.com/821551. - NOTIMPLEMENTED(); - return false; - } - - return true; -} - void HandleToggleFullscreenMagnifier() { base::RecordAction(UserMetricsAction("Accel_Toggle_Fullscreen_Magnifier")); @@ -1007,12 +989,6 @@ // Change the scale of the active magnifier. void HandleActiveMagnifierZoom(int delta_index) { - // TODO(crbug.com/612331): Mash support. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) { - NOTIMPLEMENTED(); - return; - } - if (Shell::Get()->magnification_controller()->IsEnabled()) { Shell::Get()->magnification_controller()->StepToNextScaleValue(delta_index); return; @@ -1339,7 +1315,7 @@ case TOGGLE_DOCKED_MAGNIFIER: return CanHandleToggleDockedMagnifier(); case TOGGLE_FULLSCREEN_MAGNIFIER: - return CanHandleToggleFullscreenMagnifier(); + return true; case TOGGLE_MESSAGE_CENTER_BUBBLE: return CanHandleToggleMessageCenterBubble(); case TOGGLE_MIRROR_MODE:
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc index 768cc4f..e207b35 100644 --- a/ash/accelerators/accelerator_controller_unittest.cc +++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -18,7 +18,6 @@ #include "ash/media_controller.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/interfaces/ime_info.mojom.h" #include "ash/session/session_controller.h"
diff --git a/ash/accessibility/accessibility_controller_unittest.cc b/ash/accessibility/accessibility_controller_unittest.cc index f9f4af0..da15071 100644 --- a/ash/accessibility/accessibility_controller_unittest.cc +++ b/ash/accessibility/accessibility_controller_unittest.cc
@@ -12,7 +12,6 @@ #include "ash/public/cpp/ash_constants.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/sticky_keys/sticky_keys_controller.h"
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 2e91538..d40f3d7 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -19,7 +19,6 @@ #include "ash/assistant/assistant_ui_controller.h" #include "ash/public/cpp/app_list/answer_card_contents_registry.h" #include "ash/public/cpp/app_list/app_list_features.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/voice_interaction/voice_interaction_controller.h"
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index fdc1385f..d8a0a94 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <algorithm> #include <memory> #include "ash/app_list/model/app_list_view_state.h" @@ -27,6 +28,7 @@ #include "ash/shell_test_api.h" #include "ash/test/ash_test_base.h" #include "ash/wallpaper/wallpaper_controller_test_api.h" +#include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/window_selector_controller.h" #include "ash/wm/root_window_finder.h" #include "ash/wm/splitview/split_view_controller.h" @@ -1440,19 +1442,35 @@ EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(0)), - window2(CreateTestWindowInShellWithId(1)); + window2(CreateTestWindowInShellWithId(1)), + window3(CreateTestWindowInShellWithId(2)); wm::WindowState *state1 = wm::GetWindowState(window1.get()), - *state2 = wm::GetWindowState(window2.get()); + *state2 = wm::GetWindowState(window2.get()), + *state3 = wm::GetWindowState(window3.get()); state1->Maximize(); state2->Maximize(); + state3->Maximize(); EXPECT_TRUE(state1->IsMaximized()); EXPECT_TRUE(state2->IsMaximized()); + EXPECT_TRUE(state3->IsMaximized()); + + // The windows need to be activated for the mru window tracker. + wm::ActivateWindow(window1.get()); + wm::ActivateWindow(window2.get()); + wm::ActivateWindow(window3.get()); + auto ordering = Shell::Get()->mru_window_tracker()->BuildWindowForCycleList(); // Press app list button. PressAppListButton(); EXPECT_TRUE(state1->IsMinimized()); EXPECT_TRUE(state2->IsMinimized()); + EXPECT_TRUE(state3->IsMinimized()); GetAppListTestHelper()->CheckVisibility(true); + + // Tests that the window ordering remains the same as before we minimize. + EXPECT_TRUE(std::equal( + ordering.begin(), ordering.end(), + Shell::Get()->mru_window_tracker()->BuildWindowForCycleList().begin())); } // Tests that the app list button will end split view mode.
diff --git a/ash/app_list/home_launcher_gesture_handler.cc b/ash/app_list/home_launcher_gesture_handler.cc index b751b43..df0ee9e2 100644 --- a/ash/app_list/home_launcher_gesture_handler.cc +++ b/ash/app_list/home_launcher_gesture_handler.cc
@@ -6,6 +6,7 @@ #include "ash/app_list/app_list_controller_impl.h" #include "ash/app_list/model/app_list_view_state.h" +#include "ash/root_window_controller.h" #include "ash/screen_util.h" #include "ash/shell.h" #include "ash/wm/mru_window_tracker.h" @@ -13,6 +14,10 @@ #include "ash/wm/splitview/split_view_controller.h" #include "ash/wm/window_state.h" #include "ash/wm/window_transient_descendant_iterator.h" +#include "ash/wm/workspace/backdrop_controller.h" +#include "ash/wm/workspace/workspace_layout_manager.h" +#include "ash/wm/workspace_controller.h" +#include "base/metrics/user_metrics.h" #include "base/numerics/ranges.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/window_types.h" @@ -56,20 +61,20 @@ if (!Shell::Get()->app_list_controller()->IsHomeLauncherEnabledInTabletMode()) return false; - if (Shell::Get()->split_view_controller()->IsSplitViewModeActive()) - return false; - - if (Shell::Get()->window_selector_controller()->IsSelecting()) - return false; - if (window->type() == aura::client::WINDOW_TYPE_POPUP) return false; if (::wm::GetTransientParent(window)) return false; - wm::WindowState* state = wm::GetWindowState(window); - return state->CanMaximize() && state->CanResize(); + // TODO(sammiequon): Make this feature work for these cases below. + if (Shell::Get()->split_view_controller()->IsSplitViewModeActive()) + return false; + + if (Shell::Get()->window_selector_controller()->IsSelecting()) + return false; + + return true; } // Find the transform that will convert |src| to |dst|. @@ -80,34 +85,28 @@ dst.y() - src.y()); } -// Get the target offscreen bounds of |window|. These bounds will be used to -// calculate the transform which will move |window| out and offscreen. The width -// will be a ratio of the work area, and the height will maintain the aspect -// ratio. -gfx::RectF GetOffscreenBounds(aura::Window* window) { - gfx::RectF bounds = gfx::RectF(window->GetTargetBounds()); - gfx::RectF work_area = - gfx::RectF(screen_util::GetDisplayWorkAreaBoundsInParent(window)); - float aspect_ratio = bounds.width() / bounds.height(); - work_area.set_x(((1.f - kWidthRatio) / 2.f) * work_area.width() + - work_area.x()); - work_area.set_width(kWidthRatio * work_area.width()); - work_area.set_height(work_area.width() / aspect_ratio); - work_area.set_y(work_area.y() - work_area.height()); - return work_area; +// Get the target offscreen workspace bounds. +gfx::RectF GetOffscreenWorkspaceBounds(const gfx::RectF& work_area) { + gfx::RectF new_work_area; + new_work_area.set_x(((1.f - kWidthRatio) / 2.f) * work_area.width() + + work_area.x()); + new_work_area.set_width(kWidthRatio * work_area.width()); + new_work_area.set_height(kWidthRatio * work_area.height()); + new_work_area.set_y(work_area.y() - work_area.height()); + return new_work_area; } -// Get the target bounds of a transient descendant of the window we are hiding. -// It should maintain the same ratios to the main window. -gfx::RectF GetTransientDescendantBounds(aura::Window* transient_descendant, - const gfx::RectF& src, - const gfx::RectF& dst) { - gfx::RectF bounds = gfx::RectF(transient_descendant->GetTargetBounds()); - float ratio = dst.width() / src.width(); +// Get the target bounds of a window. It should maintain the same ratios +// relative the work area. +gfx::RectF GetOffscreenWindowBounds(aura::Window* window, + const gfx::RectF& src_work_area, + const gfx::RectF& dst_work_area) { + gfx::RectF bounds = gfx::RectF(window->GetTargetBounds()); + float ratio = dst_work_area.width() / src_work_area.width(); gfx::RectF dst_bounds; - dst_bounds.set_x(bounds.x() * ratio + dst.x()); - dst_bounds.set_y(bounds.y() * ratio + dst.y()); + dst_bounds.set_x(bounds.x() * ratio + dst_work_area.x()); + dst_bounds.set_y(bounds.y() * ratio + dst_work_area.y()); dst_bounds.set_width(bounds.width() * ratio); dst_bounds.set_height(bounds.height() * ratio); return dst_bounds; @@ -130,6 +129,18 @@ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); } +// Returns the window of the widget which contains the workspace backdrop. May +// be nullptr if the backdrop is not shown. +aura::Window* GetBackdropWindow(aura::Window* window) { + WorkspaceLayoutManager* layout_manager = + RootWindowController::ForWindow(window->GetRootWindow()) + ->workspace_controller() + ->layout_manager(); + return layout_manager + ? layout_manager->backdrop_controller()->backdrop_window() + : nullptr; +} + // Helper class to perform window state changes without animations. Used to hide // and minimize windows without having their animation interfere with the ones // this class is in charge of. @@ -177,6 +188,10 @@ DCHECK_NE(Mode::kNone, mode); mode_ = mode; + base::RecordAction(base::UserMetricsAction( + mode_ == Mode::kSwipeDownToHide + ? "AppList_HomeLauncherToMRUWindowAttempt" + : "AppList_CurrentWindowToHomeLauncherAttempt")); window_ = windows[0]; window_->AddObserver(this); windows.erase(windows.begin()); @@ -188,14 +203,35 @@ window_->layer()->SetOpacity(1.f); } - const gfx::RectF& current_bounds = gfx::RectF(window_->GetTargetBounds()); - const gfx::RectF& target_bounds = GetOffscreenBounds(window_); + const gfx::RectF work_area = + gfx::RectF(screen_util::GetDisplayWorkAreaBoundsInParent(window_)); + const gfx::RectF target_work_area = GetOffscreenWorkspaceBounds(work_area); // Calculate the values for the main window. + const gfx::RectF& current_bounds = gfx::RectF(window_->GetTargetBounds()); window_values_.initial_opacity = window_->layer()->opacity(); window_values_.initial_transform = window_->transform(); window_values_.target_opacity = 0.f; - window_values_.target_transform = - CalculateTransform(current_bounds, target_bounds); + window_values_.target_transform = CalculateTransform( + current_bounds, + GetOffscreenWindowBounds(window_, work_area, target_work_area)); + + aura::Window* backdrop_window = GetBackdropWindow(window_); + if (backdrop_window) { + // Store the values needed to transform the backdrop. The backdrop actually + // covers the area behind the shelf as well, so initially transform it to be + // sized to the work area. Without the transform tweak, there is an extra + // shelf sized black area under |window_|. + backdrop_values_ = base::make_optional(WindowValues()); + backdrop_values_->initial_opacity = 1.f; + backdrop_values_->initial_transform = gfx::Transform( + 1.f, 0.f, 0.f, + work_area.height() / + static_cast<float>(backdrop_window->bounds().height()), + 0.f, 0.f); + backdrop_values_->target_opacity = 0.f; + backdrop_values_->target_transform = CalculateTransform( + gfx::RectF(backdrop_window->bounds()), target_work_area); + } // Calculate the values for any transient descendants. transient_descendants_values_.clear(); @@ -209,7 +245,7 @@ values.target_opacity = 0.f; values.target_transform = CalculateTransform( gfx::RectF(window->GetTargetBounds()), - GetTransientDescendantBounds(window, current_bounds, target_bounds)); + GetOffscreenWindowBounds(window, work_area, target_work_area)); window->AddObserver(this); transient_descendants_values_[window] = values; } @@ -248,9 +284,18 @@ return false; last_event_location_ = base::make_optional(location); - UpdateWindows( - GetHeightInWorkAreaAsRatio(location.y(), window_) > 0.5 ? 1.0 : 0.0, - /*animate=*/true); + const bool hide_window = + GetHeightInWorkAreaAsRatio(location.y(), window_) > 0.5; + UpdateWindows(hide_window ? 1.0 : 0.0, /*animate=*/true); + + if (!hide_window && mode_ == Mode::kSwipeDownToHide) { + base::RecordAction( + base::UserMetricsAction("AppList_HomeLauncherToMRUWindow")); + } else if (hide_window && mode_ == Mode::kSwipeUpToShow) { + base::RecordAction( + base::UserMetricsAction("AppList_CurrentWindowToHomeLauncher")); + } + return true; } @@ -299,9 +344,18 @@ DCHECK(last_event_location_); DCHECK(window_); + // Update the backdrop first as the backdrop controller listens for some state + // changes like minimizing below which may also alter the backdrop. + aura::Window* backdrop_window = GetBackdropWindow(window_); + if (backdrop_window) { + backdrop_window->SetTransform(gfx::Transform()); + backdrop_window->layer()->SetOpacity(1.f); + } + if (GetHeightInWorkAreaAsRatio(last_event_location_->y(), window_) > 0.5) { // Minimize the hidden windows so they can be used normally with alt+tab - // and overview. + // and overview. Minimize in reverse order to preserve mru ordering. + std::reverse(hidden_windows_.begin(), hidden_windows_.end()); for (auto* window : hidden_windows_) { ScopedAnimationDisabler disable(window); wm::GetWindowState(window)->Minimize(); @@ -351,6 +405,11 @@ window->SetTransform(transform); }; + aura::Window* backdrop_window = GetBackdropWindow(window_); + if (backdrop_window && backdrop_values_) { + update_windows_helper(progress, animate, backdrop_window, + *backdrop_values_); + } for (const auto& descendant : transient_descendants_values_) { update_windows_helper(progress, animate, descendant.first, descendant.second); @@ -375,6 +434,7 @@ } void HomeLauncherGestureHandler::RemoveObserversAndStopTracking() { + backdrop_values_ = base::nullopt; last_event_location_ = base::nullopt; mode_ = Mode::kNone;
diff --git a/ash/app_list/home_launcher_gesture_handler.h b/ash/app_list/home_launcher_gesture_handler.h index 551e9a2..b6fbba2 100644 --- a/ash/app_list/home_launcher_gesture_handler.h +++ b/ash/app_list/home_launcher_gesture_handler.h
@@ -90,6 +90,10 @@ // Original and target transform and opacity of |window_|. WindowValues window_values_; + // Original and target transform and opacity of the backdrop window. Empty if + // there is no backdrop on mouse pressed. + base::Optional<WindowValues> backdrop_values_; + // Tracks the transient descendants of |window_| and their initial and target // opacities and transforms. std::map<aura::Window*, WindowValues> transient_descendants_values_;
diff --git a/ash/app_list/presenter/BUILD.gn b/ash/app_list/presenter/BUILD.gn index 9f2dce6..eebfebc 100644 --- a/ash/app_list/presenter/BUILD.gn +++ b/ash/app_list/presenter/BUILD.gn
@@ -25,6 +25,7 @@ "//ui/aura", "//ui/compositor", "//ui/gfx/geometry", + "//ui/keyboard", "//ui/views", # Temporary dependency to fix compile flake in http://crbug.com/611898.
diff --git a/ash/app_list/presenter/app_list_presenter_impl.cc b/ash/app_list/presenter/app_list_presenter_impl.cc index 2b5a229d..efc16d4 100644 --- a/ash/app_list/presenter/app_list_presenter_impl.cc +++ b/ash/app_list/presenter/app_list_presenter_impl.cc
@@ -26,6 +26,7 @@ #include "ui/display/screen.h" #include "ui/display/types/display_constants.h" #include "ui/gfx/presentation_feedback.h" +#include "ui/keyboard/keyboard_controller.h" #include "ui/views/widget/widget.h" namespace app_list { @@ -383,6 +384,14 @@ !delegate_->IsHomeLauncherEnabledInTabletMode()) { Dismiss(base::TimeTicks()); } + if (applist_container->Contains(gained_focus) && + keyboard::KeyboardController::HasInstance()) { + auto* const keyboard_controller = keyboard::KeyboardController::Get(); + if (keyboard_controller->enabled() && + keyboard_controller->IsKeyboardVisible()) { + keyboard_controller->HideKeyboardImplicitlyBySystem(); + } + } } }
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc index e306f58..23e972e9 100644 --- a/ash/assistant/assistant_ui_controller.cc +++ b/ash/assistant/assistant_ui_controller.cc
@@ -72,8 +72,13 @@ void AssistantUiController::OnWidgetActivationChanged(views::Widget* widget, bool active) { - if (active) + if (active) { container_view_->RequestFocus(); + } else { + // When the widget is deactivated the UI should hide. Interacting with + // the metalayer does not cause widget deactivation. + HideUi(AssistantSource::kUnspecified); + } } void AssistantUiController::OnWidgetVisibilityChanged(views::Widget* widget, @@ -251,8 +256,11 @@ return; } - if (assistant_ui_model_.visibility() == AssistantVisibility::kVisible) + if (assistant_ui_model_.visibility() == AssistantVisibility::kVisible) { + // If Assistant window is already visible, we just try to retake focus. + container_view_->GetWidget()->Activate(); return; + } if (!container_view_) { container_view_ = new AssistantContainerView(assistant_controller_);
diff --git a/ash/assistant/assistant_ui_controller.h b/ash/assistant/assistant_ui_controller.h index 1a5f90e..b4919b1d 100644 --- a/ash/assistant/assistant_ui_controller.h +++ b/ash/assistant/assistant_ui_controller.h
@@ -5,6 +5,9 @@ #ifndef ASH_ASSISTANT_ASSISTANT_UI_CONTROLLER_H_ #define ASH_ASSISTANT_ASSISTANT_UI_CONTROLLER_H_ +#include <map> +#include <string> + #include "ash/ash_export.h" #include "ash/assistant/assistant_controller_observer.h" #include "ash/assistant/model/assistant_interaction_model_observer.h"
diff --git a/ash/assistant/ui/assistant_container_view.cc b/ash/assistant/ui/assistant_container_view.cc index fd3ed26a..e3e787a7 100644 --- a/ash/assistant/ui/assistant_container_view.cc +++ b/ash/assistant/ui/assistant_container_view.cc
@@ -33,7 +33,6 @@ // Appearance. constexpr SkColor kBackgroundColor = SK_ColorWHITE; -constexpr int kCornerRadiusDip = 20; constexpr int kMiniUiCornerRadiusDip = 24; constexpr int kMarginBottomDip = 8;
diff --git a/ash/assistant/ui/assistant_ui_constants.h b/ash/assistant/ui/assistant_ui_constants.h index 8349e30..e1d36f2 100644 --- a/ash/assistant/ui/assistant_ui_constants.h +++ b/ash/assistant/ui/assistant_ui_constants.h
@@ -15,6 +15,7 @@ namespace ash { // Appearance. +constexpr int kCornerRadiusDip = 20; constexpr int kMaxHeightDip = 640; constexpr int kPaddingDip = 14; constexpr int kPreferredWidthDip = 640;
diff --git a/ash/assistant/ui/assistant_web_view.cc b/ash/assistant/ui/assistant_web_view.cc index 4667c77b..2644401 100644 --- a/ash/assistant/ui/assistant_web_view.cc +++ b/ash/assistant/ui/assistant_web_view.cc
@@ -12,7 +12,10 @@ #include "ash/public/interfaces/web_contents_manager.mojom.h" #include "base/callback.h" #include "base/unguessable_token.h" +#include "ui/aura/window.h" +#include "ui/compositor/layer.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/painter.h" namespace ash { @@ -47,6 +50,13 @@ SchedulePaint(); } +void AssistantWebView::OnViewBoundsChanged(views::View* view) { + DCHECK_EQ(content_view_, view); + + // The mask layer should always match the bounds of the content view. + content_view_mask_->layer()->SetBounds(content_view_->GetLocalBounds()); +} + void AssistantWebView::InitLayout() { SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); @@ -56,6 +66,13 @@ caption_bar_->set_delegate(this); caption_bar_->SetButtonVisible(CaptionButtonId::kMinimize, false); AddChildView(caption_bar_); + + // Content mask. + // This is used to enforce corner radius on the contents' layer. + content_view_mask_ = views::Painter::CreatePaintedLayer( + views::Painter::CreateSolidRoundRectPainter(SK_ColorBLACK, + kCornerRadiusDip)); + content_view_mask_->layer()->SetFillsBoundsOpaquely(false); } bool AssistantWebView::OnCaptionButtonPressed(CaptionButtonId id) { @@ -121,6 +138,14 @@ if (app_list::AnswerCardContentsRegistry::Get()) { content_view_ = app_list::AnswerCardContentsRegistry::Get()->GetView( embed_token.value()); + content_view_->AddObserver(this); + + // Apply our layer mask which enforces corner radius. + app_list::AnswerCardContentsRegistry::Get() + ->GetNativeView(embed_token.value()) + ->layer() + ->SetMaskLayer(content_view_mask_->layer()); + AddChildView(content_view_); }
diff --git a/ash/assistant/ui/assistant_web_view.h b/ash/assistant/ui/assistant_web_view.h index af25653..0e63438 100644 --- a/ash/assistant/ui/assistant_web_view.h +++ b/ash/assistant/ui/assistant_web_view.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/optional.h" #include "ui/views/view.h" +#include "ui/views/view_observer.h" namespace base { class UnguessableToken; @@ -26,6 +27,7 @@ // for window level controls and a WebView/ServerRemoteViewHost for embedding // web contents. class AssistantWebView : public views::View, + public views::ViewObserver, public AssistantControllerObserver, public CaptionBarDelegate { public: @@ -37,6 +39,9 @@ int GetHeightForWidth(int width) const override; void ChildPreferredSizeChanged(views::View* child) override; + // views::ViewObserver: + void OnViewBoundsChanged(views::View* view) override; + // CaptionBarDelegate: bool OnCaptionButtonPressed(CaptionButtonId id) override; @@ -59,6 +64,12 @@ // view is owned by the WebContentsManager. views::View* content_view_; + // Our contents are drawn to a layer that is not masked by our widget's layer. + // This causes our contents to ignore the corner radius that we have set on + // the widget. To address this, we apply a separate layer mask to the + // contents' layer enforcing our desired corner radius. + std::unique_ptr<ui::LayerOwner> content_view_mask_; + // Uniquely identifies web contents owned by WebContentsManager. base::Optional<base::UnguessableToken> web_contents_id_token_;
diff --git a/ash/assistant/ui/caption_bar.cc b/ash/assistant/ui/caption_bar.cc index 37ed4b5..61dfd73 100644 --- a/ash/assistant/ui/caption_bar.cc +++ b/ash/assistant/ui/caption_bar.cc
@@ -47,6 +47,20 @@ CaptionBar::~CaptionBar() = default; +bool CaptionBar::AcceleratorPressed(const ui::Accelerator& accelerator) { + switch (accelerator.key_code()) { + case ui::VKEY_BROWSER_BACK: + HandleButton(CaptionButtonId::kBack); + break; + default: + NOTREACHED(); + return false; + } + + // Don't let DialogClientView handle the accelerator. + return true; +} + gfx::Size CaptionBar::CalculatePreferredSize() const { return gfx::Size(INT_MAX, GetHeightForWidth(INT_MAX)); } @@ -55,6 +69,17 @@ return kPreferredHeightDip; } +void CaptionBar::ButtonPressed(views::Button* sender, const ui::Event& event) { + auto id = static_cast<CaptionButtonId>(sender->id()); + HandleButton(id); +} + +void CaptionBar::SetButtonVisible(CaptionButtonId id, bool visible) { + views::View* button = GetViewByID(static_cast<int>(id)); + if (button) + button->SetVisible(visible); +} + void CaptionBar::InitLayout() { views::BoxLayout* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>( @@ -87,10 +112,13 @@ CreateCaptionButton(kWindowControlCloseIcon, IDS_APP_ACCNAME_CLOSE, this); close_button->set_id(static_cast<int>(CaptionButtonId::kClose)); AddChildView(close_button); + + AddAccelerator(ui::Accelerator(ui::VKEY_BROWSER_BACK, ui::EF_NONE)); } -void CaptionBar::ButtonPressed(views::Button* sender, const ui::Event& event) { - CaptionButtonId id = static_cast<CaptionButtonId>(sender->id()); +void CaptionBar::HandleButton(CaptionButtonId id) { + if (!GetViewByID(static_cast<int>(id))->visible()) + return; // If the delegate returns |true| it has handled the event and wishes to // prevent default behavior from being performed. @@ -109,10 +137,4 @@ } } -void CaptionBar::SetButtonVisible(CaptionButtonId id, bool visible) { - views::View* button = GetViewByID(static_cast<int>(id)); - if (button) - button->SetVisible(visible); -} - } // namespace ash
diff --git a/ash/assistant/ui/caption_bar.h b/ash/assistant/ui/caption_bar.h index 971cf89..3d3e8b3a 100644 --- a/ash/assistant/ui/caption_bar.h +++ b/ash/assistant/ui/caption_bar.h
@@ -39,6 +39,7 @@ ~CaptionBar() override; // views::View: + bool AcceleratorPressed(const ui::Accelerator& accelerator) override; gfx::Size CalculatePreferredSize() const override; int GetHeightForWidth(int width) const override; @@ -52,6 +53,7 @@ private: void InitLayout(); + void HandleButton(CaptionButtonId id); CaptionBarDelegate* delegate_ = nullptr;
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc index 38908ef..bba956db 100644 --- a/ash/assistant/ui/main_stage/assistant_footer_view.cc +++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -75,6 +75,24 @@ PreferredSizeChanged(); } +void AssistantFooterView::SetFocusBehavior(FocusBehavior focus_behavior) { + switch (focus_behavior) { + case FocusBehavior::NEVER: + // When focus behavior is NEVER, we update both views. + suggestion_container_->SetFocusBehavior(FocusBehavior::NEVER); + opt_in_view_->SetFocusBehavior(FocusBehavior::NEVER); + break; + case FocusBehavior::ALWAYS: + // When focus behavior is ALWAYS, we need to respect opt in state. + UpdateFocusBehavior(); + break; + case FocusBehavior::ACCESSIBLE_ONLY: + // We don't currently use ACCESSIBLE_ONLY focus behavior. + NOTREACHED(); + break; + } +} + void AssistantFooterView::InitLayout() { SetLayoutManager(std::make_unique<views::FillLayout>()); @@ -82,8 +100,6 @@ const bool setup_completed = Shell::Get()->voice_interaction_controller()->setup_completed(); - LOG(ERROR) << "eyor: setup_completed: " << setup_completed; - // Suggestion container. suggestion_container_ = new SuggestionContainerView(assistant_controller_); suggestion_container_->set_can_process_events_within_subtree(setup_completed); @@ -92,7 +108,6 @@ suggestion_container_->SetPaintToLayer(); suggestion_container_->layer()->SetFillsBoundsOpaquely(false); suggestion_container_->layer()->SetOpacity(setup_completed ? 1.f : 0.f); - suggestion_container_->SetVisible(setup_completed); AddChildView(suggestion_container_); @@ -105,9 +120,11 @@ opt_in_view_->SetPaintToLayer(); opt_in_view_->layer()->SetFillsBoundsOpaquely(false); opt_in_view_->layer()->SetOpacity(setup_completed ? 0.f : 1.f); - opt_in_view_->SetVisible(!setup_completed); AddChildView(opt_in_view_); + + // Initialize focus behavior. + UpdateFocusBehavior(setup_completed); } void AssistantFooterView::OnVoiceInteractionSetupCompleted(bool completed) { @@ -115,8 +132,6 @@ using assistant::util::CreateOpacityElement; using assistant::util::StartLayerAnimationSequence; - LOG(ERROR) << "eyor: completed: " << completed; - // When the consent state changes, we need to hide/show the appropriate views. views::View* hide_view = completed ? static_cast<views::View*>(opt_in_view_) @@ -126,14 +141,15 @@ completed ? static_cast<views::View*>(suggestion_container_) : static_cast<views::View*>(opt_in_view_); - // Reset visibility to enable animation. - hide_view->SetVisible(true); - show_view->SetVisible(true); + // Views should not be focusable while they're animating. + suggestion_container_->SetFocusBehavior(FocusBehavior::NEVER); + opt_in_view_->SetFocusBehavior(FocusBehavior::NEVER); // Hide the view for the previous consent state by fading to 0% opacity. StartLayerAnimationSequence(hide_view->layer()->GetAnimator(), CreateLayerAnimationSequence(CreateOpacityElement( 0.f, kAnimationFadeOutDuration)), + // Observe the animation. animation_observer_.get()); // Show the view for the next consent state by fading to 100% opacity with @@ -166,12 +182,25 @@ // Only the view relevant to our consent state should process events. suggestion_container_->set_can_process_events_within_subtree(setup_completed); - suggestion_container_->SetVisible(setup_completed); opt_in_view_->set_can_process_events_within_subtree(!setup_completed); - opt_in_view_->SetVisible(!setup_completed); + + UpdateFocusBehavior(setup_completed); // Return false to prevent the observer from destroying itself. return false; } +void AssistantFooterView::UpdateFocusBehavior( + base::Optional<bool> setup_completed) { + if (!setup_completed.has_value()) { + setup_completed = + Shell::Get()->voice_interaction_controller()->setup_completed(); + } + + suggestion_container_->SetFocusBehavior( + setup_completed.value() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); + opt_in_view_->SetFocusBehavior( + setup_completed.value() ? FocusBehavior::NEVER : FocusBehavior::ALWAYS); +} + } // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.h b/ash/assistant/ui/main_stage/assistant_footer_view.h index e26afb0..8011920 100644 --- a/ash/assistant/ui/main_stage/assistant_footer_view.h +++ b/ash/assistant/ui/main_stage/assistant_footer_view.h
@@ -9,6 +9,7 @@ #include "ash/public/interfaces/voice_interaction_controller.mojom.h" #include "base/macros.h" +#include "base/optional.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "ui/views/view.h" @@ -45,12 +46,17 @@ mojom::AssistantAllowedState state) override {} void OnLocaleChanged(const std::string& locale) override {} + void SetFocusBehavior(FocusBehavior focus_behavior); + private: void InitLayout(); void OnAnimationStarted(const ui::CallbackLayerAnimationObserver& observer); bool OnAnimationEnded(const ui::CallbackLayerAnimationObserver& observer); + void UpdateFocusBehavior( + base::Optional<bool> setup_completed = base::nullopt); + AssistantController* const assistant_controller_; // Owned by Shell. SuggestionContainerView* suggestion_container_; // Owned by view hierarchy.
diff --git a/ash/assistant/ui/main_stage/assistant_main_stage.cc b/ash/assistant/ui/main_stage/assistant_main_stage.cc index 5c92d3aa..032b02e4 100644 --- a/ash/assistant/ui/main_stage/assistant_main_stage.cc +++ b/ash/assistant/ui/main_stage/assistant_main_stage.cc
@@ -648,8 +648,8 @@ // When it is not visible, it should not process events. bool visible = !committed_query_view_ && !pending_query_view_; - // Reset visibility to enable animation. - footer_->SetVisible(true); + // The footer should not be focusable while it's animating. + footer_->SetFocusBehavior(FocusBehavior::NEVER); if (visible) { // The footer will animate up into position so we need to set an initial @@ -704,7 +704,8 @@ // there is no committed or pending query view. bool visible = !committed_query_view_ && !pending_query_view_; footer_->set_can_process_events_within_subtree(visible); - footer_->SetVisible(visible); + footer_->SetFocusBehavior(visible ? FocusBehavior::ALWAYS + : FocusBehavior::NEVER); // Return false so that the observer does not destroy itself. return false;
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc index b8f584457..8349112d 100644 --- a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc +++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
@@ -91,6 +91,16 @@ label_->SizeToFit(width()); } +void AssistantOptInView::ButtonPressed(views::Button* sender, + const ui::Event& event) { + if (delegate_) + delegate_->OnOptInButtonPressed(); +} + +void AssistantOptInView::SetFocusBehavior(FocusBehavior focus_behavior) { + container_->SetFocusBehavior(focus_behavior); +} + void AssistantOptInView::InitLayout() { views::BoxLayout* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>( @@ -103,18 +113,17 @@ views::BoxLayout::MainAxisAlignment::MAIN_AXIS_ALIGNMENT_CENTER); // Container. - AssistantOptInContainer* container = - new AssistantOptInContainer(/*listener=*/this); + container_ = new AssistantOptInContainer(/*listener=*/this); layout_manager = - container->SetLayoutManager(std::make_unique<views::BoxLayout>( + container_->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal, gfx::Insets(0, kPaddingDip))); layout_manager->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER); - AddChildView(container); + AddChildView(container_); // Label. label_ = new views::StyledLabel(base::string16(), /*listener=*/nullptr); @@ -146,16 +155,10 @@ gfx::Range(offsets.at(1), offsets.at(1) + get_started.length()), CreateStyleInfo(gfx::Font::Weight::BOLD)); - container->AddChildView(label_); + container_->AddChildView(label_); - container->SetFocusForPlatform(); - container->SetAccessibleName(label_text); -} - -void AssistantOptInView::ButtonPressed(views::Button* sender, - const ui::Event& event) { - if (delegate_) - delegate_->OnOptInButtonPressed(); + container_->SetFocusForPlatform(); + container_->SetAccessibleName(label_text); } } // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.h b/ash/assistant/ui/main_stage/assistant_opt_in_view.h index 431351a..698e92d 100644 --- a/ash/assistant/ui/main_stage/assistant_opt_in_view.h +++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.h
@@ -41,9 +41,12 @@ void set_delegate(AssistantOptInDelegate* delegate) { delegate_ = delegate; } + void SetFocusBehavior(FocusBehavior focus_behavior); + private: void InitLayout(); + views::Button* container_; // Owned by view hierarchy. views::StyledLabel* label_; // Owned by view hierarchy. AssistantOptInDelegate* delegate_ = nullptr;
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc index 8e936af..618f56e 100644 --- a/ash/assistant/ui/main_stage/suggestion_container_view.cc +++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -137,6 +137,7 @@ app_list::SuggestionChipView* suggestion_chip_view = new app_list::SuggestionChipView(params, /*listener=*/this); suggestion_chip_view->SetAccessibleName(params.text); + suggestion_chip_view->SetFocusBehavior(focus_behavior_); // Given a suggestion chip view, we need to be able to look up the id of // the underlying suggestion. This is used for handling press events. @@ -189,6 +190,12 @@ suggestion); } +void SuggestionContainerView::SetFocusBehavior(FocusBehavior focus_behavior) { + focus_behavior_ = focus_behavior; + for (int i = 0; i < content_view()->child_count(); ++i) + content_view()->child_at(i)->SetFocusBehavior(focus_behavior); +} + void SuggestionContainerView::OnUiVisibilityChanged( AssistantVisibility new_visibility, AssistantVisibility old_visibility,
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.h b/ash/assistant/ui/main_stage/suggestion_container_view.h index b66bc96..963fe55 100644 --- a/ash/assistant/ui/main_stage/suggestion_container_view.h +++ b/ash/assistant/ui/main_stage/suggestion_container_view.h
@@ -62,6 +62,8 @@ // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; + void SetFocusBehavior(FocusBehavior focus_behavior); + private: void InitLayout(); @@ -74,6 +76,8 @@ AssistantController* const assistant_controller_; // Owned by Shell. + FocusBehavior focus_behavior_ = FocusBehavior::NEVER; + views::BoxLayout* layout_manager_; // Owned by view hierarchy. // Cache of suggestion chip views owned by the view hierarchy. The key for the
diff --git a/ash/components/strings/ash_components_strings_te.xtb b/ash/components/strings/ash_components_strings_te.xtb index 0f14000..df1556f5 100644 --- a/ash/components/strings/ash_components_strings_te.xtb +++ b/ash/components/strings/ash_components_strings_te.xtb
@@ -148,7 +148,7 @@ <translation id="6740781404993465795">తదుపరి పదం లేదా అక్షరాన్ని ఎంచుకోండి</translation> <translation id="6760706756348334449">వాల్యూమ్ తగ్గించండి</translation> <translation id="6941333068993625698">అభిప్రాయాన్ని సమర్పించండి</translation> -<translation id="6981982820502123353">ప్రాప్యత</translation> +<translation id="6981982820502123353">యాక్సెస్ సామర్థ్యం</translation> <translation id="7020813747703216897">సరిపోలే ఫలితాలు ఏవీ కనుగొనబడలేదు</translation> <translation id="7025325401470358758">తదుపరి పేన్</translation> <translation id="7076878155205969899">ధ్వనిని మ్యూట్ చేస్తుంది</translation>
diff --git a/ash/dbus/ash_dbus_services.cc b/ash/dbus/ash_dbus_services.cc index 81dd44d3..4665a21c 100644 --- a/ash/dbus/ash_dbus_services.cc +++ b/ash/dbus/ash_dbus_services.cc
@@ -7,7 +7,6 @@ #include "ash/dbus/display_service_provider.h" #include "ash/dbus/liveness_service_provider.h" #include "ash/dbus/url_handler_service_provider.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/services/cros_dbus_service.h"
diff --git a/ash/display/display_prefs.cc b/ash/display/display_prefs.cc index f7af196..36ffdbff 100644 --- a/ash/display/display_prefs.cc +++ b/ash/display/display_prefs.cc
@@ -7,7 +7,6 @@ #include <stddef.h> #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "base/command_line.h"
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc index 2b3f943..fca496d 100644 --- a/ash/display/mirror_window_controller.cc +++ b/ash/display/mirror_window_controller.cc
@@ -13,7 +13,6 @@ #include "ash/host/ash_window_tree_host.h" #include "ash/host/ash_window_tree_host_init_params.h" #include "ash/host/root_window_transformer.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_settings.h" #include "ash/shell.h" #include "ash/window_factory.h"
diff --git a/ash/display/mirror_window_controller_unittest.cc b/ash/display/mirror_window_controller_unittest.cc index c9946f6..6f7d80ab 100644 --- a/ash/display/mirror_window_controller_unittest.cc +++ b/ash/display/mirror_window_controller_unittest.cc
@@ -6,7 +6,6 @@ #include "ash/display/mirror_window_test_api.h" #include "ash/display/window_tree_host_manager.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/cursor_manager_test_api.h"
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index 26ea7fcf..d99ca268 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -19,7 +19,6 @@ #include "ash/magnifier/magnification_controller.h" #include "ash/magnifier/partial_magnification_controller.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/root_window_settings.h" #include "ash/shell.h"
diff --git a/ash/frame/header_view.cc b/ash/frame/header_view.cc index 0311f6e..1d24b908 100644 --- a/ash/frame/header_view.cc +++ b/ash/frame/header_view.cc
@@ -12,12 +12,12 @@ #include "ash/frame/caption_buttons/frame_caption_button_container_view.h" #include "ash/frame/default_frame_header.h" #include "ash/frame/non_client_frame_view_ash.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_state.h" #include "ui/aura/client/aura_constants.h" +#include "ui/aura/mus/window_tree_host_mus.h" #include "ui/aura/window.h" #include "ui/base/ui_base_features.h" #include "ui/views/controls/image_view.h" @@ -313,7 +313,10 @@ void HeaderView::OnImmersiveRevealStarted() { fullscreen_visible_fraction_ = 0; - SetPaintToLayer(); + + add_layer_for_immersive_ = !layer(); + if (add_layer_for_immersive_) + SetPaintToLayer(); // AppWindow may call this before being added to the widget. // https://crbug.com/825260. if (layer()->parent()) { @@ -325,20 +328,26 @@ void HeaderView::OnImmersiveRevealEnded() { fullscreen_visible_fraction_ = 0; - DestroyLayer(); + if (add_layer_for_immersive_) + DestroyLayer(); parent()->Layout(); } void HeaderView::OnImmersiveFullscreenEntered() { in_immersive_mode_ = true; + parent()->InvalidateLayout(); + // The frame may not have been created yet (during window initialization). + if (target_widget_ && target_widget_->non_client_view()->frame_view()) + target_widget_->non_client_view()->Layout(); } void HeaderView::OnImmersiveFullscreenExited() { in_immersive_mode_ = false; fullscreen_visible_fraction_ = 0; - DestroyLayer(); + if (add_layer_for_immersive_) + DestroyLayer(); parent()->InvalidateLayout(); - if (target_widget_) + if (target_widget_ && target_widget_->non_client_view()->frame_view()) target_widget_->non_client_view()->Layout(); }
diff --git a/ash/frame/header_view.h b/ash/frame/header_view.h index f07006ec..e5c910f 100644 --- a/ash/frame/header_view.h +++ b/ash/frame/header_view.h
@@ -155,6 +155,11 @@ // Has this instance been set as the ImmersiveFullscreenControllerDelegate? bool is_immersive_delegate_ = true; + // True if a layer should be used for the immersive mode reveal. Some code + // needs HeaderView to always paint to a layer instead of only during + // immersive reveal (see WmNativeWidgetAura). + bool add_layer_for_immersive_ = false; + bool did_layout_ = false; // False to skip painting. Used for overview mode to hide the header.
diff --git a/ash/frame/non_client_frame_view_ash.cc b/ash/frame/non_client_frame_view_ash.cc index dfc8198..bb5cf715 100644 --- a/ash/frame/non_client_frame_view_ash.cc +++ b/ash/frame/non_client_frame_view_ash.cc
@@ -237,7 +237,6 @@ NonClientFrameViewAsh::NonClientFrameViewAsh( views::Widget* frame, ImmersiveFullscreenControllerDelegate* immersive_delegate, - bool control_immersive, mojom::WindowStyle window_style, std::unique_ptr<CaptionButtonModel> model) : frame_(frame), @@ -257,7 +256,7 @@ wm::WindowState* window_state = wm::GetWindowState(frame_window); if (!window_state->HasDelegate()) { immersive_helper_ = std::make_unique<NonClientFrameViewAshImmersiveHelper>( - frame, this, control_immersive); + frame, this, !immersive_delegate); } Shell::Get()->AddShellObserver(this); Shell::Get()->split_view_controller()->AddObserver(this);
diff --git a/ash/frame/non_client_frame_view_ash.h b/ash/frame/non_client_frame_view_ash.h index 3778866d..fbd5a31c 100644 --- a/ash/frame/non_client_frame_view_ash.h +++ b/ash/frame/non_client_frame_view_ash.h
@@ -52,7 +52,6 @@ explicit NonClientFrameViewAsh( views::Widget* frame, ImmersiveFullscreenControllerDelegate* immersive_delegate = nullptr, - bool control_immersive = true, mojom::WindowStyle window_style = mojom::WindowStyle::DEFAULT, std::unique_ptr<CaptionButtonModel> model = nullptr); ~NonClientFrameViewAsh() override;
diff --git a/ash/frame/non_client_frame_view_ash_unittest.cc b/ash/frame/non_client_frame_view_ash_unittest.cc index 40a4639..9e3ece7 100644 --- a/ash/frame/non_client_frame_view_ash_unittest.cc +++ b/ash/frame/non_client_frame_view_ash_unittest.cc
@@ -61,7 +61,7 @@ views::NonClientFrameView* CreateNonClientFrameView( views::Widget* widget) override { non_client_frame_view_ = - new NonClientFrameViewAsh(widget, nullptr, true, window_style_); + new NonClientFrameViewAsh(widget, nullptr, window_style_); return non_client_frame_view_; }
diff --git a/ash/highlighter/highlighter_controller_unittest.cc b/ash/highlighter/highlighter_controller_unittest.cc index 42dd44f..6b01127d 100644 --- a/ash/highlighter/highlighter_controller_unittest.cc +++ b/ash/highlighter/highlighter_controller_unittest.cc
@@ -8,7 +8,6 @@ #include "ash/components/fast_ink/fast_ink_points.h" #include "ash/highlighter/highlighter_controller_test_api.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/palette/mock_palette_tool_delegate.h" #include "ash/system/palette/palette_tool.h"
diff --git a/ash/ime/ime_focus_handler_unittest.cc b/ash/ime/ime_focus_handler_unittest.cc index 5093109..900f632d 100644 --- a/ash/ime/ime_focus_handler_unittest.cc +++ b/ash/ime/ime_focus_handler_unittest.cc
@@ -6,12 +6,12 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/window_util.h" #include "base/macros.h" #include "ui/base/ime/mock_input_method.h" +#include "ui/base/ui_base_features.h" #include "ui/wm/core/focus_controller.h" namespace ash { @@ -77,8 +77,8 @@ // Tests that IME focus state is updated when the active window changes between // a ClientWindow and an ash window. TEST_F(ImeFocusHandlerTest, BetweenClientWindowAndAshWindow) { - // This test relies on state only set in classic. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) + // Multi-process mash does not use shared IME. + if (::features::IsMultiProcessMash()) return; // Activates a non-ash window. IME should lose focus. @@ -100,8 +100,8 @@ // Tests that IME stays un-focused when the active window changes between // different ClientWindows. TEST_F(ImeFocusHandlerTest, BetweenClientWindows) { - // This test relies on state only set in classic. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) + // Multi-process mash does not use shared IME. + if (::features::IsMultiProcessMash()) return; // Activates a non-ash window. IME should lose focus. @@ -118,8 +118,8 @@ // Tests that IME stays focused when the active window changes between ash // windows. TEST_F(ImeFocusHandlerTest, BetweenAshWindows) { - // This test relies on state only set in classic. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) + // Multi-process mash does not use shared IME. + if (::features::IsMultiProcessMash()) return; // Activates an ash window. IME is focused.
diff --git a/ash/keyboard/virtual_keyboard_controller.cc b/ash/keyboard/virtual_keyboard_controller.cc index 3c930846..623d4f38 100644 --- a/ash/keyboard/virtual_keyboard_controller.cc +++ b/ash/keyboard/virtual_keyboard_controller.cc
@@ -8,7 +8,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/ime/ime_controller.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h" #include "ash/shell.h"
diff --git a/ash/keyboard/virtual_keyboard_controller_unittest.cc b/ash/keyboard/virtual_keyboard_controller_unittest.cc index 3ec0bc7..a1c3a89 100644 --- a/ash/keyboard/virtual_keyboard_controller_unittest.cc +++ b/ash/keyboard/virtual_keyboard_controller_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/ime/ime_controller.h" #include "ash/ime/test_ime_controller_client.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/tray/system_tray_notifier.h" #include "ash/system/virtual_keyboard/virtual_keyboard_observer.h" @@ -111,11 +110,6 @@ TEST_F(VirtualKeyboardControllerTest, ForceToShowKeyboardWithKeysetWhenAccessibilityKeyboardIsEnabled) { - // TODO(mash): Turning on accessibility keyboard does not create a valid - // KeyboardController under MASH. See https://crbug.com/646565. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) - return; - AccessibilityController* accessibility_controller = Shell::Get()->accessibility_controller(); accessibility_controller->SetVirtualKeyboardEnabled(true);
diff --git a/ash/laser/laser_pointer_controller_unittest.cc b/ash/laser/laser_pointer_controller_unittest.cc index 7fed26c..0c99108 100644 --- a/ash/laser/laser_pointer_controller_unittest.cc +++ b/ash/laser/laser_pointer_controller_unittest.cc
@@ -6,7 +6,6 @@ #include "ash/laser/laser_pointer_controller_test_api.h" #include "ash/laser/laser_pointer_view.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "services/ws/server_window.h"
diff --git a/ash/lock_screen_action/lock_screen_note_display_state_handler_unittest.cc b/ash/lock_screen_action/lock_screen_note_display_state_handler_unittest.cc index 624d449..14203718 100644 --- a/ash/lock_screen_action/lock_screen_note_display_state_handler_unittest.cc +++ b/ash/lock_screen_action/lock_screen_note_display_state_handler_unittest.cc
@@ -11,7 +11,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/accessibility/test_accessibility_controller_client.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/interfaces/tray_action.mojom.h" #include "ash/shell.h" #include "ash/system/power/power_button_controller.h"
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc index 9d8bd01..7c97190d 100644 --- a/ash/login/login_screen_controller.cc +++ b/ash/login/login_screen_controller.cc
@@ -4,6 +4,7 @@ #include "ash/login/login_screen_controller.h" +#include "ash/focus_cycler.h" #include "ash/login/ui/lock_screen.h" #include "ash/login/ui/lock_window.h" #include "ash/login/ui/login_data_dispatcher.h" @@ -15,6 +16,7 @@ #include "ash/shelf/shelf_widget.h" #include "ash/shell.h" #include "ash/system/status_area_widget.h" +#include "ash/system/status_area_widget_delegate.h" #include "base/debug/alias.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -436,6 +438,21 @@ ->SetShowGuestButtonForGaiaScreen(can_show); } +void LoginScreenController::FocusLoginShelf(bool reverse) { + Shelf* shelf = Shelf::ForWindow(Shell::Get()->GetPrimaryRootWindow()); + // Tell the focus direction to the status area or the shelf so they can focus + // the correct child view. + if (reverse) { + shelf->GetStatusAreaWidget() + ->status_area_widget_delegate() + ->set_default_last_focusable_child(reverse); + Shell::Get()->focus_cycler()->FocusWidget(shelf->GetStatusAreaWidget()); + } else { + shelf->shelf_widget()->set_default_last_focusable_child(reverse); + Shell::Get()->focus_cycler()->FocusWidget(shelf->shelf_widget()); + } +} + void LoginScreenController::SetAddUserButtonEnabled(bool enable) { Shelf::ForWindow(Shell::Get()->GetPrimaryRootWindow()) ->shelf_widget() @@ -459,6 +476,10 @@ login_screen_client_->ShowAccountAccessHelpApp(); } +void LoginScreenController::FocusOobeDialog() { + login_screen_client_->FocusOobeDialog(); +} + void LoginScreenController::DoAuthenticateUser(const AccountId& account_id, const std::string& password, bool authenticated_by_pin,
diff --git a/ash/login/login_screen_controller.h b/ash/login/login_screen_controller.h index b88f99d..ca5a7fe 100644 --- a/ash/login/login_screen_controller.h +++ b/ash/login/login_screen_controller.h
@@ -86,6 +86,7 @@ void LaunchArcKioskApp(const AccountId& account_id); void ShowResetScreen(); void ShowAccountAccessHelpApp(); + void FocusOobeDialog(); // Add or remove an observer. void AddObserver(LoginScreenControllerObserver* observer); @@ -145,6 +146,7 @@ void SetAddUserButtonEnabled(bool enable) override; void SetAllowLoginAsGuest(bool allow_guest) override; void SetShowGuestButtonForGaiaScreen(bool can_show) override; + void FocusLoginShelf(bool reverse) override; // Flushes the mojo pipes - to be used in tests. void FlushForTesting();
diff --git a/ash/login/mock_login_screen_client.h b/ash/login/mock_login_screen_client.h index a2a9097..2395c73 100644 --- a/ash/login/mock_login_screen_client.h +++ b/ash/login/mock_login_screen_client.h
@@ -72,6 +72,7 @@ MOCK_METHOD1(LaunchArcKioskApp, void(const AccountId& account_id)); MOCK_METHOD0(ShowResetScreen, void()); MOCK_METHOD0(ShowAccountAccessHelpApp, void()); + MOCK_METHOD0(FocusOobeDialog, void()); private: bool authenticate_user_callback_result_ = true;
diff --git a/ash/login/ui/lock_screen_sanity_unittest.cc b/ash/login/ui/lock_screen_sanity_unittest.cc index 8317d5d..f9b6c7b 100644 --- a/ash/login/ui/lock_screen_sanity_unittest.cc +++ b/ash/login/ui/lock_screen_sanity_unittest.cc
@@ -13,7 +13,6 @@ #include "ash/login/ui/login_bubble.h" #include "ash/login/ui/login_test_base.h" #include "ash/login/ui/login_test_utils.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/session/test_session_controller_client.h" #include "ash/shelf/shelf.h" @@ -193,6 +192,7 @@ // Verifies that tabbing from the lock screen will eventually focus the shelf. // Then, a shift+tab will bring focus back to the lock screen. TEST_F(LockScreenSanityTest, TabGoesFromLockToShelfAndBackToLock) { + std::unique_ptr<MockLoginScreenClient> client = BindMockLoginScreenClient(); // Make lock screen shelf visible. GetSessionControllerClient()->SetSessionState( session_manager::SessionState::LOCKED);
diff --git a/ash/login/ui/login_password_view_test.cc b/ash/login/ui/login_password_view_test.cc index 8e58bdc3..929a2e1c 100644 --- a/ash/login/ui/login_password_view_test.cc +++ b/ash/login/ui/login_password_view_test.cc
@@ -5,7 +5,6 @@ #include "ash/login/ui/login_password_view.h" #include "ash/login/ui/login_test_base.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "base/strings/utf_string_conversions.h" #include "ui/events/test/event_generator.h"
diff --git a/ash/login/ui/login_test_base.cc b/ash/login/ui/login_test_base.cc index 76e5f333..e246616d 100644 --- a/ash/login/ui/login_test_base.cc +++ b/ash/login/ui/login_test_base.cc
@@ -7,7 +7,6 @@ #include <string> #include "ash/login/ui/login_test_utils.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/interfaces/tray_action.mojom.h" #include "ash/shell.h"
diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc index 3c73b211..fb033f9e 100644 --- a/ash/magnifier/magnification_controller.cc +++ b/ash/magnifier/magnification_controller.cc
@@ -14,7 +14,6 @@ #include "ash/host/ash_window_tree_host.h" #include "ash/host/root_window_transformer.h" #include "ash/magnifier/magnifier_scale_utils.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/shell.h"
diff --git a/ash/metrics/login_metrics_recorder_unittest.cc b/ash/metrics/login_metrics_recorder_unittest.cc index a00d1cd..ba84451 100644 --- a/ash/metrics/login_metrics_recorder_unittest.cc +++ b/ash/metrics/login_metrics_recorder_unittest.cc
@@ -16,7 +16,6 @@ #include "ash/login/ui/login_big_user_view.h" #include "ash/login/ui/login_test_base.h" #include "ash/login/ui/login_test_utils.h" -#include "ash/public/cpp/config.h" #include "ash/session/test_session_controller_client.h" #include "ash/shell.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h"
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 61bb13f..88f18ad 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -45,7 +45,6 @@ "ash_typography.cc", "ash_typography.h", "ash_view_ids.h", - "config.h", "frame_utils.cc", "frame_utils.h", "immersive/immersive_context.cc",
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc index b331e481..0deb4bf 100644 --- a/ash/public/cpp/ash_features.cc +++ b/ash/public/cpp/ash_features.cc
@@ -26,7 +26,7 @@ "KeyboardShortcutViewerApp", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kLockScreenNotifications{"LockScreenNotifications", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kLockScreenInlineReply{"LockScreenInlineReply", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ash/public/cpp/config.h b/ash/public/cpp/config.h deleted file mode 100644 index ad180ac4..0000000 --- a/ash/public/cpp/config.h +++ /dev/null
@@ -1,23 +0,0 @@ -// 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. - -#ifndef ASH_PUBLIC_CPP_APP_CONFIG_H_ -#define ASH_PUBLIC_CPP_APP_CONFIG_H_ - -namespace ash { - -// Enumeration of the possible configurations supported by ash. -// TODO(sky): this should go away entirely. -enum class Config { - // Classic mode does not use mus. - CLASSIC, - - // Aura is backed by mus and chrome and ash are in separate processes. In this - // mode chrome code can only use ash code in ash/public/cpp. - MASH_DEPRECATED, -}; - -} // namespace ash - -#endif // ASH_PUBLIC_CPP_APP_CONFIG_H_
diff --git a/ash/public/cpp/mus_property_mirror_ash.cc b/ash/public/cpp/mus_property_mirror_ash.cc index d0d0e50..72d736f 100644 --- a/ash/public/cpp/mus_property_mirror_ash.cc +++ b/ash/public/cpp/mus_property_mirror_ash.cc
@@ -71,6 +71,10 @@ } else if (key == aura::client::kTitleShownKey) { root_window->SetProperty(aura::client::kTitleShownKey, window->GetProperty(aura::client::kTitleShownKey)); + } else if (key == aura::client::kTopViewInset) { + root_window->SetProperty(aura::client::kTopViewInset, + window->GetProperty(aura::client::kTopViewInset)); + } else if (key == aura::client::kWindowIconKey) { MirrorOwnedProperty(window, root_window, aura::client::kWindowIconKey); } else if (key == kFrameBackButtonStateKey) { @@ -103,6 +107,16 @@ root_window->SetProperty( kHideCaptionButtonsInTabletModeKey, window->GetProperty(kHideCaptionButtonsInTabletModeKey)); + } else if (key == kImmersiveImpliedByFullscreen) { + root_window->SetProperty( + kImmersiveImpliedByFullscreen, + window->GetProperty(kImmersiveImpliedByFullscreen)); + } else if (key == kImmersiveIsActive) { + root_window->SetProperty(kImmersiveIsActive, + window->GetProperty(kImmersiveIsActive)); + } else if (key == kImmersiveTopContainerBoundsInScreen) { + MirrorOwnedProperty(window, root_window, + kImmersiveTopContainerBoundsInScreen); } }
diff --git a/ash/public/cpp/window_properties.cc b/ash/public/cpp/window_properties.cc index f97bec3..53263ad 100644 --- a/ash/public/cpp/window_properties.cc +++ b/ash/public/cpp/window_properties.cc
@@ -83,6 +83,16 @@ kHideShelfWhenFullscreenKey, mojom::kHideShelfWhenFullscreen_Property, aura::PropertyConverter::CreateAcceptAnyValueCallback()); property_converter->RegisterPrimitiveProperty( + kImmersiveImpliedByFullscreen, + mojom::kImmersiveImpliedByFullscreen_Property, + aura::PropertyConverter::CreateAcceptAnyValueCallback()); + property_converter->RegisterPrimitiveProperty( + kImmersiveIsActive, mojom::kImmersiveIsActive_Property, + aura::PropertyConverter::CreateAcceptAnyValueCallback()); + property_converter->RegisterRectProperty( + kImmersiveTopContainerBoundsInScreen, + mojom::kImmersiveTopContainerBoundsInScreen_Property); + property_converter->RegisterPrimitiveProperty( kIsDeferredTabDraggingTargetWindowKey, mojom::kIsDeferredTabDraggingTargetWindow_Property, aura::PropertyConverter::CreateAcceptAnyValueCallback()); @@ -103,6 +113,9 @@ kShelfItemTypeKey, ws::mojom::WindowManager::kShelfItemType_Property, base::BindRepeating(&IsValidShelfItemType)); property_converter->RegisterPrimitiveProperty( + aura::client::kTopViewInset, mojom::kTopViewInset_Property, + aura::PropertyConverter::CreateAcceptAnyValueCallback()); + property_converter->RegisterPrimitiveProperty( kWindowStateTypeKey, mojom::kWindowStateType_Property, base::BindRepeating(&IsValidWindowStateType)); property_converter->RegisterPrimitiveProperty( @@ -123,6 +136,8 @@ aura::client::kTitleShownKey, ws::mojom::WindowManager::kWindowTitleShown_Property, aura::PropertyConverter::CreateAcceptAnyValueCallback()); + property_converter->RegisterWindowPtrProperty( + kTabDraggingSourceWindowKey, mojom::kTabDraggingSourceWindow_Property); } DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kArcPackageNameKey, nullptr);
diff --git a/ash/public/cpp/window_properties.h b/ash/public/cpp/window_properties.h index 7e829473..ad30963616 100644 --- a/ash/public/cpp/window_properties.h +++ b/ash/public/cpp/window_properties.h
@@ -186,7 +186,7 @@ kShelfItemTypeKey; // A property key to store the address of the source window that the drag -// originated from if the window is currenlty in tab-dragging process. +// originated from if the window is currently in tab-dragging process. ASH_PUBLIC_EXPORT extern const aura::WindowProperty<aura::Window*>* const kTabDraggingSourceWindowKey;
diff --git a/ash/public/interfaces/login_screen.mojom b/ash/public/interfaces/login_screen.mojom index d733c42..bca715e 100644 --- a/ash/public/interfaces/login_screen.mojom +++ b/ash/public/interfaces/login_screen.mojom
@@ -190,6 +190,9 @@ // Sets if the guest button on the login shelf can be shown during gaia // signin screen. SetShowGuestButtonForGaiaScreen(bool can_show); + + // Transitions focus to the shelf area. If |reverse|, focuses the status area. + FocusLoginShelf(bool reverse); }; // Allows ash lock screen to control a client (e.g. Chrome browser). Requests @@ -250,6 +253,9 @@ // |reverse|: Whether the tab order is reversed. FocusLockScreenApps(bool reverse); + // Passes focus to the OOBE dialog if it is showing. No-op otherwise. + FocusOobeDialog(); + // Show the gaia sign-in dialog. If |can_close| is true, the dialog can be // closed. The value in |prefilled_account| will be used to prefill the // sign-in dialog so the user does not need to type the account email.
diff --git a/ash/public/interfaces/window_properties.mojom b/ash/public/interfaces/window_properties.mojom index 839d876..524defb3 100644 --- a/ash/public/interfaces/window_properties.mojom +++ b/ash/public/interfaces/window_properties.mojom
@@ -55,6 +55,17 @@ const string kHideShelfWhenFullscreen_Property = "ash:hide-shelf-when-fullscreen"; +// See ash::kImmseriveImpliedByFullscreen. +const string kImmersiveImpliedByFullscreen_Property = + "ash:immersive-implied-by-fullscreen"; + +// See ash::kImmseriveIsActive. +const string kImmersiveIsActive_Property = "ash:immersive-is-active"; + +// See ash::kImmseriveTopContainerBoundsInScreen. +const string kImmersiveTopContainerBoundsInScreen_Property = + "ash:immersive-top-container-bounds-in-screen"; + // If true, the window is the target window for the tab-dragged window. The // key is used by overview to show a highlight indication to indicate which // overview window the dragged tabs will merge into when the user releases the @@ -69,6 +80,11 @@ // If true, the window is currently showing in overview mode. const string kIsShowingInOverview_Property = "ash:is-showing-in-overview"; +// A property key to store the address of the source window that the drag +// originated from if the window is currently in tab-dragging process. +const string kTabDraggingSourceWindow_Property = + "ash:tab-dragging-source-window"; + // This is put on windows to indicate that ash should perform auto management of // window positions; when you open a second browser, ash will move the two to // minimize overlap. @@ -87,3 +103,7 @@ // mode window manager. const string kRestoreWindowStateTypeOverride_Property = "ash:restore-window-state-type-override"; + +// The height of the window header, i.e. the inset between the frame and client +// view. +const string kTopViewInset_Property = "ash:top-view-inset";
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc index 4d4bfed..2b47a96 100644 --- a/ash/root_window_controller.cc +++ b/ash/root_window_controller.cc
@@ -22,7 +22,6 @@ #include "ash/public/cpp/ash_constants.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_types.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_settings.h" @@ -671,8 +670,7 @@ root_window_layout_manager_->OnWindowResized(); if (root_window_type == RootWindowType::PRIMARY) { - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - shell->EnableKeyboard(); + shell->EnableKeyboard(); } else { window_tree_host_->Show(); @@ -683,8 +681,7 @@ // TODO: TouchExplorationManager doesn't work with mash. // http://crbug.com/679782 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kAshDisableTouchExplorationMode) && - Shell::GetAshConfig() != Config::MASH_DEPRECATED) { + switches::kAshDisableTouchExplorationMode)) { touch_exploration_manager_ = std::make_unique<TouchExplorationManager>(this); }
diff --git a/ash/shelf/app_list_button_unittest.cc b/ash/shelf/app_list_button_unittest.cc index 5116302f..0f97154 100644 --- a/ash/shelf/app_list_button_unittest.cc +++ b/ash/shelf/app_list_button_unittest.cc
@@ -8,7 +8,6 @@ #include <string> #include "ash/app_list/test/app_list_test_helper.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h" #include "ash/shelf/shelf.h"
diff --git a/ash/shelf/app_list_shelf_item_delegate.cc b/ash/shelf/app_list_shelf_item_delegate.cc index 830495af14..62690912 100644 --- a/ash/shelf/app_list_shelf_item_delegate.cc +++ b/ash/shelf/app_list_shelf_item_delegate.cc
@@ -4,6 +4,7 @@ #include "ash/shelf/app_list_shelf_item_delegate.h" +#include <algorithm> #include <utility> #include "ash/app_list/app_list_controller_impl.h" @@ -56,12 +57,14 @@ back_action = false; } - // Minimize all windows that aren't the app list. + // Minimize all windows that aren't the app list in reverse order to preserve + // the mru ordering. aura::Window* app_list_container = Shell::Get()->GetPrimaryRootWindow()->GetChildById( kShellWindowId_AppListTabletModeContainer); aura::Window::Windows windows = Shell::Get()->mru_window_tracker()->BuildWindowForCycleList(); + std::reverse(windows.begin(), windows.end()); for (auto* window : windows) { if (!app_list_container->Contains(window) && !wm::GetWindowState(window)->IsMinimized()) {
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc index fa7aa7a..95022940 100644 --- a/ash/shelf/login_shelf_view.cc +++ b/ash/shelf/login_shelf_view.cc
@@ -348,6 +348,9 @@ if (reverse) { // Focus should leave the system tray. Shell::Get()->system_tray_notifier()->NotifyFocusOut(reverse); + + // If OOBE dialog is showing, it will take focus. + Shell::Get()->login_screen_controller()->FocusOobeDialog(); } else { // Focus goes to status area. Shelf::ForWindow(GetWidget()->GetNativeWindow())
diff --git a/ash/shelf/shelf_context_menu_model_unittest.cc b/ash/shelf/shelf_context_menu_model_unittest.cc index 8d303f4..ed387c00 100644 --- a/ash/shelf/shelf_context_menu_model_unittest.cc +++ b/ash/shelf/shelf_context_menu_model_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/shelf/shelf_context_menu_model.h" #include "ash/public/cpp/app_menu_constants.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_item_delegate.h" #include "ash/session/test_session_controller_client.h" #include "ash/shelf/shelf.h"
diff --git a/ash/shelf/shelf_controller.cc b/ash/shelf/shelf_controller.cc index aee21e6..eb83793b 100644 --- a/ash/shelf/shelf_controller.cc +++ b/ash/shelf/shelf_controller.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/remote_shelf_item_delegate.h" #include "ash/public/cpp/shelf_prefs.h" #include "ash/root_window_controller.h"
diff --git a/ash/shelf/shelf_controller_unittest.cc b/ash/shelf/shelf_controller_unittest.cc index d2ac096..9d965f5 100644 --- a/ash/shelf/shelf_controller_unittest.cc +++ b/ash/shelf/shelf_controller_unittest.cc
@@ -7,7 +7,6 @@ #include <string> #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_model.h" #include "ash/public/cpp/shelf_model_observer.h" #include "ash/public/cpp/shelf_prefs.h"
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index b7d3f7ca..ed5a67d 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -14,7 +14,6 @@ #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h"
diff --git a/ash/shelf/shelf_tooltip_manager.cc b/ash/shelf/shelf_tooltip_manager.cc index d6b17df..8160a6be 100644 --- a/ash/shelf/shelf_tooltip_manager.cc +++ b/ash/shelf/shelf_tooltip_manager.cc
@@ -4,7 +4,6 @@ #include "ash/shelf/shelf_tooltip_manager.h" -#include "ash/public/cpp/config.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_tooltip_bubble.h" #include "ash/shelf/shelf_tooltip_preview_bubble.h" @@ -150,10 +149,6 @@ if (event->type() != ui::ET_MOUSE_MOVED) return; - // A workaround for crbug.com/756163, likely not needed as Mus/Mash matures. - if (Shell::GetAshConfig() != Config::CLASSIC && event->location().IsOrigin()) - return; - gfx::Point point = event->location(); views::View::ConvertPointFromWidget(shelf_view_, &point); views::View* view = shelf_view_->GetTooltipHandlerForPoint(point);
diff --git a/ash/shelf/shelf_tooltip_manager_unittest.cc b/ash/shelf/shelf_tooltip_manager_unittest.cc index 69cfe35..9e3bd615 100644 --- a/ash/shelf/shelf_tooltip_manager_unittest.cc +++ b/ash/shelf/shelf_tooltip_manager_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_model.h" #include "ash/shelf/app_list_button.h" #include "ash/shelf/shelf.h"
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 3e7334b..0c0509d 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -1018,6 +1018,11 @@ x = shelf_->PrimaryAxisValue(x + w + (i == 0 ? 0 : button_spacing), x); y = shelf_->PrimaryAxisValue(y, y + h + button_spacing); + // In the new UI, padding between the back & app list buttons is smaller + // than between all other shelf items. + if (i == kBackButtonIndex && chromeos::switches::ShouldUseShelfNewUi()) + x -= button_spacing; + if (i == kAppListButtonIndex) { app_list_button_position = shelf_->PrimaryAxisValue(x, y); if (chromeos::switches::ShouldUseShelfNewUi()) { @@ -1026,7 +1031,7 @@ (ShelfConstants::shelf_size() - kShelfControlSizeNewUi) / 2; const int back_and_app_list_background_size = kShelfControlSizeNewUi + - (IsTabletModeEnabled() ? kShelfControlSizeNewUi + 2 * button_spacing + (IsTabletModeEnabled() ? kShelfControlSizeNewUi + button_spacing : 0); back_and_app_list_background_->SetBounds( shelf_->PrimaryAxisValue(button_spacing, control_secondary_padding),
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc index 73d3ee7c..e1104da2 100644 --- a/ash/shelf/shelf_widget.cc +++ b/ash/shelf/shelf_widget.cc
@@ -265,6 +265,7 @@ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.delegate = delegate_view_; params.parent = shelf_container; + Init(params); // The shelf should not take focus when initially shown. @@ -355,7 +356,8 @@ CHECK(status_area_widget_); shelf_view_->OnShelfAlignmentChanged(); status_area_widget_->UpdateAfterShelfAlignmentChange(); - delegate_view_->SchedulePaint(); + // This call will in turn trigger a call to delegate_view_->SchedulePaint(). + delegate_view_->UpdateOpaqueBackground(); } void ShelfWidget::OnTabletModeChanged() {
diff --git a/ash/shelf/shelf_window_targeter.cc b/ash/shelf/shelf_window_targeter.cc index 95d4763..e07938f 100644 --- a/ash/shelf/shelf_window_targeter.cc +++ b/ash/shelf/shelf_window_targeter.cc
@@ -24,7 +24,7 @@ } // namespace ShelfWindowTargeter::ShelfWindowTargeter(aura::Window* container, Shelf* shelf) - : ::wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), + : ::wm::EasyResizeWindowTargeter(gfx::Insets(), gfx::Insets()), shelf_(shelf) { WillChangeVisibilityState(shelf_->GetVisibilityState()); container->AddObserver(this);
diff --git a/ash/shelf/shelf_window_watcher_unittest.cc b/ash/shelf/shelf_window_watcher_unittest.cc index 2356b65b..b3d0faab 100644 --- a/ash/shelf/shelf_window_watcher_unittest.cc +++ b/ash/shelf/shelf_window_watcher_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_item.h" #include "ash/public/cpp/shelf_model.h" #include "ash/public/cpp/shell_window_ids.h" @@ -23,6 +22,7 @@ #include "ui/aura/window.h" #include "ui/base/hit_test.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/base/ui_base_features.h" #include "ui/gfx/image/image_skia.h" #include "ui/resources/grit/ui_resources.h" #include "ui/views/widget/widget.h" @@ -92,7 +92,7 @@ // Ensure shelf items are added and removed for some unknown windows in mash. TEST_F(ShelfWindowWatcherTest, OpenAndCloseMash) { - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) + if (!::features::IsSingleProcessMash() && !::features::IsMultiProcessMash()) return; // Windows with no valid ShelfItemType and ShelfID properties get shelf items. @@ -143,7 +143,8 @@ CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); std::unique_ptr<views::Widget> widget2 = CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); - const bool is_mash = Shell::GetAshConfig() == Config::MASH_DEPRECATED; + const bool is_mash = + ::features::IsSingleProcessMash() || ::features::IsMultiProcessMash(); EXPECT_EQ(is_mash ? 4 : 2, model_->item_count()); // Create a ShelfItem for the first window.
diff --git a/ash/shell.cc b/ash/shell.cc index 18bc9fd..a2c8d34 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -74,7 +74,6 @@ #include "ash/public/cpp/ash_constants.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_model.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" @@ -393,11 +392,6 @@ } // static -Config Shell::GetAshConfig() { - return Config::CLASSIC; -} - -// static void Shell::RegisterLocalStatePrefs(PrefRegistrySimple* registry, bool for_test) { PaletteTray::RegisterLocalStatePrefs(registry); @@ -561,16 +555,13 @@ } void Shell::SetCursorCompositingEnabled(bool enabled) { - if (GetAshConfig() != Config::MASH_DEPRECATED) { - // TODO: needs to work in mash. http://crbug.com/705592. - CursorWindowController* cursor_window_controller = - window_tree_host_manager_->cursor_window_controller(); + CursorWindowController* cursor_window_controller = + window_tree_host_manager_->cursor_window_controller(); - if (cursor_window_controller->is_cursor_compositing_enabled() == enabled) - return; - cursor_window_controller->SetCursorCompositingEnabled(enabled); - native_cursor_manager_->SetNativeCursorEnabled(!enabled); - } + if (cursor_window_controller->is_cursor_compositing_enabled() == enabled) + return; + cursor_window_controller->SetCursorCompositingEnabled(enabled); + native_cursor_manager_->SetNativeCursorEnabled(!enabled); } void Shell::DoInitialWorkspaceAnimation() {
diff --git a/ash/shell.h b/ash/shell.h index c9357958..0df8751 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -207,7 +207,6 @@ class WindowSelectorController; class WindowTreeHostManager; -enum class Config; enum class LoginStatus; // Shell is a singleton object that presents the Shell API and implements the @@ -280,8 +279,6 @@ // app under classic ash, or a browser window under mash). static bool HasRemoteClient(aura::Window* window); - static Config GetAshConfig(); - // Registers all ash related local state prefs to the given |registry|. static void RegisterLocalStatePrefs(PrefRegistrySimple* registry, bool for_test);
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc index 4b20dca..8f1a54d0 100644 --- a/ash/shell_unittest.cc +++ b/ash/shell_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/display/mouse_cursor_event_filter.h" #include "ash/drag_drop/drag_drop_controller.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/scoped_root_window_for_new_windows.h"
diff --git a/ash/sticky_keys/sticky_keys_overlay_unittest.cc b/ash/sticky_keys/sticky_keys_overlay_unittest.cc index 36e8cd0..37c0222 100644 --- a/ash/sticky_keys/sticky_keys_overlay_unittest.cc +++ b/ash/sticky_keys/sticky_keys_overlay_unittest.cc
@@ -4,7 +4,6 @@ #include "ash/sticky_keys/sticky_keys_overlay.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/sticky_keys/sticky_keys_controller.h" #include "ash/test/ash_test_base.h"
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 5b5c5f1..2b6f2e3 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">ደካማ ሲግናል</translation> <translation id="1293264513303784526">USB-C መሣሪያ (የግራ ወደብ)</translation> +<translation id="1294929383540927798">የማያ ገጽ ቆልፍ ማሳወቂያ ቅንብሮቹን ይለውጡ</translation> <translation id="1302880136325416935">የብሉቱዝ ቅንብሮችን አሳይ። <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">ቀኝ</translation> <translation id="1351937230027495976">ምናሌ ሰብስብ</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">ብሉቱዝን አብራ ወይም አጥፋ። <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation> <translation id="1621499497873603021">ባትሪ ባዶ እስኪሆን ድረስ የቀረው ጊዜ፣ <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">የድምጽ መጠይቅ ይጀምሩ</translation> <translation id="1658406695958299976">ይቅርታ፣ የይለፍ ቃልዎ አሁንም ሊረጋገጥ አልቻለም። ማሳሰቢያ፦ የይለፍ ቃልዎን በቅርብ ጊዜ ቀይረው ከሆነ አዲስ የይለፍ ቃልዎ የሚተገበረው ሲወጡ ነው፣ እባክዎ የድሮውን ይለፍ ቃል እዚህ ይጠቀሙ።</translation> <translation id="1677472565718498478"><ph name="TIME" /> ቀርቷል</translation> <translation id="1698760176351776263">የIPv6 አድራሻ፦ <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">ምናሌ ዘርጋ</translation> <translation id="3087734570205094154">ግርጌ</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (ብሉቱዝ)</translation> +<translation id="3124698051292518391">ሁሉጊዜ መደርደሪያን አሳይ</translation> <translation id="3126069444801937830">ለማዘመን ዳግም ያስጀምሩ</translation> <translation id="3147142846278915599">ማስጀመሪያ (መተግበሪያዎችን በማመሳሰል ላይ...)</translation> <translation id="315116470104423982">የተንቀሳቃሽ ስልክ ውሂብ</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">ተመለስ</translation> <translation id="3891340733213178823">ዘግተው ለመውጣት Ctrl+Shift+Qን ሁለቴ ይጫኑ።</translation> <translation id="3893630138897523026">ChromeVox (የሚነገር ግብረመልስ)</translation> +<translation id="3897533311200664389">የጽሑፍ ጥያቄ ይጀምሩ</translation> <translation id="3899995891769452915">የድምፅ ግቤት</translation> <translation id="3900355044994618856">የእርስዎ ክፍለ ጊዜ በ<ph name="SESSION_TIME_REMAINING" /> ውስጥ ያበቃል</translation> <translation id="3901991538546252627">ከ<ph name="NAME" /> ጋር በመገናኘት ላይ</translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">የተቀናበረው በ<ph name="DOMAIN" /></translation> <translation id="9029474291399787231">የAdobe Flash Player ዝማኔ ይገኛል</translation> <translation id="9056839673611986238">መሣሪያ ይቀነሳል</translation> +<translation id="9070640332319875144">የረዳት ቅንብሮች</translation> <translation id="9074739597929991885">ብሉቱዝ</translation> <translation id="9079731690316798640">Wi-Fi፦ <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">ማይክሮፎን ስራ ላይ ነው።</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 8666b082..7e037c3 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">إشارة ضعيفة</translation> <translation id="1293264513303784526">جهاز USB-C (المنفذ الأيسر)</translation> +<translation id="1294929383540927798">تغيير إعدادات الإشعارات لشاشة التأمين</translation> <translation id="1302880136325416935">عرض إعدادات البلوتوث. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">يمين</translation> <translation id="1351937230027495976">تصغير القائمة</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">تبديل البلوتوث. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">إزالة هذا المستخدم</translation> <translation id="1621499497873603021">الوقت المتبقي حتى تصبح البطارية فارغة <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">بدء طلب بحث صوتي</translation> <translation id="1658406695958299976">عذرًا، لا يمكن التحقق من كلمة المرور حتى الآن. ملاحظة: في حال تغيير كلمة المرور مؤخرًا، سيتم تطبيق كلمة المرور الجديدة بعد تسجيل الخروج، يُرجى استخدام كلمة المرور القديمة هنا.</translation> <translation id="1677472565718498478">الوقت المتبقي <ph name="TIME" /></translation> <translation id="1698760176351776263">عنوان IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">توسيع القائمة</translation> <translation id="3087734570205094154">أسفل</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (بلوتوث)</translation> +<translation id="3124698051292518391">إظهار الرف دائمًا</translation> <translation id="3126069444801937830">إعادة التشغيل للتحديث</translation> <translation id="3147142846278915599">Launcher (مزامنة التطبيقات...)</translation> <translation id="315116470104423982">بيانات الجوال</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">الرجوع إلى الوراء</translation> <translation id="3891340733213178823">للخروج اضغط على Ctrl+Shift+Q مرتين.</translation> <translation id="3893630138897523026">ChromeVox (التعليق المنطوق)</translation> +<translation id="3897533311200664389">بدء طلب بحث نصي</translation> <translation id="3899995891769452915">الإدخال الصوتي</translation> <translation id="3900355044994618856">ستنتهي جلستك في غضون <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">جارٍ الاتصال بـ <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">مدار بواسطة <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">هناك تحديث جديد لتطبيق Adobe Flash Player</translation> <translation id="9056839673611986238">سيتم إعادة النسخة السابقة من نظام التشغيل Chrome إلى جهازك.</translation> +<translation id="9070640332319875144">إعدادات المساعد</translation> <translation id="9074739597929991885">بلوتوث</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">الميكروفون قيد الاستخدام</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 74a8c44..83aae6f 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401">„<ph name="DISPLAY_NAME" />“ (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">слаб сигнал</translation> <translation id="1293264513303784526">USB-C устройство (левият порт)</translation> +<translation id="1294929383540927798">Промяна на настройките за известия на заключения екран</translation> <translation id="1302880136325416935">Показване на настройките за Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Надясно</translation> <translation id="1351937230027495976">Свиване на менюто</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Превключване на Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Премахване на този потребител</translation> <translation id="1621499497873603021">Оставащо време до изразходването на батерията: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Стартиране на гласова заявка</translation> <translation id="1658406695958299976">За съжаление, паролата ви пак не можа да бъде потвърдена. Забележка: Ако наскоро сте я променили, новата ще влезе в сила, след като излезете от профила си. Моля, използвайте старата парола тук.</translation> <translation id="1677472565718498478">Оставащо време: <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 адрес: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Разгъване на менюто</translation> <translation id="3087734570205094154">Най-долу</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Лавицата да се показва винаги</translation> <translation id="3126069444801937830">Рестартирайте, за да актуализирате</translation> <translation id="3147142846278915599">Стартов панел (приложенията се синхронизират...)</translation> <translation id="315116470104423982">Мобилни данни</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Назад</translation> <translation id="3891340733213178823">Натиснете два пъти „Ctrl+Shift+Q“ за изход.</translation> <translation id="3893630138897523026">ChromeVox (обратна връзка с говор)</translation> +<translation id="3897533311200664389">Стартиране на текстова заявка</translation> <translation id="3899995891769452915">Гласово въвеждане</translation> <translation id="3900355044994618856">Сесията ви ще приключи след <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Установява се връзка със: <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Управлявано от <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Налице е актуализация на Adobe Flash Player</translation> <translation id="9056839673611986238">Устройството ще бъде върнато към по-ранна версия</translation> +<translation id="9070640332319875144">Настройки на Асистент</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Микрофонът се използва.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 7405103..c24ba96e 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Senyal feble</translation> <translation id="1293264513303784526">Dispositiu USB-C (port esquerre)</translation> +<translation id="1294929383540927798">Canvia la configuració de notificacions de la pantalla de bloqueig</translation> <translation id="1302880136325416935">Mostra la configuració del Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">A la dreta</translation> <translation id="1351937230027495976">Replega el menú</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Suprimeix aquest usuari</translation> <translation id="1621499497873603021">Temps que queda fins que no s'esgoti la bateria: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Inicia una consulta per veu</translation> <translation id="1658406695958299976">Encara no s'ha pogut verificar la contrasenya. Nota: si fa poc que has canviat la contrasenya, la nova s'aplicarà un cop hagis tancat la sessió. Fes servir la contrasenya anterior aquí.</translation> <translation id="1677472565718498478">Temps restant: <ph name="TIME" /></translation> <translation id="1698760176351776263">Adreça IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Desplega el menú</translation> <translation id="3087734570205094154">Part inferior</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Mostra sempre el prestatge</translation> <translation id="3126069444801937830">Reinicia per actualitzar</translation> <translation id="3147142846278915599">Launcher (s'estan sincronitzant les aplicacions...)</translation> <translation id="315116470104423982">Dades mòbils</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Enrere</translation> <translation id="3891340733213178823">Premeu Ctrl+Maj+Q dues vegades per tancar la sessió.</translation> <translation id="3893630138897523026">ChromeVox (comentaris de veu)</translation> +<translation id="3897533311200664389">Inicia una consulta de text</translation> <translation id="3899995891769452915">Entrada de veu</translation> <translation id="3900355044994618856">La sessió finalitzarà d'aquí a <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">S'està connectant amb <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Gestionat per <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Hi ha disponible una actualització d'Adobe Flash Player</translation> <translation id="9056839673611986238">El dispositiu es revertirà a una versió anterior</translation> +<translation id="9070640332319875144">Configuració de l'Assistent</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">S'està fent servir el micròfon.</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 17d3776..5594511 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Slabý signál</translation> <translation id="1293264513303784526">Zařízení USB Type-C (levý port)</translation> +<translation id="1294929383540927798">Změnit nastavení oznámení na obrazovce uzamčení</translation> <translation id="1302880136325416935">Zobrazit nastavení Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Doprava</translation> <translation id="1351937230027495976">Sbalit nabídku</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Přepnout Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Odebrat tohoto uživatele</translation> <translation id="1621499497873603021">Čas zbývající do vybití baterie: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Zahájit hlasový dotaz</translation> <translation id="1658406695958299976">Je nám líto, vaše heslo se stále nedaří ověřit. Poznámka: Pokud jste heslo nedávno změnili, bude nové heslo možné použít až po odhlášení. Zde použijte staré heslo.</translation> <translation id="1677472565718498478">Zbývající čas: <ph name="TIME" /></translation> <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Rozbalit nabídku</translation> <translation id="3087734570205094154">Až dolů</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Vždy zobrazovat poličku</translation> <translation id="3126069444801937830">Restartovat a aktualizovat</translation> <translation id="3147142846278915599">Spouštěč (synchronizace aplikací...)</translation> <translation id="315116470104423982">Mobilní datové přenosy</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Zpět</translation> <translation id="3891340733213178823">Odhlaste se dvojitým stisknutím kombinace kláves Ctrl+Shift+Q.</translation> <translation id="3893630138897523026">ChromeVox (hlasová odezva)</translation> +<translation id="3897533311200664389">Zahájit textový dotaz</translation> <translation id="3899995891769452915">Hlasový vstup</translation> <translation id="3900355044994618856">Relace skončí za <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Připojování k síti <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Správce: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Je k dispozici aktualizace přehrávače Adobe Flash Player</translation> <translation id="9056839673611986238">V zařízení bude obnovena předchozí verze systému</translation> +<translation id="9070640332319875144">Nastavení Asistenta</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon je používán.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index a33cdf5f..b4bbfd6 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Svagt signal</translation> <translation id="1293264513303784526">USB-C-enhed (venstre port)</translation> +<translation id="1294929383540927798">Skift indstillinger for underretninger på låseskærm</translation> <translation id="1302880136325416935">Vis Bluetooth-indstillinger. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Højre</translation> <translation id="1351937230027495976">Skjul menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Slå Bluetooth til eller fra. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Fjern denne bruger</translation> <translation id="1621499497873603021">Tid tilbage, indtil batteriet er tomt, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Start en stemmeforespørgsel</translation> <translation id="1658406695958299976">Din adgangskode kunne stadig ikke bekræftes. Bemærk! Hvis du har ændret din adgangskode for nylig, anvendes din nye adgangskode først, når du har logget ud. Du skal bruge den gamle adgangskode her.</translation> <translation id="1677472565718498478"><ph name="TIME" /> tilbage</translation> <translation id="1698760176351776263">IPv6-adresse: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Udvid menu</translation> <translation id="3087734570205094154">Bund</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Vis altid hylde</translation> <translation id="3126069444801937830">Genstart for at opdatere</translation> <translation id="3147142846278915599">Starter (synkronisering af apps...)</translation> <translation id="315116470104423982">Mobildata</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Tilbage</translation> <translation id="3891340733213178823">Tryk på Ctrl+Shift+Q to gange for at logge ud.</translation> <translation id="3893630138897523026">ChromeVox (talefeedback)</translation> +<translation id="3897533311200664389">Start en tekstforespørgsel</translation> <translation id="3899995891769452915">Indtaling</translation> <translation id="3900355044994618856">Din session slutter om <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Opretter forbindelse til <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Administreres af <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Der er en tilgængelig Adobe Flash Player-opdatering</translation> <translation id="9056839673611986238">En tidligere version gendannes på enheden</translation> +<translation id="9070640332319875144">Indstillinger for Assistent</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofonen er i brug.</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 9c5c643..4f7be8b2 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Schwaches Signal</translation> <translation id="1293264513303784526">USB-C-Gerät (Port links)</translation> +<translation id="1294929383540927798">Hier können Sie die Benachrichtigungseinstellungen für den Sperrbildschirm ändern</translation> <translation id="1302880136325416935">Bluetooth-Einstellungen anzeigen. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Rechts</translation> <translation id="1351937230027495976">Menü minimieren</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth aktivieren/deaktivieren. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Diesen Nutzer entfernen</translation> <translation id="1621499497873603021">Verbleibende Akku-Laufzeit: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Gesprochene Anfrage starten</translation> <translation id="1658406695958299976">Ihr Passwort konnte immer noch nicht bestätigt werden. Hinweis: Falls Sie Ihr Passwort kürzlich geändert haben, wird Ihr neues Passwort übernommen, sobald Sie sich abmelden. Bitte verwenden Sie hier das alte Passwort.</translation> <translation id="1677472565718498478">Verbleibende Zeit: <ph name="TIME" /> h</translation> <translation id="1698760176351776263">IPv6-Adresse: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Menü maximieren</translation> <translation id="3087734570205094154">Unten</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Ablage immer zeigen</translation> <translation id="3126069444801937830">Zum Aktualisieren neu starten</translation> <translation id="3147142846278915599">Launcher (Apps werden synchronisiert...)</translation> <translation id="315116470104423982">Mobilfunk</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Zurück</translation> <translation id="3891340733213178823">Drücken Sie zum Abmelden zweimal Strg + Umschalttaste + Q.</translation> <translation id="3893630138897523026">ChromeVox (gesprochenes Feedback)</translation> +<translation id="3897533311200664389">Schriftliche Anfrage starten</translation> <translation id="3899995891769452915">Spracheingabe</translation> <translation id="3900355044994618856">Ihre Sitzung wird in <ph name="SESSION_TIME_REMAINING" /> beendet</translation> <translation id="3901991538546252627">Verbindung mit <ph name="NAME" /> wird hergestellt.</translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Verwaltet von <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Update für den Adobe Flash Player verfügbar</translation> <translation id="9056839673611986238">Das Gerät wird zurückgesetzt</translation> +<translation id="9070640332319875144">Assistant-Einstellungen</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">WLAN: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon wird verwendet.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 319dbaee..1f87ef86 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Ασθενές σήμα</translation> <translation id="1293264513303784526">Συσκευή USB-C (αριστερή θύρα)</translation> +<translation id="1294929383540927798">Αλλάξτε τις ρυθμίσεις ειδοποιήσεων της οθόνης κλειδώματος</translation> <translation id="1302880136325416935">Εμφάνιση ρυθμίσεων Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Δεξιά</translation> <translation id="1351937230027495976">Σύμπτυξη μενού</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Εναλλαγή Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Κατάργηση αυτού του χρήστη</translation> <translation id="1621499497873603021">Χρόνος που απομένει μέχρι να αδειάσει η μπαταρία, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Έναρξη φωνητικού ερωτήματος</translation> <translation id="1658406695958299976">Λυπούμαστε, η επαλήθευση του κωδικού πρόσβασης εξακολουθεί να μην είναι δυνατή. Σημείωση: Εάν έχετε αλλάξει πρόσφατα τον κωδικό πρόσβασης, ο νέος κωδικός πρόσβασης θα τεθεί σε ισχύ αφού αποσυνδεθείτε. Χρησιμοποιήστε εδώ τον παλιό κωδικό πρόσβασης.</translation> <translation id="1677472565718498478">Απομένουν <ph name="TIME" /></translation> <translation id="1698760176351776263">Διεύθυνση IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Ανάπτυξη μενού</translation> <translation id="3087734570205094154">Κάτω</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Να εμφανίζεται πάντα το ράφι</translation> <translation id="3126069444801937830">Επανεκκίνηση για ενημέρωση</translation> <translation id="3147142846278915599">Εφαρμογή εκκίνησης (συγχρονισμός εφαρμογών…)</translation> <translation id="315116470104423982">Δεδομένα κινητής τηλεφωνίας</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Πίσω</translation> <translation id="3891340733213178823">Πατήστε Ctrl + Shift + Q δύο φορές για να αποσυνδεθείτε.</translation> <translation id="3893630138897523026">ChromeVox (προφορικά σχόλια)</translation> +<translation id="3897533311200664389">Έναρξη ερωτήματος κειμένου</translation> <translation id="3899995891769452915">Φωνητική είσοδος</translation> <translation id="3900355044994618856">Η περίοδος λειτουργίας θα λήξει σε <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Σύνδεση με <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Έγινε διαχείριση από <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Υπάρχει διαθέσιμη ενημέρωση για το Adobe Flash Player</translation> <translation id="9056839673611986238">Θα γίνει επαναφορά της συσκευής</translation> +<translation id="9070640332319875144">Ρυθμίσεις Βοηθού</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Το μικρόφωνο χρησιμοποιείται.</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 66346e3b..a1a5f99b 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Señal débil</translation> <translation id="1293264513303784526">Dispositivo USB-C (puerto izquierdo)</translation> +<translation id="1294929383540927798">Cambia la configuración de las notificaciones de la pantalla de bloqueo</translation> <translation id="1302880136325416935">Muestra la configuración de Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="1346748346194534595">Derecha</translation> <translation id="1351937230027495976">Ocultar menú</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="1608626060424371292">Eliminar este usuario</translation> <translation id="1621499497873603021">Tiempo restante hasta que se agote la batería: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Iniciar una consulta por voz</translation> <translation id="1658406695958299976">Aún no se ha podido verificar tu contraseña. Nota: Si has cambiado la contraseña recientemente, la nueva contraseña se aplicará una vez que hayas cerrado sesión. Utiliza la antigua contraseña aquí.</translation> <translation id="1677472565718498478">Queda: <ph name="TIME" /></translation> <translation id="1698760176351776263">Dirección IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Mostrar menú</translation> <translation id="3087734570205094154">Inferior</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Mostrar siempre estantería</translation> <translation id="3126069444801937830">Reinicia el sistema para actualizarlo.</translation> <translation id="3147142846278915599">Menú de aplicaciones (sincronizando aplicaciones...)</translation> <translation id="315116470104423982">Redes móviles</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">Atrás</translation> <translation id="3891340733213178823">Pulsa Ctrl+Mayús+Q dos veces para cerrar sesión.</translation> <translation id="3893630138897523026">ChromeVox (mensajes de voz)</translation> +<translation id="3897533311200664389">Iniciar una consulta de texto</translation> <translation id="3899995891769452915">Entrada de voz</translation> <translation id="3900355044994618856">Tu sesión terminará en <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Conectando con: <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Administrado por <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Actualización de Adobe Flash Player disponible</translation> <translation id="9056839673611986238">Se va a instalar una versión anterior en el dispositivo</translation> +<translation id="9070640332319875144">Ajustes del Asistente</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">El micrófono se está utilizando.</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 7232088..8158d58 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Nõrk signaal</translation> <translation id="1293264513303784526">C-tüüpi USB-seade (vasakpoolne port)</translation> +<translation id="1294929383540927798">Lukustuskuva märguandeseadete muutmine</translation> <translation id="1302880136325416935">Kuvab Bluetoothi seaded. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Paremale</translation> <translation id="1351937230027495976">Ahenda menüü</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Lülitab Bluetoothi sisse või välja. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Eemalda see kasutaja</translation> <translation id="1621499497873603021">Aku tühjenemiseni on aega <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Häälpäringu alustamine</translation> <translation id="1658406695958299976">Kahjuks ei saanud teie parooli kinnitada. Märkus: kui muutsite parooli hiljuti, rakendub uus parool pärast väljalogimist. Kasutage siin vana parooli.</translation> <translation id="1677472565718498478"><ph name="TIME" /> tühjenemiseni</translation> <translation id="1698760176351776263">IPv6-aadress: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Laienda menüü</translation> <translation id="3087734570205094154">Alaserv</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Kuva alati riiul</translation> <translation id="3126069444801937830">Taaskäivitage värskendamiseks</translation> <translation id="3147142846278915599">Käivitusprogramm (rakenduste sünkroonimine ...)</translation> <translation id="315116470104423982">Mobiilne andmeside</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">Tagasi</translation> <translation id="3891340733213178823">Väljalogimiseks vajutage kaks korda klahvikombinatsiooni Ctrl + tõstuklahv + Q.</translation> <translation id="3893630138897523026">ChromeVox (kõnena esitatud tagasiside)</translation> +<translation id="3897533311200664389">Tekstipõhise päringu alustamine</translation> <translation id="3899995891769452915">Häälsisend</translation> <translation id="3900355044994618856">Teie seanss lõpeb <ph name="SESSION_TIME_REMAINING" /> pärast</translation> <translation id="3901991538546252627">Võrguga <ph name="NAME" /> ühenduse loomine</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Haldaja: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Saadaval on Adobe Flash Playeri värskendus</translation> <translation id="9056839673611986238">Seade viiakse vanemale versioonile</translation> +<translation id="9070640332319875144">Assistendi seaded</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">WiFi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon on kasutusel.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index c6c288d..420bb256 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">سیگنال ضعیف</translation> <translation id="1293264513303784526">دستگاه USB-C (درگاه سمت چپ)</translation> +<translation id="1294929383540927798">تغییر تنظیمات اعلان صفحه قفل</translation> <translation id="1302880136325416935">نشان دادن تنظیمات بلوتوث. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">راست</translation> <translation id="1351937230027495976">کوچک کردن منو</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">روشن/خاموش کردن بلوتوث. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">حذف این کاربر</translation> <translation id="1621499497873603021">زمان باقیمانده تا خالیشدن شارژ باتری، <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">شروع پُرسمان صوتی</translation> <translation id="1658406695958299976">متأسفیم، گذرواژهتان هنوز تأیید نشده است. توجه: اگر بهتازگی گذرواژهتان را تغییر دادهاید، گذرواژه جدید شما هنگامیکه از سیستم خارج شوید، اعمال میشود؛ لطفاً اینجا از گذرواژه قدیمی خود استفاده کنید.</translation> <translation id="1677472565718498478"><ph name="TIME" /> باقیمانده</translation> <translation id="1698760176351776263">نشانی IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">بزرگ کردن منو</translation> <translation id="3087734570205094154">پایین</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (بلوتوث)</translation> +<translation id="3124698051292518391">همیشه قفسه نشان داده شود</translation> <translation id="3126069444801937830">راهاندازی مجدد برای بهروزرسانی</translation> <translation id="3147142846278915599">راه انداز (همگامسازی برنامهها...)</translation> <translation id="315116470104423982">دادههای تلفن همراه</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">بازگشت</translation> <translation id="3891340733213178823">برای خروج از سیستم Ctrl+Shift+Q را دو بار فشار دهید.</translation> <translation id="3893630138897523026">ChromeVox (بازخورد گفتاری)</translation> +<translation id="3897533311200664389">شروع پُرسمان نوشتاری</translation> <translation id="3899995891769452915">ورودی گفتاری</translation> <translation id="3900355044994618856">جلسهتان <ph name="SESSION_TIME_REMAINING" /> دیگر به پایان میرسد</translation> <translation id="3901991538546252627">در حال اتصال به <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">مدیریت شده توسط <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">بهروزرسانی Adobe Flash Player دردسترس است</translation> <translation id="9056839673611986238">دستگاه عقبگرد میکند</translation> +<translation id="9070640332319875144">تنظیمات «دستیار»</translation> <translation id="9074739597929991885">بلوتوث</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">میکروفون در حال استفاده است.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 3bc17258..d3bca4bb 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Mahina ang signal</translation> <translation id="1293264513303784526">USB-C device (port sa kaliwa)</translation> +<translation id="1294929383540927798">Baguhin ang mga setting ng notification ng lock-screen</translation> <translation id="1302880136325416935">Ipakita ang mga setting ng Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Kanan</translation> <translation id="1351937230027495976">I-collapse ang menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">I-toggle ang Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Alisin ang user na ito</translation> <translation id="1621499497873603021">Natitirang oras bago maubos ang baterya, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Magsimula ng query gamit ang boses</translation> <translation id="1658406695958299976">Paumanhin, hindi pa rin ma-verify ang iyong password. Tandaan: kung pinalitan mo kamakailan ang iyong password, malalapat ang bago mong password kapag nag-sign out ka, pakigamit ang lumang password dito.</translation> <translation id="1677472565718498478"><ph name="TIME" /> na lang ang natitira</translation> <translation id="1698760176351776263">IPv6 address: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">I-expand ang menu</translation> <translation id="3087734570205094154">Sa ilalim</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Palaging Ipakita ang Shelf</translation> <translation id="3126069444801937830">I-restart upang mag-update</translation> <translation id="3147142846278915599">Launcher (nagsi-sync ng mga app...)</translation> <translation id="315116470104423982">Data sa mobile</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Bumalik</translation> <translation id="3891340733213178823">Pindutin ang Ctrl+Shift+Q nang dalawang beses upang mag-sign out.</translation> <translation id="3893630138897523026">ChromeVox (pasalitang feedback)</translation> +<translation id="3897533311200664389">Magsimula ng query gamit ang text</translation> <translation id="3899995891769452915">Input na boses</translation> <translation id="3900355044994618856">Matatapos ang iyong session sa loob ng <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Kumokonekta sa <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Pinamamahalaan ni <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Available ang update sa Adobe Flash Player</translation> <translation id="9056839673611986238">Iro-roll back ang device</translation> +<translation id="9070640332319875144">Mga Setting ng Assistant</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Ginagamit ang mikropono.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index f0801e66..1e4c5aa 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Signal de faible intensité</translation> <translation id="1293264513303784526">Appareil USB de type C (port situé sur la gauche de l'appareil)</translation> +<translation id="1294929383540927798">Modifier les paramètres de notification sur l'écran de verrouillage</translation> <translation id="1302880136325416935">Afficher les paramètres Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Vers la droite</translation> <translation id="1351937230027495976">Réduire le menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Activer/Désactiver le Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Supprimer cet utilisateur</translation> <translation id="1621499497873603021">Temps restant avant que la batterie ne soit vide : <ph name="TIME_LEFT" />.</translation> +<translation id="1654477262762802994">Soumettre une requête vocale</translation> <translation id="1658406695958299976">Impossible de valider le mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera appliqué qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation> <translation id="1677472565718498478">Temps restant : <ph name="TIME" /></translation> <translation id="1698760176351776263">Adresse IPv6 : <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Développer le menu</translation> <translation id="3087734570205094154">Bas</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Toujours afficher l'étagère</translation> <translation id="3126069444801937830">Redémarrer pour mettre à jour</translation> <translation id="3147142846278915599">Lanceur d'applications (synchronisation des applications en cours…)</translation> <translation id="315116470104423982">Données mobiles</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Retour</translation> <translation id="3891340733213178823">Appuyez deux fois sur Ctrl + Maj + Q pour vous déconnecter.</translation> <translation id="3893630138897523026">ChromeVox (commentaires audio)</translation> +<translation id="3897533311200664389">Soumettre une requête textuelle</translation> <translation id="3899995891769452915">Saisie vocale</translation> <translation id="3900355044994618856">Votre session va être fermée dans <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Connexion à <ph name="NAME" /> en cours…</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Géré par <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Mise à jour Adobe Flash Player disponible</translation> <translation id="9056839673611986238">L'appareil va être rétabli</translation> +<translation id="9070640332319875144">Paramètres de l'Assistant</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi : <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Le micro est en cours d'utilisation.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 376786ff..562e4427 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -7,6 +7,7 @@ <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ઉમેર્યું</translation> <translation id="1056775291175587022">કોઈ નેટવર્ક નથી</translation> <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation> +<translation id="109942774857561566">મને કંટાળો આવે છે</translation> <translation id="1104084341931202936">ઍક્સેસિબિલિટી સેટિંગ બતાવો</translation> <translation id="1104621072296271835">તમારા ઉપકરણો એક સાથે હોય ત્યારે વધુ કાર્યક્ષમ હોય છે</translation> <translation id="112308213915226829">સ્વતઃછુપાવો શેલ્ફ</translation> @@ -15,12 +16,14 @@ <translation id="119944043368869598">બધા દૂર કરો</translation> <translation id="1247372569136754018">માઇક્રોફોન (આંતરિક)</translation> <translation id="1252999807265626933"><ph name="POWER_SOURCE" /> પરથી ચાર્જ કરી રહ્યાં છે</translation> +<translation id="1255033239764210633">હવામાન કેવું છે?</translation> <translation id="1267032506238418139">શૉર્ટકટ ફેરફાર</translation> <translation id="1270290102613614947">ઓન-સ્ક્રીન કીબોર્ડ અક્ષમ કર્યું</translation> <translation id="1272079795634619415">રોકો</translation> <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">નબળું સિગ્નલ</translation> <translation id="1293264513303784526">USB-C ઉપકરણ (ડાબું પોર્ટ)</translation> +<translation id="1294929383540927798">લૉક સ્ક્રીન નોટિફિકેશન સેટિંગ બદલો</translation> <translation id="1302880136325416935">બ્લૂટૂથ સેટિંગ બતાવો. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">જમણે</translation> <translation id="1351937230027495976">મેનૂ સંકુચિત કરો</translation> @@ -38,6 +41,7 @@ <translation id="1570871743947603115">બ્લૂટૂથ ટૉગલ કરો. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">આ વપરાશકર્તાને દૂર કરો</translation> <translation id="1621499497873603021">બેટરી ખાલી થવામાં બાકી સમય, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">વૉઇસ ક્વેરી શરૂ કરો</translation> <translation id="1658406695958299976">માફ કરશો, તમારો પાસવર્ડ હજી ચકાસી શકાયો નથી. નોંધ: જો તમે તાજેતરમાં તમારો પાસવર્ડ બદલ્યો હોય, તો તમારો નવો પાસવર્ડ તમે એક વાર સાઇન આઉટ કરી લો તે પછી લાગુ થશે, કૃપા કરીને અહીં જૂના પાસવર્ડનો ઉપયોગ કરો.</translation> <translation id="1677472565718498478"><ph name="TIME" /> બાકી</translation> <translation id="1698760176351776263">IPv6 સરનામું: <ph name="ADDRESS" /></translation> @@ -131,6 +135,7 @@ <translation id="3081696990447829002">મેનૂ વિસ્તૃત કરો</translation> <translation id="3087734570205094154">તળિયું</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">હંમેશાં શેલ્ફ બતાવો</translation> <translation id="3126069444801937830">અપડેટ કરવા માટે પુનઃપ્રારંભ કરો</translation> <translation id="3147142846278915599">લોન્ચર (એપ્લિકેશન્સને સમન્વયિત કરી રહ્યું છે..)</translation> <translation id="315116470104423982">મોબાઇલ ડેટા</translation> @@ -138,6 +143,7 @@ <translation id="3153444934357957346">તમે એકથી વધુ સાઇન ઇનમાં માત્ર <ph name="MULTI_PROFILE_USER_LIMIT" /> સુધી એકાઉન્ટ રાખી શકો છો.</translation> <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ઉપકરણ સાથે કનેક્ટ કર્યું}one{# ઉપકરણો સાથે કનેક્ટ કર્યું}other{# ઉપકરણો સાથે કનેક્ટ કર્યું}}</translation> <translation id="3236488194889173876">કોઈ મોબાઇલ નેટવર્ક ઉપલબ્ધ નથી</translation> +<translation id="3255483164551725916">તમે શું કરી શકો?</translation> <translation id="3294437725009624529">અતિથિ</translation> <translation id="332587331255250389">કૃપા કરીને બૅટરી બદલો</translation> <translation id="3351879221545518001">તમે હાલમાં સ્ક્રીનને કાસ્ટ કરી રહ્યા છો.</translation> @@ -172,6 +178,7 @@ <translation id="385051799172605136">પાછળ</translation> <translation id="3891340733213178823">સાઇન આઉટ કરવા માટે બે વાર Ctrl+Shift+Q દબાવો.</translation> <translation id="3893630138897523026">ChromeVox (બોલાયેલ પ્રતિસાદ)</translation> +<translation id="3897533311200664389">ટેક્સ્ટ ક્વેરી શરૂ કરો</translation> <translation id="3899995891769452915">વૉઇસ ઇનપુટ</translation> <translation id="3900355044994618856">તમારું સત્ર <ph name="SESSION_TIME_REMAINING" />માં સમાપ્ત થશે</translation> <translation id="3901991538546252627"><ph name="NAME" /> થી કનેક્ટ કરી રહ્યું છે</translation> @@ -181,6 +188,7 @@ <translation id="4017989525502048489">લેઝર પૉઇન્ટર</translation> <translation id="4065525899979931964">{NUM_APPS,plural, =1{એક ઍપ માટે બંધ છે}one{# ઍપ માટે બંધ છે}other{# ઍપ માટે બંધ છે}}</translation> <translation id="4072264167173457037">મધ્યમ સિગ્નલ</translation> +<translation id="4146833061457621061">મ્યુઝિક વગાડો</translation> <translation id="4200057768455216496">તમે ડૉક કરેલ મૅગ્નિફાયર માટેનો શૉર્ટકટ દબાવેલ છે. શું તમે તે ચાલુ કરવા માગો છો?</translation> <translation id="4217571870635786043">ડિક્ટેશન</translation> <translation id="4261870227682513959">નોટિફિકેશન સેટિંગ બતાવો. નોટિફિકેશન બંધ છે</translation> @@ -335,6 +343,7 @@ <translation id="7037152028959403492">તમે હાઇ કોન્ટ્રાસ્ટ માટેનો શૉર્ટકટ દબાવેલ છે. શું તમે તે ચાલુ કરવા માગો છો?</translation> <translation id="7066646422045619941">આ નેટવર્ક તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ છે.</translation> <translation id="7067196344162293536">સ્વતઃ ફેરવો</translation> +<translation id="7068360136237591149">ફાઇલો ખોલો</translation> <translation id="7076293881109082629">સાઇન ઇન કરી રહ્યું છે</translation> <translation id="7092922358121866860">રાત્રિ પ્રકાશ સેટિંગ બતાવો</translation> <translation id="7098389117866926363">USB-C ઉપકરણ (પાછળની બાજુએ ડાબું પોર્ટ)</translation> @@ -374,6 +383,7 @@ <translation id="7842211907556571265"><ph name="NETWORK_NAME" /> સાથે કનેક્ટ થઈ રહ્યું છે</translation> <translation id="7842569679327885685">ચેતવણી: પ્રાયોગિક સુવિધા</translation> <translation id="7846634333498149051">કીબોર્ડ</translation> +<translation id="788781083998633524">ઇમેઇલ મોકલો</translation> <translation id="7904094684485781019">આ એકાઉન્ટ માટે વ્યસ્થાપકે બહુવિધ સાઇન-ઇનને નામંજૂર કર્યું છે.</translation> <translation id="7933084174919150729">Google સહાયક માત્ર પ્રાથમિક પ્રોફાઇલ માટે જ ઉપલબ્ધ છે.</translation> <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> અને <ph name="SECOND_PARENT_EMAIL" /> દ્વારા મેનેજ કરાતું એકાઉન્ટ</translation> @@ -434,6 +444,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8870509716567206129">ઍપ સ્ક્રીન-વિભાજનને સહાય કરતી નથી.</translation> <translation id="8874184842967597500">કનેક્ટેડ નથી</translation> +<translation id="8877788021141246043">રિમાઇન્ડર સેટ કરો</translation> <translation id="8878886163241303700">સ્ક્રીનને વિસ્તૃત કરી રહ્યું છે</translation> <translation id="8921624153894383499">Google સહાયક આ ભાષા બોલતું નથી.</translation> <translation id="8938800817013097409">USB-C ઉપકરણ (પાછળની બાજુએ જમણું પોર્ટ)</translation> @@ -443,6 +454,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> દ્વારા સંચાલિત</translation> <translation id="9029474291399787231">Adobe Flash Player અપડેટ ઉપલબ્ધ છે</translation> <translation id="9056839673611986238">ઉપકરણ રોલ બૅક કરવામાં આવશે</translation> +<translation id="9070640332319875144">આસિસ્ટંટ સેટિંગ</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">માઇકોફોન ઉપયોગમાં છે.</translation> @@ -457,6 +469,7 @@ <translation id="9210037371811586452">એકીકૃત ડેસ્કટૉપ મોડથી બહાર નીકળે છે</translation> <translation id="9215934040295798075">વૉલપેપર સેટ કરો</translation> <translation id="923686485342484400">સાઇન આઉટ કરવા માટે બે વાર Control Shift Q દબાવો.</translation> +<translation id="938963181863597773">મારા કૅલેન્ડરમાં શું છે?</translation> <translation id="945522503751344254">પ્રતિસાદ મોકલો</translation> <translation id="98515147261107953">લેન્ડસ્કૅપ</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 260052af..7084510 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">कमज़ोर सिग्नल</translation> <translation id="1293264513303784526">USB-C डिवाइस (बायां पोर्ट)</translation> +<translation id="1294929383540927798">लॉक स्क्रीन नोटिफ़िकेशन सेटिंग बदलें</translation> <translation id="1302880136325416935">ब्लूटूथ सेटिंग दिखाएं. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">दाएं</translation> <translation id="1351937230027495976">मेन्यू छोटा करें</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">ब्लूटूथ टॉगल करें. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">इस उपयोगकर्ता को हटाएं</translation> <translation id="1621499497873603021">बैटरी के खाली होने में शेष समय, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">बोलकर खोजना शुरू करें</translation> <translation id="1658406695958299976">माफ़ करें, आपके पासवर्ड की अभी भी पुष्टि नहीं हो पाई है. नोट: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके साइन आउट होते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का इस्तेमाल करें.</translation> <translation id="1677472565718498478"><ph name="TIME" /> शेष</translation> <translation id="1698760176351776263">IPv6 पता: <ph name="ADDRESS" /></translation> @@ -53,7 +55,7 @@ <translation id="1836215606488044471">Assistant (सेवा लोड हो रही है...)</translation> <translation id="1850504506766569011">वाई-फ़ाई बंद है.</translation> <translation id="1864454756846565995">USB-C डिवाइस (पिछला पोर्ट)</translation> -<translation id="1882897271359938046"><ph name="DISPLAY_NAME" /> पर मिरर कर रहा है</translation> +<translation id="1882897271359938046"><ph name="DISPLAY_NAME" /> पर स्क्रीन शेयर कर रहा है</translation> <translation id="1885785240814121742">फ़िंगरप्रिंट से अनलॉक करें</translation> <translation id="1919743966458266018">काम के प्रबंधक को खोलने का शॉर्टकट बदल गया है. कृपया <ph name="OLD_SHORTCUT" /> के बजाय <ph name="NEW_SHORTCUT" /> का उपयोग करें.</translation> <translation id="1923539912171292317">स्वत: क्लिक</translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">मेन्यू बड़ा करें</translation> <translation id="3087734570205094154">नीचे</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (ब्लूटूथ)</translation> +<translation id="3124698051292518391">आइकॉन हमेशा दिखाएं</translation> <translation id="3126069444801937830">अपडेट करने के लिए पुनरारंभ करें</translation> <translation id="3147142846278915599">लॉन्चर (ऐप्स समन्वयित किए जा रहे हैं...)</translation> <translation id="315116470104423982">मोबाइल डेटा</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">वापस</translation> <translation id="3891340733213178823">साइन आउट करने के लिए दो बार Ctrl+Shift+Q दबाएं.</translation> <translation id="3893630138897523026">ChromeVox (बोला गया फ़ीडबैक)</translation> +<translation id="3897533311200664389">एक टेक्स्ट क्वेरी शुरू करें</translation> <translation id="3899995891769452915">ध्वनि इनपुट</translation> <translation id="3900355044994618856">आपका सत्र <ph name="SESSION_TIME_REMAINING" /> में खत्म होने वाला है</translation> <translation id="3901991538546252627"><ph name="NAME" /> से कनेक्ट हो रहा है</translation> @@ -192,7 +196,7 @@ <translation id="4217571870635786043">लिखवाना</translation> <translation id="4261870227682513959">सूचना सेटिंग दिखाएं. सूचनाएं बंद हैं</translation> <translation id="4274921305979314545">अपने Chromebook को अपने फ़ोन से कनेक्ट करें</translation> -<translation id="4279490309300973883">मिरर करना</translation> +<translation id="4279490309300973883">स्क्रीन शेयर करने की सुविधा चालू है</translation> <translation id="4292681942966152062"><ph name="NETWORK_NAME" /> चालू हो रहा है</translation> <translation id="4321179778687042513">ctrl</translation> <translation id="4331809312908958774">Chrome OS</translation> @@ -444,7 +448,7 @@ <translation id="875593634123171288">VPN सेटिंग दिखाएं</translation> <translation id="8809737090443522491">किसी ऐप्लिकेशन या दस्तावेज़ का नाम लिखें</translation> <translation id="8814190375133053267">वाई-फ़ाई </translation> -<translation id="8825534185036233643">दो से अधिक प्रदर्शनों की मिररिंग समर्थित नहीं है.</translation> +<translation id="8825534185036233643">दो से ज़्यादा डिसप्ले की स्क्रीन नहीं शेयर की जा सकती है.</translation> <translation id="8828714802988429505">90°</translation> <translation id="8841375032071747811">वापस जाएं बटन</translation> <translation id="8843682306134542540">रोटेशन लॉक को टॉगल करें. <ph name="STATE_TEXT" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> द्वारा प्रबंधित</translation> <translation id="9029474291399787231">Adobe Flash Player का अपडेट मौजूद है</translation> <translation id="9056839673611986238">डिवाइस बहाल कर दिया जाएगा</translation> +<translation id="9070640332319875144">Assistant की सेटिंग</translation> <translation id="9074739597929991885">ब्लूटूथ</translation> <translation id="9079731690316798640">वाई-फ़ाई: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">माइक्रोफ़ोन का उपयोग हो रहा है.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 3c76ec4..45534f04 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Slab signal</translation> <translation id="1293264513303784526">USB-C uređaj (lijevi priključak)</translation> +<translation id="1294929383540927798">Promijenite postavke obavijesti o zaključanom zaslonu</translation> <translation id="1302880136325416935">Prikaz postavki Bluetootha. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Udesno</translation> <translation id="1351937230027495976">Sažmi izbornik</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Prebacivanje Bluetootha. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Ukloni tog korisnika</translation> <translation id="1621499497873603021">Baterija će se isprazniti za <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Pokrenite glasovni upit</translation> <translation id="1658406695958299976">Vaša zaporka i dalje nije mogla biti potvrđena. Napomena: ako ste nedavno promijenili zaporku, vaša nova zaporka primjenjivat će se nakon što se odjavite. Ovdje upotrijebite staru zaporku.</translation> <translation id="1677472565718498478">Još <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 adresa: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Proširi izbornik</translation> <translation id="3087734570205094154">Donji</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Uvijek prikaži policu</translation> <translation id="3126069444801937830">Ponovo pokrenite za ažuriranje</translation> <translation id="3147142846278915599">Pokretač (sinkronizacija aplikacija...)</translation> <translation id="315116470104423982">Mobilni podaci</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Natrag</translation> <translation id="3891340733213178823">Pritisnite Ctrl + Shift + Q dvaput da biste se odjavili.</translation> <translation id="3893630138897523026">ChromeVox (govorne povratne informacije)</translation> +<translation id="3897533311200664389">Pokrenite tekstualni upit</translation> <translation id="3899995891769452915">Glasovni unos</translation> <translation id="3900355044994618856">Vaša će sesija završiti za <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Povezivanje s mrežom <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Upravlja <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Dostupno je ažuriranje za Adobe Flash Player</translation> <translation id="9056839673611986238">Uređaj će se vratiti na prethodnu verziju sustava</translation> +<translation id="9070640332319875144">Postavke Asistenta</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Upotrebljava se mikrofon.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 693c9f77..09649a9 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Gyenge jel</translation> <translation id="1293264513303784526">C típusú USB-vel kompatibilis eszköz (bal oldali port)</translation> +<translation id="1294929383540927798">A lezárási képernyő értesítési beállításainak módosítása</translation> <translation id="1302880136325416935">Bluetooth-beállítások megjelenítése. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Jobbra</translation> <translation id="1351937230027495976">Menü összecsukása</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth ki- és bekapcsolása. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Felhasználó eltávolítása</translation> <translation id="1621499497873603021">Akkumulátor lemerüléséig hátralévő idő: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Hangalapú lekérdezés indítása</translation> <translation id="1658406695958299976">Sajnos a jelszó ellenőrzése még mindig nem sikerült. Megjegyzés: ha a közelmúltban módosította jelszavát, az új jelszó beállítása a kijelentkezés után megy végbe, ezért itt a régi jelszót használja.</translation> <translation id="1677472565718498478"><ph name="TIME" /> van hátra</translation> <translation id="1698760176351776263">IPv6-cím: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Menü kibontása</translation> <translation id="3087734570205094154">Alja</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Mindig látsszon a polc</translation> <translation id="3126069444801937830">Indítsa újra a frissítéshez</translation> <translation id="3147142846278915599">Indító (alkalmazások szinkronizálása…)</translation> <translation id="315116470104423982">Mobiladatok</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">Vissza</translation> <translation id="3891340733213178823">Nyomja meg a Ctrl+Shift+Q billentyűkombinációt kétszer a kijelentkezéshez.</translation> <translation id="3893630138897523026">ChromeVox (beszélt visszajelzés)</translation> +<translation id="3897533311200664389">Szöveges lekérdezés indítása</translation> <translation id="3899995891769452915">Hangbevitel</translation> <translation id="3900355044994618856">Munkamenete <ph name="SESSION_TIME_REMAINING" /> elteltével lejár</translation> <translation id="3901991538546252627">Csatlakozás a következőhöz: <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Kezelő: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Rendelkezésre áll az Adobe Flash Player frissítése</translation> <translation id="9056839673611986238">Az eszköz korábbi állapotra áll vissza</translation> +<translation id="9070640332319875144">A Segéd beállításai</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">A mikrofon használatban van.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 234d8e2..a784d61c 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Sinyal lemah</translation> <translation id="1293264513303784526">Perangkat USB-C (port sebelah kiri)</translation> +<translation id="1294929383540927798">Ubah setelan notifikasi layar kunci</translation> <translation id="1302880136325416935">Tampilkan setelan Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Kanan</translation> <translation id="1351937230027495976">Ciutkan menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Alihkan Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Hapus pengguna ini</translation> <translation id="1621499497873603021">Waktu yang tersisa hingga baterai kosong, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Mulai kueri suara</translation> <translation id="1658406695958299976">Maaf, sandi Anda masih belum dapat diverifikasi. Catatan: jika Anda baru saja mengubah sandi, sandi yang baru akan diterapkan saat Anda logout, gunakan sandi lama di sini.</translation> <translation id="1677472565718498478">Sisa waktu <ph name="TIME" /></translation> <translation id="1698760176351776263">Alamat IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Luaskan menu</translation> <translation id="3087734570205094154">Bawah</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Selalu Tampilkan Rak</translation> <translation id="3126069444801937830">Mulai ulang untuk memperbarui</translation> <translation id="3147142846278915599">Peluncur (menyinkronkan aplikasi...)</translation> <translation id="315116470104423982">Data seluler</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Mundur</translation> <translation id="3891340733213178823">Tekan Ctrl+Shift+Q dua kali untuk keluar.</translation> <translation id="3893630138897523026">ChromeVox (masukan lisan)</translation> +<translation id="3897533311200664389">Mulai kueri teks</translation> <translation id="3899995891769452915">Masukan suara</translation> <translation id="3900355044994618856">Sesi akan berakhir dalam <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Menyambung ke <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Dikelola menurut <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Update Adobe Flash Player tersedia</translation> <translation id="9056839673611986238">Perangkat akan dipulihkan</translation> +<translation id="9070640332319875144">Setelan Asisten</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon sedang digunakan.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index f0bfeb9..25d97d2 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Segnale debole</translation> <translation id="1293264513303784526">Dispositivo USB-C (porta a sinistra)</translation> +<translation id="1294929383540927798">Modifica le impostazioni per le notifiche della schermata di blocco</translation> <translation id="1302880136325416935">Mostra impostazioni Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Destra</translation> <translation id="1351937230027495976">Comprimi il menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Attiva/disattiva Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Rimuovi questo utente</translation> <translation id="1621499497873603021">Tempo rimanente all'esaurimento della batteria: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Avvia una query vocale</translation> <translation id="1658406695958299976">Non è stato ancora possibile verificare la password. Nota: se l'hai modificata di recente, la nuova password verrà applicata quando esci dall'account. Utilizza qui la tua vecchia password.</translation> <translation id="1677472565718498478"><ph name="TIME" /> rimanenti</translation> <translation id="1698760176351776263">Indirizzo IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Espandi il menu</translation> <translation id="3087734570205094154">In basso</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Mostra sempre shelf</translation> <translation id="3126069444801937830">Riavvia per aggiornare</translation> <translation id="3147142846278915599">Avvio applicazioni (sincronizzazione delle app...)</translation> <translation id="315116470104423982">Dati mobili</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">Indietro</translation> <translation id="3891340733213178823">Premi due volte Ctrl+Maiusc+Q per uscire.</translation> <translation id="3893630138897523026">ChromeVox (lettura vocale)</translation> +<translation id="3897533311200664389">Avvia una query di testo</translation> <translation id="3899995891769452915">Input vocale</translation> <translation id="3900355044994618856">La sessione terminerà tra <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Connessione a: <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Gestito da <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Aggiornamento di Adobe Flash Player disponibile</translation> <translation id="9056839673611986238">Verrà eseguito il rollback del dispositivo</translation> +<translation id="9070640332319875144">Impostazioni assistente</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Il microfono è in uso.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 8e201bfe..16b76e5 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">אות חלש</translation> <translation id="1293264513303784526">מכשיר עם יציאת USB-C (יציאה שמאלית)</translation> +<translation id="1294929383540927798">שינוי של הגדרות ההתראות במסך הנעילה</translation> <translation id="1302880136325416935">צפייה בהגדרות Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">ימינה</translation> <translation id="1351937230027495976">כיווץ התפריט</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">הפעלה או השבתה של Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">הסר את המשתמש הזה</translation> <translation id="1621499497873603021">הזמן שנותר עד להתרוקנות הסוללה, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">הפעלה של שאלה קולית</translation> <translation id="1658406695958299976">מצטערים, עדיין אי אפשר לאמת את הסיסמה שלך. חשוב לדעת: אם שינית לאחרונה את הסיסמה, הסיסמה החדשה תיכנס לתוקף רק אחרי יציאה מהחשבון. צריך להשתמש כאן בסיסמה הישנה.</translation> <translation id="1677472565718498478">זמן נותר - <ph name="TIME" /></translation> <translation id="1698760176351776263">כתובת IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">הרחבת התפריט</translation> <translation id="3087734570205094154">תחתית</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">יש להציג תמיד את המדף</translation> <translation id="3126069444801937830">הפעל מחדש כדי לעדכן</translation> <translation id="3147142846278915599">מפעיל היישומים (מסנכרן יישומים...)</translation> <translation id="315116470104423982">נתוני נייד</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">חזור</translation> <translation id="3891340733213178823">הקש פעמיים על Ctrl+Shift+Q כדי לצאת.</translation> <translation id="3893630138897523026">ChromeVox (משוב קולי)</translation> +<translation id="3897533311200664389">הפעלה של שאלת טקסט</translation> <translation id="3899995891769452915">קלט קולי</translation> <translation id="3900355044994618856">הסשן יסתיים בעוד <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">מתחבר אל: <ph name="NAME" /></translation> @@ -462,6 +466,7 @@ <translation id="8995603266996330174">מנוהל על ידי <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">יש עדכון בשביל Adobe Flash Player</translation> <translation id="9056839673611986238">המכשיר יוחזר למצב קודם</translation> +<translation id="9070640332319875144">הגדרות Assistant</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">המיקרופון נמצא בשימוש.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 02f378f..3fcca0c 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">電波: 弱い</translation> <translation id="1293264513303784526">USB-C デバイス(左側面のポート)</translation> +<translation id="1294929383540927798">ロック画面の通知設定を変更</translation> <translation id="1302880136325416935">Bluetooth の設定を表示します。<ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">右</translation> <translation id="1351937230027495976">メニューを折りたたむ</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth を切り替えます。<ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">このユーザーを削除</translation> <translation id="1621499497873603021">バッテリーが空になるまであと: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">音声検索を開始</translation> <translation id="1658406695958299976">パスワードをまだ確認できません。注: パスワードを最近変更した場合、新しいパスワードはログアウトした後に適用されます。こちらでは古いパスワードを使用してください。</translation> <translation id="1677472565718498478">あと <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 アドレス: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">メニューを展開</translation> <translation id="3087734570205094154">下</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" />(Bluetooth)</translation> +<translation id="3124698051292518391">シェルフを常に表示</translation> <translation id="3126069444801937830">再起動して更新</translation> <translation id="3147142846278915599">ランチャー(アプリを同期中...)</translation> <translation id="315116470104423982">モバイル データ</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">戻る</translation> <translation id="3891340733213178823">ログアウトするには、Ctrl+Shift+Q を 2 回押します。</translation> <translation id="3893630138897523026">ChromeVox(音声フィードバック)</translation> +<translation id="3897533311200664389">テキスト検索を開始</translation> <translation id="3899995891769452915">音声入力</translation> <translation id="3900355044994618856">セッションの制限時間まであと <ph name="SESSION_TIME_REMAINING" /> です</translation> <translation id="3901991538546252627"><ph name="NAME" /> に接続しています</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">管理ドメイン: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Adobe Flash Player のアップデートが利用可能</translation> <translation id="9056839673611986238">端末はロールバックされます</translation> +<translation id="9070640332319875144">アシスタントの設定</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">マイクは使用中です。</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index b51573ff..89399cb 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">ದುರ್ಬಲ ಸಿಗ್ನಲ್</translation> <translation id="1293264513303784526">USB-C ಸಾಧನ (ಎಡ ಪೋರ್ಟ್)</translation> +<translation id="1294929383540927798">ಲಾಕ್-ಸ್ಕ್ರೀನ್ ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="1302880136325416935">ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೋರಿಸಿ. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">ಬಲಕ್ಕೆ</translation> <translation id="1351937230027495976">ಮೆನುವನ್ನು ಕುಗ್ಗಿಸಿ</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">ಬ್ಲೂಟೂತ್ ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">ಈ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="1621499497873603021">ಬ್ಯಾಟರಿ ಖಾಲಿ ಆಗುವವರೆಗೆ ಉಳಿದಿರುವ ಸಮಯ, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">ಧ್ವನಿ ಪ್ರಶ್ನೆಯನ್ನು ಕೇಳಲು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="1658406695958299976">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಗಮನಿಸಿ: ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಇತ್ತೀಚೆಗೆ ಬದಲಾಯಿಸಿದ್ದರೆ, ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ ನಿಮ್ಮ ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಜಾರಿಗೆ ತರಲಾಗುತ್ತದೆ, ಇಲ್ಲಿ ಹಳೆಯ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ.</translation> <translation id="1677472565718498478"><ph name="TIME" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation> <translation id="1698760176351776263">IPv6 ವಿಳಾಸ: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">ಮೆನುವನ್ನು ವಿಸ್ತರಿಸಿ</translation> <translation id="3087734570205094154">ಕೆಳಗೆ</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (ಬ್ಲೂಟೂತ್)</translation> +<translation id="3124698051292518391">ಯಾವಾಗಲೂ ಶೆಲ್ಫ್ ಅನ್ನು ತೋರಿಸಿ</translation> <translation id="3126069444801937830">ನವೀಕರಿಸಲು ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="3147142846278915599">ಲಾಂಚರ್ (ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ...)</translation> <translation id="315116470104423982">ಮೊಬೈಲ್ ಡೇಟಾ</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">ಹಿಂದೆ</translation> <translation id="3891340733213178823">ಸೈನ್ ಔಟ್ ಮಾಡಲು Ctrl+Shift+Q ಅನ್ನು ಎರಡುಬಾರಿ ಒತ್ತಿರಿ.</translation> <translation id="3893630138897523026">ChromeVox (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation> +<translation id="3897533311200664389">ಪಠ್ಯ ಪ್ರಶ್ನೆಯನ್ನು ತೋರಿಸಲು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="3899995891769452915">ಧ್ವನಿ ಇನ್ಪುಟ್</translation> <translation id="3900355044994618856">ನಿಮ್ಮ ಸೆಷನ್ <ph name="SESSION_TIME_REMAINING" /> ರಲ್ಲಿ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ</translation> <translation id="3901991538546252627"><ph name="NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> ನಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> <translation id="9029474291399787231">Adobe Flash Player ಅಪ್ಡೇಟ್ ಲಭ್ಯವಿದೆ</translation> <translation id="9056839673611986238">ಸಾಧನವನ್ನು ಮುಂಚಿನ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತದೆ</translation> +<translation id="9070640332319875144">ಅಸಿಸ್ಟೆಂಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="9074739597929991885">ಬ್ಲೂಟೂತ್</translation> <translation id="9079731690316798640">ವೈ-ಫೈ: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">ಮೈಕ್ರೊಫೋನ್ ಬಳಕೆಯಲ್ಲಿದೆ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index e7f965b9..0b399d3 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">신호 약함</translation> <translation id="1293264513303784526">USB-C 기기(왼쪽 포트)</translation> +<translation id="1294929383540927798">잠금 화면 알림 설정을 변경합니다.</translation> <translation id="1302880136325416935">블루투스 설정을 표시합니다. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">오른쪽</translation> <translation id="1351937230027495976">메뉴 접기</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">블루투스를 전환합니다. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">이 사용자 삭제</translation> <translation id="1621499497873603021">남은 배터리 사용 시간은 <ph name="TIME_LEFT" />입니다.</translation> +<translation id="1654477262762802994">음성 검색 시작</translation> <translation id="1658406695958299976">비밀번호를 여전히 확인할 수 없습니다. 참고: 최근에 비밀번호를 변경한 경우 로그아웃해야 새로운 비밀번호가 적용됩니다. 이전 비밀번호를 사용해 보세요.</translation> <translation id="1677472565718498478"><ph name="TIME" /> 남음</translation> <translation id="1698760176351776263">IPv6 주소: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">메뉴 펼치기</translation> <translation id="3087734570205094154">맨 아래</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" />(블루투스)</translation> +<translation id="3124698051292518391">항상 실행기 표시</translation> <translation id="3126069444801937830">업데이트하려면 다시 시작</translation> <translation id="3147142846278915599">런처(앱 동기화 중...)</translation> <translation id="315116470104423982">모바일 데이터</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">뒤로</translation> <translation id="3891340733213178823">로그아웃하려면 Ctrl+Shift+Q를 두 번 누릅니다.</translation> <translation id="3893630138897523026">ChromeVox(음성 피드백)</translation> +<translation id="3897533311200664389">텍스트 검색 시작</translation> <translation id="3899995891769452915">음성 입력</translation> <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" /> 후 세션 종료</translation> <translation id="3901991538546252627"><ph name="NAME" />에 연결 중</translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">관리자: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Adobe Flash Player 업데이트 가능</translation> <translation id="9056839673611986238">기기가 롤백됨</translation> +<translation id="9070640332319875144">어시스턴트 설정</translation> <translation id="9074739597929991885">블루투스</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">마이크가 사용 중입니다.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 43ef825..70f91091 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Silpnas signalas</translation> <translation id="1293264513303784526">USB-C įrenginys (prievadas kairėje)</translation> +<translation id="1294929383540927798">Pakeisti užrakinimo ekrano pranešimų nustatymus</translation> <translation id="1302880136325416935">Rodyti „Bluetooth“ nustatymus. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Dešinė</translation> <translation id="1351937230027495976">Sutraukti meniu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Perjungti „Bluetooth“. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Pašalinti šį naudotoją</translation> <translation id="1621499497873603021">Laikas, likęs iki akumuliatoriaus išsikrovimo: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Pradėti užklausą balsu</translation> <translation id="1658406695958299976">Deja, jūsų slaptažodžio patvirtinti vis tiek nepavyko. Pastaba: jei neseniai pakeitėte slaptažodį, naujas slaptažodis bus taikomas, kai atsijungsite. Čia naudokite senąjį slaptažodį.</translation> <translation id="1677472565718498478">Liko <ph name="TIME" /></translation> <translation id="1698760176351776263">„IPv6“ adresas: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Išskleisti meniu</translation> <translation id="3087734570205094154">Apačia</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> („Bluetooth“)</translation> +<translation id="3124698051292518391">Visada rodyti lentyną</translation> <translation id="3126069444801937830">Paleisti iš naujo, kad būtų atnaujinta</translation> <translation id="3147142846278915599">Paleidimo priemonė (sinchronizuojamos programos...)</translation> <translation id="315116470104423982">Duomenys mobiliesiems</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Grįžti</translation> <translation id="3891340733213178823">Jei norite atsijungti, du kartus paspauskite „Ctrl“ + „Shift“ + Q.</translation> <translation id="3893630138897523026">„ChromeVox“ (ekrano skaitymas balsu)</translation> +<translation id="3897533311200664389">Pradėti tekstinę užklausą</translation> <translation id="3899995891769452915">Įvestis balsu</translation> <translation id="3900355044994618856">Sesija baigsis po <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Jungiamasi prie „<ph name="NAME" />“</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Valdoma „<ph name="DOMAIN" />“</translation> <translation id="9029474291399787231">Pasiekiamas „Adobe Flash Player“ naujinys</translation> <translation id="9056839673611986238">Įrenginys bus atkurtas</translation> +<translation id="9070640332319875144">Padėjėjo nustatymai</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">„Wi-Fi“: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofonas naudojamas.</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 08340c7..3bae547 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Vājš signāls</translation> <translation id="1293264513303784526">USB-C ierīce (pieslēgvieta pa kreisi)</translation> +<translation id="1294929383540927798">Mainiet bloķēšanas ekrāna paziņojumu rādīšanas iestatījumus</translation> <translation id="1302880136325416935">Rādīt Bluetooth iestatījumus. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Pa labi</translation> <translation id="1351937230027495976">Sakļaut izvēlni</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Pārslēgt Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Noņemt šo lietotāju</translation> <translation id="1621499497873603021">Atlikušais akumulatora darbības laiks: <ph name="TIME_LEFT" />.</translation> +<translation id="1654477262762802994">Sākt balss vaicājumu</translation> <translation id="1658406695958299976">Diemžēl jūsu paroli joprojām nevarēja verificēt. Ņemiet vērā: ja nesen mainījāt paroli, jaunā parole tiks lietota pēc izrakstīšanās. Lūdzu, šeit izmantojiet iepriekšējo paroli.</translation> <translation id="1677472565718498478">Atlikušais laiks: <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 adrese: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Izvērst izvēlni</translation> <translation id="3087734570205094154">Apakšā</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Vienmēr rādīt plauktu</translation> <translation id="3126069444801937830">Restartēt, lai atjauninātu</translation> <translation id="3147142846278915599">Palaišanas programma (notiek lietotņu sinhronizēšana...)</translation> <translation id="315116470104423982">Mobilie dati</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Atpakaļ</translation> <translation id="3891340733213178823">Lai izrakstītos, divas reizes nospiediet taustiņu kombināciju Ctrl+Shift+Q.</translation> <translation id="3893630138897523026">ChromeVox (balss komentāri)</translation> +<translation id="3897533311200664389">Sākt teksta vaicājumu</translation> <translation id="3899995891769452915">Balss ievade</translation> <translation id="3900355044994618856">Atlikušais laiks līdz jūsu sesijas beigām: <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Notiek savienojuma izveide ar <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Pārvalda domēnu <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Ir pieejams Adobe Flash Player atjauninājums</translation> <translation id="9056839673611986238">Ierīcē tiks veikta atrite</translation> +<translation id="9070640332319875144">Asistenta iestatījumi</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi adrese: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Tiek izmantots mikrofons.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 3b0833da2..5d26c02 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">ദുർബലമായ സിഗ്നൽ</translation> <translation id="1293264513303784526">USB-C ഉപകരണം (ഇടത് പോർട്ട്)</translation> +<translation id="1294929383540927798">ലോക്ക് സ്ക്രീൻ അറിയിപ്പ് ക്രമീകരണം മാറ്റുക</translation> <translation id="1302880136325416935">Bluetooth ക്രമീകരണം കാണിക്കുക. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">ശരി</translation> <translation id="1351937230027495976">മെനു ചുരുക്കുക</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth മാറ്റുക. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation> <translation id="1621499497873603021">ബാറ്ററി ശൂന്യമാകുന്നതിന് ശേഷിക്കുന്ന സമയം, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">ഒരു ശബ്ദ ചോദ്യം ആരംഭിക്കുക</translation> <translation id="1658406695958299976">ക്ഷമിക്കണം, ഇപ്പോഴും നിങ്ങളുടെ പാസ്വേഡ് പരിശോധിച്ചുറപ്പിക്കാൻ കഴിഞ്ഞില്ല. ശ്രദ്ധിക്കുക: സമീപകാലത്ത് നിങ്ങൾ പാസ്വേഡ് മാറ്റിയിട്ടുണ്ടെങ്കിൽ, സൈൻ ഔട്ട് ചെയ്തുകഴിഞ്ഞാൽ പുതിയ പാസ്വേഡ് ബാധകമാകും, ഇവിടെ പഴയ പാസ്വേഡ് ഉപയോഗിക്കുക.</translation> <translation id="1677472565718498478"><ph name="TIME" /> ശേഷിക്കുന്നു</translation> <translation id="1698760176351776263">IPv6 വിലാസം: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">മെനു വികസിപ്പിക്കുക</translation> <translation id="3087734570205094154">താഴെ</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">എപ്പോഴും ഷെൽഫ് കാണിക്കുക</translation> <translation id="3126069444801937830">അപ്ഡേറ്റുചെയ്യുന്നതിന് പുനരാരംഭിക്കുക</translation> <translation id="3147142846278915599">ലോഞ്ചർ (അപ്ലിക്കേഷൻ സമന്വയിപ്പിക്കുന്നു...)</translation> <translation id="315116470104423982">മൊബൈല് ഡാറ്റ</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">പിന്നോട്ട്</translation> <translation id="3891340733213178823">സൈൻ ഔട്ട് ചെയ്യുന്നതിന് രണ്ടുതവണ Ctrl+Shift+Q അമർത്തുക.</translation> <translation id="3893630138897523026">ChromeVox (സ്പോക്കൺ ഫീഡ്ബാക്ക്)</translation> +<translation id="3897533311200664389">ഒരു ടെക്സ്റ്റ് ചോദ്യം ആരംഭിക്കുക</translation> <translation id="3899995891769452915">വോയ്സ് ഇൻപുട്ട്</translation> <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" />-ൽ നിങ്ങളുടെ സെഷൻ അവസാനിക്കുന്നു</translation> <translation id="3901991538546252627"><ph name="NAME" /> എന്നതിലേക്ക് കണക്റ്റുചെയ്യുന്നു</translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> എന്നത് കൈകാര്യം ചെയ്യുന്നു</translation> <translation id="9029474291399787231">Adobe Flash Player അപ്ഡേറ്റ് ലഭ്യമാണ്</translation> <translation id="9056839673611986238">ഉപകരണം പഴയ അവസ്ഥയിലേക്ക് പുനഃസ്ഥാപിക്കും</translation> +<translation id="9070640332319875144">അസിസ്റ്റന്റ് ക്രമീകരണം</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">മൈക്രോഫോൺ ഉപയോഗത്തിലാണ്.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 33e1f429..dd443c2 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">खराब सिग्नल</translation> <translation id="1293264513303784526">USB-C डिव्हाइस (डावे पोर्ट)</translation> +<translation id="1294929383540927798">लॉक स्क्रीन सूचना सेटिंग्ज बदला</translation> <translation id="1302880136325416935">ब्लूटूथ सेटिंग्ज दाखवा. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">उजवे</translation> <translation id="1351937230027495976">मेनू कोलॅप्स करा</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">ब्लूटूथ टॉगल करा. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">हा वापरकर्ता काढा</translation> <translation id="1621499497873603021">बॅटरी रिक्त होईपर्यंत शिल्लक वेळ, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">व्हॉइस क्वेरी सुरू करा</translation> <translation id="1658406695958299976">सॉरी, तुमच्या पासवर्डची पडताळणी अजूनही झालेली नाही. टीप: तुम्ही तुमचा पासवर्ड अलीकडेच बदलला असल्यास, तुम्ही साइन आउट केल्यानंतर तुमचा नवीन पासवर्ड लागू केला जाईल, कृपया येथे जुना पासवर्ड वापरा.</translation> <translation id="1677472565718498478"><ph name="TIME" /> शिल्लक</translation> <translation id="1698760176351776263">IPv6 पत्ता: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">मेनूचा विस्तार करा</translation> <translation id="3087734570205094154">तळाकडील</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">नेहमी शेल्फ दाखवा</translation> <translation id="3126069444801937830">अद्यतनासाठी पुनर्प्रारंभ करा</translation> <translation id="3147142846278915599">लाँचर (संकालन अॅप्स...)</translation> <translation id="315116470104423982">मोबाइल डेटा</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">मागील</translation> <translation id="3891340733213178823">साइन आउट करण्यासाठी Ctrl+Shift+Q दोनदा दाबा.</translation> <translation id="3893630138897523026">ChromeVox (बोललेला अभिप्राय)</translation> +<translation id="3897533311200664389">मजकूर क्वेरी सुरू करा</translation> <translation id="3899995891769452915">व्हॉइस इनपुट</translation> <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" /> मध्ये तुमचे सेशन समाप्त होईल</translation> <translation id="3901991538546252627"><ph name="NAME" /> वर कनेक्ट करीत आहे</translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> द्वारे व्यवस्थापित</translation> <translation id="9029474291399787231">Adobe Flash Player अपडेट उपलब्ध आहे</translation> <translation id="9056839673611986238">डिव्हाइस रोल बॅक केले जाईल</translation> +<translation id="9070640332319875144">असिस्टंट सेटिंग्ज</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">वाय-फाय: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">मायक्रोफोन वापरात आहे.</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index d479931..3d6b34b 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Zwak signaal</translation> <translation id="1293264513303784526">USB-C-apparaat (poort aan linkerkant)</translation> +<translation id="1294929383540927798">Instellingen voor meldingen voor het vergrendelingsscherm wijzigen</translation> <translation id="1302880136325416935">Bluetooth-instellingen weergeven. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Rechts</translation> <translation id="1351937230027495976">Menu samenvouwen</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth schakelen. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Deze gebruiker verwijderen</translation> <translation id="1621499497873603021">Resterende tijd totdat de batterij leeg is: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Een gesproken zoekopdracht starten</translation> <translation id="1658406695958299976">Je wachtwoord kan nog steeds niet worden geverifieerd. Opmerking: Als je je wachtwoord onlangs hebt gewijzigd, wordt je nieuwe wachtwoord doorgevoerd wanneer je uitlogt. Gebruik hier het oude wachtwoord.</translation> <translation id="1677472565718498478"><ph name="TIME" /> resterend</translation> <translation id="1698760176351776263">IPv6-adres: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Menu uitvouwen</translation> <translation id="3087734570205094154">Onderaan</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Plank altijd weergeven</translation> <translation id="3126069444801937830">Opnieuw starten om updates uit te voeren</translation> <translation id="3147142846278915599">Launcher (apps synchroniseren...)</translation> <translation id="315116470104423982">Mobiele data</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Vorige</translation> <translation id="3891340733213178823">Druk twee keer op Ctrl+Shift+Q om uit te loggen.</translation> <translation id="3893630138897523026">ChromeVox (gesproken feedback)</translation> +<translation id="3897533311200664389">Een zoekopdracht met tekst starten</translation> <translation id="3899995891769452915">Spraakinvoer</translation> <translation id="3900355044994618856">Je sessie loopt over <ph name="SESSION_TIME_REMAINING" /> af</translation> <translation id="3901991538546252627">Verbinding maken met <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Beheerd door <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Update van Adobe Flash Player beschikbaar</translation> <translation id="9056839673611986238">Apparaat wordt teruggezet naar oudere versie</translation> +<translation id="9070640332319875144">Instellingen voor Assistent</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wifi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Microfoon wordt gebruikt.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 02945d2..6cb3792 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Svakt signal</translation> <translation id="1293264513303784526">USB-C-enhet (porten på venstre side)</translation> +<translation id="1294929383540927798">Endre innstillingene for varsler på låseskjermen</translation> <translation id="1302880136325416935">Vis Bluetooth-innstillinger. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Høyre</translation> <translation id="1351937230027495976">Skjul menyen</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Slå av/på Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Fjern denne brukeren</translation> <translation id="1621499497873603021">Gjenværende tid til batteriet er tomt – <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Start et talesøk</translation> <translation id="1658406695958299976">Beklager, men passordet ditt kunne fremdeles ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, trer det nye passordet ditt i kraft så snart du logger av. Bruk det gamle passordet ditt her.</translation> <translation id="1677472565718498478"><ph name="TIME" /> igjen</translation> <translation id="1698760176351776263">IPv6-adresse: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Vis menyen</translation> <translation id="3087734570205094154">Bunn</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Vis alltid hyllen</translation> <translation id="3126069444801937830">Start på nytt for å oppdatere</translation> <translation id="3147142846278915599">Appoversikt (synkroniserer apper ...)</translation> <translation id="315116470104423982">Mobildata</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Tilbake</translation> <translation id="3891340733213178823">Trykk på Control+Shift+Q to ganger for å logge av.</translation> <translation id="3893630138897523026">ChromeVox (muntlig tilbakemelding)</translation> +<translation id="3897533311200664389">Start et tekstsøk</translation> <translation id="3899995891769452915">Taleinndata</translation> <translation id="3900355044994618856">Økten din avsluttes om <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Kobler til <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Drevet av <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">En oppdatering av Adobe Flash Player er tilgjengelig</translation> <translation id="9056839673611986238">Enheten blir tilbakestilt til forrige versjon</translation> +<translation id="9070640332319875144">Assistent-innstillinger</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofonen er i bruk.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 5a8f227..dff616e 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">słaby sygnał</translation> <translation id="1293264513303784526">Urządzenie USB-C (lewy port)</translation> +<translation id="1294929383540927798">Zmień ustawienia powiadomień na ekranie blokady</translation> <translation id="1302880136325416935">Pokaż ustawienia Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">W prawo</translation> <translation id="1351937230027495976">Zwiń menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Włącz lub wyłącz Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Usuń tego użytkownika</translation> <translation id="1621499497873603021">Czas pozostały do wyczerpania baterii: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Rozpocznij zapytanie głosowe</translation> <translation id="1658406695958299976">Nadal nie można zweryfikować Twojego hasła. Uwaga: jeśli ostatnio hasło było zmieniane, nowe hasło zostanie zastosowane, gdy się wylogujesz. Tu podaj stare hasło.</translation> <translation id="1677472565718498478">Pozostało <ph name="TIME" /></translation> <translation id="1698760176351776263">Adres IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Rozwiń menu</translation> <translation id="3087734570205094154">Na dół</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Zawsze pokazuj półkę</translation> <translation id="3126069444801937830">Uruchom ponownie i zaktualizuj</translation> <translation id="3147142846278915599">Menu z aplikacjami (synchronizuję aplikacje...)</translation> <translation id="315116470104423982">Komórkowa transmisja danych</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Wstecz</translation> <translation id="3891340733213178823">Naciśnij dwukrotnie Ctrl+Shift+Q, by się wylogować.</translation> <translation id="3893630138897523026">ChromeVox (potwierdzenia głosowe)</translation> +<translation id="3897533311200664389">Rozpocznij zapytanie tekstowe</translation> <translation id="3899995891769452915">Rozpoznawanie mowy</translation> <translation id="3900355044994618856">Sesja kończy się za <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Łączę z: <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Zarządzane przez <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Dostępna jest aktualizacja Adobe Flash Playera</translation> <translation id="9056839673611986238">Na urządzeniu zostanie przywrócona wcześniejsza wersja oprogramowania</translation> +<translation id="9070640332319875144">Ustawienia Asystenta</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon jest używany.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index a8ab090..c34d0689 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Sinal fraco</translation> <translation id="1293264513303784526">Dispositivo USB-C (porta da esquerda)</translation> +<translation id="1294929383540927798">Alterar as configurações de notificação da tela de bloqueio</translation> <translation id="1302880136325416935">Mostrar configurações de Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Para a direita</translation> <translation id="1351937230027495976">Recolher menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Alternar Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Remover este usuário</translation> <translation id="1621499497873603021">O tempo restante até que a bateria se esgote é de <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Iniciar uma consulta por voz</translation> <translation id="1658406695958299976">Ainda não foi possível confirmar sua senha. Observação: se você alterou sua senha recentemente, a nova senha será aplicada depois que você sair da conta. Use a senha antiga aqui.</translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> <translation id="1698760176351776263">Endereço IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Expandir menu</translation> <translation id="3087734570205094154">Parte inferior</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Sempre mostrar estante</translation> <translation id="3126069444801937830">Reiniciar para atualizar</translation> <translation id="3147142846278915599">Tela de início (sincronizando aplicativos...)</translation> <translation id="315116470104423982">Dados do celular</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Voltar</translation> <translation id="3891340733213178823">Pressione Ctrl+Shift+Q duas vezes para sair.</translation> <translation id="3893630138897523026">ChromeVox (feedback falado)</translation> +<translation id="3897533311200664389">Iniciar uma consulta de texto</translation> <translation id="3899995891769452915">Entrada de texto por voz</translation> <translation id="3900355044994618856">Sua sessão terminará em <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Conectando-se a <ph name="NAME" /></translation> @@ -462,6 +466,7 @@ <translation id="8995603266996330174">Gerenciado por <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Atualização do Adobe Flash Player disponível</translation> <translation id="9056839673611986238">O dispositivo será revertido</translation> +<translation id="9070640332319875144">Configurações do Google Assistente</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">O microfone está sendo usado.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 47277cc..e7dfd9c 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Sinal fraco</translation> <translation id="1293264513303784526">Dispositivo USB-C (porta esquerda)</translation> +<translation id="1294929383540927798">Alterar as definições de bloqueio do ecrã de bloqueio</translation> <translation id="1302880136325416935">Mostrar definições de Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Direita</translation> <translation id="1351937230027495976">Reduzir menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Ativar/desativar Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Remover este utilizador</translation> <translation id="1621499497873603021">Tempo restante até a bateria terminar, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Iniciar uma consulta de voz</translation> <translation id="1658406695958299976">Lamentamos, mas ainda não foi possível validar a sua palavra-passe. Nota: se alterou a palavra-passe recentemente, a nova palavra-passe será aplicada quando terminar sessão. Utilize a palavra-passe antiga aqui.</translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> <translation id="1698760176351776263">Endereço IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Expandir menu</translation> <translation id="3087734570205094154">Parte inferior</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Mostrar sempre a prateleira</translation> <translation id="3126069444801937830">Reiniciar para atualizar</translation> <translation id="3147142846278915599">Launcher (a sincronizar aplicações...)</translation> <translation id="315116470104423982">Dados móveis</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Anterior</translation> <translation id="3891340733213178823">Prima Ctrl+Shift+Q duas vezes para terminar sessão.</translation> <translation id="3893630138897523026">ChromeVox (respostas faladas)</translation> +<translation id="3897533311200664389">Iniciar uma consulta de texto</translation> <translation id="3899995891769452915">Entrada de texto por voz</translation> <translation id="3900355044994618856">A sessão termina dentro de <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">A ligar a <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Gerido por <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Atualização do Adobe Flash Player disponível</translation> <translation id="9056839673611986238">O dispositivo voltará à versão anterior</translation> +<translation id="9070640332319875144">Definições do Assistente</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">O microfone está a ser utilizado.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 343ebfe..98c7df6 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Semnal slab</translation> <translation id="1293264513303784526">Dispozitiv USB-C (portul din stânga)</translation> +<translation id="1294929383540927798">Modifică setările de notificare de pe ecranul de blocare</translation> <translation id="1302880136325416935">Afișează setările Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Dreapta</translation> <translation id="1351937230027495976">Restrânge meniul</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Comută Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Eliminați acest utilizator</translation> <translation id="1621499497873603021">Timp rămas până la descărcarea bateriei: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Începe o interogare vocală</translation> <translation id="1658406695958299976">Ne pare rău, parola tot nu a putut fi confirmată. Notă: dacă ți-ai schimbat recent parola, aceasta se va aplica după ce te deconectezi. Te rugăm să folosești aici parola veche.</translation> <translation id="1677472565718498478">Timp rămas: <ph name="TIME" /></translation> <translation id="1698760176351776263">Adresă IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Extinde meniul</translation> <translation id="3087734570205094154">Jos</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Afișează întotdeauna raftul</translation> <translation id="3126069444801937830">Reporniți pentru a actualiza</translation> <translation id="3147142846278915599">Lansator (se sincronizează aplicațiile...)</translation> <translation id="315116470104423982">Date mobile</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Înapoi</translation> <translation id="3891340733213178823">Apăsați de două ori Ctrl+Shift+Q pentru a vă deconecta.</translation> <translation id="3893630138897523026">ChromeVox (feedback rostit)</translation> +<translation id="3897533311200664389">Începe o interogare text</translation> <translation id="3899995891769452915">Intrare vocală</translation> <translation id="3900355044994618856">Sesiunea se va încheia în <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Se conectează la <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Gestionat de <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Este disponibilă o actualizare Adobe Flash Player</translation> <translation id="9056839673611986238">SO de pe dispozitiv va fi adus la o versiune anterioară</translation> +<translation id="9070640332319875144">Setări Asistent</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Microfonul este în uz.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 1242179..21a8a96 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">слабый сигнал</translation> <translation id="1293264513303784526">Устройство USB-C (порт слева)</translation> +<translation id="1294929383540927798">Изменить настройки уведомлений на заблокированном экране</translation> <translation id="1302880136325416935">Показать настройки Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="1346748346194534595">Справа</translation> <translation id="1351937230027495976">Свернуть меню</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Изменить настройки Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="1608626060424371292">Удалить профиль</translation> <translation id="1621499497873603021">Оставшееся время работы от батареи: <ph name="TIME_LEFT" />.</translation> +<translation id="1654477262762802994">Произнесите запрос</translation> <translation id="1658406695958299976">Неверный пароль. Обратите внимание! Если вы недавно изменили пароль, но не выходили из системы, значит, новый пароль ещё не вступил в силу и необходимо указать старый.</translation> <translation id="1677472565718498478">Ещё <ph name="TIME" /></translation> <translation id="1698760176351776263">Адрес IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Развернуть меню</translation> <translation id="3087734570205094154">Снизу</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Всегда показывать Временное хранилище</translation> <translation id="3126069444801937830">Перезагрузите, чтобы обновить</translation> <translation id="3147142846278915599">Панель запуска (синхронизация приложений...)</translation> <translation id="315116470104423982">Мобильное подключение</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Назад</translation> <translation id="3891340733213178823">Чтобы выйти, дважды нажмите Ctrl+Shift+Q.</translation> <translation id="3893630138897523026">ChromeVox (голосовое сопровождение)</translation> +<translation id="3897533311200664389">Введите запрос</translation> <translation id="3899995891769452915">Голосовой ввод</translation> <translation id="3900355044994618856">Сеанс закончится через <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Подключение к <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">В домене <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Доступно обновление для Adobe Flash Player</translation> <translation id="9056839673611986238">Система на устройстве будет возвращена к предыдущей версии</translation> +<translation id="9070640332319875144">Настройки Ассистента</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Микрофон используется</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 8d32f9c..ee58072 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Slabý signál</translation> <translation id="1293264513303784526">Zariadenie USB-C (port vľavo)</translation> +<translation id="1294929383540927798">Zmeňte nastavenia upozornení na uzamknutej obrazovke</translation> <translation id="1302880136325416935">Zobraziť nastavenia Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Doprava</translation> <translation id="1351937230027495976">Zbaliť ponuku</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Prepnúť Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Odstrániť tohto používateľa</translation> <translation id="1621499497873603021">Čas zostávajúci do vybitia batérie: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Spustiť hlasový dopyt</translation> <translation id="1658406695958299976">Je nám to ľúto, ale vaše heslo sa stále nedarí overiť. Poznámka: Ak ste ho nedávno zmenili, nové heslo sa použije až po odhlásení. Tu použite staré heslo.</translation> <translation id="1677472565718498478">Zostávajúci čas: <ph name="TIME" /></translation> <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Rozbaliť ponuku</translation> <translation id="3087734570205094154">Spodok</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Vždy zobrazovať poličku</translation> <translation id="3126069444801937830">Reštartovaním vykonáte aktualizáciu</translation> <translation id="3147142846278915599">Spúšťač (synchronizujú sa aplikácie...)</translation> <translation id="315116470104423982">Mobilné dátové prenosy</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Naspäť</translation> <translation id="3891340733213178823">Ak sa chcete odhlásiť, stlačte dvakrát kombináciu klávesov Ctrl+Shift+Q.</translation> <translation id="3893630138897523026">ChromeVox (hlasová spätná väzba)</translation> +<translation id="3897533311200664389">Spustiť textový dopyt</translation> <translation id="3899995891769452915">Hlasový vstup</translation> <translation id="3900355044994618856">Relácia sa skončí o <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Pripája sa k sieti <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Spravované doménou <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">K dispozícii je aktualizácia prehrávača Adobe Flash Player</translation> <translation id="9056839673611986238">Zariadenie sa obnoví</translation> +<translation id="9070640332319875144">Nastavenia Asistenta</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi‑Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofón sa používa.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 1a4bb54..ecc23a3 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Слаб сигнал</translation> <translation id="1293264513303784526">Уређај са USB прикључком типа C (леви порт)</translation> +<translation id="1294929383540927798">Промените подешавања обавештења на закључаном екрану</translation> <translation id="1302880136325416935">Прегледајте Bluetooth подешавања. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Удесно</translation> <translation id="1351937230027495976">Скупи мени</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Укључите/искључите Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Уклони овог корисника</translation> <translation id="1621499497873603021">Време које је преостало док се батерија не испразни, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Започните гласовну претрагу</translation> <translation id="1658406695958299976">Жао нам је, верификација лозинке још увек није успела. Напомена: ако сте недавно променили лозинку, нова лозинка ће се применити када се одјавите. Овде користите стару лозинку.</translation> <translation id="1677472565718498478"><ph name="TIME" /> је преостало</translation> <translation id="1698760176351776263">IPv6 адреса: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Прошири мени</translation> <translation id="3087734570205094154">Дно</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Увек приказуј полицу</translation> <translation id="3126069444801937830">Покрените поново да бисте ажурирали</translation> <translation id="3147142846278915599">Покретач (апликације се синхронизују...)</translation> <translation id="315116470104423982">Мобилни подаци</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Назад</translation> <translation id="3891340733213178823">Двапут притисните Ctrl+Shift+Q да бисте се одјавили.</translation> <translation id="3893630138897523026">ChromeVox (говорне повратне информације)</translation> +<translation id="3897533311200664389">Унесите упит за претрагу</translation> <translation id="3899995891769452915">Гласовни унос</translation> <translation id="3900355044994618856">Сесија се завршава за <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Повезивање са мрежом <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Управља <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Доступно је ажурирање за Adobe Flash Player</translation> <translation id="9056839673611986238">Уређај ће бити враћен на ранију верзију</translation> +<translation id="9070640332319875144">Подешавања Помоћника</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Микрофон се користи.</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index f76fa6813..b2283f3 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">svag signal</translation> <translation id="1293264513303784526">USB-C-enhet (vänster port)</translation> +<translation id="1294929383540927798">Ändra aviseringsinställningarna för låsskärmen</translation> <translation id="1302880136325416935">Visa Bluetooth-inställningar. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Höger</translation> <translation id="1351937230027495976">Komprimera menyn</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Aktivera och inaktivera Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Ta bort den här användaren</translation> <translation id="1621499497873603021">Tid som återstår tills batteriet är tomt: <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Säg en sökfråga</translation> <translation id="1658406695958299976">Det gick inte att verifiera lösenordet. Obs! Om du nyligen har bytt lösenord börjar det nya lösenordet att gälla först när du loggar ut. Använd det gamla lösenordet här.</translation> <translation id="1677472565718498478"><ph name="TIME" /> kvar</translation> <translation id="1698760176351776263">IPv6-adress: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Utöka menyn</translation> <translation id="3087734570205094154">Nederst</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Visa alltid hyllan</translation> <translation id="3126069444801937830">Starta om för att uppdatera</translation> <translation id="3147142846278915599">Översikt (appar synkroniseras …)</translation> <translation id="315116470104423982">Mobildata</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Bakåt</translation> <translation id="3891340733213178823">Tryck på Ctrl+Skift+Q två gånger om du vill logga ut.</translation> <translation id="3893630138897523026">ChromeVox (talad feedback)</translation> +<translation id="3897533311200664389">Skriv en sökfråga</translation> <translation id="3899995891769452915">Röstinmatning</translation> <translation id="3900355044994618856">Sessionen avslutas om <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Ansluter till <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Hanteras av <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">En uppdatering av Adobe Flash Player är tillgänglig</translation> <translation id="9056839673611986238">Enheten återställs</translation> +<translation id="9070640332319875144">Inställningar för Assistent</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofonen används.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 31f807bb..db35977 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Mtandao si thabiti</translation> <translation id="1293264513303784526">Kifaa cha USB-C (mlango wa kushoto)</translation> +<translation id="1294929383540927798">Badilisha mipangilio ya arifa za kufunga skrini</translation> <translation id="1302880136325416935">Onyesha mipangilio ya Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Kulia</translation> <translation id="1351937230027495976">Kunja menyu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Washa au uzime Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Ondoa mtumiaji huyu</translation> <translation id="1621499497873603021">Muda unaosalia mpaka betri inapoisha, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Anza kutamka hoja ya utafutaji</translation> <translation id="1658406695958299976">Samahani, tumeshindwa kuthibitisha nenosiri lako. Kumbuka: ikiwa ulibadilisha nenosiri lako hivi karibuni, nenosiri lako jipya litaanza kutumika pindi utakapoondoka kwenye akaunti, tafadhali tumia nenosiri la awali hapa.</translation> <translation id="1677472565718498478">Zimesalia <ph name="TIME" /></translation> <translation id="1698760176351776263">Anwani ya IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Panua menyu</translation> <translation id="3087734570205094154">Chini</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Onyesha Rafu Kila Wakati</translation> <translation id="3126069444801937830">Anzisha upya ili kusasisha</translation> <translation id="3147142846278915599">Kifungua programu (inasawazisha programu...)</translation> <translation id="315116470104423982">Data ya mtandao wa simu</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Nyuma</translation> <translation id="3891340733213178823">Bonyeza Ctrl+Shift+Q mara mbili ili kuondoka katika akaunti.</translation> <translation id="3893630138897523026">ChromeVox (maoni yaliyotamkwa)</translation> +<translation id="3897533311200664389">Anza kuandika hoja ya utafutaji</translation> <translation id="3899995891769452915">Kuweka data kwa kutamka</translation> <translation id="3900355044994618856">Kipindi chako kitakwisha baada ya <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Inaunganisha kwenye <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Inadhibitiwa na <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Sasisho la Adobe Flash Player linapatikana</translation> <translation id="9056839673611986238">Mipangilio ya awali itarejeshwa kwenye kifaa</translation> +<translation id="9070640332319875144">Mipangilio ya Mratibu</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Maikrofoni inatumika</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 1a74bc3f..ed5fb50 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">வலுவற்ற சிக்னல்</translation> <translation id="1293264513303784526">USB-C சாதனம் (இடது போர்ட்)</translation> +<translation id="1294929383540927798">பூட்டுத் திரை அறிவிப்பு அமைப்புகளை மாற்றும்</translation> <translation id="1302880136325416935">புளூடூத் அமைப்புகளைக் காண்பிக்கும். <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">வலது</translation> <translation id="1351937230027495976">மெனுவைச் சுருக்கு</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">புளூடூத்தை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">இவரை அகற்று</translation> <translation id="1621499497873603021">இன்னும் <ph name="TIME_LEFT" /> இல் பேட்டரி காலியாகிவிடும்</translation> +<translation id="1654477262762802994">குரல் வினவலைத் தொடங்கு</translation> <translation id="1658406695958299976">மன்னிக்கவும், உங்கள் கடவுச்சொல் இன்னும் சரிபார்க்கப்படவில்லை. குறிப்பு: உங்கள் கடவுச்சொல்லைச் சமீபத்தில் மாற்றியிருந்தால், நீங்கள் வெளியேறியவுடன் புதிய கடவுச்சொல் பயன்படுத்தப்படும், இங்கு பழைய கடவுச்சொல்லைப் பயன்படுத்தவும்.</translation> <translation id="1677472565718498478"><ph name="TIME" /> மணி நேரம்</translation> <translation id="1698760176351776263">IPv6 முகவரி: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">மெனுவை விரி</translation> <translation id="3087734570205094154">கீழே</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (புளூடூத்)</translation> +<translation id="3124698051292518391">ஷெல்ஃபை எப்போதும் காட்டு</translation> <translation id="3126069444801937830">புதுப்பிக்க மீண்டும் தொடங்குக</translation> <translation id="3147142846278915599">துவக்கி (பயன்பாடுகளை ஒத்திசைக்கிறது...)</translation> <translation id="315116470104423982">மொபைல் டேட்டா</translation> @@ -152,7 +155,7 @@ <translation id="3400357268283240774">கூடுதல் அமைப்புகள்</translation> <translation id="3413817803639110246">பார்ப்பதற்கு எதுவுமில்லை</translation> <translation id="3445925074670675829">USB-C சாதனம்</translation> -<translation id="3454224730401036106">உங்கள் இணைப்பானது, மிகவும் பாதுகாப்பான நெட்வொர்க்குக்கு மாற்றப்பட்டது</translation> +<translation id="3454224730401036106">உங்கள் இணைப்பு மிகவும் பாதுகாப்பான நெட்வொர்க்குக்கு மாற்றப்பட்டது</translation> <translation id="3465566417615315331">உங்கள் படத்தைக் கிளிக் செய்யவும்</translation> <translation id="3477079411857374384">கன்ட்ரோல்-ஷிஃப்ட்-ஸ்பேஸ்</translation> <translation id="3510164367642747937">மவுஸ் கர்சரைத் தனிப்படுத்து</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">முந்தைய பக்கம்</translation> <translation id="3891340733213178823">வெளியேற Ctrl+Shift+Q ஐ இருமுறை அழுத்தவும்.</translation> <translation id="3893630138897523026">ChromeVox (பேச்சுவடிவ கருத்து)</translation> +<translation id="3897533311200664389">உரை வினவலைத் தொடங்கு</translation> <translation id="3899995891769452915">குரல் உள்ளீடு</translation> <translation id="3900355044994618856">உங்கள் அமர்வு <ph name="SESSION_TIME_REMAINING" /> இல் முடியும்</translation> <translation id="3901991538546252627"><ph name="NAME" /> க்கு இணைக்கிறது</translation> @@ -248,7 +252,7 @@ <translation id="5496819745535887422">உங்கள் நிர்வாகி உங்கள் சாதனத்தை மீட்டமைக்கிறார். சாதனம் மீண்டும் தொடங்கும்போது அனைத்துத் தரவும் நீக்கப்படும்.</translation> <translation id="553675580533261935">அமர்விலிருந்து வெளியேறுதல்</translation> <translation id="5537725057119320332">அனுப்பு</translation> -<translation id="5548285847212963613">இந்த நெட்வொர்க்குடன் இணைய, "<ph name="EXTENSION_NAME" />" நீட்டிப்பு உதவும்.</translation> +<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" என்ற நீட்டிப்பு இந்த நெட்வொர்க்குடன் இணைய உதவும்.</translation> <translation id="554893713779400387">சொல்வதை எழுதுவதை நிலைமாற்று</translation> <translation id="5571066253365925590">புளூடூத் இயக்கப்பட்டது</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> ஆல் நிர்வகிக்கப்படுகிறது</translation> <translation id="9029474291399787231">Adobe Flash Player புதுப்பிப்பு உள்ளது</translation> <translation id="9056839673611986238">சாதனம் மீட்டமைக்கப்படும்</translation> +<translation id="9070640332319875144">அசிஸ்டண்ட் அமைப்புகள்</translation> <translation id="9074739597929991885">புளூடூத்</translation> <translation id="9079731690316798640">வைஃபை: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">மைக்ரோஃபோன் பயன்பாட்டில் உள்ளது.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index ca35f332..7d21adcd 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">సిగ్నల్ బలహీనంగా ఉంది</translation> <translation id="1293264513303784526">USB-C పరికరం (ఎడమ పోర్ట్)</translation> +<translation id="1294929383540927798">లాక్-స్క్రీన్ నోటిఫికేషన్ సెట్టింగ్లను మార్చండి</translation> <translation id="1302880136325416935">బ్లూటూత్ సెట్టింగ్లను చూపుతుంది. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">కుడి</translation> <translation id="1351937230027495976">మెనూను కుదించు</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">బ్లూటూత్ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">ఈ వినియోగదారుని తీసివేయండి</translation> <translation id="1621499497873603021">బ్యాటరీ ఖాళీ కావడానికి మిగిలి ఉన్న సమయం, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">వాయిస్ ప్రశ్నను ప్రారంభించు</translation> <translation id="1658406695958299976">క్షమించండి, మీ పాస్వర్డ్ ఇప్పటికీ ధృవీకరించబడలేదు. గమనిక: మీరు మీ పాస్వర్డ్ను ఇటీవల మార్చి ఉంటే, మీరు సైన్ అవుట్ చేసిన తర్వాత మీ కొత్త పాస్వర్డ్ వర్తించబడుతుంది, దయచేసి పాత పాస్వర్డ్ను ఇక్కడ ఉపయోగించండి.</translation> <translation id="1677472565718498478"><ph name="TIME" /> మిగిలి ఉంది</translation> <translation id="1698760176351776263">IPv6 చిరునామా: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">మెనూని విస్తరించు</translation> <translation id="3087734570205094154">దిగువ</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (బ్లూటూత్)</translation> +<translation id="3124698051292518391">ఎల్లప్పుడూ అరను చూపు</translation> <translation id="3126069444801937830">నవీకరించడానికి పునఃప్రారంభించండి</translation> <translation id="3147142846278915599">లాంచర్ (అనువర్తనాలను సమకాలీకరిస్తోంది...)</translation> <translation id="315116470104423982">మొబైల్ డేటా</translation> @@ -178,6 +181,7 @@ <translation id="385051799172605136">వెనుకకు</translation> <translation id="3891340733213178823">సైన్ అవుట్ చేయడానికి Ctrl+Shift+Qని రెండుసార్లు నొక్కండి.</translation> <translation id="3893630138897523026">ChromeVox (చదవబడే అభిప్రాయం)</translation> +<translation id="3897533311200664389">వచన ప్రశ్నను ప్రారంభించు</translation> <translation id="3899995891769452915">వాయిస్ ఇన్పుట్</translation> <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" /> తర్వాత మీ సెషన్ ముగుస్తుంది</translation> <translation id="3901991538546252627"><ph name="NAME" />కి కనెక్ట్ చేస్తోంది</translation> @@ -339,7 +343,7 @@ <translation id="6910714959251846841">ఈ అప్డేట్ కోసం మీ పరికరాన్ని పవర్వాష్ చేయాలి. తాజా <ph name="SYSTEM_APP_NAME" /> అప్డేట్ గురించి మరింత తెలుసుకోండి.</translation> <translation id="6911468394164995108">మరొక దానిలో చేరండి...</translation> <translation id="6972754398087986839">ప్రారంభించండి</translation> -<translation id="6981982820502123353">ప్రాప్యత</translation> +<translation id="6981982820502123353">యాక్సెస్ సామర్థ్యం</translation> <translation id="698231206551913481">ఈ వినియోగదారును తీసివేసిన తర్వాత ఈ వినియోగదారుతో అనుబంధించిన అన్ని ఫైల్లు మరియు స్థానిక డేటా శాశ్వతంగా తొలగించబడతాయి.</translation> <translation id="7015766095477679451">తిరిగి <ph name="COME_BACK_TIME" />కి రండి.</translation> <translation id="7029814467594812963">సెషన్ని నిష్క్రమించు</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174"><ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతోంది</translation> <translation id="9029474291399787231">Adobe Flash Player అప్డేట్ అందుబాటులో ఉంది</translation> <translation id="9056839673611986238">పరికరం ఉపసంహరించబడుతుంది</translation> +<translation id="9070640332319875144">అసిస్టెంట్ సెట్టింగ్లు</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">మైక్రోఫోన్ ఉపయోగంలో ఉంది.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 9a87c6d5..e428843 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">สัญญาณไม่ดี</translation> <translation id="1293264513303784526">อุปกรณ์ USB-C (พอร์ตด้านซ้าย)</translation> +<translation id="1294929383540927798">เปลี่ยนการตั้งค่าการแจ้งเตือนในหน้าจอล็อก</translation> <translation id="1302880136325416935">แสดงการตั้งค่าบลูทูธ <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">ขวา</translation> <translation id="1351937230027495976">ยุบเมนู</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">เปิด/ปิดบลูทูธ <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">ลบผู้ใช้รายนี้</translation> <translation id="1621499497873603021">เวลาที่เหลือกว่าแบตเตอรี่จะหมด, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">เริ่มฟังคำค้นหาด้วยเสียง</translation> <translation id="1658406695958299976">ขออภัย ยังคงยืนยันรหัสผ่านไม่ได้ หมายเหตุ: หากคุณเปลี่ยนแปลงรหัสผ่านไปเมื่อเร็วๆ นี้ รหัสผ่านใหม่จะมีผลเมื่อคุณออกจากระบบ โปรดใช้รหัสผ่านเดิมที่นี่</translation> <translation id="1677472565718498478">ใช้ได้อีก <ph name="TIME" /></translation> <translation id="1698760176351776263">ที่อยู่ IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">ขยายเมนู</translation> <translation id="3087734570205094154">ด้านล่าง</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (บลูทูธ)</translation> +<translation id="3124698051292518391">แสดงชั้นวางเสมอ</translation> <translation id="3126069444801937830">รีสตาร์ทเพื่ออัปเดต</translation> <translation id="3147142846278915599">Launcher (กำลังซิงค์แอป...)</translation> <translation id="315116470104423982">เน็ตมือถือ</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">กลับ</translation> <translation id="3891340733213178823">กด Ctrl+Shift+Q 2 ครั้งเพื่อออกจากระบบ</translation> <translation id="3893630138897523026">ChromeVox (การตอบสนองด้วยเสียง)</translation> +<translation id="3897533311200664389">เริ่มพิมพ์คำค้นหา</translation> <translation id="3899995891769452915">ป้อนข้อมูลด้วยเสียง</translation> <translation id="3900355044994618856">เซสชันจะสิ้นสุดใน <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">กำลังเชื่อมต่อกับ <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">จัดการโดย <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">มีอัปเดต Adobe Flash Player พร้อมใช้งาน</translation> <translation id="9056839673611986238">อุปกรณ์จะได้รับการคืนค่าสถานะ</translation> +<translation id="9070640332319875144">การตั้งค่า Assistant</translation> <translation id="9074739597929991885">บลูทูธ</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">ใช้ไมโครโฟนอยู่</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 381db68..a020c4f 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Zayıf sinyal</translation> <translation id="1293264513303784526">USB-C cihaz (sol bağlantı noktası)</translation> +<translation id="1294929383540927798">Kilit ekranı bildirim ayarlarını değiştirin</translation> <translation id="1302880136325416935">Bluetooth ayarlarını göster. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Sağa</translation> <translation id="1351937230027495976">Menüyü daralt</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bluetooth'u aç/kapat. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Bu kullanıcıyı kaldır</translation> <translation id="1621499497873603021">Pilin boşalması için kalan süre, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Sesli sorgu başlat</translation> <translation id="1658406695958299976">Maalesef şifreniz hâlâ doğrulanamadı. Not: Şifrenizi yakın zamanda değiştirdiyseniz, yeni şifreniz oturumu kapatmanızdan sonra geçerli olacaktır. Lütfen burada eski şifrenizi kullanın.</translation> <translation id="1677472565718498478">Kalan süre: <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 adresi: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Menüyü genişlet</translation> <translation id="3087734570205094154">Alt</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Her Zaman Rafı Göster</translation> <translation id="3126069444801937830">Güncellemek için yeniden başlat</translation> <translation id="3147142846278915599">Launcher (uygulamalar senkronize ediliyor...)</translation> <translation id="315116470104423982">Mobil veriler</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Geri</translation> <translation id="3891340733213178823">Oturumu kapatmak için Ctrl+ÜstKrktr+Q tuşlarına iki defa basın.</translation> <translation id="3893630138897523026">ChromeVox (sesli geri bildirim)</translation> +<translation id="3897533311200664389">Metin sorgusu başlat</translation> <translation id="3899995891769452915">Ses girişi</translation> <translation id="3900355044994618856">Oturumunuz <ph name="SESSION_TIME_REMAINING" /> içinde sona erecek</translation> <translation id="3901991538546252627"><ph name="NAME" /> ağına bağlanılıyor</translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Yöneten: <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Adobe Flash Player güncellemesi mevcut</translation> <translation id="9056839673611986238">Cihaz ilk haline döndürülecek</translation> +<translation id="9070640332319875144">Asistan Ayarları</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Kablosuz: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon kullanımda.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 99250a5..69c13cc 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">слабкий сигнал</translation> <translation id="1293264513303784526">Пристрій із портом USB типу C (ліворуч)</translation> +<translation id="1294929383540927798">Змінити налаштування сповіщень на заблокованому екрані</translation> <translation id="1302880136325416935">Показати налаштування Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Праворуч</translation> <translation id="1351937230027495976">Згорнути меню</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Увімкнути/вимкнути Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Вилучити цього користувача</translation> <translation id="1621499497873603021">До розрядження акумулятора залишилося <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Почати вводити голосовий запит</translation> <translation id="1658406695958299976">На жаль, поки не вдалося підтвердити ваш пароль. Зверніть увагу: якщо ви нещодавно змінили пароль, новий пароль буде застосовано, щойно ви вийдете з облікового запису. Скористайтеся старим паролем тут.</translation> <translation id="1677472565718498478">Залишилося <ph name="TIME" /></translation> <translation id="1698760176351776263">Адреса IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Розгорнути меню</translation> <translation id="3087734570205094154">Низ</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Завжди показувати полицю</translation> <translation id="3126069444801937830">Перезапустіть, щоб оновити</translation> <translation id="3147142846278915599">Панель запуску (синхронізація додатків…)</translation> <translation id="315116470104423982">Мобільне передавання даних</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Назад</translation> <translation id="3891340733213178823">Щоб вийти, двічі натисніть Ctrl+Shift+Q.</translation> <translation id="3893630138897523026">ChromeVox (голосові підказки)</translation> +<translation id="3897533311200664389">Почати вводити текстовий запит</translation> <translation id="3899995891769452915">Голосовий ввід</translation> <translation id="3900355044994618856">Сеанс закінчиться через <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Під’єднання до <ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">Керується доменом <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Доступне оновлення Adobe Flash Player</translation> <translation id="9056839673611986238">Пристрій буде відновлено до попереднього стану</translation> +<translation id="9070640332319875144">Налаштування Асистента</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Мікрофон використовується.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 4e0624d..4437ba74 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">Tín hiệu yếu</translation> <translation id="1293264513303784526">Thiết bị USB-C (cổng bên trái)</translation> +<translation id="1294929383540927798">Thay đổi mục cài đặt thông báo trên màn hình khóa</translation> <translation id="1302880136325416935">Hiển thị các tùy chọn cài đặt Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">Phải</translation> <translation id="1351937230027495976">Thu gọn menu</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">Bật/tắt Bluetooth. <ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">Xóa người dùng này</translation> <translation id="1621499497873603021">Thời gian còn lại cho đến khi pin hết, <ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">Bắt đầu truy vấn bằng giọng nói</translation> <translation id="1658406695958299976">Rất tiếc, chúng tôi vẫn không thể xác minh được mật khẩu của bạn. Lưu ý: nếu gần đây bạn đã đổi mật khẩu thì mật khẩu mới của bạn sẽ được áp dụng sau khi bạn đăng xuất. Vui lòng sử dụng mật khẩu cũ của bạn tại đây.</translation> <translation id="1677472565718498478">Còn <ph name="TIME" /></translation> <translation id="1698760176351776263">Địa chỉ IPv6: <ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">Mở rộng menu</translation> <translation id="3087734570205094154">Bên dưới</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation> +<translation id="3124698051292518391">Luôn hiển thị giá</translation> <translation id="3126069444801937830">Khởi động lại để cập nhật</translation> <translation id="3147142846278915599">Trình khởi chạy (đang đồng bộ hóa ứng dụng...)</translation> <translation id="315116470104423982">Dữ liệu di động</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">Quay lại</translation> <translation id="3891340733213178823">Nhấn Ctrl+Shift+Q hai lần để đăng xuất.</translation> <translation id="3893630138897523026">ChromeVox (phản hồi bằng giọng nói)</translation> +<translation id="3897533311200664389">Bắt đầu truy vấn bằng văn bản</translation> <translation id="3899995891769452915">Nhập bằng giọng nói</translation> <translation id="3900355044994618856">Phiên hoạt động của bạn sẽ kết thúc sau <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Đang kết nối với <ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">Được quản lý bởi <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Đã có bản cập nhật Adobe Flash Player</translation> <translation id="9056839673611986238">Thiết bị sẽ được hạ cấp hệ điều hành</translation> +<translation id="9070640332319875144">Cài đặt Trợ lý</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Micrô đang được sử dụng.</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index f229149..0a9103e 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">信号较弱</translation> <translation id="1293264513303784526">USB-C 设备(左侧端口)</translation> +<translation id="1294929383540927798">更改锁定屏幕通知设置</translation> <translation id="1302880136325416935">显示蓝牙设置。<ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">向右</translation> <translation id="1351937230027495976">收起菜单</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">切换蓝牙设置。<ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">移除此用户</translation> <translation id="1621499497873603021">电池电量将在 <ph name="TIME_LEFT" />后耗尽</translation> +<translation id="1654477262762802994">启动语音查询</translation> <translation id="1658406695958299976">抱歉,系统仍然无法验证您的密码。注意:如果您最近更改了密码,新密码将在您退出后生效。目前请在此处输入旧密码。</translation> <translation id="1677472565718498478">电量尚余 <ph name="TIME" /></translation> <translation id="1698760176351776263">IPv6 地址:<ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">展开菜单</translation> <translation id="3087734570205094154">底部</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" />(蓝牙)</translation> +<translation id="3124698051292518391">一律显示任务栏</translation> <translation id="3126069444801937830">重新启动以进行更新</translation> <translation id="3147142846278915599">启动器(正在同步应用…)</translation> <translation id="315116470104423982">移动数据</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">后退</translation> <translation id="3891340733213178823">连按两次Ctrl+Shift+Q即可退出。</translation> <translation id="3893630138897523026">ChromeVox(语音反馈)</translation> +<translation id="3897533311200664389">启动文字查询</translation> <translation id="3899995891769452915">语音输入</translation> <translation id="3900355044994618856">您的会话将在 <ph name="SESSION_TIME_REMAINING" />后结束</translation> <translation id="3901991538546252627">正在连接:<ph name="NAME" /></translation> @@ -461,6 +465,7 @@ <translation id="8995603266996330174">由 <ph name="DOMAIN" /> 管理</translation> <translation id="9029474291399787231">有可用的 Adobe Flash Player 更新</translation> <translation id="9056839673611986238">设备将被回滚</translation> +<translation id="9070640332319875144">Google 助理设置</translation> <translation id="9074739597929991885">蓝牙</translation> <translation id="9079731690316798640">Wi-Fi:<ph name="ADDRESS" /></translation> <translation id="9080206825613744995">麦克风目前处于使用状态。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 571a6a7..e2abaf5 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -23,6 +23,7 @@ <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation> <translation id="1290331692326790741">訊號微弱</translation> <translation id="1293264513303784526">USB-C 裝置 (左側連接埠)</translation> +<translation id="1294929383540927798">變更螢幕鎖定通知設定</translation> <translation id="1302880136325416935">顯示藍牙設定。<ph name="STATE_TEXT" /></translation> <translation id="1346748346194534595">向右</translation> <translation id="1351937230027495976">收合選單</translation> @@ -40,6 +41,7 @@ <translation id="1570871743947603115">切換藍牙設定。<ph name="STATE_TEXT" /></translation> <translation id="1608626060424371292">移除這位使用者</translation> <translation id="1621499497873603021">電池剩餘使用時間:<ph name="TIME_LEFT" /></translation> +<translation id="1654477262762802994">啟動語音查詢</translation> <translation id="1658406695958299976">很抱歉,系統仍然無法驗證你的密碼。注意:如果你的密碼最近有所異動,新密碼會在你登出後立即生效,目前請在這裡使用舊密碼。</translation> <translation id="1677472565718498478"><ph name="TIME" /> 後用盡</translation> <translation id="1698760176351776263">IPv6 位址:<ph name="ADDRESS" /></translation> @@ -135,6 +137,7 @@ <translation id="3081696990447829002">展開選單</translation> <translation id="3087734570205094154">置底</translation> <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (藍牙)</translation> +<translation id="3124698051292518391">一律顯示檔案櫃</translation> <translation id="3126069444801937830">重新啟動即可更新</translation> <translation id="3147142846278915599">啟動器 (正在同步處理應用程式...)</translation> <translation id="315116470104423982">行動數據</translation> @@ -177,6 +180,7 @@ <translation id="385051799172605136">返回</translation> <translation id="3891340733213178823">按兩下 Ctrl+Shift+Q 鍵即可登出。</translation> <translation id="3893630138897523026">ChromeVox (互動朗讀)</translation> +<translation id="3897533311200664389">啟動文字查詢</translation> <translation id="3899995891769452915">語音輸入</translation> <translation id="3900355044994618856">你的工作階段將於 <ph name="SESSION_TIME_REMAINING" />後結束</translation> <translation id="3901991538546252627">正在連線至:<ph name="NAME" /></translation> @@ -460,6 +464,7 @@ <translation id="8995603266996330174">由 <ph name="DOMAIN" /> 管理</translation> <translation id="9029474291399787231">有可用的 Adobe Flash Player 更新</translation> <translation id="9056839673611986238">裝置將復原</translation> +<translation id="9070640332319875144">個人助理設定</translation> <translation id="9074739597929991885">藍牙</translation> <translation id="9079731690316798640">Wi-Fi:<ph name="ADDRESS" /></translation> <translation id="9080206825613744995">麥克風正在使用中。</translation>
diff --git a/ash/system/date/system_info_default_view.cc b/ash/system/date/system_info_default_view.cc index 3448b766..2ad49f6 100644 --- a/ash/system/date/system_info_default_view.cc +++ b/ash/system/date/system_info_default_view.cc
@@ -81,7 +81,8 @@ } int SystemInfoDefaultView::CalculateDateViewWidth(int preferred_width) { - const float snap_to_width = kSeparatorWidth + kMenuButtonSize; + const float snap_to_width = + TrayConstants::separator_width() + kMenuButtonSize; int num_extra_tile_widths = 0; if (preferred_width > kMenuButtonSize) { const float extra_width = preferred_width - kMenuButtonSize;
diff --git a/ash/system/date/system_info_default_view_unittest.cc b/ash/system/date/system_info_default_view_unittest.cc index 01bccb3..0ce5195 100644 --- a/ash/system/date/system_info_default_view_unittest.cc +++ b/ash/system/date/system_info_default_view_unittest.cc
@@ -28,21 +28,23 @@ EXPECT_LT(kPreferredWidth, kMenuButtonSize); const int effective_width = CalculateDateViewWidth(kPreferredWidth); - EXPECT_EQ(effective_width, - kMenuButtonSize + kSeparatorWidth + kMenuButtonSize); + EXPECT_EQ( + effective_width, + kMenuButtonSize + TrayConstants::separator_width() + kMenuButtonSize); } TEST_F(SystemInfoDefaultViewTest, PreferredWidthGreaterThanOneButtonWidth) { const int kPreferredWidth = kMenuButtonSize + 1; const int effective_width = CalculateDateViewWidth(kPreferredWidth); - EXPECT_EQ(effective_width, - kMenuButtonSize + kSeparatorWidth + kMenuButtonSize); + EXPECT_EQ( + effective_width, + kMenuButtonSize + TrayConstants::separator_width() + kMenuButtonSize); } TEST_F(SystemInfoDefaultViewTest, PreferredWidthEqualToTwoButtonWidths) { const int kPreferredWidth = - kMenuButtonSize + kSeparatorWidth + kMenuButtonSize; + kMenuButtonSize + TrayConstants::separator_width() + kMenuButtonSize; const int effective_width = CalculateDateViewWidth(kPreferredWidth); EXPECT_EQ(effective_width, kPreferredWidth); @@ -50,16 +52,19 @@ TEST_F(SystemInfoDefaultViewTest, PreferredWidthGreaterThanTwoButtonWidths) { const int kPreferredWidth = - kMenuButtonSize + (kSeparatorWidth + kMenuButtonSize) + 1; + kMenuButtonSize + (TrayConstants::separator_width() + kMenuButtonSize) + + 1; const int effective_width = CalculateDateViewWidth(kPreferredWidth); EXPECT_EQ(effective_width, - kMenuButtonSize + (kSeparatorWidth + kMenuButtonSize) * 2); + kMenuButtonSize + + (TrayConstants::separator_width() + kMenuButtonSize) * 2); } TEST_F(SystemInfoDefaultViewTest, PreferredWidthEqualToThreeButtonWidths) { const int kPreferredWidth = - kMenuButtonSize + (kSeparatorWidth + kMenuButtonSize) * 2; + kMenuButtonSize + + (TrayConstants::separator_width() + kMenuButtonSize) * 2; const int effective_width = CalculateDateViewWidth(kPreferredWidth); EXPECT_EQ(effective_width, kPreferredWidth); @@ -67,11 +72,13 @@ TEST_F(SystemInfoDefaultViewTest, PreferredWidthGreaterThanThreeButtonWidths) { const int kPreferredWidth = - kMenuButtonSize + (kSeparatorWidth + kMenuButtonSize) * 2 + 1; + kMenuButtonSize + + (TrayConstants::separator_width() + kMenuButtonSize) * 2 + 1; const int effective_width = CalculateDateViewWidth(kPreferredWidth); EXPECT_EQ(effective_width, - kMenuButtonSize + (kSeparatorWidth + kMenuButtonSize) * 2); + kMenuButtonSize + + (TrayConstants::separator_width() + kMenuButtonSize) * 2); } } // namespace ash
diff --git a/ash/system/flag_warning/flag_warning_tray.cc b/ash/system/flag_warning/flag_warning_tray.cc index 23f87f19..714605a 100644 --- a/ash/system/flag_warning/flag_warning_tray.cc +++ b/ash/system/flag_warning/flag_warning_tray.cc
@@ -8,7 +8,6 @@ #include "ash/components/quick_launch/public/mojom/constants.mojom.h" #include "ash/public/cpp/ash_typography.h" -#include "ash/public/cpp/config.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/shelf/shelf.h" #include "ash/shell.h"
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc index f3995ef..991c398f 100644 --- a/ash/system/ime_menu/ime_menu_tray.cc +++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -126,10 +126,11 @@ class ImeTitleView : public views::View, public views::ButtonListener { public: explicit ImeTitleView(bool show_settings_button) : settings_button_(nullptr) { + const int separator_width = TrayConstants::separator_width(); SetBorder(views::CreatePaddedBorder( - views::CreateSolidSidedBorder(0, 0, kSeparatorWidth, 0, + views::CreateSolidSidedBorder(0, 0, separator_width, 0, kMenuSeparatorColor), - gfx::Insets(kMenuSeparatorVerticalPadding - kSeparatorWidth, 0))); + gfx::Insets(kMenuSeparatorVerticalPadding - separator_width, 0))); auto box_layout = std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal); box_layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight); @@ -221,12 +222,13 @@ void Init(bool show_emoji, bool show_handwriting, bool show_voice) { auto box_layout = std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal); + const int separator_width = TrayConstants::separator_width(); box_layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight); SetLayoutManager(std::move(box_layout)); SetBorder(views::CreatePaddedBorder( - views::CreateSolidSidedBorder(kSeparatorWidth, 0, 0, 0, + views::CreateSolidSidedBorder(separator_width, 0, 0, 0, kMenuSeparatorColor), - gfx::Insets(kMenuSeparatorVerticalPadding - kSeparatorWidth, + gfx::Insets(kMenuSeparatorVerticalPadding - separator_width, kMenuExtraMarginFromLeftEdge))); const int right_border = 1;
diff --git a/ash/system/message_center/arc/arc_notification_content_view.cc b/ash/system/message_center/arc/arc_notification_content_view.cc index 044a153..c3580fb 100644 --- a/ash/system/message_center/arc/arc_notification_content_view.cc +++ b/ash/system/message_center/arc/arc_notification_content_view.cc
@@ -104,7 +104,7 @@ widget->OnScrollEvent(located_event->AsScrollEvent()); } else if (located_event->IsGestureEvent() && event->type() != ui::ET_GESTURE_TAP) { - bool event_for_android_only = false; + bool slide_handled_by_android = false; if ((event->type() == ui::ET_GESTURE_SCROLL_BEGIN || event->type() == ui::ET_GESTURE_SCROLL_UPDATE || event->type() == ui::ET_GESTURE_SCROLL_END || @@ -120,7 +120,7 @@ if (contains && event->type() == ui::ET_GESTURE_SCROLL_BEGIN) swipe_captured_ = true; - event_for_android_only = contains && swipe_captured_; + slide_handled_by_android = contains && swipe_captured_; } if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) @@ -129,8 +129,17 @@ if (event->type() == ui::ET_GESTURE_SCROLL_END) swipe_captured_ = false; - if (!event_for_android_only) - widget->OnGestureEvent(located_event->AsGestureEvent()); + if (slide_handled_by_android && + event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { + is_current_slide_handled_by_android_ = true; + owner_->message_view_->DisableSlideForcibly(true); + } else if (is_current_slide_handled_by_android_ && + event->type() == ui::ET_GESTURE_SCROLL_END) { + is_current_slide_handled_by_android_ = false; + owner_->message_view_->DisableSlideForcibly(false); + } + + widget->OnGestureEvent(located_event->AsGestureEvent()); } } @@ -152,6 +161,7 @@ } ArcNotificationContentView* const owner_; + bool is_current_slide_handled_by_android_ = false; DISALLOW_COPY_AND_ASSIGN(EventForwarder); }; @@ -483,15 +493,16 @@ DCHECK(surface_->GetWindow()); surface_copy_ = ::wm::RecreateLayers(surface_->GetWindow()); // |surface_copy_| is at (0, 0) in owner_->layer(). - surface_copy_->root()->SetBounds(gfx::Rect(surface_copy_->root()->size())); + gfx::Rect size(surface_copy_->root()->size()); + surface_copy_->root()->SetBounds(size); layer()->Add(surface_copy_->root()); if (!surface_copy_mask_) { surface_copy_mask_ = views::Painter::CreatePaintedLayer( std::make_unique<message_center::NotificationBackgroundPainter>( top_radius_, bottom_radius_)); - surface_copy_mask_->layer()->SetBounds( - gfx::Rect(surface_copy_->root()->size())); + surface_copy_mask_->layer()->SetBounds(size); + surface_copy_mask_->layer()->SetFillsBoundsOpaquely(false); } DCHECK(!surface_copy_mask_->layer()->parent()); surface_copy_->root()->SetMaskLayer(surface_copy_mask_->layer());
diff --git a/ash/system/message_center/notification_tray_unittest.cc b/ash/system/message_center/notification_tray_unittest.cc index 96b9212..a8ef9be 100644 --- a/ash/system/message_center/notification_tray_unittest.cc +++ b/ash/system/message_center/notification_tray_unittest.cc
@@ -12,7 +12,6 @@ #include "ash/message_center/message_center_ui_controller.h" #include "ash/message_center/message_center_view.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_layout_manager.h"
diff --git a/ash/system/network/tray_network_unittest.cc b/ash/system/network/tray_network_unittest.cc index facb174..666a424fb 100644 --- a/ash/system/network/tray_network_unittest.cc +++ b/ash/system/network/tray_network_unittest.cc
@@ -6,7 +6,6 @@ #include "ash/login_status.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/network/network_list.h" #include "ash/system/tray/system_tray.h" @@ -32,21 +31,15 @@ // Initializing NetworkHandler before ash is more like production. chromeos::NetworkHandler::Initialize(); AshTestBase::SetUp(); - // Mash doesn't do this yet, so don't do it in tests either. - // http://crbug.com/718072 - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, - &local_state_); - } + chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, + &local_state_); // Networking stubs may have asynchronous initialization. base::RunLoop().RunUntilIdle(); } void TearDown() override { // This roughly matches production shutdown order. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->ShutdownPrefServices(); - } + chromeos::NetworkHandler::Get()->ShutdownPrefServices(); AshTestBase::TearDown(); chromeos::NetworkHandler::Shutdown(); chromeos::DBusThreadManager::Shutdown();
diff --git a/ash/system/network/wifi_toggle_notification_controller_unittest.cc b/ash/system/network/wifi_toggle_notification_controller_unittest.cc index 99d2d5fb..e7328c9 100644 --- a/ash/system/network/wifi_toggle_notification_controller_unittest.cc +++ b/ash/system/network/wifi_toggle_notification_controller_unittest.cc
@@ -4,7 +4,6 @@ #include "ash/system/network/wifi_toggle_notification_controller.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/tray/system_tray_notifier.h" #include "ash/test/ash_test_base.h" @@ -29,21 +28,15 @@ // Initializing NetworkHandler before ash is more like production. chromeos::NetworkHandler::Initialize(); AshTestBase::SetUp(); - // Mash doesn't do this yet, so don't do it in tests either. - // http://crbug.com/718072 - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, - &local_state_); - } + chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, + &local_state_); // Networking stubs may have asynchronous initialization. base::RunLoop().RunUntilIdle(); } void TearDown() override { // This roughly matches production shutdown order. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->ShutdownPrefServices(); - } + chromeos::NetworkHandler::Get()->ShutdownPrefServices(); AshTestBase::TearDown(); chromeos::NetworkHandler::Shutdown(); chromeos::DBusThreadManager::Shutdown();
diff --git a/ash/system/night_light/night_light_controller.cc b/ash/system/night_light/night_light_controller.cc index 24c4f3c..2f138046 100644 --- a/ash/system/night_light/night_light_controller.cc +++ b/ash/system/night_light/night_light_controller.cc
@@ -719,7 +719,7 @@ // any changes. // 2) The user has just manually toggled the status of NightLight either from // the System Menu or System Settings. In this case, we respect the user - // wish and maintain the current status that he desires, but we schedule the + // wish and maintain the current status that they desire, but we schedule the // status to be toggled according to the time that corresponds with the // opposite status of the current one. ScheduleNextToggle(GetEnabled() ? end_time - now : start_time - now);
diff --git a/ash/system/night_light/night_light_controller_unittest.cc b/ash/system/night_light/night_light_controller_unittest.cc index 1955f8d..d2908ce 100644 --- a/ash/system/night_light/night_light_controller_unittest.cc +++ b/ash/system/night_light/night_light_controller_unittest.cc
@@ -13,7 +13,6 @@ #include "ash/display/window_tree_host_manager.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/session_types.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h"
diff --git a/ash/system/night_light/tray_night_light_unittest.cc b/ash/system/night_light/tray_night_light_unittest.cc index fa1d2a6..c127fc49 100644 --- a/ash/system/night_light/tray_night_light_unittest.cc +++ b/ash/system/night_light/tray_night_light_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/system/night_light/tray_night_light.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/night_light/night_light_controller.h" #include "ash/system/tray/system_tray.h"
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc index 5b0bee12..cee509b 100644 --- a/ash/system/palette/palette_tray.cc +++ b/ash/system/palette/palette_tray.cc
@@ -8,7 +8,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/stylus_utils.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/root_window_controller.h"
diff --git a/ash/system/palette/palette_tray_unittest.cc b/ash/system/palette/palette_tray_unittest.cc index 2beaac06..6c6a25978 100644 --- a/ash/system/palette/palette_tray_unittest.cc +++ b/ash/system/palette/palette_tray_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/highlighter/highlighter_controller_test_api.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/stylus_utils.h" #include "ash/public/interfaces/voice_interaction_controller.mojom.h" #include "ash/root_window_controller.h"
diff --git a/ash/system/palette/tools/screenshot_unittest.cc b/ash/system/palette/tools/screenshot_unittest.cc index 7474b21..968d084 100644 --- a/ash/system/palette/tools/screenshot_unittest.cc +++ b/ash/system/palette/tools/screenshot_unittest.cc
@@ -4,7 +4,6 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/shell_test_api.h" #include "ash/system/palette/mock_palette_tool_delegate.h"
diff --git a/ash/system/power/peripheral_battery_notifier_unittest.cc b/ash/system/power/peripheral_battery_notifier_unittest.cc index 44ac7e4..fe747ba 100644 --- a/ash/system/power/peripheral_battery_notifier_unittest.cc +++ b/ash/system/power/peripheral_battery_notifier_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "base/macros.h"
diff --git a/ash/system/power/power_button_controller.h b/ash/system/power/power_button_controller.h index 727c506..0a84815d 100644 --- a/ash/system/power/power_button_controller.h +++ b/ash/system/power/power_button_controller.h
@@ -165,8 +165,8 @@ // animation. void OnPreShutdownTimeout(); - // Updates |button_type_| and |force_clamshell_power_button_| based on the - // current command line. + // Updates |button_type_| and power button position info based on the current + // command line. void ProcessCommandLine(); // Initializes tablet power button behavior related member @@ -214,10 +214,6 @@ // mode. bool observe_accelerometer_events_ = false; - // True if the device should use non-tablet-style power button behavior even - // if it is a convertible device. - bool force_clamshell_power_button_ = false; - // True if the device has tablet mode switch. bool has_tablet_mode_switch_ = false;
diff --git a/ash/system/power/power_button_controller_unittest.cc b/ash/system/power/power_button_controller_unittest.cc index 5d6e2f5..14f34eef 100644 --- a/ash/system/power/power_button_controller_unittest.cc +++ b/ash/system/power/power_button_controller_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/display/screen_orientation_controller_test_api.h" #include "ash/media_controller.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/system/power/power_button_controller_test_api.h"
diff --git a/ash/system/session/logout_button_tray_unittest.cc b/ash/system/session/logout_button_tray_unittest.cc index 65a4f1c..d5fb2f5 100644 --- a/ash/system/session/logout_button_tray_unittest.cc +++ b/ash/system/session/logout_button_tray_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/system/session/logout_button_tray.h" #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h" #include "ash/session/test_session_controller_client.h"
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc index 03a8f0b..b12373a 100644 --- a/ash/system/status_area_widget.cc +++ b/ash/system/status_area_widget.cc
@@ -5,7 +5,6 @@ #include "ash/system/status_area_widget.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shelf/shelf.h" #include "ash/shell.h"
diff --git a/ash/system/status_area_widget_unittest.cc b/ash/system/status_area_widget_unittest.cc index 256035b6..d2c72040 100644 --- a/ash/system/status_area_widget_unittest.cc +++ b/ash/system/status_area_widget_unittest.cc
@@ -7,7 +7,6 @@ #include "ash/focus_cycler.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/session/test_session_controller_client.h" #include "ash/shell.h" @@ -301,21 +300,15 @@ // Initializing NetworkHandler before ash is more like production. chromeos::NetworkHandler::Initialize(); AshTestBase::SetUp(); - // Mash doesn't do this yet, so don't do it in tests either. - // http://crbug.com/718072 - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, - &local_state_); - } + chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, + &local_state_); // Networking stubs may have asynchronous initialization. base::RunLoop().RunUntilIdle(); } void TearDown() override { // This roughly matches production shutdown order. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->ShutdownPrefServices(); - } + chromeos::NetworkHandler::Get()->ShutdownPrefServices(); AshTestBase::TearDown(); chromeos::NetworkHandler::Shutdown(); chromeos::DBusThreadManager::Shutdown();
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc index 51e97159..4930378 100644 --- a/ash/system/tray/system_tray.cc +++ b/ash/system/tray/system_tray.cc
@@ -14,7 +14,6 @@ #include "ash/metrics/user_metrics_recorder.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h"
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc index 46b3c10..19162167e 100644 --- a/ash/system/tray/tray_background_view.cc +++ b/ash/system/tray/tray_background_view.cc
@@ -73,13 +73,14 @@ chromeos::switches::ShouldUseShelfNewUi() ? 0 : ash::kHitRegionPadding; const int secondary_padding = chromeos::switches::ShouldUseShelfNewUi() ? -ash::kHitRegionPadding : 0; + const int separator_width = ash::TrayConstants::separator_width(); if (is_shelf_horizontal) { insets.Set(secondary_padding, primary_padding, secondary_padding, - primary_padding + ash::kSeparatorWidth); + primary_padding + separator_width); } else { insets.Set(primary_padding, secondary_padding, - primary_padding + ash::kSeparatorWidth, secondary_padding); + primary_padding + separator_width, secondary_padding); } MirrorInsetsIfNecessary(&insets); return insets; @@ -379,16 +380,17 @@ const gfx::Rect local_bounds = GetLocalBounds(); const SkColor color = SkColorSetA(SK_ColorWHITE, 0x4D); const int shelf_size = ShelfConstants::shelf_size(); + const int separator_width = ash::TrayConstants::separator_width(); if (shelf_->IsHorizontalAlignment()) { const gfx::PointF point( - base::i18n::IsRTL() ? 0 : (local_bounds.width() - kSeparatorWidth), + base::i18n::IsRTL() ? 0 : (local_bounds.width() - separator_width), (shelf_size - kTrayItemSize) / 2); const gfx::Vector2dF vector(0, kTrayItemSize); canvas->Draw1pxLine(point, point + vector, color); } else { const gfx::PointF point((shelf_size - kTrayItemSize) / 2, - local_bounds.height() - kSeparatorWidth); + local_bounds.height() - separator_width); const gfx::Vector2dF vector(kTrayItemSize, 0); canvas->Draw1pxLine(point, point + vector, color); }
diff --git a/ash/system/tray/tray_constants.cc b/ash/system/tray/tray_constants.cc index 2a2fe6f..94bf2047 100644 --- a/ash/system/tray/tray_constants.cc +++ b/ash/system/tray/tray_constants.cc
@@ -66,7 +66,6 @@ kMenuExtraMarginFromLeftEdge + (kMenuButtonSize - kMenuIconSize) / 2; const int kHitRegionPadding = 4; -const int kSeparatorWidth = 1; const SkColor kMenuSeparatorColor = SkColorSetA(SK_ColorBLACK, 0x1F);
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h index 42ce5f7..da41349 100644 --- a/ash/system/tray/tray_constants.h +++ b/ash/system/tray/tray_constants.h
@@ -6,6 +6,8 @@ #define ASH_SYSTEM_TRAY_TRAY_CONSTANTS_H_ #include "ash/ash_export.h" +#include "base/macros.h" +#include "chromeos/chromeos_switches.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/size.h" @@ -84,7 +86,8 @@ extern const int kHitRegionPadding; // Width of a line used to separate tray items in the shelf. -ASH_EXPORT extern const int kSeparatorWidth; +ASH_EXPORT const int kSeparatorWidth = 1; +const int kSeparatorWidthNewUi = 0; // The color of the separators used in the system menu. extern const SkColor kMenuSeparatorColor; @@ -226,6 +229,22 @@ constexpr gfx::Insets kUnifiedDetailedViewTitlePadding(0, 0, 0, 16); constexpr int kUnifiedDetailedViewTitleRowHeight = 64; +class TrayConstants { + public: + // Returns the width of a line used to separate tray items in the shelf. + static int separator_width() { + return UseNewUi() ? kSeparatorWidthNewUi : kSeparatorWidth; + } + + private: + static bool UseNewUi() { + static bool use_new_ui = chromeos::switches::ShouldUseShelfNewUi(); + return use_new_ui; + } + + DISALLOW_IMPLICIT_CONSTRUCTORS(TrayConstants); +}; + } // namespace ash #endif // ASH_SYSTEM_TRAY_TRAY_CONSTANTS_H_
diff --git a/ash/system/tray/tray_container.cc b/ash/system/tray/tray_container.cc index 18cdf0f..be457ca0 100644 --- a/ash/system/tray/tray_container.cc +++ b/ash/system/tray/tray_container.cc
@@ -68,7 +68,8 @@ is_horizontal ? views::BoxLayout::kHorizontal : views::BoxLayout::kVertical; - const int hit_region_with_separator = kHitRegionPadding + kSeparatorWidth; + const int hit_region_with_separator = + kHitRegionPadding + TrayConstants::separator_width(); gfx::Insets insets( is_horizontal ? gfx::Insets(0, kHitRegionPadding, 0, hit_region_with_separator)
diff --git a/ash/system/tray/tray_detailed_view.cc b/ash/system/tray/tray_detailed_view.cc index 4efef92..cc3c99e 100644 --- a/ash/system/tray/tray_detailed_view.cc +++ b/ash/system/tray/tray_detailed_view.cc
@@ -112,8 +112,9 @@ // that's below the header view so we don't get both a separator and a full // shadow. if (y() != 0 && !did_draw_shadow) - DrawShadow(paint_info.context(), - gfx::Rect(0, 0, width(), -y() - kSeparatorWidth)); + DrawShadow( + paint_info.context(), + gfx::Rect(0, 0, width(), -y() - TrayConstants::separator_width())); } void Layout() override {
diff --git a/ash/system/tray/tray_popup_utils.cc b/ash/system/tray/tray_popup_utils.cc index e370d35..e6176683 100644 --- a/ash/system/tray/tray_popup_utils.cc +++ b/ash/system/tray/tray_popup_utils.cc
@@ -240,11 +240,12 @@ void TrayPopupUtils::ShowStickyHeaderSeparator(views::View* view, bool show_separator) { if (show_separator) { + const int separator_width = ash::TrayConstants::separator_width(); view->SetBorder(views::CreatePaddedBorder( - views::CreateSolidSidedBorder(0, 0, kSeparatorWidth, 0, + views::CreateSolidSidedBorder(0, 0, separator_width, 0, kMenuSeparatorColor), gfx::Insets(kMenuSeparatorVerticalPadding, 0, - kMenuSeparatorVerticalPadding - kSeparatorWidth, 0))); + kMenuSeparatorVerticalPadding - separator_width, 0))); } else { view->SetBorder(views::CreateEmptyBorder( gfx::Insets(kMenuSeparatorVerticalPadding, 0)));
diff --git a/ash/system/tray_caps_lock.cc b/ash/system/tray_caps_lock.cc index 5fd8a74..477e27a5 100644 --- a/ash/system/tray_caps_lock.cc +++ b/ash/system/tray_caps_lock.cc
@@ -9,7 +9,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/ime/ime_controller.h" #include "ash/metrics/user_metrics_recorder.h" -#include "ash/public/cpp/config.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/session/session_controller.h" #include "ash/shell.h"
diff --git a/ash/system/unified/unified_detailed_view_delegate.cc b/ash/system/unified/unified_detailed_view_delegate.cc index 91eabcf4..98e6cc3d 100644 --- a/ash/system/unified/unified_detailed_view_delegate.cc +++ b/ash/system/unified/unified_detailed_view_delegate.cc
@@ -149,11 +149,12 @@ views::View* view, bool show_separator) { if (show_separator) { + const int separator_width = ash::TrayConstants::separator_width(); view->SetBorder(views::CreatePaddedBorder( - views::CreateSolidSidedBorder(0, 0, kSeparatorWidth, 0, + views::CreateSolidSidedBorder(0, 0, separator_width, 0, kUnifiedMenuSeparatorColor), gfx::Insets(kMenuSeparatorVerticalPadding, 0, - kMenuSeparatorVerticalPadding - kSeparatorWidth, 0))); + kMenuSeparatorVerticalPadding - separator_width, 0))); } else { view->SetBorder(views::CreateEmptyBorder( gfx::Insets(kMenuSeparatorVerticalPadding, 0)));
diff --git a/ash/system/unified/unified_system_tray_controller_unittest.cc b/ash/system/unified/unified_system_tray_controller_unittest.cc index b6ecf67..faad210 100644 --- a/ash/system/unified/unified_system_tray_controller_unittest.cc +++ b/ash/system/unified/unified_system_tray_controller_unittest.cc
@@ -4,7 +4,6 @@ #include "ash/system/unified/unified_system_tray_controller.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/system/unified/unified_system_tray_model.h" #include "ash/system/unified/unified_system_tray_view.h" @@ -30,12 +29,8 @@ // Initializing NetworkHandler before ash is more like production. chromeos::NetworkHandler::Initialize(); AshTestBase::SetUp(); - // Mash doesn't do this yet, so don't do it in tests either. - // http://crbug.com/718072 - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, - &local_state_); - } + chromeos::NetworkHandler::Get()->InitializePrefServices(&profile_prefs_, + &local_state_); // Networking stubs may have asynchronous initialization. base::RunLoop().RunUntilIdle(); @@ -57,9 +52,7 @@ model_.reset(); // This roughly matches production shutdown order. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - chromeos::NetworkHandler::Get()->ShutdownPrefServices(); - } + chromeos::NetworkHandler::Get()->ShutdownPrefServices(); AshTestBase::TearDown(); chromeos::NetworkHandler::Shutdown(); chromeos::DBusThreadManager::Shutdown();
diff --git a/ash/system/user/user_view.cc b/ash/system/user/user_view.cc index 06476967..ef89aa6 100644 --- a/ash/system/user/user_view.cc +++ b/ash/system/user/user_view.cc
@@ -299,10 +299,11 @@ // views::Border: void Paint(const views::View& view, gfx::Canvas* canvas) override { + const int separator_width = TrayConstants::separator_width(); canvas->FillRect( gfx::Rect( - 0, view.height() - kMenuSeparatorVerticalPadding - kSeparatorWidth, - view.width(), kSeparatorWidth), + 0, view.height() - kMenuSeparatorVerticalPadding - separator_width, + view.width(), separator_width), kMenuSeparatorColor); } @@ -449,13 +450,14 @@ Shell::Get()->session_controller(); const AddUserSessionPolicy add_user_policy = session_controller->GetAddUserPolicy(); + const int separator_width = TrayConstants::separator_width(); add_user_enabled_ = add_user_policy == AddUserSessionPolicy::ALLOWED; // Position the widget on top of the user card view (which is still in the // system menu). The top half of the widget will be transparent to allow // the active user to show through. gfx::Rect bounds = user_card_container_->GetBoundsInScreen(); - bounds.set_width(bounds.width() + kSeparatorWidth); + bounds.set_width(bounds.width() + separator_width); int row_height = bounds.height(); UserDropdownWidgetContents* container = @@ -464,18 +466,18 @@ views::View* add_user_view = CreateAddUserView(add_user_policy); const SkColor bg_color = add_user_view->background()->get_color(); container->SetBorder(views::CreatePaddedBorder( - views::CreateSolidSidedBorder(0, 0, 0, kSeparatorWidth, bg_color), + views::CreateSolidSidedBorder(0, 0, 0, separator_width, bg_color), gfx::Insets(row_height, 0, 0, 0))); // Create the contents aside from the empty window through which the active // user is seen. views::View* user_dropdown_padding = new views::View(); user_dropdown_padding->SetBorder(views::CreateSolidSidedBorder( - kMenuSeparatorVerticalPadding - kSeparatorWidth, 0, 0, 0, bg_color)); + kMenuSeparatorVerticalPadding - separator_width, 0, 0, 0, bg_color)); user_dropdown_padding->SetLayoutManager( std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical)); views::Separator* separator = new views::Separator(); - separator->SetPreferredHeight(kSeparatorWidth); + separator->SetPreferredHeight(separator_width); separator->SetColor( color_utils::GetResultingPaintColor(kMenuSeparatorColor, bg_color)); const int separator_horizontal_padding =
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc index a71e088..a9ca261b 100644 --- a/ash/test/ash_test_base.cc +++ b/ash/test/ash_test_base.cc
@@ -15,7 +15,6 @@ #include "ash/display/screen_orientation_controller_test_api.h" #include "ash/display/unified_mouse_warp_controller.h" #include "ash/display/window_tree_host_manager.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/window_properties.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h" @@ -162,9 +161,7 @@ // Move the mouse cursor to far away so that native events doesn't // interfere test expectations. Shell::GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(-1000, -1000)); - // TODO: mus/mash needs to support CursorManager. http://crbug.com/637853. - if (Shell::GetAshConfig() == Config::CLASSIC) - Shell::Get()->cursor_manager()->EnableMouseEvents(); + Shell::Get()->cursor_manager()->EnableMouseEvents(); // Changing GestureConfiguration shouldn't make tests fail. These values // prevent unexpected events from being generated during tests. Such as
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h index efe1b923..5233c04 100644 --- a/ash/test/ash_test_base.h +++ b/ash/test/ash_test_base.h
@@ -120,9 +120,7 @@ aura::client::WindowType type = aura::client::WINDOW_TYPE_NORMAL, int shell_window_id = kShellWindowId_Invalid); - // Creates a visible top-level window. For Config::CLASSIC this creates a - // Window with a delegate. For Config::MASH_DEPRECATED this creates a window - // as if the client requested a top-level window. + // Creates a visible top-level window with a delegate. std::unique_ptr<aura::Window> CreateToplevelTestWindow( const gfx::Rect& bounds_in_screen = gfx::Rect(), int shell_window_id = kShellWindowId_Invalid);
diff --git a/ash/tooltips/tooltip_controller_unittest.cc b/ash/tooltips/tooltip_controller_unittest.cc index 9b84bc08..3238080 100644 --- a/ash/tooltips/tooltip_controller_unittest.cc +++ b/ash/tooltips/tooltip_controller_unittest.cc
@@ -4,7 +4,6 @@ #include "ui/views/corewm/tooltip_controller.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h"
diff --git a/ash/touch/touch_observer_hud_unittest.cc b/ash/touch/touch_observer_hud_unittest.cc index 07552f0a..82395a3c 100644 --- a/ash/touch/touch_observer_hud_unittest.cc +++ b/ash/touch/touch_observer_hud_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/touch/touch_observer_hud.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/root_window_controller.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h"
diff --git a/ash/wallpaper/wallpaper_controller.cc b/ash/wallpaper/wallpaper_controller.cc index 07886c0..e60389b 100644 --- a/ash/wallpaper/wallpaper_controller.cc +++ b/ash/wallpaper/wallpaper_controller.cc
@@ -12,7 +12,6 @@ #include "ash/display/window_tree_host_manager.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/login_constants.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h"
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc index bdff691f..b7b9f859 100644 --- a/ash/wallpaper/wallpaper_controller_unittest.cc +++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -8,7 +8,6 @@ #include <cstdlib> #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h"
diff --git a/ash/wayland/wayland_server_controller.cc b/ash/wayland/wayland_server_controller.cc index 92437053..ee8dcce 100644 --- a/ash/wayland/wayland_server_controller.cc +++ b/ash/wayland/wayland_server_controller.cc
@@ -8,7 +8,6 @@ #include "ash/keyboard/arc/arc_input_method_surface_manager.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/system/message_center/arc/arc_notification_surface_manager_impl.h" #include "base/command_line.h" #include "base/memory/ptr_util.h"
diff --git a/ash/wm/ash_focus_rules.cc b/ash/wm/ash_focus_rules.cc index c4f875ad..5285463 100644 --- a/ash/wm/ash_focus_rules.cc +++ b/ash/wm/ash_focus_rules.cc
@@ -5,6 +5,7 @@ #include "ash/wm/ash_focus_rules.h" #include "ash/public/cpp/shell_window_ids.h" +#include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/wm/container_finder.h" #include "ash/wm/focus_rules.h" @@ -27,6 +28,14 @@ return false; } +bool BelongsToContainerWithId(const aura::Window* window, int container_id) { + for (; window; window = window->parent()) { + if (window->id() == container_id) + return true; + } + return false; +} + } // namespace //////////////////////////////////////////////////////////////////////////////// @@ -57,8 +66,16 @@ if (!window) return true; - if (!BaseFocusRules::CanActivateWindow(window)) { + if (!BaseFocusRules::CanActivateWindow(window)) return false; + + // Special case to allow the login shelf to be activatable when the OOBE + // modal is visible. See http://crbug/871184 + // TODO: remove this special case once login shelf is moved into a child + // widget of the lock screen (https://crbug.com/767235). + if (Shell::Get()->session_controller()->IsUserSessionBlocked() && + BelongsToContainerWithId(window, kShellWindowId_ShelfContainer)) { + return true; } int modal_container_id = Shell::GetOpenSystemModalWindowContainerId();
diff --git a/ash/wm/ash_focus_rules_unittest.cc b/ash/wm/ash_focus_rules_unittest.cc index 0c6a8a0..d801460 100644 --- a/ash/wm/ash_focus_rules_unittest.cc +++ b/ash/wm/ash_focus_rules_unittest.cc
@@ -114,6 +114,10 @@ return CreateWindowInContainer(kShellWindowId_LockScreenContainer); } + aura::Window* CreateWindowInShelfContainer() { + return CreateWindowInContainer(kShellWindowId_ShelfContainer); + } + aura::Window* CreateWindowInLockSystemModalContainer() { aura::Window* window = CreateWindowInContainer(kShellWindowId_LockSystemModalContainer); @@ -254,4 +258,22 @@ EXPECT_TRUE(wm::IsActiveWindow(system_modal_window.get())); } +// Verifies that the shelf can be activated in login/lock screen even if there +// is a lock system modal present. +TEST_F(LockScreenAshFocusRulesTest, + AllowShelfActivationWithLockSystemModalWindow) { + BlockUserSession(BLOCKED_BY_LOCK_SCREEN); + EXPECT_TRUE(Shell::Get()->session_controller()->IsScreenLocked()); + + std::unique_ptr<aura::Window> lock_window(CreateWindowInLockContainer()); + std::unique_ptr<aura::Window> lock_shelf_window( + CreateWindowInShelfContainer()); + std::unique_ptr<aura::Window> lock_system_modal_window( + CreateWindowInLockSystemModalContainer()); + EXPECT_TRUE(wm::IsActiveWindow(lock_system_modal_window.get())); + + wm::ActivateWindow(lock_shelf_window.get()); + EXPECT_TRUE(wm::IsActiveWindow(lock_shelf_window.get())); +} + } // namespace ash
diff --git a/ash/wm/client_controlled_state.cc b/ash/wm/client_controlled_state.cc index c8bf2eb..1d0843cd 100644 --- a/ash/wm/client_controlled_state.cc +++ b/ash/wm/client_controlled_state.cc
@@ -35,11 +35,10 @@ // static void ClientControlledState::AdjustBoundsForMinimumWindowVisibility( - aura::Window* window, + const gfx::Rect& display_bounds, gfx::Rect* bounds) { AdjustBoundsToEnsureWindowVisibility( - window->GetRootWindow()->bounds(), - kClientControlledWindowMinimumOnScreenArea, + display_bounds, kClientControlledWindowMinimumOnScreenArea, kClientControlledWindowMinimumOnScreenArea, bounds); } @@ -135,7 +134,8 @@ if (event->type() == WM_EVENT_ADDED_TO_WORKSPACE) { aura::Window* window = window_state->window(); gfx::Rect bounds = window->bounds(); - AdjustBoundsForMinimumWindowVisibility(window, &bounds); + AdjustBoundsForMinimumWindowVisibility(window->GetRootWindow()->bounds(), + &bounds); if (window->bounds() != bounds) window_state->SetBoundsConstrained(bounds);
diff --git a/ash/wm/client_controlled_state.h b/ash/wm/client_controlled_state.h index 7bb4464..f298239 100644 --- a/ash/wm/client_controlled_state.h +++ b/ash/wm/client_controlled_state.h
@@ -47,8 +47,9 @@ // Adjust bounds to ensure window visibility, which is used for window added // to a new workspace. - static void AdjustBoundsForMinimumWindowVisibility(aura::Window* window, - gfx::Rect* bounds); + static void AdjustBoundsForMinimumWindowVisibility( + const gfx::Rect& display_bounds, + gfx::Rect* bounds); explicit ClientControlledState(std::unique_ptr<Delegate> delegate); ~ClientControlledState() override;
diff --git a/ash/wm/drag_window_resizer_mash.cc b/ash/wm/drag_window_resizer_mash.cc deleted file mode 100644 index 6d96399..0000000 --- a/ash/wm/drag_window_resizer_mash.cc +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/wm/drag_window_resizer_mash.h" - -namespace ash { - -DragWindowResizerMash::DragWindowResizerMash( - std::unique_ptr<WindowResizer> next_window_resizer, - wm::WindowState* window_state) - : WindowResizer(window_state), - next_window_resizer_(std::move(next_window_resizer)) {} - -DragWindowResizerMash::~DragWindowResizerMash() { - if (window_state_) - window_state_->DeleteDragDetails(); -} - -void DragWindowResizerMash::Drag(const gfx::Point& location, int event_flags) { - next_window_resizer_->Drag(location, event_flags); - // http://crbug.com/613199. - NOTIMPLEMENTED_LOG_ONCE(); -} - -void DragWindowResizerMash::CompleteDrag() { - next_window_resizer_->CompleteDrag(); - // http://crbug.com/613199. - NOTIMPLEMENTED_LOG_ONCE(); -} - -void DragWindowResizerMash::RevertDrag() { - next_window_resizer_->RevertDrag(); - // http://crbug.com/613199. - NOTIMPLEMENTED_LOG_ONCE(); -} - -} // namespace ash
diff --git a/ash/wm/drag_window_resizer_mash.h b/ash/wm/drag_window_resizer_mash.h deleted file mode 100644 index d9c62236b..0000000 --- a/ash/wm/drag_window_resizer_mash.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_WM_DRAG_WINDOW_RESIZER_MASH_H_ -#define ASH_WM_DRAG_WINDOW_RESIZER_MASH_H_ - -#include <memory> - -#include "ash/wm/window_resizer.h" -#include "base/macros.h" - -namespace ash { - -// DragWindowResizer is a decorator of WindowResizer and adds the ability to -// drag windows across displays. -class DragWindowResizerMash : public WindowResizer { - public: - DragWindowResizerMash(std::unique_ptr<WindowResizer> next_window_resizer, - wm::WindowState* window_state); - ~DragWindowResizerMash() override; - - // WindowResizer: - void Drag(const gfx::Point& location, int event_flags) override; - void CompleteDrag() override; - void RevertDrag() override; - - WindowResizer* next_window_resizer_for_testing() { - return next_window_resizer_.get(); - } - - private: - std::unique_ptr<WindowResizer> next_window_resizer_; - - DISALLOW_COPY_AND_ASSIGN(DragWindowResizerMash); -}; - -} // namespace ash - -#endif // ASH_WM_DRAG_WINDOW_RESIZER_MASH_H_
diff --git a/ash/wm/lock_state_controller_unittest.cc b/ash/wm/lock_state_controller_unittest.cc index 8ef5325..edaab213 100644 --- a/ash/wm/lock_state_controller_unittest.cc +++ b/ash/wm/lock_state_controller_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/accessibility/accessibility_controller.h" #include "ash/accessibility/test_accessibility_controller_client.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/shutdown_controller.h" @@ -342,9 +341,7 @@ EXPECT_EQ(0, NumShutdownRequests()); // Make sure a mouse move event won't show the cursor. GenerateMouseMoveEvent(); - // TODO: CursorManager not created in mash. http://crbug.com/631103. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - EXPECT_FALSE(cursor_visible()); + EXPECT_FALSE(cursor_visible()); ShutdownSoundPlayed(); EXPECT_TRUE(lock_state_test_api_->real_shutdown_timer_is_running()); @@ -533,9 +530,7 @@ SessionStateAnimator::kAllNonRootContainersMask, SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY)); GenerateMouseMoveEvent(); - // TODO: CursorManager not created in mash. http://crbug.com/631103. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - EXPECT_FALSE(cursor_visible()); + EXPECT_FALSE(cursor_visible()); } // Test that we display the fast-close animation and shut down when we get an @@ -550,9 +545,7 @@ Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); GenerateMouseMoveEvent(); - // TODO: CursorManager not created in mash. http://crbug.com/631103. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - EXPECT_FALSE(cursor_visible()); + EXPECT_FALSE(cursor_visible()); EXPECT_EQ(0, NumShutdownRequests()); ShutdownSoundPlayed(); @@ -576,9 +569,7 @@ Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); GenerateMouseMoveEvent(); - // TODO: CursorManager not created in mash. http://crbug.com/631103. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - EXPECT_FALSE(cursor_visible()); + EXPECT_FALSE(cursor_visible()); EXPECT_EQ(0, NumShutdownRequests()); ShutdownSoundPlayed();
diff --git a/ash/wm/non_client_frame_controller.cc b/ash/wm/non_client_frame_controller.cc index 3c4eb797..5002e54 100644 --- a/ash/wm/non_client_frame_controller.cc +++ b/ash/wm/non_client_frame_controller.cc
@@ -185,11 +185,6 @@ window_style_(window_style) {} ~WmNativeWidgetAura() override = default; - void SetHeaderHeight(int height) { - if (custom_frame_view_) - custom_frame_view_->SetHeaderHeight({height}); - } - void set_cursor(const ui::Cursor& cursor) { cursor_ = cursor; } // views::NativeWidgetAura: @@ -199,13 +194,16 @@ if (remove_standard_frame_) return new EmptyDraggableNonClientFrameView(); aura::Window* window = GetNativeView(); - immersive_delegate_ = - std::make_unique<ImmersiveFullscreenControllerDelegateMus>(GetWidget(), - window); + + if (!enable_immersive_) { + immersive_delegate_ = + std::make_unique<ImmersiveFullscreenControllerDelegateMus>( + GetWidget(), window); + } + // See description for details on ownership. - custom_frame_view_ = - new NonClientFrameViewAsh(GetWidget(), immersive_delegate_.get(), - enable_immersive_, window_style_); + custom_frame_view_ = new NonClientFrameViewAsh( + GetWidget(), immersive_delegate_.get(), window_style_); // Only the header actually paints any content. So the rest of the region is // marked as transparent content (see below in NonClientFrameController() @@ -368,11 +366,6 @@ return GetAshLayoutSize(AshLayoutSize::kNonBrowserCaption).width() * 3; } -void NonClientFrameController::SetClientArea(const gfx::Insets& insets) { - static_cast<WmNativeWidgetAura*>(widget_->native_widget()) - ->SetHeaderHeight(insets.top()); -} - void NonClientFrameController::StoreCursor(const ui::Cursor& cursor) { static_cast<WmNativeWidgetAura*>(widget_->native_widget()) ->set_cursor(cursor);
diff --git a/ash/wm/non_client_frame_controller.h b/ash/wm/non_client_frame_controller.h index 389080c..20a9066 100644 --- a/ash/wm/non_client_frame_controller.h +++ b/ash/wm/non_client_frame_controller.h
@@ -72,8 +72,6 @@ aura::Window* window() { return window_; } - void SetClientArea(const gfx::Insets& insets); - // Stores |cursor| as this window's active cursor. It does not actually update // the active cursor by calling into CursorManager, but will update the return // value provided by the associated window's aura::WindowDelegate::GetCursor.
diff --git a/ash/wm/non_client_frame_controller_unittest.cc b/ash/wm/non_client_frame_controller_unittest.cc index e5d9cbeb..e898a40 100644 --- a/ash/wm/non_client_frame_controller_unittest.cc +++ b/ash/wm/non_client_frame_controller_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/wm/non_client_frame_controller.h" #include "ash/public/cpp/ash_layout_constants.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/test/ash_test_helper.h" @@ -23,6 +22,7 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" #include "ui/aura/window.h" +#include "ui/base/ui_base_features.h" #include "ui/compositor/compositor.h" #include "ui/compositor/test/draw_waiter_for_test.h" #include "ui/compositor/test/fake_context_factory.h" @@ -112,8 +112,8 @@ }; TEST_F(NonClientFrameControllerMashTest, ContentRegionNotDrawnForClient) { - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) - return; // TODO: decide if this test should be made to work with ws2. + if (!::features::IsSingleProcessMash() && !::features::IsMultiProcessMash()) + return; std::map<std::string, std::vector<uint8_t>> properties; std::unique_ptr<aura::Window> window(CreateAndParentTopLevelWindow(
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc index b1656df..a00f4fa 100644 --- a/ash/wm/overview/window_selector_unittest.cc +++ b/ash/wm/overview/window_selector_unittest.cc
@@ -16,7 +16,6 @@ #include "ash/public/cpp/app_list/app_list_constants.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/window_properties.h" #include "ash/screen_util.h" #include "ash/shelf/shelf.h" @@ -495,11 +494,8 @@ EXPECT_FALSE(wm::IsActiveWindow(window1.get())); EXPECT_TRUE(wm::IsActiveWindow(window2.get())); EXPECT_EQ(window2.get(), wm::GetFocusedWindow()); - // TODO: mash doesn't support CursorClient. http://crbug.com/637853. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - // Hide the cursor before entering overview to test that it will be shown. - aura::client::GetCursorClient(root_window)->HideCursor(); - } + // Hide the cursor before entering overview to test that it will be shown. + aura::client::GetCursorClient(root_window)->HideCursor(); // In overview mode the windows should no longer overlap and the text filter // widget should be focused. @@ -513,11 +509,8 @@ EXPECT_FALSE(wm::IsActiveWindow(window2.get())); EXPECT_EQ(window1.get(), wm::GetFocusedWindow()); - // TODO: mash doesn't support CursorClient. http://crbug.com/637853. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - // Cursor should have been unlocked. - EXPECT_FALSE(aura::client::GetCursorClient(root_window)->IsCursorLocked()); - } + // Cursor should have been unlocked. + EXPECT_FALSE(aura::client::GetCursorClient(root_window)->IsCursorLocked()); } // Tests activating minimized window.
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index acaef57b..566ce9f 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -913,7 +913,7 @@ gfx::Rect work_area_bounds = GetDisplayWorkAreaBoundsInScreen(GetDefaultSnappedWindow()); if (!IsCurrentScreenOrientationLandscape()) - TransposeRect(&work_area_bounds); + work_area_bounds.Transpose(); float opacity = kBlackScrimOpacity; const float ratio = kOneThirdPositionRatio - kBlackScrimFadeInRatio; const int distance = std::min(std::abs(location - work_area_bounds.x()), @@ -1152,8 +1152,8 @@ GetMinimumWindowSize(right_or_bottom_window, is_landscape); if (!is_landscape) { - TransposeRect(left_or_top_rect); - TransposeRect(right_or_bottom_rect); + left_or_top_rect->Transpose(); + right_or_bottom_rect->Transpose(); } if (left_or_top_rect->width() < left_minimum_width) @@ -1166,8 +1166,8 @@ } if (!is_landscape) { - TransposeRect(left_or_top_rect); - TransposeRect(right_or_bottom_rect); + left_or_top_rect->Transpose(); + right_or_bottom_rect->Transpose(); } }
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index c48878e..d11934e3 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -8,7 +8,6 @@ #include "ash/display/screen_orientation_controller.h" #include "ash/display/screen_orientation_controller_test_api.h" #include "ash/public/cpp/app_types.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/window_properties.h" #include "ash/screen_util.h" #include "ash/session/session_controller.h" @@ -21,7 +20,6 @@ #include "ash/test/ash_test_base.h" #include "ash/wallpaper/wallpaper_controller.h" #include "ash/wm/drag_window_resizer.h" -#include "ash/wm/drag_window_resizer_mash.h" #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/window_grid.h" #include "ash/wm/overview/window_selector_controller.h" @@ -1681,14 +1679,8 @@ // TODO(xdai): This piece of codes seems knowing too much impl details about // WindowResizer. Revisit the logic here later to see if there is anything // we can do to simplify the logic and hide impl details. - if (Shell::GetAshConfig() != Config::MASH_DEPRECATED) { - real_window_resizer = static_cast<DragWindowResizer*>(resizer) - ->next_window_resizer_for_testing(); - - } else { - real_window_resizer = static_cast<DragWindowResizerMash*>(resizer) - ->next_window_resizer_for_testing(); - } + real_window_resizer = static_cast<DragWindowResizer*>(resizer) + ->next_window_resizer_for_testing(); TabletModeBrowserWindowDragController* browser_controller = static_cast<TabletModeBrowserWindowDragController*>( real_window_resizer);
diff --git a/ash/wm/splitview/split_view_drag_indicators.cc b/ash/wm/splitview/split_view_drag_indicators.cc index a4d5309..f42737a 100644 --- a/ash/wm/splitview/split_view_drag_indicators.cc +++ b/ash/wm/splitview/split_view_drag_indicators.cc
@@ -344,8 +344,8 @@ gfx::Rect left_highlight_bounds(hightlight_padding_point, highlight_size); gfx::Rect right_highlight_bounds(right_bottom_origin, highlight_size); if (!landscape) { - TransposeRect(&left_highlight_bounds); - TransposeRect(&right_highlight_bounds); + left_highlight_bounds.Transpose(); + right_highlight_bounds.Transpose(); } const bool preview_left = (indicator_state_ == IndicatorState::kPreviewAreaLeft); @@ -368,7 +368,7 @@ kHighlightScreenEdgePaddingDp, kOtherHighlightLengthDp, display_height - 2 * kHighlightScreenEdgePaddingDp); if (!landscape) - TransposeRect(&other_bounds); + other_bounds.Transpose(); if (IsPreviewAreaOnLeftTopOfScreen(indicator_state_)) { left_highlight_bounds = preview_area_bounds;
diff --git a/ash/wm/splitview/split_view_utils.cc b/ash/wm/splitview/split_view_utils.cc index 20c3053..2cef3c9 100644 --- a/ash/wm/splitview/split_view_utils.cc +++ b/ash/wm/splitview/split_view_utils.cc
@@ -9,7 +9,6 @@ #include "ui/compositor/layer_animation_observer.h" #include "ui/compositor/layer_animator.h" #include "ui/compositor/scoped_layer_animation_settings.h" -#include "ui/gfx/geometry/rect.h" namespace ash { @@ -191,8 +190,4 @@ layer->SetTransform(target_transform); } -void TransposeRect(gfx::Rect* rect) { - rect->SetRect(rect->y(), rect->x(), rect->height(), rect->width()); -} - } // namespace ash
diff --git a/ash/wm/splitview/split_view_utils.h b/ash/wm/splitview/split_view_utils.h index 91d3f2f..534f17d 100644 --- a/ash/wm/splitview/split_view_utils.h +++ b/ash/wm/splitview/split_view_utils.h
@@ -7,10 +7,6 @@ #include "ui/gfx/transform.h" -namespace gfx { -class Rect; -} // namespace gfx - namespace ui { class Layer; } // namespace ui @@ -70,9 +66,6 @@ SplitviewAnimationType type, const gfx::Transform& target_transform); -// Transposes the given |rect|. -void TransposeRect(gfx::Rect* rect); - } // namespace ash #endif // ASH_WM_SPLITVIEW_SPLIT_VIEW_UTILS_H_
diff --git a/ash/wm/system_modal_container_layout_manager.cc b/ash/wm/system_modal_container_layout_manager.cc index a496136..18b3a8e95 100644 --- a/ash/wm/system_modal_container_layout_manager.cc +++ b/ash/wm/system_modal_container_layout_manager.cc
@@ -7,7 +7,6 @@ #include <cmath> #include <memory> -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h"
diff --git a/ash/wm/top_level_window_factory.cc b/ash/wm/top_level_window_factory.cc index 54e20b0d..15585726 100644 --- a/ash/wm/top_level_window_factory.cc +++ b/ash/wm/top_level_window_factory.cc
@@ -63,8 +63,16 @@ // |properties| is the properties supplied during window creation. RootWindowController* GetRootWindowControllerForNewTopLevelWindow( std::map<std::string, std::vector<uint8_t>>* properties) { - // If a specific display was requested, use it. - const int64_t display_id = GetInitialDisplayId(*properties); + // If a specific display was requested, use it. If no display was requested, + // choose one based on the requested initial bounds. + int64_t display_id = GetInitialDisplayId(*properties); + gfx::Rect requested_bounds; + if (display_id == display::kInvalidDisplayId && + GetInitialBounds(*properties, &requested_bounds)) { + display_id = + display::Screen::GetScreen()->GetDisplayMatching(requested_bounds).id(); + } + if (display_id != display::kInvalidDisplayId) { for (RootWindowController* root_window_controller : RootWindowController::root_window_controllers()) { @@ -74,6 +82,7 @@ } } } + return RootWindowController::ForWindow(Shell::GetRootWindowForNewWindows()); }
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc index f0970db..6c224e200 100644 --- a/ash/wm/window_util.cc +++ b/ash/wm/window_util.cc
@@ -8,7 +8,6 @@ #include <vector> #include "ash/public/cpp/ash_constants.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" #include "ash/root_window_controller.h" @@ -196,7 +195,7 @@ // events to be dispatched to windows outside the windows bounds that this // function calls into. http://crbug.com/679056. window->SetEventTargeter(std::make_unique<::wm::EasyResizeWindowTargeter>( - window, mouse_extend, touch_extend)); + mouse_extend, touch_extend)); } void CloseWidgetForWindow(aura::Window* window) {
diff --git a/ash/wm/workspace/backdrop_controller.h b/ash/wm/workspace/backdrop_controller.h index b69d5cd..e7562c3 100644 --- a/ash/wm/workspace/backdrop_controller.h +++ b/ash/wm/workspace/backdrop_controller.h
@@ -64,6 +64,8 @@ // the other windows in the container. void UpdateBackdrop(); + aura::Window* backdrop_window() { return backdrop_window_; } + // ShellObserver: void OnOverviewModeStarting() override; void OnOverviewModeEnded() override;
diff --git a/ash/wm/workspace/workspace_layout_manager.h b/ash/wm/workspace/workspace_layout_manager.h index da79ba97..51f7060 100644 --- a/ash/wm/workspace/workspace_layout_manager.h +++ b/ash/wm/workspace/workspace_layout_manager.h
@@ -49,7 +49,11 @@ // the WorkspaceLayoutManager. void SetBackdropDelegate(std::unique_ptr<BackdropDelegate> delegate); - // Overridden from aura::LayoutManager: + BackdropController* backdrop_controller() { + return backdrop_controller_.get(); + } + + // aura::LayoutManager: void OnWindowResized() override; void OnWindowAddedToLayout(aura::Window* child) override; void OnWillRemoveWindowFromLayout(aura::Window* child) override; @@ -59,7 +63,7 @@ void SetChildBounds(aura::Window* child, const gfx::Rect& requested_bounds) override; - // Overriden from aura::WindowObserver: + // aura::WindowObserver: void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override; void OnWindowPropertyChanged(aura::Window* window, const void* key, @@ -71,7 +75,7 @@ const gfx::Rect& new_bounds, ui::PropertyChangeReason reason) override; - // wm::ActivationChangeObserver overrides: + // wm::ActivationChangeObserver: void OnWindowActivating(ActivationReason reason, aura::Window* gaining_active, aura::Window* losing_active) override; @@ -80,19 +84,19 @@ aura::Window* gained_active, aura::Window* lost_active) override; - // keyboard::KeyboardControllerObserver overrides: + // keyboard::KeyboardControllerObserver: void OnKeyboardWorkspaceDisplacingBoundsChanged( const gfx::Rect& new_bounds) override; - // WindowStateObserver overrides: + // WindowStateObserver: void OnPostWindowStateTypeChange(wm::WindowState* window_state, mojom::WindowStateType old_type) override; - // display::DisplayObserver overrides: + // display::DisplayObserver: void OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) override; - // ShellObserver overrides: + // ShellObserver: void OnFullscreenStateChanged(bool is_fullscreen, aura::Window* root_window) override; void OnPinnedStateChanged(aura::Window* pinned_window) override;
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc index 19e2015..ffdb5b5 100644 --- a/ash/wm/workspace/workspace_layout_manager_unittest.cc +++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -13,7 +13,6 @@ #include "ash/frame/non_client_frame_view_ash.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/app_types.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" #include "ash/root_window_controller.h" @@ -460,12 +459,6 @@ } TEST_F(WorkspaceLayoutManagerTest, WindowShouldBeOnScreenWhenAdded) { - // TODO: fix. This test verifies that when a window is added the bounds are - // adjusted. CreateTestWindow() for mus adds, then sets the bounds (this comes - // from NativeWidgetAura), which means this test now fails for aura-mus. - if (Shell::GetAshConfig() == Config::MASH_DEPRECATED) - return; - // Normal window bounds shouldn't be changed. gfx::Rect window_bounds(100, 100, 200, 200); std::unique_ptr<aura::Window> window(CreateTestWindow(window_bounds));
diff --git a/base/BUILD.gn b/base/BUILD.gn index 8a3207d..0d50d0f 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -3240,18 +3240,3 @@ "//base", ] } - -# TODO(dyaroshev): remove regression fuzzer, after we run it for a few days -# and are confident that the transition was ok. -fuzzer_test("utf_string_conversions_regression_fuzzer") { - sources = [ - "strings/old_utf_string_conversions.cc", - "strings/old_utf_string_conversions.h", - "strings/utf_string_conversions_regression_fuzzer.cc", - ] - deps = [ - ":base", - ] - - libfuzzer_options = [ "max_len=32" ] -}
diff --git a/base/android/application_status_listener.cc b/base/android/application_status_listener.cc index c8c2cc6..8e5eb52 100644 --- a/base/android/application_status_listener.cc +++ b/base/android/application_status_listener.cc
@@ -56,6 +56,7 @@ // static void ApplicationStatusListener::NotifyApplicationStateChange( ApplicationState state) { + TRACE_COUNTER1("browser", "ApplicationState", static_cast<int>(state)); g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListener::Notify, state); }
diff --git a/base/android/java/src/org/chromium/base/EarlyTraceEvent.java b/base/android/java/src/org/chromium/base/EarlyTraceEvent.java index 25cef80..f3f769d 100644 --- a/base/android/java/src/org/chromium/base/EarlyTraceEvent.java +++ b/base/android/java/src/org/chromium/base/EarlyTraceEvent.java
@@ -102,7 +102,7 @@ @VisibleForTesting static final int STATE_FINISHED = 3; private static final String BACKGROUND_STARTUP_TRACING_ENABLED_KEY = "bg_startup_tracing"; - private static boolean sCachedBackgroundStartupTracingFlag = false; + private static boolean sCachedBackgroundStartupTracingFlag; // Locks the fields below. private static final Object sLock = new Object();
diff --git a/base/android/javatests/src/org/chromium/base/ObserverListTest.java b/base/android/javatests/src/org/chromium/base/ObserverListTest.java index f3b3e93..96d1b6e 100644 --- a/base/android/javatests/src/org/chromium/base/ObserverListTest.java +++ b/base/android/javatests/src/org/chromium/base/ObserverListTest.java
@@ -28,7 +28,7 @@ private static class Foo implements Observer { private final int mScalar; - private int mTotal = 0; + private int mTotal; Foo(int scalar) { mScalar = scalar;
diff --git a/base/memory/platform_shared_memory_region.h b/base/memory/platform_shared_memory_region.h index 56b5862d..a1ae8bb1b 100644 --- a/base/memory/platform_shared_memory_region.h +++ b/base/memory/platform_shared_memory_region.h
@@ -97,7 +97,7 @@ using PlatformHandle = mach_port_t; using ScopedPlatformHandle = mac::ScopedMachSendRight; #elif defined(OS_FUCHSIA) - using PlatformHandle = zx_handle_t; + using PlatformHandle = zx::unowned_vmo; using ScopedPlatformHandle = zx::vmo; #elif defined(OS_WIN) using PlatformHandle = HANDLE;
diff --git a/base/memory/platform_shared_memory_region_fuchsia.cc b/base/memory/platform_shared_memory_region_fuchsia.cc index a8e0a1fb..ba66119 100644 --- a/base/memory/platform_shared_memory_region_fuchsia.cc +++ b/base/memory/platform_shared_memory_region_fuchsia.cc
@@ -4,9 +4,9 @@ #include "base/memory/platform_shared_memory_region.h" +#include <lib/zx/vmar.h> #include <zircon/process.h> #include <zircon/rights.h> -#include <zircon/syscalls.h> #include "base/bits.h" #include "base/fuchsia/fuchsia_logging.h" @@ -35,8 +35,8 @@ if (size > static_cast<size_t>(std::numeric_limits<int>::max())) return {}; - CHECK( - CheckPlatformHandlePermissionsCorrespondToMode(handle.get(), mode, size)); + CHECK(CheckPlatformHandlePermissionsCorrespondToMode(zx::unowned_vmo(handle), + mode, size)); return PlatformSharedMemoryRegion(std::move(handle), mode, size, guid); } @@ -54,8 +54,8 @@ handle.GetGUID()); } -zx_handle_t PlatformSharedMemoryRegion::GetPlatformHandle() const { - return handle_.get(); +zx::unowned_vmo PlatformSharedMemoryRegion::GetPlatformHandle() const { + return zx::unowned_vmo(handle_); } bool PlatformSharedMemoryRegion::IsValid() const { @@ -122,8 +122,8 @@ bool write_allowed = mode_ != Mode::kReadOnly; uintptr_t addr; - zx_status_t status = zx_vmar_map_old( - zx_vmar_root_self(), 0, handle_.get(), offset, size, + zx_status_t status = zx::vmar::root_self()->map( + 0, handle_, offset, size, ZX_VM_FLAG_PERM_READ | (write_allowed ? ZX_VM_FLAG_PERM_WRITE : 0), &addr); if (status != ZX_OK) { @@ -175,8 +175,8 @@ Mode mode, size_t size) { zx_info_handle_basic_t basic = {}; - zx_status_t status = zx_object_get_info(handle, ZX_INFO_HANDLE_BASIC, &basic, - sizeof(basic), nullptr, nullptr); + zx_status_t status = handle->get_info(ZX_INFO_HANDLE_BASIC, &basic, + sizeof(basic), nullptr, nullptr); if (status != ZX_OK) { ZX_DLOG(ERROR, status) << "zx_object_get_info"; return false;
diff --git a/base/memory/platform_shared_memory_region_unittest.cc b/base/memory/platform_shared_memory_region_unittest.cc index 042a78e..d04428f 100644 --- a/base/memory/platform_shared_memory_region_unittest.cc +++ b/base/memory/platform_shared_memory_region_unittest.cc
@@ -4,6 +4,7 @@ #include "base/memory/platform_shared_memory_region.h" +#include "base/logging.h" #include "base/memory/shared_memory.h" #include "base/memory/shared_memory_mapping.h" #include "base/process/process_metrics.h" @@ -15,6 +16,16 @@ #if defined(OS_MACOSX) && !defined(OS_IOS) #include <mach/mach_vm.h> +#include <sys/mman.h> +#elif defined(OS_POSIX) && !defined(OS_IOS) +#include <sys/mman.h> +#include "base/debug/proc_maps_linux.h" +#elif defined(OS_WIN) +#include <windows.h> +#elif defined(OS_FUCHSIA) +#include <lib/zx/object.h> +#include <lib/zx/process.h> +#include "base/fuchsia/fuchsia_logging.h" #endif namespace base { @@ -176,7 +187,8 @@ EXPECT_FALSE(mapping.IsValid()); } -#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) +#if defined(OS_POSIX) && !defined(OS_ANDROID) && \ + (!defined(OS_MACOSX) || defined(OS_IOS)) // Tests that the second handle is closed after a conversion to read-only on // POSIX. TEST_F(PlatformSharedMemoryRegionTest, @@ -201,27 +213,77 @@ } #endif +void CheckReadOnlyMapProtection(void* addr) { #if defined(OS_MACOSX) && !defined(OS_IOS) -// Tests that protection bits are set correctly for read-only region on MacOS. -TEST_F(PlatformSharedMemoryRegionTest, MapCurrentAndMaxProtectionSetCorrectly) { + vm_region_basic_info_64 basic_info; + mach_vm_size_t dummy_size = 0; + void* temp_addr = addr; + MachVMRegionResult result = GetBasicInfo( + mach_task_self(), &dummy_size, + reinterpret_cast<mach_vm_address_t*>(&temp_addr), &basic_info); + ASSERT_EQ(result, MachVMRegionResult::Success); + EXPECT_EQ(basic_info.protection & VM_PROT_ALL, VM_PROT_READ); + EXPECT_EQ(basic_info.max_protection & VM_PROT_ALL, VM_PROT_READ); +#elif defined(OS_POSIX) && !defined(OS_IOS) + std::string proc_maps; + ASSERT_TRUE(base::debug::ReadProcMaps(&proc_maps)); + std::vector<base::debug::MappedMemoryRegion> regions; + ASSERT_TRUE(base::debug::ParseProcMaps(proc_maps, ®ions)); + auto it = + std::find_if(regions.begin(), regions.end(), + [addr](const base::debug::MappedMemoryRegion& region) { + return region.start == reinterpret_cast<uintptr_t>(addr); + }); + ASSERT_TRUE(it != regions.end()); + EXPECT_EQ(it->permissions, base::debug::MappedMemoryRegion::READ); +#elif defined(OS_WIN) + MEMORY_BASIC_INFORMATION memory_info; + size_t result = VirtualQueryEx(GetCurrentProcess(), addr, &memory_info, + sizeof(memory_info)); + + ASSERT_GT(result, 0ULL) << "Failed executing VirtualQueryEx " + << logging::SystemErrorCodeToString( + logging::GetLastSystemErrorCode()); + EXPECT_EQ(memory_info.AllocationProtect, static_cast<DWORD>(PAGE_READONLY)); + EXPECT_EQ(memory_info.Protect, static_cast<DWORD>(PAGE_READONLY)); +#elif defined(OS_FUCHSIA) +// TODO(alexilin): We cannot call zx_object_get_info ZX_INFO_PROCESS_MAPS in +// this process. Consider to create an auxiliary process that will read the +// test process maps. +#endif +} + +bool TryToRestoreWritablePermissions(void* addr, size_t len) { +#if defined(OS_POSIX) && !defined(OS_IOS) + int result = mprotect(addr, len, PROT_READ | PROT_WRITE); + return result != -1; +#elif defined(OS_WIN) + DWORD old_protection; + return VirtualProtect(addr, len, PAGE_READWRITE, &old_protection); +#elif defined(OS_FUCHSIA) + zx_status_t status = zx::vmar::root_self()->protect( + reinterpret_cast<uintptr_t>(addr), len, + ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE); + return status == ZX_OK; +#else + return false; +#endif +} + +// Tests that protection bits are set correctly for read-only region. +TEST_F(PlatformSharedMemoryRegionTest, DISABLED_MappingProtectionSetCorrectly) { PlatformSharedMemoryRegion region = PlatformSharedMemoryRegion::CreateWritable(kRegionSize); ASSERT_TRUE(region.IsValid()); ASSERT_TRUE(region.ConvertToReadOnly()); WritableSharedMemoryMapping ro_mapping = MapForTesting(®ion); ASSERT_TRUE(ro_mapping.IsValid()); + CheckReadOnlyMapProtection(ro_mapping.memory()); - vm_region_basic_info_64 basic_info; - mach_vm_size_t dummy_size = 0; - void* temp_addr = ro_mapping.memory(); - MachVMRegionResult result = GetBasicInfo( - mach_task_self(), &dummy_size, - reinterpret_cast<mach_vm_address_t*>(&temp_addr), &basic_info); - EXPECT_EQ(result, MachVMRegionResult::Success); - EXPECT_EQ(basic_info.protection & VM_PROT_ALL, VM_PROT_READ); - EXPECT_EQ(basic_info.max_protection & VM_PROT_ALL, VM_PROT_READ); + EXPECT_FALSE(TryToRestoreWritablePermissions(ro_mapping.memory(), + ro_mapping.mapped_size())); + CheckReadOnlyMapProtection(ro_mapping.memory()); } -#endif // Tests that platform handle permissions are checked correctly. TEST_F(PlatformSharedMemoryRegionTest,
diff --git a/base/memory/shared_memory_mapping.cc b/base/memory/shared_memory_mapping.cc index 005e3fc..2b20ff2 100644 --- a/base/memory/shared_memory_mapping.cc +++ b/base/memory/shared_memory_mapping.cc
@@ -25,9 +25,8 @@ #endif #if defined(OS_FUCHSIA) -#include <zircon/process.h> -#include <zircon/status.h> -#include <zircon/syscalls.h> +#include <lib/zx/vmar.h> +#include "base/fuchsia/fuchsia_logging.h" #endif namespace base { @@ -75,9 +74,9 @@ DPLOG(ERROR) << "UnmapViewOfFile"; #elif defined(OS_FUCHSIA) uintptr_t addr = reinterpret_cast<uintptr_t>(memory_); - zx_status_t status = zx_vmar_unmap(zx_vmar_root_self(), addr, size_); - DLOG_IF(ERROR, status != ZX_OK) - << "zx_vmar_unmap failed: " << zx_status_get_string(status); + zx_status_t status = zx::vmar::root_self()->unmap(addr, size_); + if (status != ZX_OK) + ZX_DLOG(ERROR, status) << "zx_vmar_unmap"; #elif defined(OS_MACOSX) && !defined(OS_IOS) kern_return_t kr = mach_vm_deallocate( mach_task_self(), reinterpret_cast<mach_vm_address_t>(memory_), size_);
diff --git a/base/memory/shared_memory_win.cc b/base/memory/shared_memory_win.cc index cf06dd3..75497ca 100644 --- a/base/memory/shared_memory_win.cc +++ b/base/memory/shared_memory_win.cc
@@ -17,6 +17,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/unguessable_token.h" +#include "base/win/windows_version.h" namespace base { namespace { @@ -218,17 +219,22 @@ return false; } - // Windows ignores DACLs on certain unnamed objects (like shared sections). - // So, we generate a random name when we need to enforce read-only. - uint64_t rand_values[4]; - RandBytes(&rand_values, sizeof(rand_values)); - name_ = StringPrintf(L"CrSharedMem_%016llx%016llx%016llx%016llx", - rand_values[0], rand_values[1], - rand_values[2], rand_values[3]); + if (base::win::GetVersion() < base::win::VERSION_WIN8_1) { + // Windows < 8.1 ignores DACLs on certain unnamed objects (like shared + // sections). So, we generate a random name when we need to enforce + // read-only. + uint64_t rand_values[4]; + RandBytes(&rand_values, sizeof(rand_values)); + name_ = StringPrintf(L"CrSharedMem_%016llx%016llx%016llx%016llx", + rand_values[0], rand_values[1], rand_values[2], + rand_values[3]); + DCHECK(!name_.empty()); + } } - DCHECK(!name_.empty()); + shm_ = SharedMemoryHandle( - CreateFileMappingWithReducedPermissions(&sa, rounded_size, name_.c_str()), + CreateFileMappingWithReducedPermissions( + &sa, rounded_size, name_.empty() ? nullptr : name_.c_str()), rounded_size, UnguessableToken::Create()); if (!shm_.IsValid()) { // The error is logged within CreateFileMappingWithReducedPermissions().
diff --git a/base/strings/old_utf_string_conversions.cc b/base/strings/old_utf_string_conversions.cc deleted file mode 100644 index 5cab038a..0000000 --- a/base/strings/old_utf_string_conversions.cc +++ /dev/null
@@ -1,262 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/strings/old_utf_string_conversions.h" - -#include <stdint.h> - -#include "base/strings/string_piece.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversion_utils.h" -#include "build/build_config.h" - -namespace base_old { - -using base::IsStringASCII; -using base::ReadUnicodeCharacter; -using base::WriteUnicodeCharacter; - -template<typename CHAR> -void PrepareForUTF8Output(const CHAR* src, - size_t src_len, - std::string* output) { - output->clear(); - if (src_len == 0) - return; - if (src[0] < 0x80) { - // Assume that the entire input will be ASCII. - output->reserve(src_len); - } else { - // Assume that the entire input is non-ASCII and will have 3 bytes per char. - output->reserve(src_len * 3); - } -} - -template<typename STRING> -void PrepareForUTF16Or32Output(const char* src, - size_t src_len, - STRING* output) { - output->clear(); - if (src_len == 0) - return; - if (static_cast<unsigned char>(src[0]) < 0x80) { - // Assume the input is all ASCII, which means 1:1 correspondence. - output->reserve(src_len); - } else { - // Otherwise assume that the UTF-8 sequences will have 2 bytes for each - // character. - output->reserve(src_len / 2); - } -} - -namespace { - -// Generalized Unicode converter ----------------------------------------------- - -// Converts the given source Unicode character type to the given destination -// Unicode character type as a STL string. The given input buffer and size -// determine the source, and the given output STL string will be replaced by -// the result. -template <typename SRC_CHAR, typename DEST_STRING> -bool ConvertUnicode(const SRC_CHAR* src, size_t src_len, DEST_STRING* output) { - // ICU requires 32-bit numbers. - bool success = true; - int32_t src_len32 = static_cast<int32_t>(src_len); - for (int32_t i = 0; i < src_len32; i++) { - uint32_t code_point; - if (ReadUnicodeCharacter(src, src_len32, &i, &code_point)) { - WriteUnicodeCharacter(code_point, output); - } else { - WriteUnicodeCharacter(0xFFFD, output); - success = false; - } - } - - return success; -} - -} // namespace - -// UTF-8 <-> Wide -------------------------------------------------------------- - -bool WideToUTF8(const wchar_t* src, size_t src_len, std::string* output) { - if (IsStringASCII(std::wstring(src, src_len))) { - output->assign(src, src + src_len); - return true; - } else { - PrepareForUTF8Output(src, src_len, output); - return ConvertUnicode(src, src_len, output); - } -} - -std::string WideToUTF8(const std::wstring& wide) { - if (IsStringASCII(wide)) { - return std::string(wide.data(), wide.data() + wide.length()); - } - - std::string ret; - PrepareForUTF8Output(wide.data(), wide.length(), &ret); - ConvertUnicode(wide.data(), wide.length(), &ret); - return ret; -} - -bool UTF8ToWide(const char* src, size_t src_len, std::wstring* output) { - if (IsStringASCII(StringPiece(src, src_len))) { - output->assign(src, src + src_len); - return true; - } else { - PrepareForUTF16Or32Output(src, src_len, output); - return ConvertUnicode(src, src_len, output); - } -} - -std::wstring UTF8ToWide(StringPiece utf8) { - if (IsStringASCII(utf8)) { - return std::wstring(utf8.begin(), utf8.end()); - } - - std::wstring ret; - PrepareForUTF16Or32Output(utf8.data(), utf8.length(), &ret); - ConvertUnicode(utf8.data(), utf8.length(), &ret); - return ret; -} - -// UTF-16 <-> Wide ------------------------------------------------------------- - -#if defined(WCHAR_T_IS_UTF16) - -// When wide == UTF-16, then conversions are a NOP. -bool WideToUTF16(const wchar_t* src, size_t src_len, string16* output) { - output->assign(src, src_len); - return true; -} - -string16 WideToUTF16(const std::wstring& wide) { - return wide; -} - -bool UTF16ToWide(const char16* src, size_t src_len, std::wstring* output) { - output->assign(src, src_len); - return true; -} - -std::wstring UTF16ToWide(const string16& utf16) { - return utf16; -} - -#elif defined(WCHAR_T_IS_UTF32) - -bool WideToUTF16(const wchar_t* src, size_t src_len, string16* output) { - output->clear(); - // Assume that normally we won't have any non-BMP characters so the counts - // will be the same. - output->reserve(src_len); - return ConvertUnicode(src, src_len, output); -} - -string16 WideToUTF16(const std::wstring& wide) { - string16 ret; - WideToUTF16(wide.data(), wide.length(), &ret); - return ret; -} - -bool UTF16ToWide(const char16* src, size_t src_len, std::wstring* output) { - output->clear(); - // Assume that normally we won't have any non-BMP characters so the counts - // will be the same. - output->reserve(src_len); - return ConvertUnicode(src, src_len, output); -} - -std::wstring UTF16ToWide(const string16& utf16) { - std::wstring ret; - UTF16ToWide(utf16.data(), utf16.length(), &ret); - return ret; -} - -#endif // defined(WCHAR_T_IS_UTF32) - -// UTF16 <-> UTF8 -------------------------------------------------------------- - -#if defined(WCHAR_T_IS_UTF32) - -bool UTF8ToUTF16(const char* src, size_t src_len, string16* output) { - if (IsStringASCII(StringPiece(src, src_len))) { - output->assign(src, src + src_len); - return true; - } else { - PrepareForUTF16Or32Output(src, src_len, output); - return ConvertUnicode(src, src_len, output); - } -} - -string16 UTF8ToUTF16(StringPiece utf8) { - if (IsStringASCII(utf8)) { - return string16(utf8.begin(), utf8.end()); - } - - string16 ret; - PrepareForUTF16Or32Output(utf8.data(), utf8.length(), &ret); - // Ignore the success flag of this call, it will do the best it can for - // invalid input, which is what we want here. - ConvertUnicode(utf8.data(), utf8.length(), &ret); - return ret; -} - -bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output) { - if (IsStringASCII(StringPiece16(src, src_len))) { - output->assign(src, src + src_len); - return true; - } else { - PrepareForUTF8Output(src, src_len, output); - return ConvertUnicode(src, src_len, output); - } -} - -std::string UTF16ToUTF8(StringPiece16 utf16) { - std::string ret; - // Ignore the success flag of this call, it will do the best it can for - // invalid input, which is what we want here. - UTF16ToUTF8(utf16.data(), utf16.length(), &ret); - return ret; -} - -#elif defined(WCHAR_T_IS_UTF16) -// Easy case since we can use the "wide" versions we already wrote above. - -bool UTF8ToUTF16(const char* src, size_t src_len, string16* output) { - return UTF8ToWide(src, src_len, output); -} - -string16 UTF8ToUTF16(StringPiece utf8) { - return UTF8ToWide(utf8); -} - -bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output) { - return WideToUTF8(src, src_len, output); -} - -std::string UTF16ToUTF8(StringPiece16 utf16) { - if (IsStringASCII(utf16)) - return std::string(utf16.data(), utf16.data() + utf16.length()); - - std::string ret; - PrepareForUTF8Output(utf16.data(), utf16.length(), &ret); - ConvertUnicode(utf16.data(), utf16.length(), &ret); - return ret; -} - -#endif - -string16 ASCIIToUTF16(StringPiece ascii) { - DCHECK(IsStringASCII(ascii)) << ascii; - return string16(ascii.begin(), ascii.end()); -} - -std::string UTF16ToASCII(StringPiece16 utf16) { - DCHECK(IsStringASCII(utf16)) << UTF16ToUTF8(utf16); - return std::string(utf16.begin(), utf16.end()); -} - -} // namespace base_old
diff --git a/base/strings/old_utf_string_conversions.h b/base/strings/old_utf_string_conversions.h deleted file mode 100644 index 2f0c6c5..0000000 --- a/base/strings/old_utf_string_conversions.h +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright (c) 2011 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 BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_ -#define BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_ - -#include <stddef.h> - -#include <string> - -#include "base/base_export.h" -#include "base/strings/string16.h" -#include "base/strings/string_piece.h" - -namespace base_old { - -using base::char16; -using base::string16; -using base::StringPiece16; -using base::StringPiece; - -// These convert between UTF-8, -16, and -32 strings. They are potentially slow, -// so avoid unnecessary conversions. The low-level versions return a boolean -// indicating whether the conversion was 100% valid. In this case, it will still -// do the best it can and put the result in the output buffer. The versions that -// return strings ignore this error and just return the best conversion -// possible. -BASE_EXPORT bool WideToUTF8(const wchar_t* src, - size_t src_len, - std::string* output); -BASE_EXPORT std::string WideToUTF8(const std::wstring& wide); -BASE_EXPORT bool UTF8ToWide(const char* src, - size_t src_len, - std::wstring* output); -BASE_EXPORT std::wstring UTF8ToWide(StringPiece utf8); - -BASE_EXPORT bool WideToUTF16(const wchar_t* src, - size_t src_len, - string16* output); -BASE_EXPORT string16 WideToUTF16(const std::wstring& wide); -BASE_EXPORT bool UTF16ToWide(const char16* src, - size_t src_len, - std::wstring* output); -BASE_EXPORT std::wstring UTF16ToWide(const string16& utf16); - -BASE_EXPORT bool UTF8ToUTF16(const char* src, size_t src_len, string16* output); -BASE_EXPORT string16 UTF8ToUTF16(StringPiece utf8); -BASE_EXPORT bool UTF16ToUTF8(const char16* src, - size_t src_len, - std::string* output); -BASE_EXPORT std::string UTF16ToUTF8(StringPiece16 utf16); - -// This converts an ASCII string, typically a hardcoded constant, to a UTF16 -// string. -BASE_EXPORT string16 ASCIIToUTF16(StringPiece ascii); - -// Converts to 7-bit ASCII by truncating. The result must be known to be ASCII -// beforehand. -BASE_EXPORT std::string UTF16ToASCII(StringPiece16 utf16); - -} // namespace base_old - -#endif // BASE_STRINGS_OLD_UTF_STRING_CONVERSIONS_H_
diff --git a/base/strings/utf_string_conversions_regression_fuzzer.cc b/base/strings/utf_string_conversions_regression_fuzzer.cc deleted file mode 100644 index ca6b4a27..0000000 --- a/base/strings/utf_string_conversions_regression_fuzzer.cc +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright (c) 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 "base/logging.h" -#include "base/strings/old_utf_string_conversions.h" -#include "base/strings/utf_string_conversions.h" - -namespace { - -void UTF8ToCheck(const uint8_t* data, size_t size) { - const auto* src = reinterpret_cast<const char*>(data); - const size_t src_len = size; - - // UTF16 - { - base::string16 new_out; - bool new_res = base::UTF8ToUTF16(src, src_len, &new_out); - - base::string16 old_out; - bool old_res = base_old::UTF8ToUTF16(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } - - // Wide - { - std::wstring new_out; - bool new_res = base::UTF8ToWide(src, src_len, &new_out); - - std::wstring old_out; - bool old_res = base_old::UTF8ToWide(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } -} - -void UTF16ToCheck(const uint8_t* data, size_t size) { - const auto* src = reinterpret_cast<const base::char16*>(data); - const size_t src_len = size / 2; - - // UTF8 - { - std::string new_out; - bool new_res = base::UTF16ToUTF8(src, src_len, &new_out); - - std::string old_out; - bool old_res = base_old::UTF16ToUTF8(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } - - // Wide - { - std::wstring new_out; - bool new_res = base::UTF16ToWide(src, src_len, &new_out); - - std::wstring old_out; - bool old_res = base_old::UTF16ToWide(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } -} - -void WideToCheck(const uint8_t* data, size_t size) { - const auto* src = reinterpret_cast<const wchar_t*>(data); - const size_t src_len = size / 4; // It's OK even if Wide is 16bit. - - // UTF8 - { - std::string new_out; - bool new_res = base::WideToUTF8(src, src_len, &new_out); - - std::string old_out; - bool old_res = base_old::WideToUTF8(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } - - // UTF16 - { - base::string16 new_out; - bool new_res = base::WideToUTF16(src, src_len, &new_out); - - base::string16 old_out; - bool old_res = base_old::WideToUTF16(src, src_len, &old_out); - - CHECK(new_res == old_res); - CHECK(new_out == old_out); - } -} - -} // namespace - -extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - UTF8ToCheck(data, size); - UTF16ToCheck(data, size); - WideToCheck(data, size); - return 0; -}
diff --git a/base/sys_info.h b/base/sys_info.h index 8cd912a..91bbab24 100644 --- a/base/sys_info.h +++ b/base/sys_info.h
@@ -71,8 +71,8 @@ // Returns a descriptive string for the current machine model or an empty // string if the machine model is unknown or an error occurred. // e.g. "MacPro1,1" on Mac, "iPhone9,3" on iOS or "Nexus 5" on Android. Only - // implemented on OS X, iOS, Android, and Chrome OS. This returns an empty - // string on other platforms. + // implemented on OS X, iOS, and Android. This returns an empty string on + // other platforms. static std::string HardwareModelName(); struct HardwareInfo {
diff --git a/base/task/post_task_unittest.cc b/base/task/post_task_unittest.cc index 37876de..d65fe68 100644 --- a/base/task/post_task_unittest.cc +++ b/base/task/post_task_unittest.cc
@@ -187,7 +187,13 @@ } } -TEST_F(PostTaskTestWithExecutor, RegisterExecutorTwice) { +// Flaky on CrOS (https://crbug.com/879984). +#if defined(OS_CHROMEOS) +#define MAYBE_RegisterExecutorTwice DISABLED_RegisterExecutorTwice +#else +#define MAYBE_RegisterExecutorTwice RegisterExecutorTwice +#endif +TEST_F(PostTaskTestWithExecutor, MAYBE_RegisterExecutorTwice) { EXPECT_DCHECK_DEATH( RegisterTaskExecutor(TestTaskTraitsExtension::kExtensionId, &executor_)); }
diff --git a/base/task/sequence_manager/thread_controller_impl.cc b/base/task/sequence_manager/thread_controller_impl.cc index 230e5a9..7039471 100644 --- a/base/task/sequence_manager/thread_controller_impl.cc +++ b/base/task/sequence_manager/thread_controller_impl.cc
@@ -175,6 +175,9 @@ { TRACE_TASK_EXECUTION("ThreadControllerImpl::RunTask", *task); + // Trace-parsing tools (Lighthouse, etc) consume this event to determine + // long tasks. See https://crbug.com/874982 + TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("lighthouse"), "RunTask"); task_annotator_.RunTask("ThreadControllerImpl::RunTask", &*task); }
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java index d0b1850b..227d31f 100644 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java +++ b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java
@@ -118,7 +118,7 @@ @GuardedBy("mConnectedLock") private boolean mConnected; - private IChildProcessService mService = null; + private IChildProcessService mService; private int mPid; private ITestController mTestController;
diff --git a/base/test/test_shared_memory_util.cc b/base/test/test_shared_memory_util.cc index 7c11dc9e..b1364b6 100644 --- a/base/test/test_shared_memory_util.cc +++ b/base/test/test_shared_memory_util.cc
@@ -20,9 +20,8 @@ #endif #if defined(OS_FUCHSIA) -#include <zircon/process.h> +#include <lib/zx/vmar.h> #include <zircon/rights.h> -#include <zircon/syscalls.h> #endif #if defined(OS_MACOSX) && !defined(OS_IOS) @@ -67,19 +66,18 @@ } return true; } -#endif // OS_POSIX && !OS_FUCHSIA +#endif // OS_POSIX #if defined(OS_FUCHSIA) // Fuchsia specific implementation. -bool CheckReadOnlySharedMemoryFuchsiaHandle(zx_handle_t handle) { +bool CheckReadOnlySharedMemoryFuchsiaHandle(zx::unowned_vmo handle) { const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE; uintptr_t addr; - const zx_handle_t root = zx_vmar_root_self(); const zx_status_t status = - zx_vmar_map_old(root, 0, handle, 0U, kDataSize, flags, &addr); + zx::vmar::root_self()->map(0, *handle, 0U, kDataSize, flags, &addr); if (status == ZX_OK) { LOG(ERROR) << "zx_vmar_map() should have failed!"; - zx_vmar_unmap(root, addr, kDataSize); + zx::vmar::root_self()->unmap(addr, kDataSize); return false; } if (status != ZX_ERR_ACCESS_DENIED) { @@ -126,7 +124,8 @@ else return CheckReadOnlySharedMemoryMachPort(handle.memory_object_); #elif defined(OS_FUCHSIA) - return CheckReadOnlySharedMemoryFuchsiaHandle(handle.GetHandle()); + return CheckReadOnlySharedMemoryFuchsiaHandle( + zx::unowned_vmo(handle.GetHandle())); #elif defined(OS_WIN) return CheckReadOnlySharedMemoryWindowsHandle(handle.GetHandle()); #else
diff --git a/base/trace_event/memory_infra_background_whitelist.cc b/base/trace_event/memory_infra_background_whitelist.cc index 2fa5f74..0a784b8 100644 --- a/base/trace_event/memory_infra_background_whitelist.cc +++ b/base/trace_event/memory_infra_background_whitelist.cc
@@ -261,19 +261,44 @@ "sqlite", "ui/resource_manager_0x?/default_resource/0x?", "ui/resource_manager_0x?/tinted_resource", - "v8/isolate_0x?/contexts/detached_context", - "v8/isolate_0x?/contexts/native_context", - "v8/isolate_0x?/heap_spaces", - "v8/isolate_0x?/heap_spaces/code_space", - "v8/isolate_0x?/heap_spaces/large_object_space", - "v8/isolate_0x?/heap_spaces/map_space", - "v8/isolate_0x?/heap_spaces/new_space", - "v8/isolate_0x?/heap_spaces/new_large_object_space", - "v8/isolate_0x?/heap_spaces/old_space", - "v8/isolate_0x?/heap_spaces/read_only_space", - "v8/isolate_0x?/malloc", - "v8/isolate_0x?/zapped_for_debug", "site_storage/blob_storage/0x?", + "v8/main/code_stats", + "v8/main/contexts/detached_context", + "v8/main/contexts/native_context", + "v8/main/heap/code_space", + "v8/main/heap/code_stats", + "v8/main/heap/large_object_space", + "v8/main/heap/map_space", + "v8/main/heap/new_large_object_space", + "v8/main/heap/new_space", + "v8/main/heap/old_space", + "v8/main/heap/read_only_space", + "v8/main/malloc", + "v8/main/zapped_for_debug", + "v8/utility/code_stats", + "v8/utility/contexts/detached_context", + "v8/utility/contexts/native_context", + "v8/utility/heap/code_space", + "v8/utility/heap/large_object_space", + "v8/utility/heap/map_space", + "v8/utility/heap/new_large_object_space", + "v8/utility/heap/new_space", + "v8/utility/heap/old_space", + "v8/utility/heap/read_only_space", + "v8/utility/malloc", + "v8/utility/zapped_for_debug", + "v8/workers/code_stats/isolate_0x?", + "v8/workers/contexts/detached_context/isolate_0x?", + "v8/workers/contexts/native_context/isolate_0x?", + "v8/workers/heap/code_space/isolate_0x?", + "v8/workers/heap/large_object_space/isolate_0x?", + "v8/workers/heap/map_space/isolate_0x?", + "v8/workers/heap/new_large_object_space/isolate_0x?", + "v8/workers/heap/new_space/isolate_0x?", + "v8/workers/heap/old_space/isolate_0x?", + "v8/workers/heap/read_only_space/isolate_0x?", + "v8/workers/malloc/isolate_0x?", + "v8/workers/zapped_for_debug/isolate_0x?", "site_storage/index_db/db_0x?", "site_storage/index_db/memenv_0x?", "site_storage/localstorage/0x?/cache_size",
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc index a712c12..b3347f85 100644 --- a/base/trace_event/trace_log.cc +++ b/base/trace_event/trace_log.cc
@@ -357,7 +357,10 @@ void TraceLog::ResetForTesting() { if (!g_trace_log_for_testing) return; - CategoryRegistry::ResetForTesting(); + { + AutoLock lock(g_trace_log_for_testing->lock_); + CategoryRegistry::ResetForTesting(); + } g_trace_log_for_testing->~TraceLog(); new (g_trace_log_for_testing) TraceLog; }
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index f6c9ab4..582a9ff 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn
@@ -60,6 +60,9 @@ _data += "android_secondary_abi_toolchain=" + rebase_path(_secondary_label_info, root_build_dir) + CR } + if (defined(build_apk_secondary_abi)) { + _data += "build_apk_secondary_abi=$build_apk_secondary_abi" + CR + } write_file(android_build_vars, _data) }
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py index 0e1aad00..e23ac3c 100755 --- a/build/android/gyp/javac.py +++ b/build/android/gyp/javac.py
@@ -85,6 +85,9 @@ 'OverrideThrowableToString', # Nice to have better type safety. 'CollectionToArraySafeParameter', + # Makes logcat debugging more difficult, and does not provide obvious + # benefits in the Chromium codebase. + 'ObjectToString', ] ERRORPRONE_WARNINGS_TO_ERROR = [
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py index d87a8e2..74b6342 100755 --- a/build/android/resource_sizes.py +++ b/build/android/resource_sizes.py
@@ -14,6 +14,7 @@ import json import logging import os +import posixpath import re import struct import sys @@ -380,7 +381,8 @@ if filename.endswith('/'): continue if filename.endswith('.so'): - should_extract_lib = not (skip_extract_lib or 'crazy' in filename) + basename = posixpath.basename(filename) + should_extract_lib = not skip_extract_lib and basename.startswith('lib') native_code.AddZipInfo( member, extracted_multiplier=int(should_extract_lib)) elif filename.endswith('.dex'):
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 7f44a34..25a320d 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2171,6 +2171,11 @@ ":$_merge_manifest_target", ":$_build_config_target", ] + if (defined(invoker.alternative_android_sdk_dep)) { + deps += [ invoker.alternative_android_sdk_dep ] + } else { + deps += [ "//third_party/android_tools:android_sdk_java" ] + } if (defined(invoker.shared_resources_whitelist_target)) { _whitelist_gen_dir = get_label_info(invoker.shared_resources_whitelist_target,
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 29f243c..d586ebc 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1787,10 +1787,12 @@ if (is_clang) { cflags = [ "-Wno-shorten-64-to-32" ] } else { - # MSVC does not have an explicit warning equivalent to - # -Wshorten-64-to-32 but 4267 warns for size_t -> int - # on 64-bit builds, so is the closest. - cflags = [ "/wd4267" ] + if (is_win) { + # MSVC does not have an explicit warning equivalent to + # -Wshorten-64-to-32 but 4267 warns for size_t -> int + # on 64-bit builds, so is the closest. + cflags = [ "/wd4267" ] + } } } }
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni index c9dff44..5f689e8 100644 --- a/build/config/ios/ios_sdk.gni +++ b/build/config/ios/ios_sdk.gni
@@ -165,5 +165,3 @@ } } } - -assert(xcode_version_int >= 1000, "Xcode 10 is required.")
diff --git a/build/detect_host_arch.py b/build/detect_host_arch.py index 0e491bc..1c13aa6 100755 --- a/build/detect_host_arch.py +++ b/build/detect_host_arch.py
@@ -23,6 +23,8 @@ host_arch = 'arm' elif host_arch.startswith('aarch64'): host_arch = 'arm64' + elif host_arch.startswith('mips64'): + host_arch = 'mips64' elif host_arch.startswith('mips'): host_arch = 'mips' elif host_arch.startswith('ppc'):
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index abed31d4..ed918b5a 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -c0d648376520e0745f77bc396d6c6209f04ab109 \ No newline at end of file +67b3be457e9c7eadbf520f8b5ac7ddf14b0099c4 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 6366931..93cb4e4 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -cc76fdce4c3d1b61db2e860c38ba6faba7708ad4 \ No newline at end of file +547ec104560d59cecaeaac6b3be268dff4482ee0 \ No newline at end of file
diff --git a/cc/layers/heads_up_display_layer.cc b/cc/layers/heads_up_display_layer.cc index a07431e..e8cd983 100644 --- a/cc/layers/heads_up_display_layer.cc +++ b/cc/layers/heads_up_display_layer.cc
@@ -8,8 +8,6 @@ #include "base/trace_event/trace_event.h" #include "cc/layers/heads_up_display_layer_impl.h" -#include "cc/trees/layer_tree_host.h" -#include "cc/trees/layer_tree_settings.h" namespace cc { @@ -29,28 +27,6 @@ HeadsUpDisplayLayer::~HeadsUpDisplayLayer() = default; -void HeadsUpDisplayLayer::PrepareForCalculateDrawProperties( - const gfx::Size& device_viewport, float device_scale_factor) { - gfx::Size device_viewport_in_layout_pixels = gfx::Size( - device_viewport.width() / device_scale_factor, - device_viewport.height() / device_scale_factor); - - gfx::Size bounds; - gfx::Transform matrix; - matrix.MakeIdentity(); - - if (layer_tree_host()->GetDebugState().ShowHudRects()) { - bounds = device_viewport_in_layout_pixels; - } else { - int size = 256; - bounds.SetSize(size, size); - matrix.Translate(device_viewport_in_layout_pixels.width() - size, 0.0); - } - - SetBounds(bounds); - SetTransform(matrix); -} - bool HeadsUpDisplayLayer::HasDrawableContent() const { return true; }
diff --git a/cc/layers/heads_up_display_layer.h b/cc/layers/heads_up_display_layer.h index 4cb2946..ee3402e 100644 --- a/cc/layers/heads_up_display_layer.h +++ b/cc/layers/heads_up_display_layer.h
@@ -20,9 +20,6 @@ public: static scoped_refptr<HeadsUpDisplayLayer> Create(); - void PrepareForCalculateDrawProperties( - const gfx::Size& device_viewport, float device_scale_factor); - std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; // Layer overrides.
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc index d8c5f96..ee9da0a 100644 --- a/cc/layers/layer_unittest.cc +++ b/cc/layers/layer_unittest.cc
@@ -106,8 +106,8 @@ class MockLayerTreeHost : public LayerTreeHost { public: MockLayerTreeHost(LayerTreeHostSingleThreadClient* single_thread_client, - LayerTreeHost::InitParams* params) - : LayerTreeHost(params, CompositorMode::SINGLE_THREADED) { + LayerTreeHost::InitParams params) + : LayerTreeHost(std::move(params), CompositorMode::SINGLE_THREADED) { InitializeSingleThreaded(single_thread_client, base::ThreadTaskRunnerHandle::Get()); } @@ -146,8 +146,8 @@ params.task_graph_runner = &task_graph_runner_; params.mutator_host = animation_host_.get(); - layer_tree_host_.reset( - new StrictMock<MockLayerTreeHost>(&single_thread_client_, ¶ms)); + layer_tree_host_.reset(new StrictMock<MockLayerTreeHost>( + &single_thread_client_, std::move(params))); } void TearDown() override { @@ -1064,7 +1064,8 @@ params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params.mutator_host = mutator_host; - return LayerTreeHost::CreateSingleThreaded(&single_thread_client_, ¶ms); + return LayerTreeHost::CreateSingleThreaded(&single_thread_client_, + std::move(params)); } private:
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc index 7f2661cb..40772076 100644 --- a/cc/layers/picture_layer_unittest.cc +++ b/cc/layers/picture_layer_unittest.cc
@@ -327,8 +327,8 @@ params.task_graph_runner = &task_graph_runner; params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params.mutator_host = animation_host.get(); - std::unique_ptr<LayerTreeHost> host1 = - LayerTreeHost::CreateSingleThreaded(&single_thread_client, ¶ms); + std::unique_ptr<LayerTreeHost> host1 = LayerTreeHost::CreateSingleThreaded( + &single_thread_client, std::move(params)); host1->SetVisible(true); host_client1.SetLayerTreeHost(host1.get()); @@ -341,8 +341,8 @@ params2.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params2.client = &host_client2; params2.mutator_host = animation_host2.get(); - std::unique_ptr<LayerTreeHost> host2 = - LayerTreeHost::CreateSingleThreaded(&single_thread_client, ¶ms2); + std::unique_ptr<LayerTreeHost> host2 = LayerTreeHost::CreateSingleThreaded( + &single_thread_client, std::move(params2)); host2->SetVisible(true); host_client2.SetLayerTreeHost(host2.get()); @@ -399,8 +399,8 @@ params.task_graph_runner = &task_graph_runner; params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params.mutator_host = animation_host.get(); - std::unique_ptr<LayerTreeHost> host1 = - LayerTreeHost::CreateSingleThreaded(&single_thread_client, ¶ms); + std::unique_ptr<LayerTreeHost> host1 = LayerTreeHost::CreateSingleThreaded( + &single_thread_client, std::move(params)); host1->SetVisible(true); host_client1.SetLayerTreeHost(host1.get()); @@ -413,8 +413,8 @@ params2.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params2.client = &host_client2; params2.mutator_host = animation_host2.get(); - std::unique_ptr<LayerTreeHost> host2 = - LayerTreeHost::CreateSingleThreaded(&single_thread_client, ¶ms2); + std::unique_ptr<LayerTreeHost> host2 = LayerTreeHost::CreateSingleThreaded( + &single_thread_client, std::move(params2)); host2->SetVisible(true); host_client2.SetLayerTreeHost(host2.get());
diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc index f903632..63ffe595 100644 --- a/cc/layers/scrollbar_layer_unittest.cc +++ b/cc/layers/scrollbar_layer_unittest.cc
@@ -125,8 +125,8 @@ std::make_unique<FakeResourceTrackingUIResourceManager>(); fake_ui_resource_manager_ = fake_ui_resource_manager.get(); - layer_tree_host_.reset(new FakeLayerTreeHost( - &fake_client_, ¶ms, CompositorMode::SINGLE_THREADED)); + layer_tree_host_ = std::make_unique<FakeLayerTreeHost>( + &fake_client_, std::move(params), CompositorMode::SINGLE_THREADED); layer_tree_host_->SetUIResourceManagerForTesting( std::move(fake_ui_resource_manager)); layer_tree_host_->InitializeSingleThreaded(
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index 66656e3e..88b1b63 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc
@@ -83,7 +83,7 @@ params.mutator_host = mutator_host; LayerTreeSettings settings; params.settings = &settings; - return base::WrapUnique(new MockLayerTreeHost(¶ms)); + return base::WrapUnique(new MockLayerTreeHost(std::move(params))); } MOCK_METHOD0(SetNeedsCommit, void()); @@ -91,8 +91,8 @@ MOCK_METHOD0(StopRateLimiter, void()); private: - explicit MockLayerTreeHost(LayerTreeHost::InitParams* params) - : LayerTreeHost(params, CompositorMode::SINGLE_THREADED) { + explicit MockLayerTreeHost(LayerTreeHost::InitParams params) + : LayerTreeHost(std::move(params), CompositorMode::SINGLE_THREADED) { InitializeSingleThreaded(&single_thread_client_, base::ThreadTaskRunnerHandle::Get()); } @@ -248,8 +248,8 @@ LayerTreeSettings settings; params.settings = &settings; params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); - auto host = - LayerTreeHost::CreateSingleThreaded(&single_thread_client, ¶ms); + auto host = LayerTreeHost::CreateSingleThreaded(&single_thread_client, + std::move(params)); client.SetLayerTreeHost(host.get()); client.SetUseSoftwareCompositing(!gpu);
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc index b675b05..87bdf98c 100644 --- a/cc/paint/paint_op_reader.cc +++ b/cc/paint/paint_op_reader.cc
@@ -82,6 +82,8 @@ size_t input_size, uint8_t* type, uint32_t* skip) { + if (input_size < 4) + return false; uint32_t first_word = reinterpret_cast<const volatile uint32_t*>(input)[0]; *type = static_cast<uint8_t>(first_word & 0xFF); *skip = first_word >> 8;
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 327e907..5de0fbaa 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -1123,9 +1123,6 @@ if (active_tree_needs_first_draw_) return true; - if (!needs_redraw_) - return false; - // This is used to prioritize impl-thread draws when the main thread isn't // producing anything, e.g., after an aborted commit. We also check that we // don't have a pending tree -- otherwise we should give it a chance to @@ -1135,7 +1132,7 @@ return true; // Prioritize impl-thread draws in ImplLatencyTakesPriority mode. - if (ImplLatencyTakesPriority()) + if (needs_redraw_ && ImplLatencyTakesPriority()) return true; return false;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index aa742f8..acd7b0c3 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -2649,5 +2649,27 @@ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::ACTIVATE_SYNC_TREE); } +TEST(SchedulerStateMachineTest, EarlyDeadlineAfterAbortedMainFrame) { + SchedulerSettings settings; + StateMachine state(settings); + + SET_UP_STATE(state); + state.SetNeedsRedraw(false); + state.SetNeedsBeginMainFrame(); + state.IssueNextBeginImplFrame(); + + // Use a late deadline after sending main frame and no impl side draw. + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); + EXPECT_EQ(state.CurrentBeginImplFrameDeadlineMode(), + SchedulerStateMachine::BeginImplFrameDeadlineMode::LATE); + + // Use an immediate deadline after aborting main frame and no impl side draw. + state.NotifyBeginMainFrameStarted(); + state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); + EXPECT_EQ(state.CurrentBeginImplFrameDeadlineMode(), + SchedulerStateMachine::BeginImplFrameDeadlineMode::IMMEDIATE); +} + } // namespace } // namespace cc
diff --git a/cc/test/fake_layer_tree_host.cc b/cc/test/fake_layer_tree_host.cc index 7492a62..bb74fc6 100644 --- a/cc/test/fake_layer_tree_host.cc +++ b/cc/test/fake_layer_tree_host.cc
@@ -15,13 +15,11 @@ namespace cc { FakeLayerTreeHost::FakeLayerTreeHost(FakeLayerTreeHostClient* client, - LayerTreeHost::InitParams* params, + LayerTreeHost::InitParams params, CompositorMode mode) - : LayerTreeHost(params, mode), + : LayerTreeHost(std::move(params), mode), client_(client), - host_impl_(*params->settings, - &task_runner_provider_, - params->task_graph_runner), + host_impl_(GetSettings(), &task_runner_provider_, task_graph_runner()), needs_commit_(false) { scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner = mode == CompositorMode::THREADED ? base::ThreadTaskRunnerHandle::Get() @@ -59,7 +57,8 @@ params.settings = &settings; params.task_graph_runner = task_graph_runner; params.mutator_host = mutator_host; - return base::WrapUnique(new FakeLayerTreeHost(client, ¶ms, mode)); + return base::WrapUnique( + new FakeLayerTreeHost(client, std::move(params), mode)); } FakeLayerTreeHost::~FakeLayerTreeHost() {
diff --git a/cc/test/fake_layer_tree_host.h b/cc/test/fake_layer_tree_host.h index 1492206..4ca1a50 100644 --- a/cc/test/fake_layer_tree_host.h +++ b/cc/test/fake_layer_tree_host.h
@@ -72,7 +72,7 @@ void reset_needs_commit() { needs_commit_ = false; } FakeLayerTreeHost(FakeLayerTreeHostClient* client, - LayerTreeHost::InitParams* params, + LayerTreeHost::InitParams params, CompositorMode mode); private:
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc index 833cc65..370762d 100644 --- a/cc/test/layer_tree_test.cc +++ b/cc/test/layer_tree_test.cc
@@ -512,8 +512,8 @@ params.image_worker_task_runner = std::move(image_worker_task_runner); params.ukm_recorder_factory = std::make_unique<TestUkmRecorderFactory>(); - std::unique_ptr<LayerTreeHostForTesting> layer_tree_host( - new LayerTreeHostForTesting(test_hooks, ¶ms, mode)); + auto layer_tree_host = base::WrapUnique( + new LayerTreeHostForTesting(test_hooks, std::move(params), mode)); std::unique_ptr<TaskRunnerProvider> task_runner_provider = TaskRunnerProvider::Create(main_task_runner, impl_task_runner); std::unique_ptr<Proxy> proxy; @@ -563,14 +563,12 @@ private: LayerTreeHostForTesting(TestHooks* test_hooks, - LayerTreeHost::InitParams* params, + LayerTreeHost::InitParams params, CompositorMode mode) - : LayerTreeHost(params, mode), - test_hooks_(test_hooks), - test_started_(false) {} + : LayerTreeHost(std::move(params), mode), test_hooks_(test_hooks) {} TestHooks* test_hooks_; - bool test_started_; + bool test_started_ = false; }; class LayerTreeTestLayerTreeFrameSinkClient @@ -733,10 +731,20 @@ main_thread_weak_ptr_)); } -void LayerTreeTest::PostSetDeferCommitsToMainThread(bool defer_commits) { +void LayerTreeTest::PostGetDeferCommitsToMainThread( + std::unique_ptr<ScopedDeferCommits>* scoped_defer_commits) { main_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&LayerTreeTest::DispatchSetDeferCommits, - main_thread_weak_ptr_, defer_commits)); + FROM_HERE, base::BindOnce(&LayerTreeTest::DispatchGetDeferCommits, + main_thread_weak_ptr_, + base::Unretained(scoped_defer_commits))); +} + +void LayerTreeTest::PostReturnDeferCommitsToMainThread( + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits) { + main_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&LayerTreeTest::DispatchReturnDeferCommits, + main_thread_weak_ptr_, std::move(scoped_defer_commits))); } void LayerTreeTest::PostSetNeedsCommitToMainThread() { @@ -928,10 +936,17 @@ layer_tree_host_->RequestNewLocalSurfaceId(); } -void LayerTreeTest::DispatchSetDeferCommits(bool defer_commits) { +void LayerTreeTest::DispatchGetDeferCommits( + std::unique_ptr<ScopedDeferCommits>* scoped_defer_commits) { DCHECK(main_task_runner_->BelongsToCurrentThread()); if (layer_tree_host_) - layer_tree_host_->SetDeferCommits(defer_commits); + *scoped_defer_commits = layer_tree_host_->DeferCommits(); +} + +void LayerTreeTest::DispatchReturnDeferCommits( + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits) { + DCHECK(main_task_runner_->BelongsToCurrentThread()); + // Just let |scoped_defer_commits| go out of scope. } void LayerTreeTest::DispatchSetNeedsCommit() {
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h index 6bd13123..fc1fdb3 100644 --- a/cc/test/layer_tree_test.h +++ b/cc/test/layer_tree_test.h
@@ -83,7 +83,10 @@ void PostSetLocalSurfaceIdToMainThread( const viz::LocalSurfaceId& local_surface_id); void PostRequestNewLocalSurfaceIdToMainThread(); - void PostSetDeferCommitsToMainThread(bool defer_commits); + void PostGetDeferCommitsToMainThread( + std::unique_ptr<ScopedDeferCommits>* scoped_defer_commits); + void PostReturnDeferCommitsToMainThread( + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits); void PostSetNeedsCommitToMainThread(); void PostSetNeedsUpdateLayersToMainThread(); void PostSetNeedsRedrawToMainThread(); @@ -183,7 +186,10 @@ double animation_duration); void DispatchSetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id); void DispatchRequestNewLocalSurfaceId(); - void DispatchSetDeferCommits(bool defer_commits); + void DispatchGetDeferCommits( + std::unique_ptr<ScopedDeferCommits>* scoped_defer_commits); + void DispatchReturnDeferCommits( + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits); void DispatchSetNeedsCommit(); void DispatchSetNeedsUpdateLayers(); void DispatchSetNeedsRedraw();
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc index 8fbb0bae..bea10f0 100644 --- a/cc/tiles/software_image_decode_cache.cc +++ b/cc/tiles/software_image_decode_cache.cc
@@ -657,8 +657,8 @@ int image_id = static_cast<int>(image_pair.first.frame_key().hash()); CacheEntry* entry = image_pair.second.get(); DCHECK(entry); - // We might not have memory for this cache entry, depending on where int - // he CacheEntry lifecycle we are. If we don't have memory, then we don't + // We might not have memory for this cache entry, depending on where in + // the CacheEntry lifecycle we are. If we don't have memory, then we don't // have to record it in the dump. if (!entry->memory) continue;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 5cb9cab..36d7e771 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -72,49 +72,55 @@ namespace cc { LayerTreeHost::InitParams::InitParams() = default; - LayerTreeHost::InitParams::~InitParams() = default; +LayerTreeHost::InitParams::InitParams(InitParams&&) = default; +LayerTreeHost::InitParams& LayerTreeHost::InitParams::operator=(InitParams&&) = + default; std::unique_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded( scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, - InitParams* params) { - DCHECK(params->main_task_runner.get()); - DCHECK(impl_task_runner.get()); - DCHECK(params->settings); - std::unique_ptr<LayerTreeHost> layer_tree_host( - new LayerTreeHost(params, CompositorMode::THREADED)); - layer_tree_host->InitializeThreaded(params->main_task_runner, - impl_task_runner); + InitParams params) { + DCHECK(params.settings); + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner = + params.main_task_runner; + DCHECK(main_task_runner); + DCHECK(impl_task_runner); + auto layer_tree_host = base::WrapUnique( + new LayerTreeHost(std::move(params), CompositorMode::THREADED)); + layer_tree_host->InitializeThreaded(std::move(main_task_runner), + std::move(impl_task_runner)); return layer_tree_host; } -std::unique_ptr<LayerTreeHost> -LayerTreeHost::CreateSingleThreaded( +std::unique_ptr<LayerTreeHost> LayerTreeHost::CreateSingleThreaded( LayerTreeHostSingleThreadClient* single_thread_client, - InitParams* params) { - DCHECK(params->settings); - std::unique_ptr<LayerTreeHost> layer_tree_host( - new LayerTreeHost(params, CompositorMode::SINGLE_THREADED)); + InitParams params) { + DCHECK(params.settings); + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner = + params.main_task_runner; + auto layer_tree_host = base::WrapUnique( + new LayerTreeHost(std::move(params), CompositorMode::SINGLE_THREADED)); layer_tree_host->InitializeSingleThreaded(single_thread_client, - params->main_task_runner); + std::move(main_task_runner)); return layer_tree_host; } -LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) +LayerTreeHost::LayerTreeHost(InitParams params, CompositorMode mode) : micro_benchmark_controller_(this), - image_worker_task_runner_(params->image_worker_task_runner), - ukm_recorder_factory_(std::move(params->ukm_recorder_factory)), + image_worker_task_runner_(std::move(params.image_worker_task_runner)), + ukm_recorder_factory_(std::move(params.ukm_recorder_factory)), compositor_mode_(mode), ui_resource_manager_(std::make_unique<UIResourceManager>()), - client_(params->client), + client_(params.client), rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), - settings_(*params->settings), + settings_(*params.settings), debug_state_(settings_.initial_debug_state), id_(s_layer_tree_host_sequence_number.GetNext() + 1), - task_graph_runner_(params->task_graph_runner), + task_graph_runner_(params.task_graph_runner), content_source_id_(0), event_listener_properties_(), - mutator_host_(params->mutator_host) { + mutator_host_(params.mutator_host), + defer_commits_weak_ptr_factory_(this) { DCHECK(task_graph_runner_); DCHECK(!settings_.enable_checker_imaging || image_worker_task_runner_); @@ -419,7 +425,7 @@ void LayerTreeHost::UpdateDeferCommitsInternal() { - proxy_->SetDeferCommits(defer_commits_ || + proxy_->SetDeferCommits(defer_commits_count_ > 0 || (settings_.enable_surface_synchronization && !local_surface_id_from_parent_.is_valid())); } @@ -507,11 +513,23 @@ SetNeedsCommit(); } -void LayerTreeHost::SetDeferCommits(bool defer_commits) { - if (defer_commits_ == defer_commits) - return; - defer_commits_ = defer_commits; - UpdateDeferCommitsInternal(); +ScopedDeferCommits::ScopedDeferCommits(LayerTreeHost* host) + : host_(host->defer_commits_weak_ptr_factory_.GetWeakPtr()) { + host->defer_commits_count_++; + host->UpdateDeferCommitsInternal(); +} + +ScopedDeferCommits::~ScopedDeferCommits() { + LayerTreeHost* host = host_.get(); + if (host) { + DCHECK_GT(host->defer_commits_count_, 0u); + if (--host->defer_commits_count_ == 0) + host->UpdateDeferCommitsInternal(); + } +} + +std::unique_ptr<ScopedDeferCommits> LayerTreeHost::DeferCommits() { + return std::make_unique<ScopedDeferCommits>(this); } DISABLE_CFI_PERF @@ -716,30 +734,6 @@ UpdateHudLayer(debug_state_.ShowHudInfo()); - Layer* root_scroll = - PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); - Layer* page_scale_layer = viewport_layers_.page_scale.get(); - if (!page_scale_layer && root_scroll) - page_scale_layer = root_scroll->parent(); - - if (hud_layer_) { - hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, - device_scale_factor_); - // The HUD layer is managed outside the layer list sent to LayerTreeHost - // and needs to have its property tree state set. - if (IsUsingLayerLists() && root_layer_.get()) { - hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); - hud_layer_->SetEffectTreeIndex(root_layer_->effect_tree_index()); - hud_layer_->SetClipTreeIndex(root_layer_->clip_tree_index()); - hud_layer_->SetScrollTreeIndex(root_layer_->scroll_tree_index()); - hud_layer_->set_property_tree_sequence_number( - root_layer_->property_tree_sequence_number()); - } - } - - gfx::Transform identity_transform; - LayerList update_layer_list; - // The non-layer-list mode is used when blink provides cc with a layer tree // and cc needs to compute property trees from that. // In layer lists mode, blink sends cc property trees directly so they do not @@ -749,6 +743,12 @@ TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::BuildPropertyTrees"); TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); + Layer* root_scroll = + PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); + Layer* page_scale_layer = viewport_layers_.page_scale.get(); + if (!page_scale_layer && root_scroll) + page_scale_layer = root_scroll->parent(); + gfx::Transform identity_transform; PropertyTreeBuilder::BuildPropertyTrees( root_layer, page_scale_layer, inner_viewport_scroll_layer(), outer_viewport_scroll_layer(), overscroll_elasticity_element_id(), @@ -762,6 +762,16 @@ "LayerTreeHost::UpdateLayers_ReceivedPropertyTrees", TRACE_EVENT_SCOPE_THREAD, "property_trees", property_trees_.AsTracedValue()); + // The HUD layer is managed outside the layer list sent to LayerTreeHost + // and needs to have its property tree state set. + if (hud_layer_ && root_layer_.get()) { + hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); + hud_layer_->SetEffectTreeIndex(root_layer_->effect_tree_index()); + hud_layer_->SetClipTreeIndex(root_layer_->clip_tree_index()); + hud_layer_->SetScrollTreeIndex(root_layer_->scroll_tree_index()); + hud_layer_->set_property_tree_sequence_number( + root_layer_->property_tree_sequence_number()); + } } #if DCHECK_IS_ON() @@ -780,6 +790,8 @@ #endif draw_property_utils::UpdatePropertyTrees(this, &property_trees_); + + LayerList update_layer_list; draw_property_utils::FindLayersThatNeedUpdates(this, &property_trees_, &update_layer_list); @@ -970,7 +982,7 @@ // from the main thread, which will not be the case if we're running in // single-threaded mode. if (!task_runner_provider_->HasImplThread()) { - LOG(ERROR) << "LayerTreeMutator not supported in single-thread mode"; + DLOG(ERROR) << "LayerTreeMutator not supported in single-thread mode"; return; } proxy_->SetMutator(std::move(mutator)); @@ -1365,9 +1377,13 @@ void LayerTreeHost::UpdateHudLayer(bool show_hud_info) { if (show_hud_info) { - if (!hud_layer_.get()) { + if (!hud_layer_.get()) hud_layer_ = HeadsUpDisplayLayer::Create(); - } + + gfx::Size device_viewport_in_layout_pixels = + gfx::Size(device_viewport_size_.width() / device_scale_factor_, + device_viewport_size_.height() / device_scale_factor_); + hud_layer_->SetBounds(device_viewport_in_layout_pixels); if (root_layer_.get() && !hud_layer_->parent()) root_layer_->AddChild(hud_layer_);
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h index 7b1069b..2e27402 100644 --- a/cc/trees/layer_tree_host.h +++ b/cc/trees/layer_tree_host.h
@@ -72,6 +72,17 @@ struct RenderingStats; struct ScrollAndScaleSet; +// Returned from LayerTreeHost::DeferCommits. Automatically un-defers on +// destruction. +class CC_EXPORT ScopedDeferCommits { + public: + explicit ScopedDeferCommits(LayerTreeHost* host); + ~ScopedDeferCommits(); + + private: + base::WeakPtr<LayerTreeHost> host_; +}; + class CC_EXPORT LayerTreeHost : public MutatorHostClient { public: struct CC_EXPORT InitParams { @@ -90,15 +101,27 @@ InitParams(); ~InitParams(); + + InitParams(InitParams&&); + InitParams& operator=(InitParams&&); }; + // Constructs a LayerTreeHost with a compositor thread where scrolling and + // animation take place. This is used for the web compositor in the renderer + // process to move work off the main thread which javascript can dominate. static std::unique_ptr<LayerTreeHost> CreateThreaded( scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, - InitParams* params); + InitParams params); + // Constructs a LayerTreeHost without a separate compositor thread, but which + // behaves and looks the same as a threaded compositor externally, with the + // exception of the additional client interface. This is used in other cases + // where the main thread creating this instance can be expected to not become + // blocked, so moving work to another thread and the overhead it adds are not + // required. static std::unique_ptr<LayerTreeHost> CreateSingleThreaded( LayerTreeHostSingleThreadClient* single_thread_client, - InitParams* params); + InitParams params); virtual ~LayerTreeHost(); @@ -106,7 +129,9 @@ int GetId() const; // The current source frame number. This is incremented for each main frame - // update(commit) pushed to the compositor thread. + // update(commit) pushed to the compositor thread. The initial frame number + // is 0, and it is incremented once commit is completed (which is before the + // compositor-thread-side submits its frame for the commit). int SourceFrameNumber() const; // Returns the UIResourceManager used to create UIResources for @@ -117,26 +142,38 @@ // thread task runners. TaskRunnerProvider* GetTaskRunnerProvider() const; - // Returns the settings used by this host. + // Returns the settings used by this host. These settings are constants given + // at startup. const LayerTreeSettings& GetSettings() const; // Sets the LayerTreeMutator interface used to directly mutate the compositor // state on the compositor thread. (Compositor-Worker) void SetLayerTreeMutator(std::unique_ptr<LayerTreeMutator> mutator); - // Call this function when you expect there to be a swap buffer. + // Attachs a SwapPromise to the Layer tree, that passes through the + // LayerTreeHost and LayerTreeHostImpl with the next commit and frame + // submission, which can be used to observe that progress. This also + // causes a main frame to be requested. // See swap_promise.h for how to use SwapPromise. void QueueSwapPromise(std::unique_ptr<SwapPromise> swap_promise); - // Returns the SwapPromiseManager used to create SwapPromiseMonitors for this - // host. + // Returns the SwapPromiseManager, used to insert SwapPromises dynamically + // when a main frame is requested. SwapPromiseManager* GetSwapPromiseManager(); - // Sets whether the content is suitable to use Gpu Rasterization. + // Sets whether the content is suitable to use Gpu Rasterization. This flag is + // used to enable gpu rasterization, and can be modified at any time to change + // the setting based on content. void SetHasGpuRasterizationTrigger(bool has_trigger); // Visibility and LayerTreeFrameSink ------------------------------- + // Sets or gets if the LayerTreeHost is visible. When not visible it will: + // - Not request a new LayerTreeFrameSink from the client. + // - Stop submitting frames to the display compositor. + // - Stop producing main frames and committing them. + // The LayerTreeHost is not visible when first created, so this must be called + // to make it visible before it will attempt to start producing output. void SetVisible(bool visible); bool IsVisible() const; @@ -182,12 +219,15 @@ // requested. bool CommitRequested() const; - // Enables/disables the compositor from requesting main frame updates from the - // client. - void SetDeferCommits(bool defer_commits); - // Returns the value last passed to SetDeferCommits(), though commits may be - // deferred also when the local_surface_id_from_parent() is not valid. - bool defer_commits() const { return defer_commits_; } + // Prevents the compositor from requesting main frame updates from the client + // until the ScopedDeferCommits object is destroyed, or StopDeferringCommits + // is called. + std::unique_ptr<ScopedDeferCommits> DeferCommits(); + + // Returns whether there are any outstanding ScopedDeferCommits, though + // commits may be deferred also when the local_surface_id_from_parent() is not + // valid. + bool defer_commits() const { return defer_commits_count_; } // Synchronously performs a main frame update and layer updates. Used only in // single threaded mode when the compositor's internal scheduling is disabled. @@ -403,6 +443,8 @@ void SetElasticOverscrollFromImplSide(gfx::Vector2dF elastic_overscroll); gfx::Vector2dF elastic_overscroll() const { return elastic_overscroll_; } + // Ensures a HUD layer exists if it is needed, and updates the layer bounds. + // If a HUD layer exists but is no longer needed, it is destroyed. void UpdateHudLayer(bool show_hud_info); HeadsUpDisplayLayer* hud_layer() const { return hud_layer_.get(); } @@ -540,7 +582,7 @@ std::unique_ptr<RenderFrameMetadataObserver> observer); protected: - LayerTreeHost(InitParams* params, CompositorMode mode); + LayerTreeHost(InitParams params, CompositorMode mode); void InitializeThreaded( scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, @@ -573,6 +615,7 @@ private: friend class LayerTreeHostSerializationTest; + friend class ScopedDeferCommits; // This is the number of consecutive frames in which we want the content to be // free of slow-paths before toggling the flag. @@ -661,7 +704,7 @@ // Used to detect surface invariant violations. bool has_pushed_local_surface_id_from_parent_ = false; bool new_local_surface_id_request_ = false; - bool defer_commits_ = false; + uint32_t defer_commits_count_ = 0; SkColor background_color_ = SK_ColorWHITE; @@ -717,6 +760,9 @@ // added here. std::vector<PresentationTimeCallback> pending_presentation_time_callbacks_; + // Used to vend weak pointers to LayerTreeHost to ScopedDeferCommits objects. + base::WeakPtrFactory<LayerTreeHost> defer_commits_weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(LayerTreeHost); };
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 1b93145..6413b3b 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -1973,11 +1973,11 @@ metadata.is_mobile_optimized = IsMobileOptimized(active_tree_.get()); metadata.viewport_size_in_pixels = active_tree_->GetDeviceViewport().size(); -#if defined(OS_ANDROID) metadata.top_controls_height = browser_controls_offset_manager_->TopControlsHeight(); metadata.top_controls_shown_ratio = browser_controls_offset_manager_->TopControlsShownRatio(); +#if defined(OS_ANDROID) metadata.bottom_controls_height = browser_controls_offset_manager_->BottomControlsHeight(); metadata.bottom_controls_shown_ratio = @@ -2002,7 +2002,11 @@ bool allocate_new_local_surface_id = #if !defined(OS_ANDROID) - false; + last_draw_render_frame_metadata_ && + (last_draw_render_frame_metadata_->top_controls_height != + metadata.top_controls_height || + last_draw_render_frame_metadata_->top_controls_shown_ratio != + metadata.top_controls_shown_ratio); #else last_draw_render_frame_metadata_ && (last_draw_render_frame_metadata_->top_controls_height !=
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 170f44f..9d76c5a 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -3372,7 +3372,7 @@ void BeginTest() override { // Start with commits deferred. - PostSetDeferCommitsToMainThread(true); + PostGetDeferCommitsToMainThread(&scoped_defer_commits_); PostSetNeedsCommitToMainThread(); } @@ -3406,6 +3406,7 @@ } void WillBeginMainFrame() override { + EXPECT_FALSE(scoped_defer_commits_); EXPECT_TRUE(IsCommitAllowed()); num_send_begin_main_frame_++; EndTest(); @@ -3418,12 +3419,13 @@ virtual void AllowCommits() { allow_commits_ = true; - layer_tree_host()->SetDeferCommits(false); + scoped_defer_commits_.reset(); } virtual bool IsCommitAllowed() const { return allow_commits_; } private: + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits_; bool allow_commits_ = false; int num_will_begin_impl_frame_ = 0; int num_send_begin_main_frame_ = 0; @@ -3474,11 +3476,9 @@ void WillBeginMainFrame() override { ++begin_main_frame_count_; - if (allow_commits_) - return; // This should prevent the commit from happening. - layer_tree_host()->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_host()->DeferCommits(); // Wait to see if the commit happens. It's possible the deferred // commit happens when it shouldn't but takes long enough that // this passes. But it won't fail when it shouldn't. @@ -3497,7 +3497,7 @@ } private: - bool allow_commits_ = false; + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits_; int commit_count_ = 0; int begin_main_frame_count_ = 0; }; @@ -3520,7 +3520,7 @@ return; // This should prevent the commit from happening. - layer_tree_host()->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_host()->DeferCommits(); // Wait to see if the commit happens. It's possible the deferred // commit happens when it shouldn't but takes long enough that // this passes. But it won't fail when it shouldn't. @@ -3538,7 +3538,7 @@ // Once we've waited and seen that commit did not happen, we // allow commits and should see this one go through. allow_commits_ = true; - layer_tree_host()->SetDeferCommits(false); + scoped_defer_commits_.reset(); } void DidCommit() override { @@ -3559,6 +3559,7 @@ } private: + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits_; bool allow_commits_ = false; int commit_count_ = 0; int begin_main_frame_count_ = 0;
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc index a57153e..4f0c551 100644 --- a/cc/trees/layer_tree_host_unittest_context.cc +++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -1737,7 +1737,7 @@ deferred_ = true; // Defer commits before the BeginFrame completes, causing it to be delayed. - layer_tree_host()->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_host()->DeferCommits(); // Meanwhile, lose the context while we are in defer commits. ImplThreadTaskRunner()->PostTask( FROM_HERE, @@ -1760,13 +1760,14 @@ LoseContext(); // After losing the context, stop deferring commits. - PostSetDeferCommitsToMainThread(false); + PostReturnDeferCommitsToMainThread(std::move(scoped_defer_commits_)); } void DidCommitAndDrawFrame() override { EndTest(); } void AfterTest() override {} + std::unique_ptr<ScopedDeferCommits> scoped_defer_commits_; bool deferred_ = false; bool lost_ = true; };
diff --git a/cc/trees/render_frame_metadata.cc b/cc/trees/render_frame_metadata.cc index 82340bb7..304b451 100644 --- a/cc/trees/render_frame_metadata.cc +++ b/cc/trees/render_frame_metadata.cc
@@ -32,9 +32,9 @@ device_scale_factor == other.device_scale_factor && viewport_size_in_pixels == other.viewport_size_in_pixels && page_scale_factor == other.page_scale_factor && -#if defined(OS_ANDROID) top_controls_height == other.top_controls_height && top_controls_shown_ratio == other.top_controls_shown_ratio && +#if defined(OS_ANDROID) bottom_controls_height == other.bottom_controls_height && bottom_controls_shown_ratio == other.bottom_controls_shown_ratio && min_page_scale_factor == other.min_page_scale_factor &&
diff --git a/cc/trees/render_frame_metadata.h b/cc/trees/render_frame_metadata.h index 5f15602..bd261d6 100644 --- a/cc/trees/render_frame_metadata.h +++ b/cc/trees/render_frame_metadata.h
@@ -66,12 +66,12 @@ float page_scale_factor = 1.f; -#if defined(OS_ANDROID) // Used to position the Android location top bar and page content, whose // precise position is computed by the renderer compositor. float top_controls_height = 0.f; float top_controls_shown_ratio = 0.f; +#if defined(OS_ANDROID) // Used to position Android bottom bar, whose position is computed by the // renderer compositor. float bottom_controls_height = 0.f;
diff --git a/chrome/VERSION b/chrome/VERSION index aac843e4..52f98b0 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=71 MINOR=0 -BUILD=3542 +BUILD=3544 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 9de1c834..d298cbd 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -276,7 +276,6 @@ "//third_party/android_deps:com_google_dagger_dagger_java", "//third_party/android_deps:javax_inject_javax_inject_java", "//third_party/android_media:android_media_java", - "//third_party/android_protobuf:protobuf_nano_javalib", "//third_party/android_swipe_refresh:android_swipe_refresh_java", "//third_party/android_tools:android_arch_lifecycle_common_java", "//third_party/android_tools:android_arch_lifecycle_runtime_java", @@ -370,9 +369,7 @@ # can provide their own implementations. jar_excluded_patterns = [ "*/AppHooksImpl.class" ] - annotation_processor_deps = [ - "//third_party/android_deps:dagger_processor" - ] + annotation_processor_deps = [ "//third_party/android_deps:dagger_processor" ] } action("chrome_android_java_google_api_keys_srcjar") { @@ -509,7 +506,6 @@ "//mojo/public/java:bindings_java", "//mojo/public/java:system_java", "//net/android:net_java", - "//third_party/android_protobuf:protobuf_nano_javalib", "//third_party/android_tools:android_arch_lifecycle_common_java", "//third_party/android_tools:android_support_annotations_java", "//third_party/android_tools:android_support_v7_appcompat_java", @@ -645,7 +641,6 @@ "//services/device/public/java:geolocation_java", "//services/device/public/java:geolocation_java_test_support", "//services/service_manager/public/java:service_manager_java", - "//third_party/android_protobuf:protobuf_nano_javalib", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/android_tools:android_arch_lifecycle_common_java", @@ -708,6 +703,8 @@ "//content/test/data/media/session/", "//content/test/data/media/video-player.html", "//content/test/data/media/webrtc_test_utilities.js", + "//media/test/data/bear.mp4", + "//media/test/data/sfx.mp3", ] } @@ -728,7 +725,6 @@ "//content/public/android:content_java", "//content/public/test/android:content_java_test_support", "//net/android:net_java_test_support", - "//third_party/android_protobuf:protobuf_nano_javalib", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/android_tools:android_arch_lifecycle_common_java", @@ -1256,7 +1252,6 @@ # but that code is stripped out via proguard. Adding this deps adds # usages and prevents removal of the proto code. "//components/sync:test_support_proto_java", - "//third_party/android_protobuf:protobuf_nano_javalib", ] } @@ -1683,7 +1678,6 @@ "//components/sync/android:sync_java", "//content/public/android:content_java", "//content/public/test/android:content_java_test_support", - "//third_party/android_protobuf:protobuf_nano_javalib", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/android_tools:android_arch_lifecycle_common_java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedEventReporter.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedEventReporter.java index 6ecb299..68c2097 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedEventReporter.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedEventReporter.java
@@ -4,17 +4,13 @@ package org.chromium.chrome.browser.feed; -/** - * Provides static entry points to send notifications to Feed. - */ +/** Provides static entry points to send notifications to Feed. */ public final class FeedEventReporter { - // Not meant to be instantiated. + /** Not meant to be instantiated. */ private FeedEventReporter() {} - /* - * Should be called when the browser is foregrounded. - */ + /** Should be called when the browser is foregrounded. */ public static void onBrowserForegrounded() { - FeedProcessScopeFactory.getFeedSchedulerBridge().onForegrounded(); + FeedProcessScopeFactory.getFeedScheduler().onForegrounded(); } }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java index 9039647..d4b1bc7 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
@@ -19,9 +19,7 @@ import com.google.android.libraries.feed.api.scope.FeedStreamScope; import com.google.android.libraries.feed.api.stream.NonDismissibleHeader; import com.google.android.libraries.feed.api.stream.Stream; -import com.google.android.libraries.feed.common.functional.Consumer; import com.google.android.libraries.feed.host.action.ActionApi; -import com.google.android.libraries.feed.host.offlineindicator.OfflineIndicatorApi; import com.google.android.libraries.feed.host.stream.CardConfiguration; import com.google.android.libraries.feed.host.stream.SnackbarApi; import com.google.android.libraries.feed.host.stream.StreamConfiguration; @@ -50,8 +48,6 @@ import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import java.util.Arrays; -import java.util.Collections; -import java.util.List; /** * Provides a new tab page that displays an interest feed rendered list of content suggestions. @@ -147,20 +143,6 @@ } } - private static class StubOfflineIndicatorApi implements OfflineIndicatorApi { - @Override - public void getOfflineStatus( - List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer) { - urlListConsumer.accept(Collections.emptyList()); - } - - @Override - public void addOfflineStatusListener(OfflineStatusListener offlineStatusListener) {} - - @Override - public void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener) {} - } - /** * Provides the additional capabilities needed for the {@link FeedNewTabPage} container view. */ @@ -201,14 +183,14 @@ new SuggestionsNavigationDelegateImpl( activity, profile, nativePageHost, tabModelSelector); ActionApi actionApi = new FeedActionHandler(navigationDelegate, - () -> FeedProcessScopeFactory.getFeedSchedulerBridge().onSuggestionConsumed()); + () -> FeedProcessScopeFactory.getFeedScheduler().onSuggestionConsumed()); + FeedOfflineIndicator offlineIndicator = FeedProcessScopeFactory.getFeedOfflineIndicator(); FeedStreamScope streamScope = feedProcessScope .createFeedStreamScopeBuilder(activity, mImageLoader, actionApi, new BasicStreamConfiguration(), new BasicCardConfiguration(activity.getResources(), mUiConfig), - new BasicSnackbarApi(), new FeedBasicLogging(), - new StubOfflineIndicatorApi()) + new BasicSnackbarApi(), new FeedBasicLogging(), offlineIndicator) .build(); mStream = streamScope.getStream(); @@ -315,8 +297,8 @@ @VisibleForTesting public static void setInTestMode(boolean inTestMode) { if (inTestMode) { - FeedProcessScopeFactory.createFeedProcessScopeForTesting( - new TestFeedScheduler(), new TestNetworkClient()); + FeedProcessScopeFactory.createFeedProcessScopeForTesting(new TestFeedScheduler(), + new TestNetworkClient(), new TestFeedOfflineIndicator()); } else { FeedProcessScopeFactory.clearFeedProcessScopeForTesting(); }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java new file mode 100644 index 0000000..727c639 --- /dev/null +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java
@@ -0,0 +1,132 @@ +// 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.feed; + +import com.google.android.libraries.feed.api.knowncontent.ContentRemoval; +import com.google.android.libraries.feed.api.knowncontent.KnownContentApi; +import com.google.android.libraries.feed.common.functional.Consumer; + +import org.chromium.base.Callback; +import org.chromium.base.VisibleForTesting; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.chrome.browser.profiles.Profile; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** Provides access to native implementations of OfflineIndicatorApi. */ +@JNINamespace("feed") +public class FeedOfflineBridge + implements FeedOfflineIndicator, KnownContentApi.KnownContentListener { + private long mNativeBridge; + private KnownContentApi mKnownContentApi; + + /** + * Hold onto listeners in Java. It is difficult to offload this completely to native, because we + * need to remove with object reference equality in removeOfflineStatusListener(). + */ + private Set<OfflineStatusListener> mListeners = new HashSet<>(); + + /** + * Creates a FeedOfflineBridge for accessing native offlining logic. + * + * @param profile Profile of the user we are rendering the Feed for. + * @param knownContentApi Interface to access information about the Feed's articles. + */ + public FeedOfflineBridge(Profile profile, KnownContentApi knownContentApi) { + mNativeBridge = nativeInit(profile); + mKnownContentApi = knownContentApi; + // TODO(skym): Remove this null check when a KnownContentApi is provided by Feed. + if (mKnownContentApi != null) mKnownContentApi.addListener(this); + } + + @Override + public void destroy() { + assert mNativeBridge != 0; + nativeDestroy(mNativeBridge); + mNativeBridge = 0; + // TODO(skym): Remove this null check when a KnownContentApi is provided by Feed. + if (mKnownContentApi != null) mKnownContentApi.removeListener(this); + } + + @Override + public Long getOfflineIdIfPageIsOfflined(String url) { + return (Long) nativeGetOfflineId(mNativeBridge, url); + } + + @Override + public void getOfflineStatus( + List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer) { + assert mNativeBridge != 0; + String[] urlsArray = urlsToRetrieve.toArray(new String[urlsToRetrieve.size()]); + nativeGetOfflineStatus(mNativeBridge, urlsArray, + (String[] urlsAsArray) -> urlListConsumer.accept(Arrays.asList(urlsAsArray))); + } + + @Override + public void addOfflineStatusListener(OfflineStatusListener offlineStatusListener) { + assert mNativeBridge != 0; + mListeners.add(offlineStatusListener); + } + + @Override + public void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener) { + assert mNativeBridge != 0; + mListeners.remove(offlineStatusListener); + if (mListeners.isEmpty()) { + nativeOnNoListeners(mNativeBridge); + } + } + + @Override + public void onContentRemoved(List<ContentRemoval> contentRemoved) { + List<String> userDrivenRemovals = takeUserDriveRemovalsOnly(contentRemoved); + if (!userDrivenRemovals.isEmpty()) { + nativeOnContentRemoved(mNativeBridge, + userDrivenRemovals.toArray(new String[userDrivenRemovals.size()])); + } + } + + @Override + public void onNewContentReceived(boolean isNewRefresh, long contentCreationDateTimeMs) { + nativeOnNewContentReceived(mNativeBridge); + } + + /** + * Filters out any {@link ContentRemoval} that was not user driven, such as old articles being + * garbage collected. + * + * @param contentRemovd The articles being removed, may or may not be user driven. + * @return All and only the user driven removals. + */ + @VisibleForTesting + static List<String> takeUserDriveRemovalsOnly(List<ContentRemoval> contentRemoved) { + List<String> urlsRemovedByUser = new ArrayList<>(); + for (ContentRemoval removal : contentRemoved) { + if (removal.isRequestedByUser()) { + urlsRemovedByUser.add(removal.getUrl()); + } + } + return urlsRemovedByUser; + } + + @CalledByNative + private static Long createLong(long id) { + return Long.valueOf(id); + } + + private native long nativeInit(Profile profile); + private native void nativeDestroy(long nativeFeedOfflineBridge); + private native Object nativeGetOfflineId(long nativeFeedOfflineBridge, String url); + private native void nativeGetOfflineStatus(long nativeFeedOfflineBridge, + String[] urlsToRetrieve, Callback<String[]> urlListConsumer); + private native void nativeOnContentRemoved(long nativeFeedOfflineBridge, String[] urlsRemoved); + private native void nativeOnNewContentReceived(long nativeFeedOfflineBridge); + private native void nativeOnNoListeners(long nativeFeedOfflineBridge); +}
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineIndicator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineIndicator.java new file mode 100644 index 0000000..7a5436ee --- /dev/null +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineIndicator.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.chrome.browser.feed; + +import com.google.android.libraries.feed.host.offlineindicator.OfflineIndicatorApi; + +/** + * An extension of the {@link OfflineIndicatorApi} with additional methods needed for offline logic + * in Chromium. + */ +public interface FeedOfflineIndicator extends OfflineIndicatorApi { + /** Cleans up native resources, should be called when no longer needed. */ + void destroy(); + + /** + * @param url The url of the page that was previously queried for through + * {@link OfflineIndicatorApi#getOfflineStatus()} or + * {@link OfflineStatusListener#updateOfflineStatus()}. + * @return the offline id of the page if offlined, otherwise null. + */ + Long getOfflineIdIfPageIsOfflined(String url); +}
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java index cdce01e24..887bdd4 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java
@@ -19,16 +19,13 @@ import java.util.concurrent.Executors; -/** - * Holds singleton {@link FeedProcessScope} and some of the scope's host implementations. - */ +/** Holds singleton {@link FeedProcessScope} and some of the scope's host implementations. */ public class FeedProcessScopeFactory { private static FeedProcessScope sFeedProcessScope; private static FeedScheduler sFeedScheduler; + private static FeedOfflineIndicator sFeedOfflineIndicator; - /** - * @return The shared {@link FeedProcessScope} instance. - */ + /** @return The shared {@link FeedProcessScope} instance. */ public static FeedProcessScope getFeedProcessScope() { if (sFeedProcessScope == null) { initialize(); @@ -36,18 +33,24 @@ return sFeedProcessScope; } - /** - * @return The {@link FeedSchedulerBridge} that was given to the {@link FeedProcessScope}. - */ - public static FeedScheduler getFeedSchedulerBridge() { + /** @return The {@link FeedScheduler} that was given to the {@link FeedProcessScope}. */ + public static FeedScheduler getFeedScheduler() { if (sFeedScheduler == null) { initialize(); } return sFeedScheduler; } + /** @return The {@link FeedOfflineIndicator} that was given to the {@link FeedProcessScope}. */ + public static FeedOfflineIndicator getFeedOfflineIndicator() { + if (sFeedOfflineIndicator == null) { + initialize(); + } + return sFeedOfflineIndicator; + } + private static void initialize() { - assert sFeedScheduler == null && sFeedProcessScope == null; + assert sFeedProcessScope == null && sFeedScheduler == null && sFeedOfflineIndicator == null; Profile profile = Profile.getLastUsedProfile().getOriginalProfile(); Configuration configHostApi = createConfiguration(); @@ -64,6 +67,9 @@ .build(); schedulerBridge.initializeFeedDependencies( sFeedProcessScope.getRequestManager(), sFeedProcessScope.getSessionManager()); + + // TODO(skym): Pass on the KnownContentApi when the FeedProcessScope provides one. + sFeedOfflineIndicator = new FeedOfflineBridge(profile, null); } private static Configuration createConfiguration() { @@ -76,16 +82,16 @@ } /** - * Creates a {@link FeedProcessScope} using the provided {@link FeedScheduler} and - * {@link NetworkClient}. Call {@link #clearFeedProcessScopeForTesting()} to reset the - * FeedProcessScope after testing is complete. + * Creates a {@link FeedProcessScope} using the provided host implementations. Call {@link + * #clearFeedProcessScopeForTesting()} to reset the FeedProcessScope after testing is complete. * * @param feedScheduler A {@link FeedScheduler} to use for testing. * @param networkClient A {@link NetworkClient} to use for testing. + * @param feedOfflineIndicator A {@link FeedOfflineIndicator} to use for testing. */ @VisibleForTesting - static void createFeedProcessScopeForTesting( - FeedScheduler feedScheduler, NetworkClient networkClient) { + static void createFeedProcessScopeForTesting(FeedScheduler feedScheduler, + NetworkClient networkClient, FeedOfflineIndicator feedOfflineIndicator) { Configuration configHostApi = createConfiguration(); FeedAppLifecycleListener lifecycleListener = new FeedAppLifecycleListener(new ThreadUtils()); @@ -96,6 +102,7 @@ lifecycleListener, DebugBehavior.SILENT, ContextUtils.getApplicationContext()) .build(); + sFeedOfflineIndicator = feedOfflineIndicator; } /** Resets the FeedProcessScope after testing is complete. */ @@ -105,7 +112,10 @@ sFeedScheduler.destroy(); sFeedScheduler = null; } - + if (sFeedOfflineIndicator != null) { + sFeedOfflineIndicator.destroy(); + sFeedOfflineIndicator = null; + } sFeedProcessScope = null; } }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java index 4072b976..129c335 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java
@@ -63,7 +63,7 @@ @Override protected void onStartTaskWithNative( Context context, TaskParameters taskParameters, TaskFinishedCallback callback) { - FeedProcessScopeFactory.getFeedSchedulerBridge().onFixedTimer(() -> { + FeedProcessScopeFactory.getFeedScheduler().onFixedTimer(() -> { // Regardless of success, mark ourselves as completed. callback.taskFinished(false); }); @@ -84,6 +84,6 @@ @Override public void reschedule(Context context) { ThreadUtils.runOnUiThread( - () -> { FeedProcessScopeFactory.getFeedSchedulerBridge().onTaskReschedule(); }); + () -> { FeedProcessScopeFactory.getFeedScheduler().onTaskReschedule(); }); } }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedScheduler.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedScheduler.java index 9ec5062..3cbec00 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedScheduler.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedScheduler.java
@@ -11,13 +11,18 @@ * in Chromium. */ public interface FeedScheduler extends SchedulerApi { + /** Cleans up native resources, should be called when no longer needed. */ void destroy(); + /** To be called whenever the browser is foregrounded. */ void onForegrounded(); + /** To be called when a background scheduling task wakes up the browser. */ void onFixedTimer(Runnable onCompletion); + /** To be called when a background scheduling task needs to be rescheduled. */ void onTaskReschedule(); + /** To be called when an article is consumed, influencing future scheduling. */ void onSuggestionConsumed(); }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java index 9981dd59..12f2f5e 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java
@@ -36,7 +36,6 @@ mNativeBridge = nativeInit(profile); } - /** Cleans up the native half of this bridge. */ @Override public void destroy() { assert mNativeBridge != 0;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestFeedOfflineIndicator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestFeedOfflineIndicator.java new file mode 100644 index 0000000..560733a --- /dev/null +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestFeedOfflineIndicator.java
@@ -0,0 +1,30 @@ +// 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.feed; + +import com.google.android.libraries.feed.common.functional.Consumer; + +import java.util.List; + +/** A {@link FeedScheduler} implementation for use in testing. */ +class TestFeedOfflineIndicator implements FeedOfflineIndicator { + @Override + public void destroy() {} + + @Override + public Long getOfflineIdIfPageIsOfflined(String url) { + return null; + } + + @Override + public void getOfflineStatus( + List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer) {} + + @Override + public void addOfflineStatusListener(OfflineStatusListener offlineStatusListener) {} + + @Override + public void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener) {} +}
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java index f37c8f0..c1568f4 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java
@@ -6,6 +6,7 @@ import android.support.annotation.NonNull; +import com.google.android.libraries.feed.api.knowncontent.ContentMetadata; import com.google.android.libraries.feed.host.action.ActionApi; import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate; @@ -77,8 +78,10 @@ } @Override - public void downloadUrl(String url) { - mDelegate.openUrl(WindowOpenDisposition.SAVE_TO_DISK, createLoadUrlParams(url)); + public void downloadUrl(ContentMetadata contentMetadata) { + // TODO(twellington): https://bugs.chromium.org/p/chromium/issues/detail?id=879824 + mDelegate.openUrl( + WindowOpenDisposition.SAVE_TO_DISK, createLoadUrlParams(contentMetadata.getUrl())); mSuggestionConsumedObserver.run(); }
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni index b289598..adcbf64 100644 --- a/chrome/android/feed/feed_java_sources.gni +++ b/chrome/android/feed/feed_java_sources.gni
@@ -20,11 +20,14 @@ "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPageMediator.java", + "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineIndicator.java", + "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedScheduler.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java", + "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestFeedOfflineIndicator.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestFeedScheduler.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/TestNetworkClient.java", "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java", @@ -36,6 +39,7 @@ "junit/src/org/chromium/chrome/browser/feed/FeedContentStorageTest.java", "junit/src/org/chromium/chrome/browser/feed/FeedImageLoaderTest.java", "junit/src/org/chromium/chrome/browser/feed/FeedJournalStorageTest.java", + "junit/src/org/chromium/chrome/browser/feed/FeedOfflineBridgeTest.java", "junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java", ]
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index a3d569f..3215e0c7 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -387,6 +387,11 @@ {{ self.supports_vr() }} {{ self.extra_web_rendering_activity_definitions() }} </activity> + <!-- SeparateTaskCustomTabActivity is a wrapper of CustomTabActivity. It provides the + general feeling of supporting multi tasks, even for versions that did not fully support + it. + TODO(arthursonzogni, tedchoc): Enabled this only on Android < 21 after M74. + --> <activity android:name="org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity" android:theme="@style/MainTheme" android:exported="false" @@ -399,21 +404,23 @@ {{ self.supports_vr() }} {{ self.extra_web_rendering_activity_definitions() }} </activity> - {% for i in range(10) %} - <activity android:name="org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity{{ i }}" - android:theme="@style/MainTheme" - android:icon="@mipmap/app_single_page_icon" - android:exported="false" - android:launchMode="singleTask" - android:persistableMode="persistNever" - android:taskAffinity="" - {{ self.chrome_activity_common() }} - {{ self.supports_video_persistence() }} - > - {{ self.supports_vr() }} - {{ self.extra_web_rendering_activity_definitions() }} - </activity> - {% endfor %} + {% if min_sdk_version|int < 21 %} + {% for i in range(10) %} + <activity android:name="org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity{{ i }}" + android:theme="@style/MainTheme" + android:icon="@mipmap/app_single_page_icon" + android:exported="false" + android:launchMode="singleTask" + android:persistableMode="persistNever" + android:taskAffinity="" + {{ self.chrome_activity_common() }} + {{ self.supports_video_persistence() }} + > + {{ self.supports_vr() }} + {{ self.extra_web_rendering_activity_definitions() }} + </activity> + {% endfor %} + {% endif %} <activity android:name="org.chromium.chrome.browser.incognito.IncognitoDisclosureActivity" android:theme="@style/FullscreenTransparentActivityTheme"
diff --git a/chrome/android/java/res/layout/contextual_search_promo_view.xml b/chrome/android/java/res/layout/contextual_search_promo_view.xml index 6a7f037e..3bdd62f 100644 --- a/chrome/android/java/res/layout/contextual_search_promo_view.xml +++ b/chrome/android/java/res/layout/contextual_search_promo_view.xml
@@ -41,9 +41,7 @@ android:paddingStart="8dp" android:paddingEnd="8dp" android:text="@string/contextual_search_allow_button" - android:textAllCaps="true" - android:textColor="#FFF" - android:textSize="14sp" + android:textAppearance="@style/WhiteButtonText" app:buttonColor="@color/light_active_color" /> <Button @@ -57,7 +55,8 @@ android:layout_marginEnd="16dp" android:paddingStart="8dp" android:paddingEnd="8dp" - android:text="@string/contextual_search_no_thanks_button" /> + android:text="@string/contextual_search_no_thanks_button" + style="@style/MainButtonStyle" /> <View android:layout_below="@id/contextual_search_allow_button"
diff --git a/chrome/android/java/res/layout/new_tab_page_snippets_header.xml b/chrome/android/java/res/layout/new_tab_page_snippets_header.xml deleted file mode 100644 index a6dd333..0000000 --- a/chrome/android/java/res/layout/new_tab_page_snippets_header.xml +++ /dev/null
@@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. --> - -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/header_title" - android:layout_width="match_parent" - android:layout_height="@dimen/snippets_article_header_height" - android:textAppearance="@style/BlackCaption" - android:paddingStart="@dimen/snippets_padding" - android:paddingTop="@dimen/snippets_header_top_padding" - android:gravity="start|center_vertical" />
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index 4de12ba0..8f0e939 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -357,7 +357,6 @@ <!-- The default padding for the peeking card and the amount the card peeks by in the current peeking card animation (the calculations assume this is the same). --> <dimen name="snippets_padding">16dp</dimen> - <dimen name="snippets_header_top_padding">10dp</dimen> <dimen name="snippets_card_gap">0.5dp</dimen> <dimen name="snippets_article_header_height">40dp</dimen> <dimen name="snippets_publisher_margin_top">8dp</dimen>
diff --git a/chrome/android/java/res/xml/sync_and_services_preferences.xml b/chrome/android/java/res/xml/sync_and_services_preferences.xml index 0c6de8cb..8225337c 100644 --- a/chrome/android/java/res/xml/sync_and_services_preferences.xml +++ b/chrome/android/java/res/xml/sync_and_services_preferences.xml
@@ -69,6 +69,10 @@ <org.chromium.chrome.browser.preferences.ChromeBasePreference android:key="sync_manage_data" android:title="@string/sync_manage_data"/> + <Preference + android:key="contextual_suggestions" + android:title="@string/prefs_contextual_suggestions" + android:fragment="org.chromium.chrome.browser.preferences.ContextualSuggestionsPreference"/> </org.chromium.chrome.browser.preferences.SigninExpandablePreferenceGroup> <Preference
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java new file mode 100644 index 0000000..09243ef9 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java
@@ -0,0 +1,191 @@ +// 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; + +import org.chromium.base.ObserverList; +import org.chromium.base.ObserverList.RewindableIterator; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.LayoutManager; +import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; +import org.chromium.chrome.browser.compositor.layouts.StaticLayout; +import org.chromium.chrome.browser.compositor.layouts.phone.SimpleAnimationLayout; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver; + +/** + * A class that provides the current {@link Tab} for various states of the browser's activity. + */ +public class ActivityTabProvider { + /** An interface to track the visible tab for the activity. */ + public interface ActivityTabObserver { + /** + * A notification that the activity's tab has changed. This will be triggered whenever a + * different tab is selected by the active {@link TabModel} and when that tab is + * interactive (i.e. not in a tab switching mode). When switching to toolbar swipe or tab + * switcher, this method will be called with {@code null} to indicate that there is no + * single activity tab (observers may or may not choose to ignore this event). + * @param tab The {@link Tab} that became visible or null if not in {@link StaticLayout}. + * @param hint Whether the change event is a hint that a tab change is likely. If true, the + * provided tab may still be frozen and is not yet selected. + */ + void onActivityTabChanged(Tab tab, boolean hint); + } + + /** An {@link ActivityTabObserver} that can be used to explicitly watch non-hint events. */ + public static abstract class HintlessActivityTabObserver implements ActivityTabObserver { + @Override + public final void onActivityTabChanged(Tab tab, boolean hint) { + // Only pass the event through if it isn't a hint. + if (!hint) onActivityTabChanged(tab); + } + + /** + * A notification that the {@link Tab} in the {@link StaticLayout} has changed. + * @param tab The activity's tab. + */ + public abstract void onActivityTabChanged(Tab tab); + } + + /** The list of observers to send events to. */ + private final ObserverList<ActivityTabObserver> mObservers = new ObserverList<>(); + + /** + * A single rewindable iterator bound to {@link #mObservers} to prevent constant allocation of + * new iterators. + */ + private final RewindableIterator<ActivityTabObserver> mRewindableIterator; + + /** The {@link Tab} that is considered to be the activity's tab. */ + private Tab mActivityTab; + + /** A handle to the {@link LayoutManager} to get the active layout. */ + private LayoutManager mLayoutManager; + + /** The observer watching scene changes in the {@link LayoutManager}. */ + private SceneChangeObserver mSceneChangeObserver; + + /** A handle to the {@link TabModelSelector}. */ + private TabModelSelector mTabModelSelector; + + /** An observer for watching tab creation and switching events. */ + private TabModelSelectorTabModelObserver mTabModelObserver; + + /** The last tab ID that was hinted. This is reset when the activity tab actually changes. */ + private int mLastHintedTabId; + + /** + * Default constructor. + */ + public ActivityTabProvider() { + mRewindableIterator = mObservers.rewindableIterator(); + mSceneChangeObserver = new SceneChangeObserver() { + @Override + public void onTabSelectionHinted(int tabId) { + if (mTabModelSelector == null || mLastHintedTabId == tabId) return; + Tab tab = mTabModelSelector.getTabById(tabId); + mLastHintedTabId = tabId; + mRewindableIterator.rewind(); + while (mRewindableIterator.hasNext()) { + mRewindableIterator.next().onActivityTabChanged(tab, true); + } + } + + @Override + public void onSceneChange(Layout layout) { + // The {@link SimpleAnimationLayout} is a special case, the intent is not to switch + // tabs, but to merely run an animation. In this case, do nothing. If the animation + // layout does result in a new tab {@link TabModelObserver#didSelectTab} will + // trigger the event instead. If the tab does not change, the event will no + if (layout instanceof SimpleAnimationLayout) return; + + Tab tab = mTabModelSelector.getCurrentTab(); + if (!(layout instanceof StaticLayout)) tab = null; + triggerActivityTabChangeEvent(tab); + } + }; + } + + /** + * @return The activity's current tab. + */ + public Tab getActivityTab() { + return mActivityTab; + } + + /** + * @param selector A {@link TabModelSelector} for watching for changes in tabs. + */ + public void setTabModelSelector(TabModelSelector selector) { + assert mTabModelSelector == null; + mTabModelSelector = selector; + mTabModelObserver = new TabModelSelectorTabModelObserver(mTabModelSelector) { + @Override + public void didSelectTab(Tab tab, @TabModel.TabSelectionType int type, int lastId) { + triggerActivityTabChangeEvent(tab); + } + + @Override + public void willCloseTab(Tab tab, boolean animate) { + // If this is the last tab to close, make sure a signal is sent to the observers. + if (mTabModelSelector.getTotalTabCount() <= 1) triggerActivityTabChangeEvent(null); + } + }; + } + + /** + * @param layoutManager A {@link LayoutManager} for watching for scene changes. + */ + public void setLayoutManager(LayoutManager layoutManager) { + assert mLayoutManager == null; + mLayoutManager = layoutManager; + mLayoutManager.addSceneChangeObserver(mSceneChangeObserver); + } + + /** + * Check if the interactive tab change event needs to be triggered based on the provided tab. + * @param tab The activity's tab. + */ + private void triggerActivityTabChangeEvent(Tab tab) { + if (mLayoutManager == null) return; + if (!(mLayoutManager.getActiveLayout() instanceof StaticLayout) && tab != null) return; + + if (mActivityTab == tab) return; + mActivityTab = tab; + mLastHintedTabId = Tab.INVALID_TAB_ID; + + mRewindableIterator.rewind(); + while (mRewindableIterator.hasNext()) { + mRewindableIterator.next().onActivityTabChanged(tab, false); + } + } + + /** + * @param observer The {@link ActivityTabObserver} to add to the activity. This will trigger the + * {@link ActivityTabObserver#onActivityTabChanged(Tab, boolean)} event to be + * called on the added observer, providing access to the current tab. + */ + public void addObserverAndTrigger(ActivityTabObserver observer) { + mObservers.addObserver(observer); + observer.onActivityTabChanged(mActivityTab, false); + } + + /** + * @param observer The {@link ActivityTabObserver} to remove from the activity. + */ + public void removeObserver(ActivityTabObserver observer) { + mObservers.removeObserver(observer); + } + + /** Clean up and detach any observers this object created. */ + public void destroy() { + mObservers.clear(); + if (mLayoutManager != null) mLayoutManager.removeSceneChangeObserver(mSceneChangeObserver); + mLayoutManager = null; + if (mTabModelObserver != null) mTabModelObserver.destroy(); + mTabModelSelector = null; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index e166a5b62..98f09f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -153,6 +153,7 @@ import org.chromium.printing.PrintManagerDelegateImpl; import org.chromium.printing.PrintingController; import org.chromium.printing.PrintingControllerImpl; +import org.chromium.ui.DeferredViewStubInflationProvider; import org.chromium.ui.UiUtils; import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.DeviceFormFactor; @@ -297,6 +298,9 @@ private ActivityTabStartupMetricsTracker mActivityTabStartupMetricsTracker; + /** A means of providing the foreground tab of the activity to different features. */ + private ActivityTabProvider mActivityTabProvider; + /** Whether or not the activity is in started state. */ private boolean mStarted; @@ -330,6 +334,7 @@ mFullscreenManager = createFullscreenManager(); mCreatedFullscreenManager = true; + mActivityTabProvider = new ActivityTabProvider(); } @SuppressLint("NewApi") @@ -582,6 +587,8 @@ if (mTabModelsInitialized) return; mTabModelSelector = createTabModelSelector(); + mActivityTabProvider.setTabModelSelector(mTabModelSelector); + if (mTabModelSelector == null) { assert isFinishing(); mTabModelsInitialized = true; @@ -618,7 +625,6 @@ @Override public void onShown(Tab tab) { setStatusBarColor(tab, tab.getThemeColor()); - OfflineIndicatorController.onUpdate(); } @Override @@ -931,8 +937,6 @@ } VrModuleProvider.getDelegate().maybeRegisterVrEntryHook(this); - OfflineIndicatorController.onUpdate(); - getManualFillingController().onResume(); } @@ -1277,6 +1281,8 @@ manager.removeTouchExplorationStateChangeListener(mTouchExplorationStateChangeListener); } + mActivityTabProvider.destroy(); + super.onDestroy(); } @@ -1375,8 +1381,9 @@ }, coordinator); mManualFillingController.initialize(getWindowAndroid(), - findViewById(R.id.keyboard_accessory_stub), - findViewById(R.id.keyboard_accessory_sheet_stub)); + new DeferredViewStubInflationProvider<>(findViewById(R.id.keyboard_accessory_stub)), + new DeferredViewStubInflationProvider<>( + findViewById(R.id.keyboard_accessory_sheet_stub))); // Create after native initialization so subclasses that override this method have a chance // to setup. @@ -1614,6 +1621,13 @@ } /** + * @return The provider of the visible tab in the current activity. + */ + public ActivityTabProvider getActivityTabProvider() { + return mActivityTabProvider; + } + + /** * Returns the {@link InsetObserverView} that has the current system window * insets information. * @return The {@link InsetObserverView}, possibly null. @@ -1668,6 +1682,9 @@ } /** + * DEPRECATED: Instead, use/hold a reference to {@link #mActivityTabProvider}. See + * https://crbug.com/871279 for more details. + * * Returns the tab being displayed by this ChromeActivity instance. This allows differentiation * between ChromeActivity subclasses that swap between multiple tabs (e.g. ChromeTabbedActivity) * and subclasses that only display one Tab (e.g. FullScreenActivity and DocumentActivity). @@ -1797,6 +1814,8 @@ controlContainer.setSwipeHandler( getCompositorViewHolder().getLayoutManager().getToolbarSwipeHandler()); } + + mActivityTabProvider.setLayoutManager(layoutManager); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java index 07de2a2a..f1b6d20 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
@@ -31,6 +31,7 @@ import org.chromium.build.BuildHooksConfig; import org.chromium.chrome.browser.crash.PureJavaExceptionHandler; import org.chromium.chrome.browser.crash.PureJavaExceptionReporter; +import org.chromium.chrome.browser.customtabs.CustomTabsConnection; import org.chromium.chrome.browser.init.InvalidStartupDialog; import org.chromium.chrome.browser.metrics.UmaUtils; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -133,6 +134,8 @@ if ((level >= TRIM_MEMORY_RUNNING_LOW && level < TRIM_MEMORY_UI_HIDDEN) || level >= TRIM_MEMORY_MODERATE) { if (mReferencePool != null) mReferencePool.drain(); + + CustomTabsConnection.cleanUpUnusedSessions(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 9a317f6..590587b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -153,7 +153,7 @@ public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps"; public static final String APP_NOTIFICATION_STATUS_MESSAGING = "AppNotificationStatusMessaging"; public static final String AUTOFILL_ASSISTANT = "AutofillAssistant"; - public static final String AUTOFILL_EXPANDED_POPUP_VIEWS = "AutofillExpandedPopupViews"; + public static final String AUTOFILL_REFRESH_STYLE_ANDROID = "AutofillRefreshStyleAndroid"; public static final String AUTOFILL_KEYBOARD_ACCESSORY = "AutofillKeyboardAccessory"; public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName"; public static final String CAF_MEDIA_ROUTER_IMPL = "CafMediaRouterImpl"; @@ -182,7 +182,6 @@ "ContentSuggestionsNotifications"; public static final String CONTENT_SUGGESTIONS_SCROLL_TO_LOAD = "ContentSuggestionsScrollToLoad"; - public static final String CONTENT_SUGGESTIONS_SETTINGS = "ContentSuggestionsSettings"; public static final String CONTENT_SUGGESTIONS_THUMBNAIL_DOMINANT_COLOR = "ContentSuggestionsThumbnailDominantColor"; public static final String CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION = @@ -242,8 +241,6 @@ public static final String NO_CREDIT_CARD_ABORT = "NoCreditCardAbort"; public static final String NTP_ARTICLE_SUGGESTIONS = "NTPArticleSuggestions"; - public static final String NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER = - "NTPArticleSuggestionsExpandableHeader"; public static final String NTP_BUTTON = "NTPButton"; public static final String NTP_FOREIGN_SESSIONS_SUGGESTIONS = "NTPForeignSessionsSuggestions"; public static final String NTP_LAUNCH_AFTER_INACTIVITY = "NTPLaunchAfterInactivity";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java index 55a84f37..9ea442a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
@@ -300,36 +300,49 @@ newIntent.setFlags(newIntent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); } - // If a CCT intent triggers First Run, then NEW_TASK will be automatically applied. As - // part of that, it will inherit the EXCLUDE_FROM_RECENTS bit from ChromeLauncherActivity, - // so explicitly remove it to ensure the CCT does not get lost in recents. + // Handle activity started in a new task. + // See https://developer.android.com/guide/components/activities/tasks-and-back-stack if ((newIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 || (newIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) { + // If a CCT intent triggers First Run, then NEW_TASK will be automatically applied. As + // part of that, it will inherit the EXCLUDE_FROM_RECENTS bit from + // ChromeLauncherActivity, so explicitly remove it to ensure the CCT does not get lost + // in recents. newIntent.setFlags(newIntent.getFlags() & ~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - String uuid = UUID.randomUUID().toString(); + + // Android will try to find and reuse an existing CCT activity in the background. Use + // this flag to always start a new one instead. newIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - // Force a new document L+ to ensure the proper task/stack creation. - newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); - newIntent.setClassName(context, SeparateTaskCustomTabActivity.class.getName()); - } else { + + // Provide the general feeling of supporting multi tasks in Android version that did not + // fully support them. Reuse the least recently used SeparateTaskCustomTabActivity + // instance. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + String uuid = UUID.randomUUID().toString(); int activityIndex = ActivityAssigner .instance(ActivityAssigner.ActivityAssignerNamespace .SEPARATE_TASK_CCT_NAMESPACE) .assign(uuid); String className = SeparateTaskCustomTabActivity.class.getName() + activityIndex; newIntent.setClassName(context, className); - } - String url = IntentHandler.getUrlFromIntent(newIntent); - assert url != null; - newIntent.setData(new Uri.Builder() - .scheme(UrlConstants.CUSTOM_TAB_SCHEME) - .authority(uuid) - .query(url) - .build()); + String url = IntentHandler.getUrlFromIntent(newIntent); + assert url != null; + newIntent.setData(new Uri.Builder() + .scheme(UrlConstants.CUSTOM_TAB_SCHEME) + .authority(uuid) + .query(url) + .build()); + } } - IntentUtils.safeRemoveExtra(intent, CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_CHROME); + + // If the previous caller was not Chrome, but added EXTRA_IS_OPENED_BY_CHROME for malicious + // purpose, remove it. The new intent will be sent by Chrome, but was not sent by Chrome + // initially. + if (!IntentHandler.wasIntentSenderChrome(intent)) { + IntentUtils.safeRemoveExtra( + newIntent, CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_CHROME); + } return newIntent; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java index 5b24dd0..b5b3e9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
@@ -122,7 +122,7 @@ } private static boolean shouldUseRefreshStyle() { - return ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_EXPANDED_POPUP_VIEWS); + return ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_REFRESH_STYLE_ANDROID); } // Helper methods for AutofillSuggestion
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetCoordinator.java index f9434b6..57fead9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetCoordinator.java
@@ -8,13 +8,12 @@ import android.support.annotation.Px; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; -import android.view.ViewStub; -import org.chromium.base.Supplier; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; +import org.chromium.chrome.browser.modelutil.LazyConstructionPropertyMcp; +import org.chromium.chrome.browser.modelutil.ListModel; import org.chromium.chrome.browser.modelutil.ListModelChangeProcessor; -import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; +import org.chromium.ui.ViewProvider; /** * Creates and owns all elements which are part of the accessory sheet component. @@ -24,23 +23,18 @@ */ public class AccessorySheetCoordinator { private final AccessorySheetMediator mMediator; - private final Supplier<ViewPager.OnPageChangeListener> mProvider; /** * Creates the sheet component by instantiating Model, View and Controller before wiring these * parts up. - * @param viewStub The view stub that can be inflated into the accessory layout. - * @param provider The provider of a {@link ViewPager.OnPageChangeListener} used for navigation. + * @param viewProvider A provider for the accessory layout. */ - public AccessorySheetCoordinator( - ViewStub viewStub, Supplier<ViewPager.OnPageChangeListener> provider) { - mProvider = provider; - LazyViewBinderAdapter.StubHolder<ViewPager> stubHolder = - new LazyViewBinderAdapter.StubHolder<>(viewStub); + public AccessorySheetCoordinator(ViewProvider<ViewPager> viewProvider) { AccessorySheetModel model = new AccessorySheetModel(); - model.addObserver(new PropertyModelChangeProcessor<>(model, stubHolder, - new LazyViewBinderAdapter<>( - new AccessorySheetViewBinder(), this::onViewInflated))); + + new LazyConstructionPropertyMcp<>(model, AccessorySheetModel.PropertyKey.VISIBLE, + AccessorySheetModel::isVisible, viewProvider, AccessorySheetViewBinder::bind); + KeyboardAccessoryMetricsRecorder.registerMetricsObserver(model); mMediator = new AccessorySheetMediator(model); } @@ -48,26 +42,18 @@ /** * Creates the {@link PagerAdapter} for the newly inflated {@link ViewPager}. * The created adapter observes the given model for item changes and updates the view pager. - * @param model The model containing the list of tabs to be displayed. + * @param tabList The list of tabs to be displayed. + * @param viewPager The newly inflated {@link ViewPager}. * @return A fully initialized {@link PagerAdapter}. */ - static PagerAdapter createTabViewAdapter(AccessorySheetModel model, ViewPager inflatedView) { - AccessoryPagerAdapter adapter = new AccessoryPagerAdapter(model.getTabList()); - model.getTabList().addObserver( - new ListModelChangeProcessor<>(model.getTabList(), inflatedView, adapter)); + static PagerAdapter createTabViewAdapter( + ListModel<KeyboardAccessoryData.Tab> tabList, ViewPager viewPager) { + AccessoryPagerAdapter adapter = new AccessoryPagerAdapter(tabList); + tabList.addObserver(new ListModelChangeProcessor<>(tabList, viewPager, adapter)); return adapter; } /** - * Called by the {@link LazyViewBinderAdapter} as soon as the view is inflated so it can be - * initialized. This call happens before the {@link AccessorySheetViewBinder} is called for the - * first time. - */ - private void onViewInflated(ViewPager view) { - view.addOnPageChangeListener(mProvider.get()); - } - - /** * Adds the contents of a given {@link KeyboardAccessoryData.Tab} to the accessory sheet. If it * is the first Tab, it automatically becomes the active Tab. * Careful, if you want to show this tab as icon in the KeyboardAccessory, use the method
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetModel.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetModel.java index c6885bc..0dfe4d2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetModel.java
@@ -8,6 +8,10 @@ import org.chromium.chrome.browser.modelutil.ListModel; import org.chromium.chrome.browser.modelutil.PropertyObservable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + /** * This model holds all view state of the accessory sheet. * It is updated by the {@link AccessorySheetMediator} and emits notification on which observers @@ -15,6 +19,13 @@ */ class AccessorySheetModel extends PropertyObservable<AccessorySheetModel.PropertyKey> { public static class PropertyKey { + public static final List<PropertyKey> ALL_PROPERTIES = new ArrayList<>(); + + private PropertyKey() { + ALL_PROPERTIES.add(this); + } + + public static final PropertyKey TAB_LIST = new PropertyKey(); public static final PropertyKey ACTIVE_TAB_INDEX = new PropertyKey(); public static final PropertyKey VISIBLE = new PropertyKey(); public static final PropertyKey HEIGHT = new PropertyKey(); @@ -26,6 +37,11 @@ private int mHeight; private final ListModel<Tab> mTabList = new ListModel<>(); + @Override + public Collection<PropertyKey> getAllSetProperties() { + return PropertyKey.ALL_PROPERTIES; + } + ListModel<Tab> getTabList() { return mTabList; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewBinder.java index 9ff205d..367ead0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewBinder.java
@@ -9,51 +9,29 @@ import android.view.ViewGroup; import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessorySheetModel.PropertyKey; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; /** * Observes {@link AccessorySheetModel} changes (like a newly available tab) and triggers the * {@link AccessorySheetViewBinder} which will modify the view accordingly. */ -class AccessorySheetViewBinder - implements LazyViewBinderAdapter - .SimpleViewBinder<AccessorySheetModel, ViewPager, PropertyKey> { - @Override - public PropertyKey getVisibilityProperty() { - return PropertyKey.VISIBLE; - } - - @Override - public boolean isVisible(AccessorySheetModel model) { - return model.isVisible(); - } - - @Override - public void onInitialInflation(AccessorySheetModel model, ViewPager inflatedView) { - inflatedView.setAdapter( - AccessorySheetCoordinator.createTabViewAdapter(model, inflatedView)); - bind(model, inflatedView, PropertyKey.HEIGHT); - bind(model, inflatedView, PropertyKey.ACTIVE_TAB_INDEX); - } - - @Override - public void bind(AccessorySheetModel model, ViewPager inflatedView, PropertyKey propertyKey) { - if (propertyKey == PropertyKey.VISIBLE) { - inflatedView.setVisibility(model.isVisible() ? View.VISIBLE : View.GONE); - return; - } - if (propertyKey == PropertyKey.HEIGHT) { - ViewGroup.LayoutParams p = inflatedView.getLayoutParams(); +class AccessorySheetViewBinder { + public static void bind( + AccessorySheetModel model, ViewPager viewPager, PropertyKey propertyKey) { + if (propertyKey == PropertyKey.TAB_LIST) { + viewPager.setAdapter( + AccessorySheetCoordinator.createTabViewAdapter(model.getTabList(), viewPager)); + } else if (propertyKey == PropertyKey.VISIBLE) { + viewPager.setVisibility(model.isVisible() ? View.VISIBLE : View.GONE); + } else if (propertyKey == PropertyKey.HEIGHT) { + ViewGroup.LayoutParams p = viewPager.getLayoutParams(); p.height = model.getHeight(); - inflatedView.setLayoutParams(p); - return; - } - if (propertyKey == PropertyKey.ACTIVE_TAB_INDEX) { + viewPager.setLayoutParams(p); + } else if (propertyKey == PropertyKey.ACTIVE_TAB_INDEX) { if (model.getActiveTabIndex() != AccessorySheetModel.NO_ACTIVE_TAB) { - inflatedView.setCurrentItem(model.getActiveTabIndex()); + viewPager.setCurrentItem(model.getActiveTabIndex()); } - return; + } else { + assert false : "Every possible property update needs to be handled!"; } - assert false : "Every possible property update needs to be handled!"; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryCoordinator.java index c289c9d..48398ee3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryCoordinator.java
@@ -5,17 +5,16 @@ package org.chromium.chrome.browser.autofill.keyboard_accessory; import android.support.annotation.Px; -import android.support.v4.view.ViewPager; -import android.view.ViewStub; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryViewBinder.ActionViewHolder; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryViewBinder.TabViewBinder; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; +import org.chromium.chrome.browser.modelutil.LazyConstructionPropertyMcp; +import org.chromium.chrome.browser.modelutil.ListModel; import org.chromium.chrome.browser.modelutil.ListModelChangeProcessor; -import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; import org.chromium.chrome.browser.modelutil.RecyclerViewAdapter; import org.chromium.chrome.browser.modelutil.SimpleRecyclerViewMcp; +import org.chromium.ui.ViewProvider; /** * Creates and owns all elements which are part of the keyboard accessory component. @@ -24,7 +23,6 @@ */ public class KeyboardAccessoryCoordinator { private final KeyboardAccessoryMediator mMediator; - private LazyViewBinderAdapter.StubHolder<KeyboardAccessoryView> mViewHolder; /** * The keyboard accessory provides signals when to show or change the accessory sheet below it. @@ -58,30 +56,30 @@ /** * Initializes the component as soon as the native library is loaded by e.g. starting to listen * to keyboard visibility events. - * @param viewStub the stub that will become the accessory. + * @param viewProvider A provider for the accessory. */ - public KeyboardAccessoryCoordinator(ViewStub viewStub, VisibilityDelegate visibilityDelegate) { + public KeyboardAccessoryCoordinator(VisibilityDelegate visibilityDelegate, + ViewProvider<KeyboardAccessoryView> viewProvider) { KeyboardAccessoryModel model = new KeyboardAccessoryModel(); mMediator = new KeyboardAccessoryMediator(model, visibilityDelegate); - mViewHolder = new LazyViewBinderAdapter.StubHolder<>(viewStub); + viewProvider.whenLoaded(view -> view.setTabSelectionAdapter(mMediator)); - model.addObserver(new PropertyModelChangeProcessor<>(model, mViewHolder, - new LazyViewBinderAdapter<>( - new KeyboardAccessoryViewBinder(), this::onViewInflated))); + new LazyConstructionPropertyMcp<>(model, KeyboardAccessoryModel.PropertyKey.VISIBLE, + KeyboardAccessoryModel::isVisible, viewProvider, KeyboardAccessoryViewBinder::bind); KeyboardAccessoryMetricsRecorder.registerMetricsObserver(model); } /** * Creates an adapter to an {@link ActionViewHolder} that is wired * up to the model change processor which listens to the given {@link KeyboardAccessoryModel}. - * @param model the {@link KeyboardAccessoryModel} the adapter gets its data from. + * @param actions The list of actions shown represented by the adapter. * @return Returns a fully initialized and wired adapter to an ActionViewHolder. */ static RecyclerViewAdapter<ActionViewHolder, Void> createActionsAdapter( - KeyboardAccessoryModel model) { + ListModel<KeyboardAccessoryData.Action> actions) { return new RecyclerViewAdapter<>( - new SimpleRecyclerViewMcp<>(model.getActionList(), - KeyboardAccessoryData.Action::getActionType, ActionViewHolder::bind), + new SimpleRecyclerViewMcp<>(actions, KeyboardAccessoryData.Action::getActionType, + ActionViewHolder::bind), ActionViewHolder::create); } @@ -105,16 +103,6 @@ } /** - * Called by the {@link LazyViewBinderAdapter} as soon as the view is inflated so it can be - * initialized. This call happens before the {@link KeyboardAccessoryViewBinder} is called for - * the first time. - * @param view The view that was inflated from the initially given {@link ViewStub}. - */ - private void onViewInflated(KeyboardAccessoryView view) { - view.setTabSelectionAdapter(mMediator); - } - - /** * A {@link KeyboardAccessoryData.Tab} passed into this function will be represented as item at * the start of the accessory. It is meant to trigger various bottom sheets. * @param tab The tab which contains representation data and links back to a bottom sheet. @@ -213,13 +201,4 @@ KeyboardAccessoryMediator getMediatorForTesting() { return mMediator; } - - /** - * Provides the PageChangeListener that is needed to wire up the TabLayout with the ViewPager. - * @return Returns a {@link ViewPager.OnPageChangeListener}. - */ - ViewPager.OnPageChangeListener getPageChangeListener() { - assert mViewHolder.getView() != null : "Requested PageChangeListener before inflation."; - return mViewHolder.getView().getPageChangeListener(); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryMediator.java index b8008f0..b14e1db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryMediator.java
@@ -89,7 +89,7 @@ void dismiss() { closeActiveTab(); - updateVisibility(); + close(); } void closeActiveTab() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryModel.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryModel.java index 2e5a893d..d12db3b9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryModel.java
@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.modelutil.PropertyObservable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -29,6 +30,8 @@ // iterate over all properties when it's created to ensure it is in sync with this model. static final List<PropertyKey> ALL_PROPERTIES = new ArrayList<>(); + static final PropertyKey ACTIONS = new PropertyKey(); + static final PropertyKey TABS = new PropertyKey(); static final PropertyKey VISIBLE = new PropertyKey(); static final PropertyKey BOTTOM_OFFSET = new PropertyKey(); static final PropertyKey ACTIVE_TAB = new PropertyKey(); @@ -51,6 +54,11 @@ mTabListObservable = new ListModel<>(); } + @Override + public Collection<PropertyKey> getAllSetProperties() { + return PropertyKey.ALL_PROPERTIES; + } + void addActionListObserver(ListObservable.ListObserver<Void> observer) { mActionListObservable.addObserver(observer); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewBinder.java index b488ddb8..eb56988 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewBinder.java
@@ -14,7 +14,6 @@ import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.Action; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.Tab; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryModel.PropertyKey; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; import org.chromium.chrome.browser.modelutil.ListModel; import org.chromium.chrome.browser.modelutil.ListModelChangeProcessor; @@ -22,9 +21,7 @@ * Observes {@link KeyboardAccessoryModel} changes (like a newly available tab) and triggers the * {@link KeyboardAccessoryViewBinder} which will modify the view accordingly. */ -class KeyboardAccessoryViewBinder - implements LazyViewBinderAdapter.SimpleViewBinder<KeyboardAccessoryModel, - KeyboardAccessoryView, PropertyKey> { +class KeyboardAccessoryViewBinder { static class ActionViewHolder extends RecyclerView.ViewHolder { public ActionViewHolder(View actionView) { super(actionView); @@ -64,10 +61,9 @@ public void onItemsInserted( ListModel<Tab> model, KeyboardAccessoryView view, int index, int count) { assert count > 0 : "Tried to insert invalid amount of tabs - must be at least one."; - while (count-- > 0) { - Tab tab = model.get(index); - view.addTabAt(index, tab.getIcon(), tab.getContentDescription()); - ++index; + for (int i = index; i < index + count; i++) { + Tab tab = model.get(i); + view.addTabAt(i, tab.getIcon(), tab.getContentDescription()); } } @@ -89,58 +85,31 @@ void updateAllTabs(KeyboardAccessoryView view, ListModel<Tab> model) { view.clearTabs(); - for (int i = 0; i < model.size(); ++i) { - Tab tab = model.get(i); - // Mutate tab icons so we can apply color filters. - view.addTabAt(i, tab.getIcon().mutate(), tab.getContentDescription()); - } + if (model.size() > 0) onItemsInserted(model, view, 0, model.size()); } } - @Override - public PropertyKey getVisibilityProperty() { - return PropertyKey.VISIBLE; - } - - @Override - public boolean isVisible(KeyboardAccessoryModel model) { - return model.isVisible(); - } - - @Override - public void onInitialInflation( - KeyboardAccessoryModel model, KeyboardAccessoryView inflatedView) { - for (PropertyKey key : PropertyKey.ALL_PROPERTIES) { - bind(model, inflatedView, key); - } - - inflatedView.setActionsAdapter(KeyboardAccessoryCoordinator.createActionsAdapter(model)); - KeyboardAccessoryCoordinator.createTabViewBinder(model, inflatedView) - .updateAllTabs(inflatedView, model.getTabList()); - } - - @Override - public void bind( - KeyboardAccessoryModel model, KeyboardAccessoryView view, PropertyKey propertyKey) { - if (propertyKey == PropertyKey.VISIBLE) { + public static void bind(KeyboardAccessoryModel model, KeyboardAccessoryView view, + PropertyKey propertyKey) { + if (propertyKey == PropertyKey.ACTIONS) { + view.setActionsAdapter( + KeyboardAccessoryCoordinator.createActionsAdapter(model.getActionList())); + } else if (propertyKey == PropertyKey.TABS) { + KeyboardAccessoryCoordinator.createTabViewBinder(model, view) + .updateAllTabs(view, model.getTabList()); + } else if (propertyKey == PropertyKey.VISIBLE) { view.setActiveTabColor(model.activeTab()); view.setVisible(model.isVisible()); - return; - } - if (propertyKey == PropertyKey.ACTIVE_TAB) { + } else if (propertyKey == PropertyKey.ACTIVE_TAB) { view.setActiveTabColor(model.activeTab()); - return; - } - if (propertyKey == PropertyKey.BOTTOM_OFFSET) { + } else if (propertyKey == PropertyKey.BOTTOM_OFFSET) { view.setBottomOffset(model.bottomOffset()); - return; - } - if (propertyKey == PropertyKey.TAB_SELECTION_CALLBACKS) { + } else if (propertyKey == PropertyKey.TAB_SELECTION_CALLBACKS) { // Don't add null as listener. It's a valid state but an invalid argument. if (model.getTabSelectionCallbacks() == null) return; view.setTabSelectionAdapter(model.getTabSelectionCallbacks()); - return; + } else { + assert false : "Every possible property update needs to be handled!"; } - assert false : "Every possible property update needs to be handled!"; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java index 8212a217..c97d6818 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
@@ -5,11 +5,12 @@ package org.chromium.chrome.browser.autofill.keyboard_accessory; import android.support.annotation.Nullable; -import android.view.ViewStub; +import android.support.v4.view.ViewPager; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.Provider; import org.chromium.ui.DropdownPopupWindow; +import org.chromium.ui.ViewProvider; import org.chromium.ui.base.WindowAndroid; /** @@ -24,18 +25,23 @@ private final ManualFillingMediator mMediator = new ManualFillingMediator(); /** - * Initializes the manual filling component. Calls to this class are NoOps until - * {@link #initialize(WindowAndroid, ViewStub, ViewStub)} is called. + * Initializes the manual filling component. Calls to this class are NoOps until this method is + * called. * @param windowAndroid The window needed to listen to the keyboard and to connect to activity. - * @param keyboardAccessoryStub The view stub for keyboard accessory bar. - * @param accessorySheetStub The view stub for the keyboard accessory bottom sheet. + * @param accessoryViewProvider The view provider for the keyboard accessory bar. + * @param viewPagerProvider The view provider for the keyboard accessory bottom sheet. */ - public void initialize(WindowAndroid windowAndroid, ViewStub keyboardAccessoryStub, - ViewStub accessorySheetStub) { + public void initialize(WindowAndroid windowAndroid, + ViewProvider<KeyboardAccessoryView> accessoryViewProvider, + ViewProvider<ViewPager> viewPagerProvider) { KeyboardAccessoryCoordinator keyboardAccessory = - new KeyboardAccessoryCoordinator(keyboardAccessoryStub, mMediator); - AccessorySheetCoordinator accessorySheet = new AccessorySheetCoordinator( - accessorySheetStub, keyboardAccessory::getPageChangeListener); + new KeyboardAccessoryCoordinator(mMediator, accessoryViewProvider); + viewPagerProvider.whenLoaded(viewPager -> { + accessoryViewProvider.whenLoaded(accessoryView -> { + viewPager.addOnPageChangeListener(accessoryView.getPageChangeListener()); + }); + }); + AccessorySheetCoordinator accessorySheet = new AccessorySheetCoordinator(viewPagerProvider); mMediator.initialize(keyboardAccessory, accessorySheet, windowAndroid); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java index d4c1d39..b678382 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
@@ -37,7 +37,7 @@ class ManualFillingMediator extends EmptyTabObserver implements KeyboardAccessoryCoordinator.VisibilityDelegate { private WindowAndroid mWindowAndroid; - private @Px int mPreviousControlHeight = 0; + private @Px int mPreviousControlHeight; private final WindowAndroid.KeyboardVisibilityListener mVisibilityListener = this::onKeyboardVisibilityChanged; @@ -109,7 +109,7 @@ @Override public void onSceneStartShowing(Layout layout) { // Includes events like side-swiping between tabs and triggering contextual search. - mKeyboardAccessory.dismiss(); + pause(); } @Override @@ -119,7 +119,7 @@ private final TabObserver mTabObserver = new EmptyTabObserver() { @Override public void onHidden(Tab tab) { - mKeyboardAccessory.dismiss(); + pause(); } @Override @@ -130,7 +130,7 @@ @Override public void onEnterFullscreenMode(Tab tab, FullscreenOptions options) { - mKeyboardAccessory.dismiss(); + pause(); } }; @@ -188,11 +188,13 @@ mKeyboardAccessory.requestShowing(); mActivity.getFullscreenManager().setBottomControlsHeight(calculateAccessoryBarHeight()); mKeyboardAccessory.closeActiveTab(); + updateInfobarState(true); mKeyboardAccessory.setBottomOffset(0); mAccessorySheet.hide(); } else { mKeyboardAccessory.close(); onBottomControlSpaceChanged(); + updateInfobarState(/* shouldBeHidden= */ mKeyboardAccessory.hasActiveTab()); if (mKeyboardAccessory.hasActiveTab()) { mAccessorySheet.show(); } @@ -223,7 +225,7 @@ boolean handleBackPress() { if (isInitialized() && mAccessorySheet.isShown()) { - mKeyboardAccessory.dismiss(); + pause(); return true; } return false; @@ -231,7 +233,7 @@ void dismiss() { if (!isInitialized()) return; - mKeyboardAccessory.dismiss(); + pause(); if (getContentView() != null) UiUtils.hideKeyboard(getContentView()); } @@ -242,6 +244,7 @@ public void pause() { if (!isInitialized()) return; mKeyboardAccessory.dismiss(); + updateInfobarState(false); } void resume() { @@ -269,6 +272,7 @@ } mActivity.getFullscreenManager().setBottomControlsHeight(mPreviousControlHeight); mKeyboardAccessory.closeActiveTab(); + updateInfobarState(false); mKeyboardAccessory.setBottomOffset(0); mAccessorySheet.hide(); } @@ -325,7 +329,7 @@ } private void restoreCachedState(Tab browserTab) { - mKeyboardAccessory.dismiss(); + pause(); clearTabs(); if (browserTab == null) return; // If there is no tab, exit after cleaning everything. AccessoryState state = getOrCreateAccessoryState(browserTab); @@ -354,6 +358,18 @@ org.chromium.chrome.R.dimen.keyboard_accessory_suggestion_height); } + // TODO(fhorschig): Remove when accessory sheet acts as keyboard. + /** + * Sets the infobar state to the given value. Does nothing if there is no active tab with an + * {@link org.chromium.chrome.browser.infobar.InfoBarContainer}. + * @param shouldBeHidden If true, info bars can be shown. They are suppressed on false. + */ + private void updateInfobarState(boolean shouldBeHidden) { + if (mActiveBrowserTab == null) return; + if (mActiveBrowserTab.getInfoBarContainer() == null) return; + mActiveBrowserTab.getInfoBarContainer().setHidden(shouldBeHidden); + } + @VisibleForTesting void addTab(KeyboardAccessoryData.Tab tab) { if (!isInitialized()) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java index f9288ef..f3583f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
@@ -67,7 +67,7 @@ private final String mPackageName; private final String mSignatureFingerprint; private final @Relation int mRelation; - private long mNativeOriginVerifier = 0; + private long mNativeOriginVerifier; private Origin mOrigin; /** Small helper class to post a result of origin verification. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java index 7dd5d892..397687b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java
@@ -66,7 +66,7 @@ * The padded height of the Bar Banner in pixels. Set to zero initially, calculated on the first * call. */ - private float mPaddedHeightPx = 0.f; + private float mPaddedHeightPx; /** * The precomputed minimum width of the Ripple resource in pixels.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java index 94cc600..59a1b6a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java
@@ -267,6 +267,12 @@ } } + public static void unsetAnimationMultiplierForTesting() { + synchronized (sLock) { + sAnimationMultiplier = null; + } + } + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public static float getAnimationMultiplier() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) return 1f;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java index 94dcbda..155c6416 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java
@@ -5,7 +5,9 @@ package org.chromium.chrome.browser.contacts_picker; import android.support.annotation.Nullable; +import android.util.JsonWriter; +import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -79,6 +81,23 @@ } /** + * Appends to a string |builder| this contact (in json form). + * @param writer The JsonWriter object to add the data to. + */ + public void appendJson(JsonWriter writer) throws IOException { + writer.beginObject(); + writer.name("name"); + writer.value(getDisplayName()); + writer.name("emails"); + writer.beginArray(); + for (String email : mEmails) { + writer.value(email); + } + writer.endArray(); + writer.endObject(); + } + + /** * A comparison function (results in a full name ascending sorting). * @param other The other ContactDetails object to compare it with. * @return 0, 1, or -1, depending on which is bigger.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java index ca7d25a..8513882 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java
@@ -9,6 +9,7 @@ import android.content.res.Resources; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.JsonWriter; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; @@ -24,6 +25,8 @@ import org.chromium.ui.ContactsPickerListener; import org.chromium.ui.UiUtils; +import java.io.IOException; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -275,15 +278,24 @@ * Notifies any listeners that one or more contacts have been selected. */ private void notifyContactsSelected() { - List<ContactDetails> selectedFiles = mSelectionDelegate.getSelectedItemsAsList(); - Collections.sort(selectedFiles); - String[] contacts = new String[selectedFiles.size()]; - int i = 0; - for (ContactDetails contactDetails : selectedFiles) { - contacts[i++] = contactDetails.getDisplayName(); - } + List<ContactDetails> selectedContacts = mSelectionDelegate.getSelectedItemsAsList(); + Collections.sort(selectedContacts); - executeAction(ContactsPickerListener.ContactsPickerAction.CONTACTS_SELECTED, contacts); + StringWriter out = new StringWriter(); + final JsonWriter writer = new JsonWriter(out); + + try { + writer.beginArray(); + for (ContactDetails contactDetails : selectedContacts) { + contactDetails.appendJson(writer); + } + writer.endArray(); + executeAction( + ContactsPickerListener.ContactsPickerAction.CONTACTS_SELECTED, out.toString()); + } catch (IOException e) { + assert false; + executeAction(ContactsPickerListener.ContactsPickerAction.CANCEL, null); + } } /** @@ -292,7 +304,7 @@ * @param contacts The contacts that were selected (if any). */ private void executeAction( - ContactsPickerListener.ContactsPickerAction action, String[] contacts) { + ContactsPickerListener.ContactsPickerAction action, String contacts) { mListener.onContactsPickerUserAction(action, contacts); mDialog.dismiss(); UiUtils.onContactsPickerDismissed();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java index d9014ef..25b08f6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java
@@ -9,6 +9,8 @@ import org.chromium.chrome.browser.modelutil.PropertyObservable; import org.chromium.chrome.browser.widget.ListMenuButton; +import java.util.Arrays; +import java.util.Collection; import java.util.List; /** A model for the contextual suggestions UI component. */ @@ -43,6 +45,17 @@ private float mToolbarTranslationPercent; private int mToolbarArrowTintResourceId; + @Override + public Collection<PropertyKey> getAllSetProperties() { + // This is only the list of initially set properties and doesn't reflect changes after the + // object has been created. but currently this method is only called initially. + // Once this model is migrated to PropertyModel, the implementation will be correct. + return Arrays.asList(PropertyKey.CLOSE_BUTTON_ON_CLICK_LISTENER, + PropertyKey.MENU_BUTTON_VISIBILITY, PropertyKey.MENU_BUTTON_DELEGATE, + PropertyKey.TITLE, PropertyKey.DEFAULT_TOOLBAR_ON_CLICK_LISTENER, + PropertyKey.SLIM_PEEK_ENABLED); + } + /** @param clusters The current list of clusters. */ void setClusterList(List<ContextualSuggestionsCluster> clusters) { mClusterList.setClusters(clusters);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarCoordinator.java index 3e9a867..2462f764 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarCoordinator.java
@@ -18,9 +18,8 @@ * {@link ContextualSuggestionsCoordinator} and lifecycle of sub-component objects. */ class ToolbarCoordinator { - private final ContextualSuggestionsModel mModel; - private ToolbarView mToolbarView; - private PropertyModelChangeProcessor<ContextualSuggestionsModel, ToolbarView, PropertyKey> + private final ToolbarView mToolbarView; + private final PropertyModelChangeProcessor<ContextualSuggestionsModel, ToolbarView, PropertyKey> mModelChangeProcessor; /** @@ -30,24 +29,11 @@ * @param model The {@link ContextualSuggestionsModel} for the component. */ ToolbarCoordinator(Context context, ViewGroup parentView, ContextualSuggestionsModel model) { - mModel = model; - mToolbarView = (ToolbarView) LayoutInflater.from(context).inflate( R.layout.contextual_suggestions_toolbar, parentView, false); mModelChangeProcessor = - new PropertyModelChangeProcessor<>(mModel, mToolbarView, new ToolbarViewBinder()); - mModel.addObserver(mModelChangeProcessor); - - // The ToolbarCoordinator is created dynamically as needed, so the initial model state - // needs to be bound on creation. - mModelChangeProcessor.onPropertyChanged(mModel, PropertyKey.CLOSE_BUTTON_ON_CLICK_LISTENER); - mModelChangeProcessor.onPropertyChanged(mModel, PropertyKey.MENU_BUTTON_VISIBILITY); - mModelChangeProcessor.onPropertyChanged(mModel, PropertyKey.MENU_BUTTON_DELEGATE); - mModelChangeProcessor.onPropertyChanged(mModel, PropertyKey.TITLE); - mModelChangeProcessor.onPropertyChanged( - mModel, PropertyKey.DEFAULT_TOOLBAR_ON_CLICK_LISTENER); - mModelChangeProcessor.onPropertyChanged(mModel, PropertyKey.SLIM_PEEK_ENABLED); + PropertyModelChangeProcessor.create(model, mToolbarView, new ToolbarViewBinder()); } /** @return The content {@link View}. */ @@ -57,8 +43,6 @@ /** Destroy the toolbar component. */ void destroy() { - // The model outlives the toolbar sub-component. Remove the observer so that this object - // can be garbage collected. - mModel.removeObserver(mModelChangeProcessor); + mModelChangeProcessor.destroy(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPreferenceHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPreferenceHelper.java index c7791c7..8122ce2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPreferenceHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPreferenceHelper.java
@@ -17,7 +17,7 @@ public static final String THROTTLE = "throttle"; // Our singleton instance. - private static ContextualSearchPreferenceHelper sInstance = null; + private static ContextualSearchPreferenceHelper sInstance; // Pointer to the native instance of this class. private long mNativePointer;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/PureJavaExceptionReporter.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/PureJavaExceptionReporter.java index 0ea51024..ee45085d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/PureJavaExceptionReporter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/PureJavaExceptionReporter.java
@@ -60,8 +60,8 @@ private static final String RN = "\r\n"; private static final String FORM_DATA_MESSAGE = "Content-Disposition: form-data; name=\""; - protected File mMinidumpFile = null; - private FileOutputStream mMinidumpFileStream = null; + protected File mMinidumpFile; + private FileOutputStream mMinidumpFileStream; private final String mLocalId = UUID.randomUUID().toString().replace("-", "").substring(0, 16); private final String mBoundary = "------------" + UUID.randomUUID() + RN;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java index 28005d3..d92a83a9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java
@@ -162,6 +162,7 @@ /** Per-session values. */ private static class SessionParams { public final int uid; + private CustomTabsCallback mCustomTabsCallback; public final DisconnectCallback disconnectCallback; public final PostMessageHandler postMessageHandler; public final Set<Origin> mLinkedOrigins = new HashSet<>(); @@ -182,10 +183,11 @@ private boolean mAllowResourcePrefetch; private boolean mShouldGetPageLoadMetrics; - public SessionParams(Context context, int uid, DisconnectCallback callback, - PostMessageHandler postMessageHandler) { + public SessionParams(Context context, int uid, CustomTabsCallback customTabsCallback, + DisconnectCallback callback, PostMessageHandler postMessageHandler) { this.uid = uid; mPackageName = getPackageName(context, uid); + mCustomTabsCallback = customTabsCallback; disconnectCallback = callback; this.postMessageHandler = postMessageHandler; if (postMessageHandler != null) this.postMessageHandler.setPackageName(mPackageName); @@ -253,6 +255,14 @@ public boolean isDefault() { return !mIgnoreFragments && !mShouldSpeculateLoadOnCellular; } + + public CustomTabsCallback getCustomTabsCallback() { + return mCustomTabsCallback; + } + + public void setCustomTabsCallback(CustomTabsCallback customTabsCallback) { + mCustomTabsCallback = customTabsCallback; + } } private final Map<CustomTabsSessionToken, SessionParams> mSessionParams = new HashMap<>(); @@ -271,15 +281,17 @@ * @param postMessageHandler The handler to be used for postMessage related operations. * @return true for success. */ - public boolean newSession(CustomTabsSessionToken session, int uid, + public synchronized boolean newSession(CustomTabsSessionToken session, int uid, DisconnectCallback onDisconnect, @NonNull PostMessageHandler postMessageHandler) { - if (session == null) return false; - SessionParams params = new SessionParams( - ContextUtils.getApplicationContext(), uid, onDisconnect, postMessageHandler); - synchronized (this) { - if (mSessionParams.containsKey(session)) return false; + if (session == null || session.getCallback() == null) return false; + if (mSessionParams.containsKey(session)) { + mSessionParams.get(session).setCustomTabsCallback(session.getCallback()); + } else { + SessionParams params = new SessionParams(ContextUtils.getApplicationContext(), uid, + session.getCallback(), onDisconnect, postMessageHandler); mSessionParams.put(session, params); } + return true; } @@ -518,7 +530,10 @@ * @return The callback {@link CustomTabsSessionToken} for the given session. */ public synchronized CustomTabsCallback getCallbackForSession(CustomTabsSessionToken session) { - return session != null ? session.getCallback() : null; + if (session != null && mSessionParams.containsKey(session)) { + return mSessionParams.get(session).getCustomTabsCallback(); + } + return null; } /** @@ -748,6 +763,7 @@ * Cleans up all data associated with all sessions. */ public synchronized void cleanupAll() { + // cleanupSessionInternal modifies mSessionParams therefore we need a copy List<CustomTabsSessionToken> sessions = new ArrayList<>(mSessionParams.keySet()); for (CustomTabsSessionToken session : sessions) cleanupSession(session); } @@ -756,14 +772,44 @@ * Handle any clean up left after a session is destroyed. * @param session The session that has been destroyed. */ - public synchronized void cleanupSession(CustomTabsSessionToken session) { + private synchronized void cleanupSessionInternal(CustomTabsSessionToken session) { SessionParams params = mSessionParams.get(session); if (params == null) return; mSessionParams.remove(session); - if (params.postMessageHandler != null) + if (params.postMessageHandler != null) { params.postMessageHandler.cleanup(ContextUtils.getApplicationContext()); + } if (params.originVerifier != null) params.originVerifier.cleanUp(); if (params.disconnectCallback != null) params.disconnectCallback.run(session); mUidHasCalledWarmup.delete(params.uid); } + + /** + * Destroys session when its callback become invalid if the callback is used as identifier. + * + * @param session The session with invalid callback. + */ + public synchronized void cleanupSession(CustomTabsSessionToken session) { + if (session.hasId()) { + // Leave session parameters, so client might update callback later. + // The session will be completely removed when system runs low on memory. + // {@see #cleanupUnusedSessions} + mSessionParams.get(session).setCustomTabsCallback(null); + } else { + cleanupSessionInternal(session); + } + } + + /** + * Clean up all sessions which are not currently used. + */ + public synchronized void cleanupUnusedSessions() { + // cleanupSessionInternal modifies mSessionParams therefore we need a copy + List<CustomTabsSessionToken> sessions = new ArrayList<>(mSessionParams.keySet()); + for (CustomTabsSessionToken session : sessions) { + if (mSessionParams.get(session).getCustomTabsCallback() == null) { + cleanupSessionInternal(session); + } + } + } }
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 bbd9cc6..547354bb 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
@@ -15,6 +15,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.StrictMode; import android.os.SystemClock; @@ -46,6 +47,7 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ActivityTabTaskDescriptionHelper; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; @@ -195,6 +197,19 @@ private boolean mModuleOnResumePending; private boolean mHasSetOverlayView; + private ActivityTabTaskDescriptionHelper mTaskDescriptionHelper; + + /** + * Return true when the activity has been launched in a separate task. The default behavior is + * to reuse the same task and put the activity on top of the previous one (i.e hiding it). A + * separate task creates a new entry in the Android recent screen. + **/ + private boolean useSeparateTask() { + final int separateTaskFlags = + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT; + return (getIntent().getFlags() & separateTaskFlags) != 0; + } + private TabModelObserver mCloseActivityWhenEmptyTabModelObserver = new EmptyTabModelObserver() { @Override public void didCloseTab(int tabId, boolean incognito) { @@ -668,6 +683,11 @@ mTrustedWebActivityUi.initialShowSnackbarIfNeeded(); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && useSeparateTask()) { + mTaskDescriptionHelper = new ActivityTabTaskDescriptionHelper(this, + ApiCompatibilityUtils.getColor(getResources(), R.color.default_primary_color)); + } + super.finishNativeInitialization(); } @@ -910,6 +930,8 @@ if (mIncognitoTabHost != null) { IncognitoTabHostRegistry.getInstance().unregister(mIncognitoTabHost); } + + if (mTaskDescriptionHelper != null) mTaskDescriptionHelper.destroy(); } @Override @@ -1079,8 +1101,11 @@ * recents. */ protected void handleFinishAndClose() { - // When on top of another app, finish is all that is required. - finish(); + if (useSeparateTask()) { + ApiCompatibilityUtils.finishAndRemoveTask(this); + } else { + finish(); + } } @Override
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 b15a40a..5d6b42a 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
@@ -185,8 +185,7 @@ new EnumeratedHistogramSample( "CustomTabs.ParallelRequestStatusOnStart", ParallelRequestStatus.NUM_ENTRIES); - private static final CustomTabsConnection sInstance = - AppHooks.get().createCustomTabsConnection(); + private static CustomTabsConnection sInstance; private @Nullable String mTrustedPublisherUrlPackage; /** Holds the parameters for the current hidden tab speculation. */ @@ -259,9 +258,17 @@ * @return The unique instance of ChromeCustomTabsConnection. */ public static CustomTabsConnection getInstance() { + if (sInstance == null) { + sInstance = AppHooks.get().createCustomTabsConnection(); + } + return sInstance; } + private static boolean hasInstance() { + return sInstance != null; + } + /** * If service requests logging is enabled, logs that a call was made. * @@ -390,7 +397,7 @@ * @return Whether {@link CustomTabsConnection#warmup(long)} has been called. */ public static boolean hasWarmUpBeenFinished() { - return sInstance.mWarmupHasBeenFinished.get(); + return getInstance().mWarmupHasBeenFinished.get(); } /** @@ -1316,6 +1323,13 @@ ThreadUtils.runOnUiThread(() -> mClientManager.cleanupSession(session)); } + /** + * Clean up unused sessions, i.e sessions without callback. + */ + public static void cleanUpUnusedSessions() { + if (hasInstance()) getInstance().mClientManager.cleanupUnusedSessions(); + } + @VisibleForTesting int maySpeculateWithResult(CustomTabsSessionToken session) { if (!DeviceClassManager.enablePrerendering()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity.java index caa39bc..0fb36fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity.java
@@ -3,39 +3,11 @@ // found in the LICENSE file. package org.chromium.chrome.browser.customtabs; - -import android.os.Build; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ActivityTabTaskDescriptionHelper; - /** - * Simple wrapper around the CustomTabActivity to be used when launching each CustomTab in a - * separate task. + * Wrapper around the CustomTabActivity for Android version pre L to be used when launching + * each CustomTab in a separate task. This class is copied 10 times as + * SeparateTaskCustomTabActivity${i} to "emulate" having multi task being supported. + * + * TODO(arthursonzogni, tedchoc): Remove this after M74. */ -public class SeparateTaskCustomTabActivity extends CustomTabActivity { - private ActivityTabTaskDescriptionHelper mTaskDescriptionHelper; - - @Override - public void finishNativeInitialization() { - super.finishNativeInitialization(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mTaskDescriptionHelper = new ActivityTabTaskDescriptionHelper(this, - ApiCompatibilityUtils.getColor(getResources(), R.color.default_primary_color)); - } - } - - @Override - protected void onDestroyInternal() { - super.onDestroyInternal(); - - if (mTaskDescriptionHelper != null) mTaskDescriptionHelper.destroy(); - } - - @Override - protected void handleFinishAndClose() { - ApiCompatibilityUtils.finishAndRemoveTask(this); - } -} +public class SeparateTaskCustomTabActivity extends CustomTabActivity {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java index 64c47b4e..65e6af8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java
@@ -69,7 +69,7 @@ Log.w(TAG, "Done checking if delayed stopAndUnbindService needs to be resolved."); } }; - private boolean mStopServiceDelayed = false; + private boolean mStopServiceDelayed; private int mPinnedNotificationId = INVALID_NOTIFICATION_ID;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMediaParserBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMediaParserBridge.java index 4413b87a..1c30cc6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMediaParserBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMediaParserBridge.java
@@ -13,8 +13,15 @@ public class DownloadMediaParserBridge { private long mNativeDownloadMediaParserBridge; - public DownloadMediaParserBridge() { - mNativeDownloadMediaParserBridge = nativeInit(); + /** Creates a media parser to analyze media metadata and retrieve thumbnails. + * @param mimeType The mime type of the media file. + * @param filePath The absolute path of the media file. + * @param totalSize Total size of the media file. + * @param callback Callback to get the result. + */ + public DownloadMediaParserBridge( + String mimeType, String filePath, long totalSize, Callback<Boolean> callback) { + mNativeDownloadMediaParserBridge = nativeInit(mimeType, filePath, totalSize, callback); } /** @@ -27,22 +34,16 @@ } /** - * Parses a media file to retrieve media metadata and video thumbnail. - * @param mimeType The mime type of the media file. - * @param filePath The absolute path of the media file. - * @param totalSize Total size of the media file. - * @param callback Callback to get the result. + * Starts to parse a media file to retrieve media metadata and video thumbnail. */ - public void parseMediaFile( - String mimeType, String filePath, long totalSize, Callback<Boolean> callback) { + public void start() { if (mNativeDownloadMediaParserBridge != 0) { - nativeParseMediaFile( - mNativeDownloadMediaParserBridge, mimeType, filePath, totalSize, callback); + nativeStart(mNativeDownloadMediaParserBridge); } } - private native long nativeInit(); + private native long nativeInit( + String mimeType, String filePath, long totalSize, Callback<Boolean> callback); private native void nativeDestory(long nativeDownloadMediaParserBridge); - private native void nativeParseMediaFile(long nativeDownloadMediaParserBridge, String mimeType, - String filePath, long totalSize, Callback<Boolean> callback); + private native void nativeStart(long nativeDownloadMediaParserBridge); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/empty/EmptyCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/empty/EmptyCoordinator.java index fab8c7d..5bab5f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/empty/EmptyCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/empty/EmptyCoordinator.java
@@ -27,10 +27,10 @@ private final PrefetchStatusProvider mPrefetchStatusProvider; private final OfflineItemFilterSource mSource; - private final PropertyModel mModel; + private final PropertyModel mModel = new PropertyModel(EmptyProperties.ALL_KEYS); private final EmptyView mView; - private boolean mShowingPrefetch = false; + private boolean mShowingPrefetch; /** Creates a {@link EmptyCoordinator} instance that monitors {@code source}. */ public EmptyCoordinator(Context context, PrefetchStatusProvider prefetchStatusProvider, @@ -40,10 +40,8 @@ mSource.addObserver(this); - mModel = new PropertyModel(EmptyProperties.ALL_KEYS); mView = new EmptyView(context); - mModel.addObserver( - new PropertyModelChangeProcessor<>(mModel, mView, new EmptyViewBinder())); + PropertyModelChangeProcessor.create(mModel, mView, new EmptyViewBinder()); calculateState(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterCoordinator.java index 3145a04..a81e008 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterCoordinator.java
@@ -33,10 +33,8 @@ void onFilterChanged(@FilterType int selectedTab); } - private final PrefetchStatusProvider mPrefetchStatusProvider; private final ObserverList<Observer> mObserverList = new ObserverList<>(); - private final PropertyModel mModel; - private final FilterViewBinder mViewBinder; + private final PropertyModel mModel = new PropertyModel(FilterProperties.ALL_KEYS); private final FilterView mView; private final ChipsCoordinator mChipsCoordinator; @@ -48,20 +46,16 @@ */ public FilterCoordinator(Context context, PrefetchStatusProvider prefetchStatusProvider, OfflineItemFilterSource chipFilterSource) { - mPrefetchStatusProvider = prefetchStatusProvider; mChipsProvider = new FilterChipsProvider(type -> handleChipSelected(), chipFilterSource); mChipsCoordinator = new ChipsCoordinator(context, mChipsProvider); - mModel = new PropertyModel(FilterProperties.ALL_KEYS); - mViewBinder = new FilterViewBinder(); mView = new FilterView(context); - mModel.addObserver(new PropertyModelChangeProcessor<>(mModel, mView, mViewBinder)); + PropertyModelChangeProcessor.create(mModel, mView, new FilterViewBinder()); - mModel.setValue( - FilterProperties.CHANGE_LISTENER, selectedTab -> handleTabSelected(selectedTab)); + mModel.setValue(FilterProperties.CHANGE_LISTENER, this::handleTabSelected); selectTab(TabType.FILES); - mModel.setValue(FilterProperties.SHOW_TABS, mPrefetchStatusProvider.enabled()); + mModel.setValue(FilterProperties.SHOW_TABS, prefetchStatusProvider.enabled()); } /** @return The {@link View} representing this widget. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java index fb2eb0b..26c21efb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
@@ -80,15 +80,14 @@ mView.setLayoutManager(new GridLayoutManagerImpl(context)); mView.addItemDecoration(new ItemDecorationImpl()); - ListPropertyViewBinder propertyViewBinder = new ListPropertyViewBinder(); - mModel.getProperties().addObserver(new PropertyModelChangeProcessor<>( - mModel.getProperties(), mView, propertyViewBinder)); + PropertyModelChangeProcessor.create( + mModel.getProperties(), mView, new ListPropertyViewBinder()); // Do the final hook up to the underlying data adapter. DateOrderedListViewAdapter adapter = new DateOrderedListViewAdapter( mModel, new ModelChangeProcessor(mModel), ListItemViewHolder::create); mView.setAdapter(adapter); - mView.post(() -> adapter.notifyDataSetChanged()); + mView.post(adapter::notifyDataSetChanged); } /** @return The Android {@link View} representing this widget. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java index 3dc06fe1..818790e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java
@@ -20,16 +20,14 @@ * The coordinator responsible for creating the storage summary view in download home. */ public class StorageCoordinator { - private final PropertyModel mModel; + private final PropertyModel mModel = new PropertyModel(StorageProperties.ALL_KEYS); private final TextView mView; - private final StorageSummaryProvider mProvider; public StorageCoordinator(Context context, OfflineItemFilterSource filterSource) { - mModel = new PropertyModel(StorageProperties.ALL_KEYS); mView = (TextView) LayoutInflater.from(context).inflate( R.layout.download_storage_summary, null); - mModel.addObserver(new PropertyModelChangeProcessor<>(mModel, mView, this ::bind)); - mProvider = new StorageSummaryProvider(context, this ::onStorageInfoUpdated, filterSource); + PropertyModelChangeProcessor.create(mModel, mView, this::bind); + new StorageSummaryProvider(context, this::onStorageInfoUpdated, filterSource); } /** @return The {@link View} to be shown that contains the storage information. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl.java index 721b328..692f40c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl.java
@@ -5,9 +5,11 @@ package org.chromium.chrome.browser.infobar; import android.content.Context; +import android.support.annotation.Nullable; import android.view.View; import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.DownloadInfoBarController; import org.chromium.chrome.browser.download.DownloadManagerService; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.infobar.IPHInfoBarSupport.PopupState; @@ -65,15 +67,16 @@ } } - private TrackerParameters getTrackerParameters(@InfoBarIdentifier int infoBarId) { + private @Nullable TrackerParameters getTrackerParameters(@InfoBarIdentifier int infoBarId) { switch (infoBarId) { case InfoBarIdentifier.DATA_REDUCTION_PROXY_PREVIEW_INFOBAR_DELEGATE: return new TrackerParameters(FeatureConstants.DATA_SAVER_PREVIEW_FEATURE, R.string.iph_data_saver_preview_text, R.string.iph_data_saver_preview_text); case InfoBarIdentifier.DOWNLOAD_PROGRESS_INFOBAR_ANDROID: - return DownloadManagerService.getDownloadManagerService() - .getInfoBarController(Profile.getLastUsedProfile().isOffTheRecord()) - .getTrackerParameters(); + DownloadInfoBarController controller = + DownloadManagerService.getDownloadManagerService() + .getInfoBarController(Profile.getLastUsedProfile().isOffTheRecord()); + return controller != null ? controller.getTrackerParameters() : null; default: return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java index 19e21157..9b1ecff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
@@ -50,7 +50,7 @@ private TranslateTabLayout mTabLayout; // Metric to track the total number of translations in a page, including reverts to original. - private int mTotalTranslationCount = 0; + private int mTotalTranslationCount; // Histogram names for logging metrics. private static final String INFOBAR_HISTOGRAM_TRANSLATE_LANGUAGE =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaViewerUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaViewerUtils.java index f98d8ca..cb3b6f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaViewerUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaViewerUtils.java
@@ -40,7 +40,7 @@ private static final String MIMETYPE_IMAGE = "image"; private static final String MIMETYPE_VIDEO = "video"; - private static boolean sIsMediaLauncherActivityForceEnabledForTest = false; + private static boolean sIsMediaLauncherActivityForceEnabledForTest; /** * Creates an Intent that allows viewing the given file in an internal media viewer.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/DefaultMediaRouteController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/DefaultMediaRouteController.java index 3e70ed0..b026b26 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/DefaultMediaRouteController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/DefaultMediaRouteController.java
@@ -811,7 +811,11 @@ public void deliverResult(Uri uri, boolean playable) { callback.onResult(playable, uri.toString(), frameUrl); } - }, userAgent).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + + // Some webpages have >100 media files, which causes the THREAD_POOL_EXECUTOR to get + // flooded with requests and causes a crash. We use SERIAL_EXECUTOR instead, to allow + // for an unlimited number of tasks. See https://crbug.com/873941. + }, userAgent).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java index 68d24b89..5d709ef8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
@@ -80,8 +80,8 @@ new HashMap<String, Map<MediaRouteProvider, List<MediaSink>>>(); private final Map<String, List<MediaSink>> mSinksPerSource = new HashMap<String, List<MediaSink>>(); - private static boolean sAndroidMediaRouterSetForTest = false; - private static MediaRouter sAndroidMediaRouterForTest = null; + private static boolean sAndroidMediaRouterSetForTest; + private static MediaRouter sAndroidMediaRouterForTest; @VisibleForTesting public static void setAndroidMediaRouterForTest(MediaRouter router) { @@ -200,13 +200,6 @@ } @Override - public void onMessageSentResult(boolean success, int callbackId) { - if (mNativeMediaRouterAndroidBridge != 0) { - nativeOnMessageSentResult(mNativeMediaRouterAndroidBridge, success, callbackId); - } - } - - @Override public void onMessage(String mediaRouteId, String message) { if (mNativeMediaRouterAndroidBridge != 0) { nativeOnMessage(mNativeMediaRouterAndroidBridge, mediaRouteId, message); @@ -370,17 +363,15 @@ * Sends a string message to the specified route. * @param routeId The id of the route to send the message to. * @param message The message to send. - * @param callbackId The id of the result callback tracked by the native side. */ @CalledByNative - public void sendStringMessage(String routeId, String message, int callbackId) { + public void sendStringMessage(String routeId, String message) { MediaRouteProvider provider = mRouteIdsToProviders.get(routeId); if (provider == null) { - nativeOnMessageSentResult(mNativeMediaRouterAndroidBridge, false, callbackId); return; } - provider.sendStringMessage(routeId, message, callbackId); + provider.sendStringMessage(routeId, message); } /** @@ -435,8 +426,6 @@ native void nativeOnRouteClosed(long nativeMediaRouterAndroidBridge, String mediaRouteId); native void nativeOnRouteClosedWithError( long nativeMediaRouterAndroidBridge, String mediaRouteId, String message); - native void nativeOnMessageSentResult( - long nativeMediaRouterAndroidBridge, boolean success, int callbackId); native void nativeOnMessage( long nativeMediaRouterAndroidBridge, String mediaRouteId, String message); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java index 382934b..d4308b01 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java
@@ -61,13 +61,6 @@ public void onRouteClosedWithError(String mediaRouteId, String message); /** - * Called when sending the message to the route finished. - * @param success Indicates if the message was sent successfully. - * @param callbackId The identifier of the callback to pass the result to. - */ - public void onMessageSentResult(boolean success, int callbackId); - - /** * Called when a specified media route receives a message. * @param mediaRouteId The identifier of the media route. * @param message The message contents.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java index 074a3f4..49ad74d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java
@@ -82,9 +82,8 @@ * Sends a message to the route with the given id. The route must be created by this provider. * @param routeId The id of the route to send the message to. * @param message The message to send. - * @param nativeCallbackId The id of the result callback tracked by the native side. */ - void sendStringMessage(String routeId, String message, int nativeCallbackId); + void sendStringMessage(String routeId, String message); /** * Returns a FlingingController for the given route ID.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java index 662a066..562dd8a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java
@@ -100,16 +100,14 @@ } @Override - public void sendStringMessage(String routeId, String message, int nativeCallbackId) { + public void sendStringMessage(String routeId, String message) { Log.d(TAG, "Received message from client: %s", message); if (!mRoutes.containsKey(routeId)) { - mManager.onMessageSentResult(false, nativeCallbackId); return; } - mManager.onMessageSentResult( - mMessageHandler.handleMessageFromClient(message), nativeCallbackId); + mMessageHandler.handleMessageFromClient(message); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java index 4e37742..c879201b4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java
@@ -202,7 +202,7 @@ public abstract void detachRoute(String routeId); @Override - public abstract void sendStringMessage(String routeId, String message, int nativeCallbackId); + public abstract void sendStringMessage(String routeId, String message); // ChromeCastSessionObserver implementation. @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java index 874ee1d..f2d1b34 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java
@@ -84,10 +84,6 @@ } } - public void onMessageSentResult(boolean success, int callbackId) { - mManager.onMessageSentResult(success, callbackId); - } - public void onMessage(String clientId, String message) { ClientRecord clientRecord = mClientRecords.get(clientId); if (clientRecord == null) return; @@ -209,15 +205,13 @@ // Migrated to CafMessageHandler. See https://crbug.com/711860. @Override - public void sendStringMessage(String routeId, String message, int nativeCallbackId) { + public void sendStringMessage(String routeId, String message) { Log.d(TAG, "Received message from client: %s", message); if (!mRoutes.containsKey(routeId)) { - mManager.onMessageSentResult(false, nativeCallbackId); return; } - boolean success = false; try { JSONObject jsonMessage = new JSONObject(message); @@ -226,20 +220,17 @@ // "leave_session" from CastMRP to CastMessageHandler. Also, need to have a // ClientManager for client managing. if ("client_connect".equals(messageType)) { - success = handleClientConnectMessage(jsonMessage); + handleClientConnectMessage(jsonMessage); } else if ("client_disconnect".equals(messageType)) { - success = handleClientDisconnectMessage(jsonMessage); + handleClientDisconnectMessage(jsonMessage); } else if ("leave_session".equals(messageType)) { - success = handleLeaveSessionMessage(jsonMessage); + handleLeaveSessionMessage(jsonMessage); } else if (mSession != null) { - success = mMessageHandler.handleSessionMessage(jsonMessage); + mMessageHandler.handleSessionMessage(jsonMessage); } } catch (JSONException e) { Log.e(TAG, "JSONException while handling internal message: " + e); - success = false; } - - mManager.onMessageSentResult(success, nativeCallbackId); } // Migrated to CafMessageHandler. See https://crbug.com/711860.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java index eddd689..591e896 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java
@@ -119,7 +119,7 @@ private CastSessionManagerListener mCurrentSessionListener; // Whether we are currently in the process of launching a session. - private boolean mSessionLaunching = false; + private boolean mSessionLaunching; public static ChromeCastSessionManager get() { if (sInstance == null) sInstance = new ChromeCastSessionManager();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java index 8255fb6..76b55bbd9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java
@@ -48,7 +48,7 @@ private ApplicationMetadata mApplicationMetadata; private MediaNotificationInfo.Builder mNotificationBuilder; private RemoteMediaPlayerWrapper mMediaPlayerWrapper; - private boolean mStoppingApplication = false; + private boolean mStoppingApplication; public RemotingCastSession(GoogleApiClient apiClient, String sessionId, ApplicationMetadata metadata, String applicationStatus, CastDevice castDevice,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java index a86374091..3abfa8bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java
@@ -77,9 +77,8 @@ } @Override - public void sendStringMessage(String routeId, String message, int nativeCallbackId) { + public void sendStringMessage(String routeId, String message) { Log.e(TAG, "Remote playback does not support sending messages"); - mManager.onMessageSentResult(false, nativeCallbackId); } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java index 1ae1c21..0176649 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUma.java
@@ -295,8 +295,8 @@ */ public static void logSpaceUsageUMAWhenInstallationFails() { new AsyncTask<Void>() { - long mAvailableSpaceInByte = 0; - long mCacheSizeInByte = 0; + long mAvailableSpaceInByte; + long mCacheSizeInByte; @Override protected Void doInBackground() { mAvailableSpaceInByte = getAvailableSpaceAboveLowSpaceLimit();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcp.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcp.java new file mode 100644 index 0000000..529455bc --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcp.java
@@ -0,0 +1,105 @@ +// 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.modelutil; + +import android.support.annotation.Nullable; +import android.view.View; + +import org.chromium.ui.ViewProvider; + +import java.util.HashSet; +import java.util.Set; + +/** + * ModelChangeProcessor for property-observable models that can be visible or hidden. + * Lazily creates the view the first time the model is shown, and queues up property changes while + * the model is hidden, dispatching them when it is shown. + * @param <M> The model type + * @param <V> The view type + * @param <P> The property type for the model + */ +public class LazyConstructionPropertyMcp<M extends PropertyObservable<P>, V extends View, P> + implements PropertyObservable.PropertyObserver<P> { + /** + * Functional interface to determine whether the model is visible. + * @param <T> The model type. + */ + public interface VisibilityPredicate<T> { boolean isVisible(T item); } + + private final M mModel; + private final P mVisibilityProperty; + private final VisibilityPredicate<M> mVisibilityPredicate; + private final ViewProvider<V> mViewProvider; + private final PropertyModelChangeProcessor.ViewBinder<M, V, P> mViewBinder; + + private boolean mPendingViewCreation; + private @Nullable V mView; + private final Set<P> mPendingProperties = new HashSet<>(); + + public LazyConstructionPropertyMcp(M model, P visibilityProperty, + VisibilityPredicate<M> visibilityPredicate, ViewProvider<V> viewProvider, + PropertyModelChangeProcessor.ViewBinder<M, V, P> viewBinder) { + assert visibilityProperty != null; + mModel = model; + mVisibilityProperty = visibilityProperty; + mVisibilityPredicate = visibilityPredicate; + mViewProvider = viewProvider; + mViewBinder = viewBinder; + + mPendingProperties.addAll(mModel.getAllSetProperties()); + + mViewProvider.whenLoaded(this ::onViewCreated); + + // The model should start out hidden. + assert !mVisibilityPredicate.isVisible(mModel); + mModel.addObserver(this); + } + + public static <M extends PropertyModel, V extends View> + LazyConstructionPropertyMcp<M, V, PropertyKey> create(M model, + PropertyModel.BooleanPropertyKey visibilityProperty, + ViewProvider<V> viewFactory, + PropertyModelChangeProcessor.ViewBinder<M, V, PropertyKey> viewBinder) { + return new LazyConstructionPropertyMcp<>(model, visibilityProperty, + item -> item.getValue(visibilityProperty), viewFactory, viewBinder); + } + + private void flushPendingUpdates() { + for (P property : mPendingProperties) { + mViewBinder.bind(mModel, mView, property); + } + mPendingProperties.clear(); + } + + @Override + public void onPropertyChanged(PropertyObservable<P> source, @Nullable P propertyKey) { + assert source == mModel; + + mPendingProperties.add(propertyKey); + + // If the model is hidden, don't flush property updates yet (unless the updated property is + // visibility). + if (!mVisibilityPredicate.isVisible(mModel) && propertyKey != mVisibilityProperty) { + return; + } + + if (mView == null) { + // If the view is already being created, do nothing. + if (mPendingViewCreation) return; + + mPendingViewCreation = true; + mViewProvider.inflate(); + return; + } + + flushPendingUpdates(); + } + + private void onViewCreated(V v) { + mView = v; + mPendingViewCreation = false; + flushPendingUpdates(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyViewBinderAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyViewBinderAdapter.java deleted file mode 100644 index fe9c353..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/LazyViewBinderAdapter.java +++ /dev/null
@@ -1,122 +0,0 @@ -// 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.modelutil; - -import android.view.View; -import android.view.ViewStub; - -import org.chromium.base.Callback; - -import javax.annotation.Nullable; - -/** - * Observes updates to a model {@link M} and calls a given {@link SimpleViewBinder} with a lazily - * inflated view whenever a property with key {@link K} has changed. - * The view used by this class is passed in as a {@link ViewStub} wrapped in a {@link StubHolder}. - * The held stub is inflated when the observed model becomes visible for the first time. - * @param <M> The observable model that contains the data which should be should to the view. - * @param <V> The type of the fully inflated ViewStub. - * @param <K> The type of property keys which are published by model {@link M}. - */ -public class LazyViewBinderAdapter<M extends PropertyObservable<K>, V extends View, K> - implements PropertyModelChangeProcessor - .ViewBinder<M, LazyViewBinderAdapter.StubHolder<V>, K> { - /** - * - * Holds a {@link ViewStub} that is inflated by the {@link LazyViewBinderAdapter} which calls a - * {@link SimpleViewBinder}. - * @param <V> The View type that the StubHolder holds. - */ - public static class StubHolder<V extends View> { - private @Nullable V mView; // Remains null until |mViewStub| is inflated. - private final ViewStub mViewStub; - - public StubHolder(ViewStub viewStub) { - mViewStub = viewStub; - } - - @Nullable - public V getView() { - return mView; - } - - @SuppressWarnings("unchecked") // The StubHolder always holds a V! - void inflateView(ViewStub.OnInflateListener inflationCallback) { - mViewStub.setOnInflateListener(inflationCallback); - mView = (V) mViewStub.inflate(); - } - } - - /** - * A {@link PropertyModelChangeProcessor.ViewBinder} that provides information about when to - * inflate a viewStub managed by a {@link LazyViewBinderAdapter}. - * @param <M> The model holding data about the view and it's visibility. - * @param <V> The type of the fully inflated ViewStub. - * @param <K> The class of the properties that model {@link M} propagates. - */ - public interface SimpleViewBinder<M, V extends View, K> - extends PropertyModelChangeProcessor.ViewBinder<M, V, K> { - /** - * @return The Property that will indicate when this component becomes visible. - */ - K getVisibilityProperty(); - - /** - * Returns whether this component should be visible now. The view binder will inflate the - * given stub if this returns true when the {@link SimpleViewBinder#getVisibilityProperty} - * is updated. - * @param model The model that should contain an observable property about the visibility. - * @return whether this component should be visible now. - */ - boolean isVisible(M model); - - /** - * Called when the lazy inflation of the view happens. - * @param model The model which might be useful for initializing the just inflated view. - * @param inflatedView The freshly inflated view. - */ - void onInitialInflation(M model, V inflatedView); - } - - private final SimpleViewBinder<M, V, K> mBinder; - private final Callback<V> mPostInflationCallback; - - /** - * Calls {LazyViewBinderAdapter#LazyViewBinderAdapter(SimpleViewBinder, Callback)} without a - * post-inflation callback - * @param binder The binder to be called with the fully inflated view. - * @see LazyViewBinderAdapter#LazyViewBinderAdapter(SimpleViewBinder, Callback) - */ - public LazyViewBinderAdapter(SimpleViewBinder<M, V, K> binder) { - this(binder, (view) -> {}); - } - - /** - * Creates the adapter with a {@link SimpleViewBinder} that will be used to determine when to - * inflate the {@link StubHolder} that is passed in by the {@link PropertyModelChangeProcessor}. - * @param binder The binder to be called with the fully inflated view. - * @param postInflationCallback Callback called after inflation (before calling the ViewBinder). - */ - public LazyViewBinderAdapter( - SimpleViewBinder<M, V, K> binder, Callback<V> postInflationCallback) { - mBinder = binder; - mPostInflationCallback = postInflationCallback; - } - - @SuppressWarnings("unchecked") // The StubHolder always holds a V! - @Override - public void bind(M model, StubHolder<V> stubHolder, K propertyKey) { - if (stubHolder.getView() == null) { - if (propertyKey != mBinder.getVisibilityProperty() || !mBinder.isVisible(model)) { - return; // Ignore model changes before the view is shown for the first time. - } - stubHolder.inflateView((viewStub, view) -> { - mPostInflationCallback.onResult((V) view); - mBinder.onInitialInflation(model, (V) view); - }); - } - mBinder.bind(model, stubHolder.getView(), propertyKey); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModel.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModel.java index ed5797e..627e23c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModel.java
@@ -8,7 +8,10 @@ import org.chromium.base.annotations.RemovableInRelease; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -154,6 +157,15 @@ notifyPropertyChanged(key); } + @Override + public Collection<PropertyKey> getAllSetProperties() { + List<PropertyKey> properties = new ArrayList<>(); + for (Map.Entry<PropertyKey, ValueContainer> entry : mData.entrySet()) { + if (entry.getValue() != null) properties.add(entry.getKey()); + } + return properties; + } + private interface ValueContainer {} private static class FloatContainer implements ValueContainer { public float value; } private static class IntContainer implements ValueContainer { public int value; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModelChangeProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModelChangeProcessor.java index db63de0..0fa72c8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModelChangeProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyModelChangeProcessor.java
@@ -14,8 +14,7 @@ * @param <V> The view object that is changing. * @param <P> The property of the view that changed. */ -public class PropertyModelChangeProcessor<M extends PropertyObservable<P>, V, P> - implements PropertyObserver<P> { +public class PropertyModelChangeProcessor<M extends PropertyObservable<P>, V, P> { /** * A generic view binder that associates a view with a model. * @param <M> The {@link PropertyObservable} model. @@ -28,21 +27,46 @@ private final M mModel; private final ViewBinder<M, V, P> mViewBinder; + private final PropertyObserver<P> mPropertyObserver = this::onPropertyChanged; + /** * Construct a new PropertyModelChangeProcessor. * @param model The model containing the data to be bound. * @param view The view to which data will be bound. * @param viewBinder A class that binds the model to the view. */ - public PropertyModelChangeProcessor(M model, V view, ViewBinder<M, V, P> viewBinder) { + private PropertyModelChangeProcessor(M model, V view, ViewBinder<M, V, P> viewBinder) { mModel = model; mView = view; mViewBinder = viewBinder; + for (P property : model.getAllSetProperties()) { + onPropertyChanged(model, property); + } + model.addObserver(mPropertyObserver); } - @Override - public void onPropertyChanged(PropertyObservable<P> source, P propertyKey) { - // TODO(bauerb): Add support for batching and for full model updates. + /** + * Creates a new PropertyModelChangeProcessor observing the given {@code model}. + * @param model The model containing the data to be bound. + * @param view The view to which data will be bound. + * @param viewBinder A class that binds the model to the view. + */ + public static <M extends PropertyObservable<P>, V, P> + PropertyModelChangeProcessor<M, V, P> create(M model, V view, ViewBinder<M, V, P> viewBinder) { + return new PropertyModelChangeProcessor<>(model, view, viewBinder); + } + + /** + * To be called when the model should no longer be observed. + */ + public void destroy() { + mModel.removeObserver(mPropertyObserver); + } + + private void onPropertyChanged(PropertyObservable<P> source, P propertyKey) { + assert source == mModel; + + // TODO(bauerb): Add support for batching updates. mViewBinder.bind(mModel, mView, propertyKey); } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyObservable.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyObservable.java index 5d8a1929..b77abcc0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyObservable.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/PropertyObservable.java
@@ -8,12 +8,14 @@ import org.chromium.base.ObserverList; +import java.util.Collection; + /** * A base class for models maintaining a set of properties. * * @param <T> The type of the property key used for uniquely identifying properties. */ -public class PropertyObservable<T> { +public abstract class PropertyObservable<T> { /** * An observer to be notified of changes to a {@link PropertyObservable}. * @@ -23,7 +25,7 @@ /** * Notifies that the given {@code property} of the observed {@code source} has changed. * @param source The object whose property has changed - * @param property The key of the property that has changed. + * @param propertyKey The key of the property that has changed. */ void onPropertyChanged(PropertyObservable<T> source, @Nullable T propertyKey); } @@ -45,6 +47,12 @@ } /** + * @return A collection of all properties of this model that have been set. The returned + * collection should not be modified. + */ + public abstract Collection<T> getAllSetProperties(); + + /** * Notifies observers that the property identified by {@code propertyKey} has changed. * * @param propertyKey The key of the property that has changed.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/SimpleList.java b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/SimpleList.java index 090c6f0..9ab77c0a1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modelutil/SimpleList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modelutil/SimpleList.java
@@ -37,7 +37,7 @@ @NonNull default Iterator<T> iterator() { return new Iterator<T>() { - private int mI = 0; + private int mI; @Override public boolean hasNext() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index a3b5c92..bbd9331 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -17,14 +17,12 @@ import org.chromium.base.TraceEvent; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider; import org.chromium.chrome.browser.ntp.NewTabPage.FakeboxDelegate; import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter; import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.suggestions.SuggestionsConfig; import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory; import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate; import org.chromium.chrome.browser.suggestions.TileGroup; @@ -41,6 +39,8 @@ public class NewTabPageView extends FrameLayout { private static final String TAG = "NewTabPageView"; + private final int mScrollToSuggestionsOffset; + private NewTabPageRecyclerView mRecyclerView; private NewTabPageLayout mNewTabPageLayout; @@ -93,6 +93,9 @@ public NewTabPageView(Context context, AttributeSet attrs) { super(context, attrs); + mScrollToSuggestionsOffset = + getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow); + mRecyclerView = new NewTabPageRecyclerView(getContext()); // Don't attach now, the recyclerView itself will determine when to do it. @@ -327,7 +330,7 @@ @Override public void onPageLoadFinished(Tab tab) { mRecyclerView.getLinearLayoutManager().scrollToPositionWithOffset( - scrollPosition, getScrollToSuggestionsOffset()); + scrollPosition, mScrollToSuggestionsOffset); mTab.removeObserver(this); } }); @@ -335,7 +338,7 @@ } mRecyclerView.getLinearLayoutManager().scrollToPositionWithOffset( - scrollPosition, getScrollToSuggestionsOffset()); + scrollPosition, mScrollToSuggestionsOffset); } /** @@ -345,46 +348,7 @@ */ private int getSuggestionsScrollPosition() { // Header always exists. - if (ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)) { - return mRecyclerView.getNewTabPageAdapter().getArticleHeaderPosition(); - } - - // Only articles are visible. Headers are not present. - if (ChromeFeatureList.isEnabled(ChromeFeatureList.SIMPLIFIED_NTP)) { - return mRecyclerView.getNewTabPageAdapter().getFirstSnippetPosition(); - } - - // With Simplified NTP not enabled, bookmarks/downloads and their headers are added to the - // NTP if they're not empty. - int scrollPosition = mRecyclerView.getNewTabPageAdapter().getArticleHeaderPosition(); - return scrollPosition == RecyclerView.NO_POSITION - ? mRecyclerView.getNewTabPageAdapter().getFirstSnippetPosition() - : scrollPosition; - } - - private int getScrollToSuggestionsOffset() { - int offset = getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow); - - if (needsExtraOffset()) { - offset += getResources().getDimensionPixelSize( - R.dimen.content_suggestions_card_modern_margin) - / 2; - } - return offset; - } - - /** - * Checks if extra offset needs to be added for aesthetic reasons. - * @return True if modern is enabled (and space exists between each suggestion card) and no - * header is showing. - */ - private boolean needsExtraOffset() { - return SuggestionsConfig.useModernLayout() - && !ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - && mRecyclerView.getNewTabPageAdapter().getArticleHeaderPosition() - == RecyclerView.NO_POSITION; + return mRecyclerView.getNewTabPageAdapter().getArticleHeaderPosition(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java index e455c1e..bf7536c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java
@@ -12,7 +12,6 @@ import org.chromium.base.Callback; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.modelutil.ListObservable; import org.chromium.chrome.browser.ntp.ContextMenuManager; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder.PartialBindCallback; @@ -224,10 +223,7 @@ boolean areRemoteSuggestionsEnabled = mUiDelegate.getSuggestionsSource().areRemoteSuggestionsEnabled(); boolean allDismissed = hasAllBeenDismissed() && !areArticlesLoading(); - boolean isArticleSectionVisible = - ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - && mSections.getSection(KnownCategories.ARTICLES) != null; + boolean isArticleSectionVisible = mSections.getSection(KnownCategories.ARTICLES) != null; mAllDismissed.setVisible(areRemoteSuggestionsEnabled && allDismissed); mFooter.setVisible(!SuggestionsConfig.scrollToLoad() && !allDismissed
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java index 45d1479..fc40a9e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java
@@ -6,7 +6,6 @@ import org.chromium.base.Log; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder.PartialBindCallback; import org.chromium.chrome.browser.ntp.snippets.CategoryInt; import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; @@ -84,10 +83,6 @@ } } - if (!ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)) { - maybeHideArticlesHeader(); - } recordDisplayedSuggestions(categories); } @@ -324,26 +319,12 @@ removeChildren(); } - /** Hides the header for the {@link KnownCategories#ARTICLES} section when necessary. */ - private void maybeHideArticlesHeader() { - // If there is more than a section we want to show the headers for disambiguation purposes. - if (mSections.size() != 1) return; - - SuggestionsSection articlesSection = mSections.get(KnownCategories.ARTICLES); - if (articlesSection == null) return; - - articlesSection.setHeaderVisibility(false); - } - /** * A section that allows zero items should be created for showing the section header if it is * not yet created. * @param category The category that needs a correspond section shown for the header. */ private void maybeAddSectionForHeader(@CategoryInt int category) { - if (!ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)) - return; if (category != KnownCategories.ARTICLES) return; // Don't add a header if the entire articles section is disabled by policy.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java index e8aae53..021bef4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java
@@ -9,7 +9,6 @@ import org.chromium.base.Callback; import org.chromium.base.Log; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.modelutil.ListModelBase; import org.chromium.chrome.browser.modelutil.ListObservable; import org.chromium.chrome.browser.modelutil.PropertyListModel; @@ -99,9 +98,7 @@ mSuggestionsSource = uiDelegate.getSuggestionsSource(); mSuggestionsRanker = ranker; - boolean isExpandable = ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - && getCategory() == KnownCategories.ARTICLES; + boolean isExpandable = getCategory() == KnownCategories.ARTICLES; boolean isExpanded = PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE); mHeader = isExpandable ? new SectionHeader(info.getTitle(), isExpanded,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeaderViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeaderViewHolder.java index 41b0084..13b3171c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeaderViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SectionHeaderViewHolder.java
@@ -5,12 +5,9 @@ package org.chromium.chrome.browser.ntp.snippets; import android.content.res.Resources; -import android.support.annotation.Nullable; import android.view.LayoutInflater; -import android.widget.TextView; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView; import org.chromium.chrome.browser.widget.displaystyle.MarginResizer; @@ -20,51 +17,33 @@ * View holder for the header of a section of cards. */ public class SectionHeaderViewHolder extends NewTabPageViewHolder { - private final @Nullable SectionHeaderView mSectionHeaderView; + private final SectionHeaderView mSectionHeaderView; private final MarginResizer mMarginResizer; - private final TextView mTitleView; public SectionHeaderViewHolder(final SuggestionsRecyclerView recyclerView, UiConfig config) { super(LayoutInflater.from(recyclerView.getContext()) - .inflate( - ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - ? R.layout.new_tab_page_snippets_expandable_header - : R.layout.new_tab_page_snippets_header, - recyclerView, false)); - mSectionHeaderView = ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - ? (SectionHeaderView) itemView - : null; + .inflate(R.layout.new_tab_page_snippets_expandable_header, recyclerView, + false)); + mSectionHeaderView = (SectionHeaderView) itemView; Resources resources = recyclerView.getResources(); int defaultLateralMargin = - ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) - ? resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin) - : 0; + resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin); int wideLateralMargin = resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins); mMarginResizer = new MarginResizer(itemView, config, defaultLateralMargin, wideLateralMargin); - - mTitleView = itemView.findViewById(R.id.header_title); } public void onBindViewHolder(SectionHeader header) { - if (mSectionHeaderView != null) { - mSectionHeaderView.setHeader(header); - } else { - mTitleView.setText(header.getHeaderText()); - } - + mSectionHeaderView.setHeader(header); mMarginResizer.attach(); } @Override public void recycle() { mMarginResizer.detach(); - if (mSectionHeaderView != null) mSectionHeaderView.setHeader(null); + mSectionHeaderView.setHeader(null); super.recycle(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java index 818c961..cd72f45 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticle.java
@@ -14,6 +14,8 @@ import org.chromium.chrome.browser.suggestions.OfflinableSuggestion; import java.io.File; +import java.util.Collection; +import java.util.Collections; /** * Represents the data for an article card on the NTP. @@ -309,4 +311,9 @@ public int getPerSectionRank() { return mPerSectionRank; } + + @Override + public Collection<PartialBindCallback> getAllSetProperties() { + return Collections.emptyList(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/DeviceConditions.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/DeviceConditions.java index b47236a..c052209 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/DeviceConditions.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/DeviceConditions.java
@@ -24,13 +24,13 @@ */ public class DeviceConditions { // Battery and power related variables. - private boolean mPowerConnected = false; - private int mBatteryPercentage = 0; - private boolean mPowerSaveOn = false; + private boolean mPowerConnected; + private int mBatteryPercentage; + private boolean mPowerSaveOn; // Network related variables. private int mNetConnectionType = ConnectionType.CONNECTION_NONE; - private boolean mActiveNetworkMetered = false; + private boolean mActiveNetworkMetered; /** * Creates a DeviceConditions instance that stores a snapshot of the current set of device
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java index 9f33805..39906d59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java
@@ -12,13 +12,13 @@ import android.support.v7.content.res.AppCompatResources; import android.text.TextUtils; +import org.chromium.base.ApplicationState; import org.chromium.base.ApplicationStatus; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeFeatureList; -import org.chromium.chrome.browser.download.DownloadActivity; import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.snackbar.Snackbar; @@ -34,8 +34,9 @@ /** * Class that controls when to show the offline indicator. */ -public class OfflineIndicatorController - implements ConnectivityDetector.Observer, SnackbarController { +public class OfflineIndicatorController implements ConnectivityDetector.Observer, + SnackbarController, + ApplicationStatus.ApplicationStateListener { // OfflineIndicatorCTREvent defined in tools/metrics/histograms/enums.xml. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -43,7 +44,7 @@ public static final int OFFLINE_INDICATOR_CTR_CLICKED = 1; public static final int OFFLINE_INDICATOR_CTR_COUNT = 2; - private static final int DURATION_MS = 10000; + private static final int SNACKBAR_DURATION_MS = 10000; // Time in milliseconds to wait until the offline state is stablized in the case of flaky // connections. @@ -54,18 +55,24 @@ private static int sTimeToWaitForStableOffline = TIME_TO_WAIT_FOR_STABLE_OFFLINE; - private boolean mIsShowingOfflineIndicator = false; + private boolean mIsShowingOfflineIndicator; // Set to true if the offline indicator has been shown once. - private boolean mHasOfflineIndicatorShown = false; + private boolean mHasOfflineIndicatorShown; private ConnectivityDetector mConnectivityDetector; private ChromeActivity mObservedActivity = null; - private boolean mIsOnline = false; + private boolean mIsOnline; // Last time when the online state is detected. It is recorded as milliseconds since boot. - private long mLastOnlineTime = 0; + private long mLastOnlineTime; + + private TopSnackbarManager mTopSnackbarManager; private OfflineIndicatorController() { + if (isUsingTopSnackbar()) { + mTopSnackbarManager = new TopSnackbarManager(); + } mConnectivityDetector = new ConnectivityDetector(this); + ApplicationStatus.registerApplicationStateListener(this); } /** @@ -88,15 +95,6 @@ return sInstance; } - /** - * Called to update the offline indicator per current connection state when the activity is - * running in foreground now or the tab is being shown. - */ - public static void onUpdate() { - if (sInstance == null) return; - sInstance.mConnectivityDetector.detect(); - } - @Override public void onConnectionStateChanged( @ConnectivityDetector.ConnectionState int connectionState) { @@ -117,6 +115,16 @@ mIsShowingOfflineIndicator = false; } + @Override + public void onApplicationStateChange(int newState) { + // If the application is resumed, update the connection state and show indicator if needed. + if (newState == ApplicationState.HAS_RUNNING_ACTIVITIES) { + mConnectivityDetector.detect(); + updateOfflineIndicator(mConnectivityDetector.getConnectionState() + == ConnectivityDetector.ConnectionState.VALIDATED); + } + } + private void updateOfflineIndicator(boolean isOnline) { if (isOnline != mIsOnline) { if (isOnline) { @@ -125,32 +133,30 @@ mIsOnline = isOnline; } + if (ApplicationStatus.getStateForApplication() != ApplicationState.HAS_RUNNING_ACTIVITIES) { + return; + } Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); - if (!(activity instanceof SnackbarManageable)) return; - SnackbarManager snackbarManager = ((SnackbarManageable) activity).getSnackbarManager(); - if (snackbarManager == null) return; + if (activity == null) return; if (isOnline) { - hideOfflineIndicator(snackbarManager); + hideOfflineIndicator(activity); } else { - showOfflineIndicator(activity, snackbarManager); + showOfflineIndicator(activity); } } private boolean canShowOfflineIndicator(Activity activity) { - // No need to show offline indicator since Downloads home is already home of the offline - // content. - if (activity instanceof DownloadActivity) return false; + // For now, we only support ChromeActivity. + if (!(activity instanceof ChromeActivity)) return false; - if (activity instanceof ChromeActivity) { - ChromeActivity chromeActivity = (ChromeActivity) activity; - Tab tab = chromeActivity.getActivityTab(); - if (tab == null) return false; - if (tab.isShowingErrorPage()) return false; - if (OfflinePageUtils.isOfflinePage(tab)) return false; - if (TextUtils.equals(tab.getUrl(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL)) { - return false; - } + ChromeActivity chromeActivity = (ChromeActivity) activity; + Tab tab = chromeActivity.getActivityTab(); + if (tab == null) return false; + if (tab.isShowingErrorPage()) return false; + if (OfflinePageUtils.isOfflinePage(tab)) return false; + if (TextUtils.equals(tab.getUrl(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL)) { + return false; } return true; @@ -205,22 +211,22 @@ return true; } - private void showOfflineIndicator(Activity activity, SnackbarManager snackbarManager) { - if (mIsShowingOfflineIndicator) return; + private void showOfflineIndicator(Activity activity) { + if (mIsShowingOfflineIndicator || !canShowOfflineIndicator(activity)) return; if (delayShowingOfflineIndicatorIfNeeded(activity)) return; - if (!canShowOfflineIndicator(activity)) return; - // If this is the first time to show offline indicator, show it. Otherwise, it will only // be shown if the user has been continuously online for the required duration, then goes // back to being offline. + // TODO(jianli): keep these values in shared prefernces. (http://crbug.com/879725) if (mHasOfflineIndicatorShown && SystemClock.elapsedRealtime() - mLastOnlineTime < sTimeToWaitForStableOffline) { return; } - Drawable icon = AppCompatResources.getDrawable(activity, R.drawable.ic_offline_pin_white); + Drawable icon = + AppCompatResources.getDrawable(activity, R.drawable.ic_offline_pin_blue_white); Snackbar snackbar = Snackbar.make(activity.getString(R.string.offline_indicator_offline_title), this, Snackbar.TYPE_ACTION, Snackbar.UMA_OFFLINE_INDICATOR) @@ -228,28 +234,53 @@ .setProfileImage(icon) .setBackgroundColor(Color.BLACK) .setTextAppearance(R.style.WhiteBody) + .setDuration(SNACKBAR_DURATION_MS) .setAction( activity.getString(R.string.offline_indicator_view_offline_content), null); - snackbar.setDuration(DURATION_MS); - snackbarManager.showSnackbar(snackbar); + if (isUsingTopSnackbar()) { + mTopSnackbarManager.show(snackbar, activity); + } else { + // Show a bottom snackbar via SnackbarManager. + assert activity instanceof SnackbarManageable; + SnackbarManager snackbarManager = ((SnackbarManageable) activity).getSnackbarManager(); + snackbarManager.showSnackbar(snackbar); + } + RecordHistogram.recordEnumeratedHistogram("OfflineIndicator.CTR", OFFLINE_INDICATOR_CTR_DISPLAYED, OFFLINE_INDICATOR_CTR_COUNT); mIsShowingOfflineIndicator = true; mHasOfflineIndicatorShown = true; } - private void hideOfflineIndicator(SnackbarManager snackbarManager) { + private void hideOfflineIndicator(Activity activity) { if (!mIsShowingOfflineIndicator) return; - snackbarManager.dismissSnackbars(this); + + if (isUsingTopSnackbar()) { + mTopSnackbarManager.hide(); + } else { + assert activity instanceof SnackbarManageable; + SnackbarManager snackbarManager = ((SnackbarManageable) activity).getSnackbarManager(); + snackbarManager.dismissSnackbars(this); + } } @VisibleForTesting - public ConnectivityDetector getConnectivityDetectorForTesting() { + static boolean isUsingTopSnackbar() { + return true; + } + + @VisibleForTesting + ConnectivityDetector getConnectivityDetectorForTesting() { return mConnectivityDetector; } @VisibleForTesting + TopSnackbarManager getTopSnackbarManagerForTesting() { + return mTopSnackbarManager; + } + + @VisibleForTesting static void overrideTimeToWaitForStableOfflineForTesting(int time) { sTimeToWaitForStableOffline = time; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarManager.java new file mode 100644 index 0000000..b14a596 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarManager.java
@@ -0,0 +1,99 @@ +// 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.offlinepages.indicator; + +import android.app.Activity; +import android.os.Handler; +import android.view.View; +import android.view.View.OnClickListener; + +import org.chromium.base.ActivityState; +import org.chromium.base.ApplicationStatus; +import org.chromium.base.VisibleForTesting; +import org.chromium.chrome.browser.snackbar.Snackbar; + +/** + * Manager for one-off snackbar showing at the top of activity. + */ +public class TopSnackbarManager + implements OnClickListener, ApplicationStatus.ActivityStateListener { + private final Handler mDismissSnackbarHandler; + private final Runnable mDismissSnackbarRunnable = new Runnable() { + @Override + public void run() { + dismissSnackbar(false); + } + }; + + private Snackbar mSnackbar; + private TopSnackbarView mSnackbarView; + + public TopSnackbarManager() { + mDismissSnackbarHandler = new Handler(); + } + + @Override + public void onClick(View v) { + dismissSnackbar(true); + } + + @Override + public void onActivityStateChange(Activity activity, int newState) { + if (newState == ActivityState.STOPPED) { + dismissSnackbar(false); + } + } + + /** + * Shows a snackbar at the top of the given activity. + */ + public void show(Snackbar snackbar, Activity activity) { + if (mSnackbar != null + || ApplicationStatus.getStateForActivity(activity) != ActivityState.RESUMED) { + return; + } + + mSnackbar = snackbar; + + mSnackbarView = new TopSnackbarView(activity, this, mSnackbar, null); + mSnackbarView.show(); + mSnackbarView.announceforAccessibility(); + mDismissSnackbarHandler.removeCallbacks(mDismissSnackbarRunnable); + mDismissSnackbarHandler.postDelayed(mDismissSnackbarRunnable, mSnackbar.getDuration()); + + ApplicationStatus.registerStateListenerForActivity(this, activity); + } + + /** + * Dismisses the snackbar if it is shown. + */ + public void hide() { + dismissSnackbar(false); + } + + private void dismissSnackbar(boolean byAction) { + if (mSnackbar == null) return; + + if (byAction) { + mSnackbar.getController().onAction(null); + } else { + mSnackbar.getController().onDismissNoAction(null); + } + + ApplicationStatus.unregisterActivityStateListener(this); + + mDismissSnackbarHandler.removeCallbacks(mDismissSnackbarRunnable); + if (mSnackbarView != null) { + mSnackbarView.dismiss(); + mSnackbarView = null; + } + mSnackbar = null; + } + + @VisibleForTesting + boolean isShowing() { + return mSnackbar != null; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarView.java new file mode 100644 index 0000000..b2e9e47 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarView.java
@@ -0,0 +1,66 @@ +// 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.offlinepages.indicator; + +import android.app.Activity; +import android.content.res.Resources; +import android.support.annotation.Nullable; +import android.view.View.OnClickListener; +import android.view.ViewGroup; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.FullscreenActivity; +import org.chromium.chrome.browser.snackbar.Snackbar; +import org.chromium.chrome.browser.snackbar.SnackbarView; + +/** + * Visual representation of a snackbar positioned at the top. + */ +public class TopSnackbarView extends SnackbarView { + /** + * Creates an instance of the {@link SnackbarView}. + * @param activity The activity that displays the snackbar. + * @param listener An {@link OnClickListener} that will be called when the action button is + * clicked. + * @param snackbar The snackbar to be displayed. + * @param parentView The ViewGroup used to display this snackbar. If this is null, this class + * will determine where to attach the snackbar. + */ + public TopSnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar, + @Nullable ViewGroup parentView) { + super(activity, listener, snackbar, parentView); + } + + @Override + protected int getYPositionForMoveAnimation() { + return -mContainerView.getHeight(); + } + + @Override + protected int getBottomMarginForLayout() { + return mParent.getHeight() - mSnackbarView.getHeight() - getToolbarHeight(); + } + + @Override + public void announceforAccessibility() { + mMessageView.announceForAccessibility(mMessageView.getContentDescription() + " " + + mContainerView.getResources().getString(R.string.top_bar_screen_position)); + } + + private int getToolbarHeight() { + if (!(mActivity instanceof ChromeActivity)) return 0; + + if (mActivity instanceof FullscreenActivity) return 0; + + ChromeActivity chromeActivity = (ChromeActivity) mActivity; + + if (chromeActivity.getFullscreenManager().getContentOffset() == 0) return 0; + + // TODO(jianli): This may not work in Duet on the NTP. + Resources resources = chromeActivity.getResources(); + return resources.getDimensionPixelSize(chromeActivity.getControlContainerHeightResource()); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java index afa9c77..e3e26d5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java
@@ -28,17 +28,17 @@ private static final int MINIMUM_BATTERY_PERCENTAGE_FOR_PREFETCHING = 50; - private static boolean sSkipConditionCheckingForTesting = false; + private static boolean sSkipConditionCheckingForTesting; - private long mNativeTask = 0; - private TaskFinishedCallback mTaskFinishedCallback = null; - private Profile mProfile = null; + private long mNativeTask; + private TaskFinishedCallback mTaskFinishedCallback; + private Profile mProfile; // We update this when we call TaskFinishedCallback, so that subsequent calls to // onStopTask* can respond the same way. This is possible due to races with the JobScheduler. // Defaults to true so that we are rescheduled automatically if somehow we were unable to start // up native. private boolean mCachedRescheduleResult = true; - private boolean mLimitlessPrefetchingEnabled = false; + private boolean mLimitlessPrefetchingEnabled; public PrefetchBackgroundTask() {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 944fc2a..d033685 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -283,12 +283,12 @@ UiUtils.hideKeyboard(mUrlBar); final String urlText = mUrlCoordinator.getTextWithAutocomplete(); if (mNativeInitialized) { - findMatchAndLoadUrl(urlText); + findMatchAndLoadUrl(urlText, event.getEventTime()); } else { mDeferredNativeRunnables.add(new Runnable() { @Override public void run() { - findMatchAndLoadUrl(urlText); + findMatchAndLoadUrl(urlText, event.getEventTime()); } }); } @@ -314,7 +314,7 @@ return false; } - private void findMatchAndLoadUrl(String urlText) { + private void findMatchAndLoadUrl(String urlText, long inputStart) { int suggestionMatchPosition; OmniboxSuggestion suggestionMatch; boolean skipOutOfBoundsCheck = false; @@ -350,7 +350,8 @@ String suggestionMatchUrl = updateSuggestionUrlIfNeeded(suggestionMatch, suggestionMatchPosition, skipOutOfBoundsCheck); - loadUrlFromOmniboxMatch(suggestionMatchUrl, suggestionMatchPosition, suggestionMatch); + loadUrlFromOmniboxMatch( + suggestionMatchUrl, suggestionMatchPosition, suggestionMatch, inputStart); } } @@ -1325,6 +1326,8 @@ mSuggestionList.setAdapter(mSuggestionListAdapter); mSuggestionList.setClipToPadding(false); mSuggestionListAdapter.setSuggestionDelegate(new OmniboxSuggestionDelegate() { + private long mLastActionUpTimestamp; + @Override public void onSelection(OmniboxSuggestion suggestion, int position) { if (mShowCachedZeroSuggestResults && !mNativeInitialized) { @@ -1338,7 +1341,8 @@ } String suggestionMatchUrl = updateSuggestionUrlIfNeeded( suggestion, position, false); - loadUrlFromOmniboxMatch(suggestionMatchUrl, position, suggestion); + loadUrlFromOmniboxMatch( + suggestionMatchUrl, position, suggestion, mLastActionUpTimestamp); hideSuggestions(); UiUtils.hideKeyboard(mUrlBar); } @@ -1381,6 +1385,11 @@ } @Override + public void onGestureUp(long timestamp) { + mLastActionUpTimestamp = timestamp; + } + + @Override public void onShowModal() { mSuggestionModalShown = true; } @@ -1559,7 +1568,7 @@ String queryUrl = TemplateUrlService.getInstance().getUrlForSearchQuery(query); if (!TextUtils.isEmpty(queryUrl)) { - loadUrl(queryUrl, PageTransition.GENERATED); + loadUrl(queryUrl, PageTransition.GENERATED, 0); } else { setSearchQuery(query); } @@ -1838,7 +1847,7 @@ } private void loadUrlFromOmniboxMatch( - String url, int matchPosition, OmniboxSuggestion suggestion) { + String url, int matchPosition, OmniboxSuggestion suggestion, long inputStart) { // loadUrl modifies AutocompleteController's state clearing the native // AutocompleteResults needed by onSuggestionsSelected. Therefore, // loadUrl should should be invoked last. @@ -1880,19 +1889,19 @@ transition = PageTransition.LINK; } - loadUrl(url, transition); + loadUrl(url, transition, inputStart); } @Override public void loadUrlFromVoice(String url) { - loadUrl(url, PageTransition.TYPED); + loadUrl(url, PageTransition.TYPED, 0); } /** * Load the url given with the given transition. Exposed for child classes to overwrite as * necessary. */ - protected void loadUrl(String url, int transition) { + protected void loadUrl(String url, int transition, long inputStart) { Tab currentTab = getCurrentTab(); // The code of the rest of this class ensures that this can't be called until the native @@ -1914,6 +1923,9 @@ LoadUrlParams loadUrlParams = new LoadUrlParams(url); loadUrlParams.setVerbatimHeaders(GeolocationHeader.getGeoHeader(url, currentTab)); loadUrlParams.setTransitionType(transition | PageTransition.FROM_ADDRESS_BAR); + if (inputStart != 0) { + loadUrlParams.setInputStartTimestamp(inputStart); + } // If the bottom sheet exists, route the navigation through it instead of the tab. if (mBottomSheet != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/OmniboxResultsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/OmniboxResultsAdapter.java index b5d2028f..7f693b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/OmniboxResultsAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/OmniboxResultsAdapter.java
@@ -147,6 +147,12 @@ public void onGestureDown(); /** + * Triggered when the user touch on the suggestion view finishes. + * @param ev the event for the ACTION_UP. + */ + public void onGestureUp(long timetamp); + + /** * Triggered when text width information is updated. * These values should be used to calculate max text widths. * @param requiredWidth a new required width.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/QueryInOmnibox.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/QueryInOmnibox.java index 81d9b550..6bc3195 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/QueryInOmnibox.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/QueryInOmnibox.java
@@ -11,48 +11,33 @@ * Bridge to the native QueryInOmniboxAndroid. */ public class QueryInOmnibox { - private long mNativeQueryInOmniboxAndroid; - - public QueryInOmnibox(Profile profile) { - assert profile != null; - assert profile.isNativeInitialized(); - mNativeQueryInOmniboxAndroid = nativeInit(profile); - } - - public void destroy() { - nativeDestroy(mNativeQueryInOmniboxAndroid); - mNativeQueryInOmniboxAndroid = 0; - } - /** * Extracts query terms from the current URL if it's a SRP URL from the default search engine. * + * @param profile The Profile associated with the tab. * @param securityLevel The {@link ConnectionSecurityLevel} of the tab. * @param url The URL to extract search terms from. * @return The extracted search terms. Returns null if the Omnibox should not display the * search terms. */ - public String getDisplaySearchTerms(@ConnectionSecurityLevel int securityLevel, String url) { - assert mNativeQueryInOmniboxAndroid != 0; - return nativeGetDisplaySearchTerms(mNativeQueryInOmniboxAndroid, securityLevel, url); + public static String getDisplaySearchTerms( + Profile profile, @ConnectionSecurityLevel int securityLevel, String url) { + return nativeGetDisplaySearchTerms(profile, securityLevel, url); } /** * Sets a flag telling the model to ignore the security level in its check for whether to - * display search terms or not. This is useful for avoiding the flicker that occurs when loading - * a SRP URL before our SSL state updates. + * display search terms or not. This is useful for avoiding the flicker that occurs when + * loading a SRP URL before our SSL state updates. * + * @param profile The Profile associated with the tab. * @param ignore Whether or not we should ignore the security level. */ - public void setIgnoreSecurityLevelForSearchTerms(boolean ignore) { - assert mNativeQueryInOmniboxAndroid != 0; - nativeSetIgnoreSecurityLevel(mNativeQueryInOmniboxAndroid, ignore); + public static void setIgnoreSecurityLevelForSearchTerms(Profile profile, boolean ignore) { + nativeSetIgnoreSecurityLevel(profile, ignore); } - private native long nativeInit(Profile profile); - private native void nativeDestroy(long nativeQueryInOmniboxAndroid); - private native String nativeGetDisplaySearchTerms( - long nativeQueryInOmniboxAndroid, int securityLevel, String url); - private native void nativeSetIgnoreSecurityLevel( - long nativeQueryInOmniboxAndroid, boolean ignore); + private static native String nativeGetDisplaySearchTerms( + Profile profile, int securityLevel, String url); + private static native void nativeSetIgnoreSecurityLevel(Profile profile, boolean ignore); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java index 2e7d59a..b8faa31 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java
@@ -273,6 +273,9 @@ // Whenever the suggestion dropdown is touched, we dispatch onGestureDown which is // used to let autocomplete controller know that it should stop updating suggestions. if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) mSuggestionDelegate.onGestureDown(); + if (ev.getActionMasked() == MotionEvent.ACTION_UP) { + mSuggestionDelegate.onGestureUp(ev.getEventTime()); + } return super.dispatchTouchEvent(ev); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java index 2829cdc..a98e505d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java
@@ -43,8 +43,7 @@ mUrlBar = urlBar; PropertyModel model = new PropertyModel(UrlBarProperties.ALL_KEYS); - model.addObserver( - new PropertyModelChangeProcessor<>(model, urlBar, UrlBarViewBinder::bind)); + PropertyModelChangeProcessor.create(model, urlBar, UrlBarViewBinder::bind); mMediator = new UrlBarMediator(model); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java index 5207ddae..878ca658 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
@@ -40,13 +40,13 @@ private static final String TAG = "ImageDecoderHost"; // The number of successful decodes, per batch. - private int mSuccessfulDecodes = 0; + private int mSuccessfulDecodes; // The number of runtime failures during decoding, per batch. - private int mFailedDecodesRuntime = 0; + private int mFailedDecodesRuntime; // The number of out of memory failures during decoding, per batch. - private int mFailedDecodesMemory = 0; + private int mFailedDecodesMemory; // A callback to use for testing to see if decoder is ready. static ServiceReadyCallback sReadyCallbackForTesting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java index bbfd005..a98b70ca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
@@ -189,7 +189,8 @@ removePreferenceIfPresent(PREF_HOMEPAGE); } - if (FeatureUtilities.areContextualSuggestionsEnabled(getActivity()) + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT) + && FeatureUtilities.areContextualSuggestionsEnabled(getActivity()) && EnabledStateMonitor.shouldShowSettings()) { Preference contextualSuggesitons = addPreferenceIfAbsent(PREF_CONTEXTUAL_SUGGESTIONS); setOnOffSummary(contextualSuggesitons, EnabledStateMonitor.getEnabledState());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java index 5852cdd..a62b8986 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.contextual_suggestions.EnabledStateMonitor; import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.invalidation.InvalidationController; @@ -51,6 +52,7 @@ import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseTypeDialogFragment; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.signin.ChromeSigninController; @@ -97,6 +99,7 @@ private static final String PREF_ENCRYPTION = "encryption"; private static final String PREF_SYNC_MANAGE_DATA = "sync_manage_data"; private static final String PREF_SYNC_ERROR_CARD = "sync_error_card"; + private static final String PREF_CONTEXTUAL_SUGGESTIONS = "contextual_suggestions"; private static final String PREF_NONPERSONALIZED_SERVICES = "nonpersonalized_services"; private static final String PREF_SEARCH_SUGGESTIONS = "search_suggestions"; @@ -108,6 +111,7 @@ private static final String PREF_SAFE_BROWSING_SCOUT_REPORTING = "safe_browsing_scout_reporting"; private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports"; + private static final String PREF_URL_KEYED_ANONYMIZED_DATA = "url_keyed_anonymized_data"; private static final String PREF_CONTEXTUAL_SEARCH = "contextual_search"; @IntDef({SyncError.NO_ERROR, SyncError.ANDROID_SYNC_DISABLED, SyncError.AUTH_ERROR, @@ -150,6 +154,7 @@ private Preference mSyncEncryption; private Preference mManageSyncData; private Preference mSyncErrorCard; + private @Nullable Preference mContextualSuggestions; private SigninExpandablePreferenceGroup mNonpersonalizedServices; private ChromeBaseCheckBoxPreference mSearchSuggestions; @@ -158,7 +163,8 @@ private ChromeBaseCheckBoxPreference mSafeBrowsing; private ChromeBaseCheckBoxPreference mSafeBrowsingReporting; private ChromeBaseCheckBoxPreference mUsageAndCrashReporting; - private Preference mContextualSearch; + private ChromeBaseCheckBoxPreference mUrlKeyedAnonymizedData; + private @Nullable Preference mContextualSearch; private boolean mIsEngineInitialized; private boolean mIsPassphraseRequired; @@ -213,6 +219,13 @@ mSyncErrorCard.setOnPreferenceClickListener( toOnClickListener(this::onSyncErrorCardClicked)); + mContextualSuggestions = findPreference(PREF_CONTEXTUAL_SUGGESTIONS); + if (!FeatureUtilities.areContextualSuggestionsEnabled(getActivity()) + || !EnabledStateMonitor.shouldShowSettings()) { + removePreference(mSyncGroup, mContextualSuggestions); + mContextualSuggestions = null; + } + mSyncAllTypes = new CheckBoxPreference[] {mSyncAutofill, mSyncBookmarks, mSyncPaymentsIntegration, mSyncHistory, mSyncPasswords, mSyncRecentTabs, mSyncSettings, mSyncActivityAndInteractions}; @@ -255,6 +268,11 @@ mUsageAndCrashReporting.setOnPreferenceChangeListener(this); mUsageAndCrashReporting.setManagedPreferenceDelegate(mManagedPreferenceDelegate); + mUrlKeyedAnonymizedData = + (ChromeBaseCheckBoxPreference) findPreference(PREF_URL_KEYED_ANONYMIZED_DATA); + mUrlKeyedAnonymizedData.setOnPreferenceChangeListener(this); + mUrlKeyedAnonymizedData.setManagedPreferenceDelegate(mManagedPreferenceDelegate); + mContextualSearch = findPreference(PREF_CONTEXTUAL_SEARCH); if (!ContextualSearchFieldTrial.isEnabled()) { removePreference(mNonpersonalizedServices, mContextualSearch); @@ -266,6 +284,10 @@ R.string.sign_in_google_activity_controls_summary_child_account); } + boolean useSyncAndAllServices = UnifiedConsentServiceBridge.isUnifiedConsentGiven(); + mSyncGroup.setExpanded(!useSyncAndAllServices); + mNonpersonalizedServices.setExpanded(!useSyncAndAllServices); + updatePreferences(); } @@ -359,28 +381,31 @@ String key = preference.getKey(); if (PREF_USE_SYNC_AND_ALL_SERVICES.equals(key)) { boolean enabled = (boolean) newValue; - if (enabled) { + if (!enabled) { mSyncGroup.setExpanded(true); mNonpersonalizedServices.setExpanded(true); } UnifiedConsentServiceBridge.setUnifiedConsentGiven(enabled); ThreadUtils.postOnUiThread(this::updateSyncStateFromSelectedModelTypes); ThreadUtils.postOnUiThread(this::updateDataTypeState); + ThreadUtils.postOnUiThread(this::updatePreferences); } else if (PREF_SEARCH_SUGGESTIONS.equals(key)) { - PrefServiceBridge.getInstance().setSearchSuggestEnabled((boolean) newValue); + mPrefServiceBridge.setSearchSuggestEnabled((boolean) newValue); } else if (PREF_SAFE_BROWSING.equals(key)) { - PrefServiceBridge.getInstance().setSafeBrowsingEnabled((boolean) newValue); + mPrefServiceBridge.setSafeBrowsingEnabled((boolean) newValue); } else if (PREF_SAFE_BROWSING_EXTENDED_REPORTING.equals(key) || PREF_SAFE_BROWSING_SCOUT_REPORTING.equals(key)) { - PrefServiceBridge.getInstance().setSafeBrowsingExtendedReportingEnabled( - (boolean) newValue); + mPrefServiceBridge.setSafeBrowsingExtendedReportingEnabled((boolean) newValue); } else if (PREF_NETWORK_PREDICTIONS.equals(key)) { - PrefServiceBridge.getInstance().setNetworkPredictionEnabled((boolean) newValue); + mPrefServiceBridge.setNetworkPredictionEnabled((boolean) newValue); recordNetworkPredictionEnablingUMA((boolean) newValue); } else if (PREF_NAVIGATION_ERROR.equals(key)) { - PrefServiceBridge.getInstance().setResolveNavigationErrorEnabled((boolean) newValue); + mPrefServiceBridge.setResolveNavigationErrorEnabled((boolean) newValue); } else if (PREF_USAGE_AND_CRASH_REPORTING.equals(key)) { UmaSessionStats.changeMetricsReportingConsent((boolean) newValue); + } else if (PREF_URL_KEYED_ANONYMIZED_DATA.equals(key)) { + UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled( + (boolean) newValue); } else if (isSyncTypePreference(preference)) { final boolean syncAutofillToggled = preference == mSyncAutofill; final boolean preferenceChecked = (boolean) newValue; @@ -833,14 +858,28 @@ mSyncGroup.setEnabled(false); } + if (mContextualSuggestions != null) { + mContextualSuggestions.setSummary( + EnabledStateMonitor.getEnabledState() ? R.string.text_on : R.string.text_off); + } + mSearchSuggestions.setChecked(mPrefServiceBridge.isSearchSuggestEnabled()); + mSearchSuggestions.setEnabled(!useSyncAndAllServices); mNetworkPredictions.setChecked(mPrefServiceBridge.getNetworkPredictionEnabled()); + mNetworkPredictions.setEnabled(!useSyncAndAllServices); mNavigationError.setChecked(mPrefServiceBridge.isResolveNavigationErrorEnabled()); + mNavigationError.setEnabled(!useSyncAndAllServices); mSafeBrowsing.setChecked(mPrefServiceBridge.isSafeBrowsingEnabled()); + mSafeBrowsing.setEnabled(!useSyncAndAllServices); mSafeBrowsingReporting.setChecked( mPrefServiceBridge.isSafeBrowsingExtendedReportingEnabled()); + mSafeBrowsingReporting.setEnabled(!useSyncAndAllServices); mUsageAndCrashReporting.setChecked( mPrivacyPrefManager.isUsageAndCrashReportingPermittedByUser()); + mUsageAndCrashReporting.setEnabled(!useSyncAndAllServices); + mUrlKeyedAnonymizedData.setChecked( + UnifiedConsentServiceBridge.isUrlKeyedAnonymizedDataCollectionEnabled()); + mUrlKeyedAnonymizedData.setEnabled(!useSyncAndAllServices); if (mContextualSearch != null) { boolean isContextualSearchEnabled = !mPrefServiceBridge.isContextualSearchDisabled(); @@ -869,7 +908,10 @@ return mPrefServiceBridge.isNetworkPredictionManaged(); } if (PREF_USAGE_AND_CRASH_REPORTING.equals(key)) { - return PrefServiceBridge.getInstance().isMetricsReportingManaged(); + return mPrefServiceBridge.isMetricsReportingManaged(); + } + if (PREF_URL_KEYED_ANONYMIZED_DATA.equals(key)) { + return UnifiedConsentServiceBridge.isUrlKeyedAnonymizedDataCollectionManaged(); } return false; };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java index bf0a641..06f5136 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java
@@ -82,17 +82,14 @@ if (mGUID != null) { mAutofillAddress = new AutofillAddress( mActivity, PersonalDataManager.getInstance().getProfile(mGUID)); - runnable = new Runnable() { - @Override - public void run() { - if (mGUID != null) { - PersonalDataManager.getInstance().deleteProfile(mGUID); - SettingsAutofillAndPaymentsObserver.getInstance().notifyOnAddressDeleted( - mGUID); - } - if (mObserverForTest != null) { - mObserverForTest.onEditorReadyToEdit(); - } + runnable = () -> { + if (mGUID != null) { + PersonalDataManager.getInstance().deleteProfile(mGUID); + SettingsAutofillAndPaymentsObserver.getInstance().notifyOnAddressDeleted( + mGUID); + } + if (mObserverForTest != null) { + mObserverForTest.onEditorReadyToEdit(); } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/OWNERS new file mode 100644 index 0000000..c4d2e224 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/OWNERS
@@ -0,0 +1 @@ +file://components/autofill/OWNERS \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java index 88aeba5..c56c454 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
@@ -36,7 +36,7 @@ protected static final String HAS_BEEN_SUSPENDED_KEY = "has_been_suspended"; - private static boolean sPreventLockDevice = false; + private static boolean sPreventLockDevice; private FragmentManager mFragmentManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java index 1da52e5..6a8c42da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java
@@ -71,7 +71,7 @@ private static int sApiOverride = OverrideState.NOT_OVERRIDDEN; // Used in tests to avoid displaying the OS reauth dialog. - private static boolean sSkipSystemReauth = false; + private static boolean sSkipSystemReauth; /** * Clears the record of the last reauth so that a call to authenticationStillValid will return
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java index f2450bf..1abbe37 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
@@ -114,10 +114,6 @@ (ChromeBaseCheckBoxPreference) findPreference(PREF_SEARCH_SUGGESTIONS); searchSuggestionsPref.setOnPreferenceChangeListener(this); searchSuggestionsPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate); - if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONTENT_SUGGESTIONS_SETTINGS)) { - searchSuggestionsPref.setTitle(R.string.search_site_suggestions_title); - searchSuggestionsPref.setSummary(R.string.search_site_suggestions_summary); - } if (!ContextualSearchFieldTrial.isEnabled()) { preferenceScreen.removePreference(findPreference(PREF_CONTEXTUAL_SEARCH));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java index 1083cf24..c1458df 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java
@@ -6,6 +6,7 @@ import android.support.annotation.IntDef; +import org.chromium.chrome.browser.ContentSettingsType; import org.chromium.chrome.browser.preferences.PrefServiceBridge; import java.io.Serializable; @@ -20,8 +21,8 @@ Type.POPUP, Type.SOUND}) @Retention(RetentionPolicy.SOURCE) public @interface Type { - // Values used to address array index in Website. Should be enumerated from 0 - // and can't have gaps. + // Values used to address array index below, inside Website and SingleWebsitePreferences. + // Should be enumerated from 0 and can't have gaps. int ADS = 0; int AUTOPLAY = 1; int BACKGROUND_SYNC = 2; @@ -35,6 +36,17 @@ int NUM_ENTRIES = 7; } + // Mapping from {@link Type} to ContentSettingType. + final static int[] CONTENT_TYPES = { + ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS, + ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY, + ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, + ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES, + ContentSettingsType.CONTENT_SETTINGS_TYPE_JAVASCRIPT, + ContentSettingsType.CONTENT_SETTINGS_TYPE_POPUPS, + ContentSettingsType.CONTENT_SETTINGS_TYPE_SOUND, + }; + private final int mContentSettingType; private final String mPattern; private final ContentSetting mContentSetting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java index 38140f2..f0f95da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java
@@ -6,6 +6,8 @@ import android.support.annotation.IntDef; +import org.chromium.chrome.browser.ContentSettingsType; + import java.io.Serializable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -18,7 +20,7 @@ Type.NOTIFICATION, Type.PROTECTED_MEDIA_IDENTIFIER, Type.SENSORS}) @Retention(RetentionPolicy.SOURCE) public @interface Type { - // Values used in Website and other places to address permission + // Values used below, in Website, SingleWebsitePreferences and other places to address // array index. Should be enumerated from 0 and can't have gaps. int CAMERA = 0; int CLIPBOARD = 1; @@ -34,6 +36,18 @@ int NUM_ENTRIES = 8; } + // Mapping from {@link Type} to ContentSettingType. + final static int[] CONTENT_TYPES = { + ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, + ContentSettingsType.CONTENT_SETTINGS_TYPE_CLIPBOARD_READ, + ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION, + ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, + ContentSettingsType.CONTENT_SETTINGS_TYPE_MIDI_SYSEX, + ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS, + ContentSettingsType.CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, + ContentSettingsType.CONTENT_SETTINGS_TYPE_SENSORS, + }; + private final boolean mIsIncognito; private final String mEmbedder; private final String mOrigin;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java index c4e83432..45e2c8b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
@@ -101,7 +101,7 @@ // The websites that are currently displayed to the user. private List<WebsitePreference> mWebsites; // Whether tri-state ContentSetting is required. - private boolean mRequiresTriStateSetting = false; + private boolean mRequiresTriStateSetting; // Keys for common ContentSetting toggle for categories. These two toggles are mutually // exclusive: a category should only show one of them, at most. @@ -155,47 +155,25 @@ * @param website The website to check. */ private boolean isOnBlockList(WebsitePreference website) { - ContentSetting setting; - // This list is ordered alphabetically by permission. - if (mCategory.showSites(SiteSettingsCategory.Type.ADS)) { - setting = website.site().getContentSettingPermission(ContentSettingException.Type.ADS); - } else if (mCategory.showSites(SiteSettingsCategory.Type.AUTOPLAY)) { - setting = website.site().getContentSettingPermission( - ContentSettingException.Type.AUTOPLAY); - } else if (mCategory.showSites(SiteSettingsCategory.Type.BACKGROUND_SYNC)) { - setting = website.site().getContentSettingPermission( - ContentSettingException.Type.BACKGROUND_SYNC); - } else if (mCategory.showSites(SiteSettingsCategory.Type.CAMERA)) { - setting = website.site().getPermission(PermissionInfo.Type.CAMERA); - } else if (mCategory.showSites(SiteSettingsCategory.Type.CLIPBOARD)) { - setting = website.site().getPermission(PermissionInfo.Type.CLIPBOARD); - } else if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)) { - setting = - website.site().getContentSettingPermission(ContentSettingException.Type.COOKIE); - } else if (mCategory.showSites(SiteSettingsCategory.Type.DEVICE_LOCATION)) { - setting = website.site().getPermission(PermissionInfo.Type.GEOLOCATION); - } else if (mCategory.showSites(SiteSettingsCategory.Type.JAVASCRIPT)) { - setting = website.site().getContentSettingPermission( - ContentSettingException.Type.JAVASCRIPT); - } else if (mCategory.showSites(SiteSettingsCategory.Type.MICROPHONE)) { - setting = website.site().getPermission(PermissionInfo.Type.MICROPHONE); - } else if (mCategory.showSites(SiteSettingsCategory.Type.NOTIFICATIONS)) { - setting = website.site().getPermission(PermissionInfo.Type.NOTIFICATION); - } else if (mCategory.showSites(SiteSettingsCategory.Type.POPUPS)) { - setting = - website.site().getContentSettingPermission(ContentSettingException.Type.POPUP); - } else if (mCategory.showSites(SiteSettingsCategory.Type.PROTECTED_MEDIA)) { - setting = website.site().getPermission(PermissionInfo.Type.PROTECTED_MEDIA_IDENTIFIER); - } else if (mCategory.showSites(SiteSettingsCategory.Type.SENSORS)) { - setting = website.site().getPermission(PermissionInfo.Type.SENSORS); - } else if (mCategory.showSites(SiteSettingsCategory.Type.SOUND)) { - setting = - website.site().getContentSettingPermission(ContentSettingException.Type.SOUND); - } else { - return false; + for (@SiteSettingsCategory.Type int i = 0; i < SiteSettingsCategory.Type.NUM_ENTRIES; i++) { + if (!mCategory.showSites(i)) continue; + for (@ContentSettingException.Type int j = 0; + j < ContentSettingException.Type.NUM_ENTRIES; j++) { + if (ContentSettingException.CONTENT_TYPES[j] + == SiteSettingsCategory.contentSettingsType(i)) { + return ContentSetting.BLOCK == website.site().getContentSettingPermission(j); + } + } + for (@PermissionInfo.Type int j = 0; j < PermissionInfo.Type.NUM_ENTRIES; j++) { + if (PermissionInfo.CONTENT_TYPES[j] + == SiteSettingsCategory.contentSettingsType(i)) { + return (j == PermissionInfo.Type.MIDI) + ? false + : ContentSetting.BLOCK == website.site().getPermission(j); + } + } } - - return setting == ContentSetting.BLOCK; + return false; } /** @@ -540,6 +518,7 @@ if (mSearch == null && mSearchItem != null) { SearchUtils.clearSearch(mSearchItem, getActivity()); + mSearch = null; } getInfoForOrigins();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java index 52d2219..9e2596b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
@@ -65,42 +65,27 @@ public static final String PREF_CLEAR_DATA = "clear_data"; // Buttons: public static final String PREF_RESET_SITE = "reset_site_button"; - // Website permissions (if adding new, see hasPermissionsPreferences and resetSite below): - public static final String PREF_ADS_PERMISSION = "ads_permission_list"; - public static final String PREF_AUTOPLAY_PERMISSION = "autoplay_permission_list"; - public static final String PREF_BACKGROUND_SYNC_PERMISSION = "background_sync_permission_list"; - public static final String PREF_CAMERA_CAPTURE_PERMISSION = "camera_permission_list"; - public static final String PREF_CLIPBOARD_PERMISSION = "clipboard_permission_list"; - public static final String PREF_COOKIES_PERMISSION = "cookies_permission_list"; - public static final String PREF_JAVASCRIPT_PERMISSION = "javascript_permission_list"; - public static final String PREF_LOCATION_ACCESS = "location_access_list"; - public static final String PREF_MIC_CAPTURE_PERMISSION = "microphone_permission_list"; - public static final String PREF_MIDI_SYSEX_PERMISSION = "midi_sysex_permission_list"; - public static final String PREF_NOTIFICATIONS_PERMISSION = "push_notifications_list"; - public static final String PREF_POPUP_PERMISSION = "popup_permission_list"; - public static final String PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION = - "protected_media_identifier_permission_list"; - public static final String PREF_SENSORS_PERMISSION = "sensors_permission_list"; - public static final String PREF_SOUND_PERMISSION = "sound_permission_list"; + // Website permissions (if adding new, see hasPermissionsPreferences and resetSite below) // All permissions from the permissions preference category must be listed here. - // TODO(mvanouwerkerk): Use this array in more places to reduce verbosity. private static final String[] PERMISSION_PREFERENCE_KEYS = { - PREF_ADS_PERMISSION, - PREF_AUTOPLAY_PERMISSION, - PREF_BACKGROUND_SYNC_PERMISSION, - PREF_CAMERA_CAPTURE_PERMISSION, - PREF_CLIPBOARD_PERMISSION, - PREF_COOKIES_PERMISSION, - PREF_JAVASCRIPT_PERMISSION, - PREF_LOCATION_ACCESS, - PREF_MIC_CAPTURE_PERMISSION, - PREF_MIDI_SYSEX_PERMISSION, - PREF_NOTIFICATIONS_PERMISSION, - PREF_POPUP_PERMISSION, - PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION, - PREF_SENSORS_PERMISSION, - PREF_SOUND_PERMISSION, + // Permission keys mapped for next {@link ContentSettingException.Type} values. + "ads_permission_list", // ContentSettingException.Type.ADS + "autoplay_permission_list", // ContentSettingException.Type.AUTOPLAY + "background_sync_permission_list", // ContentSettingException.Type.BACKGROUND_SYNC + "cookies_permission_list", // ContentSettingException.Type.COOKIE + "javascript_permission_list", // ContentSettingException.Type.JAVASCRIPT + "popup_permission_list", // ContentSettingException.Type.POPUP + "sound_permission_list", // ContentSettingException.Type.SOUND + // Permission keys mapped for next {@link PermissionInfo.Type} values. + "camera_permission_list", // PermissionInfo.Type.CAMERA + "clipboard_permission_list", // PermissionInfo.Type.CLIPBOARD + "location_access_list", // PermissionInfo.Type.GEOLOCATION + "microphone_permission_list", // PermissionInfo.Type.MICROPHONE + "midi_sysex_permission_list", // PermissionInfo.Type.MIDI + "push_notifications_list", // PermissionInfo.Type.NOTIFICATION + "protected_media_identifier_permission_list", // PermissionInfo.Type.PROTECTED_MEDIA_IDENTIFIER + "sensors_permission_list", // PermissionInfo.Type.SENSORS }; private static final int REQUEST_CODE_NOTIFICATION_CHANNEL_SETTINGS = 1; @@ -288,50 +273,43 @@ } private void setUpPreference(Preference preference) { - String key = preference.getKey(); - if (PREF_SITE_TITLE.equals(key)) { + if (PREF_SITE_TITLE.equals(preference.getKey())) { preference.setTitle(mSite.getTitle()); - } else if (PREF_CLEAR_DATA.equals(key)) { + } else if (PREF_CLEAR_DATA.equals(preference.getKey())) { setUpClearDataPreference(preference); - } else if (PREF_RESET_SITE.equals(key)) { + } else if (PREF_RESET_SITE.equals(preference.getKey())) { preference.setOnPreferenceClickListener(this); - } else if (PREF_ADS_PERMISSION.equals(key)) { - setUpAdsPreference(preference); - } else if (PREF_AUTOPLAY_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getContentSettingPermission(ContentSettingException.Type.AUTOPLAY)); - } else if (PREF_BACKGROUND_SYNC_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getContentSettingPermission( - ContentSettingException.Type.BACKGROUND_SYNC)); - } else if (PREF_CAMERA_CAPTURE_PERMISSION.equals(key)) { - setUpListPreference(preference, mSite.getPermission(PermissionInfo.Type.CAMERA)); - } else if (PREF_CLIPBOARD_PERMISSION.equals(key)) { - setUpListPreference(preference, mSite.getPermission(PermissionInfo.Type.CLIPBOARD)); - } else if (PREF_COOKIES_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getContentSettingPermission(ContentSettingException.Type.COOKIE)); - } else if (PREF_JAVASCRIPT_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getContentSettingPermission(ContentSettingException.Type.JAVASCRIPT)); - } else if (PREF_LOCATION_ACCESS.equals(key)) { - setUpLocationPreference(preference); - } else if (PREF_MIC_CAPTURE_PERMISSION.equals(key)) { - setUpListPreference(preference, mSite.getPermission(PermissionInfo.Type.MICROPHONE)); - } else if (PREF_MIDI_SYSEX_PERMISSION.equals(key)) { - setUpListPreference(preference, mSite.getPermission(PermissionInfo.Type.MIDI)); - } else if (PREF_NOTIFICATIONS_PERMISSION.equals(key)) { - setUpNotificationsPreference(preference); - } else if (PREF_POPUP_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getContentSettingPermission(ContentSettingException.Type.POPUP)); - } else if (PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION.equals(key)) { - setUpListPreference(preference, - mSite.getPermission(PermissionInfo.Type.PROTECTED_MEDIA_IDENTIFIER)); - } else if (PREF_SENSORS_PERMISSION.equals(key)) { - setUpListPreference(preference, mSite.getPermission(PermissionInfo.Type.SENSORS)); - } else if (PREF_SOUND_PERMISSION.equals(key)) { - setUpSoundPreference(preference); + } else { + assert PERMISSION_PREFERENCE_KEYS.length + == ContentSettingException.Type.NUM_ENTRIES + PermissionInfo.Type.NUM_ENTRIES; + for (@ContentSettingException.Type int i = 0; + i < ContentSettingException.Type.NUM_ENTRIES; i++) { + if (!PERMISSION_PREFERENCE_KEYS[i].equals(preference.getKey())) { + continue; + } + if (i == ContentSettingException.Type.ADS) { + setUpAdsPreference(preference); + } else if (i == ContentSettingException.Type.SOUND) { + setUpSoundPreference(preference); + } else { + setUpListPreference(preference, mSite.getContentSettingPermission(i)); + } + return; + } + for (@PermissionInfo.Type int i = 0; i < PermissionInfo.Type.NUM_ENTRIES; i++) { + if (!PERMISSION_PREFERENCE_KEYS[i + ContentSettingException.Type.NUM_ENTRIES] + .equals(preference.getKey())) { + continue; + } + if (i == PermissionInfo.Type.GEOLOCATION) { + setUpLocationPreference(preference); + } else if (i == PermissionInfo.Type.NOTIFICATION) { + setUpNotificationsPreference(preference); + } else { + setUpListPreference(preference, mSite.getPermission(i)); + } + return; + } } } @@ -435,8 +413,9 @@ if (requestCode == REQUEST_CODE_NOTIFICATION_CHANNEL_SETTINGS) { // User has navigated back from system channel settings on O+. Ensure notification // preference is up to date, since they might have toggled it from channel settings. - Preference notificationsPreference = - getPreferenceScreen().findPreference(PREF_NOTIFICATIONS_PERMISSION); + Preference notificationsPreference = getPreferenceScreen().findPreference( + PERMISSION_PREFERENCE_KEYS[PermissionInfo.Type.NOTIFICATION + + ContentSettingException.Type.NUM_ENTRIES]); if (notificationsPreference != null) { setUpNotificationsPreference(notificationsPreference); } @@ -490,7 +469,9 @@ PreferenceScreen preferenceScreen = getPreferenceScreen(); boolean adBlockingActivated = SiteSettingsCategory.adsCategoryEnabled() && WebsitePreferenceBridge.getAdBlockingActivated(mSite.getAddress().getOrigin()) - && preferenceScreen.findPreference(PREF_ADS_PERMISSION) != null; + && preferenceScreen.findPreference( + PERMISSION_PREFERENCE_KEYS[ContentSettingException.Type.ADS]) + != null; if (!adBlockingActivated) { Preference intrusiveAdsInfo = preferenceScreen.findPreference(PREF_INTRUSIVE_ADS_INFO); @@ -510,35 +491,26 @@ // warning (when Location is turned off globally). if (showWarningFor(SiteSettingsCategory.Type.DEVICE_LOCATION)) { return SiteSettingsCategory.createFromType(SiteSettingsCategory.Type.DEVICE_LOCATION); - } - if (showWarningFor(SiteSettingsCategory.Type.CAMERA)) { + } else if (showWarningFor(SiteSettingsCategory.Type.CAMERA)) { return SiteSettingsCategory.createFromType(SiteSettingsCategory.Type.CAMERA); - } - if (showWarningFor(SiteSettingsCategory.Type.MICROPHONE)) { + } else if (showWarningFor(SiteSettingsCategory.Type.MICROPHONE)) { return SiteSettingsCategory.createFromType(SiteSettingsCategory.Type.MICROPHONE); - } - if (showWarningFor(SiteSettingsCategory.Type.NOTIFICATIONS)) { + } else if (showWarningFor(SiteSettingsCategory.Type.NOTIFICATIONS)) { return SiteSettingsCategory.createFromType(SiteSettingsCategory.Type.NOTIFICATIONS); } return null; } private boolean showWarningFor(@SiteSettingsCategory.Type int type) { - ContentSetting setting = null; - if (type == SiteSettingsCategory.Type.DEVICE_LOCATION) { - setting = mSite.getPermission(PermissionInfo.Type.GEOLOCATION); - } else if (type == SiteSettingsCategory.Type.CAMERA) { - setting = mSite.getPermission(PermissionInfo.Type.CAMERA); - } else if (type == SiteSettingsCategory.Type.MICROPHONE) { - setting = mSite.getPermission(PermissionInfo.Type.MICROPHONE); - } else if (type == SiteSettingsCategory.Type.NOTIFICATIONS) { - setting = mSite.getPermission(PermissionInfo.Type.NOTIFICATION); + for (int i = 0; i < PermissionInfo.CONTENT_TYPES.length; i++) { + if (PermissionInfo.CONTENT_TYPES[i] == SiteSettingsCategory.contentSettingsType(type)) { + return mSite.getPermission(i) == null + ? false + : SiteSettingsCategory.createFromType(type).showPermissionBlockedMessage( + getActivity()); + } } - - if (setting == null) return false; - - SiteSettingsCategory category = SiteSettingsCategory.createFromType(type); - return category.showPermissionBlockedMessage(getActivity()); + return false; } private boolean hasUsagePreferences() { @@ -707,40 +679,15 @@ } private int getContentSettingsTypeFromPreferenceKey(String preferenceKey) { - switch (preferenceKey) { - case PREF_ADS_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS; - case PREF_AUTOPLAY_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY; - case PREF_BACKGROUND_SYNC_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC; - case PREF_CAMERA_CAPTURE_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA; - case PREF_CLIPBOARD_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_CLIPBOARD_READ; - case PREF_COOKIES_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES; - case PREF_JAVASCRIPT_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_JAVASCRIPT; - case PREF_LOCATION_ACCESS: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION; - case PREF_MIC_CAPTURE_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC; - case PREF_MIDI_SYSEX_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_MIDI_SYSEX; - case PREF_NOTIFICATIONS_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS; - case PREF_POPUP_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_POPUPS; - case PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER; - case PREF_SENSORS_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_SENSORS; - case PREF_SOUND_PERMISSION: - return ContentSettingsType.CONTENT_SETTINGS_TYPE_SOUND; - default: - return 0; + for (int i = 0; i < PERMISSION_PREFERENCE_KEYS.length; i++) { + if (PERMISSION_PREFERENCE_KEYS[i].equals(preferenceKey)) { + return i < ContentSettingException.Type.NUM_ENTRIES + ? ContentSettingException.CONTENT_TYPES[i] + : PermissionInfo + .CONTENT_TYPES[i - ContentSettingException.Type.NUM_ENTRIES]; + } } + return 0; } private void clearStoredData() { @@ -769,37 +716,15 @@ @Override public boolean onPreferenceChange(Preference preference, Object newValue) { ContentSetting permission = ContentSetting.fromString((String) newValue); - if (PREF_ADS_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.ADS, permission); - } else if (PREF_AUTOPLAY_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.AUTOPLAY, permission); - } else if (PREF_BACKGROUND_SYNC_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission( - ContentSettingException.Type.BACKGROUND_SYNC, permission); - } else if (PREF_CAMERA_CAPTURE_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.CAMERA, permission); - } else if (PREF_CLIPBOARD_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.CLIPBOARD, permission); - } else if (PREF_COOKIES_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.COOKIE, permission); - } else if (PREF_JAVASCRIPT_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.JAVASCRIPT, permission); - } else if (PREF_LOCATION_ACCESS.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.GEOLOCATION, permission); - } else if (PREF_MIC_CAPTURE_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.MICROPHONE, permission); - } else if (PREF_MIDI_SYSEX_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.MIDI, permission); - } else if (PREF_NOTIFICATIONS_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.NOTIFICATION, permission); - } else if (PREF_POPUP_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.POPUP, permission); - } else if (PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.PROTECTED_MEDIA_IDENTIFIER, permission); - } else if (PREF_SENSORS_PERMISSION.equals(preference.getKey())) { - mSite.setPermission(PermissionInfo.Type.SENSORS, permission); - } else if (PREF_SOUND_PERMISSION.equals(preference.getKey())) { - mSite.setContentSettingPermission(ContentSettingException.Type.SOUND, permission); + for (int i = 0; i < PERMISSION_PREFERENCE_KEYS.length; i++) { + if (PERMISSION_PREFERENCE_KEYS[i].equals(preference.getKey())) { + if (i < ContentSettingException.Type.NUM_ENTRIES) { + mSite.setContentSettingPermission(i, permission); + } else { + mSite.setPermission(i - ContentSettingException.Type.NUM_ENTRIES, permission); + } + return true; + } } return true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java index 6d30008..f6c60444 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
@@ -234,36 +234,13 @@ WebsiteAddress address = WebsiteAddress.create(exception.getPattern()); if (address == null) continue; Website site = findOrCreateSite(address, null); - switch (contentSettingsType) { - case ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS: - site.setContentSettingException(ContentSettingException.Type.ADS, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY: - site.setContentSettingException( - ContentSettingException.Type.AUTOPLAY, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC: - site.setContentSettingException( - ContentSettingException.Type.BACKGROUND_SYNC, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES: - site.setContentSettingException(ContentSettingException.Type.COOKIE, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_JAVASCRIPT: - site.setContentSettingException( - ContentSettingException.Type.JAVASCRIPT, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_POPUPS: - site.setContentSettingException(ContentSettingException.Type.POPUP, exception); - break; - case ContentSettingsType.CONTENT_SETTINGS_TYPE_SOUND: - site.setContentSettingException(ContentSettingException.Type.SOUND, exception); - break; - default: - assert false : "Unexpected content setting type received: " - + contentSettingsType; - break; + for (int i = 0; i < ContentSettingException.CONTENT_TYPES.length; i++) { + if (contentSettingsType == ContentSettingException.CONTENT_TYPES[i]) { + site.setContentSettingException(i, exception); + return; + } } + assert false : "Unexpected content setting type received: " + contentSettingsType; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java index d40995db..5e7f147 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
@@ -54,7 +54,7 @@ } @Override - protected void loadUrl(String url, int transition) { + protected void loadUrl(String url, int transition, long inputStart) { mDelegate.loadUrl(url); LocaleManager.getInstance().recordLocaleBasedSearchMetrics(true, url, transition); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java index 2d4cee7..a766577 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
@@ -7,7 +7,8 @@ import org.chromium.chrome.browser.profiles.Profile; /** - * Bridge to UnifiedConsentService. + * Bridge to UnifiedConsentService. Should only be used if + * {@link org.chromium.chrome.browser.ChromeFeatureList.UNIFIED_CONSENT} feature is enabled. */ public class UnifiedConsentServiceBridge { private UnifiedConsentServiceBridge() {} @@ -29,8 +30,27 @@ return nativeShouldShowConsentBump(Profile.getLastUsedProfile()); } - private static native void nativeSetUnifiedConsentGiven(Profile profile, boolean consentGiven); - private static native boolean nativeIsUnifiedConsentGiven(Profile lastUsedProfile); + /** Returns whether collection of URL-keyed anonymized data is enabled. */ + public static boolean isUrlKeyedAnonymizedDataCollectionEnabled() { + return nativeIsUrlKeyedAnonymizedDataCollectionEnabled(Profile.getLastUsedProfile()); + } + /** Sets whether collection of URL-keyed anonymized data is enabled. */ + public static void setUrlKeyedAnonymizedDataCollectionEnabled(boolean enabled) { + nativeSetUrlKeyedAnonymizedDataCollectionEnabled(Profile.getLastUsedProfile(), enabled); + } + + /** Returns whether collection of URL-keyed anonymized data is configured by policy. */ + public static boolean isUrlKeyedAnonymizedDataCollectionManaged() { + return nativeIsUrlKeyedAnonymizedDataCollectionManaged(Profile.getLastUsedProfile()); + } + + private static native void nativeSetUnifiedConsentGiven(Profile profile, boolean consentGiven); + private static native boolean nativeIsUnifiedConsentGiven(Profile profile); private static native boolean nativeShouldShowConsentBump(Profile profile); + + private static native boolean nativeIsUrlKeyedAnonymizedDataCollectionEnabled(Profile profile); + private static native void nativeSetUrlKeyedAnonymizedDataCollectionEnabled( + Profile profile, boolean enabled); + private static native boolean nativeIsUrlKeyedAnonymizedDataCollectionManaged(Profile profile); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java index a35a6d43..974c574f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java
@@ -213,7 +213,7 @@ return mSingleLine; } - int getDuration() { + public int getDuration() { return mDurationMs; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java index b2e9b824..b40480792 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java
@@ -36,20 +36,22 @@ * Visual representation of a snackbar. On phone it matches the width of the activity; on tablet it * has a fixed width and is anchored at the start-bottom corner of the current window. */ -class SnackbarView { +// TODO (jianli): Change this class and its methods back to package protected after the offline +// indicator experiment is done. +public class SnackbarView { private static final int MAX_LINES = 5; - private final Activity mActivity; - private final ViewGroup mContainerView; - private final ViewGroup mSnackbarView; - private final TemplatePreservingTextView mMessageView; + protected final Activity mActivity; + protected final ViewGroup mContainerView; + protected final ViewGroup mSnackbarView; + protected final TemplatePreservingTextView mMessageView; private final TextView mActionButtonView; private final ImageView mProfileImageView; private final int mAnimationDuration; private final boolean mIsTablet; private ViewGroup mOriginalParent; - private ViewGroup mParent; - private Snackbar mSnackbar; + protected ViewGroup mParent; + protected Snackbar mSnackbar; private boolean mAnimateOverWebContent; private View mRootContentView; @@ -75,7 +77,7 @@ * @param parentView The ViewGroup used to display this snackbar. If this is null, this class * will determine where to attach the snackbar. */ - SnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar, + public SnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar, @Nullable ViewGroup parentView) { mActivity = activity; mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(activity); @@ -103,15 +105,14 @@ updateInternal(snackbar, false); } - void show() { + public void show() { addToParent(); mContainerView.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { mContainerView.removeOnLayoutChangeListener(this); - mContainerView.setTranslationY( - mContainerView.getHeight() + getLayoutParams().bottomMargin); + mContainerView.setTranslationY(getYPositionForMoveAnimation()); Animator animator = ObjectAnimator.ofFloat(mContainerView, View.TRANSLATION_Y, 0); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(mAnimationDuration); @@ -120,7 +121,7 @@ }); } - void dismiss() { + public void dismiss() { // Disable action button during animation. mActionButtonView.setEnabled(false); AnimatorSet animatorSet = new AnimatorSet(); @@ -132,13 +133,13 @@ mParent.removeView(mContainerView); } }); - Animator moveDown = ObjectAnimator.ofFloat(mContainerView, View.TRANSLATION_Y, - mContainerView.getHeight() + getLayoutParams().bottomMargin); - moveDown.setInterpolator(new DecelerateInterpolator()); + Animator moveAnimator = ObjectAnimator.ofFloat( + mContainerView, View.TRANSLATION_Y, getYPositionForMoveAnimation()); + moveAnimator.setInterpolator(new DecelerateInterpolator()); Animator fadeOut = ObjectAnimator.ofFloat(mContainerView, View.ALPHA, 0f); fadeOut.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); - animatorSet.playTogether(fadeOut, moveDown); + animatorSet.playTogether(fadeOut, moveAnimator); startAnimatorOnSurfaceView(animatorSet); } @@ -151,17 +152,13 @@ if (!mCurrentVisibleRect.equals(mPreviousVisibleRect)) { mPreviousVisibleRect.set(mCurrentVisibleRect); - mParent.getLocationInWindow(mTempLocation); - int keyboardHeight = - mParent.getHeight() + mTempLocation[1] - mCurrentVisibleRect.bottom; - keyboardHeight = Math.max(0, keyboardHeight); FrameLayout.LayoutParams lp = getLayoutParams(); int prevBottomMargin = lp.bottomMargin; int prevWidth = lp.width; int prevGravity = lp.gravity; - lp.bottomMargin = keyboardHeight; + lp.bottomMargin = getBottomMarginForLayout(); if (mIsTablet) { int margin = mParent.getResources() .getDimensionPixelSize(R.dimen.snackbar_margin_tablet); @@ -178,6 +175,16 @@ } } + protected int getYPositionForMoveAnimation() { + return mContainerView.getHeight() + getLayoutParams().bottomMargin; + } + + protected int getBottomMarginForLayout() { + mParent.getLocationInWindow(mTempLocation); + int keyboardHeight = mParent.getHeight() + mTempLocation[1] - mCurrentVisibleRect.bottom; + return Math.max(0, keyboardHeight); + } + /** * @see SnackbarManager#overrideParent(ViewGroup) */ @@ -202,7 +209,7 @@ * Sends an accessibility event to mMessageView announcing that this window was added so that * the mMessageView content description is read aloud if accessibility is enabled. */ - void announceforAccessibility() { + public void announceforAccessibility() { mMessageView.announceForAccessibility(mMessageView.getContentDescription() + " " + mContainerView.getResources().getString(R.string.bottom_bar_screen_position)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/subresource_filter/TestSubresourceFilterPublisher.java b/chrome/android/java/src/org/chromium/chrome/browser/subresource_filter/TestSubresourceFilterPublisher.java index ef5e8ad..665f86d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/subresource_filter/TestSubresourceFilterPublisher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/subresource_filter/TestSubresourceFilterPublisher.java
@@ -11,7 +11,7 @@ * All methods and members must be called on the UI thread. */ public final class TestSubresourceFilterPublisher { - private boolean mPublished = false; + private boolean mPublished; public void createAndPublishRulesetDisallowingSuffixForTesting(String suffix) { nativeCreateAndPublishRulesetDisallowingSuffixForTesting(suffix);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java index 45f656aa..36dd8e3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java
@@ -9,7 +9,6 @@ import org.chromium.base.Callback; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.snippets.CategoryInt; import org.chromium.chrome.browser.ntp.snippets.FaviconFetchResult; @@ -98,11 +97,6 @@ * Records whether article suggestions are set visible by user. */ public static void recordArticlesListVisible() { - if (!ChromeFeatureList.isEnabled( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)) { - return; - } - RecordHistogram.recordBooleanHistogram("NewTabPage.ContentSuggestions.ArticlesListVisible", PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index db6f1b5..931a0b62 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -778,7 +778,8 @@ // from the native? params.getReferrer() != null ? params.getReferrer().getPolicy() : 0, params.getIsRendererInitiated(), params.getShouldReplaceCurrentEntry(), - params.getHasUserGesture(), params.getShouldClearHistoryList()); + params.getHasUserGesture(), params.getShouldClearHistoryList(), + params.getInputStartTimestamp()); for (TabObserver observer : mObservers) { observer.onLoadUrl(this, params, loadType); @@ -3489,8 +3490,8 @@ private native Profile nativeGetProfileAndroid(long nativeTabAndroid); private native int nativeLoadUrl(long nativeTabAndroid, String url, String extraHeaders, ResourceRequestBody postData, int transition, String referrerUrl, int referrerPolicy, - boolean isRendererInitiated, boolean shoulReplaceCurrentEntry, - boolean hasUserGesture, boolean shouldClearHistoryList); + boolean isRendererInitiated, boolean shoulReplaceCurrentEntry, boolean hasUserGesture, + boolean shouldClearHistoryList, long inputStartTimestamp); private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url, String title); private native boolean nativePrint(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java index 3a50ac6..42d473c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarCoordinator.java
@@ -8,7 +8,6 @@ import android.support.v7.content.res.AppCompatResources; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewStub; @@ -19,7 +18,6 @@ import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.ToolbarSwipeLayout; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; -import org.chromium.chrome.browser.modelutil.PropertyKey; import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.BottomToolbarViewBinder.ViewHolder; @@ -76,10 +74,8 @@ (ScrollingBottomViewResourceFrameLayout) inflatedView; toolbarRoot.setTopShadowHeight(shadowHeight); - PropertyModelChangeProcessor<BottomToolbarModel, ViewHolder, PropertyKey> processor = - new PropertyModelChangeProcessor<>( - model, new ViewHolder(toolbarRoot), new BottomToolbarViewBinder()); - model.addObserver(processor); + PropertyModelChangeProcessor.create( + model, new ViewHolder(toolbarRoot), new BottomToolbarViewBinder()); mTabSwitcherButtonCoordinator = new TabSwitcherButtonCoordinator(toolbarRoot); mMenuButton = toolbarRoot.findViewById(R.id.menu_button_wrapper); @@ -107,7 +103,7 @@ * @param layoutManager A {@link LayoutManager} to attach overlays to. * @param tabSwitcherListener An {@link OnClickListener} that is triggered when the * tab switcher button is clicked. - * @param menuButtonListener An {@link OnTouchListener} that is triggered when the + * @param menuButtonHelper An {@link AppMenuButtonHelper} that is triggered when the * menu button is clicked. * @param tabModelSelector A {@link TabModelSelector} that the tab switcher button uses to * keep its tab count updated.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java index d0206a5..f4bd7a0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java
@@ -9,7 +9,6 @@ import android.view.ViewGroup; import org.chromium.chrome.R; -import org.chromium.chrome.browser.modelutil.PropertyKey; import org.chromium.chrome.browser.modelutil.PropertyModel; import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; import org.chromium.chrome.browser.tab.Tab; @@ -33,7 +32,8 @@ * should acces the mediator which then updates the model. Since this component is very simple * the mediator is omitted. */ - private final PropertyModel mTabSwitcherButtonModel; + private final PropertyModel mTabSwitcherButtonModel = + new PropertyModel(TabSwitcherButtonProperties.ALL_KEYS); private TabModelSelector mTabModelSelector; private TabModelSelectorObserver mTabModelSelectorObserver; @@ -44,14 +44,9 @@ * @param root The root {@link ViewGroup} for locating the view to inflate. */ public TabSwitcherButtonCoordinator(ViewGroup root) { - mTabSwitcherButtonModel = new PropertyModel(TabSwitcherButtonProperties.ALL_KEYS); - - final TabSwitcherButtonView view = - (TabSwitcherButtonView) root.findViewById(R.id.tab_switcher_button); - PropertyModelChangeProcessor<PropertyModel, TabSwitcherButtonView, PropertyKey> processor = - new PropertyModelChangeProcessor<>( - mTabSwitcherButtonModel, view, new TabSwitcherButtonViewBinder()); - mTabSwitcherButtonModel.addObserver(processor); + final TabSwitcherButtonView view = root.findViewById(R.id.tab_switcher_button); + PropertyModelChangeProcessor.create( + mTabSwitcherButtonModel, view, new TabSwitcherButtonViewBinder()); CharSequence description = root.getResources().getString(R.string.open_tabs); mTabSwitcherButtonModel.setValue(TabSwitcherButtonProperties.ON_LONG_CLICK_LISTENER, @@ -123,7 +118,7 @@ } /** - * @param tint The {@ColorStateList} used to tint the button. + * @param tint The {@link ColorStateList} used to tint the button. */ public void setTint(ColorStateList tint) { mTabSwitcherButtonModel.setValue(TabSwitcherButtonProperties.TINT, tint);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java index 9d805a2..ca224c44 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
@@ -59,15 +59,15 @@ int iphText = 0; int iphTextForAccessibility = 0; switch (variant) { - case ToolbarLayout.NTP_BUTTON_HOME_VARIANT: + case ToolbarModel.NTP_BUTTON_HOME_VARIANT: iphText = R.string.iph_ntp_button_text_home_text; iphTextForAccessibility = R.string.iph_ntp_button_text_home_accessibility_text; break; - case ToolbarLayout.NTP_BUTTON_NEWS_FEED_VARIANT: + case ToolbarModel.NTP_BUTTON_NEWS_FEED_VARIANT: iphText = R.string.iph_ntp_button_text_news_feed_text; iphTextForAccessibility = R.string.iph_ntp_button_text_news_feed_accessibility_text; break; - case ToolbarLayout.NTP_BUTTON_CHROME_VARIANT: + case ToolbarModel.NTP_BUTTON_CHROME_VARIANT: iphText = R.string.iph_ntp_button_text_chrome_text; iphTextForAccessibility = R.string.iph_ntp_button_text_chrome_accessibility_text; break;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java index 4e15cd0..dc78d5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java
@@ -95,11 +95,10 @@ if (viewStub instanceof AsyncViewStub) { AsyncViewStub toolbarStub = (AsyncViewStub) viewStub; toolbarStub.setLayoutResource(toolbarLayoutId); - if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) { - toolbarStub.inflate(false); - } else { - toolbarStub.inflate(FeatureUtilities.shouldInflateToolbarOnBackgroundThread()); - } + toolbarStub.setShouldInflateOnBackgroundThread( + !DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext()) + && FeatureUtilities.shouldInflateToolbarOnBackgroundThread()); + toolbarStub.inflate(); AsyncViewProvider<ToolbarLayout> toolbarProvider = AsyncViewProvider.of(toolbarStub, R.id.toolbar); toolbarProvider.whenLoaded(this ::onToolbarInflationComplete);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java index 913c3b58..af6e788 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
@@ -179,4 +179,12 @@ * @return Whether or not we should display search terms instead of a URL for query in omnibox. */ boolean shouldDisplaySearchTerms(); + + /** + * @return The resource ID of drawable for the home button. + */ + @DrawableRes + default int getHomeButtonIcon() { + return 0; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java index c34417d..ee19963 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarLayout.java
@@ -18,7 +18,6 @@ import android.support.annotation.StringRes; import android.support.v4.view.ViewCompat; import android.support.v7.content.res.AppCompatResources; -import android.text.TextUtils; import android.util.AttributeSet; import android.view.InputDevice; import android.view.MotionEvent; @@ -38,11 +37,9 @@ import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.UrlBarData; -import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.widget.PulseDrawable; import org.chromium.chrome.browser.widget.ScrimView; @@ -58,10 +55,6 @@ * through {@link Toolbar} rather than using this class directly. */ public abstract class ToolbarLayout extends FrameLayout implements Toolbar { - public static final String NTP_BUTTON_NEWS_FEED_VARIANT = "news_feed"; - public static final String NTP_BUTTON_HOME_VARIANT = "home"; - public static final String NTP_BUTTON_CHROME_VARIANT = "chrome"; - private Invalidator mInvalidator; private final int[] mTempPosition = new int[2]; @@ -800,7 +793,6 @@ * Opens hompage in the current tab. */ protected void openHomepage() { - getLocationBar().hideSuggestions(); if (mToolbarTabController != null) mToolbarTabController.openHomepage(); } @@ -998,37 +990,7 @@ * @param ntpButton The button that needs to be changed. */ protected void changeIconToNTPIcon(TintedImageButton ntpButton) { - if (!FeatureUtilities.isNewTabPageButtonEnabled() || ntpButton == null) return; - - // Check for a cached icon variant in shared preferences. - String iconVariant = ChromePreferenceManager.getInstance().getNewTabPageButtonVariant(); - - // If there is no cached icon variant and the native library is ready, try to retrieve the - // icon variant from variations associated data. - if (TextUtils.isEmpty(iconVariant) && isNativeLibraryReady()) { - iconVariant = FeatureUtilities.getNTPButtonVariant(); - } - - // Return if no icon variant is found. - if (TextUtils.isEmpty(iconVariant)) return; - - int iconResId = 0; - switch (iconVariant) { - case NTP_BUTTON_HOME_VARIANT: - iconResId = R.drawable.ic_home; - break; - case NTP_BUTTON_NEWS_FEED_VARIANT: - iconResId = R.drawable.ic_library_news_feed; - break; - case NTP_BUTTON_CHROME_VARIANT: - iconResId = R.drawable.ic_chrome; - break; - default: - break; - } - assert iconResId != 0; - - ntpButton.setImageResource(iconResId); + ntpButton.setImageResource(mToolbarDataProvider.getHomeButtonIcon()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 5ab20c20..3c7cbdd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.toolbar; import android.content.res.Configuration; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; @@ -702,7 +703,8 @@ recordBottomToolbarUseForIPH(); openHomepage(); }; - final Drawable drawable = ContextCompat.getDrawable(mActivity, R.drawable.ic_home); + final Drawable drawable = + ContextCompat.getDrawable(mActivity, mToolbarModel.getHomeButtonIcon()); final CharSequence accessibilityString = mActivity.getString(R.string.accessibility_toolbar_btn_home); return new ToolbarButtonData( @@ -887,6 +889,10 @@ Tab currentTab = tabModelSelector.getCurrentTab(); maybeShowDuetHelpBubble(currentTab); + + // Allow the bottom toolbar to be focused in accessibility after the top toolbar. + mLocationBar.getContainerView().setAccessibilityTraversalBefore( + R.id.bottom_toolbar); } onNativeLibraryReady(); @@ -903,9 +909,18 @@ assert mToolbar != null; final Tracker tracker = TrackerFactory.getTrackerForProfile(tab.getProfile()); if (tracker.shouldTriggerHelpUI(FeatureConstants.CHROME_DUET_FEATURE)) { - ViewRectProvider provider = new ViewRectProvider(mToolbar); - TextBubble bubble = new TextBubble(mToolbar.getContext(), mToolbar, - R.string.iph_duet_icons_moved, R.string.iph_duet_icons_moved, true, provider); + TextBubble bubble; + // If on the NTP, there is no toolbar. Place the bubble in the space where the toolbar + // would be. + if (NewTabPage.isNTPUrl(tab.getUrl())) { + bubble = new TextBubble(mToolbar.getContext(), mToolbar, + R.string.iph_duet_icons_moved, R.string.iph_duet_icons_moved, false, + new Rect(0, 0, mToolbar.getWidth(), 0)); + } else { + bubble = new TextBubble(mToolbar.getContext(), mToolbar, + R.string.iph_duet_icons_moved, R.string.iph_duet_icons_moved, true, + new ViewRectProvider(mToolbar)); + } bubble.setDismissOnTouchInteraction(true); bubble.addOnDismissListener( () -> tracker.dismissed(FeatureConstants.CHROME_DUET_FEATURE)); @@ -1280,6 +1295,7 @@ public void openHomepage() { RecordUserAction.record("Home"); + mLocationBar.hideSuggestions(); Tab currentTab = mToolbarModel.getTab(); if (currentTab == null) return; String homePageUrl = HomepageManager.getHomepageUri();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java index d3c1ddb..b4340f48 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java
@@ -27,10 +27,12 @@ import org.chromium.chrome.browser.omnibox.AutocompleteController; import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer; import org.chromium.chrome.browser.omnibox.UrlBarData; +import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlService; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.components.dom_distiller.core.DomDistillerService; @@ -45,6 +47,10 @@ * Provides a way of accessing toolbar data and state. */ public class ToolbarModel implements ToolbarDataProvider { + public static final String NTP_BUTTON_NEWS_FEED_VARIANT = "news_feed"; + public static final String NTP_BUTTON_HOME_VARIANT = "home"; + public static final String NTP_BUTTON_CHROME_VARIANT = "chrome"; + private final Context mContext; private final BottomSheet mBottomSheet; private final boolean mUseModernDesign; @@ -60,6 +66,7 @@ private int mPreviousSecurityLevel; private String mCachedSearchTerms; private boolean mIgnoreSecurityLevelForSearchTerms; + private boolean mIsNativeLibraryReady; private long mNativeToolbarModelAndroid; @@ -85,6 +92,7 @@ public void initializeWithNative() { mNativeToolbarModelAndroid = nativeInit(); mQueryInOmniboxEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_IN_OMNIBOX); + mIsNativeLibraryReady = true; } /** @@ -94,6 +102,7 @@ if (mNativeToolbarModelAndroid == 0) return; nativeDestroy(mNativeToolbarModelAndroid); mNativeToolbarModelAndroid = 0; + mIsNativeLibraryReady = false; } /** @@ -534,6 +543,39 @@ return nativeGetURLForDisplay(mNativeToolbarModelAndroid); } + @Override + public int getHomeButtonIcon() { + int iconResId = R.drawable.btn_toolbar_home; + if (!FeatureUtilities.isNewTabPageButtonEnabled()) return iconResId; + // Check for a cached icon variant in shared preferences. + String iconVariant = ChromePreferenceManager.getInstance().getNewTabPageButtonVariant(); + + // If there is no cached icon variant and the native library is ready, try to retrieve the + // icon variant from variations associated data. + if (TextUtils.isEmpty(iconVariant) && mIsNativeLibraryReady) { + iconVariant = FeatureUtilities.getNTPButtonVariant(); + } + + // Return if no icon variant is found. + if (TextUtils.isEmpty(iconVariant)) return iconResId; + + switch (iconVariant) { + case NTP_BUTTON_HOME_VARIANT: + iconResId = R.drawable.ic_home; + break; + case NTP_BUTTON_NEWS_FEED_VARIANT: + iconResId = R.drawable.ic_library_news_feed; + break; + case NTP_BUTTON_CHROME_VARIANT: + iconResId = R.drawable.ic_chrome; + break; + default: + break; + } + + return iconResId; + } + private native long nativeInit(); private native void nativeDestroy(long nativeToolbarModelAndroid); private native String nativeGetFormattedFullURL(long nativeToolbarModelAndroid);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java index dd64771..ae8a9f50 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -31,7 +31,7 @@ import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.tabmodel.DocumentModeAssassin; -import org.chromium.chrome.browser.toolbar.ToolbarLayout; +import org.chromium.chrome.browser.toolbar.ToolbarModel; import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.variations.VariationsAssociatedData; import org.chromium.ui.base.DeviceFormFactor; @@ -280,7 +280,7 @@ ChromePreferenceManager.NTP_BUTTON_ENABLED_KEY, isNTPButtonEnabled); if (isNTPButtonEnabled) { String iconVariant = getNTPButtonVariant(); - if (TextUtils.isEmpty(iconVariant)) iconVariant = ToolbarLayout.NTP_BUTTON_HOME_VARIANT; + if (TextUtils.isEmpty(iconVariant)) iconVariant = ToolbarModel.NTP_BUTTON_HOME_VARIANT; ChromePreferenceManager.getInstance().setNewTabPageButtonVariant(iconVariant); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java index df4803a..9295a46e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
@@ -50,8 +50,8 @@ int ARCORE_INSTALLED = 2; } - private long mNativeArCoreJavaUtils = 0; - private boolean mAppInfoInitialized = false; + private long mNativeArCoreJavaUtils; + private boolean mAppInfoInitialized; private int mAppMinArCoreApkVersionCode = ARCORE_NOT_INSTALLED_VERSION_CODE; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/NoopCanvas.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/NoopCanvas.java index 3e33d71..e2d0f5c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/NoopCanvas.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/NoopCanvas.java
@@ -24,7 +24,7 @@ */ public static class NoopException extends RuntimeException {} - private NoopException mException = null; + private NoopException mException; /** * @param bitmap The bitmap to create the Canvas from.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java index 90a9451..3eb7e96 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java
@@ -156,7 +156,7 @@ private static boolean sRegisteredDaydreamHook; private static boolean sRegisteredVrAssetsComponent; private static @VrSupportLevel Integer sVrSupportLevel; - private static Boolean sBootsToVr = null; + private static Boolean sBootsToVr; private static boolean sTestVrShellDelegateOnStartup; private ChromeActivity mActivity; @@ -190,8 +190,8 @@ private boolean mExitedDueToUnsupportedMode; private boolean mPaused; private boolean mVisible; - private boolean mRestoreSystemUiVisibility = false; - private Integer mRestoreOrientation = null; + private boolean mRestoreSystemUiVisibility; + private Integer mRestoreOrientation; private boolean mRequestedWebVr; private boolean mListeningForWebVrActivate; private boolean mMaybeActivateAfterHeadsetInsertion;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/keyboard/GvrKeyboardLoaderClient.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/keyboard/GvrKeyboardLoaderClient.java index b41fa62..347c2be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/keyboard/GvrKeyboardLoaderClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/keyboard/GvrKeyboardLoaderClient.java
@@ -29,13 +29,13 @@ private static final String KEYBOARD_PACKAGE = "com.google.android.vr.inputmethod"; private static final String LOADER_NAME = "com.google.vr.keyboard.GvrKeyboardLoader"; - private static IGvrKeyboardLoader sLoader = null; - private static ClassLoader sRemoteClassLoader = null; + private static IGvrKeyboardLoader sLoader; + private static ClassLoader sRemoteClassLoader; // GVR doesn't support setting the context twice in the application's lifetime and crashes if we // do so. Setting the same context wrapper is a no-op, so we keep a reference to the one we // create and use it across re-initialization of the keyboard api. @SuppressLint("StaticFieldLeak") - private static KeyboardContextWrapper sContextWrapper = null; + private static KeyboardContextWrapper sContextWrapper; @CalledByNative public static long loadKeyboardSDK() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java index 690bfea..810bacb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java
@@ -24,7 +24,7 @@ */ public class WebApkUpdateTask extends NativeBackgroundTask { /** The WebappDataStorage for the WebAPK to update. */ - private WebappDataStorage mStorageToUpdate = null; + private WebappDataStorage mStorageToUpdate; /** Whether there are more WebAPKs to update than just {@link mStorageToUpdate}. */ private boolean mMoreToUpdate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java index 43526612..71bf20d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
@@ -34,7 +34,7 @@ private static final int GMSCORE_MIN_VERSION = 12800000; /** Ensures only one request is processed at a time. */ - private boolean mIsOperationPending = false; + private boolean mIsOperationPending; private org.chromium.mojo.bindings.Callbacks .Callback2<Integer, MakeCredentialAuthenticatorResponse> mMakeCredentialCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java index 90fc6cd5..30743b2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java
@@ -159,7 +159,7 @@ private int mActionIconResourceId; private int mActionIconDescriptionForAccessibility; private boolean mIsFullLine = true; - private boolean mPlusIconIsDisplayed = false; + private boolean mPlusIconIsDisplayed; /** * Constructs a label to show in the editor. This can be, for example, description of a server
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java index fc8fe0f5..f676a6f5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java
@@ -9,7 +9,6 @@ import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.os.Build; import android.support.annotation.CallSuper; import android.support.annotation.StringRes; import android.support.v4.view.GravityCompat; @@ -183,9 +182,10 @@ mDrawerLayout = drawerLayout; mNormalGroupResId = normalGroupResId; mSelectedGroupResId = selectedGroupResId; - mUpdateStatusBarColor = updateStatusBarColor - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && !UiUtils.isSystemUiThemingDisabled(); + // TODO(twellington): Setting the status bar color crashes on Nokia devices. Re-enable + // after a Nokia test device is procured and the crash can be debugged. + // See https://crbug.com/880694. + mUpdateStatusBarColor = false; mSelectionDelegate = delegate; mSelectionDelegate.addObserver(this);
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 45bd3119..75e3017f 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -670,12 +670,6 @@ <message name="IDS_SEARCH_SUGGESTIONS_SUMMARY" desc="Summary for search and url suggestions."> Use a prediction service to show related queries and popular websites as you type in the address bar </message> - <message name="IDS_SEARCH_SITE_SUGGESTIONS_TITLE" desc="Title for search and site suggestions."> - Search and site suggestions - </message> - <message name="IDS_SEARCH_SITE_SUGGESTIONS_SUMMARY" desc="Summary for search and site suggestions."> - Use prediction services to suggest search terms and websites - </message> <message name="IDS_SAFE_BROWSING_EXTENDED_REPORTING_TITLE" desc="Title for checkbox that controls whether details of possible security incidents will be sent to Google."> Security incidents </message> @@ -1840,6 +1834,9 @@ <message name="IDS_BOTTOM_BAR_SCREEN_POSITION" desc="Accessibility label to inform users about the InfoBar location"> Options available near bottom of the screen </message> + <message name="IDS_TOP_BAR_SCREEN_POSITION" desc="Accessibility label to inform users about the InfoBar location"> + Options available near top of the screen + </message> <message name="IDS_PREVIEWS_INFOBAR_ACCESSIBILITY_TITLE" desc="Accessibility label to inform users about the InfoBar notifying the user that mobile data usage was reduced and the page was shown faster by showing a preview version of the web page instead of the full page."> Simplified page to save data and load faster. </message> @@ -3114,7 +3111,7 @@ Update available. More options </message> <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_SEARCH_ACCELERATOR" desc="Content description for the search accelerator button"> - Search button + Search </message> <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_SITE_INFO" desc="Content description for the page icon that gives more site information when clicked. The icon can be a magnifier for search result pages, or other icons representing the page state."> Site information
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index 90f1172..9c74270 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">ክስተት ፍጠር</translation> <translation id="2902702728133930130">Chrome ባልተጠበቀ ስህተት ምክንያት ሊጀምር አልቻለም።</translation> <translation id="290376772003165898">ገጽ በ<ph name="LANGUAGE" /> አይደለም?</translation> +<translation id="2910701580606108292">ጣቢያዎች ጥበቃ የሚደረግለትን ይዘትን እንዲያጫውቱ ከመፍቀድ በፊት ጠይቅ</translation> <translation id="2913331724188855103">ጣቢያዎች የኩኪ ውሂብ እንዲያስቀምጡ እና እንዲያነቡ ይፍቀዱ (የሚመከር)</translation> <translation id="2932150158123903946">የGoogle <ph name="APP_NAME" /> ማከማቻ</translation> <translation id="2943166482989655199">የሥርዓት እና አጠቃቀም ውሂብ ወደ Google በመላክ Chrome እና ደህንነቱን ያሻሽሉ</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">የአሁኑን ገጽ ዳግም ጫን</translation> <translation id="3452612588551937789">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት፣ ታሪክ እና ሌሎች ቅንብሮችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በGoogle መለያዎ ይግቡ።</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d ፋይል ወርዷል}one{%1$d ፋይሎች ወርደዋል}other{%1$d ፋይሎች ወርደዋል}}</translation> -<translation id="3487093336331957349">የፍለጋ እና የጣቢያ አስተያየት ጥቆማዎች</translation> <translation id="3492207499832628349">አዲስ ማንነት የማያሳውቅ ትር</translation> <translation id="3493531032208478708">ስለሚጠቆም ይዘት <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="3518985090088779359">ተቀበል እና ቀጥል</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">ስምረትን፣ ግላዊነት ማላበስን እና ተጨማሪ ነገሮችን ይቆጣጠሩ</translation> <translation id="4432792777822557199">በ<ph name="SOURCE_LANGUAGE" /> ያሉ ገጾች ወደ <ph name="TARGET_LANGUAGE" /> ከአሁን በኋላ ይተረጎማሉ</translation> <translation id="4434045419905280838">ብቅ-ባዮች እና አቅጣጫ ማዞሮች</translation> -<translation id="4445444302979002552">ቃላትን እና የድር ጣቢያዎችን ለመጠቆም የመገመቻ አገልግሎቶችን ይጠቀሙ</translation> <translation id="4452411734226507615">የ<ph name="TAB_TITLE" /> ትር ዝጋ</translation> <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ላይ ዕልባት ተደርጓል</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> በ<ph name="PRODUCT_NAME" /> ውስጥ ወርዷል</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">ገጹን ማተም ላይ ችግር ነበር። እባክዎ እንደገና ይሞክሩ።</translation> <translation id="6295158916970320988">ሁሉም ጣቢያዎች</translation> <translation id="629730747756840877">መለያ</translation> +<translation id="6303969859164067831">ዘግተው ይውጡ እና ስምረትን ያጥፉ</translation> <translation id="6320088164292336938">ንዘር</translation> <translation id="6324034347079777476">የAndroid ሥርዓት ስምረት ተሰናክሏል</translation> <translation id="6333140779060797560">በ<ph name="APPLICATION" /> በኩል ያጋሩ</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">የአስተያየት ጥቆማዎችን ማግኘት አልተቻለም</translation> <translation id="7562080006725997899">የአሰሳ ውሂብን በማጽዳት ላይ</translation> <translation id="756809126120519699">የChrome ውሂብ ጸድቷል</translation> +<translation id="757524316907819857">ጣቢያዎች ጥበቃ የሚደረግለትን ይዘት እንዳያጫውቱ ያግዱ</translation> <translation id="7589445247086920869">አሁን ላለው የፍለጋ ፕሮግራም አግድ</translation> <translation id="7593557518625677601">የChrome ስምረትን ለመጀመር የAndroid ቅንብሮችን ይክፈቱና የAndroid ስርዓት ስምረትን ዳግም ያንቁ</translation> <translation id="7596558890252710462">ስርዓተ ክወና</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">የአጠቃቀም ስታስቲክስ እና የብልሽት ሪፖርቶች በራስ ሰር ወደ Google ይላኩ።</translation> <translation id="8993760627012879038">አዲስ ትር በማንነት የማያሳውቅ ሁነታ ውስጥ ክፈት</translation> <translation id="8998729206196772491">በ<ph name="MANAGED_DOMAIN" /> ወደሚተዳደር መለያ እየገቡና ሙሉውን የChrome ውሂብዎ ቁጥጥር ለአስተዳዳሪው እየሰጡ ነው። የእርስዎ ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር ይተሳሰራል። ከChrome ዘግቶ መውጣት ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation> -<translation id="9018881455348618200">የፍለጋ አዝራር</translation> <translation id="9019902583201351841">በእርስዎ ወላጆች የሚቀናበር</translation> <translation id="9040142327097499898">ማሳወቂያዎች ይፈቀዳሉ። አካባቢ ለዚህ መሣሪያ ጠፍቷል።</translation> <translation id="9050666287014529139">የይለፍ ሐረግ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 52f06ce..33e7908 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">إنشاء حدث</translation> <translation id="2902702728133930130">تعذّر Chrome أثناء بدء التشغيل بسبب خطأ غير متوقع.</translation> <translation id="290376772003165898">أليست الصفحة باللغة <ph name="LANGUAGE" />؟</translation> +<translation id="2910701580606108292">السؤال قبل السماح لمواقع الويب بتشغيل المحتوى المحمي</translation> <translation id="2913331724188855103">السماح للمواقع بحفظ بيانات ملفات تعريف الارتباط وقراءتها (موصى به)</translation> <translation id="2932150158123903946">سعة تخزين <ph name="APP_NAME" /> Google</translation> <translation id="2943166482989655199">تحسين Chrome وإعدادات الأمان فيه عن طريق إرسال بيانات النظام والاستخدام إلى Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">إعادة تحميل الصفحة الحالية</translation> <translation id="3452612588551937789">سجّل الدخول إلى حسابك في Google للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على جميع أجهزتك.</translation> <translation id="3485359633434254965">{FILES,plural, =1{تم تنزيل ملف واحد (%1$d)}zero{تم تنزيل %1$d ملف}two{تم تنزيل ملفين (%1$d)}few{تم تنزيل %1$d ملفات}many{تم تنزيل %1$d ملفًا}other{تم تنزيل %1$d ملف}}</translation> -<translation id="3487093336331957349">اقتراحات البحث والمواقع</translation> <translation id="3492207499832628349">علامة تبويب جديدة للتصفح المتخفي </translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /> حول المحتوى المقترح</translation> <translation id="3518985090088779359">القبول والمتابعة</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">التحكُّم في المزامنة والتخصيص والمزيد</translation> <translation id="4432792777822557199">ستتم ترجمة الصفحات باللغة <ph name="SOURCE_LANGUAGE" /> إلى اللغة <ph name="TARGET_LANGUAGE" /> من الآن فصاعدًا</translation> <translation id="4434045419905280838">النوافذ المنبثقة وإعادة التوجيه</translation> -<translation id="4445444302979002552">الاستفادة من خدمات التنبؤ في اقتراح عبارات البحث ومواقع الويب</translation> <translation id="4452411734226507615">إغلاق علامة التبويب <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">تم تنزيل <ph name="FILE_NAME" /> في <ph name="PRODUCT_NAME" /></translation> @@ -670,6 +669,7 @@ <translation id="6277522088822131679">حدثت مشكلة أثناء طباعة الصفحة. يُرجى إعادة المحاولة.</translation> <translation id="6295158916970320988">جميع المواقع</translation> <translation id="629730747756840877">الحساب</translation> +<translation id="6303969859164067831">تسجيل الخروج وإيقاف المزامنة</translation> <translation id="6320088164292336938">اهتزاز</translation> <translation id="6324034347079777476">تمّ إيقاف مزامنة نظام Android</translation> <translation id="6333140779060797560">مشاركة عن طريق <ph name="APPLICATION" /></translation> @@ -832,6 +832,7 @@ <translation id="7542481630195938534">يتعذر الحصول على الاقتراحات</translation> <translation id="7562080006725997899">جارٍ محو بيانات التصفح</translation> <translation id="756809126120519699">بيانات Chrome التي تم محوها</translation> +<translation id="757524316907819857">منع مواقع الويب من تشغيل المحتوى المحمي</translation> <translation id="7589445247086920869">حظر محرك البحث الحالي</translation> <translation id="7593557518625677601">فتح إعدادات Android وإعادة تفعيل مزامنة نظام Android لبدء مزامنة Chrome</translation> <translation id="7596558890252710462">نظام التشغيل</translation> @@ -1002,7 +1003,6 @@ <translation id="8986494364107987395">إرسال إحصائيات الاستخدام وتقارير الأعطال إلى Google تلقائيًا</translation> <translation id="8993760627012879038">فتح علامة تبويب جديدة في وضع التصفّح المتخفّي</translation> <translation id="8998729206196772491">يتم تسجيل دخولك باستخدام حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" /> ومنح مشرفه الحق في التحكم في بياناتك على Chrome. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي الخروج من Chrome إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزَّنة على حسابك في Google.</translation> -<translation id="9018881455348618200">زر البحث</translation> <translation id="9019902583201351841">يديره والداك</translation> <translation id="9040142327097499898">الإشعارات مسموح بها. وتحديد الموقع الجغرافي متوقف لهذا الجهاز.</translation> <translation id="9050666287014529139">عبارة المرور</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index a2dd600..d5e8df0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Създайте събитие</translation> <translation id="2902702728133930130">Стартирането на Chrome не бе успешно поради неочаквана грешка.</translation> <translation id="290376772003165898">Страницата не е на <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Запитване преди разрешаване на сайтовете да възпроизвеждат защитено съдържание</translation> <translation id="2913331724188855103">Разрешаване на сайтовете да запазват „бисквитки“ и да четат данни от такива (препоръчително)</translation> <translation id="2932150158123903946">Хранилище на Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Подобрете браузъра Chrome и сигурността му, като ни изпращате системна информация и данни за употребата</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Презареждане на текущата страница</translation> <translation id="3452612588551937789">Влезте с профила си в Google, за да получите своите отметки, история, пароли и други настройки на всичките си устройства.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d файл бе изтеглен}other{%1$d файла бяха изтеглени}}</translation> -<translation id="3487093336331957349">Предложения за търсене и сайтове</translation> <translation id="3492207499832628349">Нов раздел „инкогнито“</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /> за предложеното съдържание</translation> <translation id="3518985090088779359">Приемам! Напред</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Контрол върху синхронизирането, персонализирането и др.</translation> <translation id="4432792777822557199">От сега нататък страниците на <ph name="SOURCE_LANGUAGE" /> ще се превеждат на <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Изскач. прозорци и пренасочвания</translation> -<translation id="4445444302979002552">Използвайте услугите за предвиждане, за да получавате предложения за думи за търсене и уебсайтове</translation> <translation id="4452411734226507615">Затваряне на раздела „<ph name="TAB_TITLE" />“</translation> <translation id="4452548195519783679">Отметката бе запазена в/ъв „<ph name="FOLDER_NAME" />“</translation> <translation id="4453340223357552416">Файлът „<ph name="FILE_NAME" />“ бе изтеглен в/ъв <ph name="PRODUCT_NAME" /></translation> @@ -670,6 +669,7 @@ <translation id="6277522088822131679">При отпечатването на страницата възникна проблем. Моля, опитайте отново.</translation> <translation id="6295158916970320988">Всички сайтове</translation> <translation id="629730747756840877">Профил</translation> +<translation id="6303969859164067831">Изход от профила и изключване на синхронизирането</translation> <translation id="6320088164292336938">Вибриране</translation> <translation id="6324034347079777476">Системното синхронизиране под Android е деактивирано</translation> <translation id="6333140779060797560">Споделяне чрез <ph name="APPLICATION" /></translation> @@ -832,6 +832,7 @@ <translation id="7542481630195938534">Предложенията не могат да бъдат показани</translation> <translation id="7562080006725997899">Данните за сърфирането се изчистват</translation> <translation id="756809126120519699">Данните в Chrome са изчистени</translation> +<translation id="757524316907819857">Блокиране на възпроизвеждането на защитено съдържание от страна на сайтовете</translation> <translation id="7589445247086920869">Блокиране за текущата търсеща машина</translation> <translation id="7593557518625677601">За старт на синхронизирането активирайте системното синхронизиране на Android</translation> <translation id="7596558890252710462">Операционна система</translation> @@ -1002,7 +1003,6 @@ <translation id="8986494364107987395">Автоматично изпращане до Google на статистически данни за използването на Chrome и сигнали за сривове</translation> <translation id="8993760627012879038">Отваряне на нов раздел в режим „инкогнито“</translation> <translation id="8998729206196772491">Влизате с профил, управляван от <ph name="MANAGED_DOMAIN" />, и предоставяте на администратора му контрол върху данните си в Chrome. Те ще се свържат за постоянно с този профил. При излизане от профила в браузъра информацията ви ще се изтрие от устройството, но ще продължи да се съхранява в профила ви в Google.</translation> -<translation id="9018881455348618200">Бутон „Търсене“</translation> <translation id="9019902583201351841">Управлява се от родителите ви</translation> <translation id="9040142327097499898">Известията са разрешени. Местоположението е изключено за това устройство.</translation> <translation id="9050666287014529139">Парола</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index d25b562..cedc4bd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Crea un esdeveniment</translation> <translation id="2902702728133930130">S'ha produït un error inesperat amb Chrome durant l'arrencada.</translation> <translation id="290376772003165898">La pàgina no està en <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Pregunta abans de permetre que els llocs web reprodueixin contingut protegit</translation> <translation id="2913331724188855103">Permet que els llocs web desin i llegeixin les dades de les galetes (recomanat)</translation> <translation id="2932150158123903946">Emmagatzematge de Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Envia a Google dades d'ús i del sistema per millorar Chrome i la seva seguretat</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Torna a carregar la pàgina actual</translation> <translation id="3452612588551937789">Inicieu la sessió amb el compte de Google per tenir les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en tots els dispositius.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fitxer baixat}other{%1$d fitxers baixats}}</translation> -<translation id="3487093336331957349">Suggeriments de cerques i llocs</translation> <translation id="3492207499832628349">Pestanya d'incògnit nova</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /> sobre el contingut suggerit</translation> <translation id="3518985090088779359">Accepta i continua</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Controla la sincronització i la personalització, entre d'altres</translation> <translation id="4432792777822557199">A partir d'ara, les pàgines en <ph name="SOURCE_LANGUAGE" /> es traduiran a <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Finest. emergents i redireccions</translation> -<translation id="4445444302979002552">Utilitza els serveis de predicció per suggerir llocs web i termes de cerca</translation> <translation id="4452411734226507615">Tanca la pestanya <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Adreça d'interès afegida a <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> s'ha baixat a <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">S'ha produït un problema en imprimir la pàgina. Torneu-ho a provar.</translation> <translation id="6295158916970320988">Tots els llocs</translation> <translation id="629730747756840877">Compte</translation> +<translation id="6303969859164067831">Tanca la sessió i desactiva la sincronització</translation> <translation id="6320088164292336938">Vibració</translation> <translation id="6324034347079777476">La sincronització del sistema Android està desactivada</translation> <translation id="6333140779060797560">Comparteix mitjançant <ph name="APPLICATION" />.</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">No es poden obtenir suggeriments</translation> <translation id="7562080006725997899">S'estan esborrant les dades de navegació</translation> <translation id="756809126120519699">S'han esborrat les dades de Chrome</translation> +<translation id="757524316907819857">Impedeix que llocs web reprodueixin contingut protegit</translation> <translation id="7589445247086920869">Bloqueja per al motor de cerca actual</translation> <translation id="7593557518625677601">Obre la configuració d'Android i torna a activar la sincronització del sistema Android per començar la sincronització de Chrome</translation> <translation id="7596558890252710462">Sistema operatiu</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Envia automàticament estadístiques d'ús i informes d'error a Google</translation> <translation id="8993760627012879038">Obre una pestanya nova en mode d'incògnit</translation> <translation id="8998729206196772491">Estàs iniciant la sessió amb un compte gestionat per <ph name="MANAGED_DOMAIN" /> i estàs donant a l'administrador el control de les teves dades de Chrome. Les dades passaran a estar vinculades a aquest compte permanentment. Si tanques la sessió de Chrome, se suprimiran les teves dades d'aquest dispositiu, però continuaran emmagatzemades al teu compte de Google.</translation> -<translation id="9018881455348618200">Botó Cerca</translation> <translation id="9019902583201351841">Gestionat pels pares</translation> <translation id="9040142327097499898">Es permeten les notificacions. La ubicació està desactivada en aquest dispositiu.</translation> <translation id="9050666287014529139">Frase de contrasenya</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index a83f9a2b..1eaf006 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Vytvořit událost</translation> <translation id="2902702728133930130">Spuštění Chromu se nezdařilo kvůli neočekávané chybě.</translation> <translation id="290376772003165898">Není stránka v jazyce <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Před povolením spuštění chráněného obsahu na webu se zeptat</translation> <translation id="2913331724188855103">Povolit webům ukládat a číst data souborů cookie (doporučeno)</translation> <translation id="2932150158123903946">Úložiště aplikace Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Vylepšete Chrome a jeho zabezpečení tím, že do Googlu budete odesílat údaje o systému a využití</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Znovu načíst aktuální stránku</translation> <translation id="3452612588551937789">Přihlaste se pomocí účtu Google a získejte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Byl stažen %1$d soubor}few{Byly staženy %1$d soubory}many{Bylo staženo %1$d souboru}other{Bylo staženo %1$d souborů}}</translation> -<translation id="3487093336331957349">Návrhy vyhledávacích dotazů a webů</translation> <translation id="3492207499832628349">Nová anonymní karta</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /> o navrhovaném obsahu</translation> <translation id="3518985090088779359">PŘIJMOUT A POKRAČOVAT</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Ovládání synchronizace, personalizace apod.</translation> <translation id="4432792777822557199">Stránky v jazyce <ph name="SOURCE_LANGUAGE" /> od teď budou překládány do jazyka <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Vyskakovací okna a přesměrování</translation> -<translation id="4445444302979002552">Používat služby předpovídání k zobrazování návrhů vyhledávacích dotazů a webů</translation> <translation id="4452411734226507615">Zavřít kartu <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Záložka přidána do složky <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Soubor <ph name="FILE_NAME" /> byl stažen v prohlížeči <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Při tištění stránky došlo k problému. Zkuste to prosím znovu.</translation> <translation id="6295158916970320988">Všechny weby</translation> <translation id="629730747756840877">Účet</translation> +<translation id="6303969859164067831">Odhlásit a vypnout synchronizaci</translation> <translation id="6320088164292336938">Vibrovat</translation> <translation id="6324034347079777476">Synchronizace systému Android je vypnuta.</translation> <translation id="6333140779060797560">Sdílet prostřednictvím aplikace <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Návrhy nelze načíst</translation> <translation id="7562080006725997899">Mazání údajů o prohlížení</translation> <translation id="756809126120519699">Vymazání údajů Chromu</translation> +<translation id="757524316907819857">Bránit webům v přehrávání chráněného obsahu</translation> <translation id="7589445247086920869">Blokovat pro aktuální vyhledávač</translation> <translation id="7593557518625677601">Chcete-li spustit synchronizaci Chromu, povolte synchronizaci systému Android.</translation> <translation id="7596558890252710462">Operační systém</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automaticky posílat společnosti Google statistiky používání a zprávy o selhání</translation> <translation id="8993760627012879038">Otevřít novou kartu v anonymním režimu</translation> <translation id="8998729206196772491">Přihlašujete se pomocí účtu spravovaného doménou <ph name="MANAGED_DOMAIN" /> a poskytujete jeho správci kontrolu nad svými daty prohlížeče Chrome. Vaše data budou trvale přidružena k tomuto účtu. Odhlášením z Chromu svá data smažete z tohoto zařízení, ve vašem účtu Google však uložena zůstanou.</translation> -<translation id="9018881455348618200">Tlačítko Hledat</translation> <translation id="9019902583201351841">Spravováno vašimi rodiči</translation> <translation id="9040142327097499898">Oznámení jsou povolena. Poloha je v tomto zařízení vypnutá.</translation> <translation id="9050666287014529139">Heslová fráze</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 459ccb8..fcc75ba 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Opret begivenhed</translation> <translation id="2902702728133930130">Der opstod en uventet fejl under start af Chrome.</translation> <translation id="290376772003165898">Er siden ikke på <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Spørg om tilladelse, før websites begynder at afspille beskyttet indhold</translation> <translation id="2913331724188855103">Tillad, at websites gemmer og læser cookiedata (anbefales)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" />-lagerplads</translation> <translation id="2943166482989655199">Gør Chrome og dens sikkerhed bedre ved at sende system- og brugsdata til Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Genindlæs den aktuelle side</translation> <translation id="3452612588551937789">Log ind med din Google-konto for at få adgang til dine bogmærker, dine adgangskoder, din historik og andre indstillinger på alle dine enheder.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fil er downloadet}one{%1$d fil er downloadet}other{%1$d filer er downloadet}}</translation> -<translation id="3487093336331957349">Søge- og websiteforslag</translation> <translation id="3492207499832628349">Ny inkognitofane</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /> om anbefalet indhold</translation> <translation id="3518985090088779359">Acceptér og fortsæt</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Styr synkronisering, tilpasning og meget mere</translation> <translation id="4432792777822557199">Sider på <ph name="SOURCE_LANGUAGE" /> oversættes fremover til <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pop op-vinduer og omdirigeringer</translation> -<translation id="4445444302979002552">Brug forslagstjenester til at foreslå søgetermer og websites</translation> <translation id="4452411734226507615">Luk fanen <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Bogmærket er gemt i <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> downloadet i <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Der opstod et problem med udskrivning af siden. Prøv igen.</translation> <translation id="6295158916970320988">Alle websites</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6303969859164067831">Log ud, og deaktiver synkronisering</translation> <translation id="6320088164292336938">Vibrer</translation> <translation id="6324034347079777476">Synkronisering af Android-systemet blev deaktiveret</translation> <translation id="6333140779060797560">Del via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Forslagene kan ikke hentes</translation> <translation id="7562080006725997899">Browserdata ryddes</translation> <translation id="756809126120519699">Chrome-dataene blev ryddet</translation> +<translation id="757524316907819857">Bloker afspilning af beskyttet indhold på websites</translation> <translation id="7589445247086920869">Bloker for den aktuelle søgemaskine</translation> <translation id="7593557518625677601">Åbn Android-indstillinger, og genaktiver synkronisering af Android-systemet for at starte Chrome-synkroniseringen</translation> <translation id="7596558890252710462">Operativsystem</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Send automatisk brugsstatistikker og nedbrudsrapporter til Google</translation> <translation id="8993760627012879038">Åbn en ny fane i inkognitotilstand</translation> <translation id="8998729206196772491">Du er ved at logge ind med en konto, der administreres af <ph name="MANAGED_DOMAIN" />, hvilket giver administratoren kontrol over dine Chrome-data. Dine data tilknyttes denne konto permanent. Hvis du logger ud af Chrome, slettes dine data fra denne enhed, men de forbliver gemt på din Google-konto.</translation> -<translation id="9018881455348618200">Søgeknap</translation> <translation id="9019902583201351841">Administreret af dine forældre</translation> <translation id="9040142327097499898">Underretninger er tilladt. Placering er deaktiveret for denne enhed.</translation> <translation id="9050666287014529139">Adgangssætning</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index b6417e7..521c4ea7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Termin erstellen</translation> <translation id="2902702728133930130">Während des Startvorgangs ist in Chrome ein unerwarteter Fehler aufgetreten.</translation> <translation id="290376772003165898">Diese Seite ist nicht auf <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Fragen, bevor die Wiedergabe geschützter Inhalte auf Websites zugelassen wird</translation> <translation id="2913331724188855103">Websites dürfen Cookiedaten speichern und lesen (empfohlen)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" />-Speicher</translation> <translation id="2943166482989655199">System- und Nutzungsdaten an Google senden, um Chrome noch besser und sicherer zu machen</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Aktuelle Seite neu laden</translation> <translation id="3452612588551937789">Melden Sie sich mit Ihrem Google-Konto an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und Ihre anderen Einstellungen auf allen Geräten abrufen zu können.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d Datei heruntergeladen}other{%1$d Dateien heruntergeladen}}</translation> -<translation id="3487093336331957349">Vorschläge für Suchbegriffe und für Websites</translation> <translation id="3492207499832628349">Neuer Inkognito-Tab</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /> zu vorgeschlagenen Inhalten</translation> <translation id="3518985090088779359">Akzeptieren & weiter</translation> @@ -417,8 +417,6 @@ <translation id="4419556793104466535">Synchronisierung, Personalisierung und mehr steuern</translation> <translation id="4432792777822557199">Seiten auf <ph name="SOURCE_LANGUAGE" /> werden ab jetzt auf <ph name="TARGET_LANGUAGE" /> übersetzt</translation> <translation id="4434045419905280838">Pop-ups und Weiterleitungen</translation> -<translation id="4445444302979002552">Vorhersagedienste verwenden, um Vorschläge für Suchbegriffe und Websites zu erhalten -</translation> <translation id="4452411734226507615">Tab "<ph name="TAB_TITLE" />" schließen</translation> <translation id="4452548195519783679">Als Lesezeichen in "<ph name="FOLDER_NAME" />" gespeichert</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> in <ph name="PRODUCT_NAME" /> heruntergeladen</translation> @@ -670,6 +668,7 @@ <translation id="6277522088822131679">Beim Drucken der Seite ist ein Problem aufgetreten. Bitte versuchen Sie es erneut.</translation> <translation id="6295158916970320988">Alle Websites</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6303969859164067831">Abmelden und die Synchronisierung ausschalten</translation> <translation id="6320088164292336938">Vibrieren</translation> <translation id="6324034347079777476">Android-Systemsynchronisierung deaktiviert</translation> <translation id="6333140779060797560">Über <ph name="APPLICATION" /> teilen</translation> @@ -832,6 +831,7 @@ <translation id="7542481630195938534">Vorschläge können nicht abgerufen werden</translation> <translation id="7562080006725997899">Browserdaten werden gelöscht</translation> <translation id="756809126120519699">Gelöschte Chrome-Daten</translation> +<translation id="757524316907819857">Wiedergabe von geschützten Inhalten für Websites blockieren</translation> <translation id="7589445247086920869">Für die aktuelle Suchmaschine blockieren</translation> <translation id="7593557518625677601">Einstellungen öffnen und Systemsynchr. aktivieren, um Chrome-Synchr. zu starten</translation> <translation id="7596558890252710462">Betriebssystem</translation> @@ -1002,7 +1002,6 @@ <translation id="8986494364107987395">Nutzungsstatistiken und Absturzberichte automatisch an Google senden</translation> <translation id="8993760627012879038">Neuen Tab im Inkognitomodus öffnen</translation> <translation id="8998729206196772491">Sie melden sich mit einem von <ph name="MANAGED_DOMAIN" /> verwalteten Konto an und geben dem Administrator der Domain Kontrolle über Ihre Chrome-Daten. Die Daten werden diesem Konto dauerhaft zugeordnet. Wenn Sie sich von Chrome abmelden, werden Ihre Daten auf dem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation> -<translation id="9018881455348618200">Schaltfläche für die Suche</translation> <translation id="9019902583201351841">Von deinen Eltern verwaltet</translation> <translation id="9040142327097499898">Benachrichtigungen sind erlaubt. Der Standortzugriff ist für dieses Gerät deaktiviert.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index f4c1f35a..a8a4725d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Δημιουργία συμβάντος</translation> <translation id="2902702728133930130">Η εκκίνηση του Chrome απέτυχε λόγω ενός μη αναμενόμενου σφάλματος.</translation> <translation id="290376772003165898">Η σελίδα δεν είναι στα <ph name="LANGUAGE" />;</translation> +<translation id="2910701580606108292">Να γίνεται ερώτηση προτού επιτραπεί στους ιστοτόπους η αναπαραγωγή προστατευόμενου περιεχομένου</translation> <translation id="2913331724188855103">Να επιτρέπεται στους ιστότοπους η αποθήκευση και η ανάγνωση δεδομένων cookie (συνιστάται)</translation> <translation id="2932150158123903946">Αποθηκευτικός χώρος Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Βελτιώστε το Chrome και την ασφάλειά του αποστέλλοντας δεδομένα συστήματος και χρήσης στην Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Επαναφόρτωση της τρέχουσας σελίδας</translation> <translation id="3452612588551937789">Συνδεθείτε στον Λογαριασμό σας Google για να λάβετε τους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης, και άλλες ρυθμίσεις σε όλες τις συσκευές σας</translation> <translation id="3485359633434254965">{FILES,plural, =1{Έγινε λήψη %1$d αρχείου}other{Έγινε λήψη %1$d αρχείων}}</translation> -<translation id="3487093336331957349">Προτάσεις αναζήτησης και ιστοτόπων</translation> <translation id="3492207499832628349">Νέα καρτέλα ανωνυμ. περιήγ.</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /> σχετικά με το προτεινόμενο περιεχόμενο</translation> <translation id="3518985090088779359">Αποδοχή και συνέχεια</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Ελέγξτε τον συγχρονισμό, την εξατομίκευση και άλλα</translation> <translation id="4432792777822557199">Από εδώ και στο εξής, οι σελίδες στα <ph name="SOURCE_LANGUAGE" /> θα μεταφράζονται στα <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Αναδυόμενα παράθυρα και ανακατευθύνσεις</translation> -<translation id="4445444302979002552">Χρησιμοποιήστε τις υπηρεσίες πρόβλεψης, για να προτείνετε όρους και ιστοτόπους αναζήτησης</translation> <translation id="4452411734226507615">Κλείσιμο καρτέλας <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Ο σελιδοδείκτης είναι στο "<ph name="FOLDER_NAME" />"</translation> <translation id="4453340223357552416">Η λήψη του <ph name="FILE_NAME" /> πραγματοποιήθηκε στο <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Παρουσιάστηκε ένα πρόβλημα κατά την εκτύπωση της σελίδας. Δοκιμάστε ξανά.</translation> <translation id="6295158916970320988">Όλοι οι ιστότοποι</translation> <translation id="629730747756840877">Λογαριασμός</translation> +<translation id="6303969859164067831">Αποσύνδεση και απενεργοποίηση συγχρονισμού</translation> <translation id="6320088164292336938">Δόνηση</translation> <translation id="6324034347079777476">Ο συγχρονισμός συστήματος Android απενεργοποιήθηκε</translation> <translation id="6333140779060797560">Μοιραστείτε μέσω <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Δεν είναι δυνατή η λήψη προτάσεων</translation> <translation id="7562080006725997899">Διαγραφή δεδομένων περιήγησης</translation> <translation id="756809126120519699">Τα δεδομένα του Chrome διαγράφηκαν</translation> +<translation id="757524316907819857">Αποκλεισμός αναπαραγωγής προστατευόμενου περιεχομένου από ιστοτόπους</translation> <translation id="7589445247086920869">Αποκλεισμός για την τρέχουσα μηχανή αναζήτησης</translation> <translation id="7593557518625677601">Ανοίξτε Ρυθμίσεις Android και ενεργοποιήστε τον συγχρ. συστ. Android για έναρξη Συγχρ. Chrome</translation> <translation id="7596558890252710462">Λειτουργικό σύστημα</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Αυτόματη αποστολή στατιστικών στοιχείων χρήσης και αναφορών σφαλμάτων στην Google</translation> <translation id="8993760627012879038">Άνοιγμα καρτέλας σε κατάσταση ανώνυμης περιήγησης</translation> <translation id="8998729206196772491">Πρόκειται να συνδεθείτε με έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="MANAGED_DOMAIN" /> και παραχωρείτε στον διαχειριστή του τον έλεγχο της διαχείρισης των δεδομένων σας στο Chrome. Τα δεδομένα σας θα συσχετιστούν οριστικά με αυτόν τον λογαριασμό. Η αποσύνδεση από το Chrome θα διαγράψει τα δεδομένα σας από αυτήν τη συσκευή, αλλά θα διατηρηθούν αποθηκευμένα στον Λογαριασμό σας Google.</translation> -<translation id="9018881455348618200">Κουμπί αναζήτησης</translation> <translation id="9019902583201351841">Διαχειρίζεται από τους γονείς σου</translation> <translation id="9040142327097499898">Οι ειδοποιήσεις επιτρέπονται. Η Τοποθεσία είναι απενεργοποιημένη σε αυτήν τη συσκευή.</translation> <translation id="9050666287014529139">Φράση πρόσβασής σας</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index b143398..7d1faf8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -308,7 +308,6 @@ <translation id="3443221991560634068">Reload the current page</translation> <translation id="3452612588551937789">Sign in with your Google Account to get your bookmarks, history, passwords and other settings on all your devices.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d file downloaded}other{%1$d files downloaded}}</translation> -<translation id="3487093336331957349">Search and site suggestions</translation> <translation id="3492207499832628349">New incognito tab</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /> about suggested content</translation> <translation id="3518985090088779359">Accept & continue</translation> @@ -418,7 +417,6 @@ <translation id="4419556793104466535">Control sync, personalisation and more</translation> <translation id="4432792777822557199">Pages in <ph name="SOURCE_LANGUAGE" /> will be translated to <ph name="TARGET_LANGUAGE" /> from now on</translation> <translation id="4434045419905280838">Pop-ups and redirects</translation> -<translation id="4445444302979002552">Use prediction services to suggest search terms and websites</translation> <translation id="4452411734226507615">Close <ph name="TAB_TITLE" /> tab</translation> <translation id="4452548195519783679">Bookmarked to <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> downloaded in <ph name="PRODUCT_NAME" /></translation> @@ -1002,7 +1000,6 @@ <translation id="8986494364107987395">Automatically send usage statistics and crash reports to Google</translation> <translation id="8993760627012879038">Open a new tab in Incognito mode</translation> <translation id="8998729206196772491">You are signing in with an account managed by <ph name="MANAGED_DOMAIN" /> and giving its administrator control over your Chrome data. Your data will become permanently tied to this account. Signing out of Chrome will delete your data from this device, but it will remain stored in your Google account.</translation> -<translation id="9018881455348618200">Search button</translation> <translation id="9019902583201351841">Managed by your parents</translation> <translation id="9040142327097499898">Notifications are allowed. Location is off for this device.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 460ef8b..b95009a0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -307,7 +307,6 @@ <translation id="3443221991560634068">Volver a cargar la página actual</translation> <translation id="3452612588551937789">Accede con tu cuenta de Google para obtener tus favoritos, contraseñas, historial y otras opciones de configuración en todos tus dispositivos.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Se descargó %1$d archivo}other{Se descargaron %1$d archivos}}</translation> -<translation id="3487093336331957349">Sugerencias de sitios y de búsqueda</translation> <translation id="3492207499832628349">Nueva pestaña de incógnito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3518985090088779359">Aceptar y continuar</translation> @@ -417,7 +416,6 @@ <translation id="4419556793104466535">Controlar la sincronización, la personalización y mucho más</translation> <translation id="4432792777822557199">De ahora en más, las páginas en <ph name="SOURCE_LANGUAGE" /> se traducirán al <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Ventanas emergentes y redirec.</translation> -<translation id="4445444302979002552">Usar los servicios de predicción para sugerir términos de búsqueda y sitios web</translation> <translation id="4452411734226507615">Cierra la pestaña <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Se agregó a favoritos en <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Se descargó <ph name="FILE_NAME" /> en <ph name="PRODUCT_NAME" /></translation> @@ -1001,7 +999,6 @@ <translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8993760627012879038">Abrir ventana nueva en modo de navegación incógnito</translation> <translation id="8998729206196772491">Estás accediendo con una cuenta administrada por <ph name="MANAGED_DOMAIN" /> y dándole permiso a su administrador para que controle tus datos de Chrome. Tus datos se vincularán de forma permanente a esta cuenta. Si sales de Chrome, tus datos se borrarán en este dispositivo, pero quedarán guardados en tu cuenta de Google.</translation> -<translation id="9018881455348618200">Botón de búsqueda</translation> <translation id="9019902583201351841">Administrado por tus padres</translation> <translation id="9040142327097499898">Las notificaciones están habilitadas. La ubicación está desactivada en este dispositivo.</translation> <translation id="9050666287014529139">Frase de contraseña</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index c49e8aa..c17bc28 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Crear evento</translation> <translation id="2902702728133930130">Se ha producido un error inesperado en Chrome durante el inicio.</translation> <translation id="290376772003165898">¿La página no está en <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Preguntar antes de permitir que los sitios web reproduzcan contenido protegido</translation> <translation id="2913331724188855103">Permitir que los sitios guarden y lean datos de cookies (recomendado)</translation> <translation id="2932150158123903946">Almacenamiento de Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Envía información de uso y del sistema a Google para mejorar Chrome y su seguridad</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Vuelve a cargar la página actual</translation> <translation id="3452612588551937789">Inicia sesión con tu cuenta de Google para acceder a tus marcadores, contraseñas, historial y otros ajustes desde todos tus dispositivos.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d archivo descargado}other{%1$d archivos descargados}}</translation> -<translation id="3487093336331957349">Sugerencias de búsqueda y sitios web</translation> <translation id="3492207499832628349">Nueva pestaña de incógnito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3518985090088779359">Aceptar y continuar</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Controlar la sincronización, la personalización y mucho más</translation> <translation id="4432792777822557199">Las páginas en <ph name="SOURCE_LANGUAGE" /> se traducirán al <ph name="TARGET_LANGUAGE" /> a partir de ahora</translation> <translation id="4434045419905280838">Ventanas emergentes y redirecciones</translation> -<translation id="4445444302979002552">Utiliza servicios de predicción para sugerir términos de búsqueda y sitios web</translation> <translation id="4452411734226507615">Cerrar la pestaña <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Marcador añadido a <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> se ha descargado en <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Se ha producido un problema al imprimir la página. Vuelve a intentarlo.</translation> <translation id="6295158916970320988">Todos los sitios</translation> <translation id="629730747756840877">Cuenta</translation> +<translation id="6303969859164067831">Cerrar sesión y desactivar la sincronización</translation> <translation id="6320088164292336938">Vibrar</translation> <translation id="6324034347079777476">Sincronización del sistema Android inhabilitada</translation> <translation id="6333140779060797560">Compartir a través de <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">No se pueden obtener sugerencias</translation> <translation id="7562080006725997899">Borrando datos de navegación</translation> <translation id="756809126120519699">Datos de Chrome borrados</translation> +<translation id="757524316907819857">Impedir que los sitios web reproduzcan contenido protegido</translation> <translation id="7589445247086920869">Bloquearlo para el motor de búsqueda actual</translation> <translation id="7593557518625677601">Abre los ajustes de Android y vuelve a habilitar la sincronización del sistema Android para iniciar la sincronización de Chrome</translation> <translation id="7596558890252710462">Sistema operativo</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Envía automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8993760627012879038">Abre una nueva pestaña en modo de incógnito</translation> <translation id="8998729206196772491">Estás iniciando sesión con una cuenta gestionada por <ph name="MANAGED_DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se vincularán de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation> -<translation id="9018881455348618200">Botón de búsqueda</translation> <translation id="9019902583201351841">Administrado por tus padres</translation> <translation id="9040142327097499898">Las notificaciones están permitidas. La ubicación está desactivada en este dispositivo.</translation> <translation id="9050666287014529139">Frase de contraseña</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index 31c3ab2..9d1cd554 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">ایجاد رویداد</translation> <translation id="2902702728133930130">Chrome در هنگام شروع به کار با خطایی غیرمنتظره متوقف شد.</translation> <translation id="290376772003165898">صفحه به زبان <ph name="LANGUAGE" /> وجود ندارد؟</translation> +<translation id="2910701580606108292">قبل از اجازه دادن به سایتها برای پخش محتوای محافظتشده سؤال شود</translation> <translation id="2913331724188855103">سایتها مجاز به ذخیره و خواندن دادههای کوکی باشند (توصیه میشود)</translation> <translation id="2932150158123903946">فضای ذخیرهسازی Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">بهبود Chrome و امنیت آن با ارسال دادههای سیستم و آمار استفاده به Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">تازهسازی صفحه کنونی</translation> <translation id="3452612588551937789">برای دسترسی به نشانکها، گذرواژهها، سابقه و تنظیمات دیگر در همه دستگاههایتان، به سیستم حساب Google خود وارد شوید.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d فایل بارگیری شد}one{%1$d فایل بارگیری شد}other{%1$d فایل بارگیری شد}}</translation> -<translation id="3487093336331957349">پیشنهادهای جستجو و سایت</translation> <translation id="3492207499832628349">برگه ناشناس جدید</translation> <translation id="3493531032208478708">درباره محتوای پیشنهادی <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="3518985090088779359">پذیرش و ادامه</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">کنترل همگامسازی، شخصیسازی و موارد دیگر</translation> <translation id="4432792777822557199">از این به بعد، صفحههای <ph name="SOURCE_LANGUAGE" />، به <ph name="TARGET_LANGUAGE" /> ترجمه خواهند شد</translation> <translation id="4434045419905280838">پنجرههای بازشو و هدایتها</translation> -<translation id="4445444302979002552">استفاده از سرویسهای پیشبینی برای پیشنهاد عبارتهای جستجو و وبسایتها</translation> <translation id="4452411734226507615">بستن برگه <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">در <ph name="FOLDER_NAME" /> نشانک گذاشته شد</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> در <ph name="PRODUCT_NAME" /> بارگیری شد</translation> @@ -668,6 +667,7 @@ <translation id="6277522088822131679">در چاپ صفحه مشکلی پیش آمد. لطفاً دوباره امتحان کنید.</translation> <translation id="6295158916970320988">همه سایتها</translation> <translation id="629730747756840877">حساب</translation> +<translation id="6303969859164067831">خروج از سیستم و خاموش کردن همگامسازی</translation> <translation id="6320088164292336938">لرزش</translation> <translation id="6324034347079777476">همگامسازی سیستم Android غیرفعال شد</translation> <translation id="6333140779060797560">اشتراکگذاری از طریق <ph name="APPLICATION" /></translation> @@ -830,6 +830,7 @@ <translation id="7542481630195938534">دریافت پیشنهادها امکانپذیر نیست</translation> <translation id="7562080006725997899">پاک کردن دادههای مرور</translation> <translation id="756809126120519699">دادههای Chrome پاک شد</translation> +<translation id="757524316907819857">مسدود کردن سایتها برای پخش محتوای محافظتشده</translation> <translation id="7589445247086920869">مسدود کردن موتور جستجوی کنونی</translation> <translation id="7593557518625677601">برای شروع همگامسازی Chrome، تنظیمات Android را باز کنید و همگامسازی سیستم Android را دوباره فعال کنید</translation> <translation id="7596558890252710462">سیستم عامل</translation> @@ -1000,7 +1001,6 @@ <translation id="8986494364107987395">ارسال خودکار آمار کاربرد و گزارشهای خرابی به Google</translation> <translation id="8993760627012879038">باز کردن برگه جدیدی در حالت ناشناس</translation> <translation id="8998729206196772491">هماکنون درحال ورود به سیستم با یک حساب مدیریتشده توسط <ph name="MANAGED_DOMAIN" /> و ارائه کنترل دادههای Chrome خودتان به سرپرست این حساب هستید. دادههایتان بهطور دائم به این حساب مرتبط میشوند. با خروج از Chrome، دادههایتان از این دستگاه حذف میشوند اما همچنان در حساب Google شما باقی میماند.</translation> -<translation id="9018881455348618200">دکمه جستجو</translation> <translation id="9019902583201351841">مدیریت شده توسط والدین شما</translation> <translation id="9040142327097499898">اعلانها مجاز هستند. مکان برای این دستگاه خاموش است.</translation> <translation id="9050666287014529139">عبارت عبور</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 1089730..c408b04 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -308,7 +308,6 @@ <translation id="3443221991560634068">Päivitä nykyinen sivu</translation> <translation id="3452612588551937789">Kirjaudu Google-tilillesi, niin voit käyttää kirjanmerkkejäsi, historiaasi, salasanojasi ja muita asetuksiasi kaikilla laitteillasi.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d tiedosto ladattu}other{%1$d tiedostoa ladattu}}</translation> -<translation id="3487093336331957349">Haku- ja sivustoehdotukset</translation> <translation id="3492207499832628349">Uusi incognito-välilehti</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lue lisätietoja<ph name="END_LINK" /> suositellusta sisällöstä.</translation> <translation id="3518985090088779359">Hyväksy ja jatka</translation> @@ -418,7 +417,6 @@ <translation id="4419556793104466535">Hallitse synkronointia, personointia ja muuta</translation> <translation id="4432792777822557199">Kielellä <ph name="SOURCE_LANGUAGE" /> kirjoitetut sivut käännetään tästä lähtien kielelle <ph name="TARGET_LANGUAGE" />.</translation> <translation id="4434045419905280838">Ponnahdusikk. ja uudelleenohj.</translation> -<translation id="4445444302979002552">Käytä ennakointipalveluita hakutermien ja verkkosivustojen ehdottamiseen.</translation> <translation id="4452411734226507615">Sulje välilehti <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Lisätty kirjanmerkiksi kansioon <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> on ladattu kohteeseen <ph name="PRODUCT_NAME" /></translation> @@ -1004,7 +1002,6 @@ <translation id="8986494364107987395">Lähetä Googlelle käyttötilastoja ja virheraportteja automaattisesti</translation> <translation id="8993760627012879038">Avaa uusi välilehti incognito-tilassa</translation> <translation id="8998729206196772491">Olet kirjautumassa sisään verkkotunnuksen <ph name="MANAGED_DOMAIN" /> hallinnoimalla tilillä ja antamassa sen järjestelmänvalvojalle oikeuden hallita Chrome-tietojasi. Tietosi liitetään pysyvästi tähän tiliin. Chromesta uloskirjautuminen poistaa tietosi tältä laitteelta, mutta ne säilyvät Google-tililläsi.</translation> -<translation id="9018881455348618200">Hakupainike</translation> <translation id="9019902583201351841">Vanhempiesi hallinnoima</translation> <translation id="9040142327097499898">Ilmoitukset sallitaan. Sijainti on poissa käytöstä tällä laitteella.</translation> <translation id="9050666287014529139">Tunnuslause</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 4e1b1c9..a46cedd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Gumawa ng event</translation> <translation id="2902702728133930130">Nagkaroon ng hindi inaasahang error ang Chrome habang nagsasagawa ng pag-start up.</translation> <translation id="290376772003165898">Hindi nakasalin ang page sa <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Magtanong bago payagan ang mga site na mag-play ng pinoprotektahang content</translation> <translation id="2913331724188855103">Payagan ang mga site na mag-save at magbasa ng data ng cookie (inirerekomenda)</translation> <translation id="2932150158123903946">Storage ng <ph name="APP_NAME" /> sa Google</translation> <translation id="2943166482989655199">Pahusayin ang Chrome at ang seguridad nito sa pamamagitan ng pagpapadala ng data ng system at paggamit sa Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">I-reload ang kasalukuyang page</translation> <translation id="3452612588551937789">Mag-sign in sa iyong Google Account upang makuha ang iyong mga bookmark, history, password at iba pang mga setting sa lahat ng iyong device.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d file ang na-download}one{%1$d file ang na-download}other{%1$d na file ang na-download}}</translation> -<translation id="3487093336331957349">Mga mungkahi sa paghahanap at site</translation> <translation id="3492207499832628349">Bagong tab na incognito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /> tungkol sa iminumungkahing content</translation> <translation id="3518985090088779359">Tanggapin, magpatuloy</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Kontrolin ang pag-sync, pag-personalize, at higit pa</translation> <translation id="4432792777822557199">Simula ngayon ay isasalin na sa <ph name="TARGET_LANGUAGE" /> ang mga page na nasa <ph name="SOURCE_LANGUAGE" /></translation> <translation id="4434045419905280838">Mga pop-up at pag-redirect</translation> -<translation id="4445444302979002552">Gumamit ng mga serbisyo ng panghuhula upang magmungkahi ng mga termino para sa paghahanap at website</translation> <translation id="4452411734226507615">Isara ang tab na <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Na-bookmark sa <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Na-download ang <ph name="FILE_NAME" /> sa <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Nagkaproblema sa pag-print sa pahina. Pakisubukang muli.</translation> <translation id="6295158916970320988">Lahat ng site</translation> <translation id="629730747756840877">Account</translation> +<translation id="6303969859164067831">Mag-sign out at i-off ang pag-sync</translation> <translation id="6320088164292336938">Mag-vibrate</translation> <translation id="6324034347079777476">Naka-disable ang pag-sync ng Android system</translation> <translation id="6333140779060797560">Ibahagi sa pamamagitan ng <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Hindi makakuha ng mga suhestyon</translation> <translation id="7562080006725997899">Kini-clear ang data mula sa pagba-browse</translation> <translation id="756809126120519699">Na-clear ang data ng Chrome</translation> +<translation id="757524316907819857">I-block ang mga site sa pag-play ng pinoprotektahang content</translation> <translation id="7589445247086920869">I-block para sa kasalukuyang search engine</translation> <translation id="7593557518625677601">Buksan ang mga setting ng Android at muling i-enable ang Android system sync upang simulan ang Chrome sync</translation> <translation id="7596558890252710462">Operating system</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Awtomatikong ipadala ang mga istatistika ng paggamit at mga ulat ng pag-crash sa Google</translation> <translation id="8993760627012879038">Magbukas ng bagong tab sa Incognito mode</translation> <translation id="8998729206196772491">Nagsa-sign in ka gamit ang isang account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chrome. Permanenteng mauugnay ang iyong data sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chrome, ngunit mananatili itong nakaimbak sa iyong Google Account.</translation> -<translation id="9018881455348618200">Button ng paghahanap</translation> <translation id="9019902583201351841">Pinamamahalaan ng iyong mga magulang</translation> <translation id="9040142327097499898">Pinapayagan ang mga notification. Naka-off ang lokasyon para sa device na ito.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 715ce2b5..e7ba532 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Créer un événement</translation> <translation id="2902702728133930130">Échec du démarrage de Chrome, en raison d'une erreur inattendue.</translation> <translation id="290376772003165898">La page n'est pas en <ph name="LANGUAGE" /> ?</translation> +<translation id="2910701580606108292">Demander avant d'autoriser les sites à lire les contenus protégés</translation> <translation id="2913331724188855103">Autoriser les sites à enregistrer et à lire les données des cookies (recommandé)</translation> <translation id="2932150158123903946">Stockage Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Aidez Google à améliorer Chrome et son niveau de sécurité en envoyant des informations relatives au système et à la consommation des données</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Actualiser la page active</translation> <translation id="3452612588551937789">Connectez-vous à votre compte Google pour synchroniser vos favoris, vos mots de passe, votre historique et d'autres paramètres sur tous vos appareils.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fichier téléchargé}one{%1$d fichier téléchargé}other{%1$d fichiers téléchargés}}</translation> -<translation id="3487093336331957349">Suggestions de recherches et de sites</translation> <translation id="3492207499832628349">Nouvel onglet nav. privée</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /> sur le contenu suggéré</translation> <translation id="3518985090088779359">Accepter et continuer</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Contrôler les paramètres de synchronisation et de personnalisation, et bien plus</translation> <translation id="4432792777822557199">Les pages en <ph name="SOURCE_LANGUAGE" /> seront désormais traduites en <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pop-ups et redirections</translation> -<translation id="4445444302979002552">Utiliser des services de prédiction pour suggérer des termes de recherche et des sites Web</translation> <translation id="4452411734226507615">Fermer l'onglet <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Ajouté aux favoris dans "<ph name="FOLDER_NAME" />"</translation> <translation id="4453340223357552416">Le fichier <ph name="FILE_NAME" /> a bien été téléchargé dans <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Un problème est survenu lors de l'impression de la page. Veuillez réessayer.</translation> <translation id="6295158916970320988">Tous les sites</translation> <translation id="629730747756840877">Compte</translation> +<translation id="6303969859164067831">Se déconnecter et désactiver la synchronisation</translation> <translation id="6320088164292336938">Vibreur</translation> <translation id="6324034347079777476">La synchronisation du système Android est désactivée.</translation> <translation id="6333140779060797560">Partager via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Impossible d'obtenir des suggestions</translation> <translation id="7562080006725997899">Effacement des données de navigation en cours</translation> <translation id="756809126120519699">Données de Chrome effacées</translation> +<translation id="757524316907819857">Empêcher les sites de lire les contenus protégés</translation> <translation id="7589445247086920869">Bloquer l'accès pour le moteur de recherche actuel</translation> <translation id="7593557518625677601">Ouvrez paramètres Android et réactivez synchro système Android pour démarrer synchro Chrome.</translation> <translation id="7596558890252710462">Système d'exploitation</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Envoie automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation> <translation id="8993760627012879038">Ouvrir un nouvel onglet en mode navigation privée</translation> <translation id="8998729206196772491">Vous vous connectez avec un compte géré par <ph name="MANAGED_DOMAIN" />, ce qui permettra à son administrateur de contrôler vos données Chrome. Celles-ci seront définitivement associées à ce compte. Si vous vous déconnectez de Chrome, vos données seront supprimées de cet appareil, mais elles seront conservées dans votre compte Google.</translation> -<translation id="9018881455348618200">Bouton de recherche</translation> <translation id="9019902583201351841">Géré par tes parents</translation> <translation id="9040142327097499898">Les notifications sont autorisées. La localisation est désactivée pour cet appareil.</translation> <translation id="9050666287014529139">Phrase secrète</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index e946900..807a2ca 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">इवेंट बनाएं</translation> <translation id="2902702728133930130">अनपेक्षित गड़बड़ी के साथ स्टार्टअप के दौरान Chrome विफल रहा.</translation> <translation id="290376772003165898">क्या पेज <ph name="LANGUAGE" /> भाषा में नहीं है?</translation> +<translation id="2910701580606108292">साइटों को सुरक्षित सामग्री चलाने की अनुमति देने से पहले पूछें</translation> <translation id="2913331724188855103">साइटों को कुकी डेटा सहेजने और पढ़ने दें (अनुशंसित)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> मेमोरी</translation> <translation id="2943166482989655199">Google को सिस्टम और इस्तेमाल का डेटा भेजकर Chrome और उसकी सुरक्षा को बेहतर बनाएं</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">वर्तमान पेज फिर से लोड करें</translation> <translation id="3452612588551937789">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने के लिए अपने Google खाते से प्रवेश करें.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d फ़ाइल डाउनलोड हो गई}one{%1$d फ़ाइलें डाउनलोड हो गईं}other{%1$d फ़ाइलें डाउनलोड हो गईं}}</translation> -<translation id="3487093336331957349">खोज और साइट सुझाव</translation> <translation id="3492207499832628349">नया गुप्त टैब</translation> <translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> <translation id="3518985090088779359">स्वीकार करें और जारी रखें</translation> @@ -326,7 +326,7 @@ <translation id="360207483134687714">Chrome में VR अनुभव को बेहतर बनाने में सहायता करें</translation> <translation id="3616113530831147358">ऑडियो</translation> <translation id="3620176948598597475">रीसेट करने से आपकी देखी गई साइटों की सूची के साथ, डेटा बचाने के साधन का इतिहास हमेशा के लिए मिट जाता है.</translation> -<translation id="3630011985153972676">सेटिंग में जाकर जब ’वाई-फ़ाई’ पर हों तब Chrome को अपने लिए लेख डाउनलोड करने की अनुमति दें.</translation> +<translation id="3630011985153972676">सेटिंग में जाकर जब वाई-फ़ाई पर हों तब Chrome को अपने लिए लेख डाउनलोड करने की अनुमति दें.</translation> <translation id="3632295766818638029">पासवर्ड दिखाएं</translation> <translation id="363596933471559332">संग्रहित क्रेडेंशियल का उपयोग करके वेबसाइटों में अपने आप साइन इन करें. सुविधा के बंद होने पर, किसी वेबसाइट में साइन इन करने से पहले आपसे हर बार सत्यापन के लिए कहा जाएगा.</translation> <translation id="3661699943263275414">तृतीय-पक्ष वेबसाइटें कुकी डेटा को सहेज सकती हैं और पढ़ सकती हैं</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">'सिंक करें', 'मनमुताबिक बनाएं' वगैरह नियंत्रित करें</translation> <translation id="4432792777822557199">अब से <ph name="SOURCE_LANGUAGE" /> भाषा के पेज का अनुवाद <ph name="TARGET_LANGUAGE" /> भाषा में किया जाएगा</translation> <translation id="4434045419905280838">पॉप-अप और रीडायरेक्ट</translation> -<translation id="4445444302979002552">खोज शब्द और वेबसाइट का सुझाव देने के लिए पूर्वानुमान सेवाओं का उपयोग करें</translation> <translation id="4452411734226507615"><ph name="TAB_TITLE" /> टैब बंद करें</translation> <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> में बुकमार्क किया गया</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> को <ph name="PRODUCT_NAME" /> में डाउनलोड किया गया</translation> @@ -585,7 +584,7 @@ <translation id="5655963694829536461">अपने डाउनलोड खोजें</translation> <translation id="5659593005791499971">ईमेल</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> में इवेंट बनाएं</translation> -<translation id="5668404140385795438">किसी वेबसाइट का ज़ूम इन करने का अनुरोध ओवरराइड करें</translation> +<translation id="5668404140385795438">ज़ूम इन करने से रोकने के लिए वेबसाइट के अनुरोध को बदलें</translation> <translation id="5676636989614905379"><ph name="SCREEN_NAME" /> पर वीडियो नहीं चलाया जा सकता.</translation> <translation id="5677928146339483299">अवरोधित</translation> <translation id="5684874026226664614">ओह. इस पेज का अनुवाद नहीं किया जा सका.</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">पेज को प्रिंट करने में समस्या थी. कृपया फिर से प्रयास करें.</translation> <translation id="6295158916970320988">सभी साइटें</translation> <translation id="629730747756840877">खाता</translation> +<translation id="6303969859164067831">साइन आउट करें और सिंक बंद करें</translation> <translation id="6320088164292336938">कंपन</translation> <translation id="6324034347079777476">Android सिस्टम समन्वयन अक्षम है</translation> <translation id="6333140779060797560"><ph name="APPLICATION" /> के द्वारा शेयर करें</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">सुझाव नहीं मिल पा रहे हैं</translation> <translation id="7562080006725997899">ब्राउज़िंग डेटा साफ़ हो रहा है</translation> <translation id="756809126120519699">साफ़ किया गया Chrome डेटा</translation> +<translation id="757524316907819857">साइटों को सुरक्षित सामग्री चलाने से रोकें</translation> <translation id="7589445247086920869">वर्तमान खोज इंजन के लिए अवरुद्ध करें</translation> <translation id="7593557518625677601">Android सेटिंग खोलें व Chrome सिंक शुरू करने हेतु Android सिस्टम समन्वयन फिर से सक्षम करें</translation> <translation id="7596558890252710462">ऑपरेटिंग सिस्टम</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">'इस्तेमाल के आंकड़े' और 'खराबी रिपोर्ट' Google को अपने आप भेजे जाने की अनुमति दें</translation> <translation id="8993760627012879038">गुप्त मोड में नया टैब खोलें</translation> <translation id="8998729206196772491">आप <ph name="MANAGED_DOMAIN" /> द्वारा प्रबंधित खाते में प्रवेश कर रहे हैं और उसके व्यवस्थापक को आपके Chrome डेटा पर नियंत्रण दे रहे हैं. आपका डेटा स्थायी रूप से इस खाते से संबद्ध हो जाएगा. Chrome से प्रस्थान करने से आपका डेटा इस डिवाइस से हट जाएगा, लेकिन वह आपके Google खाते में संग्रहित रहेगा.</translation> -<translation id="9018881455348618200">खोजें बटन</translation> <translation id="9019902583201351841">आपके अभिभावकों द्वारा प्रबंधित</translation> <translation id="9040142327097499898">सूचनाओं की अनुमति है. इस डिवाइस के लिए स्थान की जानकारी बंद है.</translation> <translation id="9050666287014529139">पासफ़्रेज़</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index 53c6974..f8aca13 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Stvori događaj</translation> <translation id="2902702728133930130">Chrome se nije pokrenuo zbog neočekivane pogreške.</translation> <translation id="290376772003165898">Ovo nije <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Web-lokacije moraju tražiti dopuštenje za reprodukciju zaštićenog sadržaja</translation> <translation id="2913331724188855103">Dopuštanje web-lokacijama da spremaju i čitaju podatke kolačića (preporučeno)</translation> <translation id="2932150158123903946">Pohrana aplikacije Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Poboljšajte Chrome i njegovu sigurnost slanjem podataka o sustavu i upotrebi Googleu</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Ponovno učitavanje trenutačne stranice</translation> <translation id="3452612588551937789">Prijavite se Google računom da biste pristupali svojim oznakama, zaporkama, povijesti i ostalim postavkama na svim svojim uređajima.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d preuzeta datoteka}one{%1$d preuzeta datoteka}few{%1$d preuzete datoteke}other{%1$d preuzetih datoteka}}</translation> -<translation id="3487093336331957349">Prijedlozi pretraživanja i web-lokacija</translation> <translation id="3492207499832628349">Nova anonimna kartica</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Upravljanje sinkronizacijom, prilagodbom i još mnogo toga</translation> <translation id="4432792777822557199">Odsada će se <ph name="SOURCE_LANGUAGE" /> prevoditi na <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Skočni prozori i preusmjeravanja</translation> -<translation id="4445444302979002552">Upotreba usluga predviđanja za predlaganje pojmova za pretraživanje i web-lokacija</translation> <translation id="4452411734226507615">Zatvori karticu <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Oznaka dodana u mapu <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Datoteka <ph name="FILE_NAME" /> preuzeta u pregledniku <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Pojavio se problem prilikom ispisivanja stranice. Pokušajte ponovo.</translation> <translation id="6295158916970320988">Sve web-lokacije</translation> <translation id="629730747756840877">Račun</translation> +<translation id="6303969859164067831">Odjava i isključivanje sinkronizacije</translation> <translation id="6320088164292336938">Omogući vibraciju</translation> <translation id="6324034347079777476">Sinkronizacija sustava Android onemogućena</translation> <translation id="6333140779060797560">Dijeljenje putem aplikacije <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Prijedlozi se ne mogu dohvatiti</translation> <translation id="7562080006725997899">Brisanje podataka o pregledavanju</translation> <translation id="756809126120519699">Chromeovi su podaci izbrisani</translation> +<translation id="757524316907819857">Web-lokacijama nije dopušteno reproduciranje zaštićenog sadržaja</translation> <translation id="7589445247086920869">Blokiraj za trenutačnu tražilicu</translation> <translation id="7593557518625677601">U postavkama omogućite sink. sustava Android da se pokrene Chrome sinkronizacija</translation> <translation id="7596558890252710462">Operativni sustav</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automatski šalji Googleu statistiku o upotrebi i izvješća o padu programa</translation> <translation id="8993760627012879038">Otvaranje nove kartice u anonimnom načinu</translation> <translation id="8998729206196772491">Prijavljujete se računom kojim upravlja <ph name="MANAGED_DOMAIN" /> i njegovom administratoru dajete kontrolu nad svojim podacima u Chromeu. Vaši će se podaci trajno povezati s tim računom. Ako se odjavite iz Chromea, vaši će se podaci izbrisati s ovog uređaja, no ostat će pohranjeni na vašem Google računu.</translation> -<translation id="9018881455348618200">Gumb za pretraživanje</translation> <translation id="9019902583201351841">Upravljaju tvoji roditelji</translation> <translation id="9040142327097499898">Obavijesti su dopuštene. Lokacija je isključena za ovaj uređaj.</translation> <translation id="9050666287014529139">Zaporka</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 2efc0f3b..177b4d5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Esemény létrehozása</translation> <translation id="2902702728133930130">A Chrome indítása sikertelen volt egy váratlan hiba miatt.</translation> <translation id="290376772003165898">Az oldal nem <ph name="LANGUAGE" /> nyelvű?</translation> +<translation id="2910701580606108292">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára védett tartalmak lejátszását</translation> <translation id="2913331724188855103">Cookie-adatok mentésének és olvasásának engedélyezése a webhelyeken (ajánlott)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" />-tárhely</translation> <translation id="2943166482989655199">Ha elküldi a rendszer- és használati adatokat a Google-nak, hozzájárulhat a Chrome fejlesztéséhez és a szolgáltatás biztonságának javításához</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Az aktuális oldal újratöltése</translation> <translation id="3452612588551937789">Jelentkezzen be Google-fiókjába, hogy könyvjelzőit, előzményeit, jelszavait és más beállításait az összes eszközén elérhesse.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fájl letöltve}other{%1$d fájl letöltve}}</translation> -<translation id="3487093336331957349">Keresési és webhelyjavaslatok</translation> <translation id="3492207499832628349">Új inkognitólap</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /> a javasolt tartalomról</translation> <translation id="3518985090088779359">Elfogadás és tovább</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">A szinkronizálás, személyre szabás és még sok más vezérlése</translation> <translation id="4432792777822557199">A(z) <ph name="SOURCE_LANGUAGE" /> nyelvű oldalak mostantól le lesznek fordítva <ph name="TARGET_LANGUAGE" /> nyelvre</translation> <translation id="4434045419905280838">Előugró ablakok és átirányítások</translation> -<translation id="4445444302979002552">A várható kifejezés szolgáltatások használata keresőkifejezések és webhelyek javasolásához</translation> <translation id="4452411734226507615"><ph name="TAB_TITLE" /> lap bezárása</translation> <translation id="4452548195519783679">Könyvjelzők közé téve itt: <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">A(z) <ph name="PRODUCT_NAME" /> letöltötte a következő fájlt: <ph name="FILE_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Hiba történt az oldal nyomtatásakor. Próbálja újra.</translation> <translation id="6295158916970320988">Az összes webhely</translation> <translation id="629730747756840877">Fiók</translation> +<translation id="6303969859164067831">Kijelentkezés, és a szinkronizálás kikapcsolása</translation> <translation id="6320088164292336938">Rezgés</translation> <translation id="6324034347079777476">Az Android rendszer szinkronizálása letiltva</translation> <translation id="6333140779060797560">Megosztás a következőn keresztül: <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Nem sikerült lekérni a javaslatokat</translation> <translation id="7562080006725997899">Böngészési adatok törlése</translation> <translation id="756809126120519699">Chrome-adatok törölve</translation> +<translation id="757524316907819857">Védett tartalom lejátszásának letiltása a webhelyeken</translation> <translation id="7589445247086920869">Tiltja a jelenlegi keresőmotor számára</translation> <translation id="7593557518625677601">Aktiválja újra az Android rendszer szinkronizálását a Chrome-szinkronizáláshoz</translation> <translation id="7596558890252710462">Operációs rendszer</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Használati statisztikák és hibajelentések automatikus küldése a Google-nak</translation> <translation id="8993760627012879038">Új lap megnyitása inkognitómódban</translation> <translation id="8998729206196772491">Egy <ph name="MANAGED_DOMAIN" /> által felügyelt fiókkal jelentkezik be, és engedélyezi az adminisztrátor számára a Chrome-adatok kezelését. Adatai állandó jelleggel ehhez a fiókhoz lesznek társítva. A Chrome-ból való kijelentkezéssel törli adatait erről az eszközről, de Google-fiókjában továbbra is megmaradnak.</translation> -<translation id="9018881455348618200">Keresés gomb</translation> <translation id="9019902583201351841">Szülők által kezelt</translation> <translation id="9040142327097499898">Az értesítések engedélyezve vannak. A helyhozzáférés ki van kapcsolva az eszköznél.</translation> <translation id="9050666287014529139">Összetett jelszó</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 8863bc2..d283cedb1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Buat acara</translation> <translation id="2902702728133930130">Chrome gagal memulai karena ada kesalahan yang tidak terduga.</translation> <translation id="290376772003165898">Halaman tidak dalam bahasa <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Tanyakan sebelum mengizinkan situs untuk memutar konten yang dilindungi</translation> <translation id="2913331724188855103">Izinkan situs untuk menyimpan dan membaca data cookie (disarankan)</translation> <translation id="2932150158123903946">Penyimpanan Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Sempurnakan Chrome dan keamanannya dengan mengirimkan data penggunaan dan sistem ke Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Memuat ulang halaman saat ini</translation> <translation id="3452612588551937789">Masuk dengan Akun Google untuk mendapatkan bookmark, sandi, histori, dan setelan lainnya di semua perangkat Anda.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d file didownload}other{%1$d file didownload}}</translation> -<translation id="3487093336331957349">Saran situs dan penelusuran</translation> <translation id="3492207499832628349">Tab penyamaran baru</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /> konten yang disarankan</translation> <translation id="3518985090088779359">Terima & lanjutkan</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Mengontrol sinkronisasi, personalisasi, dan lainnya</translation> <translation id="4432792777822557199">Mulai sekarang, halaman dalam bahasa <ph name="SOURCE_LANGUAGE" /> akan diterjemahkan ke <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pop-up dan pengalihan</translation> -<translation id="4445444302979002552">Menggunakan layanan prediksi untuk menyarankan situs dan istilah penelusuran</translation> <translation id="4452411734226507615">Tutup tab <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Dibookmark ke <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> didownload di <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Terjadi masalah saat mencetak halaman. Coba lagi.</translation> <translation id="6295158916970320988">Semua situs</translation> <translation id="629730747756840877">Akun</translation> +<translation id="6303969859164067831">Logout dan nonaktifkan sinkronisasi</translation> <translation id="6320088164292336938">Getar</translation> <translation id="6324034347079777476">Sinkronisasi sistem Android dinonaktifkan</translation> <translation id="6333140779060797560">Bagikan dengan <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Tidak bisa mendapatkan saran</translation> <translation id="7562080006725997899">Menghapus data penjelajahan</translation> <translation id="756809126120519699">Data Chrome telah dihapus</translation> +<translation id="757524316907819857">Blokir situs agar tidak memutar konten yang dilindungi</translation> <translation id="7589445247086920869">Memblokir mesin telusur saat ini</translation> <translation id="7593557518625677601">Buka setelan Android dan aktifkan kembali sinkronisasi sistem Android untuk memulai Sinkronisasi Chrome</translation> <translation id="7596558890252710462">Sistem operasi</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Kirim statistik penggunaan dan laporan kerusakan ke Google secara otomatis</translation> <translation id="8993760627012879038">Membuka tab baru dalam Mode penyamaran</translation> <translation id="8998729206196772491">Anda akan masuk dengan akun yang dikelola oleh <ph name="MANAGED_DOMAIN" /> dan memberikan kontrol data Chrome kepada administrator. Data akan terikat dengan akun ini secara permanen. Bila Anda keluar dari Chrome, data akan dihapus dari perangkat ini, namun data tetap tersimpan di Akun Google.</translation> -<translation id="9018881455348618200">Tombol telusuri</translation> <translation id="9019902583201351841">Dikelola oleh orang tua Anda</translation> <translation id="9040142327097499898">Notifikasi diizinkan. Lokasi dinonaktifkan untuk perangkat ini.</translation> <translation id="9050666287014529139">Frasa sandi</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index 22844a4..c274d92 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Crea evento</translation> <translation id="2902702728133930130">Impossibile avviare Chrome a causa di un errore imprevisto.</translation> <translation id="290376772003165898">La pagina non è in <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Chiedi prima di consentire ai siti di riprodurre contenuti protetti</translation> <translation id="2913331724188855103">Consenti ai siti di salvare e leggere i dati dei cookie (opzione consigliata)</translation> <translation id="2932150158123903946">Spazio di archiviazione di Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Migliora Chrome e la sua sicurezza inviando dati di sistema e utilizzo a Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Ricarica la pagina corrente</translation> <translation id="3452612588551937789">Accedi con il tuo account Google per avere preferiti, cronologia, password e altre impostazioni su tutti i tuoi dispositivi.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d file scaricato}other{%1$d file scaricati}}</translation> -<translation id="3487093336331957349">Suggerimenti di termini di ricerca e siti</translation> <translation id="3492207499832628349">Nuova scheda in incognito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /> sui contenuti suggeriti</translation> <translation id="3518985090088779359">Accetta e continua</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Controlla la sincronizzazione, la personalizzazione e non solo</translation> <translation id="4432792777822557199">Le pagine in <ph name="SOURCE_LANGUAGE" /> verranno tradotte in <ph name="TARGET_LANGUAGE" /> d'ora in poi</translation> <translation id="4434045419905280838">Popup e reindirizzamenti</translation> -<translation id="4445444302979002552">Utilizza i servizi di previsione per suggerire termini di ricerca e siti web</translation> <translation id="4452411734226507615">Chiudi la scheda <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Preferito aggiunto in: <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> scaricato in <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Si è verificato un problema durante la stampa della pagina. Riprova.</translation> <translation id="6295158916970320988">Tutti i siti</translation> <translation id="629730747756840877">Account</translation> +<translation id="6303969859164067831">Esci e disattiva la sincronizzazione</translation> <translation id="6320088164292336938">Vibrazione</translation> <translation id="6324034347079777476">Sincronizzazione del sistema Android non attiva</translation> <translation id="6333140779060797560">Condividi tramite <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Impossibile ricevere suggerimenti</translation> <translation id="7562080006725997899">Cancellazione dei dati di navigazione in corso</translation> <translation id="756809126120519699">Dati di Chrome cancellati</translation> +<translation id="757524316907819857">Impedisci ai siti di riprodurre contenuti protetti</translation> <translation id="7589445247086920869">Blocca motore di ricerca corrente</translation> <translation id="7593557518625677601">Apri le impostazioni di Android e abilita nuovamente la sincronizzazione del sistema Android per poter avviare la Sicronizzazione Chrome</translation> <translation id="7596558890252710462">Sistema operativo</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Invia automaticamente a Google statistiche sull'utilizzo e rapporti sugli arresti anomali</translation> <translation id="8993760627012879038">Apri nuova scheda in mod. di navigaz. in incognito</translation> <translation id="8998729206196772491">Stai per eseguire l'accesso con un account gestito da <ph name="MANAGED_DOMAIN" /> e consentire al relativo amministratore di avere il controllo dei tuoi dati di Chrome. I tuoi dati verranno associati definitivamente a questo account. Se esci da Chrome, i dati verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo account Google.</translation> -<translation id="9018881455348618200">Pulsante Cerca</translation> <translation id="9019902583201351841">Gestito dai genitori</translation> <translation id="9040142327097499898">Le notifiche sono consentite. La geolocalizzazione non è attiva per questo dispositivo.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index c825f08..1f49d04 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">צור אירוע</translation> <translation id="2902702728133930130">שגיאה בלתי צפויה גרמה לכשל של Chrome בעת ההפעלה.</translation> <translation id="290376772003165898">הדף לא ב<ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">הצגת שאלה לפני מתן הרשאה לאתרים להפעיל תוכן מוגן</translation> <translation id="2913331724188855103">התר לאתרים לשמור ולקרוא נתונים של קובצי Cookie (מומלץ)</translation> <translation id="2932150158123903946">נפח אחסון של <ph name="APP_NAME" /> Google</translation> <translation id="2943166482989655199">שליחה של פרטי המערכת ונתוני שימוש אל Google תשפר את Chrome ואת האבטחה שלו</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">טען מחדש את הדף הנוכחי</translation> <translation id="3452612588551937789">היכנס באמצעות חשבון Google כדי לקבל גישה אל הסימניות, הסיסמאות, ההיסטוריה והגדרות נוספות בכל המכשירים שלך.</translation> <translation id="3485359633434254965">{FILES,plural, =1{הושלמה ההורדה של קובץ %1$d}two{הושלמה ההורדה של %1$d קבצים}many{הושלמה ההורדה של %1$d קבצים}other{הושלמה ההורדה של %1$d קבצים}}</translation> -<translation id="3487093336331957349">הצעות למונחי חיפוש ולאתרים</translation> <translation id="3492207499832628349">כרטיסייה חדשה לגלישה בסתר</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /> על הצעות לתוכן</translation> <translation id="3518985090088779359">קבל והמשך</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">שליטה בסינכרון, התאמה אישית ועוד</translation> <translation id="4432792777822557199">דפים ב<ph name="SOURCE_LANGUAGE" /> יתורגמו ל<ph name="TARGET_LANGUAGE" /> מעכשיו והלאה</translation> <translation id="4434045419905280838">חלונות קופצים והפניות אוטומטיות</translation> -<translation id="4445444302979002552">בעזרת שירותי חיזוי ניתן להציג הצעות למונחי חיפוש ולאתרים</translation> <translation id="4452411734226507615">סגירת הכרטיסייה <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">התווסף לסימניות ב-<ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">הורדה של <ph name="FILE_NAME" /> בוצעה ב-<ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">אירעה בעיה בעת הדפסת הדף. נסה שוב.</translation> <translation id="6295158916970320988">כל האתרים</translation> <translation id="629730747756840877">חשבון</translation> +<translation id="6303969859164067831">יציאה וכיבוי הסנכרון</translation> <translation id="6320088164292336938">רטט</translation> <translation id="6324034347079777476">סנכרון מערכת Android מושבת</translation> <translation id="6333140779060797560">שתף באמצעות <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">לא ניתן לקבל הצעות</translation> <translation id="7562080006725997899">מנקה נתוני גלישה</translation> <translation id="756809126120519699">נתוני Chrome נוקו</translation> +<translation id="757524316907819857">חסימה של הפעלת תוכן מוגן על-ידי אתרים</translation> <translation id="7589445247086920869">חסום למנוע החיפוש הנוכחי</translation> <translation id="7593557518625677601">פתח את הגדרות Android והפעל מחדש את הסנכרון של מערכת Android כדי להתחיל בסנכרון של Chrome</translation> <translation id="7596558890252710462">מערכת הפעלה</translation> @@ -999,7 +1000,6 @@ <translation id="8986494364107987395">שלח ל-Google דוחות קריסה וסטטיסטיקת שימוש באופן אוטומטי</translation> <translation id="8993760627012879038">פתח חלון חדש במצב גלישה בסתר</translation> <translation id="8998729206196772491">אתה נכנס עם חשבון המנוהל על-ידי <ph name="MANAGED_DOMAIN" /> ומעניק למנהל שלו שליטה על הנתונים שלך ב-Chrome. הנתונים שלך ישויכו לצמיתות אל החשבון הזה. יציאה מ-Chrome תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו בחשבון Google.</translation> -<translation id="9018881455348618200">לחצן חיפוש</translation> <translation id="9019902583201351841">מנוהל על-ידי ההורים שלך</translation> <translation id="9040142327097499898">יש הרשאה להצגת הודעות. המיקום כבוי בשביל המכשיר הזה.</translation> <translation id="9050666287014529139">משפט-סיסמה</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index a74f9e17..823f849 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">予定を作成</translation> <translation id="2902702728133930130">Chrome の起動時に予期しないエラーが発生し、起動できませんでした。</translation> <translation id="290376772003165898"><ph name="LANGUAGE" />のページではない場合:</translation> +<translation id="2910701580606108292">保護されたコンテンツの再生をサイトに許可する前に確認します</translation> <translation id="2913331724188855103">サイトに Cookie データの保存と読み取りを許可する(推奨)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> ストレージ</translation> <translation id="2943166482989655199">システムと使用状況に関するデータが Google に送信され、Chrome とそのセキュリティの向上に役立てられます</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">現在のページを再読み込みする</translation> <translation id="3452612588551937789">Google アカウントでログインすると、どの端末からでも同じブックマーク、履歴、パスワードなどの設定を利用できるようになります。</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d 個のファイルがダウンロードされました}other{%1$d 個のファイルがダウンロードされました}}</translation> -<translation id="3487093336331957349">検索とサイトの候補を表示</translation> <translation id="3492207499832628349">新しいシークレット タブ</translation> <translation id="3493531032208478708">詳しくは、<ph name="BEGIN_LINK" />おすすめのコンテンツ<ph name="END_LINK" />についての説明をご覧ください</translation> <translation id="3518985090088779359">同意して続行</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">同期、カスタマイズ、その他の管理</translation> <translation id="4432792777822557199">今後、<ph name="SOURCE_LANGUAGE" />のページは<ph name="TARGET_LANGUAGE" />に翻訳されます</translation> <translation id="4434045419905280838">ポップアップとリダイレクト</translation> -<translation id="4445444302979002552">予測サービスを使用して検索キーワードやウェブサイトの候補を表示します</translation> <translation id="4452411734226507615">「<ph name="TAB_TITLE" />」タブを閉じます</translation> <translation id="4452548195519783679">「<ph name="FOLDER_NAME" />」にブックマークしました</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> を <ph name="PRODUCT_NAME" /> でダウンロードしました</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">ページの印刷中に問題が発生しました。もう一度お試しください。</translation> <translation id="6295158916970320988">すべてのサイト</translation> <translation id="629730747756840877">アカウント</translation> +<translation id="6303969859164067831">ログアウトして同期をオフにする</translation> <translation id="6320088164292336938">バイブレーション</translation> <translation id="6324034347079777476">Android システムの同期が無効です</translation> <translation id="6333140779060797560"><ph name="APPLICATION" /> で共有します</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">候補を取得できません</translation> <translation id="7562080006725997899">閲覧データの消去</translation> <translation id="756809126120519699">Chrome データの消去完了</translation> +<translation id="757524316907819857">サイトでの保護されたコンテンツの再生をブロックします</translation> <translation id="7589445247086920869">現在の検索エンジンをブロックする</translation> <translation id="7593557518625677601">Chrome の同期を開始するには、Android の設定で Android システムの同期を再度有効にします</translation> <translation id="7596558890252710462">オペレーティング システム</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">使用統計データと障害レポートを Google に自動送信します</translation> <translation id="8993760627012879038">新しいタブをシークレット モードで開く</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> で管理されているアカウントでログインして、Chrome データの管理を管理者に委ねようとしています。この操作を行うと、データはこのアカウントに恒久的に関連付けられます。Chrome からログアウトすると、データはこの端末から削除されますが、Google アカウントには残ります。</translation> -<translation id="9018881455348618200">検索ボタン</translation> <translation id="9019902583201351841">保護者により管理されています</translation> <translation id="9040142327097499898">通知が許可されていますが、位置情報が端末でオフになっています。</translation> <translation id="9050666287014529139">パスフレーズ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 0f894174..7d38a96 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">일정 만들기</translation> <translation id="2902702728133930130">예기치 않은 오류로 인해 Chrome을 시작하지 못했습니다.</translation> <translation id="290376772003165898">페이지가 <ph name="LANGUAGE" />로 되어 있지 않습니까?</translation> +<translation id="2910701580606108292">사이트에서 보호된 콘텐츠를 재생하도록 허용하기 전에 확인</translation> <translation id="2913331724188855103">사이트에서 쿠키 데이터를 저장하고 읽도록 허용(권장)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> 저장공간</translation> <translation id="2943166482989655199">시스템 정보와 사용 데이터를 Google에 전송하여 Chrome 및 보안을 개선합니다.</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">현재 페이지 새로고침</translation> <translation id="3452612588551937789">Google 계정으로 로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호 및 기타 설정을 사용할 수 있습니다.</translation> <translation id="3485359633434254965">{FILES,plural, =1{파일 %1$d개 다운로드됨}other{파일 %1$d개 다운로드됨}}</translation> -<translation id="3487093336331957349">검색 및 사이트 제안</translation> <translation id="3492207499832628349">새 시크릿 탭</translation> <translation id="3493531032208478708">추천 콘텐츠에 대해 <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="3518985090088779359">동의하고 계속</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">동기화, 맞춤설정 등 관리</translation> <translation id="4432792777822557199">지금부터 <ph name="SOURCE_LANGUAGE" />로 된 페이지가 <ph name="TARGET_LANGUAGE" />로 번역됩니다.</translation> <translation id="4434045419905280838">팝업 및 리디렉션</translation> -<translation id="4445444302979002552">예상 검색어 서비스를 사용하여 검색어 및 웹사이트를 제안합니다.</translation> <translation id="4452411734226507615"><ph name="TAB_TITLE" /> 탭 닫기</translation> <translation id="4452548195519783679">북마크를 <ph name="FOLDER_NAME" />에 추가함</translation> <translation id="4453340223357552416"><ph name="PRODUCT_NAME" />에 <ph name="FILE_NAME" /> 파일을 다운로드함</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">페이지를 인쇄하는 중에 문제가 발생했습니다. 다시 시도해 주세요.</translation> <translation id="6295158916970320988">모든 사이트</translation> <translation id="629730747756840877">계정</translation> +<translation id="6303969859164067831">로그아웃하고 동기화 사용 중지</translation> <translation id="6320088164292336938">진동</translation> <translation id="6324034347079777476">Android 시스템 동기화 사용 안함</translation> <translation id="6333140779060797560">공유 방법: <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">추천을 받을 수 없음</translation> <translation id="7562080006725997899">인터넷 사용 기록 삭제</translation> <translation id="756809126120519699">Chrome 데이터 삭제됨</translation> +<translation id="757524316907819857">사이트에서 보호된 콘텐츠를 재생하지 못하도록 차단</translation> <translation id="7589445247086920869">현재 검색 엔진에 허용 안함</translation> <translation id="7593557518625677601">Android 설정을 열고 Android 시스템 동기화를 다시 사용 설정하여 Chrome 동기화를 시작합니다.</translation> <translation id="7596558890252710462">운영체제</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">사용 통계 및 비정상 종료 보고서를 Google에 자동으로 보내기</translation> <translation id="8993760627012879038">시크릿 모드로 새 탭 열기</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" />에서 관리하는 계정으로 로그인합니다. 계정 관리자가 내 Chrome 데이터를 관리하게 되며 데이터는 이 계정에 영구적으로 연결됩니다. Chrome에서 로그아웃하면 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation> -<translation id="9018881455348618200">검색 버튼</translation> <translation id="9019902583201351841">부모님이 관리합니다.</translation> <translation id="9040142327097499898">알림이 허용되었습니다. 이 기기에서 위치가 사용 중지되었습니다.</translation> <translation id="9050666287014529139">암호</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index 7ca82f8..b11222e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Sukurti įvykį</translation> <translation id="2902702728133930130">Nepavyko paleisti „Chrome“, nes kilo netikėta klaida.</translation> <translation id="290376772003165898">Puslapis parašytas ne <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Paklausti prieš leidžiant svetainėms leisti saugomą turinį</translation> <translation id="2913331724188855103">Leisti svetainėms išsaugoti ir nuskaityti slapukų duomenis (rekomenduojama)</translation> <translation id="2932150158123903946">„Google <ph name="APP_NAME" />“ saugykla</translation> <translation id="2943166482989655199">Patobulinkite „Chrome“ ir jos saugą siųsdami sistemos bei naudojimo duomenis „Google“</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Iš naujo įkelti dabartinį puslapį</translation> <translation id="3452612588551937789">Prisijunkite naudodami „Google“ paskyrą, kad gautumėte žymes, slaptažodžius, istoriją ir kitus nustatymus visuose įrenginiuose.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Atsisiųstas %1$d failas}one{Atsisiųstas %1$d failas}few{Atsisiųsti %1$d failai}many{Atsisiųsta %1$d failo}other{Atsisiųsta %1$d failų}}</translation> -<translation id="3487093336331957349">Paieškos ir svetainės pasiūlymai</translation> <translation id="3492207499832628349">Naujas inkognito skirtukas</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /> apie siūlomą turinį</translation> <translation id="3518985090088779359">Sutikti ir tęsti</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Valdykite sinchronizavimą, suasmeninimą ir dar daugiau</translation> <translation id="4432792777822557199">Puslapiai, parašyti <ph name="SOURCE_LANGUAGE" />, nuo dabar bus verčiami į <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Iššok. langai ir peradresavimai</translation> -<translation id="4445444302979002552">Naudokite numatymo paslaugas, kad būtų siūlomi paieškos terminai ir svetainės</translation> <translation id="4452411734226507615">Uždaryti skirtuką „<ph name="TAB_TITLE" />“</translation> <translation id="4452548195519783679">Sukurta „<ph name="FOLDER_NAME" />“ žymė</translation> <translation id="4453340223357552416">Failas „<ph name="FILE_NAME" />“ atsisiųstas naršyklėje „<ph name="PRODUCT_NAME" />“</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Spausdinant puslapį kilo problema. Bandykite dar kartą.</translation> <translation id="6295158916970320988">Visos svetainės</translation> <translation id="629730747756840877">Paskyra</translation> +<translation id="6303969859164067831">Atsijungti ir išjungti sinchronizavimą</translation> <translation id="6320088164292336938">Vibruoti</translation> <translation id="6324034347079777476">„Android“ sistemos sinchronizavimas išjungtas</translation> <translation id="6333140779060797560">Bendrinti per „<ph name="APPLICATION" />“</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Nepavyksta gauti pasiūlymų</translation> <translation id="7562080006725997899">Naršymo duomenų išvalymas</translation> <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation> +<translation id="757524316907819857">Užblokuoti svetaines, kad neleistų apsaugoto turinio</translation> <translation id="7589445247086920869">Blokuoti dabartiniam paieškos varikliui</translation> <translation id="7593557518625677601">Atid. „Android“ nust. ir iš n. įgal. „Android“ sist., kad prad. „Chrome“ sinchr.</translation> <translation id="7596558890252710462">Operacinė sistema</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automatiškai siųsti naudojimo statistiką ir strigčių ataskaitas „Google“</translation> <translation id="8993760627012879038">Atidaryti naują skirtuką inkognito režimu</translation> <translation id="8998729206196772491">Prisijungiate naudodami „<ph name="MANAGED_DOMAIN" />“ tvarkomą paskyrą ir suteikiate jos administratoriui galimybę valdyti jūsų „Chrome“ duomenis. Duomenys bus visam laikui susieti su šia paskyra. Atsijungę nuo „Chrome“ ištrinsite duomenis iš šio įrenginio, bet jie ir toliau bus saugomi „Google“ paskyroje.</translation> -<translation id="9018881455348618200">Paieškos mygtukas</translation> <translation id="9019902583201351841">Tvarko jūsų tėvai</translation> <translation id="9040142327097499898">Pranešimai leidžiami. Vieta išjungta šiame įrenginyje.</translation> <translation id="9050666287014529139">Slaptafrazė</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index c7d8972..e51b506 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Izveidot pasākumu</translation> <translation id="2902702728133930130">Pārlūka Chrome palaišanas laikā radās neparedzēta kļūda.</translation> <translation id="290376772003165898">Vai lapa nav šajā valodā: <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Jautāt, pirms atļaut vietnēm atskaņot aizsargātu saturu</translation> <translation id="2913331724188855103">Atļaut vietnēm saglabāt un lasīt sīkfailu datus (ieteicams)</translation> <translation id="2932150158123903946">Lietotnes Google <ph name="APP_NAME" /> krātuve</translation> <translation id="2943166482989655199">Uzlabojiet pārlūku Chrome un tā drošību, nosūtot sistēmas un lietojuma datus Google serveriem</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Atkārtoti ielādēt pašreizējo lapu</translation> <translation id="3452612588551937789">Pierakstieties Google kontā, lai izmantotu savas grāmatzīmes, paroles, vēsturi un citus Chrome datus visās jūsu ierīcēs.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Lejupielādēts %1$d fails}zero{Lejupielādēti %1$d faili}one{Lejupielādēts %1$d fails}other{Lejupielādēti %1$d faili}}</translation> -<translation id="3487093336331957349">Meklēšanas un vietņu ieteikumi</translation> <translation id="3492207499832628349">Jauna inkognito cilne</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /> par ieteikto saturu.</translation> <translation id="3518985090088779359">Piekrist un turpināt</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Sinhronizāciju, personalizācijas un citu iespēju pārvaldība</translation> <translation id="4432792777822557199">Turpmāk lapas šādā valodā: <ph name="SOURCE_LANGUAGE" /> tiks tulkotas šādā valodā: <ph name="TARGET_LANGUAGE" />.</translation> <translation id="4434045419905280838">Uznirstošie elem. un novirzīšana</translation> -<translation id="4445444302979002552">Izmantojiet prognožu pakalpojumus, lai saņemtu meklēšanas vienumu un vietņu ieteikumus.</translation> <translation id="4452411734226507615">Aizvērt cilni <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Grāmatzīme saglabāta mapē <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Fails <ph name="FILE_NAME" /> lejupielādēts pārlūkā <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Drukājot lapu, radās problēma. Lūdzu, mēģiniet vēlreiz.</translation> <translation id="6295158916970320988">Visas vietnes</translation> <translation id="629730747756840877">Konts</translation> +<translation id="6303969859164067831">Izrakstīties un izslēgt sinhronizēšanu</translation> <translation id="6320088164292336938">Vibrācija</translation> <translation id="6324034347079777476">Android sistēmas sinhronizācija atspējota</translation> <translation id="6333140779060797560">Kopīgot, izmantojot <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Nevar iegūt ieteikumus.</translation> <translation id="7562080006725997899">Notiek pārlūkošanas datu notīrīšana</translation> <translation id="756809126120519699">Chrome dati tika notīrīti</translation> +<translation id="757524316907819857">Neļaut vietnēm atskaņot aizsargātu saturu</translation> <translation id="7589445247086920869">Aizliegšana pašreizējai meklētājprogrammai</translation> <translation id="7593557518625677601">Lai sāktu Chrome sinhronizēšanu, atveriet Android iestatījumus un atkārtoti iespējojiet Android sistēmas sinhronizēšanu</translation> <translation id="7596558890252710462">Operētājsistēma</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automātiski sūtīt lietošanas statistiku un avāriju pārskatus uzņēmumam Google</translation> <translation id="8993760627012879038">Atvērt jaunu cilni inkognito režīmā</translation> <translation id="8998729206196772491">Jūs pierakstāties kontā, kas tiek pārvaldīts domēnā <ph name="MANAGED_DOMAIN" />, un sniedzat tā administratoram kontroli pār saviem Chrome datiem. Jūsu dati tiks neatgriezeniski saistīti ar šo kontu. Izrakstoties no pārlūka Chrome, jūsu dati tiks dzēsti no šīs ierīces, taču tie tiks saglabāti jūsu Google kontā.</translation> -<translation id="9018881455348618200">Poga Meklēt</translation> <translation id="9019902583201351841">Pārvalda jūsu vecāki</translation> <translation id="9040142327097499898">Paziņojumi ir atļauti. Atrašanās vietas noteikšana šai ierīcei ir izslēgta.</translation> <translation id="9050666287014529139">Ieejas frāze</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 90afb80..13db0cef 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Afspraak maken</translation> <translation id="2902702728133930130">Kan Chrome niet starten door een onverwachte fout.</translation> <translation id="290376772003165898">Pagina is niet in het <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Vragen voordat sites beveiligde content mogen afspelen</translation> <translation id="2913331724188855103">Sites toestaan cookiegegevens op te slaan en te lezen (aanbevolen)</translation> <translation id="2932150158123903946">Opslag van Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Verbeter Chrome en de beveiliging ervan door systeem- en gebruiksgegevens naar Google te verzenden</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">De huidige pagina opnieuw laden</translation> <translation id="3452612588551937789">Log in met je Google-account om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op al je apparaten te gebruiken.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d bestand gedownload}other{%1$d bestanden gedownload}}</translation> -<translation id="3487093336331957349">Zoek- en sitesuggesties</translation> <translation id="3492207499832628349">Nieuw incognitotabblad</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> over voorgestelde content</translation> <translation id="3518985090088779359">Accept. en doorgaan</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Synchronisatie, personalisatie en meer beheren</translation> <translation id="4432792777822557199">Pagina's in het <ph name="SOURCE_LANGUAGE" /> worden vanaf nu vertaald naar het <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pop-ups en omleidingen</translation> -<translation id="4445444302979002552">Voorspellingsservices gebruiken om zoektermen en websites voor te stellen</translation> <translation id="4452411734226507615">Tabblad <ph name="TAB_TITLE" /> sluiten</translation> <translation id="4452548195519783679">Bladwijzer gemaakt in <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> gedownload in <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Er is een fout opgetreden bij het afdrukken van de pagina. Probeer het opnieuw.</translation> <translation id="6295158916970320988">Alle sites</translation> <translation id="629730747756840877">Account</translation> +<translation id="6303969859164067831">Uitloggen en synchronisatie uitschakelen</translation> <translation id="6320088164292336938">Trillen</translation> <translation id="6324034347079777476">Systeemsynchronisatie van Android uitgeschakeld</translation> <translation id="6333140779060797560">Delen via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Kan suggesties niet ophalen</translation> <translation id="7562080006725997899">Browsegegevens wissen</translation> <translation id="756809126120519699">Chrome-gegevens gewist</translation> +<translation id="757524316907819857">Blokkeren dat sites beveiligde content kunnen afspelen</translation> <translation id="7589445247086920869">Blokkeren voor huidige zoekmachine</translation> <translation id="7593557518625677601">Open Android-instellingen en schakel Android-systeemsynchronisatie weer in om Chrome-synchronisatie te starten</translation> <translation id="7596558890252710462">Besturingssysteem</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automatisch gebruiksstatistieken en crashrapporten naar Google verzenden</translation> <translation id="8993760627012879038">Een nieuw venster openen in de incognitomodus</translation> <translation id="8998729206196772491">Je logt in met een account dat wordt beheerd door <ph name="MANAGED_DOMAIN" /> waarmee je de eigenaar beheer geeft over je Chrome-gegevens. Je gegevens worden permanent gekoppeld aan dit account. Als je uitlogt van Chrome, worden je gegevens van dit apparaat verwijderd. Ze blijven echter opgeslagen in je Google-account.</translation> -<translation id="9018881455348618200">Zoekknop</translation> <translation id="9019902583201351841">Beheerd door je ouders</translation> <translation id="9040142327097499898">Meldingen zijn toegestaan. Locatie is uitgeschakeld voor dit apparaat.</translation> <translation id="9050666287014529139">Wachtwoordzin</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index ead3612..98330d6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Opprett hendelse</translation> <translation id="2902702728133930130">Kunne ikke starte Chrome på grunn av en uventet feil.</translation> <translation id="290376772003165898">Er ikke siden på <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Spør før nettsteder kan spille av beskyttet innhold</translation> <translation id="2913331724188855103">Tillat at nettsteder lagrer og leser data i informasjonskapsler (anbefales).</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" />-lagring</translation> <translation id="2943166482989655199">Gjør Chrome bedre og sikrere ved å sende systemdata og bruksdata til Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Last inn den aktive siden på nytt</translation> <translation id="3452612588551937789">Logg på med Google-kontoen din for å få bokmerkene, passordene, loggoppføringene og de andre innstillingene dine på alle enhetene du bruker.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fil nedlastet}other{%1$d filer nedlastet}}</translation> -<translation id="3487093336331957349">Nettsteds- og søkeforslag</translation> <translation id="3492207499832628349">Ny inkognitofane</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /> om foreslått innhold</translation> <translation id="3518985090088779359">Godta og fortsett</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Kontrollér synkronisering, personlig tilpasning med mer</translation> <translation id="4432792777822557199">Fra nå av oversettes sider på <ph name="SOURCE_LANGUAGE" /> til <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Forgrunnsvinduer/viderekoblinger</translation> -<translation id="4445444302979002552">Bruk forslagstjenester for å få forslag til søketermer og nettsteder</translation> <translation id="4452411734226507615">Lukk <ph name="TAB_TITLE" />-fanen</translation> <translation id="4452548195519783679">Satt som bokmerke i <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> er lastet ned i <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Det oppsto et problem med å skrive ut siden. Prøv på nytt.</translation> <translation id="6295158916970320988">Alle nettsteder</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6303969859164067831">Logg av og slå av synkronisering</translation> <translation id="6320088164292336938">Vibrering</translation> <translation id="6324034347079777476">Synkronisering for Android-systemet er slått av</translation> <translation id="6333140779060797560">Del via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Kan ikke hente forslag</translation> <translation id="7562080006725997899">Sletter nettlesingsdata</translation> <translation id="756809126120519699">Chrome-dataene er slettet</translation> +<translation id="757524316907819857">Blokkér nettsteder fra å spille av beskyttet innhold</translation> <translation id="7589445247086920869">Blokkert for den aktive søkemotoren</translation> <translation id="7593557518625677601">Start Chrome-synkronisering ved å slå på synkronisering i Android-innstillingene</translation> <translation id="7596558890252710462">Operativsystem</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Send bruksstatistikk og programstopprapporter automatisk til Google</translation> <translation id="8993760627012879038">Åpne en ny fane i inkognitomodus</translation> <translation id="8998729206196772491">Du logger på med en konto som administreres av <ph name="MANAGED_DOMAIN" />, og du gir administratoren for dette domenet kontroll over Chrome-dataene dine. Dataene dine blir permanent knyttet til denne kontoen. Når du logger av Chrome, slettes dataene dine fra denne enheten, men de fortsetter å være lagret i Google-kontoen din.</translation> -<translation id="9018881455348618200">Søkeknapp</translation> <translation id="9019902583201351841">Administrert av foreldrene dine</translation> <translation id="9040142327097499898">Varsler er tillatt. Posisjon er slått av for denne enheten.</translation> <translation id="9050666287014529139">Passordfrase</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index af580b5..4ed3c65 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Utwórz wydarzenie</translation> <translation id="2902702728133930130">Podczas uruchamiania Chrome wystąpił nieoczekiwany błąd.</translation> <translation id="290376772003165898">Język tej strony to nie <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Pytaj, zanim zezwolisz stronom na odtwarzanie treści chronionej</translation> <translation id="2913331724188855103">Zezwalaj witrynom na zapisywanie danych w plikach cookie i ich odczytywanie (zalecane)</translation> <translation id="2932150158123903946">Dane aplikacji Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Pomóż nam ulepszyć działanie i zwiększyć bezpieczeństwo Chrome, wysyłając informacje o systemie i użytkowaniu do Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Ponownie załaduj bieżącą stronę</translation> <translation id="3452612588551937789">Zaloguj się na konto Google, by korzystać z zakładek, haseł, historii i innych ustawień na wszystkich urządzeniach.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Pobrano %1$d plik}few{Pobrano %1$d pliki}many{Pobrano %1$d plików}other{Pobrano %1$d pliku}}</translation> -<translation id="3487093336331957349">Podpowiadanie stron internetowych i wyszukiwanych słów</translation> <translation id="3492207499832628349">Nowa karta incognito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /> o proponowanej treści</translation> <translation id="3518985090088779359">Akceptuj i kontynuuj</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Konfiguracja synchronizacji, personalizacji i innych opcji</translation> <translation id="4432792777822557199">Od teraz strony, których językiem jest <ph name="SOURCE_LANGUAGE" />, będą tłumaczone na <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pop-upy i przekierowania</translation> -<translation id="4445444302979002552">Używaj usług przewidywania, by podpowiadać strony internetowe i wyszukiwane słowa</translation> <translation id="4452411734226507615">Zamknij kartę <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Utworzono zakładkę w folderze <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Plik <ph name="FILE_NAME" /> został pobrany w: <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Podczas drukowania strony wystąpił problem. Spróbuj ponownie.</translation> <translation id="6295158916970320988">Wszystkie witryny</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6303969859164067831">Wyloguj się i wyłącz synchronizację</translation> <translation id="6320088164292336938">Wibracje</translation> <translation id="6324034347079777476">Synchronizacja systemu Android jest wyłączona</translation> <translation id="6333140779060797560">Udostępnij przez: <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Nie można uzyskać sugestii</translation> <translation id="7562080006725997899">Czyszczenie danych przeglądania</translation> <translation id="756809126120519699">Wyczyszczono dane Chrome</translation> +<translation id="757524316907819857">Blokuj odtwarzanie treści chronionej na stronach</translation> <translation id="7589445247086920869">Blokuj dostęp obecnej wyszukiwarce</translation> <translation id="7593557518625677601">Otwórz ustawienia Androida i ponownie włącz jego synchronizację, by uruchomić Synchronizację Chrome</translation> <translation id="7596558890252710462">System operacyjny</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Automatycznie przesyłaj do Google statystyki użytkowania i raporty o awariach</translation> <translation id="8993760627012879038">Otwórz nową kartę w trybie incognito</translation> <translation id="8998729206196772491">Logujesz się na konto, którym zarządza <ph name="MANAGED_DOMAIN" />, i przekazujesz jego administratorowi kontrolę nad Twoimi danymi Chrome. Zostaną one trwale przypisane do tego konta. Gdy się wylogujesz, znikną one z tego urządzenia, ale pozostaną zapisane na Twoim koncie Google.</translation> -<translation id="9018881455348618200">Przycisk wyszukiwania</translation> <translation id="9019902583201351841">Zarządzany przez Twoich rodziców</translation> <translation id="9040142327097499898">Powiadomienia są włączone. Lokalizacja jest wyłączona na tym urządzeniu.</translation> <translation id="9050666287014529139">Hasło</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 0c50844..58e969b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Criar evento</translation> <translation id="2902702728133930130">O Chrome falhou durante a inicialização devido a um erro inesperado.</translation> <translation id="290376772003165898">A página não está em <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Perguntar antes de permitir que sites reproduzam conteúdo protegido</translation> <translation id="2913331724188855103">Permitir que os sites salvem e leiam os dados de arquivos "cookies" - que armazenam temporariamente o que você visitou na rede. (Recomendado)</translation> <translation id="2932150158123903946">Armazenamento do Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Aprimore o Chrome e a segurança dele enviando dados de uso e do sistema para o Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Atualizar a página atual</translation> <translation id="3452612588551937789">Faça login com sua Conta do Google para ter seus favoritos, histórico, senhas e outras configurações em todos os seus dispositivos.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d arquivo transferido}one{%1$d arquivo transferido}other{%1$d arquivos transferidos}}</translation> -<translation id="3487093336331957349">Sugestões de pesquisa e sites</translation> <translation id="3492207499832628349">Nova guia anônima</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> sobre o conteúdo sugerido</translation> <translation id="3518985090088779359">Aceitar e continuar</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Controle a sincronização, personalização e muito mais</translation> <translation id="4432792777822557199">Páginas em <ph name="SOURCE_LANGUAGE" /> serão traduzidas para <ph name="TARGET_LANGUAGE" /> de agora em diante</translation> <translation id="4434045419905280838">Pop-ups e redirecionamentos</translation> -<translation id="4445444302979002552">Usar os serviços de previsão para sugerir termos de pesquisa e websites</translation> <translation id="4452411734226507615">Fechar guia <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Adicionado como favorito em <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Download do arquivo <ph name="FILE_NAME" /> realizado no <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Ocorreu um problema ao imprimir a página. Tente novamente.</translation> <translation id="6295158916970320988">Todos os sites</translation> <translation id="629730747756840877">Conta</translation> +<translation id="6303969859164067831">Sair e desativar a sincronização</translation> <translation id="6320088164292336938">Vibrar</translation> <translation id="6324034347079777476">Sincronização do sistema Android desativada</translation> <translation id="6333140779060797560">Compartilhar via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Não é possível exibir as sugestões</translation> <translation id="7562080006725997899">Limpando dados de navegação</translation> <translation id="756809126120519699">Dados do Chrome apagados</translation> +<translation id="757524316907819857">Impedir que sites reproduzam conteúdos protegidos</translation> <translation id="7589445247086920869">Bloquear o mecanismo de pesquisa atual</translation> <translation id="7593557518625677601">Abrir configs. Android e reativar sincronização do Android p/ sincronizar Chrome</translation> <translation id="7596558890252710462">Sistema operacional</translation> @@ -1000,7 +1001,6 @@ <translation id="8986494364107987395">Envia estatísticas de uso e relatórios de erros ao Google automaticamente</translation> <translation id="8993760627012879038">Abrir uma nova guia no modo de navegação anônima</translation> <translation id="8998729206196772491">Você está fazendo login com uma conta gerenciada por <ph name="MANAGED_DOMAIN" /> e dando ao administrador dela o controle sobre seus dados do Chrome, os quais ficarão permanentemente vinculados a essa conta. Se você sair do Chrome, seus dados serão excluídos desse dispositivo, mas permanecerão armazenados na sua Conta do Google.</translation> -<translation id="9018881455348618200">Botão Pesquisar</translation> <translation id="9019902583201351841">Gerenciado pelos seus pais</translation> <translation id="9040142327097499898">As notificações são permitidas. A localização está desativada neste dispositivo.</translation> <translation id="9050666287014529139">Senha</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index 4a5428bf..b0c98216 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Criar evento</translation> <translation id="2902702728133930130">O Chrome falhou durante o arranque com um erro inesperado.</translation> <translation id="290376772003165898">A página não está em <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Perguntar antes de permitir que os sites reproduzam conteúdos protegidos</translation> <translation id="2913331724188855103">Permitir que os sites guardem e leiam dados de cookies (recomendado)</translation> <translation id="2932150158123903946">Armazenamento do Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Melhore o Chrome e a respetiva segurança ao enviar dados do sistema e de utilização para a Google.</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Atualizar a página atual</translation> <translation id="3452612588551937789">Inicie sessão com a sua Conta Google para aceder aos marcadores, ao histórico, às palavras-passe e a outras definições em todos os dispositivos.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d ficheiro transferido}other{%1$d ficheiros transferidos}}</translation> -<translation id="3487093336331957349">Sugestões de pesquisa e de sites</translation> <translation id="3492207499832628349">Novo sep. anónimo</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> acerca do conteúdo sugerido</translation> <translation id="3518985090088779359">Aceitar e continuar</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Controlar a sincronização, a personalização e muito mais</translation> <translation id="4432792777822557199">As páginas em <ph name="SOURCE_LANGUAGE" /> serão traduzidas para <ph name="TARGET_LANGUAGE" /> a partir de agora</translation> <translation id="4434045419905280838">Pop-ups e redirecionamentos</translation> -<translation id="4445444302979002552">Utilizar os serviços de previsão para a sugestão de termos de pesquisa e de Sites</translation> <translation id="4452411734226507615">Fechar o separador <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Adicionado aos marcadores em <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> transferido no <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Ocorreu um problema ao imprimir a página. Tente novamente.</translation> <translation id="6295158916970320988">Todos os sites</translation> <translation id="629730747756840877">Conta</translation> +<translation id="6303969859164067831">Terminar sessão e desativar a sincronização</translation> <translation id="6320088164292336938">Vibrar</translation> <translation id="6324034347079777476">Sincronização do sistema Android desativada</translation> <translation id="6333140779060797560">Partilhar através de <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Não é possível obter sugestões</translation> <translation id="7562080006725997899">A limpar dados de navegação</translation> <translation id="756809126120519699">Dados do Chrome limpos</translation> +<translation id="757524316907819857">Impedir que os sites reproduzam conteúdos protegidos</translation> <translation id="7589445247086920869">Bloquear no motor de pesquisa atual</translation> <translation id="7593557518625677601">Abrir definiç. Android e reativar sinc. sistema Android p/ iniciar sinc. Chrome</translation> <translation id="7596558890252710462">Sistema operativo</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Enviar automaticamente estatísticas de utilização e relatórios de falhas para a Google</translation> <translation id="8993760627012879038">Abrir novo separador no modo de navegação anónima</translation> <translation id="8998729206196772491">Está a iniciar sessão com uma conta gerida por <ph name="MANAGED_DOMAIN" /> e a conceder ao respetivo gestor o controlo dos seus dados do Chrome. Os dados ficarão permanentemente associados a esta conta. Terminar sessão no Chrome elimina os seus dados deste dispositivo, embora permaneçam armazenados na Conta Google.</translation> -<translation id="9018881455348618200">Botão de pesquisa</translation> <translation id="9019902583201351841">Gerido pelos teus pais</translation> <translation id="9040142327097499898">As notificações são permitidas. A localização está desativada para este dispositivo.</translation> <translation id="9050666287014529139">Frase de acesso</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index f9d8065..0fbb81b8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Creează un eveniment</translation> <translation id="2902702728133930130">Chrome nu a pornit. A apărut o eroare neașteptată.</translation> <translation id="290376772003165898">Pagina nu este în <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Întreabă înainte de a permite site-urilor să redea conținut protejat</translation> <translation id="2913331724188855103">Permite site-urilor să salveze și să citească datele asociate cookie-urilor (recomandat)</translation> <translation id="2932150158123903946">Stocarea Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Poți îmbunătăți browserul Chrome și securitatea acestuia dacă trimiți la Google date despre sistem și utilizare</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Reîncarcă pagina curentă</translation> <translation id="3452612588551937789">Conectează-te folosind Contul Google pentru a accesa marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fișier descărcat}few{%1$d fișiere descărcate}other{%1$d de fișiere descărcate}}</translation> -<translation id="3487093336331957349">Sugestii de căutare și de site-uri</translation> <translation id="3492207499832628349">Filă incognito nouă</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /> despre conținutul sugerat</translation> <translation id="3518985090088779359">Acceptă și continuă</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Gestionează sincronizarea, personalizarea și altele</translation> <translation id="4432792777822557199">Paginile în <ph name="SOURCE_LANGUAGE" /> vor fi traduse în <ph name="TARGET_LANGUAGE" /> de acum înainte</translation> <translation id="4434045419905280838">Ferestre pop-up și redirecționări</translation> -<translation id="4445444302979002552">Folosește serviciile de predicție pentru sugerarea de termeni de căutare și de site-uri</translation> <translation id="4452411734226507615">Închide fila <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Marcaj adăugat în <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> s-a descărcat în <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">A apărut o problemă la printarea paginii. Încercați din nou.</translation> <translation id="6295158916970320988">Toate site-urile</translation> <translation id="629730747756840877">Cont</translation> +<translation id="6303969859164067831">Deconectează-te și dezactivează sincronizarea</translation> <translation id="6320088164292336938">Vibrații</translation> <translation id="6324034347079777476">Sincronizarea de sistem Android este dezactivată</translation> <translation id="6333140779060797560">Trimiteți prin <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Nu se pot obține sugestii</translation> <translation id="7562080006725997899">Se șterg datele de navigare</translation> <translation id="756809126120519699">Datele Chrome au fost șterse</translation> +<translation id="757524316907819857">Împiedică site-urile să redea conținutul protejat</translation> <translation id="7589445247086920869">Blochează pentru motorul de căutare actual</translation> <translation id="7593557518625677601">Deschide setările Android și reactivează sincronizarea sistemului Android pentru a porni sincronizarea Chrome</translation> <translation id="7596558890252710462">Sistem de operare</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Trimite automat la Google statistici de utilizare și rapoarte de blocare</translation> <translation id="8993760627012879038">Deschide o filă nouă în modul incognito</translation> <translation id="8998729206196772491">Te conectezi cu un cont gestionat de <ph name="MANAGED_DOMAIN" /> și acorzi administratorului acestuia controlul asupra datelor Chrome. Datele vor fi asociate definitiv acestui cont. Dacă te deconectezi de la Chrome, datele se vor șterge de pe acest dispozitiv, dar vor rămâne stocate în Contul Google.</translation> -<translation id="9018881455348618200">Butonul de căutare</translation> <translation id="9019902583201351841">Gestionat de părinții tăi</translation> <translation id="9040142327097499898">Notificările sunt permise. Locația este dezactivată pentru acest dispozitiv.</translation> <translation id="9050666287014529139">Expresie de acces</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 65d2cd7..7c410c7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Создать мероприятие</translation> <translation id="2902702728133930130">При запуске Chrome произошла непредвиденная ошибка.</translation> <translation id="290376772003165898">Язык страницы не <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Запрашивать разрешение на воспроизведение защищенного контента</translation> <translation id="2913331724188855103">Разрешить сайтам сохранять и читать файлы cookie (рекомендуется)</translation> <translation id="2932150158123903946">Хранилище Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Отправляйте системную и диагностическую информацию в Google, чтобы сделать Chrome ещё лучше и безопаснее.</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Обновить страницу</translation> <translation id="3452612588551937789">Войдите в аккаунт Google, чтобы пользоваться закладками, паролями, историей и другими вашими настройками на любом устройстве.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Загружен %1$d файл.}one{Загружен %1$d файл.}few{Загружено %1$d файла.}many{Загружено %1$d файлов.}other{Загружено %1$d файла.}}</translation> -<translation id="3487093336331957349">Подсказки запросов и сайтов</translation> <translation id="3492207499832628349">Новая вкладка инкогнито</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Подробнее<ph name="END_LINK" /> о рекомендованном контенте…</translation> <translation id="3518985090088779359">Продолжить</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Настройки синхронизации, персонализации и других сервисов</translation> <translation id="4432792777822557199">Страницы на этом языке (<ph name="SOURCE_LANGUAGE" />) будут автоматически переводиться на <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Всплывающие окна и переадресация</translation> -<translation id="4445444302979002552">Включить рекомендации поисковых запросов и веб-сайтов.</translation> <translation id="4452411734226507615">Закрыть вкладку "<ph name="TAB_TITLE" />"</translation> <translation id="4452548195519783679">Закладка добавлена в папку "<ph name="FOLDER_NAME" />"</translation> <translation id="4453340223357552416"><ph name="PRODUCT_NAME" />: скачан файл <ph name="FILE_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Не удалось распечатать страницу. Повторите попытку.</translation> <translation id="6295158916970320988">Все сайты</translation> <translation id="629730747756840877">Аккаунт</translation> +<translation id="6303969859164067831">Выйти из аккаунта и отключить синхронизацию</translation> <translation id="6320088164292336938">Вибросигнал</translation> <translation id="6324034347079777476">Синхронизация системы Android отключена</translation> <translation id="6333140779060797560">Отправить с помощью <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Не удалось получить рекомендации</translation> <translation id="7562080006725997899">Очистить историю</translation> <translation id="756809126120519699">Данные Chrome удалены</translation> +<translation id="757524316907819857">Запретить сайтам воспроизводить защищенный контент</translation> <translation id="7589445247086920869">Закрыть доступ текущей поисковой системе</translation> <translation id="7593557518625677601">Откройте настройки Android и снова включите синхронизацию системы</translation> <translation id="7596558890252710462">Операционная система</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Автоматически отправлять в Google статистику использования и отчеты о сбоях</translation> <translation id="8993760627012879038">Открыть новое окно в режиме инкогнито</translation> <translation id="8998729206196772491">Вы входите в аккаунт, которым управляет администратор домена <ph name="MANAGED_DOMAIN" />. Он может контролировать ваши данные Chrome, которые теперь будут связаны с управляемым аккаунтом. При выходе из системы все данные Chrome, хранящиеся на этом устройстве, будут удалены, но останутся в вашем аккаунте Google.</translation> -<translation id="9018881455348618200">Кнопка поиска</translation> <translation id="9019902583201351841">Управляется вашими родителями</translation> <translation id="9040142327097499898">Отправка уведомлений разрешена, но определение местоположения отключено.</translation> <translation id="9050666287014529139">Кодовая фраза</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index e5b9558..9f4bcc5d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Vytvorte udalosť</translation> <translation id="2902702728133930130">Prehliadač Chrome sa nepodarilo spustiť, pretože sa vyskytla neočakávaná chyba</translation> <translation id="290376772003165898">Stránka nie je v jazyku <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Opýtať sa pred udelením povolenia umožňujúceho webom prehrať chránený obsah</translation> <translation id="2913331724188855103">Povoliť stránkam ukladať a čítať údaje súborov cookie (odporučané)</translation> <translation id="2932150158123903946">Úložisko Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Zlepšite Chrome a jeho zabezpečenie odosielaním systémových dát a údajov o využívaní do Googlu</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Opätovné načítanie aktuálnej stránky</translation> <translation id="3452612588551937789">Prihláste sa pomocou účtu Google a získajte záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Bol stiahnutý %1$d súbor}few{Boli stiahnuté %1$d súbory}many{%1$d files downloaded}other{Bolo stiahnutých %1$d súborov}}</translation> -<translation id="3487093336331957349">Návrhy vyhľadávania a webov</translation> <translation id="3492207499832628349">Nová karta inkognito</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /> o návrhoch obsahu</translation> <translation id="3518985090088779359">Prijať a pokračovať</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Ovládanie synchronizácie, prispôsobenia a ďalších funkcií</translation> <translation id="4432792777822557199">Stránky v jazyku <ph name="SOURCE_LANGUAGE" /> budú odteraz prekladané do jazyka <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Kontextové okná a presmerovania</translation> -<translation id="4445444302979002552">Používanie služieb predpovedí na poskytovanie návrhov hľadaných výrazov a webových stránok</translation> <translation id="4452411734226507615">Zavrieť kartu <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Uložené ako záložka v priečinku <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Súbor <ph name="FILE_NAME" /> bol stiahnutý v prehliadači <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Pri tlačení stránky sa vyskytol problém. Skúste to znova.</translation> <translation id="6295158916970320988">Všetky stránky</translation> <translation id="629730747756840877">Účet</translation> +<translation id="6303969859164067831">Odhlásiť sa a vypnúť synchronizáciu</translation> <translation id="6320088164292336938">Vibrovanie</translation> <translation id="6324034347079777476">Synchronizácia systému Android je zakázaná</translation> <translation id="6333140779060797560">Zdieľať prostredníctvom aplikácie <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Návrhy sa nedajú získať</translation> <translation id="7562080006725997899">Vymazávajú sa údaje prehliadania</translation> <translation id="756809126120519699">Údaje Chromu boli vymazané</translation> +<translation id="757524316907819857">Blokuje prehrávanie chráneného obsahu na weboch</translation> <translation id="7589445247086920869">Blokovať pre aktuálny vyhľadávač</translation> <translation id="7593557518625677601">V nastaveniach Androidu spustite synchronizáciu Chromu opätovným povolením synchronizácie Androidu</translation> <translation id="7596558890252710462">Operačný systém</translation> @@ -999,7 +1000,6 @@ <translation id="8986494364107987395">Automaticky odosielať Googlu štatistiky používania a správy o zlyhaní</translation> <translation id="8993760627012879038">Otvorenie novej karty v režime inkognito</translation> <translation id="8998729206196772491">Prihlasujete sa pomocou účtu spravovaného doménou <ph name="MANAGED_DOMAIN" /> a jej správcovi tým dávate kontrolu nad svojimi údajmi Chromu. Vaše údaje budú natrvalo prepojené s týmto účtom. Odhlásením z Chromu odstránite údaje z príslušného zariadenia, avšak naďalej zostanú uložené vo vašom účte Google.</translation> -<translation id="9018881455348618200">Tlačidlo Hľadať</translation> <translation id="9019902583201351841">Spravované vašimi rodičmi</translation> <translation id="9040142327097499898">Upozornenia sú povolené. Poloha je v tomto zariadení vypnutá.</translation> <translation id="9050666287014529139">Prístupová fráza</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 4578998..5cdfe7d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -308,7 +308,6 @@ <translation id="3443221991560634068">Vnovično nalaganje trenutne strani</translation> <translation id="3452612588551937789">Prijavite se z Google Računom, da boste zaznamke, zgodovino, gesla in druge nastavitve imeli na voljo v vseh napravah.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Prenesena je %1$d datoteka}one{Prenesena je %1$d datoteka}two{Preneseni sta %1$d datoteki}few{Prenesene so %1$d datoteke}other{Prenesenih je %1$d datotek}}</translation> -<translation id="3487093336331957349">Predlogi za iskanje in spletna mesta</translation> <translation id="3492207499832628349">Nov zavihek brez beleženja zgodovine</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Preberite več<ph name="END_LINK" /> o predlagani vsebini</translation> <translation id="3518985090088779359">Sprejmi in nadaljuj</translation> @@ -418,7 +417,6 @@ <translation id="4419556793104466535">Nadziranje sinhronizacije, prilagajanja in drugega</translation> <translation id="4432792777822557199">Strani v jeziku <ph name="SOURCE_LANGUAGE" /> bodo od zdaj naprej prevedene v jezik <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Pojavna okna in preusmeritve</translation> -<translation id="4445444302979002552">Uporaba storitev predvidevanja za predlaganje iskalnih poizvedb in spletnih mest</translation> <translation id="4452411734226507615">Zapiranje zavihka <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Zaznamek ustvarjen v mapi <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> – preneseno v izdelku <ph name="PRODUCT_NAME" /></translation> @@ -1004,7 +1002,6 @@ <translation id="8986494364107987395">Samodejno pošlji statistične podatke o uporabi in poročila o zrušitvah Googlu</translation> <translation id="8993760627012879038">Odpiranje novega zavihka brez beleženja zgodovine</translation> <translation id="8998729206196772491">Prijavljate se z računom, ki ga upravlja <ph name="MANAGED_DOMAIN" />, in nadzor nad podatki v Chromu predajate skrbniku. Vaši podatki bodo trajno povezani s tem računom. Če se odjavite iz Chroma, boste izbrisali podatke iz te naprave, vendar bodo še naprej shranjeni v Google Računu.</translation> -<translation id="9018881455348618200">Gumb za iskanje</translation> <translation id="9019902583201351841">Upravljajo starši</translation> <translation id="9040142327097499898">Obvestila so dovoljena. Lokacija je izklopljena za to napravo.</translation> <translation id="9050666287014529139">Geslo</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index a8dc869..fd08b91 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Направите догађај</translation> <translation id="2902702728133930130">Chrome је отказао током покретања због неочекиване грешке.</translation> <translation id="290376772003165898">Ова страница није на језику <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Пита пре него што дозволи сајтовима да пуштају заштићени садржај</translation> <translation id="2913331724188855103">Дозволи сајтовима да чувају и читају податке колачића (препоручује се)</translation> <translation id="2932150158123903946">Меморијски простор за Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Шаљите Google-у податке о систему и коришћењу да бисте побољшали Chrome и његову безбедност</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Поновно учитавање актуелне странице</translation> <translation id="3452612588551937789">Пријавите се на Google налог да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d датотека је преузета}one{%1$d датотека је преузета}few{%1$d датотеке су преузете}other{%1$d датотека је преузето}}</translation> -<translation id="3487093336331957349">Предлози за претрагу и сајтове</translation> <translation id="3492207499832628349">Нова картица без архивирања</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /> о предложеном садржају</translation> <translation id="3518985090088779359">Прихвати и настави</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Контролишите синхронизацију, персонализацију и још много тога</translation> <translation id="4432792777822557199">Странице на језику <ph name="SOURCE_LANGUAGE" /> ће се од сада преводити на <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Искачући прозори и преусмеравања</translation> -<translation id="4445444302979002552">Помоћу услуга предвиђања приказује предлоге за термине за претрагу и веб-сајтове</translation> <translation id="4452411734226507615">Затвори картицу <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Обележивач је додат у <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Датотека <ph name="FILE_NAME" /> је преузета у <ph name="PRODUCT_NAME" />-у</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Дошло је до проблема при штампању странице. Пробајте поново.</translation> <translation id="6295158916970320988">Сви сајтови</translation> <translation id="629730747756840877">Налог</translation> +<translation id="6303969859164067831">Одјави ме и искључи синхронизацију</translation> <translation id="6320088164292336938">Вибрација</translation> <translation id="6324034347079777476">Синхронизација Android система је онемогућена</translation> <translation id="6333140779060797560">Дељење преко <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Не можете да добијете предлоге</translation> <translation id="7562080006725997899">Брисање података прегледања</translation> <translation id="756809126120519699">Chrome подаци су обрисани</translation> +<translation id="757524316907819857">Блокира да сајтови пуштају заштићени садржај</translation> <translation id="7589445247086920869">Блокирај за актуелни претраживач</translation> <translation id="7593557518625677601">Отворите Android подешавања и поново омогућите синхронизацију Android система да бисте започели Chrome синхронизацију</translation> <translation id="7596558890252710462">Оперативни систем</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Аутоматски шаљи Google-у статистичке податке о коришћењу и извештаје о отказивању</translation> <translation id="8993760627012879038">Отварање нове картице у режиму без архивирања</translation> <translation id="8998729206196772491">Пријављујете се помоћу налога којим управља <ph name="MANAGED_DOMAIN" /> и дајете његовом администратору контролу над својим Chrome подацима. Подаци ће постати трајно повезани са тим налогом. Одјављивањем из Chrome-а ћете избрисати податке са овог уређаја, али ће они остати сачувани на Google налогу.</translation> -<translation id="9018881455348618200">Дугме за претрагу</translation> <translation id="9019902583201351841">Овим управљају твоји родитељи</translation> <translation id="9040142327097499898">Обавештења су дозвољена. Локација је искључена за овај уређај.</translation> <translation id="9050666287014529139">Приступна фраза</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index 927431e..37e5a77 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Skapa händelse</translation> <translation id="2902702728133930130">Ett oväntat fel uppstod när Chrome skulle startas.</translation> <translation id="290376772003165898">Är sidan inte på <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Fråga innan webbplatser tillåts att spela upp skyddat innehåll</translation> <translation id="2913331724188855103">Tillåt att webbplatser sparar och läser cookiedata (rekommenderas)</translation> <translation id="2932150158123903946">Lagring för Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Gör Chrome bättre och säkrare genom att skicka information om system och användning till Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Läs in den aktuella sidan igen</translation> <translation id="3452612588551937789">Logga in med ditt Google-konto så att du kan använda bokmärken, lösenord, historik med mera på alla dina enheter.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d fil har laddats ned}other{%1$d filer har laddats ned}}</translation> -<translation id="3487093336331957349">Sök- och webbplatsförslag</translation> <translation id="3492207499832628349">Ny inkognitoflik</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /> om förslag på innehåll</translation> <translation id="3518985090088779359">Godkänn och fortsätt</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Styr synkronisering, anpassning med mera</translation> <translation id="4432792777822557199">Sidor på <ph name="SOURCE_LANGUAGE" /> översätts till <ph name="TARGET_LANGUAGE" /> från och med nu</translation> <translation id="4434045419905280838">Popup-fönster och omdirigeringar</translation> -<translation id="4445444302979002552">Med förslagstjänster får du förslag på söktermer och webbplatser</translation> <translation id="4452411734226507615">Stäng fliken <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Bokmärkt i <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> har laddats ned i <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Det gick inte att skriva ut sidan. Försök igen.</translation> <translation id="6295158916970320988">Alla webbplatser</translation> <translation id="629730747756840877">Konto</translation> +<translation id="6303969859164067831">Logga ut och inaktivera synkronisering</translation> <translation id="6320088164292336938">Vibration</translation> <translation id="6324034347079777476">Synkronisering av Android-system har inaktiverats</translation> <translation id="6333140779060797560">Dela via <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Det går inte att få förslag</translation> <translation id="7562080006725997899">Tar bort webbinformation</translation> <translation id="756809126120519699">Data i Chrome har rensats</translation> +<translation id="757524316907819857">Blockera webbplatser från att spela upp skyddat innehåll</translation> <translation id="7589445247086920869">Blockera för den nuvarande sökmotorn</translation> <translation id="7593557518625677601">Återaktivera synkronisering i Android-inställningarna så börjar Chrome synkas</translation> <translation id="7596558890252710462">Operativsystem</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Skicka användningsstatistik och kraschrapporter till Google automatiskt</translation> <translation id="8993760627012879038">Öppna en ny flik i inkognitoläge</translation> <translation id="8998729206196772491">Du håller på att logga in med ett konto som hanteras av <ph name="MANAGED_DOMAIN" />, vilket ger administratören kontroll över data i Chrome. Din data kopplas permanent till det här kontot. Om du loggar ut från Chrome raderas all din data från enheten, men den lagras fortfarande i Google-kontot.</translation> -<translation id="9018881455348618200">Knappen Sök</translation> <translation id="9019902583201351841">Hanteras av dina föräldrar</translation> <translation id="9040142327097499898">Aviseringar tillåts. Plats har inaktiverats på enheten.</translation> <translation id="9050666287014529139">Lösenfras</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 6f476fe5..9a8220ca 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Ongeza tukio jipya</translation> <translation id="2902702728133930130">Chrome haikufaulu wakati wa kuanza kutokana na hitilafu isiyotarajiwa.</translation> <translation id="290376772003165898">Je, ukurasa huu haupo katika <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Iulize kabla ya kuruhusu tovuti kucheza maudhui yanayolindwa</translation> <translation id="2913331724188855103">Ruhusu tovuti zihifadhi na kusoma data ya vidakuzi (imependekezwa)</translation> <translation id="2932150158123903946">Hifadhi ya Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Boresha Chrome na usalama wake kwa kuitumia Google data ya mfumo na utumiaji</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Pakia upya ukurasa wa sasa</translation> <translation id="3452612588551937789">Ingia kwa kutumia Akaunti yako ya Google ili upate alamisho, historia, manenosiri na mipangilio mingine kwenye vifaa vyako vyote.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Imepakua faili %1$d}other{Imepakua faili %1$d}}</translation> -<translation id="3487093336331957349">Mapendekezo ya utafutaji na tovuti</translation> <translation id="3492207499832628349">Kichupo fiche kipya</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /> kuhusu maudhui yaliyopendekezwa</translation> <translation id="3518985090088779359">Kubali na uendelee</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Dhibiti usawazishaji, mapendeleo na nyinginezo</translation> <translation id="4432792777822557199">Kurasa za <ph name="SOURCE_LANGUAGE" /> zitatafsiriwa katika <ph name="TARGET_LANGUAGE" /> kuanzia sasa</translation> <translation id="4434045419905280838">Madirisha ibukizi/kuelekeza kwingine</translation> -<translation id="4445444302979002552">Tumia huduma za kutabiri ili upendekeze hoja za utafutaji na tovuti</translation> <translation id="4452411734226507615">Funga kichupo cha <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Imetia alamishwa kwenye <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> imepakuliwa katika <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Kulikuwa na tatizo katika kuchapisha ukurasa. Tafadhali jaribu tena.</translation> <translation id="6295158916970320988">Tovuti zote</translation> <translation id="629730747756840877">Akaunti</translation> +<translation id="6303969859164067831">Ondoka kwenye akaunti na uzime usawazishaji</translation> <translation id="6320088164292336938">Tetema</translation> <translation id="6324034347079777476">Kipengele cha usawazishaji wa mfumo wa Android kimezimwa</translation> <translation id="6333140779060797560">Shiriki kupitia <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Imeshindwa kupata mapendekezo</translation> <translation id="7562080006725997899">Inafuta data ya kuvinjari</translation> <translation id="756809126120519699">Data ya Chrome imefutwa</translation> +<translation id="757524316907819857">Zuia tovuti zisicheze maudhui yanayolindwa</translation> <translation id="7589445247086920869">Zuia kwa mtambo wa sasa wa kutafuta</translation> <translation id="7593557518625677601">Fungua mipangilio ya Android na uwashe upya usawazishaji wa mfumo wa Android ili uanze usawazishaji wa Chrome</translation> <translation id="7596558890252710462">Mfumo wa uendeshaji</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Tumia Google takwimu za matumizi na ripoti za mara ambazo kivinjari kinaacha kufanya kazi, moja kwa moja</translation> <translation id="8993760627012879038">Fungua kichupo kipya katika Hali fiche</translation> <translation id="8998729206196772491">Unaingia kwa kutumia akaunti inayodhibitiwa na <ph name="MANAGED_DOMAIN" /> na kumpa msimamizi wa kikoa hicho udhibiti wa data yako ya Chrome. Data yako ya Chrome itahusishwa na akaunti hii daima. Kuondoka kwenye Chrome kutafuta data yako kwenye kifaa hiki, lakini itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation> -<translation id="9018881455348618200">Kitufe cha kutafuta</translation> <translation id="9019902583201351841">Inadhibitiwa na wazazi wako</translation> <translation id="9040142327097499898">Arifa zinaruhusiwa. Kipengele cha mahali kimezimwa kwenye kifaa hiki.</translation> <translation id="9050666287014529139">Kaulisiri</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 9931f76..f7d7c79 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">สร้างกิจกรรม</translation> <translation id="2902702728133930130">Chrome ล้มเหลวในระหว่างเริ่มต้นเนื่องจากข้อผิดพลาดที่ไม่คาดคิด</translation> <translation id="290376772003165898">หน้านี้ไม่ใช่ภาษา<ph name="LANGUAGE" />ใช่ไหม</translation> +<translation id="2910701580606108292">ถามก่อนอนุญาตให้เว็บไซต์เล่นเนื้อหาที่มีการคุ้มครอง</translation> <translation id="2913331724188855103">อนุญาตให้ไซต์บันทึกและอ่านข้อมูลคุกกี้ (แนะนำ)</translation> <translation id="2932150158123903946">พื้นที่เก็บข้อมูล Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">ปรับปรุง Chrome และความปลอดภัยด้วยการส่งข้อมูลระบบและการใช้งานไปยัง Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">โหลดหน้าปัจจุบันอีกครั้ง</translation> <translation id="3452612588551937789">ลงชื่อเข้าใช้บัญชี Google เพื่อรับบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation> <translation id="3485359633434254965">{FILES,plural, =1{ดาวน์โหลดแล้ว %1$d ไฟล์}other{ดาวน์โหลดแล้ว %1$d ไฟล์}}</translation> -<translation id="3487093336331957349">คำแนะนำการค้นหาและเว็บไซต์</translation> <translation id="3492207499832628349">แท็บใหม่ที่ไม่ระบุตัวตน</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" />เกี่ยวกับเนื้อหาที่แนะนำ</translation> <translation id="3518985090088779359">ยอมรับและทำต่อ</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">ควบคุมการซิงค์ การปรับเปลี่ยนในแบบของคุณ และอื่นๆ</translation> <translation id="4432792777822557199">จากนี้ไประบบจะแปลหน้าภาษา<ph name="SOURCE_LANGUAGE" />เป็นภาษา<ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">ป๊อปอัปและการเปลี่ยนเส้นทาง</translation> -<translation id="4445444302979002552">ใช้บริการการคาดคะเนเพื่อแนะนำข้อความค้นหาและเว็บไซต์</translation> <translation id="4452411734226507615">ปิดแท็บ <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">เพิ่มบุ๊กมาร์กไปยัง <ph name="FOLDER_NAME" /> แล้ว</translation> <translation id="4453340223357552416">ดาวน์โหลด <ph name="FILE_NAME" /> ไว้ใน <ph name="PRODUCT_NAME" /> แล้ว</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">เกิดปัญหาในการพิมพ์หน้านี้ โปรดลองอีกครั้ง</translation> <translation id="6295158916970320988">ไซต์ทั้งหมด</translation> <translation id="629730747756840877">บัญชี</translation> +<translation id="6303969859164067831">ออกจากระบบและปิดการซิงค์</translation> <translation id="6320088164292336938">สั่น</translation> <translation id="6324034347079777476">ปิดใช้การซิงค์ระบบ Android อยู่</translation> <translation id="6333140779060797560">แชร์ผ่าน <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">รับคำแนะนำไม่ได้</translation> <translation id="7562080006725997899">กำลังล้างข้อมูลการท่องเว็บ</translation> <translation id="756809126120519699">ล้างข้อมูล Chrome แล้ว</translation> +<translation id="757524316907819857">บล็อกไม่ให้เว็บไซต์เล่นเนื้อหาที่มีการคุ้มครอง</translation> <translation id="7589445247086920869">บล็อกสำหรับเครื่องมือค้นหาปัจจุบัน</translation> <translation id="7593557518625677601">เปิดการตั้งค่า Android และเปิดการซิงค์ Android ใหม่เพื่อเริ่มการซิงค์ของ Chrome</translation> <translation id="7596558890252710462">ระบบปฏิบัติการ</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">ส่งสถิติการใช้งานและรายงานข้อขัดข้องไปยัง Google โดยอัตโนมัติ</translation> <translation id="8993760627012879038">เปิดแท็บใหม่ในโหมดไม่ระบุตัวตน</translation> <translation id="8998729206196772491">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่จัดการโดย <ph name="MANAGED_DOMAIN" /> และทำให้ผู้ดูแลระบบของโดเมนควบคุมข้อมูล Chrome ของคุณได้ ข้อมูลดังกล่าวจะโยงกับบัญชีนี้อย่างถาวร การออกจากระบบ Chrome จะลบข้อมูลของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังจัดเก็บอยู่ในบัญชี Google</translation> -<translation id="9018881455348618200">ปุ่มค้นหา</translation> <translation id="9019902583201351841">มีการจัดการโดยผู้ปกครอง</translation> <translation id="9040142327097499898">อนุญาตให้แสดงการแจ้งเตือน ตำแหน่งสำหรับอุปกรณ์เครื่องนี้ปิดอยู่</translation> <translation id="9050666287014529139">ข้อความรหัสผ่าน</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index 87ecca9..eb358f83 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Etkinlik oluştur</translation> <translation id="2902702728133930130">Chrome başlatılırken beklenmeyen bir hata yüzünden başarısız oldu.</translation> <translation id="290376772003165898">Sayfa <ph name="LANGUAGE" /> dilinde değil mi?</translation> +<translation id="2910701580606108292">Sitelerin korumalı içeriği oynatmasına izin verilmeden önce size sorulur</translation> <translation id="2913331724188855103">Sitelerin, çerez verilerini kaydetmelerine ve okumalarına izin ver (önerilir)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> depolama alanı</translation> <translation id="2943166482989655199">Google'a sistem ve kullanım verilerini göndererek Chrome ürününü ve güvenliğini iyileştirin</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Geçerli sayfayı yeniden yükler</translation> <translation id="3452612588551937789">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için Google Hesabınızla oturum açın.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d dosya indirildi}other{%1$d dosya indirildi}}</translation> -<translation id="3487093336331957349">Arama ve site önerileri</translation> <translation id="3492207499832628349">Yeni gizli sekme</translation> <translation id="3493531032208478708">Önerilen içerik hakkında <ph name="BEGIN_LINK" />daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="3518985090088779359">Kabul et ve devam et</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Senkronizasyon, kişiselleştirme ve daha fazla özelliği kontrol edin</translation> <translation id="4432792777822557199"><ph name="SOURCE_LANGUAGE" /> dilindeki sayfalar artık <ph name="TARGET_LANGUAGE" /> diline çevrilecek</translation> <translation id="4434045419905280838">Pop-up'lar ve yönlendirmeler</translation> -<translation id="4445444302979002552">Arama terimleri ve web siteleri önermek için tahmin hizmetlerini kullan</translation> <translation id="4452411734226507615"><ph name="TAB_TITLE" /> sekmesini kapat</translation> <translation id="4452548195519783679">Yer işareti <ph name="FOLDER_NAME" /> klasörüne eklendi</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> dosyası <ph name="PRODUCT_NAME" /> uygulamasında indirildi</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Sayfa yazdırılırken bir sorun oluştu. Lütfen tekrar deneyin.</translation> <translation id="6295158916970320988">Tüm siteler</translation> <translation id="629730747756840877">Hesap</translation> +<translation id="6303969859164067831">Oturumu ve senkronizasyonu kapat</translation> <translation id="6320088164292336938">Titreşim</translation> <translation id="6324034347079777476">Android sistem senkronizasyonu devre dışı</translation> <translation id="6333140779060797560">Paylaşım yöntemi: <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Öneriler alınamıyor</translation> <translation id="7562080006725997899">Göz atma verileri temizleniyor</translation> <translation id="756809126120519699">Chrome verileri temizlendi</translation> +<translation id="757524316907819857">Sitelerin korumalı içeriği oynatmasını engellenir</translation> <translation id="7589445247086920869">Geçerli arama motoru için engelleyin</translation> <translation id="7593557518625677601">Chrome Senkronizasyonu'nu başlatmak için Android ayarlarını açın ve Android sistem senkronizasyonunu yeniden etkinleştirin</translation> <translation id="7596558890252710462">İşletim sistemi</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Kullanım istatistiklerini ve çökme raporlarını otomatik olarak Google'a gönder</translation> <translation id="8993760627012879038">Gizli modda yeni bir sekme açar</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> tarafından yönetilen bir hesapla oturum açıyorsunuz ve yöneticiye tüm Chrome verileriniz üzerinde denetim olanağı veriyorsunuz. Verileriniz kalıcı olarak bu hesaba bağlanacaktır. Chrome'da oturumu kapattığınızda verileriniz bu cihazdan silinir, ancak Google Hesabınızda kalmaya devam eder.</translation> -<translation id="9018881455348618200">Ara düğmesi</translation> <translation id="9019902583201351841">Ebeveynleriniz tarafından yönetiliyor</translation> <translation id="9040142327097499898">Bildirimlere izin veriliyor. Konum özelliği bu cihazda kapalı.</translation> <translation id="9050666287014529139">Parola</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 56034ff..d5f6b88 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Створити подію</translation> <translation id="2902702728133930130">Не вдалося запустити Chrome через неочікувану помилку.</translation> <translation id="290376772003165898">Ця сторінка відображається не такою мовою: <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Запитувати, перш ніж дозволити сайтам відтворювати захищений вміст</translation> <translation id="2913331724188855103">Дозволити сайтам зберігати та розпізнавати дані файлів cookie (рекомендується)</translation> <translation id="2932150158123903946">Дані додатка Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Покращуйте Chrome і функції безпеки, надсилаючи в Google дані про систему та використання</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Оновити поточну сторінку</translation> <translation id="3452612588551937789">Увійдіть в обліковий запис Google, щоб мати доступ до закладок, паролів, історії й інших налаштувань на всіх своїх пристроях.</translation> <translation id="3485359633434254965">{FILES,plural, =1{%1$d файл завантажено}one{%1$d файл завантажено}few{%1$d файли завантажено}many{%1$d файлів завантажено}other{%1$d файлу завантажено}}</translation> -<translation id="3487093336331957349">Пропозиції пошукових термінів і сайтів</translation> <translation id="3492207499832628349">Нова анонімна вкладка</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /> про пропонований вміст</translation> <translation id="3518985090088779359">Прийняти та продовж.</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Керування синхронізацією, персоналізацією тощо</translation> <translation id="4432792777822557199">Надалі сторінки цією мовою (<ph name="SOURCE_LANGUAGE" />) перекладатимуться такою мовою: <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Спливаючі вікна й переадресація</translation> -<translation id="4445444302979002552">Пропонувати пошукові терміни та веб-сайти за допомогою служб для показу пропозицій</translation> <translation id="4452411734226507615">Закрити вкладку <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Закладку збережено в папці "<ph name="FOLDER_NAME" />"</translation> <translation id="4453340223357552416">Файл <ph name="FILE_NAME" /> завантажено в продукті <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Виникла проблема з друком цієї сторінки. Повторіть спробу.</translation> <translation id="6295158916970320988">Усі сайти</translation> <translation id="629730747756840877">Обліковий запис</translation> +<translation id="6303969859164067831">Вийти й вимкнути синхронізацію</translation> <translation id="6320088164292336938">Вібросигнал</translation> <translation id="6324034347079777476">Синхронізацію системи Android вимкнено</translation> <translation id="6333140779060797560">Надіслати через <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Не вдається отримати пропозиції</translation> <translation id="7562080006725997899">Очищення даних веб-перегляду</translation> <translation id="756809126120519699">Дані Chrome видалено</translation> +<translation id="757524316907819857">Заборонити сайтам відтворювати захищений вміст</translation> <translation id="7589445247086920869">Заблокувати для поточної пошукової системи</translation> <translation id="7593557518625677601">Щоб почати синхронізацію Chrome, відкрийте параметри Android і знову ввімкніть синхронізацію системи</translation> <translation id="7596558890252710462">Операційна система</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Автоматично надсилати статистику використання та звіти про аварійне завершення роботи в Google</translation> <translation id="8993760627012879038">Відкрити нове вікно в режимі анонімного перегляду</translation> <translation id="8998729206196772491">Ви входите в обліковий запис, зареєстрований у домені <ph name="MANAGED_DOMAIN" />, і надаєте його адміністратору доступ до своїх даних Chrome. Ваші дані буде назавжди зв’язано з цим обліковим записом. Якщо ви вийдете з облікового запису в Chrome, дані буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation> -<translation id="9018881455348618200">Кнопка пошуку</translation> <translation id="9019902583201351841">Керується батьками</translation> <translation id="9040142327097499898">На цьому пристрої вимкнено геодані. Сповіщення дозволено.</translation> <translation id="9050666287014529139">Парольна фраза</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index a3389b6d..6850efb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">Tạo sự kiện</translation> <translation id="2902702728133930130">Chrome khởi động không thành công với lỗi không mong muốn.</translation> <translation id="290376772003165898">Trang này không được viết bằng <ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">Hỏi trước khi cho phép trang web phát nội dung được bảo vệ</translation> <translation id="2913331724188855103">Cho phép trang web lưu và đọc dữ liệu cookie (được đề xuất)</translation> <translation id="2932150158123903946">Bộ nhớ Google <ph name="APP_NAME" /></translation> <translation id="2943166482989655199">Cải thiện Chrome và tăng cường bảo mật bằng cách gửi dữ liệu sử dụng và dữ liệu về hệ thống cho Google</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">Tải lại trang hiện tại</translation> <translation id="3452612588551937789">Đăng nhập bằng Tài khoản Google để nhận dấu trang, lịch sử, mật khẩu và các cài đặt khác trên tất cả thiết bị của bạn.</translation> <translation id="3485359633434254965">{FILES,plural, =1{Đã tải xuống %1$d tệp}other{Đã tải xuống %1$d tệp}}</translation> -<translation id="3487093336331957349">Đề xuất về tìm kiếm và trang web</translation> <translation id="3492207499832628349">Tab ẩn danh mới</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /> về nội dung được đề xuất</translation> <translation id="3518985090088779359">Chấp nhận và tiếp tục</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">Kiểm soát tính năng đồng bộ hóa, cá nhân hóa và nhiều nội dung khác</translation> <translation id="4432792777822557199">Kể từ bây giờ trở đi, các trang viết bằng <ph name="SOURCE_LANGUAGE" /> sẽ được dịch sang <ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">Cửa sổ bật lên và liên kết chuyển hướng</translation> -<translation id="4445444302979002552">Sử dụng các dịch vụ dự đoán để đề xuất cụm từ tìm kiếm và trang web</translation> <translation id="4452411734226507615">Đóng tab <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Đã đánh dấu trang vào <ph name="FOLDER_NAME" /></translation> <translation id="4453340223357552416">Đã tải xuống <ph name="FILE_NAME" /> trong <ph name="PRODUCT_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">Đã xảy ra sự cố khi in trang này. Vui lòng thử lại.</translation> <translation id="6295158916970320988">Tất cả các trang web</translation> <translation id="629730747756840877">Tài khoản</translation> +<translation id="6303969859164067831">Đăng xuất và tắt đồng bộ hóa</translation> <translation id="6320088164292336938">Rung</translation> <translation id="6324034347079777476">Đồng bộ hóa hệ thống Android đã bị tắt</translation> <translation id="6333140779060797560">Chia sẻ qua <ph name="APPLICATION" /></translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">Không thể nhận đề xuất</translation> <translation id="7562080006725997899">Xóa dữ liệu duyệt web</translation> <translation id="756809126120519699">Đã xóa dữ liệu Chrome</translation> +<translation id="757524316907819857">Chặn không cho trang web phát nội dung được bảo vệ</translation> <translation id="7589445247086920869">Chặn đối với công cụ tìm kiếm hiện tại</translation> <translation id="7593557518625677601">Mở c.đặt Android & bật lại đ.bộ hóa hệ thống Android để b.đầu đồng bộ hóa Chrome</translation> <translation id="7596558890252710462">Hệ điều hành</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">Tự động gửi số liệu thống kê về việc sử dụng và báo cáo sự cố cho Google</translation> <translation id="8993760627012879038">Mở tab mới trong chế độ Ẩn danh</translation> <translation id="8998729206196772491">Bạn đang đăng nhập bằng tài khoản do <ph name="MANAGED_DOMAIN" /> quản lý và cấp cho quản trị viên quyền kiểm soát dữ liệu Chrome của bạn. Dữ liệu của bạn sẽ được liên kết vĩnh viễn với tài khoản này. Việc đăng xuất khỏi Chrome sẽ xóa dữ liệu của bạn khỏi thiết bị này nhưng dữ liệu sẽ vẫn được lưu trữ trong Tài khoản Google.</translation> -<translation id="9018881455348618200">Nút tìm kiếm</translation> <translation id="9019902583201351841">Do cha mẹ của bạn quản lý</translation> <translation id="9040142327097499898">Cho phép thông báo. Đã tắt vị trí đối với thiết bị này.</translation> <translation id="9050666287014529139">Cụm mật khẩu</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index b23a11e..d20a0a6e9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">创建活动</translation> <translation id="2902702728133930130">由于出现意外错误,Chrome 启动失败。</translation> <translation id="290376772003165898">网页的源语言不是<ph name="LANGUAGE" />?</translation> +<translation id="2910701580606108292">在允许网站播放受保护内容前先询问</translation> <translation id="2913331724188855103">允许网站保存和读取 Cookie 数据(推荐)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> 存储数据</translation> <translation id="2943166482989655199">将系统信息和使用情况数据发送给 Google,帮助改进 Chrome 并提高其安全性</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">重新加载当前网页</translation> <translation id="3452612588551937789">在任意设备上登录 Google 帐号后,您即可获取自己的书签、历史记录、密码及其他设置。</translation> <translation id="3485359633434254965">{FILES,plural, =1{已下载 %1$d 个文件}other{已下载 %1$d 个文件}}</translation> -<translation id="3487093336331957349">搜索和网站建议</translation> <translation id="3492207499832628349">打开新的无痕式标签页</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />详细了解<ph name="END_LINK" />推荐内容</translation> <translation id="3518985090088779359">接受并继续</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">控制同步、个性化和其他服务</translation> <translation id="4432792777822557199">从现在开始,源语言为<ph name="SOURCE_LANGUAGE" />的网页一律会被翻译成<ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">弹出式窗口和重定向</translation> -<translation id="4445444302979002552">使用联想查询服务可让系统提供搜索字词和网站建议</translation> <translation id="4452411734226507615">关闭“<ph name="TAB_TITLE" />”标签页</translation> <translation id="4452548195519783679">已将书签添加到“<ph name="FOLDER_NAME" />”</translation> <translation id="4453340223357552416">已在 <ph name="PRODUCT_NAME" /> 中下载 <ph name="FILE_NAME" /></translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">打印该页面时出现问题,请重试。</translation> <translation id="6295158916970320988">所有网站</translation> <translation id="629730747756840877">帐号</translation> +<translation id="6303969859164067831">退出帐号并关闭同步功能</translation> <translation id="6320088164292336938">振动</translation> <translation id="6324034347079777476">Android 系统同步功能已停用</translation> <translation id="6333140779060797560">通过<ph name="APPLICATION" />分享</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">无法获取建议</translation> <translation id="7562080006725997899">正在清除浏览数据</translation> <translation id="756809126120519699">已清除 Chrome 数据</translation> +<translation id="757524316907819857">禁止网站播放受保护内容</translation> <translation id="7589445247086920869">不适用于当前的搜索引擎</translation> <translation id="7593557518625677601">打开 Android 设置,重新启用 Android 系统同步功能以开始 Chrome 同步</translation> <translation id="7596558890252710462">操作系统</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">将使用情况统计信息和崩溃报告自动发送给 Google</translation> <translation id="8993760627012879038">在无痕模式下打开新标签页</translation> <translation id="8998729206196772491">您正要登录由 <ph name="MANAGED_DOMAIN" /> 管理的帐号,并要授权其管理员控制您的 Chrome 数据。您的数据将与此帐号永久关联。退出 Chrome 后,您的数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation> -<translation id="9018881455348618200">搜索按钮</translation> <translation id="9019902583201351841">由您父母管理</translation> <translation id="9040142327097499898">允许显示通知。但此设备的位置信息功能已关闭。</translation> <translation id="9050666287014529139">密码</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index 3a7c823a..22864ae8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -249,6 +249,7 @@ <translation id="2900528713135656174">建立活動</translation> <translation id="2902702728133930130">發生未預期的錯誤,Chrome 啟動失敗。</translation> <translation id="290376772003165898">不是<ph name="LANGUAGE" />網頁嗎?</translation> +<translation id="2910701580606108292">允許網站播放受保護的內容前,必須先詢問你</translation> <translation id="2913331724188855103">允許網站儲存及讀取 Cookie 資料 (建議)</translation> <translation id="2932150158123903946">Google <ph name="APP_NAME" /> 儲存資料量</translation> <translation id="2943166482989655199">傳送系統資訊和使用情形資料給 Google,協助改善 Chrome 及其安全性</translation> @@ -307,7 +308,6 @@ <translation id="3443221991560634068">重新載入目前網頁</translation> <translation id="3452612588551937789">只要使用 Google 帳戶登入,您就可以在所有裝置上存取自己的書籤、密碼、歷史記錄、密碼和其他設定。</translation> <translation id="3485359633434254965">{FILES,plural, =1{已下載 %1$d 個檔案}other{已下載 %1$d 個檔案}}</translation> -<translation id="3487093336331957349">搜尋與網站建議</translation> <translation id="3492207499832628349">新無痕式分頁</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />進一步瞭解<ph name="END_LINK" />建議的內容</translation> <translation id="3518985090088779359">接受並繼續</translation> @@ -417,7 +417,6 @@ <translation id="4419556793104466535">管理同步處理、個人化功能等更多設定</translation> <translation id="4432792777822557199">從現在起,系統會將<ph name="SOURCE_LANGUAGE" />網頁內容翻譯成<ph name="TARGET_LANGUAGE" /></translation> <translation id="4434045419905280838">彈出式視窗與重新導向</translation> -<translation id="4445444302979002552">運用預測服務取得建議的搜尋字詞和網站</translation> <translation id="4452411734226507615">關閉 [<ph name="TAB_TITLE" />] 分頁</translation> <translation id="4452548195519783679">已將書籤加入「<ph name="FOLDER_NAME" />」</translation> <translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> 已下載「<ph name="FILE_NAME" />」</translation> @@ -669,6 +668,7 @@ <translation id="6277522088822131679">列印網頁時發生問題,請再試一次。</translation> <translation id="6295158916970320988">所有網站</translation> <translation id="629730747756840877">帳戶</translation> +<translation id="6303969859164067831">登出並關閉同步處理功能</translation> <translation id="6320088164292336938">震動</translation> <translation id="6324034347079777476">Android 系統同步處理功能已停用</translation> <translation id="6333140779060797560">透過 <ph name="APPLICATION" /> 分享</translation> @@ -831,6 +831,7 @@ <translation id="7542481630195938534">無法取得建議</translation> <translation id="7562080006725997899">正在清除瀏覽資料</translation> <translation id="756809126120519699">已清除 Chrome 資料</translation> +<translation id="757524316907819857">禁止網站播放受保護的內容</translation> <translation id="7589445247086920869">對目前的搜尋引擎封鎖</translation> <translation id="7593557518625677601">如要啟動 Chrome 同步功能,請開啟 Android 設定並重新啟用 Android 系統同步處理設定</translation> <translation id="7596558890252710462">作業系統</translation> @@ -1001,7 +1002,6 @@ <translation id="8986494364107987395">自動傳送使用統計資料及當機報告給 Google</translation> <translation id="8993760627012879038">在無痕模式下開啟新分頁</translation> <translation id="8998729206196772491">您即將使用由 <ph name="MANAGED_DOMAIN" /> 所管理的帳戶登入,並授權該網域的管理員控管您的 Chrome 資料。您的資料會與這個帳戶建立永久連結。登出 Chrome 後,系統會將您的資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation> -<translation id="9018881455348618200">搜尋按鈕</translation> <translation id="9019902583201351841">你的家長已停用這項功能</translation> <translation id="9040142327097499898">允許顯示通知。這部裝置的定位功能已關閉。</translation> <translation id="9050666287014529139">通關密語</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 56dbbd2..718619c 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -9,6 +9,7 @@ chrome_java_sources = [ "java/src/com/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider.java", + "java/src/org/chromium/chrome/browser/ActivityTabProvider.java", "java/src/org/chromium/chrome/browser/ActivityTabTaskDescriptionHelper.java", "java/src/org/chromium/chrome/browser/ActivityTaskDescriptionIconGenerator.java", "java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java", @@ -827,7 +828,7 @@ "java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java", "java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java", "java/src/org/chromium/chrome/browser/modelutil/ForwardingListObservable.java", - "java/src/org/chromium/chrome/browser/modelutil/LazyViewBinderAdapter.java", + "java/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcp.java", "java/src/org/chromium/chrome/browser/modelutil/ListModel.java", "java/src/org/chromium/chrome/browser/modelutil/ListModelBase.java", "java/src/org/chromium/chrome/browser/modelutil/ListModelChangeProcessor.java", @@ -963,6 +964,8 @@ "java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/ConnectivityDetector.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java", + "java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarManager.java", + "java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarView.java", "java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java", "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java", "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java", @@ -1658,6 +1661,7 @@ chrome_test_java_sources = [ "javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java", + "javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java", "javatests/src/org/chromium/chrome/browser/AudioTest.java", "javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherTest.java", "javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java", @@ -1778,6 +1782,7 @@ "javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java", "javatests/src/org/chromium/chrome/browser/download/DownloadInfoBarControllerTest.java", "javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java", + "javatests/src/org/chromium/chrome/browser/download/DownloadMediaParserTest.java", "javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java", "javatests/src/org/chromium/chrome/browser/download/DownloadNotificationService2Test.java", "javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java", @@ -2209,6 +2214,7 @@ "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTitleUpdatedTest.java", "junit/src/org/chromium/chrome/browser/metrics/VariationsSessionTest.java", + "junit/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcpTest.java", "junit/src/org/chromium/chrome/browser/modelutil/PropertyModelTest.java", "junit/src/org/chromium/chrome/browser/modelutil/SimpleListObservableTest.java", "junit/src/org/chromium/chrome/browser/native_page/NativePageFactoryTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java new file mode 100644 index 0000000..d85a4b3d --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
@@ -0,0 +1,238 @@ +// 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; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; +import android.support.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.Restriction; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.content_public.common.ContentUrlConstants; +import org.chromium.ui.test.util.UiRestriction; + +import java.util.concurrent.TimeoutException; + +/** + * Tests for {@link ChromeActivity}'s {@link ActivityTabProvider}. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +public class ActivityTabProviderTest { + @Rule + public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + + private ChromeTabbedActivity mActivity; + private ActivityTabProvider mProvider; + private Tab mActivityTab; + private CallbackHelper mActivityTabChangedHelper = new CallbackHelper(); + private CallbackHelper mActivityTabChangedHintHelper = new CallbackHelper(); + + @Before + public void setUp() throws Exception { + mActivityTestRule.startMainActivityOnBlankPage(); + mActivity = mActivityTestRule.getActivity(); + mProvider = mActivity.getActivityTabProvider(); + mProvider.addObserverAndTrigger((tab, hint) -> { + if (hint) { + mActivityTabChangedHintHelper.notifyCalled(); + } else { + mActivityTab = tab; + mActivityTabChangedHelper.notifyCalled(); + } + }); + assertEquals("Setup should have only triggered the event once.", + mActivityTabChangedHelper.getCallCount(), 1); + } + + /** + * @return The {@link Tab} that the active model currently has selected. + */ + private Tab getModelSelectedTab() { + return mActivity.getTabModelSelector().getCurrentTab(); + } + + /** + * Test that the onActivityTabChanged event is triggered when the observer is attached for + * only that observer. + */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + public void testTriggerOnAddObserver() throws InterruptedException, TimeoutException { + CallbackHelper helper = new CallbackHelper(); + mProvider.addObserverAndTrigger((tab, hint) -> helper.notifyCalled()); + helper.waitForCallback(0); + + assertEquals("Only the added observer should have been triggered.", + mActivityTabChangedHelper.getCallCount(), 1); + assertEquals("The added observer should have only been triggered once.", 1, + helper.getCallCount()); + } + + /** Test that onActivityTabChanged is triggered when entering and exiting the tab switcher. */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + public void testTriggerWithTabSwitcher() throws InterruptedException, TimeoutException { + assertEquals("The activity tab should be the model's selected tab.", getModelSelectedTab(), + mActivityTab); + + ThreadUtils.runOnUiThreadBlocking(() -> mActivity.getLayoutManager().showOverview(false)); + mActivityTabChangedHelper.waitForCallback(1); + assertEquals("Entering the tab switcher should have triggered the event once.", 2, + mActivityTabChangedHelper.getCallCount()); + assertEquals("The activity tab should be null.", null, mActivityTab); + + ThreadUtils.runOnUiThreadBlocking(() -> mActivity.getLayoutManager().hideOverview(false)); + mActivityTabChangedHelper.waitForCallback(2); + assertEquals("Exiting the tab switcher should have triggered the event once.", 3, + mActivityTabChangedHelper.getCallCount()); + assertEquals("The activity tab should be the model's selected tab.", getModelSelectedTab(), + mActivityTab); + } + + /** Test that the hint event triggers when exiting the tab switcher. */ + @Test + @LargeTest + @Feature({"ActivityTabObserver"}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + public void testTriggerHintWithTabSwitcher() throws InterruptedException, TimeoutException { + assertEquals("The hint should not yet have triggered.", 0, + mActivityTabChangedHintHelper.getCallCount()); + + setTabSwitcherModeAndWait(true); + + assertEquals("The hint should not yet have triggered.", 0, + mActivityTabChangedHintHelper.getCallCount()); + + setTabSwitcherModeAndWait(false); + mActivityTabChangedHintHelper.waitForCallback(0); + + assertEquals("The hint should have triggerd once.", 1, + mActivityTabChangedHintHelper.getCallCount()); + } + + /** + * Test that onActivityTabChanged is triggered when switching to a new tab without switching + * layouts. + */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + public void testTriggerWithTabSelection() throws InterruptedException, TimeoutException { + Tab startingTab = getModelSelectedTab(); + + ChromeTabUtils.fullyLoadUrlInNewTab(InstrumentationRegistry.getInstrumentation(), mActivity, + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL, false); + + assertNotEquals( + "A new tab should be in the foreground.", startingTab, getModelSelectedTab()); + assertEquals("The activity tab should be the model's selected tab.", getModelSelectedTab(), + mActivityTab); + + int callCount = mActivityTabChangedHelper.getCallCount(); + ThreadUtils.runOnUiThreadBlocking(() -> { + // Select the original tab without switching layouts. + mActivity.getTabModelSelector().getCurrentModel().setIndex( + 0, TabSelectionType.FROM_USER); + }); + mActivityTabChangedHelper.waitForCallback(callCount); + + assertEquals("Switching tabs should have triggered the event once.", callCount + 1, + mActivityTabChangedHelper.getCallCount()); + } + + /** Test that onActivityTabChanged is triggered when the last tab is closed. */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + public void testTriggerOnLastTabClosed() throws InterruptedException, TimeoutException { + int callCount = mActivityTabChangedHelper.getCallCount(); + ThreadUtils.runOnUiThreadBlocking( + () -> { mActivity.getTabModelSelector().closeTab(getModelSelectedTab()); }); + mActivityTabChangedHelper.waitForCallback(callCount); + + assertEquals("Closing the last tab should have triggered the event once.", callCount + 1, + mActivityTabChangedHelper.getCallCount()); + assertEquals("The activity's tab should be null.", null, mActivityTab); + } + + /** + * Test that the correct tab is considered the activity tab when a different tab is closed on + * phone. + */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + public void testCorrectTabAfterTabClosed() throws InterruptedException, TimeoutException { + Tab startingTab = getModelSelectedTab(); + + ChromeTabUtils.fullyLoadUrlInNewTab(InstrumentationRegistry.getInstrumentation(), mActivity, + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL, false); + + assertNotEquals("The starting tab should not be the selected tab.", getModelSelectedTab(), + startingTab); + assertEquals("The activity tab should be the model's selected tab.", getModelSelectedTab(), + mActivityTab); + Tab activityTabBefore = mActivityTab; + + int callCount = mActivityTabChangedHelper.getCallCount(); + ThreadUtils.runOnUiThreadBlocking( + () -> { mActivity.getTabModelSelector().closeTab(startingTab); }); + + assertEquals("The activity tab should not have changed.", activityTabBefore, mActivityTab); + } + + /** + * Enter or exit the tab switcher with animations and wait for the scene to change. + * @param inSwitcher Whether to enter or exit the tab switcher. + */ + private void setTabSwitcherModeAndWait(boolean inSwitcher) + throws InterruptedException, TimeoutException { + final CallbackHelper sceneChangeHelper = new CallbackHelper(); + SceneChangeObserver observer = new SceneChangeObserver() { + @Override + public void onTabSelectionHinted(int tabId) {} + + @Override + public void onSceneChange(Layout layout) { + sceneChangeHelper.notifyCalled(); + } + }; + mActivity.getCompositorViewHolder().getLayoutManager().addSceneChangeObserver(observer); + + int sceneChangeCount = sceneChangeHelper.getCallCount(); + if (inSwitcher) { + ThreadUtils.runOnUiThreadBlocking( + () -> mActivity.getLayoutManager().showOverview(true)); + } else { + ThreadUtils.runOnUiThreadBlocking( + () -> mActivity.getLayoutManager().hideOverview(true)); + } + sceneChangeHelper.waitForCallback(sceneChangeCount); + + mActivity.getCompositorViewHolder().getLayoutManager().removeSceneChangeObserver(observer); + } +}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java index 6fe801c..be8dcf4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
@@ -52,7 +52,7 @@ static class BluetoothChooserDialogWithFakeNatives extends BluetoothChooserDialog { int mFinishedEventType = -1; String mFinishedDeviceId; - int mRestartSearchCount = 0; + int mRestartSearchCount; BluetoothChooserDialogWithFakeNatives(WindowAndroid windowAndroid, String origin, int securityLevel, long nativeBluetoothChooserDialogPtr) { @@ -417,9 +417,9 @@ } private static class TestAndroidPermissionDelegate implements AndroidPermissionDelegate { - Dialog mDialog = null; - PermissionCallback mCallback = null; - String[] mPermissionsRequested = null; + Dialog mDialog; + PermissionCallback mCallback; + String[] mPermissionsRequested; public TestAndroidPermissionDelegate(Dialog dialog) { mDialog = dialog; @@ -459,7 +459,7 @@ } private static class FakeLocationUtils extends LocationUtils { - public boolean mLocationGranted = false; + public boolean mLocationGranted; @Override public boolean hasAndroidLocationPermission() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java index e34e28f6f..c412172 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java
@@ -34,9 +34,9 @@ private MockTaskService mTaskService; static class MockTaskService extends ChromeBackgroundService { - private boolean mDidLaunchBrowser = false; - private boolean mDidCallOnPersistentSchedulerWakeUp = false; - private boolean mDidCallOnBrowserUpgraded = false; + private boolean mDidLaunchBrowser; + private boolean mDidCallOnPersistentSchedulerWakeUp; + private boolean mDidCallOnBrowserUpgraded; @Override protected void launchBrowser(Context context, String tag) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java index e591130..76978efc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java
@@ -51,8 +51,8 @@ */ private static class MockChromeActivity extends ChromeTabbedActivity { private final Object mLock = new Object(); - private boolean mCheckCompleted = false; - private ChromeActivity mActivity = null; + private boolean mCheckCompleted; + private ChromeActivity mActivity; public MockChromeActivity(ChromeActivity activity) { mActivity = activity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewTest.java index 500dc37..986a392 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetViewTest.java
@@ -11,9 +11,11 @@ import static android.support.test.espresso.matcher.ViewMatchers.isRoot; import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.chromium.chrome.test.util.ViewUtils.waitForView; @@ -22,6 +24,7 @@ import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; +import android.view.ViewStub; import android.widget.LinearLayout; import android.widget.TextView; @@ -36,10 +39,15 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.Tab; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; -import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; +import org.chromium.chrome.browser.modelutil.LazyConstructionPropertyMcp; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.ui.DeferredViewStubInflationProvider; +import org.chromium.ui.ViewProvider; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutionException; /** * View tests for the keyboard accessory sheet component. @@ -48,7 +56,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AccessorySheetViewTest { private AccessorySheetModel mModel; - private LazyViewBinderAdapter.StubHolder<ViewPager> mStubHolder; + private BlockingQueue<ViewPager> mViewPager; @Rule public ChromeActivityTestRule<ChromeTabbedActivity> mActivityTestRule = @@ -57,45 +65,40 @@ @Before public void setUp() throws InterruptedException { mActivityTestRule.startMainActivityOnBlankPage(); - mStubHolder = new LazyViewBinderAdapter.StubHolder<>( - mActivityTestRule.getActivity().findViewById(R.id.keyboard_accessory_sheet_stub)); - mModel = new AccessorySheetModel(); - mModel.setHeight(mActivityTestRule.getActivity().getResources().getDimensionPixelSize( - org.chromium.chrome.R.dimen.keyboard_accessory_sheet_height)); - mModel.addObserver(new PropertyModelChangeProcessor<>(mModel, mStubHolder, - new LazyViewBinderAdapter<>(new AccessorySheetViewBinder(), - view -> view.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int i, float v, int i1) {} - - @Override - public void onPageSelected(int i) {} - - @Override - public void onPageScrollStateChanged(int i) {} - })))); + ThreadUtils.runOnUiThreadBlocking(() -> { + ViewStub viewStub = mActivityTestRule.getActivity().findViewById( + R.id.keyboard_accessory_sheet_stub); + mModel = new AccessorySheetModel(); + mModel.setHeight(mActivityTestRule.getActivity().getResources().getDimensionPixelSize( + org.chromium.chrome.R.dimen.keyboard_accessory_sheet_height)); + ViewProvider<ViewPager> provider = new DeferredViewStubInflationProvider<>(viewStub); + mViewPager = new ArrayBlockingQueue<>(1); + new LazyConstructionPropertyMcp<>(mModel, AccessorySheetModel.PropertyKey.VISIBLE, + AccessorySheetModel::isVisible, provider, AccessorySheetViewBinder::bind); + provider.whenLoaded(mViewPager::add); + }); } @Test @MediumTest - public void testAccessoryVisibilityChangedByModel() { + public void testAccessoryVisibilityChangedByModel() + throws ExecutionException, InterruptedException { // Initially, there shouldn't be a view yet. - assertNull(mStubHolder.getView()); + assertNull(mViewPager.poll()); // After setting the visibility to true, the view should exist and be visible. - ThreadUtils.runOnUiThreadBlocking(() -> mModel.setVisible(true)); - assertNotNull(mStubHolder.getView()); - assertTrue(mStubHolder.getView().getVisibility() == View.VISIBLE); + ThreadUtils.runOnUiThreadBlocking(() -> { mModel.setVisible(true); }); + ViewPager viewPager = mViewPager.take(); + assertEquals(viewPager.getVisibility(), View.VISIBLE); // After hiding the view, the view should still exist but be invisible. - ThreadUtils.runOnUiThreadBlocking(() -> mModel.setVisible(false)); - assertNotNull(mStubHolder.getView()); - assertTrue(mStubHolder.getView().getVisibility() != View.VISIBLE); + ThreadUtils.runOnUiThreadBlocking(() -> { mModel.setVisible(false); }); + assertNotEquals(viewPager.getVisibility(), View.VISIBLE); } @Test @MediumTest - public void testAddingTabToModelRendersTabsView() { + public void testAddingTabToModelRendersTabsView() throws InterruptedException { final String kSampleAction = "Some Action"; mModel.getTabList().add(new Tab(null, null, R.layout.empty_accessory_sheet, AccessoryTabType.PASSWORDS, new Tab.Listener() { @@ -114,11 +117,11 @@ })); mModel.setActiveTabIndex(0); // Shouldn't cause the view to be inflated. - assertNull(mStubHolder.getView()); + assertNull(mViewPager.poll()); // Setting visibility should cause the Tab to be rendered. ThreadUtils.runOnUiThreadBlocking(() -> mModel.setVisible(true)); - assertNotNull(mStubHolder.getView()); + assertNotNull(mViewPager.take()); onView(withText(kSampleAction)).check(matches(isDisplayed())); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewTest.java index dce5951..75600cb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryViewTest.java
@@ -13,11 +13,12 @@ import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.core.AllOf.allOf; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION; @@ -31,6 +32,7 @@ import android.support.v7.widget.AppCompatImageView; import android.view.View; import android.view.ViewGroup; +import android.view.ViewStub; import org.hamcrest.Matcher; import org.junit.Before; @@ -43,11 +45,15 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter; -import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; +import org.chromium.chrome.browser.modelutil.LazyConstructionPropertyMcp; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.ui.DeferredViewStubInflationProvider; +import org.chromium.ui.ViewProvider; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; /** @@ -58,7 +64,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class KeyboardAccessoryViewTest { private KeyboardAccessoryModel mModel; - private LazyViewBinderAdapter.StubHolder<KeyboardAccessoryView> mViewHolder; + private BlockingQueue<KeyboardAccessoryView> mKeyboardAccessoryView; @Rule public ChromeActivityTestRule<ChromeTabbedActivity> mActivityTestRule = @@ -88,29 +94,36 @@ @Before public void setUp() throws InterruptedException { mActivityTestRule.startMainActivityOnBlankPage(); - mModel = new KeyboardAccessoryModel(); - mViewHolder = new LazyViewBinderAdapter.StubHolder<>( - mActivityTestRule.getActivity().findViewById(R.id.keyboard_accessory_stub)); + ThreadUtils.runOnUiThreadBlocking(() -> { + mModel = new KeyboardAccessoryModel(); + ViewStub viewStub = + mActivityTestRule.getActivity().findViewById(R.id.keyboard_accessory_stub); - mModel.addObserver(new PropertyModelChangeProcessor<>(mModel, mViewHolder, - new LazyViewBinderAdapter<>(new KeyboardAccessoryViewBinder()))); + mKeyboardAccessoryView = new ArrayBlockingQueue<>(1); + ViewProvider<KeyboardAccessoryView> provider = + new DeferredViewStubInflationProvider<>(viewStub); + new LazyConstructionPropertyMcp<>(mModel, + KeyboardAccessoryModel.PropertyKey.VISIBLE, KeyboardAccessoryModel::isVisible, + provider, KeyboardAccessoryViewBinder::bind); + provider.whenLoaded(mKeyboardAccessoryView::add); + }); } @Test @MediumTest - public void testAccessoryVisibilityChangedByModel() { + public void testAccessoryVisibilityChangedByModel() + throws ExecutionException, InterruptedException { // Initially, there shouldn't be a view yet. - assertNull(mViewHolder.getView()); + assertNull(mKeyboardAccessoryView.poll()); // After setting the visibility to true, the view should exist and be visible. - ThreadUtils.runOnUiThreadBlocking(() -> mModel.setVisible(true)); - assertNotNull(mViewHolder.getView()); - assertTrue(mViewHolder.getView().getVisibility() == View.VISIBLE); + ThreadUtils.runOnUiThreadBlocking(() -> { mModel.setVisible(true); }); + KeyboardAccessoryView view = mKeyboardAccessoryView.take(); + assertEquals(view.getVisibility(), View.VISIBLE); // After hiding the view, the view should still exist but be invisible. - ThreadUtils.runOnUiThreadBlocking(() -> mModel.setVisible(false)); - assertNotNull(mViewHolder.getView()); - assertTrue(mViewHolder.getView().getVisibility() != View.VISIBLE); + ThreadUtils.runOnUiThreadBlocking(() -> { mModel.setVisible(false); }); + assertNotEquals(view.getVisibility(), View.VISIBLE); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java index f5b456c3..8f4619e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
@@ -10,8 +10,10 @@ import static android.support.test.espresso.matcher.ViewMatchers.assertThat; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertNotNull; import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition; @@ -33,8 +35,12 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.autofill.AutofillTestHelper; import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.infobar.InfoBarContainer; +import org.chromium.chrome.browser.infobar.InfoBarIdentifier; +import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.InfoBarTestAnimationListener; import org.chromium.chrome.test.util.browser.Features; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.ui.DropdownPopupWindowInterface; @@ -300,4 +306,61 @@ mHelper.waitToBeHidden(withId(R.id.keyboard_accessory_sheet)); mHelper.waitToBeHidden(withId(R.id.keyboard_accessory)); } + + @Test + @SmallTest + public void testInfobarStaysHiddenWhenOpeningSheet() + throws InterruptedException, TimeoutException { + mHelper.loadTestPage(false); + + // TODO Create an infobar + InfoBarContainer container = + mActivityTestRule.getActivity().getActivityTab().getInfoBarContainer(); + InfoBarTestAnimationListener mListener = new InfoBarTestAnimationListener(); + container.addAnimationListener(mListener); + final SimpleConfirmInfoBarBuilder.Listener testListener = + new SimpleConfirmInfoBarBuilder.Listener() { + @Override + public void onInfoBarDismissed() {} + @Override + public boolean onInfoBarButtonClicked(boolean isPrimary) { + return false; + } + }; + final String kInfoBarText = "SomeInfoBar"; + ThreadUtils.runOnUiThread(() -> { + SimpleConfirmInfoBarBuilder.create(mActivityTestRule.getActivity().getActivityTab(), + testListener, InfoBarIdentifier.DUPLICATE_DOWNLOAD_INFOBAR_DELEGATE_ANDROID, 0, + kInfoBarText, null, null, false); + }); + mListener.addInfoBarAnimationFinished("InfoBar not added."); + + mHelper.createTestTab(); + whenDisplayed(withText(kInfoBarText)); + + // Focus the field to bring up the accessory. + mHelper.clickPasswordField(); + mHelper.waitForKeyboard(); + assertThat(mActivityTestRule.getActivity() + .getActivityTab() + .getInfoBarContainer() + .getVisibility(), + is(not(View.VISIBLE))); + + // Click the tab to show the sheet and hide the keyboard. + whenDisplayed(withId(R.id.tabs)).perform(selectTabAtPosition(0)); + mHelper.waitForKeyboardToDisappear(); + whenDisplayed(withId(R.id.keyboard_accessory_sheet)); + assertThat(mActivityTestRule.getActivity() + .getActivityTab() + .getInfoBarContainer() + .getVisibility(), + is(not(View.VISIBLE))); + Espresso.pressBack(); + + mHelper.waitToBeHidden(withId(R.id.keyboard_accessory_sheet)); + mHelper.waitToBeHidden(withId(R.id.keyboard_accessory)); + + whenDisplayed(withText(kInfoBarText)); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java index 702c1917..0bcc123 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewTest.java
@@ -10,7 +10,6 @@ import android.support.annotation.LayoutRes; import android.support.test.filters.MediumTest; -import android.support.v4.view.ViewPager; import android.support.v7.widget.RecyclerView; import android.text.method.PasswordTransformationMethod; import android.view.ViewGroup; @@ -33,6 +32,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; +import org.chromium.ui.DeferredViewStubInflationProvider; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; @@ -58,22 +58,19 @@ */ private void openLayoutInAccessorySheet( @LayoutRes int layout, KeyboardAccessoryData.Tab.Listener listener) { - AccessorySheetCoordinator accessorySheet = new AccessorySheetCoordinator( - mActivityTestRule.getActivity().findViewById(R.id.keyboard_accessory_sheet_stub), - () -> new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int i, float v, int i1) {} - @Override - public void onPageSelected(int i) {} - @Override - public void onPageScrollStateChanged(int i) {} - }); - accessorySheet.addTab( - new KeyboardAccessoryData.Tab(null, null, layout, AccessoryTabType.ALL, listener)); - accessorySheet.setHeight( - mActivityTestRule.getActivity().getResources().getDimensionPixelSize( - R.dimen.keyboard_accessory_sheet_height)); - ThreadUtils.runOnUiThreadBlocking(accessorySheet::show); + ThreadUtils.runOnUiThreadBlocking(() -> { + AccessorySheetCoordinator accessorySheet = new AccessorySheetCoordinator( + new DeferredViewStubInflationProvider<>( + mActivityTestRule.getActivity().findViewById( + R.id.keyboard_accessory_sheet_stub))); + accessorySheet.addTab( + new KeyboardAccessoryData.Tab(null, null, layout, AccessoryTabType.ALL, + listener)); + accessorySheet.setHeight( + mActivityTestRule.getActivity().getResources().getDimensionPixelSize( + R.dimen.keyboard_accessory_sheet_height)); + accessorySheet.show(); + }); } @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java index 1ebb5aca..441e684 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java
@@ -32,7 +32,7 @@ * Returns a mocked set of installed packages. */ public static class TestPackageManager extends MockPackageManager { - public boolean isInstalled = false; + public boolean isInstalled; @Override public PackageInfo getPackageInfo(String packageName, int flags)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java index f1806d47..2a1560ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java
@@ -106,8 +106,8 @@ * Mocks an OverlayPanel, so it doesn't create WebContents or animations. */ private final class MockOverlayPanel extends OverlayPanel { - private boolean mWasTapDetectedOnPanel = false; - private boolean mWasScrollDetectedOnPanel = false; + private boolean mWasTapDetectedOnPanel; + private boolean mWasScrollDetectedOnPanel; public MockOverlayPanel(Context context, OverlayPanelManager panelManager) { super(context, null, panelManager);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java index 34ac90b..d1806fb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
@@ -10,6 +10,7 @@ import android.support.annotation.IntDef; import android.support.test.filters.SmallTest; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -46,6 +47,12 @@ public void setUp() throws Exception { mHasFinishedFastAnimation = false; mHasFinishedSlowAnimation = false; + ChromeAnimation.Animation.setAnimationMultiplierForTesting(1f); + } + + @After + public void tearDown() { + ChromeAnimation.Animation.unsetAnimationMultiplierForTesting(); } @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index 2b74024..4e78309 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -52,7 +52,7 @@ public class LayoutManagerTest implements MockTabModelDelegate { private static final String TAG = "LayoutManagerTest"; - private long mLastDownTime = 0; + private long mLastDownTime; private TabModelSelector mTabModelSelector; private LayoutManagerChrome mManager;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java index f359743..01e5399f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -79,23 +79,13 @@ @Before public void setUp() throws Exception { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - FirstRunStatus.setFirstRunFlowComplete(true); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(true)); } @After public void tearDown() throws Exception { mTestServer.stopAndDestroyServer(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - FirstRunStatus.setFirstRunFlowComplete(false); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(false)); deleteTestFiles(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java index 8ee43a2..ba4c9ce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java
@@ -208,8 +208,8 @@ // to return fake ones. It also ensures that the service never tries to create a callable // too many times. TestMinidumpUploadService service = new TestMinidumpUploadService() { - int mIndex = 0; - boolean mTriggerNetworkChange = false; + int mIndex; + boolean mTriggerNetworkChange; @Override MinidumpUploadCallable createMinidumpUploadCallable(File minidumpFile, File logfile) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java index 78005d60..66a02826a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
@@ -48,8 +48,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; import java.util.concurrent.atomic.AtomicReference; /** Tests for CustomTabsConnection. */ @@ -71,25 +69,23 @@ @After public void tearDown() throws Exception { CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - WarmupManager.getInstance().destroySpareWebContents(); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> WarmupManager.getInstance().destroySpareWebContents()); } /** * Tests that we can create a new session. Registering with a null callback - * fails, as well as multiple sessions with the same callback. + * fails. Registering a session with an {@linkplain CustomTabsSessionToken#equals equal} + * session token will update the callback for the session. */ @Test @SmallTest public void testNewSession() { - Assert.assertEquals(false, mCustomTabsConnection.newSession(null)); + Assert.assertFalse(mCustomTabsConnection.newSession(null)); CustomTabsSessionToken token = CustomTabsSessionToken.createMockSessionTokenForTesting(); - Assert.assertEquals(true, mCustomTabsConnection.newSession(token)); - Assert.assertEquals(false, mCustomTabsConnection.newSession(token)); + Assert.assertTrue(mCustomTabsConnection.newSession(token)); + // Request to update callback for the session. + Assert.assertTrue(mCustomTabsConnection.newSession(token)); } /** @@ -99,9 +95,9 @@ @SmallTest public void testSeveralSessions() { CustomTabsSessionToken token = CustomTabsSessionToken.createMockSessionTokenForTesting(); - Assert.assertEquals(true, mCustomTabsConnection.newSession(token)); + Assert.assertTrue(mCustomTabsConnection.newSession(token)); CustomTabsSessionToken token2 = CustomTabsSessionToken.createMockSessionTokenForTesting(); - Assert.assertEquals(true, mCustomTabsConnection.newSession(token2)); + Assert.assertTrue(mCustomTabsConnection.newSession(token2)); } /** @@ -123,16 +119,13 @@ // On UI thread because: // 1. takeSpareWebContents needs to be called from the UI thread. // 2. warmup() is non-blocking and posts tasks to the UI thread, it ensures proper ordering. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - WarmupManager warmupManager = WarmupManager.getInstance(); - Assert.assertTrue(warmupManager.hasSpareWebContents()); - WebContents webContents = warmupManager.takeSpareWebContents(false, false); - Assert.assertNotNull(webContents); - Assert.assertFalse(warmupManager.hasSpareWebContents()); - webContents.destroy(); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + WarmupManager warmupManager = WarmupManager.getInstance(); + Assert.assertTrue(warmupManager.hasSpareWebContents()); + WebContents webContents = warmupManager.takeSpareWebContents(false, false); + Assert.assertNotNull(webContents); + Assert.assertFalse(warmupManager.hasSpareWebContents()); + webContents.destroy(); }); } @@ -141,20 +134,12 @@ @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) public void testCreateSpareRendererCanBeRecreated() throws Exception { CustomTabsTestUtils.warmUpAndWait(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents()); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + assertSpareWebContentsNotNullAndDestroy(); + Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents()); }); CustomTabsTestUtils.warmUpAndWait(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - } - }); + ThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy); } @Test @@ -166,13 +151,10 @@ mCustomTabsConnection.newSession(token); mCustomTabsConnection.setShouldSpeculateLoadOnCellularForSession(token, true); assertWarmupAndMayLaunchUrl(token, URL, true); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - String referrer = - mCustomTabsConnection.getReferrerForSession(token).getUrl(); - Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents()); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + String referrer = + mCustomTabsConnection.getReferrerForSession(token).getUrl(); + Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents()); }); } @@ -185,19 +167,9 @@ @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) public void testPrerenderAndDisconnectOnOtherThread() throws Exception { final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, true); - final Thread otherThread = new Thread(new Runnable() { - @Override - public void run() { - mCustomTabsConnection.cleanUpSession(token); - } - }); + final Thread otherThread = new Thread(() -> mCustomTabsConnection.cleanUpSession(token)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - otherThread.start(); - } - }); + ThreadUtils.runOnUiThreadBlocking(otherThread::start); // Should not crash, hence no assertions below. } @@ -214,12 +186,7 @@ mCustomTabsConnection.setCanUseHiddenTabForSession(token, false); Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - } - }); + ThreadUtils.runOnUiThreadBlocking(() -> assertSpareWebContentsNotNullAndDestroy()); } @Test @@ -248,34 +215,28 @@ Assert.assertTrue("Failed first mayLaunchUrl()", mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); final CallbackHelper tabDestroyedHelper = new CallbackHelper(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertNotNull( - "Null speculation, first one", mCustomTabsConnection.mSpeculation); - Tab tab = mCustomTabsConnection.mSpeculation.tab; - Assert.assertNotNull("No first tab", tab); - tab.addObserver(new EmptyTabObserver() { - @Override - public void onDestroyed(Tab destroyedTab) { - tabDestroyedHelper.notifyCalled(); - } - }); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertNotNull( + "Null speculation, first one", mCustomTabsConnection.mSpeculation); + Tab tab = mCustomTabsConnection.mSpeculation.tab; + Assert.assertNotNull("No first tab", tab); + tab.addObserver(new EmptyTabObserver() { + @Override + public void onDestroyed(Tab destroyedTab) { + tabDestroyedHelper.notifyCalled(); + } + }); }); // New hidden tab. mCustomTabsConnection.resetThrottling(Process.myUid()); Assert.assertTrue("Failed second mayLaunchUrl()", mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL2), null, null)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertNotNull( - "Null speculation, new hidden tab", mCustomTabsConnection.mSpeculation); - Assert.assertNotNull("No second tab", mCustomTabsConnection.mSpeculation.tab); - Assert.assertEquals(URL2, mCustomTabsConnection.mSpeculation.url); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertNotNull( + "Null speculation, new hidden tab", mCustomTabsConnection.mSpeculation); + Assert.assertNotNull("No second tab", mCustomTabsConnection.mSpeculation.tab); + Assert.assertEquals(URL2, mCustomTabsConnection.mSpeculation.url); }); tabDestroyedHelper.waitForCallback("The first hidden tab should have been destroyed", 0); @@ -330,12 +291,7 @@ urls.add(urlBundle); mCustomTabsConnection.mayLaunchUrl(token, null, null, urls); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - } - }); + ThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy); } @Test @@ -356,12 +312,9 @@ urlUriBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); urlsAsUri.add(urlUriBundle); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertFalse(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urlsAsString)); - Assert.assertTrue(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urlsAsUri)); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertFalse(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urlsAsString)); + Assert.assertTrue(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urlsAsUri)); }); } @@ -378,12 +331,8 @@ invalidBundle.putParcelable(CustomTabsService.KEY_URL, new Intent()); invalidBundles.add(invalidBundle); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mCustomTabsConnection.lowConfidenceMayLaunchUrl(invalidBundles); - } - }); + ThreadUtils.runOnUiThreadBlockingNoException( + () -> mCustomTabsConnection.lowConfidenceMayLaunchUrl(invalidBundles)); } @Test @@ -400,12 +349,9 @@ urls.add(urlBundle); mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, urls); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertNull(WarmupManager.getInstance().takeSpareWebContents(false, false)); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> Assert.assertNull(WarmupManager.getInstance() + .takeSpareWebContents(false, false))); } private void assertSpareWebContentsNotNullAndDestroy() { @@ -595,12 +541,7 @@ Assert.assertTrue(mCustomTabsConnection.newSession(token)); Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - } - }); + ThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy); } @Test @@ -614,12 +555,9 @@ mCustomTabsConnection.setShouldSpeculateLoadOnCellularForSession(token, true); Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - Assert.assertNull(WarmupManager.getInstance().takeSpareWebContents(false, false)); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> Assert.assertNull(WarmupManager.getInstance() + .takeSpareWebContents(false, false))); } @Test @@ -632,32 +570,20 @@ CustomTabsTestUtils.warmUpAndWait(); // Needs the browser process to be initialized. - FutureTask<Boolean> result = ThreadUtils.runOnUiThread(new Callable<Boolean>() { - @Override - public Boolean call() { - PrefServiceBridge prefs = PrefServiceBridge.getInstance(); - boolean result = prefs.getNetworkPredictionEnabled(); - prefs.setNetworkPredictionEnabled(false); - return result; - }}); - final boolean enabled = result.get(); + boolean enabled = ThreadUtils.runOnUiThreadBlocking(() -> { + PrefServiceBridge prefs = PrefServiceBridge.getInstance(); + boolean oldEnabled = prefs.getNetworkPredictionEnabled(); + prefs.setNetworkPredictionEnabled(false); + return oldEnabled; + }); try { Assert.assertTrue( mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - assertSpareWebContentsNotNullAndDestroy(); - } - }); + ThreadUtils.runOnUiThreadBlocking(this::assertSpareWebContentsNotNullAndDestroy); } finally { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PrefServiceBridge.getInstance().setNetworkPredictionEnabled(enabled); - } - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PrefServiceBridge.getInstance().setNetworkPredictionEnabled(enabled)); } } @@ -671,10 +597,10 @@ mCustomTabsConnection.setShouldSpeculateLoadOnCellularForSession(token, true); CustomTabsTestUtils.warmUpAndWait(); ThreadUtils.runOnUiThreadBlocking( - () -> { Assert.assertTrue(WarmupManager.getInstance().hasSpareWebContents()); }); + () -> Assert.assertTrue(WarmupManager.getInstance().hasSpareWebContents())); Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); ThreadUtils.runOnUiThreadBlocking( - () -> { Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents()); }); + () -> Assert.assertFalse(WarmupManager.getInstance().hasSpareWebContents())); } @Test @@ -721,4 +647,4 @@ } }); } -} +} \ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTestRule.java index 5031546..897cc13 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTestRule.java
@@ -138,7 +138,7 @@ private TestDisplayCutoutController mTestController; /** Tracks whether the current tab is fullscreen. */ - private boolean mIsTabFullscreen = false; + private boolean mIsTabFullscreen; /** The {@link Tab} we are running the test in. */ private Tab mTab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMediaParserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMediaParserTest.java new file mode 100644 index 0000000..3c78171 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMediaParserTest.java
@@ -0,0 +1,118 @@ +// 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.download; + +import android.support.test.filters.LargeTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.RetryOnFailure; +import org.chromium.base.test.util.UrlUtils; +import org.chromium.chrome.browser.test.ChromeBrowserTestRule; +import org.chromium.content_public.browser.test.util.Criteria; +import org.chromium.content_public.browser.test.util.CriteriaHelper; + +import java.io.File; + +/** + * Tests to verify DownloadMediaParser, which retrieves media metadata and thumbnails. + * + * Most of the work is done in utility process and GPU process. + * + * All download media parser usage must be called on UI thread in this test to get message loop and + * threading contexts in native. + * + * Because each media parser call may perform multiple process and thread hops, it can be slow. + */ +@RunWith(BaseJUnit4ClassRunner.class) +public class DownloadMediaParserTest { + private static final long MAX_MEDIA_PARSER_POLL_TIME_MS = 10000; + private static final long MEDIA_PARSER_POLL_INTERVAL_MS = 1000; + + @Rule + public ChromeBrowserTestRule mTestRule = new ChromeBrowserTestRule(); + + /** + * Wraps result from download media parser. + */ + public static class MediaParseResult { + public boolean done; + public boolean success; + } + + @Before + public void setUp() throws Exception { + mTestRule.loadNativeLibraryAndInitBrowserProcess(); + } + + @Test + @LargeTest + @Feature({"Download"}) + @RetryOnFailure + public void testParseAudioMetatadata() throws InterruptedException { + String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/sfx.mp3"; + File audioFile = new File(filePath); + Assert.assertTrue(audioFile.exists()); + boolean done = false; + MediaParseResult result = new MediaParseResult(); + + // The native DownloadMediaParser needs to be created on UI thread. + ThreadUtils.runOnUiThreadBlocking(() -> { + DownloadMediaParserBridge parser = new DownloadMediaParserBridge( + "audio/mp3", filePath, audioFile.length(), (success) -> { + result.success = success; + result.done = true; + }); + parser.start(); + }); + + CriteriaHelper.pollUiThread(new Criteria() { + @Override + public boolean isSatisfied() { + return result.done; + } + }, MAX_MEDIA_PARSER_POLL_TIME_MS, MEDIA_PARSER_POLL_INTERVAL_MS); + + Assert.assertTrue("Failed to parse audio metadata.", result.success); + } + + @Test + @LargeTest + @Feature({"Download"}) + @RetryOnFailure + public void testParseVideoMetatadataThumbnail() throws InterruptedException { + String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear.mp4"; + File videoFile = new File(filePath); + Assert.assertTrue(videoFile.exists()); + boolean done = false; + MediaParseResult result = new MediaParseResult(); + + // The native DownloadMediaParser needs to be created on UI thread. + ThreadUtils.runOnUiThreadBlocking(() -> { + DownloadMediaParserBridge parser = new DownloadMediaParserBridge( + "video/mp4", filePath, videoFile.length(), (success) -> { + result.success = success; + result.done = true; + }); + parser.start(); + }); + + CriteriaHelper.pollUiThread(new Criteria() { + @Override + public boolean isSatisfied() { + return result.done; + } + }, MAX_MEDIA_PARSER_POLL_TIME_MS, MEDIA_PARSER_POLL_INTERVAL_MS); + + Assert.assertTrue("Failed to parse video file.", result.success); + } +}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java index 83d289c..05de11d4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
@@ -322,7 +322,7 @@ final int count = model.getCount(); InstrumentationRegistry.getInstrumentation().runOnMainSync( - (Runnable) () -> TabModelUtils.setIndex(model, count - 1)); + () -> TabModelUtils.setIndex(model, count - 1)); CriteriaHelper.pollUiThread(new Criteria() { @Override @@ -353,7 +353,7 @@ @Override public boolean isSatisfied() { CompositorViewHolder compositorViewHolder = - (CompositorViewHolder) mDownloadTestRule.getActivity().findViewById( + mDownloadTestRule.getActivity().findViewById( R.id.compositor_view_holder); LayoutManager layoutManager = compositorViewHolder.getLayoutManager();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java index 9c1d9b8b..e9a0cb3b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
@@ -21,10 +21,10 @@ */ public class MockDownloadNotificationService extends DownloadNotificationService { private final List<Integer> mNotificationIds = new ArrayList<Integer>(); - private boolean mPaused = false; + private boolean mPaused; private Context mContext; private int mLastNotificationId; - private boolean mIsForegroundRunning = false; + private boolean mIsForegroundRunning; void setContext(Context context) { mContext = context;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java index aefda5e..619207f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java
@@ -25,7 +25,7 @@ */ public class MockDownloadNotificationService2 extends DownloadNotificationService2 { private final List<Integer> mNotificationIds = new ArrayList<Integer>(); - private boolean mPaused = false; + private boolean mPaused; private int mLastNotificationId = DEFAULT_NOTIFICATION_ID; List<String> mResumedDownloads = new ArrayList<>();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java index acd6d6a3..1a762c2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
@@ -77,7 +77,7 @@ mActivityTestRule.startMainActivityOnBlankPage(); ThreadUtils.runOnUiThreadBlocking(() -> { // Accessing the bridge will create if needed, and may run initialization logic. - FeedProcessScopeFactory.getFeedSchedulerBridge(); + FeedProcessScopeFactory.getFeedScheduler(); mTaskScheduler.getTaskInfoList().clear(); }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/DelayedInvalidationsControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/DelayedInvalidationsControllerTest.java index 3d169a2a..432d437 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/DelayedInvalidationsControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/DelayedInvalidationsControllerTest.java
@@ -54,8 +54,8 @@ * It intercepts access to the Android Sync Adapter. */ private static class MockDelayedInvalidationsController extends DelayedInvalidationsController { - private boolean mInvalidated = false; - private List<Bundle> mBundles = null; + private boolean mInvalidated; + private List<Bundle> mBundles; private MockDelayedInvalidationsController() {}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java index eb9fb3b..5b60ce2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java
@@ -24,7 +24,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity; +import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity0; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -122,10 +122,10 @@ private void waitForCustomTabActivityToStart(Callable<Void> trigger, String expectedUrl) throws Exception { - SeparateTaskCustomTabActivity cta; + CustomTabActivity cta; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - cta = ActivityUtils.waitForActivity(InstrumentationRegistry.getInstrumentation(), - SeparateTaskCustomTabActivity.class, trigger); + cta = ActivityUtils.waitForActivity( + InstrumentationRegistry.getInstrumentation(), CustomTabActivity.class, trigger); } else { cta = ActivityUtils.waitForActivity(InstrumentationRegistry.getInstrumentation(), SeparateTaskCustomTabActivity0.class, trigger);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/router/MockMediaRouteProvider.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/router/MockMediaRouteProvider.java index 3d3a4c51d..8a65344e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/router/MockMediaRouteProvider.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/router/MockMediaRouteProvider.java
@@ -30,12 +30,12 @@ private final Map<String, MediaRoute> mPresentationIdToRoute = new HashMap<String, MediaRoute>(); - private int mSinksObservedDelayMillis = 0; - private int mCreateRouteDelayMillis = 0; + private int mSinksObservedDelayMillis; + private int mCreateRouteDelayMillis; private boolean mIsSupportsSource = true; - private String mCreateRouteErrorMessage = null; - private String mJoinRouteErrorMessage = null; - private boolean mCloseRouteWithErrorOnSend = false; + private String mCreateRouteErrorMessage; + private String mJoinRouteErrorMessage; + private boolean mCloseRouteWithErrorOnSend; /** * Factory for {@link MockMediaRouteProvider}. @@ -170,7 +170,7 @@ } @Override - public void sendStringMessage(String routeId, String message, int nativeCallbackId) { + public void sendStringMessage(String routeId, String message) { if (mCloseRouteWithErrorOnSend) { mManager.onRouteClosedWithError(routeId, "Sending message failed. Closing the route."); } else {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java index 0609244c..f1d9af24 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -107,7 +107,7 @@ @RunWith(ParameterizedRunner.class) @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE) -@DisableFeatures({"NetworkPrediction", ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER}) +@DisableFeatures("NetworkPrediction") @RetryOnFailure public class NewTabPageTest { @Rule @@ -639,7 +639,6 @@ @Test @SmallTest @Feature({"NewTabPage"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testArticleExpandableHeaderOnMultipleTabs() throws Exception { // Disable the sign-in promo so the header is visible above the fold. SignInPromo.setDisablePromoForTests(true); @@ -692,7 +691,6 @@ @Test @SmallTest @Feature({"NewTabPage", "RenderTest"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testArticleExpandableHeaderAppearance() throws Exception { NewTabPage ntp = (NewTabPage) mActivityTestRule.getActivity().getActivityTab().getNativePage();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java index abeb9ef..3f2b3f0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java
@@ -21,9 +21,6 @@ import org.junit.runner.RunWith; import org.chromium.base.ThreadUtils; -import org.chromium.base.test.params.ParameterAnnotations; -import org.chromium.base.test.params.ParameterSet; -import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; @@ -31,7 +28,6 @@ import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.ntp.ContextMenuManager; @@ -44,7 +40,7 @@ import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.NewTabPageTestUtils; @@ -67,8 +63,7 @@ /** * Instrumentation tests for {@link NewTabPageRecyclerView}. */ -@RunWith(ParameterizedRunner.class) -@ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) +@RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE) @Features.DisableFeatures("NetworkPrediction") @RetryOnFailure @@ -79,11 +74,6 @@ @Rule public SuggestionsDependenciesRule mSuggestionsDeps = new SuggestionsDependenciesRule(); - @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = - Arrays.asList(new ParameterSet().value(false).name("DisableExpandableHeader"), - new ParameterSet().value(true).name("EnableExpandableHeader")); - private static final String TEST_PAGE = "/chrome/test/data/android/navigate/simple.html"; private static final long FAKE_PUBLISH_TIMESTAMP = 1466614774; private static final long FAKE_FETCH_TIMESTAMP = 1466634774; @@ -95,26 +85,13 @@ @CategoryInt private static final int TEST_CATEGORY = KnownCategories.ARTICLES; - private final boolean mEnableExpandableHeader; - private Tab mTab; private NewTabPage mNtp; private EmbeddedTestServer mTestServer; private FakeSuggestionsSource mSource; - public NewTabPageRecyclerViewTest(boolean enableExpandableHeader) { - mEnableExpandableHeader = enableExpandableHeader; - } - @Before public void setUp() throws Exception { - if (mEnableExpandableHeader) { - Features.getInstance().enable( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER); - } else { - Features.getInstance().disable( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER); - } mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java index 8bde6e4..024f6faf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
@@ -83,7 +83,7 @@ private OfflinePageBridge mOfflinePageBridge; private EmbeddedTestServer mTestServer; private String mTestPage; - private boolean mServerTurnedOn = false; + private boolean mServerTurnedOn; @Before public void setUp() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java index 8967c87..947ec3b6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java
@@ -338,10 +338,17 @@ } private boolean isShowingOfflineIndicator() { - SnackbarManager snackbarManager = activity.getSnackbarManager(); - if (!snackbarManager.isShowing()) return false; - return snackbarManager.getCurrentSnackbarForTesting().getController() - == OfflineIndicatorController.getInstance(); + if (OfflineIndicatorController.isUsingTopSnackbar()) { + TopSnackbarManager snackbarManager = + OfflineIndicatorController.getInstance() + .getTopSnackbarManagerForTesting(); + return snackbarManager.isShowing(); + } else { + SnackbarManager snackbarManager = activity.getSnackbarManager(); + if (!snackbarManager.isShowing()) return false; + return snackbarManager.getCurrentSnackbarForTesting().getController() + == OfflineIndicatorController.getInstance(); + } } }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java index 548ddbd7..55f2abe9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
@@ -110,8 +110,8 @@ private static class TestBackgroundTaskScheduler implements BackgroundTaskScheduler { private HashMap<Integer, TestPrefetchBackgroundTask> mTasks = new HashMap<>(); private Semaphore mStartSemaphore = new Semaphore(0); - private int mAddCount = 0; - private int mRemoveCount = 0; + private int mAddCount; + private int mRemoveCount; @Override public boolean schedule(final Context context, final TaskInfo taskInfo) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarVoiceRecognitionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarVoiceRecognitionHandlerTest.java index 583d4c4e..8f11aab 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarVoiceRecognitionHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarVoiceRecognitionHandlerTest.java
@@ -82,8 +82,8 @@ private int mDismissedSource = -1; @VoiceInteractionSource private int mFailureSource = -1; - private Boolean mResult = null; - private Float mVoiceConfidenceValue = null; + private Boolean mResult; + private Float mVoiceConfidenceValue; public TestLocationBarVoiceRecognitionHandler(Delegate delegate) { super(delegate);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java index 8d3bb6d5..c4e40f2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
@@ -13,7 +13,6 @@ import static org.mockito.Mockito.verify; import android.support.test.filters.SmallTest; -import android.view.View; import org.junit.Before; import org.junit.Rule; @@ -41,8 +40,6 @@ private String mExplanationString = "Explanation string."; @Mock - private Callback<View> mExplanationTextLinkCallback; - @Mock private Callback<Boolean> mOnPasswordAcceptedOrRejectedCallback; @Rule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java index 266bd158..798bdf3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
@@ -28,6 +28,7 @@ import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences; import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory; import org.chromium.chrome.browser.test.ChromeBrowserTestRule; +import org.chromium.chrome.browser.test.ScreenShooter; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -37,11 +38,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) public class NotificationsPreferencesTest { - // TODO(peconn): Add UI Catalogue entries for NotificationsPreferences. @Rule public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule(); private Preferences mActivity; + @Rule + public ScreenShooter mScreenShooter = new ScreenShooter(); + @Before public void setUp() { mActivity = PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(), @@ -50,7 +53,7 @@ @Test @SmallTest - @Feature({"Preferences"}) + @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N) @CommandLineFlags.Add("enable-features=ContentSuggestionsNotifications") public void testContentSuggestionsToggle() { @@ -82,11 +85,13 @@ PreferencesTest.clickPreference(fragment, toggle); } }); + + mScreenShooter.shoot("ContentSuggestionsToggle"); } @Test @SmallTest - @Feature({"Preferences"}) + @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N) @CommandLineFlags.Add("disable-features=NTPArticleSuggestions") public void testToggleDisabledWhenSuggestionsDisabled() { @@ -96,12 +101,14 @@ Assert.assertFalse(toggle.isEnabled()); Assert.assertFalse(toggle.isChecked()); + + mScreenShooter.shoot("ToggleDisabledWhenSuggestionsDisabled"); } @Test @SmallTest - @Feature({"Preferences"}) + @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N) public void testLinkToWebsiteNotifications() { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @@ -125,6 +132,8 @@ SingleCategoryPreferences fragment = (SingleCategoryPreferences) getTopFragment(); Assert.assertTrue( fragment.getCategoryForTest().showSites(SiteSettingsCategory.Type.NOTIFICATIONS)); + + mScreenShooter.shoot("LinkToWebsiteNotifications"); } /** Gets the fragment of the top Activity. Assumes the top Activity is a Preferences. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java index ced224d..9bf2f60 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
@@ -76,31 +76,19 @@ AutofillProfileEditorPreference addProfile = (AutofillProfileEditorPreference) fragment.findPreference( AutofillProfilesFragment.PREF_NEW_PROFILE); - Assert.assertTrue(addProfile != null); + Assert.assertNotNull(addProfile); // Add a profile. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PreferencesTest.clickPreference(autofillProfileFragment, addProfile); - rule.setEditorDialog( - ((AutofillProfileEditorPreference) addProfile).getEditorDialog()); - try { - rule.setTextInEditorAndWait(new String[] {"Alice Doe", "Google", "111 Added St", - "Los Angeles", "CA", "90291", "650-253-0000", "add@profile.com"}); - rule.clickInEditorAndWait(R.id.editor_dialog_done_button); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - }); - // Check if the preferences are updated correctly. - rule.waitForThePreferenceUpdate(); + updatePreferencesAndWait(autofillProfileFragment, addProfile, + new String[] {"Alice Doe", "Google", "111 Added St", "Los Angeles", + "CA", "90291", "650-253-0000", "add@profile.com"}, + R.id.editor_dialog_done_button, false); + Assert.assertEquals(7 /* One toggle + one add button + five profiles. */, autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); AutofillProfileEditorPreference addedProfile = (AutofillProfileEditorPreference) fragment.findPreference("Alice Doe"); - Assert.assertTrue(addedProfile != null); + Assert.assertNotNull(addedProfile); Assert.assertEquals("111 Added St, 90291", addedProfile.getSummary()); activity.finish(); } @@ -122,28 +110,11 @@ AutofillProfileEditorPreference addProfile = (AutofillProfileEditorPreference) fragment.findPreference( AutofillProfilesFragment.PREF_NEW_PROFILE); - Assert.assertTrue(addProfile != null); + Assert.assertNotNull(addProfile); // Try to add an incomplete profile. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PreferencesTest.clickPreference(autofillProfileFragment, addProfile); - rule.setEditorDialog( - ((AutofillProfileEditorPreference) addProfile).getEditorDialog()); - try { - rule.setTextInEditorAndWait(new String[] {"Mike Doe"}); - rule.clickInEditorAndWaitForValidationError(R.id.editor_dialog_done_button); - } catch (TimeoutException ex) { - // There should be no timeout, which means that there should be a validation - // error. - ex.printStackTrace(); - Assert.assertTrue(false); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - }); + updatePreferencesAndWait(autofillProfileFragment, addProfile, + new String[] {"Mike Doe"}, R.id.editor_dialog_done_button, true); activity.finish(); } @@ -163,33 +134,21 @@ PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); AutofillProfileEditorPreference sebProfile = (AutofillProfileEditorPreference) fragment.findPreference("Seb Doe"); - Assert.assertTrue(sebProfile != null); + Assert.assertNotNull(sebProfile); Assert.assertEquals("Seb Doe", sebProfile.getTitle()); // Delete a profile. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PreferencesTest.clickPreference(autofillProfileFragment, sebProfile); - rule.setEditorDialog( - ((AutofillProfileEditorPreference) sebProfile).getEditorDialog()); - try { - rule.clickInEditorAndWait(R.id.delete_menu_id); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - }); - // Check if the preferences are updated correctly. - rule.waitForThePreferenceUpdate(); + updatePreferencesAndWait(autofillProfileFragment, sebProfile, null, + R.id.delete_menu_id, false); + Assert.assertEquals(5 /* One toggle + one add button + three profile. */, autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); AutofillProfileEditorPreference remainedProfile = (AutofillProfileEditorPreference) fragment.findPreference("John Doe"); - Assert.assertTrue(remainedProfile != null); + Assert.assertNotNull(remainedProfile); AutofillProfileEditorPreference deletedProfile = (AutofillProfileEditorPreference) fragment.findPreference("Seb Doe"); - Assert.assertTrue(deletedProfile == null); + Assert.assertNull(deletedProfile); activity.finish(); } @@ -209,37 +168,25 @@ PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); AutofillProfileEditorPreference johnProfile = (AutofillProfileEditorPreference) fragment.findPreference("John Doe"); - Assert.assertTrue(johnProfile != null); + Assert.assertNotNull(johnProfile); Assert.assertEquals("John Doe", johnProfile.getTitle()); // Edit a profile. - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - PreferencesTest.clickPreference(autofillProfileFragment, johnProfile); - rule.setEditorDialog( - ((AutofillProfileEditorPreference) johnProfile).getEditorDialog()); - try { - rule.setTextInEditorAndWait( - new String[] {"Emily Doe", "Google", "111 Edited St", "Los Angeles", - "CA", "90291", "650-253-0000", "edit@profile.com"}); - rule.clickInEditorAndWait(R.id.editor_dialog_done_button); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - }); + updatePreferencesAndWait(autofillProfileFragment, johnProfile, + new String[] {"Emily Doe", "Google", "111 Edited St", "Los Angeles", + "CA", "90291", "650-253-0000", "edit@profile.com"}, + R.id.editor_dialog_done_button, false); + // Check if the preferences are updated correctly. - rule.waitForThePreferenceUpdate(); Assert.assertEquals(6 /* One toggle + one add button + four profiles. */, autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); AutofillProfileEditorPreference editedProfile = (AutofillProfileEditorPreference) fragment.findPreference("Emily Doe"); - Assert.assertTrue(editedProfile != null); + Assert.assertNotNull(editedProfile); Assert.assertEquals("111 Edited St, 90291", editedProfile.getSummary()); AutofillProfileEditorPreference oldProfile = (AutofillProfileEditorPreference) fragment.findPreference("John Doe"); - Assert.assertTrue(oldProfile == null); + Assert.assertNull(oldProfile); activity.finish(); } @@ -259,21 +206,13 @@ PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); AutofillProfileEditorPreference bobProfile = (AutofillProfileEditorPreference) fragment.findPreference("Bob Doe"); - Assert.assertTrue(bobProfile != null); + Assert.assertNotNull(bobProfile); Assert.assertEquals("Bob Doe", bobProfile.getTitle()); // Open the profile. - ThreadUtils.runOnUiThreadBlocking(() -> { - PreferencesTest.clickPreference(autofillProfileFragment, bobProfile); - rule.setEditorDialog(((AutofillProfileEditorPreference) bobProfile).getEditorDialog()); - try { - rule.clickInEditorAndWait(R.id.editor_dialog_done_button); - } catch (Exception ex) { - ex.printStackTrace(); - Assert.assertTrue(false); - } - }); - rule.waitForThePreferenceUpdate(); + updatePreferencesAndWait(autofillProfileFragment, bobProfile, null, + R.id.editor_dialog_done_button, false); + Assert.assertEquals(6 /* One toggle + one add button + four profiles. */, autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); activity.finish(); @@ -295,22 +234,14 @@ PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); AutofillProfileEditorPreference billProfile = (AutofillProfileEditorPreference) fragment.findPreference("Bill Doe"); - Assert.assertTrue(billProfile != null); + Assert.assertNotNull(billProfile); Assert.assertEquals("Bill Doe", billProfile.getTitle()); // Open the profile. - ThreadUtils.runOnUiThreadBlocking(() -> { - PreferencesTest.clickPreference(autofillProfileFragment, billProfile); - rule.setEditorDialog(((AutofillProfileEditorPreference) billProfile).getEditorDialog()); - try { - rule.clickInEditorAndWait(R.id.editor_dialog_done_button); - } catch (Exception ex) { - ex.printStackTrace(); - Assert.assertTrue(false); - } - }); + updatePreferencesAndWait(autofillProfileFragment, billProfile, null, + R.id.editor_dialog_done_button, false); + // Check if the preferences are updated correctly. - rule.waitForThePreferenceUpdate(); Assert.assertEquals(6 /* One toggle + one add button + four profiles. */, autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); } @@ -318,7 +249,7 @@ @Test @MediumTest @Feature({"Preferences"}) - public void testKeyboardShownOnDpadCenter() { + public void testKeyboardShownOnDpadCenter() throws TimeoutException, InterruptedException { Preferences activity = PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(), AutofillProfilesFragment.class.getName()); @@ -330,10 +261,9 @@ Assert.assertNotNull(addProfile); // Open AutofillProfileEditorPreference. - ThreadUtils.runOnUiThreadBlocking(() -> { - PreferencesTest.clickPreference(fragment, addProfile); - rule.setEditorDialog(addProfile.getEditorDialog()); - }); + ThreadUtils.runOnUiThreadBlocking( + () -> PreferencesTest.clickPreference(fragment, addProfile)); + rule.setEditorDialogAndWait(addProfile.getEditorDialog()); // The keyboard is shown as soon as AutofillProfileEditorPreference comes into view. waitForKeyboardStatus(true, activity); @@ -346,13 +276,11 @@ waitForKeyboardStatus(false, activity); // Send a d-pad key event to one of the text fields - ThreadUtils.runOnUiThreadBlocking(() -> { - try { - rule.sendKeycodeToTextFieldInEditorAndWait(KeyEvent.KEYCODE_DPAD_CENTER, 0); - } catch (Exception ex) { - ex.printStackTrace(); - } - }); + try { + rule.sendKeycodeToTextFieldInEditorAndWait(KeyEvent.KEYCODE_DPAD_CENTER, 0); + } catch (Exception ex) { + ex.printStackTrace(); + } // Check that the keyboard was shown. waitForKeyboardStatus(true, activity); activity.finish(); @@ -365,8 +293,24 @@ public boolean isSatisfied() { return keyboardVisible == UiUtils.isKeyboardShowing( - activity, activity.findViewById(android.R.id.content)); + activity, activity.findViewById(android.R.id.content)); } }); } -} + + private void updatePreferencesAndWait(AutofillProfilesFragment profileFragment, + AutofillProfileEditorPreference profile, String[] values, int buttonId, + boolean waitForError) throws TimeoutException, InterruptedException { + ThreadUtils.runOnUiThreadBlocking( + () -> PreferencesTest.clickPreference(profileFragment, profile)); + + rule.setEditorDialogAndWait(profile.getEditorDialog()); + if (values != null) rule.setTextInEditorAndWait(values); + if (waitForError) { + rule.clickInEditorAndWaitForValidationError(buttonId); + } else { + rule.clickInEditorAndWait(buttonId); + rule.waitForThePreferenceUpdate(); + } + } +} \ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java index 6979570e..5e9c7f1d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java
@@ -50,16 +50,16 @@ protected void clickInEditorAndWait(final int resourceId) throws InterruptedException, TimeoutException { int callCount = mClickUpdate.getCallCount(); - ThreadUtils.runOnUiThreadBlocking( - (Runnable) () -> mEditorDialog.findViewById(resourceId).performClick()); + ThreadUtils.runOnUiThreadBlockingNoException( + () -> mEditorDialog.findViewById(resourceId).performClick()); mClickUpdate.waitForCallback(callCount); } protected void clickInEditorAndWaitForValidationError(final int resourceId) throws InterruptedException, TimeoutException { int callCount = mValidationUpdate.getCallCount(); - ThreadUtils.runOnUiThreadBlocking( - (Runnable) () -> mEditorDialog.findViewById(resourceId).performClick()); + ThreadUtils.runOnUiThreadBlockingNoException( + () -> mEditorDialog.findViewById(resourceId).performClick()); mValidationUpdate.waitForCallback(callCount); } @@ -80,8 +80,11 @@ mPreferenceUpdate.waitForCallback(callCount); } - protected void setEditorDialog(EditorDialog editorDialog) { + protected void setEditorDialogAndWait(EditorDialog editorDialog) + throws TimeoutException, InterruptedException { + int callCount = mClickUpdate.getCallCount(); mEditorDialog = editorDialog; + mClickUpdate.waitForCallback(callCount); } @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarkNodeUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarkNodeUnitTest.java index 3f0ba3dd..9f49ce2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarkNodeUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarkNodeUnitTest.java
@@ -25,7 +25,7 @@ @RunWith(BaseJUnit4ClassRunner.class) public class ProviderBookmarkNodeUnitTest { Random mGenerator = new Random(); - byte[][] mImageBlobs = null; + byte[][] mImageBlobs; @Before public void setUp() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java index 0a5c04f..b5ba65d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java
@@ -13,13 +13,9 @@ import org.junit.runner.RunWith; import org.chromium.base.ThreadUtils; -import org.chromium.base.test.params.ParameterAnnotations; -import org.chromium.base.test.params.ParameterSet; -import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.ntp.NewTabPage; @@ -30,51 +26,27 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.ChromeActivityTestRule; -import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.NewTabPageTestUtils; -import org.chromium.chrome.test.util.browser.Features; - -import java.util.Arrays; -import java.util.List; /** * Misc. Content Suggestions instrumentation tests. */ -@RunWith(ParameterizedRunner.class) -@ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) +@RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class ContentSuggestionsTest { @Rule public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); - @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = - Arrays.asList(new ParameterSet().value(false).name("DisableExpandableHeader"), - new ParameterSet().value(true).name("EnableExpandableHeader")); - - private final boolean mEnableExpandableHeader; - - public ContentSuggestionsTest(boolean enableExpandableHeader) { - mEnableExpandableHeader = enableExpandableHeader; - } - @Before public void setUp() throws InterruptedException { - if (mEnableExpandableHeader) { - Features.getInstance().enable( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER); - } else { - Features.getInstance().disable( - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER); - } mActivityTestRule.startMainActivityOnBlankPage(); } @Test @SmallTest @Feature("Suggestions") - @CommandLineFlags.Add("enable-features=ContentSuggestionsSettings") public void testRemoteSuggestionsEnabled() throws InterruptedException { NewTabPage ntp = loadNTPWithSearchSuggestState(true); SuggestionsUiDelegate uiDelegate = ntp.getManagerForTesting(); @@ -85,12 +57,11 @@ @Test @SmallTest @Feature("Suggestions") - @CommandLineFlags.Add("enable-features=ContentSuggestionsSettings") public void testRemoteSuggestionsDisabled() throws InterruptedException { NewTabPage ntp = loadNTPWithSearchSuggestState(false); SuggestionsUiDelegate uiDelegate = ntp.getManagerForTesting(); - // If header is expandable, category should still be enabled. - Assert.assertEquals(mEnableExpandableHeader, + // Since header is expandable, category should still be enabled. + Assert.assertEquals(true, isCategoryEnabled(uiDelegate.getSuggestionsSource(), KnownCategories.ARTICLES)); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/SuggestionsSheetVisibilityChangeObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/SuggestionsSheetVisibilityChangeObserverTest.java index 340154cf..6bcc4c0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/SuggestionsSheetVisibilityChangeObserverTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/SuggestionsSheetVisibilityChangeObserverTest.java
@@ -204,7 +204,7 @@ private static class SelfVerifyingCallbackHelper extends CallbackHelper { private final String mName; - private int mVerifiedCallCount = 0; + private int mVerifiedCallCount; public SelfVerifyingCallbackHelper(String name) { mName = name;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java index 90b682e5..65e2651 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java
@@ -49,7 +49,7 @@ public EmbeddedTestServerRule mTestServerRule = new EmbeddedTestServerRule(); private static final int TEST_TIMEOUT = 3000; - private boolean mIsTabFullscreen = false; + private boolean mIsTabFullscreen; private ChromeActivity mActivity; private class FullscreenTabObserver extends EmptyTabObserver {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java index 5eec5a4..70d2171 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java
@@ -15,7 +15,7 @@ public class MockVrCoreVersionChecker extends VrCoreVersionChecker { private boolean mUseActualImplementation; private VrCoreInfo mMockReturnValue = new VrCoreInfo(null, VrCoreCompatibility.VR_READY); - private VrCoreInfo mLastReturnValue = null; + private VrCoreInfo mLastReturnValue; @Override public VrCoreInfo getVrCoreInfo() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java index f2f6e8d..0183aed 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -70,7 +70,7 @@ */ private static class TestWebApkUpdateManager extends WebApkUpdateManager { private CallbackHelper mWaiter; - private boolean mNeedsUpdate = false; + private boolean mNeedsUpdate; public TestWebApkUpdateManager(CallbackHelper waiter, WebappDataStorage storage) { super(storage);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java index d26fbf89..f3a58293 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
@@ -71,7 +71,7 @@ */ @Implements(BackupManager.class) public static class BackupManagerShadow { - private static int sDataChangedCalls = 0; + private static int sDataChangedCalls; public static int getDataChangedCalls() { return sDataChangedCalls; @@ -383,7 +383,7 @@ byte[] unameBytes = ApiCompatibilityUtils.getBytesUtf8("user1"); final byte[][] values = {{0}, {1}, {1}, {23, 42}, unameBytes}; when(backupData.getKey()).thenAnswer(new Answer<String>() { - private int mPos = 0; + private int mPos; @Override public String answer(InvocationOnMock invocation) throws Throwable { @@ -392,7 +392,7 @@ }); when(backupData.getDataSize()).thenAnswer(new Answer<Integer>() { - private int mPos = 0; + private int mPos; @Override public Integer answer(InvocationOnMock invocation) throws Throwable { @@ -402,7 +402,7 @@ when(backupData.readEntityData(any(byte[].class), anyInt(), anyInt())) .thenAnswer(new Answer<Integer>() { - private int mPos = 0; + private int mPos; @Override public Integer answer(InvocationOnMock invocation) throws Throwable { @@ -415,7 +415,7 @@ }); when(backupData.readNextHeader()).thenAnswer(new Answer<Boolean>() { - private int mPos = 0; + private int mPos; @Override public Boolean answer(InvocationOnMock invocation) throws Throwable {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetControllerTest.java index 0f8c5452..33acda2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AccessorySheetControllerTest.java
@@ -13,7 +13,7 @@ import static org.mockito.Mockito.when; import android.support.v4.view.ViewPager; -import android.view.ViewStub; +import android.view.ViewGroup; import org.junit.Before; import org.junit.Test; @@ -30,6 +30,7 @@ import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.Tab; import org.chromium.chrome.browser.modelutil.ListObservable; import org.chromium.chrome.browser.modelutil.PropertyObservable; +import org.chromium.chrome.test.util.browser.modelutil.FakeViewProvider; /** * Controller tests for the keyboard accessory bottom sheet component. @@ -43,8 +44,6 @@ @Mock private ListObservable.ListObserver<Void> mTabListObserver; @Mock - private ViewStub mMockViewStub; - @Mock private ViewPager mMockView; private final Tab[] mTabs = @@ -59,8 +58,9 @@ public void setUp() { ShadowRecordHistogram.reset(); MockitoAnnotations.initMocks(this); - when(mMockViewStub.inflate()).thenReturn(mMockView); - mCoordinator = new AccessorySheetCoordinator(mMockViewStub, /*unused*/ () -> null); + when(mMockView.getLayoutParams()).thenReturn(new ViewGroup.LayoutParams(0, 0)); + mCoordinator = + new AccessorySheetCoordinator(new FakeViewProvider<>(mMockView)); mMediator = mCoordinator.getMediatorForTesting(); mModel = mMediator.getModelForTesting(); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryControllerTest.java index 280c0773..61a7f9f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryControllerTest.java
@@ -9,16 +9,14 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION; import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC; -import android.view.ViewStub; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,6 +32,7 @@ import org.chromium.chrome.browser.autofill.keyboard_accessory.KeyboardAccessoryData.PropertyProvider; import org.chromium.chrome.browser.modelutil.ListObservable; import org.chromium.chrome.browser.modelutil.PropertyObservable.PropertyObserver; +import org.chromium.chrome.test.util.browser.modelutil.FakeViewProvider; /** * Controller tests for the keyboard accessory component. @@ -51,8 +50,6 @@ @Mock private KeyboardAccessoryCoordinator.VisibilityDelegate mMockVisibilityDelegate; @Mock - private ViewStub mMockViewStub; - @Mock private KeyboardAccessoryView mMockView; private final KeyboardAccessoryData.Tab mTestTab = @@ -66,8 +63,9 @@ public void setUp() { ShadowRecordHistogram.reset(); MockitoAnnotations.initMocks(this); - when(mMockViewStub.inflate()).thenReturn(mMockView); - mCoordinator = new KeyboardAccessoryCoordinator(mMockViewStub, mMockVisibilityDelegate); + + mCoordinator = new KeyboardAccessoryCoordinator( + mMockVisibilityDelegate, new FakeViewProvider<>(mMockView)); mMediator = mCoordinator.getMediatorForTesting(); mModel = mMediator.getModelForTesting(); } @@ -144,7 +142,7 @@ } @Test - public void testModelDoesntNotifyUnchangedData() { + public void testModelDoesntNotifyUnchangedVisibility() { mModel.addObserver(mMockPropertyObserver); // Setting the visibility on the model should make it propagate that it's visible. @@ -161,6 +159,27 @@ } @Test + public void testModelDoesntNotifyUnchangedActiveTab() { + mModel.addObserver(mMockPropertyObserver); + + assertThat(mModel.activeTab(), is(nullValue())); + mModel.setActiveTab(null); + assertThat(mModel.activeTab(), is(nullValue())); + verify(mMockPropertyObserver, never()) + .onPropertyChanged(mModel, KeyboardAccessoryModel.PropertyKey.ACTIVE_TAB); + + mModel.setActiveTab(0); + assertThat(mModel.activeTab(), is(0)); + verify(mMockPropertyObserver) + .onPropertyChanged(mModel, KeyboardAccessoryModel.PropertyKey.ACTIVE_TAB); + + mModel.setActiveTab(0); + assertThat(mModel.activeTab(), is(0)); + verify(mMockPropertyObserver) + .onPropertyChanged(mModel, KeyboardAccessoryModel.PropertyKey.ACTIVE_TAB); + } + + @Test public void testIsVisibleWithSuggestionsBeforeKeyboardComesUp() { KeyboardAccessoryData.PropertyProvider<Action> autofillSuggestionProvider = new KeyboardAccessoryData.PropertyProvider<>(AUTOFILL_SUGGESTION);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java index c8e1d34..97cdbfd 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
@@ -24,7 +24,7 @@ import android.graphics.drawable.Drawable; import android.support.annotation.Nullable; -import android.view.ViewStub; +import android.support.v4.view.ViewPager; import org.junit.Before; import org.junit.Rule; @@ -50,6 +50,7 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.chrome.test.util.browser.modelutil.FakeViewProvider; import org.chromium.ui.base.WindowAndroid; import java.lang.ref.WeakReference; @@ -68,9 +69,9 @@ @Mock private ChromeActivity mMockActivity; @Mock - private ViewStub mMockViewStub; + private KeyboardAccessoryView mMockKeyboardAccessoryView; @Mock - private KeyboardAccessoryView mMockView; + private ViewPager mMockViewPager; @Mock private ListObservable.ListObserver<Void> mMockTabListObserver; @Mock @@ -92,7 +93,6 @@ public void setUp() { ShadowRecordHistogram.reset(); MockitoAnnotations.initMocks(this); - when(mMockViewStub.inflate()).thenReturn(mMockView); when(mMockWindow.getActivity()).thenReturn(new WeakReference<>(mMockActivity)); when(mMockActivity.getTabModelSelector()).thenReturn(mMockTabModelSelector); mFullScreenManager = new ChromeFullscreenManager(mMockActivity, 0); @@ -100,7 +100,9 @@ when(mMockActivity.getResources()).thenReturn(mMockResources); when(mMockResources.getDimensionPixelSize(anyInt())).thenReturn(48); PasswordAccessorySheetCoordinator.IconProvider.getInstance().setIconForTesting(mMockIcon); - mController.initialize(mMockWindow, mMockViewStub, mMockViewStub); + mController.initialize(mMockWindow, + new FakeViewProvider<>(mMockKeyboardAccessoryView), + new FakeViewProvider<>(mMockViewPager)); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java index de3054d..a133985 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java
@@ -74,7 +74,7 @@ * Fake surface that lets us control whether it's valid or not. */ public static class MyFakeSurface extends Surface { - public boolean valid = false; + public boolean valid; @Override public boolean isValid() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index 44e9c32..76808c9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -178,7 +178,7 @@ private static class TestTabModel extends EmptyTabModel { private final List<Tab> mMockTabs = new ArrayList<>(); private int mMaxId = -1; - private int mIndex = 0; + private int mIndex; public void addTab(final String title) { mMaxId++;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedOfflineBridgeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedOfflineBridgeTest.java new file mode 100644 index 0000000..e3987230 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedOfflineBridgeTest.java
@@ -0,0 +1,47 @@ +// 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.feed; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.support.test.filters.SmallTest; + +import com.google.android.libraries.feed.api.knowncontent.ContentRemoval; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +/** Unit tests for {@link FeedOfflineBridge}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class FeedOfflineBridgeTest { + @Test + @SmallTest + public void testUserDrivenRemovalsOnlyMultiple() { + List<ContentRemoval> removals = new ArrayList<>(); + removals.add(new ContentRemoval("a", true)); + removals.add(new ContentRemoval("b", false)); + removals.add(new ContentRemoval("c", true)); + removals.add(new ContentRemoval("d", false)); + List<String> filtered = FeedOfflineBridge.takeUserDriveRemovalsOnly(removals); + assertEquals(2, filtered.size()); + assertTrue(filtered.contains("a")); + assertTrue(filtered.contains("c")); + } + + @Test + @SmallTest + public void testUserDrivenRemovalsOnlyEmpty() { + List<String> filtered = FeedOfflineBridge.takeUserDriveRemovalsOnly(new ArrayList<>()); + assertEquals(0, filtered.size()); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteControllerTest.java index a13701a..5cf8fd2f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteControllerTest.java
@@ -326,7 +326,7 @@ /** Shadow needed because getInstance() can't be mocked */ @Implements(MediaRouter.class) public static class ShadowMediaRouter { - public static MediaRouter sMediaRouter = null; + public static MediaRouter sMediaRouter; public static Callback sCallback; @Implementation
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java index 0c79c366..99f188a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java
@@ -384,7 +384,7 @@ void recordResultHistogram(int result) { } }; - resolver.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + resolver.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); ShadowApplication.runBackgroundTasks(); return delegate;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java index d0f512e..e4aa918 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java
@@ -8,7 +8,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; @@ -72,7 +71,7 @@ private CastMediaRouteProvider mRouteProvider; private CastSession mSession; private CastMessageHandler mMessageHandler; - private int mNumStopApplicationCalled = 0; + private int mNumStopApplicationCalled; private interface CheckedRunnable { void run() throws Exception; } @@ -98,7 +97,6 @@ .when(mRouteProvider) .getClients(); doNothing().when(mRouteProvider).onMessage(anyString(), anyString()); - doNothing().when(mRouteProvider).onMessageSentResult(anyBoolean(), anyInt()); } void setUpForAppMessageTest() throws JSONException {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcpTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcpTest.java new file mode 100644 index 0000000..a04c94a --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/LazyConstructionPropertyMcpTest.java
@@ -0,0 +1,166 @@ +// 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.modelutil; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.support.annotation.Nullable; +import android.view.View; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowLooper; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.modelutil.PropertyModel.BooleanPropertyKey; +import org.chromium.chrome.browser.modelutil.PropertyModel.IntPropertyKey; +import org.chromium.chrome.browser.modelutil.PropertyModel.ObjectPropertyKey; +import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor.ViewBinder; +import org.chromium.chrome.test.util.browser.modelutil.FakeViewProvider; + +/** + * Unit tests for LazyConstructionPropertyMcp. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class LazyConstructionPropertyMcpTest { + private static final BooleanPropertyKey VISIBILITY = new BooleanPropertyKey(); + private static final ObjectPropertyKey<String> STRING_PROPERTY = new ObjectPropertyKey<>(); + private static final IntPropertyKey INT_PROPERTY = new IntPropertyKey(); + private static final PropertyKey[] ALL_PROPERTIES = + new PropertyKey[] {VISIBILITY, STRING_PROPERTY, INT_PROPERTY}; + private PropertyModel mModel; + private FakeViewProvider<View> mViewProvider; + private @Nullable PropertyObservable.PropertyObserver<PropertyKey> mModelObserver; + + @Mock + private View mView; + @Mock + private ViewBinder<PropertyModel, View, PropertyKey> mViewBinder; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mModel = new PropertyModel(ALL_PROPERTIES); + mViewProvider = new FakeViewProvider<>(); + mModel.addObserver((source, propertyKey) -> { + // Forward model changes to the model observer if it exists. It's important for the test + // that the observer is notified before the LazyConstructionPropertyMcp. + if (mModelObserver != null) mModelObserver.onPropertyChanged(source, propertyKey); + }); + } + + @Test + public void testInitialConstruction() { + LazyConstructionPropertyMcp.create(mModel, VISIBILITY, mViewProvider, mViewBinder); + assertFalse(mViewProvider.inflationHasStarted()); + + mModel.setValue(VISIBILITY, true); + + assertTrue(mViewProvider.inflationHasStarted()); + mViewProvider.finishInflation(mView); + ShadowLooper.idleMainLooper(); + + verifyBind(VISIBILITY); + } + + @Test + public void testUpdatesBeforeInflation() { + LazyConstructionPropertyMcp.create(mModel, VISIBILITY, mViewProvider, mViewBinder); + mModel.setValue(STRING_PROPERTY, "foo"); + mModel.setValue(VISIBILITY, true); + assertTrue(mViewProvider.inflationHasStarted()); + mViewProvider.finishInflation(mView); + ShadowLooper.idleMainLooper(); + verifyBind(STRING_PROPERTY, VISIBILITY); + } + + @Test + public void testUpdatesWhileVisible() { + LazyConstructionPropertyMcp.create(mModel, VISIBILITY, mViewProvider, mViewBinder); + + // Show the view and pump the looper to do the initial bind. + mModel.setValue(VISIBILITY, true); + assertTrue(mViewProvider.inflationHasStarted()); + mViewProvider.finishInflation(mView); + ShadowLooper.idleMainLooper(); + verifyBind(VISIBILITY); + Mockito.<ViewBinder>reset(mViewBinder); + + mModel.setValue(INT_PROPERTY, 42); + verifyBind(INT_PROPERTY); + + mModel.setValue(VISIBILITY, false); + verifyBind(VISIBILITY); + } + + @Test + public void testUpdatesWhileHidden() { + LazyConstructionPropertyMcp.create(mModel, VISIBILITY, mViewProvider, mViewBinder); + + // Show the view and pump the looper to do the initial bind, then hide the view again. + mModel.setValue(VISIBILITY, true); + assertTrue(mViewProvider.inflationHasStarted()); + mViewProvider.finishInflation(mView); + ShadowLooper.idleMainLooper(); + verifyBind(VISIBILITY); + + mModel.setValue(VISIBILITY, false); + verify(mViewBinder, times(2)).bind(eq(mModel), eq(mView), eq(VISIBILITY)); + Mockito.<ViewBinder>reset(mViewBinder); + + // While the view is hidden, the binder should not be invoked. + mModel.setValue(STRING_PROPERTY, "foo"); + mModel.setValue(STRING_PROPERTY, "bar"); + verify(mViewBinder, never()) + .bind(any(PropertyModel.class), any(View.class), any(PropertyKey.class)); + + // When the view is shown, all pending updates should be dispatched, coalescing updates to + // the same property. + mModel.setValue(VISIBILITY, true); + verifyBind(VISIBILITY, STRING_PROPERTY); + } + + @Test + public void testReentrantUpdates() { + LazyConstructionPropertyMcp.create(mModel, VISIBILITY, mViewProvider, mViewBinder); + + // Increase INT_PROPERTY any time visibility changes. + mModelObserver = (source, propertyKey) -> { + if (propertyKey != VISIBILITY) return; + mModel.setValue(INT_PROPERTY, mModel.getValue(INT_PROPERTY) + 1); + }; + + mModel.setValue(VISIBILITY, true); + mViewProvider.finishInflation(mView); + ShadowLooper.idleMainLooper(); + verifyBind(VISIBILITY, INT_PROPERTY); + assertThat(mModel.getValue(INT_PROPERTY), is(1)); + Mockito.<ViewBinder>reset(mViewBinder); + + mModel.setValue(VISIBILITY, false); + verifyBind(INT_PROPERTY, VISIBILITY); + assertThat(mModel.getValue(INT_PROPERTY), is(2)); + } + + private void verifyBind(PropertyKey... properties) { + for (PropertyKey key : properties) { + verify(mViewBinder).bind(mModel, mView, key); + } + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/PropertyModelTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/PropertyModelTest.java index d5ded5b..b525de63 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/PropertyModelTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/modelutil/PropertyModelTest.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.modelutil; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.verify; @@ -23,6 +24,7 @@ import org.chromium.chrome.browser.modelutil.PropertyObservable.PropertyObserver; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -62,6 +64,17 @@ } @Test + public void getAllSetProperties() { + PropertyModel model = new PropertyModel( + BOOLEAN_PROPERTY_A, FLOAT_PROPERTY_A, INT_PROPERTY_A, OBJECT_PROPERTY_A); + model.setValue(BOOLEAN_PROPERTY_A, true); + model.setValue(INT_PROPERTY_A, 42); + Collection<PropertyKey> setProperties = model.getAllSetProperties(); + assertThat(setProperties, containsInAnyOrder(BOOLEAN_PROPERTY_A, INT_PROPERTY_A)); + assertThat(setProperties.size(), equalTo(2)); + } + + @Test public void booleanUpdates() { PropertyModel model = new PropertyModel(BOOLEAN_PROPERTY_A, BOOLEAN_PROPERTY_B);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java index 503dc302..64aa5adc 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
@@ -14,6 +14,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; @@ -65,6 +66,7 @@ import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; +import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver; @@ -98,7 +100,6 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class}) @DisableFeatures({ChromeFeatureList.CONTENT_SUGGESTIONS_SCROLL_TO_LOAD, - ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER, ChromeFeatureList.SIMPLIFIED_NTP, ChromeFeatureList.CHROME_DUET, ChromeFeatureList.UNIFIED_CONSENT}) public class NewTabPageAdapterTest { @@ -142,11 +143,6 @@ mSuggestions = suggestions; } - public SectionDescriptor withoutHeader() { - mHeader = false; - return this; - } - public SectionDescriptor withViewAllButton() { assertFalse(mProgressItem); mViewAllButton = true; @@ -738,6 +734,7 @@ @Test @Feature({"Ntp"}) public void testArticlesForYouSection() { + when(mPrefServiceBridge.getBoolean(eq(Pref.NTP_ARTICLES_LIST_VISIBLE))).thenReturn(true); // Show one section of suggestions from the test category, and one section with Articles for // You. List<SnippetArticle> suggestions = createDummySuggestions(3, TEST_CATEGORY); @@ -753,11 +750,11 @@ reloadNtp(); assertItemsFor(section(suggestions), section(articles)); - // Remove the test category section. The remaining lone Articles for You section should not + // Remove the test category section. The remaining lone Articles for You section should // have a header. mSource.setStatusForCategory(TEST_CATEGORY, CategoryStatus.NOT_PROVIDED); reloadNtp(); - assertItemsFor(section(articles).withoutHeader()); + assertItemsFor(section(articles)); } /**
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java index 20c4e95d..b50a6ee0e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
@@ -43,7 +43,6 @@ import org.chromium.base.Callback; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.snippets.CategoryInt; import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; import org.chromium.chrome.browser.ntp.snippets.KnownCategories; @@ -58,8 +57,6 @@ import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate; import org.chromium.chrome.test.support.DisableHistogramsRule; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.chrome.test.util.browser.suggestions.ContentSuggestionsTestUtils.CategoryInfoBuilder; import org.chromium.chrome.test.util.browser.suggestions.FakeSuggestionsSource; import org.chromium.net.NetworkChangeNotifier; @@ -72,7 +69,6 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) -@DisableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public class SectionListTest { @Rule public DisableHistogramsRule mDisableHistogramsRule = new DisableHistogramsRule(); @@ -327,17 +323,6 @@ @Test @Feature({"Ntp"}) - public void testArticlesHeaderHiddenWhenAlone() { - registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 1); - - SectionList sectionList = new SectionList(mUiDelegate, mOfflinePageBridge); - sectionList.refreshSuggestions(); - SuggestionsSection articles = sectionList.getSection(KnownCategories.ARTICLES); - assertFalse(articles.getHeaderItemForTesting().isVisible()); - } - - @Test - @Feature({"Ntp"}) public void testRandomSectionHeaderShownWhenAlone() { registerCategory(mSuggestionSource, CATEGORY1, 1); @@ -361,7 +346,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testArticlesHeaderShownWhenExplicitlyDisabled() { when(mPrefServiceBridge.getBoolean(ARTICLES_SECTION_ENABLED_PREF)).thenReturn(true); registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 0); @@ -378,7 +362,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testArticlesHeaderHiddenWhenDisabledByPolicy() { when(mPrefServiceBridge.getBoolean(ARTICLES_SECTION_ENABLED_PREF)).thenReturn(false); registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 0); @@ -393,7 +376,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testArticlesHeaderExpandableWithOtherSections() { registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 1); registerCategory(mSuggestionSource, CATEGORY1, 1); @@ -414,7 +396,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testSuggestionsVisibilityOnPreferenceChanged() { when(mPrefServiceBridge.getBoolean(ARTICLES_SECTION_ENABLED_PREF)).thenReturn(true); when(mPrefServiceBridge.getBoolean(EXPANDABLE_HEADER_PREF)).thenReturn(true);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java index c819328..5c51aee 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java
@@ -47,7 +47,6 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.modelutil.ListObservable; import org.chromium.chrome.browser.modelutil.ListObservable.ListObserver; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder.PartialBindCallback; @@ -64,8 +63,6 @@ import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate; import org.chromium.chrome.test.support.DisableHistogramsRule; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.chrome.test.util.browser.offlinepages.FakeOfflinePageBridge; import org.chromium.chrome.test.util.browser.suggestions.ContentSuggestionsTestUtils.CategoryInfoBuilder; import org.chromium.chrome.test.util.browser.suggestions.FakeSuggestionsSource; @@ -84,7 +81,6 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) -@DisableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public class SuggestionsSectionTest { @Rule public DisableHistogramsRule mDisableHistogramsRule = new DisableHistogramsRule(); @@ -335,7 +331,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testExpandableHeaderNoSuggestions() { // Set to the collapsed state initially. when(mPrefServiceBridge.getBoolean(eq(EXPANDABLE_HEADER_PREF))).thenReturn(false); @@ -366,7 +361,6 @@ @Test @Feature({"Ntp"}) - @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) public void testExpandableHeaderWithSuggestions() { // Set to the expanded state initially. when(mPrefServiceBridge.getBoolean(eq(EXPANDABLE_HEADER_PREF))).thenReturn(true);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java index a317201..772a0f2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java
@@ -187,7 +187,7 @@ /** A shadow/wrapper of android.os.Environment that allows injecting a test directory. */ @Implements(Environment.class) public static class WrappedEnvironment { - private static File sDataDirectory = null; + private static File sDataDirectory; public static void setDataDirectoryForTest(File testDirectory) { sDataDirectory = testDirectory;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java index e0f5624..3dde9b1 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java
@@ -92,8 +92,8 @@ "CAEQDLoBJAoeChExMToxMToxMToxMToxMToxMRD___________8BGAEgCroBJAoeChExMToxMToxMToxMTox" + "MToxMxDi__________8BGAAgHroBEBIKCAMQChgLIAwoDRgBIAq6ARASCggBEBQYFSAWKBcYACAU"; - private static int sRefreshVisibleNetworksRequests = 0; - private static int sRefreshLastKnownLocation = 0; + private static int sRefreshVisibleNetworksRequests; + private static int sRefreshLastKnownLocation; @Rule public TestRule mFeatureProcessor = new Features.JUnitProcessor();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java index 3c3f2a4..de51336 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
@@ -191,7 +191,7 @@ private static class FakeSystemSettingsActivityRequiredListener implements SystemSettingsActivityRequiredListener { - int mCallCount = 0; + int mCallCount; Intent mIntentOverride; @Override
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index a57c6612..21b93c7 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-71.0.3541.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-71.0.3543.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java index 893690a7..4a486bf 100644 --- a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java +++ b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java
@@ -39,7 +39,7 @@ private WebApkServiceConnectionManager mConnectionManager; private class TestCallback implements WebApkServiceConnectionManager.ConnectionCallback { - public boolean mGotResult = false; + public boolean mGotResult; @Override public void onConnected(IBinder service) {
diff --git a/chrome/android/webapk/shell_apk/javatests/dex_optimizer/src/org/chromium/webapk/shell_apk/test/dex_optimizer/DexOptimizerServiceImpl.java b/chrome/android/webapk/shell_apk/javatests/dex_optimizer/src/org/chromium/webapk/shell_apk/test/dex_optimizer/DexOptimizerServiceImpl.java index 4034361..a80de898 100644 --- a/chrome/android/webapk/shell_apk/javatests/dex_optimizer/src/org/chromium/webapk/shell_apk/test/dex_optimizer/DexOptimizerServiceImpl.java +++ b/chrome/android/webapk/shell_apk/javatests/dex_optimizer/src/org/chromium/webapk/shell_apk/test/dex_optimizer/DexOptimizerServiceImpl.java
@@ -18,7 +18,7 @@ * Service which extracts a dex file from parent APK and optimizes it. */ public class DexOptimizerServiceImpl extends Service { - private static int sCounter = 0; + private static int sCounter; public IBinder onBind(Intent intent) { return new IDexOptimizerService.Stub() {
diff --git a/chrome/app/DEPS b/chrome/app/DEPS index a0a479c..ffae30da 100644 --- a/chrome/app/DEPS +++ b/chrome/app/DEPS
@@ -2,7 +2,6 @@ "+chrome/browser", "+chrome/child", "+chrome/chrome_watcher", - "+chrome/common/chrome_features.h", "+chrome/installer/util", "+chrome/install_static", "+chrome/gpu/chrome_content_gpu_client.h",
diff --git a/chrome/app/OWNERS b/chrome/app/OWNERS index dc1a782..77d5e10e 100644 --- a/chrome/app/OWNERS +++ b/chrome/app/OWNERS
@@ -12,6 +12,7 @@ per-file bookmarks_strings.grdp=* per-file chromeos_strings.grdp=* per-file chromium_strings.grd=* +per-file file_manager_strings.grdp=* per-file generated_resources.grd=* per-file google_chrome_strings.grd=* per-file md_extensions_strings.grdp=*
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc index 9ff5892..6847811b 100644 --- a/chrome/app/chrome_main.cc +++ b/chrome/app/chrome_main.cc
@@ -88,12 +88,13 @@ const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); ALLOW_UNUSED_LOCAL(command_line); +#if defined(OS_MACOSX) + SetUpBundleOverrides(); +#endif + // Chrome-specific process modes. #if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) if (command_line->HasSwitch(switches::kHeadless)) { -#if defined(OS_MACOSX) - SetUpBundleOverrides(); -#endif return headless::HeadlessShellMain(params); } #endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 4756bd8..504d056 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -535,7 +535,6 @@ const bool is_browser = !command_line.HasSwitch(switches::kProcessType); ObjcEvilDoers::ZombieEnable(true, is_browser ? 10000 : 1000); - SetUpBundleOverrides(); chrome::common::mac::EnableCFBundleBlocker(); #endif @@ -734,7 +733,7 @@ CHECK(command_line.HasSwitch(switches::kProcessType) && !process_type.empty()) << "Helper application requires --type."; - } else { + } else if (base::mac::AmIBundled()) { CHECK(!command_line.HasSwitch(switches::kProcessType) && process_type.empty()) << "Main application forbids --type, saw " << process_type; @@ -1107,10 +1106,6 @@ command_line.GetSwitchValueASCII(switches::kProcessType); DCHECK(process_type.empty()); -#if defined(OS_MACOSX) - SetUpBundleOverrides(); -#endif - base::FilePath resources_pack_path; base::PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); @@ -1162,15 +1157,5 @@ // Initialize NSApplication using the custom subclass. chrome_browser_application_mac::RegisterBrowserCrApp(); - - if (l10n_util::GetLocaleOverride().empty()) { - // The browser process only wants to support the language Cocoa will use, - // so force the app locale to be overridden with that value. This must - // happen before the ResourceBundle is loaded, which happens in - // ChromeBrowserMainParts::PreEarlyInitialization(). - // Don't do this if the locale is already set, which is done by integration - // tests to ensure tests always run with the same locale. - l10n_util::OverrideLocaleWithCocoaLocale(); - } #endif }
diff --git a/chrome/app/file_manager_strings.grdp b/chrome/app/file_manager_strings.grdp index 9efa129..fe623b2 100644 --- a/chrome/app/file_manager_strings.grdp +++ b/chrome/app/file_manager_strings.grdp
@@ -510,6 +510,9 @@ <message name="IDS_FILE_BROWSER_MANAGE_IN_DRIVE_BUTTON_LABEL" desc="Menu item's label, showing dialog to open the selected Google Drive files in the Drive webpage for managing sharing permissions, etc."> Manage in Drive </message> + <message name="IDS_FILE_BROWSER_SHARE_WITH_LINUX_BUTTON_LABEL" desc="Label for menu that will share a folder with the crostini Linux container."> + Share with Linux + </message> <message name="IDS_FILE_BROWSER_TOGGLE_HIDDEN_FILES_COMMAND_LABEL" desc="Label for menu or button with checkmark that toggles visibility of hidden files."> Show hidden files </message>
diff --git a/chrome/app/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_WITH_LINUX_BUTTON_LABEL.png.sha1 b/chrome/app/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_WITH_LINUX_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..9c8be623 --- /dev/null +++ b/chrome/app/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_WITH_LINUX_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +a707c6a17ce7728a5365a39517ff256614c97dda \ No newline at end of file
diff --git a/chrome/app/file_manager_strings_grdp/OWNERS b/chrome/app/file_manager_strings_grdp/OWNERS new file mode 100644 index 0000000..06c360cc --- /dev/null +++ b/chrome/app/file_manager_strings_grdp/OWNERS
@@ -0,0 +1 @@ +per-file *.png.sha1=* \ No newline at end of file
diff --git a/chrome/app/file_manager_strings_grdp/README.md b/chrome/app/file_manager_strings_grdp/README.md new file mode 100644 index 0000000..f013bb5 --- /dev/null +++ b/chrome/app/file_manager_strings_grdp/README.md
@@ -0,0 +1,5 @@ +This directory of image SHA-1 hashes is used to improve translations of UI +strings through context images for translators. + +See also: [Chrome Translation Screenshots - Instructions & FAQ +](https://docs.google.com/document/d/1nwYWDny20icMSpLUuV_LgrlbWKrYpbXOERUIZNH636o/edit#heading=h.2t7lc4cxo2au) \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_EVENT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_EVENT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1 new file mode 100644 index 0000000..5d350bd --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_EVENT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1
@@ -0,0 +1 @@ +e120525de2a07dfa4091cc1fc252e16625828e4c \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_BUG_LINK_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_BUG_LINK_LABEL.png.sha1 new file mode 100644 index 0000000..a92f7cb --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_BUG_LINK_LABEL.png.sha1
@@ -0,0 +1 @@ +37cc682c83b12044f55b21bf5fc67e517985d8ff \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_EVENT_LOG_LOCAL_LOG_ID.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_EVENT_LOG_LOCAL_LOG_ID.png.sha1 new file mode 100644 index 0000000..32fa796 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_EVENT_LOG_LOCAL_LOG_ID.png.sha1
@@ -0,0 +1 @@ +9e5f4d3965e8e95d610313234e475d2a99fb1992 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_ACTIVELY_UPLOADED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_ACTIVELY_UPLOADED_MESSAGE.png.sha1 new file mode 100644 index 0000000..c23d2d3 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_ACTIVELY_UPLOADED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +553ba1645012ee83d06343ab9671000e65bc3ad6 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_FAILED_UPLOAD_TIME_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_FAILED_UPLOAD_TIME_FORMAT.png.sha1 new file mode 100644 index 0000000..dfed707 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_FAILED_UPLOAD_TIME_FORMAT.png.sha1
@@ -0,0 +1 @@ +5dd950142b877f1ffebe0ed66d3c1e31573b96dc \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_HEADER_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_HEADER_FORMAT.png.sha1 new file mode 100644 index 0000000..8f56ce2 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_HEADER_FORMAT.png.sha1
@@ -0,0 +1 @@ +0b0a23c584c57dfa8f3fc5a2b3e83c5c43bb0495 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_LOCAL_FILE_LABEL_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_LOCAL_FILE_LABEL_FORMAT.png.sha1 new file mode 100644 index 0000000..c7ce7f1 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_LOCAL_FILE_LABEL_FORMAT.png.sha1
@@ -0,0 +1 @@ +ab8dce5c18d50ea9612e6c5c5dcc86a37d0ac2b3 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_NOT_UPLOADED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_NOT_UPLOADED_MESSAGE.png.sha1 new file mode 100644 index 0000000..0e0d889 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_NOT_UPLOADED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +77171881bddf6bb3338ece455bff6a2c414a80ee \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_PENDING_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_PENDING_MESSAGE.png.sha1 new file mode 100644 index 0000000..052bc7b --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_PENDING_MESSAGE.png.sha1
@@ -0,0 +1 @@ +e16a6608536f2dffc11bce7c8f65ed60bcda74a3 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_REPORT_ID_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_REPORT_ID_FORMAT.png.sha1 new file mode 100644 index 0000000..91dee100 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_REPORT_ID_FORMAT.png.sha1
@@ -0,0 +1 @@ +640bb9c4d5fb0d8eddee084f11953aea3a425600 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_UPLOAD_TIME_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_UPLOAD_TIME_FORMAT.png.sha1 new file mode 100644 index 0000000..92d461b --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_LOG_UPLOAD_TIME_FORMAT.png.sha1
@@ -0,0 +1 @@ +cd21d56cc0e66db6c4c276b52ee95d7fb64088b2 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_EVENT_LOGS_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_EVENT_LOGS_MESSAGE.png.sha1 new file mode 100644 index 0000000..6e8bd0c --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_EVENT_LOGS_MESSAGE.png.sha1
@@ -0,0 +1 @@ +ce84199ddb461898eb2cac8a3e798845cc73f901 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_LOCAL_LOG_FILE_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_LOCAL_LOG_FILE_MESSAGE.png.sha1 new file mode 100644 index 0000000..b7a1303 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_LOCAL_LOG_FILE_MESSAGE.png.sha1
@@ -0,0 +1 @@ +4bd75f37197e424a44fa1b5848e686272001f98a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_TEXT_LOGS_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_TEXT_LOGS_MESSAGE.png.sha1 new file mode 100644 index 0000000..9d9b865a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_NO_TEXT_LOGS_MESSAGE.png.sha1
@@ -0,0 +1 @@ +062c03d014a4ac78e0cbeb2f46dbc521e6a402ec \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_TITLE.png.sha1 new file mode 100644 index 0000000..2bf8744 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_LOGS_TITLE.png.sha1
@@ -0,0 +1 @@ +6b875f9b5b4588aee727dd3424f41b9673ce11e4 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBRTC_TEXT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBRTC_TEXT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1 new file mode 100644 index 0000000..37e95ac --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBRTC_TEXT_LOGS_LOG_COUNT_BANNER_FORMAT.png.sha1
@@ -0,0 +1 @@ +53989d766eaa37069b09d3e432847d8925985c67 \ No newline at end of file
diff --git a/chrome/app/printing_strings.grdp b/chrome/app/printing_strings.grdp index cda2cd9..c3d8dd6 100644 --- a/chrome/app/printing_strings.grdp +++ b/chrome/app/printing_strings.grdp
@@ -306,6 +306,9 @@ <message name="IDS_PRINT_PREVIEW_RESOLVE_EXTENSION_USB_ERROR_MESSAGE" desc="Message shown to the user when they attempt to select a USB pinter supported by an extension, but for which the extension does not yet have access permission. The message is shown if the user grants the extension access to the USB device (by confirming printer selection), but the extension is not able to retrieve information about the printer, and an error is reported. The message contains a placeholder for the name of the extension."> <ph name="EXTENSION_NAME">$1<ex>Print app</ex></ph> could not communicate with this printer. Make sure the printer is plugged in and try again. </message> + <message name="IDS_PRINT_PREVIEW_MANAGED_OPTION_TEXT" desc="Text shown when hovering over managed setting icon"> + This setting is managed + </message> <if expr="chromeos"> <message name="IDS_PRINT_CONFIGURING_IN_PROGRESS_TEXT" desc="Message shown to user while their printer is being setup in Chrome OS."> Setting up
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index e8be3a3..1427d88 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -8,8 +8,8 @@ <translation id="1170115874949214249">अपने फ़ोन पर क्रोमियम इंस्टॉल करें. हम आपके उस फ़ोन नंबर पर एक मैसेज (एसएमएस) भेजेंगे जिसे आपने अपना खाता वापस पाने के लिए सेट किया है.</translation> <translation id="1174473354587728743">कंप्यूटर शेयर करते हैं? अब आप क्रोमियम को जैसा चाहें वैसा सेट कर सकते हैं.</translation> <translation id="1185134272377778587">क्रोमियम के बारे में</translation> -<translation id="1209657686917656928">{0,plural, =0{अब क्रोमियम फिर से लॉन्च होगा}=1{क्रोमियम एक सेकंड में फिर से लॉन्च होगा}one{क्रोमियम # सेकंड में फिर से लॉन्च होगा}other{क्रोमियम # सेकंड में फिर से लॉन्च होगा}}</translation> -<translation id="1267419686153937460">{0,plural, =1{एक दिन के अंदर क्रोमियम को फिर से लॉन्च करें}one{# दिनों के अंदर क्रोमियम को फिर से लॉन्च करें}other{# दिनों के अंदर क्रोमियम को फिर से लॉन्च करें}}</translation> +<translation id="1209657686917656928">{0,plural, =0{क्रोमियम अब फिर से लॉन्च होगा}=1{क्रोमियम एक सेकंड में फिर से लॉन्च होगा}one{क्रोमियम # सेकंड में फिर से लॉन्च होगा}other{क्रोमियम # सेकंड में फिर से लॉन्च होगा}}</translation> +<translation id="1267419686153937460">{0,plural, =1{एक दिन के अंदर क्रोमियम को फिर से लॉन्च करेंkkk}one{# दिनों के अंदर क्रोमियम को फिर से लॉन्च करें}other{# दिनों के अंदर क्रोमियम को फिर से लॉन्च करें}}</translation> <translation id="1298199220304005244">क्रोमियम OS उपयोग करने के साथ सहायता प्राप्त करें</translation> <translation id="1396446129537741364">क्रोमियम पासवर्ड दिखाने का प्रयास कर रहा है.</translation> <translation id="1414495520565016063">आप क्रोमियम में प्रवेश हैं!</translation> @@ -77,7 +77,7 @@ <translation id="3582788516608077514">क्रोमियम अपडेट हो रहा है...</translation> <translation id="358997566136285270">क्रोमियम लोगो</translation> <translation id="3713809861844741608">नए क्रोमियम &टैब में लिंक खोलें</translation> -<translation id="3728336900324680424">क्रोमियम पता बार में सुझाव देने के लिए आपका 'डिस्क' एक्सेस करेगा</translation> +<translation id="3728336900324680424">पता बार में सुझाव देने के लिए क्रोमियम आपका 'डिस्क' एक्सेस करेगा</translation> <translation id="3762167353400286894">क्रोमियम OS इस भाषा में प्रदर्शित किया जा रहा है</translation> <translation id="378917192836375108">Google Chrome आपको वेब पर फ़ोन नंबर क्लिक करने और उसे Skype से कॉल करने की सुविधा देता है!</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - क्रोमियम</translation> @@ -147,7 +147,7 @@ <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> को क्रोमियम में जोड़ा गया</translation> <translation id="608189560609172163">प्रवेश करने में किसी गड़बड़ी के कारण क्रोमियम आपका डेटा समन्वयित नहीं कर सका.</translation> <translation id="6096348254544841612">क्रोमियम को पसंद के मुताबिक बनाएं और नियंत्रित करें. अपडेट उपलब्ध है.</translation> -<translation id="6120345080069858279">क्रोमियम इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपके इसे याद रखने की ज़रूरत नहीं है.</translation> +<translation id="6120345080069858279">क्रोमियम इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपको इसे याद रखने की ज़रूरत नहीं है.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> खतरनाक है, इसलिए क्रोमियम ने उसे अवरोधित कर दिया है.</translation> <translation id="620022061217911843">आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम OS को रीस्टार्ट करें</translation> <translation id="6212496753309875659">इस कंप्यूटर में पहले से क्रोमियम का अधिक नया वर्शन है. यदि सॉफ़्टवेयर कार्य नहीं कर रहा है, तो कृपया क्रोमियम अनइंस्टॉल करें और पुन: प्रयास करें.</translation> @@ -243,7 +243,7 @@ <translation id="8493179195440786826">क्रोमियम पुराना हो गया है</translation> <translation id="85843667276690461">क्रोमियम उपयोग करने के साथ सहायता प्राप्त करें</translation> <translation id="8586442755830160949">कॉपीराइट <ph name="YEAR" /> The Chromium Authors. सर्वाधिकार सुरक्षित.</translation> -<translation id="8599548569518771270">{0,plural, =0{अब क्रोमियम OS रीस्टार्ट होगा}=1{क्रोमियम OS एक सेकंड में रीस्टार्ट होगा}one{क्रोमियम OS # सेकंड में रीस्टार्ट होगा}other{क्रोमियम OS # सेकंड में रीस्टार्ट होगा}}</translation> +<translation id="8599548569518771270">{0,plural, =0{क्रोमियम OS अब रीस्टार्ट होगा}=1{क्रोमियम OS एक सेकंड में रीस्टार्ट होगा}one{क्रोमियम OS # सेकंड में रीस्टार्ट होगा}other{क्रोमियम OS # सेकंड में रीस्टार्ट होगा}}</translation> <translation id="8619360774459241877">क्रोमियम लॉन्च हो रहा है...</translation> <translation id="8621669128220841554">अनिर्दिष्ट कारणों से इंस्टॉलेशन विफल हुआ. कृपया क्रोमियम पुन: डाउनलोड करें.</translation> <translation id="8667808506758191620">आपका <ph name="DEVICE_TYPE" /> अद्यतित है.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 0b876f0..ab294b76 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -48,7 +48,7 @@ <translation id="2648074677641340862">ഇൻസ്റ്റാളുചെയ്യുന്നതിനിടെ ഒരു ഓപ്പറേറ്റിംഗ് സിസ്റ്റം പിശക് സംഭവിച്ചു. Chromium വീണ്ടും ഡൗൺലോഡുചെയ്യുക.</translation> <translation id="2711502716910134313">Chromium ടാബ്</translation> <translation id="2718390899429598676">അധിക സുരക്ഷക്കായി, Chromium നിങ്ങളുടെ ഡാറ്റ എന്ക്രിപ്റ്റ് ചെയ്യും.</translation> -<translation id="2770231113462710648">സ്ഥിരസ്ഥി ബ്രൌസര് ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> +<translation id="2770231113462710648">ഡിഫോൾട്ട് ബ്രൗസർ ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation> <translation id="2886012850691518054">ഓപ്ഷണൽ: ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും Google-ലേക്ക് സ്വയമേവ അയയ്ക്കുന്നതിലൂടെ Chromium-ത്തിനെ മികച്ചതാക്കി മാറ്റാൻ സഹായിക്കുക.</translation> @@ -94,7 +94,7 @@ <translation id="4222580632002216401">നിങ്ങൾ ഇപ്പോൾ Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്തു! നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയം പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="4224199872375172890">Chromium കാലികമാണ്.</translation> <translation id="4230135487732243613">നിങ്ങളുടെ Chromium ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്കുചെയ്യണോ?</translation> -<translation id="4260985389288095068">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ദോഷകരമായ സോഫ്റ്റ്വെയറുണ്ട്. നിങ്ങളുടെ ബ്രൗസർ വീണ്ടും സാധാരണ രീതിയിൽ പ്രവർത്തിപ്പിക്കുന്നതിന്, Chromium-ന് ഇത് നീക്കം ചെയ്യാനും ക്രമീകരണം പുനഃസ്ഥാപിക്കാനും കഴിയും.</translation> +<translation id="4260985389288095068">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ദോഷകരമായ സോഫ്റ്റ്വെയറുണ്ട്. നിങ്ങളുടെ ബ്രൗസർ വീണ്ടും സാധാരണ രീതിയിൽ പ്രവർത്തിപ്പിക്കുന്നതിന്, Chromium- ത്തിന് ഇത് നീക്കം ചെയ്യാനും ക്രമീകരണം പുനഃസ്ഥാപിക്കാനും കഴിയും.</translation> <translation id="4271805377592243930">Chromium ഉപയോഗിക്കുന്നതിനുള്ള സഹായം തേടുക</translation> <translation id="4285930937574705105">അവ്യക്തമായ പിശകിനാൽ ഇൻസ്റ്റാളുചെയ്യൽ പരാജയപ്പെട്ടു. Chromium നിലവിൽ പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, അത് അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4407044323746248786">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> @@ -153,7 +153,7 @@ <translation id="6129621093834146363"><ph name="FILE_NAME" /> അപകടകരമായതിനാൽ, Chromium ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="620022061217911843">ഒരു അപ്ഡേറ്റ് ബാധകമാകാൻ നിങ്ങൾ Chromium OS പുനഃരാരംഭിക്കണമെന്നത് അഡ്മിന്റെ ആവശ്യമാണ്.</translation> <translation id="6212496753309875659">Chromium-ത്തിന്റെ ഏറ്റവും സമീപകാലത്തുള്ള പതിപ്പ് ഈ കമ്പ്യൂട്ടറില് ഇതിനകം തന്നെയുണ്ട്. സോഫ്റ്റ്വെയര് പ്രവര്ത്തിക്കുന്നില്ലെങ്കില്, Chromium അൺഇൻസ്റ്റാളുചെയ്ത് വീണ്ടും ശ്രമിക്കുക.</translation> -<translation id="6248213926982192922">Chromium-ത്തെ സ്ഥിരസ്ഥിതി ബ്രൗസറാക്കി മാറ്റുക</translation> +<translation id="6248213926982192922">Chromium-ത്തെ ഡിഫോൾട്ട് ബ്രൗസറാക്കുക</translation> <translation id="6268381023930128611">Chromium-ത്തിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chromium ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="6309712487085796862">Chromium നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു.</translation> @@ -162,7 +162,7 @@ <translation id="6373523479360886564">Chromium അൺഇൻസ്റ്റാളുചെയ്യാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുവെന്ന് തീർച്ചയാണോ?</translation> <translation id="6394232988457703198">നിങ്ങൾ ഇപ്പോൾ Chromium പുനഃരാരംഭിക്കണം.</translation> <translation id="6400072781405947421">Chromium ഇനി Mac OS X 10.9.-നെ പിന്തുണയ്ക്കാത്തതിനാൽ ഇത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല.</translation> -<translation id="6403826409255603130">മിന്നൽ വേഗത്തിൽ വെബ്പേജുകളും അപ്ലിക്കേഷനുകളും പ്രവർത്തിപ്പിക്കുന്ന ഒരു വെബ് ബ്രൗസറാണ് Chromium. ഇത് വേഗതയുള്ളതും സ്ഥിരതയാർന്നതും ഉപയോഗിക്കാൻ എളുപ്പമുള്ളതുമാണ്. Chromium-ൽ അന്തർനിർമ്മിതമായ ക്ഷുദ്രവെയർ, ഫിഷിംഗ് എന്നിവയ്ക്കെതിരായുള്ള പരിരക്ഷയോടൊപ്പം കൂടുതൽ സുരക്ഷിതമായി വെബ് ബ്രൗസുചെയ്യുക.</translation> +<translation id="6403826409255603130">മിന്നൽ വേഗത്തിൽ വെബ്പേജുകളും അപ്ലിക്കേഷനുകളും പ്രവർത്തിപ്പിക്കുന്ന ഒരു വെബ് ബ്രൗസറാണ് Chromium. ഇത് വേഗതയുള്ളതും സ്ഥിരതയാർന്നതും ഉപയോഗിക്കാൻ എളുപ്പമുള്ളതുമാണ്. Chromium-ത്തിൽ അന്തർനിർമ്മിതമായ മാല്വേര്, ഫിഷിംഗ് എന്നിവയ്ക്കെതിരായുള്ള പരിരക്ഷയോടൊപ്പം കൂടുതൽ സുരക്ഷിതമായി വെബ് ബ്രൗസ് ചെയ്യുക.</translation> <translation id="641451971369018375">ബ്രൗസിംഗ്, Chromium എന്നിവ മെച്ചപ്പെടുത്താൻ Google-മായി ആശയവിനിമയം നടത്തുന്നു</translation> <translation id="6457450909262716557">{SECONDS,plural, =1{Chromium ഒരു സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}other{Chromium # സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}}</translation> <translation id="6475912303565314141">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കും.</translation> @@ -185,7 +185,7 @@ <translation id="6990124437352146030">ഈ സൈറ്റിനായി, Chromium-ത്തിന് നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> <translation id="705851970750939768">Chromium അപ്ഡേറ്റുചെയ്യുക</translation> <translation id="7066436765290594559">Chromium OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് അപ്ഡേറ്റ് ചെയ്യുക.</translation> -<translation id="7162152143154757523">Google തിരയൽ ഉപയോഗിക്കുന്നതിന് സമാനമായ അക്ഷരപ്പിശക് പരിശോധനാ സാങ്കേതികവിദ്യ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നതിലൂടെ, ബ്രൗസറിൽ ടൈപ്പുചെയ്യുന്നതെന്തും Google സെർവറുകളിലേക്ക് അയച്ച് മികച്ച അക്ഷരപ്പിശക് പരിശോധന നൽകാൻ Chromium-ന് കഴിയുന്നു.</translation> +<translation id="7162152143154757523">ബ്രൗസറിൽ ടൈപ്പ് ചെയ്യുന്നതെന്തും Google സെർവറുകളിലേക്ക് അയച്ച് മികച്ച അക്ഷരപ്പിശക് പരിശോധന നൽകാൻ Chromium-ന് കഴിയുന്നു. ഇങ്ങനെ, Google തിരയൽ ഉപയോഗിക്കുന്നതിന് സമാനമായ അക്ഷരപ്പിശക് പരിശോധനാ സാങ്കേതികവിദ്യ ഉപയോഗിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു</translation> <translation id="7196312274710523067">Chromium സമാരംഭിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="7205698830395646142">Chromium മെനുവിൽ മറയ്ക്കുക</translation> <translation id="7223968959479464213">ടാസ്ക് മാനേജർ - Chromium</translation> @@ -199,9 +199,9 @@ <translation id="7337881442233988129">Chromium</translation> <translation id="7339898014177206373">പുതിയ വിന്ഡോ</translation> <translation id="734373864078049451">നിങ്ങളുടെ വെബ്, ബുക്ക്മാർക്കുകൾ,മറ്റ് Chromium ഫയൽ എന്നിവ ഇവിടെ തത്സമയമാണ്.</translation> -<translation id="7344413941077984497"><ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് ഏതൊക്കെ വെബ്സൈറ്റുകൾ കാണാനാകുമെന്ന് സജ്ജമാക്കാൻ, <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> സന്ദർശിച്ച് നിയന്ത്രണങ്ങളും ക്രമീകരണവും കോൺഫിഗർ ചെയ്യാം. നിങ്ങൾ ഡിഫോൾട്ട് ക്രമീകരണം മാറ്റുന്നില്ലെങ്കിൽ, <ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് വെബിൽ എല്ലാ കാര്യങ്ങളും ബ്രൗസുചെയ്യാനാകും. +<translation id="7344413941077984497"><ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് ഏതൊക്കെ വെബ്സൈറ്റുകൾ കാണാനാകുമെന്ന് സജ്ജമാക്കാൻ, <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> സന്ദർശിച്ച് നിയന്ത്രണങ്ങളും ക്രമീകരണവും കോൺഫിഗർ ചെയ്യാം. നിങ്ങൾ ഡിഫോൾട്ട് ക്രമീകരണം മാറ്റുന്നില്ലെങ്കിൽ, <ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് വെബിൽ എല്ലാ കാര്യങ്ങളും ബ്രൗസ് ചെയ്യാനാകും. -നിങ്ങളുടെ അക്കൗണ്ട് ആക്സസ്സ് ചെയ്യുന്നതിൽ നിന്ന് <ph name="NEW_PROFILE_NAME" /> എന്നയാളെ തടയാൻ, Chromium ഉപയോഗിക്കാത്തപ്പോൾ നിങ്ങളുടെ പ്രൊഫൈൽ ലോക്കുചെയ്യുന്നകാര്യം ഉറപ്പാക്കുക. ഇങ്ങനെ ചെയ്യാൻ, ബ്രൗസറിന് മുകളിൽ വലതുകോണിലുള്ള നിങ്ങളുടെ പ്രൊഫൈൽ പേരിൽ ക്ലിക്കുചെയ്ത്, "പുറത്ത് കടന്ന് ചൈൽഡ്ലോക്ക് ചെയ്യുക" തിരഞ്ഞെടുക്കുക. +നിങ്ങളുടെ അക്കൗണ്ട് ആക്സസ്സ് ചെയ്യുന്നതിൽ നിന്ന് <ph name="NEW_PROFILE_NAME" /> എന്നയാളെ തടയാൻ, Chromium ഉപയോഗിക്കാത്തപ്പോൾ നിങ്ങളുടെ പ്രൊഫൈൽ ലോക്ക് ചെയ്യുന്നകാര്യം ഉറപ്പാക്കുക. ഇങ്ങനെ ചെയ്യാൻ, ബ്രൗസറിന് മുകളിൽ വലതുകോണിലുള്ള നിങ്ങളുടെ പ്രൊഫൈൽ പേരിൽ ക്ലിക്ക് ചെയ്ത്, "പുറത്ത് കടന്ന് ചൈൽഡ്ലോക്ക് ചെയ്യുക" തിരഞ്ഞെടുക്കുക. <ph name="BEGIN_LINK_2" />കൂടുതലറിയുക<ph name="END_LINK_2" /> കൂടുതൽ നിർദ്ദേശങ്ങൾക്ക് <ph name="ACCOUNT_EMAIL" /> എന്നതിൽ നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക.</translation> @@ -214,7 +214,7 @@ <translation id="7577193603922410712">Chromium-ത്തിനുള്ള ഒരു പ്രത്യേക സുരക്ഷാ അപ്ഡേറ്റ് ഇപ്പോൾ പ്രയോഗിച്ചിരിക്കുന്നു; ഇത് പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങൾ ഇപ്പോൾ പുനഃരാരംഭിക്കേണ്ടതുണ്ട് (ഞങ്ങൾ നിങ്ങളുടെ ടാബുകൾ പുനഃസ്ഥാപിക്കും).</translation> <translation id="761356813943268536">Chromium നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു.</translation> <translation id="7617377681829253106">Chromium കൂടുതൽ മികച്ചതായി</translation> -<translation id="7686590090926151193">Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറല്ല</translation> +<translation id="7686590090926151193">നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ Chromium അല്ല.</translation> <translation id="7689606757190482937">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chromium സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കുക</translation> <translation id="7729447699958282447">നിങ്ങളുടെ ഡൊമെയ്നിനായി സമന്വയം ലഭ്യമല്ലാത്തതിനാൽ Chromium-ത്തിന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="7745317241717453663">ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ ബ്രൗസിംഗ് വിവരങ്ങളെ ഇല്ലാതാക്കും. പിന്നീട് വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation> @@ -227,7 +227,7 @@ <translation id="7901117350626490574">Chromium-ത്തിനുള്ള പുതിയൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്, നിങ്ങൾ വീണ്ടും സമാരംഭിക്കുമ്പോൾ ഉടൻ അത് പ്രാബല്യത്തിലാകും.</translation> <translation id="7937630085815544518">Chromium-ത്തിൽ നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്തു. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നതിന് സമാന അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation> <translation id="7962572577636132072">Chromium സ്വയമേവ അപ്ഡേറ്റുചെയ്യുന്നതിനാൽ, നിങ്ങളുടേത് എല്ലായ്പ്പോഴും ഏറ്റവും പുതിയ പതിപ്പായിരിക്കും.</translation> -<translation id="7975919845073681630">ഇത് Chromium-ത്തിന്റെ ദ്വിതീയ ഇൻസ്റ്റലേഷനായതിനാൽ, നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാൻ കഴിയില്ല.</translation> +<translation id="7975919845073681630">ഇത് Chromium-ത്തിന്റെ രണ്ടാമത്തെ ഇൻസ്റ്റലേഷനായതിനാൽ, നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാൻ കഴിയില്ല.</translation> <translation id="7979877361127045932">Chromium മെനുവിൽ മറയ്ക്കുക</translation> <translation id="8013436988911883588">Chromium-ത്തിന് ആക്സസ് ലഭിച്ചുകഴിഞ്ഞാൽ, വെബ്സൈറ്റുകൾക്ക് നിങ്ങളോട് ആക്സസ് ചോദിക്കാനാകും.</translation> <translation id="8030318113982266900">നിങ്ങളുടെ ഉപകരണം <ph name="CHANNEL_NAME" /> ചാനലിലേയ്ക്ക് അപ്ഡേറ്റുചെയ്യുന്നു...</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 9b04fc3..9448a02 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">ምንም አውታረ መረቦች የሉም</translation> <translation id="1056898198331236512">ማስጠንቀቂያ</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">የጣት አሻራን በማስመዝገብ ላይ</translation> <translation id="1061904396131502319">የእረፍት ጊዜ ሊደርስ ነው</translation> <translation id="1062407476771304334">ተካ</translation> <translation id="1067048845568873861">ተፈጥሯል</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">አልማዝ</translation> <translation id="1114335938027186412">የእርስዎ ኮምፒውተር የሚታመን የመሣሪያ ስርዓት ሞዱል (TPM) ደህንነት መሣሪያ አለው፣ ይህም በChrome OS ውስጥ ብዙ ወሳኝ የደህንነት ባህሪያትን ለመተግበር ስራ ላይ የሚውል ነው። ተጨማሪ ለማወቅ የChromebook እገዛ ማዕከሉን ይጎብኙ፦ https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">ክዳኑ ሲዘጋ አንቀላፋ</translation> +<translation id="1115324527092594775">Better Togetherን ያቀናብሩ</translation> <translation id="1116694919640316211">ስለ</translation> <translation id="1116779635164066733">ይህ ቅንብር በ«<ph name="NAME" />» ቅጥያ ተፈጻሚ ይሆናል።</translation> <translation id="111844081046043029">እርግጠኛ ነዎት ይህን ገጽ መተው ይፈልጋሉ?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">የአሁኑ ሰዓት</translation> <translation id="1157102636231978136">የእርስዎ የአሰሳ አደራረግ ውሂብ እና እንቅስቃሴ፣ ወደ የእርስዎ የGoogle መለያ ተመሳስለዋል</translation> <translation id="1161575384898972166">የደንበኛ እውቅና ማረጋገጫውን ለመላክ እባክዎ <ph name="TOKEN_NAME" /> ውስጥ ይግቡ።</translation> +<translation id="1161699061380012396">የChrome OS የግቤት ዘዴ</translation> <translation id="1163931534039071049">የፍሬም መነሻ &አሳይ</translation> <translation id="1164674268730883318">Smart Lock ለ<ph name="DEVICE_TYPE" /> ያጥፉ?</translation> <translation id="1164899421101904659">የፒን መክፈቻ ቁልፍ ያስገቡ</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">የGoogle Play መደብር መለያ</translation> <translation id="2509495747794740764">የልኬት መጠኑ በ10 እና 200 መካከል የሆነ ቁጥር መሆን አለበት።</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">የራስ-ሙላ ቅጾች</translation> <translation id="2513403576141822879">ከግላዊነት፣ ደህንነት እና የውሂብ ስብስብ ጋር ለሚዛመዱ ተጨማሪ ቅንብሮች <ph name="BEGIN_LINK" />ስምረት እና የGoogle አገልግሎቶች<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ቃኝ</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">መለያ ቁጥር፦ <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">የፍሬም መነሻ &አሳይ</translation> <translation id="3022978424994383087">አልሰማሁትም።</translation> +<translation id="3023464535986383522">ለመናገር-ይምረጡ</translation> <translation id="3024374909719388945">ባለ 24 ሰዓት ይጠቀሙ</translation> <translation id="302781076327338683">የሚታለፈው መሸጎጫን ዳግም ጫን</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">ቀጣይ የግቤት ስልት</translation> <translation id="3640214691812501263">«<ph name="EXTENSION_NAME" />» ለ<ph name="USER_NAME" /> ይታከል?</translation> <translation id="3644896802912593514">ስፋት</translation> +<translation id="3645372836428131288">የጣት አሻራውን የተለየ ክፍል ለመያዝ በቀስታ ያንቀሳቅሱት።</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> ተገኝቷል</translation> <translation id="3649138363871392317">ፎቶ ተቀርጿል</translation> <translation id="3650952250015018111">«<ph name="APP_NAME" />» ይህን እንዲደርስ ይፍቀዱ፦</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">የሰርቲፊኬት መምሪያዎች</translation> <translation id="392089482157167418">ChromeVoxን (የሚነገር ግብረመልስ) አንቃ</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">ምንም በቅርብ ጊዜ የተቀረጹ WebRTC ምዝግቦች የለዎትም።</translation> <translation id="3925573269917483990">ካሜራ፦</translation> <translation id="3925842537050977900">ከመደርደሪያ ንቀል</translation> <translation id="3926002189479431949">Smart Lock ስልክ ተለውጧል</translation> @@ -2222,6 +2225,7 @@ <translation id="438503109373656455">ሳራቶጋ</translation> <translation id="4387004326333427325">የማረጋገጫ ምስክር ወረቀት በርቀት ተቀባይነት አላገኘም</translation> <translation id="4389091756366370506">ተጠቃሚ <ph name="VALUE" /></translation> +<translation id="439266289085815679">የብሉቱዝ ውቅረትን የሚቆጣጠሩት <ph name="USER_EMAIL" /> ናቸው።</translation> <translation id="4394049700291259645">አሰናክል</translation> <translation id="4400367121200150367">የይለፍ ቃላትን በጭራሽ የማያስቀምጡ ድር ጣቢያዎች እዚህ ይታያሉ</translation> <translation id="4400632832271803360">የላይኛው ረድፍ ቁልፎች ባህሪን ለመቀየር የማስጀመሪያ ቁልፉን ይያዙ</translation> @@ -2295,6 +2299,7 @@ <translation id="4522600456902129422">ይህ ጣቢያ ቅንጥብ ሰሌዳውን እንዲመለከት መፍቀዱን ይቀጥሉ</translation> <translation id="4530494379350999373">መነሻ</translation> <translation id="4533985347672295764">የሲፒዩ ጊዜ</translation> +<translation id="4534661889221639075">እንደገና ይሞክሩ።</translation> <translation id="4535127706710932914">ነባሪ መገለጫ</translation> <translation id="4538417792467843292">ቃል ይሰርዙ</translation> <translation id="4538684596480161368">በማጠሪያ ያልተቀመጡ ተሰኪዎች ሁልጊዜ <ph name="HOST" /> ላይ አግድ</translation> @@ -2524,6 +2529,7 @@ <translation id="4880520557730313061">በራስ-ጠግን</translation> <translation id="4880827082731008257">የፍለጋ ታሪክ</translation> <translation id="4881695831933465202">ክፈት</translation> +<translation id="4882312758060467256">የዚህ ጣቢያ መዳረሻ አላቸው</translation> <translation id="4882473678324857464">ዕልባቶች ላይ ያተኩሩ</translation> <translation id="4882831918239250449">ፍለጋን፣ ማስታወቂያዎችን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="4883178195103750615">ዕልባቶችን ወደ ኤችቲኤምኤል ፋይል ላክ...</translation> @@ -2589,6 +2595,7 @@ <translation id="4969785127455456148">አልበም</translation> <translation id="4971412780836297815">ሲጠናቀቅ ክፈት</translation> <translation id="4972129977812092092">ማተሚያን ያርትዑ</translation> +<translation id="4972164225939028131">የተሳሳተ የይለፍ ቃል</translation> <translation id="497287958838527945">Google Payን የሚጠቀሙ ክሬዲት ካርዶች እና አድራሻዎች።</translation> <translation id="4973307593867026061">አታሚዎችን ያክሉ</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> ወይም ከዚያ ያነሰ ቁምፊዎች የሆነ ስም ይጠቀሙ</translation> @@ -3016,6 +3023,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">መተግበሪያዎችን በመጫን ላይ...</translation> <translation id="5592595402373377407">ገና ምንም በቂ ውሂብ የለም።</translation> +<translation id="5593357315997824387">የእኔን ፋይሎች አሳምር</translation> <translation id="5595152862129936745">በጣም ሩቅ</translation> <translation id="5595485650161345191">አድራሻ አርትዕ</translation> <translation id="5596627076506792578">ተጨማሪ አማራጮች</translation> @@ -3730,6 +3738,7 @@ <translation id="6664237456442406323">የአጋጣሚ ነገር ሆኖ ኮምፒውተርዎ በተበላሸ የሃርድዌር መታወቂያ ነው የተዋቀረው። ይሄ Chrome ስርዓተ ክወና በቅርብ ጊዜዎቹ የደህንነት ጥገናዎች እንዳይዘመን ያግደዋል፣ እና የእርስዎ ኮምፒውተር <ph name="BEGIN_BOLD" />ለተንኮል-አዘል ጥቃቶች የተጋለጠ ሊሆን ይችላል<ph name="END_BOLD" />።</translation> <translation id="6664774537677393800">የእርስዎን መገለጫ በመክፈት ላይ የሆነ ችግር ተፈጥሯል። እባክዎ ዘግተው ይውጡና እንደገና ተመልሰው ይግቡ።</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (ዩኤስቢ)</translation> +<translation id="6674412557034343536">ሰዓት ቆጣሪ አቁም</translation> <translation id="667517062706956822">Google ይህን ገጽ ከ<ph name="SOURCE_LANGUAGE" /> ወደ <ph name="TARGET_LANGUAGE" /> እንዲተረጉመው ይፈልጋሉ?</translation> <translation id="6675665718701918026">መጠቆሚያ መሣሪያ ተገናኝቷል</translation> <translation id="6678717876183468697">የጥያቄ ዩአርኤል</translation> @@ -4056,6 +4065,7 @@ <translation id="7186088072322679094">በመሣሪያ አሞሌ ውስጥ አቆይ</translation> <translation id="7187428571767585875">የሚወገዱ ወይም የሚቀየሩ የመዝገብ ግቤቶችን፦</translation> <translation id="7189234443051076392">በእርስዎ መሣሪያ ላይ በቂ ባዶ ቦታ መኖሩን ያረጋግጡ</translation> +<translation id="7189965711416741966">የጣት አሻራ ታክሏል።</translation> <translation id="7191159667348037">ያልታወቀ አታሚ (ዩኤስቢ)</translation> <translation id="7191454237977785534">ፋይል አስቀምጥ እንደ</translation> <translation id="7193374945610105795">ለ<ph name="ORIGIN" /> ምንም የይለፍ ቃላት አልተቀመጡም</translation> @@ -4156,6 +4166,7 @@ <translation id="7339898014177206373">አዲሰ መስኮት</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> አሁን በሙሉ ማያ ገጽ ላይ ነው።</translation> <translation id="7340650977506865820">ጣቢያ የእርስዎን ማያ ገጽ በማጋራት ላይ ነው</translation> +<translation id="7341834142292923918">የዚህ ጣቢያ መዳረሻ ይፈልጋል</translation> <translation id="7345706641791090287">የይለፍ ቃልዎን ያረጋግጡ</translation> <translation id="7346909386216857016">እሺ፣ ገባኝ</translation> <translation id="7347751611463936647">ይህንን ቅጥያ ለመጠቀም «<ph name="EXTENSION_KEYWORD" />» ብለው፣ ከዚያ TAB፣ ከዚያ ትዕዛዝዎን ወይም ፍለጋዎን ይተይቡ።</translation> @@ -4265,7 +4276,6 @@ <ph name="BEGIN_PARAGRAPH2" />የGoogle አካባቢ አገልግሎት የመሣሪያዎ አካባቢ እንዲገመት ለማገዝ እንደ Wi-Fi፣ የተንቀሳቃሽ ስልክ አውታረ መረቦች እና ዳሳሾች ያሉ ምንጮችን ይጠቀማል። የመሣሪያዎ የአካባቢ ቅንብር ሲበራ ይህ አገልግሎት ገቢር ነው።<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />በመሣሪያዎ ላይ ያለውን ዋና የአካባቢ ቅንብርን በማጥፋት አካባቢን ማጥፋት ይችላሉ። እርስዎ እንዲሁም በአካባቢ ቅንብሮች ውስጥ Wi-Fiን፣ የተንቀሳቃሽ ስልክ አውታረ መረቦችን እና ዳሳሾችን ለአካባቢ መጠቀም ማጥፋት ይችላሉ።<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">አንድ የይለፍ ቃል ይፍጠሩ -</translation> -<translation id="7518150891539970662">የWebRTC ምዝግብ ማስታወሻዎች (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">ጃቫስክሪፕት</translation> <translation id="7525067979554623046">ፍጠር</translation> <translation id="7529411698175791732">የበይነመረብ ግንኙነትዎን ይፈትሹ። ችግሩ ከቀጠለ ዘግተው ወጥተው እንደገና ለመግባት ይሞክሩ።</translation> @@ -4748,6 +4758,7 @@ <translation id="8214962590150211830">ይህን ሰው አስወግድ</translation> <translation id="8217399928341212914">በርካታ ፋይሎችን በራስ ሰር ማውረድን ማገድ ቀጥል</translation> <translation id="8223479393428528563">እነዚህን ፋይሎች ከመስመር ውጪ ለመጠቀም ለማስቀመጥ ተመልሰው መስመር ላይ ይሂዱ፣ ፋይሎቹን በቀኝ ጠቅ ያድርጉ፣ እና የ<ph name="OFFLINE_CHECKBOX_NAME" /> አማራጩን ይምረጡ።</translation> +<translation id="8225753906568652947">የእርስዎን ዋጋ ቅናሾችን ይውሰዱ</translation> <translation id="8226222018808695353">የተከለከለ</translation> <translation id="8226619461731305576">ወረፋ</translation> <translation id="8226742006292257240">ከታች በዘፈቀደ የመነጨ ለኮምፒውተርዎ የተመደበ የቲ ፒ ኤም ይለፍ ቃል ነው፦</translation> @@ -4794,6 +4805,7 @@ <translation id="8286036467436129157">ግባ</translation> <translation id="8286963743045814739">ማንነት የማያሳውቅ መስኮት ተጠቅመው በግል ማሰስ ይችላሉ</translation> <translation id="82871696630048499">የእርስዎ የድር ገጽ ማህደረ ትውስታው ስላለቀ እንደገና ተጭኗል።</translation> +<translation id="8288032458496410887"><ph name="APP" /> ይራገፍ...</translation> <translation id="8291967909914612644">የመነሻ አቅራቢ አገር</translation> <translation id="8294431847097064396">ምንጭ</translation> <translation id="8297006494302853456">ደካማ</translation> @@ -4855,6 +4867,7 @@ <translation id="8413385045638830869">በመጀመሪያ ጠይቅ (የሚመከር)</translation> <translation id="8418445294933751433">&በትር አሳይ</translation> <translation id="8419098111404128271">የ«<ph name="SEARCH_TEXT" />» ውጤቶችን ይፈልጉ</translation> +<translation id="8419368276599091549">እንኳን ወደ የእርስዎ <ph name="DEVICE_TYPE" /> በደህና መጡ!</translation> <translation id="8420060421540670057">የGoogle ሰነዶች ፋይሎችን አሳይ</translation> <translation id="8424039430705546751">ታች</translation> <translation id="8425213833346101688">ለውጥ</translation> @@ -4981,6 +4994,7 @@ <translation id="8620765578342452535">የአውታረ መረብ ግንኙነቶችን ያዋቅራል</translation> <translation id="8624205858755890468">ረዳቱ ተዛማጅነት ያላቸውን መረጃዎች፣ መተግበሪያዎች እና እርምጃዎች ለእርስዎ እንዲያሳይ ያስችለዋል።</translation> <translation id="862542460444371744">&ቅጥያዎች</translation> +<translation id="8626219642120025691">የሰዓት ቆጣሪ ተጠናቅቋል</translation> <translation id="8627151598708688654">ምንጭ ይምረጡ</translation> <translation id="862727964348362408">ተንጠልጥሏል</translation> <translation id="862750493060684461">የCSS መሸጎጫ</translation> @@ -5101,6 +5115,7 @@ <translation id="8775404590947523323">አርትዖትዎችዎ በራስ-ሰር ተቀምጠዋል።<ph name="BREAKS" />የመጀመሪያው ምስል ቅጂ ለማስቀመጥ «የመጀመሪያውን ተካ» የሚለው ላይ ያለውን ምልክት ያንሱ</translation> <translation id="8777628254805677039">የስር ይለፍ ቃል</translation> <translation id="8780443667474968681">የድምጽ ፍለጋ ጠፍቷል።</translation> +<translation id="878068003854005405">እንጀምር። የእርስዎን ጥእት በዳሳሹ ላይ ያስቀምጡ።</translation> <translation id="878069093594050299">ይህ ሰርቲፊኬት ለሚከተሉት አገልግሎቶች ተረጋግጧል፦</translation> <translation id="8781980678064919987">ክዳኑ ሲዘጋ አጥፋ</translation> <translation id="8782565991310229362">የኪዮስክ መተግበሪያ ማስጀመር ተሰርዟል።</translation> @@ -5278,6 +5293,7 @@ <translation id="9050666287014529139">የይለፍ ሐረግ</translation> <translation id="9052208328806230490"><ph name="EMAIL" />ን ተጠቅመው አታሚዎችዎን በ<ph name="CLOUD_PRINT_NAME" /> መዝግበዋል።</translation> <translation id="9052404922357793350">ማገድን ቀጥል</translation> +<translation id="9053091947372579468">የእርስዎ መሣሪያ የChrome ፈቃድን ያካትታል፣ ሆኖም ግን የእርስዎ ተጠቃሚ ስም ከአስተዳዳሪ መሥሪያ ጋር የተጎዳኘ አይደለም። በምዝገባው ለመቀጠል እባክዎ አንድ የአስተዳዳሪ መሥሪያ ይፍጠሩ። ማስታወሻ፦ አዲስ የአስተዳዳሪ መሥሪያ መለያን ለመፍጠር የራስዎን ጎራ ለመጠቀም ከመረጡ ከምዝገባ በኋላ የጎራ ማረጋገጫን በተጨማሪ ማጠናቀቅ አለበት። https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">ምርጫዬን አስታውስ</translation> <translation id="9055636786322918818">የRC4 ምሥጠራን አስገድድ። የRC4 ምሥጠራዎች ለደህንነት አስተማማኝ ስላልሆኑ ይህን አማራጭ መጠቀም የእርስዎን አደጋ ይጨምራል።</translation> <translation id="9056034633062863292">Chromeboxን በማዘመን ላይ</translation> @@ -5381,6 +5397,7 @@ <translation id="9218430445555521422">እንደወረደ አዘጋጀው</translation> <translation id="9219103736887031265">ምስሎች</translation> <translation id="9220525904950070496">መለያ ያስወግዱ</translation> +<translation id="9220820413868316583">ያንሱ እና ከዚያ እንደገና ይሞክሩ።</translation> <translation id="923467487918828349">ሁሉንም አሳይ</translation> <translation id="928985544179707652">ቅጥያዎች፦</translation> <translation id="930268624053534560">ዝርዝር የጊዜ ማህተሞች</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index b73322bd..6557594 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">لم يتم العثور على أي شبكات.</translation> <translation id="1056898198331236512">تحذير</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">تسجيل بصمة الإصبع</translation> <translation id="1061904396131502319">سيتم قفل الجهاز بعد قليل</translation> <translation id="1062407476771304334">استبدال</translation> <translation id="1067048845568873861">تم الإنشاء</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">معيّن</translation> <translation id="1114335938027186412">يحتوي الكمبيوتر على جهاز أمان الوحدة النمطية للنظام الأساسي الموثوق به (TPM)، والذي يستخدم لتنفيذ العديد من ميزات الأمان المهمة في نظام التشغيل Chrome. ويُمكنك الانتقال إلى مركز مساعدة Chromebook للتعرف على مزيد من المعلومات: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">السكون عند إغلاق الغطاء</translation> +<translation id="1115324527092594775">إعداد Better Together</translation> <translation id="1116694919640316211">حول</translation> <translation id="1116779635164066733">تم فرض هذا الإعداد بواسطة الإضافة "<ph name="NAME" />".</translation> <translation id="111844081046043029">هل تريد فعلًا مغادرة هذه الصفحة؟</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">الوقت الحالي</translation> <translation id="1157102636231978136">بيانات التصفُّح والنشاط المتزامنة في حسابك على Google</translation> <translation id="1161575384898972166">يُرجى تسجيل الدخول إلى <ph name="TOKEN_NAME" /> لتصدير شهادة العميل.</translation> +<translation id="1161699061380012396">أسلوب الإدخال لنظام التشغيل Chrome</translation> <translation id="1163931534039071049">عرض م&صدر الإطار</translation> <translation id="1164674268730883318">هل تريد إيقاف تشغيل Smart Lock لـ <ph name="DEVICE_TYPE" />؟</translation> <translation id="1164899421101904659">إدخال مفتاح إلغاء تأمين رقم التعريف الشخصي</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">حساب متجر Google Play</translation> <translation id="2509495747794740764">يجب أن تمثل قيمة التدرج رقمًا يتراوح بين 10 و200.</translation> <translation id="2509566264613697683">8 أضعاف</translation> -<translation id="2512222046227390255">املأ النماذج تلقائيًا</translation> <translation id="2513403576141822879">لعرض مزيد من الإعدادات المتعلِّقة بالخصوصية والأمان وجمع البيانات، يُرجى الاطِّلاع على <ph name="BEGIN_LINK" />خدمات Google والمزامنة<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">فحص</translation> @@ -1356,6 +1358,7 @@ <translation id="3020990233660977256">الرقم التسلسلي: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">عرض م&صدر الإطار</translation> <translation id="3022978424994383087">لم يتم استيعاب هذا.</translation> +<translation id="3023464535986383522">سماع الاختيار</translation> <translation id="3024374909719388945">استخدام تنسيق 24 ساعة</translation> <translation id="302781076327338683">إعادة تحميل تجاوز ذاكرة التخزين المؤقت</translation> <translation id="3031417829280473749">الوكيل X</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">طريقة الإدخال التالية</translation> <translation id="3640214691812501263">هل تريد إضافة "<ph name="EXTENSION_NAME" />" لـ <ph name="USER_NAME" />؟</translation> <translation id="3644896802912593514">العرض</translation> +<translation id="3645372836428131288">تحرّك قليلاً لالتقاط جزء مختلف من بصمة الإصبع.</translation> <translation id="3648348069317717750">تم اكتشاف <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">تم التقاط الصورة</translation> <translation id="3650952250015018111">السماح لتطبيق "<ph name="APP_NAME" />" بالوصول:</translation> @@ -1946,7 +1950,6 @@ <translation id="3920504717067627103">سياسات الشهادة</translation> <translation id="392089482157167418">تفعيل ChromeVox (التعليقات المنطوقة)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">ليست لديك أي سجلات WebRTC تم التقاطها مؤخرًا.</translation> <translation id="3925573269917483990">الكاميرا:</translation> <translation id="3925842537050977900">إزالة التثبيت من الرف</translation> <translation id="3926002189479431949">تم تغيير هاتف Smart Lock</translation> @@ -2219,6 +2222,7 @@ <translation id="438503109373656455">ساراتوجا</translation> <translation id="4387004326333427325">تم رفض شهادة المصادقة عن بُعد</translation> <translation id="4389091756366370506">المستخدم <ph name="VALUE" /></translation> +<translation id="439266289085815679">يتم التحكّم في تهيئة البلوتوث من قِبل <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">إيقاف</translation> <translation id="4400367121200150367">ستظهر هنا مواقع الويب التي لا يتم حفظ كلمات المرور لها مطلقًا</translation> <translation id="4400632832271803360">اضغط على مفتاح Launcher باستمرار لتبديل سلوك مفاتيح الصف العلوي</translation> @@ -2292,6 +2296,7 @@ <translation id="4522600456902129422">مواصلة السماح لموقع الويب هذا بالاطلاع على الحافظة</translation> <translation id="4530494379350999373">الأصل</translation> <translation id="4533985347672295764">وقت وحدة المعالجة المركزية</translation> +<translation id="4534661889221639075">يُرجى إعادة المحاولة.</translation> <translation id="4535127706710932914">الملف الشخصي التلقائي</translation> <translation id="4538417792467843292">حذف كلمة</translation> <translation id="4538684596480161368">حظر المكونات الإضافية غير المحمية دومًا على <ph name="HOST" /></translation> @@ -2521,6 +2526,7 @@ <translation id="4880520557730313061">إصلاح تلقائي</translation> <translation id="4880827082731008257">سجلّ البحث</translation> <translation id="4881695831933465202">فتح</translation> +<translation id="4882312758060467256">يمكنها الوصول إلى موقع الويب هذا</translation> <translation id="4882473678324857464">تركيز الإشارات المرجعية</translation> <translation id="4882831918239250449">التحكُّم في كيفية استخدامنا لسِجل التصفُّح الخاص بك لتخصيص البحث والإعلانات والمزيد</translation> <translation id="4883178195103750615">تصدير الإشارات المرجعية إلى ملف HTML...</translation> @@ -2586,6 +2592,7 @@ <translation id="4969785127455456148">الألبوم</translation> <translation id="4971412780836297815">فتح عند اكتمال التنزيل</translation> <translation id="4972129977812092092">تعديل الطابعة</translation> +<translation id="4972164225939028131">كلمة مرور غير صحيحة</translation> <translation id="497287958838527945">بطاقات الائتمان والعناوين باستخدام Google Pay.</translation> <translation id="4973307593867026061">إضافة الطابعات</translation> <translation id="4973523518332075481">يرجى استخدام اسم يحتوي على <ph name="MAX_LENGTH" /> حرف أو أقل</translation> @@ -3012,6 +3019,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">جارٍ تحميل التطبيقات...</translation> <translation id="5592595402373377407">لم تتوفر بيانات كافية بعد.</translation> +<translation id="5593357315997824387">مزامنة ملفاتي</translation> <translation id="5595152862129936745">بعيد جدًا</translation> <translation id="5595485650161345191">تعديل العنوان</translation> <translation id="5596627076506792578">خيارات إضافية</translation> @@ -3728,6 +3736,7 @@ <translation id="6664237456442406323">للأسف، تمت تهيئة جهاز الكمبيوتر باستخدام معرف جهاز غير صحيح. وهذا يمنع تحديث نظام التشغيل Chrome بأحدث إصلاحات الأمان، وقد يكون جهاز الكمبيوتر <ph name="BEGIN_BOLD" />عرضة للهجمات الضارة<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">حدث خطأ ما أثناء فتح ملفك الشخصي. يُرجى الخروج ثم إعادة تسجيل الدخول.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">إيقاف المؤقّت</translation> <translation id="667517062706956822">هل تريد أن يترجم Google هذه الصفحة من <ph name="SOURCE_LANGUAGE" /> إلى <ph name="TARGET_LANGUAGE" />؟</translation> <translation id="6675665718701918026">الإشارة إلى الأجهزة المتصلة</translation> <translation id="6678717876183468697">عنوان URL للاستعلام</translation> @@ -4054,6 +4063,7 @@ <translation id="7186088072322679094">البقاء مثبتًا في شريط الأدوات</translation> <translation id="7187428571767585875">إدخالات قاعدة بيانات المسجّلين التي ستتم إزالتها أو تغييرها:</translation> <translation id="7189234443051076392">التأكد من توفر مساحة كافية على جهازك</translation> +<translation id="7189965711416741966">تمت إضافة بصمة إصبع.</translation> <translation id="7191159667348037">طابعة غير معروفة (USB)</translation> <translation id="7191454237977785534">حفظ الملف باسم</translation> <translation id="7193374945610105795">لم يتم حفظ أي كلمات مرور لـ <ph name="ORIGIN" /></translation> @@ -4154,6 +4164,7 @@ <translation id="7339898014177206373">نافذة جديدة</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> في وضع ملء الشاشة الآن.</translation> <translation id="7340650977506865820">يشارك موقع الويب شاشتك.</translation> +<translation id="7341834142292923918">تريد الوصول إلى موقع الويب هذا</translation> <translation id="7345706641791090287">تأكيد كلمة المرور</translation> <translation id="7346909386216857016">موافق، حسنًا</translation> <translation id="7347751611463936647">لاستخدام هذه الإضافة، اكتب "<ph name="EXTENSION_KEYWORD" />"، ثم TAB، ثم الأمر أو البحث.</translation> @@ -4264,7 +4275,6 @@ <ph name="BEGIN_PARAGRAPH2" />تستخدم خدمة الموقع الجغرافي من Google المصادر، مثل شبكة Wi-Fi وشبكات الجوَّال وأجهزة الاستشعار، للمساعدة في تقدير الموقع الجغرافي لجهازك. ويتم تفعيل هذه الخدمة عند تفعيل إعداد "الموقع الجغرافي" على جهازك.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />يمكنك إيقاف ميزة "الموقع الجغرافي" من خلال إيقاف الإعداد الرئيسي للموقع الجغرافي على جهازك. ويمكنك أيضًا إيقاف استخدام شبكة Wi-Fi وشبكات الجوَّال وأجهزة الاستشعار للموقع الجغرافي في إعدادات الموقع الجغرافي.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">إنشاء كلمة مرور -</translation> -<translation id="7518150891539970662">سجلات WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">جافا سكريبت</translation> <translation id="7525067979554623046">إنشاء</translation> <translation id="7529411698175791732">تحقق من اتصالك بالإنترنت. وإذا استمرت المشكلة، فحاول الخروج ثم تسجيل الدخول مرة أخرى.</translation> @@ -4742,6 +4752,7 @@ <translation id="8214962590150211830">إزالة هذا الشخص</translation> <translation id="8217399928341212914">متابعة حظر التنزيلات التلقائية لعدة ملفات</translation> <translation id="8223479393428528563">لحفظ هذه الملفات بلا اتصال، عليك العودة للاتصال انقر بزر الماوس الأيمن على الملفات، وحدد خيار <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">استرداد قيمة العروض</translation> <translation id="8226222018808695353">محظور </translation> <translation id="8226619461731305576">اللائحة</translation> <translation id="8226742006292257240">في ما يلي كلمة مرور TPM التي تم إنشاؤها عشوائيًا والتي تم تخصيصها للكمبيوتر:</translation> @@ -4788,6 +4799,7 @@ <translation id="8286036467436129157">تسجيل الدخول</translation> <translation id="8286963743045814739">يمكنك التصفّح بخصوصية تامّة باستخدام نافذة للتصفُّح المتخفي</translation> <translation id="82871696630048499">تمت إعادة تحميل صفحة الويب بسبب نفاد الذاكرة.</translation> +<translation id="8288032458496410887">إلغاء تثبيت <ph name="APP" />...</translation> <translation id="8291967909914612644">بلد مقدم الخدمة الرئيسي</translation> <translation id="8294431847097064396">المصدر</translation> <translation id="8297006494302853456">ضعيفة</translation> @@ -4849,6 +4861,7 @@ <translation id="8413385045638830869">السؤال أولاً (موصى به)</translation> <translation id="8418445294933751433">&العرض في علامة تبويب</translation> <translation id="8419098111404128271">نتائج البحث عن "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">مرحبًا بك في جهازك <ph name="DEVICE_TYPE" />.</translation> <translation id="8420060421540670057">عرض ملفات مستندات Google</translation> <translation id="8424039430705546751">لأسفل</translation> <translation id="8425213833346101688">تغيير</translation> @@ -4975,6 +4988,7 @@ <translation id="8620765578342452535">تهيئة اتصالات الشبكة</translation> <translation id="8624205858755890468">يعمل على تفعيل "المساعد" لعرض الإجراءات والتطبيقات والمعلومات ذات الصلة.</translation> <translation id="862542460444371744">&الإضافات</translation> +<translation id="8626219642120025691">تم الانتهاء من المؤقّت</translation> <translation id="8627151598708688654">تحديد مصدر</translation> <translation id="862727964348362408">معلقة</translation> <translation id="862750493060684461">ذاكرة التخزين المؤقت للغة CSS</translation> @@ -5095,6 +5109,7 @@ <translation id="8775404590947523323">يتم حفظ التعديلات تلقائيًا.<ph name="BREAKS" />للاحتفاظ بنسخة من الصورة الأصلية، يجب إلغاء تحديد "استبدال الملف الأصلي"</translation> <translation id="8777628254805677039">كلمة مرور الجذر</translation> <translation id="8780443667474968681">تم إيقاف ميزة البحث الصوتي.</translation> +<translation id="878068003854005405">لنبدأ الآن. ضع إصبعك على جهاز الاستشعار.</translation> <translation id="878069093594050299">تم التحقق من هذه الشهادة للاستخدامات التالية:</translation> <translation id="8781980678064919987">إيقاف التشغيل عند إغلاق الغطاء</translation> <translation id="8782565991310229362">تم إلغاء تشغيل تطبيق Kiosk.</translation> @@ -5272,6 +5287,7 @@ <translation id="9050666287014529139">عبارة المرور</translation> <translation id="9052208328806230490">لقد سجّلت طابعاتك في <ph name="CLOUD_PRINT_NAME" /> باستخدام الحساب <ph name="EMAIL" /></translation> <translation id="9052404922357793350">متابعة الحظر</translation> +<translation id="9053091947372579468">يتضمن جهازك ترخيصًا لـ Chrome، ولكن اسم المستخدم لديك غير مرتبط بوحدة تحكّم المشرف. يُرجى إنشاء حساب على وحدة تحكّم المشرف لمتابعة التسجيل. ملاحظة: إذا اختَرت استخدام نطاقك الخاص لإنشاء حساب جديد على وحدة تحكّم المشرف، عليك أيضًا إكمال إثبات ملكية النطاق بعد الاشتراك. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">تذكَّر اختياري</translation> <translation id="9055636786322918818">فرض تشفير RC4: يؤدي استخدام هذا الخيار إلى زيادة المخاطر، لأن رموز RC4 غير آمنة.</translation> <translation id="9056034633062863292">جارٍ تحديث جهاز Chromebox...</translation> @@ -5375,6 +5391,7 @@ <translation id="9218430445555521422">تعيين كافتراضي</translation> <translation id="9219103736887031265">صور</translation> <translation id="9220525904950070496">إزالة الحساب</translation> +<translation id="9220820413868316583">ارفع إصبعك ثم أعد المحاولة.</translation> <translation id="923467487918828349">إظهار الكل</translation> <translation id="928985544179707652">الإضافات:</translation> <translation id="930268624053534560">الطوابع الزمنية المفصلة</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 12fd814..5fcf6f0 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Няма мрежи</translation> <translation id="1056898198331236512">Предупреждение</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Отпечатъкът се регистрира</translation> <translation id="1061904396131502319">Скоро ще е време за почивка</translation> <translation id="1062407476771304334">Замяна</translation> <translation id="1067048845568873861">Дата на създаване</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Ромб</translation> <translation id="1114335938027186412">Компютърът ви съдържа устройство за сигурност от типа „модул за надеждна платформа (TPM)“, което служи за реализиране на множество критични защитни функции в Chrome OS. За да научите повече, посетете Помощния център на Chromebook: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Преминаване в спящ режим при затваряне на капака</translation> +<translation id="1115324527092594775">Настройване на функцията По-добре заедно</translation> <translation id="1116694919640316211">Информация</translation> <translation id="1116779635164066733">Тази настройка е наложена от разширението „<ph name="NAME" />“.</translation> <translation id="111844081046043029">Наистина ли искате да излезете от тази страница?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Текущ час</translation> <translation id="1157102636231978136">Активността ви и данните ви за сърфирането, синхронизирани с профила ви в Google</translation> <translation id="1161575384898972166">Моля, влезте в/ъв <ph name="TOKEN_NAME" />, за да експортирате сертификата за клиентската програма.</translation> +<translation id="1161699061380012396">Метод на въвеждане в Chrome OS</translation> <translation id="1163931534039071049">&Преглед на изходния код на рамката</translation> <translation id="1164674268730883318">Да се изключи ли Smart Lock за <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Въведете PUK кода</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Профил за Google Play Магазин</translation> <translation id="2509495747794740764">Коефициентът на мащабиране трябва да е число между 10 и 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Попълвайте автоматично формуляри</translation> <translation id="2513403576141822879">За още настройки за поверителността, сигурността и събирането на данни вижте <ph name="BEGIN_LINK" />Синхронизиране и услуги на Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Сканиране</translation> @@ -1354,6 +1356,7 @@ <translation id="3020990233660977256">Сериен номер: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Преглед на изходния код на рамката</translation> <translation id="3022978424994383087">Не разбрахме това.</translation> +<translation id="3023464535986383522">Прочитане на глас</translation> <translation id="3024374909719388945">Използване на 24-часов часовник</translation> <translation id="302781076327338683">Презареждане със заобикаляне на кеша</translation> <translation id="3031417829280473749">Агент „X“</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">Следващият метод на въвеждане</translation> <translation id="3640214691812501263">Да се добави ли <ph name="EXTENSION_NAME" /> за <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Ширина</translation> +<translation id="3645372836428131288">Преместете малко пръста си, за да бъде заснета друга част от отпечатъка.</translation> <translation id="3648348069317717750">Открито е устройство <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Снимката бе направена</translation> <translation id="3650952250015018111">Разрешаване на "<ph name="APP_NAME" />" да има достъп до:</translation> @@ -1947,7 +1951,6 @@ <translation id="3920504717067627103">Правила за сертификата</translation> <translation id="392089482157167418">Активиране на ChromeVox (обратна връзка с говор)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Нямате наскоро записани регистрационни файлове за WebRTC.</translation> <translation id="3925573269917483990">Камера:</translation> <translation id="3925842537050977900">Освобождаване от лавицата</translation> <translation id="3926002189479431949">Телефонът за Smart Lock е променен</translation> @@ -2223,6 +2226,7 @@ <translation id="438503109373656455">Светкавица</translation> <translation id="4387004326333427325">Сертификатът за удостоверяване бе отхвърлен отдалечено</translation> <translation id="4389091756366370506">Потребител <ph name="VALUE" /></translation> +<translation id="439266289085815679">Конфигурацията на Bluetooth се управлява от <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Деактивиране</translation> <translation id="4400367121200150367">Тук ще се покажат сайтовете, паролата за които никога не се запазва</translation> <translation id="4400632832271803360">Натиснете и задръжте клавиша за стартовия панел, за да промените поведението на клавишите от най-горния ред.</translation> @@ -2296,6 +2300,7 @@ <translation id="4522600456902129422">Този сайт да продължи да има достъп за преглед на буферната памет</translation> <translation id="4530494379350999373">Произход</translation> <translation id="4533985347672295764">Процесорно време</translation> +<translation id="4534661889221639075">Опитайте отново.</translation> <translation id="4535127706710932914">Потребителски профил по подразбиране</translation> <translation id="4538417792467843292">Изтриване на дума</translation> <translation id="4538684596480161368">Приставките извън тестова среда да се блокират винаги за <ph name="HOST" /></translation> @@ -2525,6 +2530,7 @@ <translation id="4880520557730313061">Автокоригиране</translation> <translation id="4880827082731008257">Търсене в историята</translation> <translation id="4881695831933465202">Отваряне</translation> +<translation id="4882312758060467256">Има достъп до този сайт</translation> <translation id="4882473678324857464">Преместване на фокуса върху отметките</translation> <translation id="4882831918239250449">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето, рекламите и др.</translation> <translation id="4883178195103750615">Експортиране на отметки в HTML файл...</translation> @@ -2590,6 +2596,7 @@ <translation id="4969785127455456148">Албум</translation> <translation id="4971412780836297815">Отваряне след приключване</translation> <translation id="4972129977812092092">Редактиране на принтера</translation> +<translation id="4972164225939028131">Грешна парола</translation> <translation id="497287958838527945">Кредитни карти и адреси посредством Google Pay.</translation> <translation id="4973307593867026061">Добавяне на принтери</translation> <translation id="4973523518332075481">Използвайте име с дължина най-много <ph name="MAX_LENGTH" /> знака</translation> @@ -2744,7 +2751,7 @@ <translation id="5227808808023563348">Търсене на предишния текст</translation> <translation id="5228076606934445476">Нещо не е наред с устройството. За възстановяване от тази грешка ще трябва да рестартирате устройството и да опитате отново.</translation> <translation id="5229189185761556138">Управление на методите на въвеждане</translation> -<translation id="5230516054153933099">Прозорец</translation> +<translation id="5230516054153933099">Window</translation> <translation id="5233019165164992427">Порт за отстраняване на грешки в клиента с директно изпълнение</translation> <translation id="5233231016133573565">Номер на процеса</translation> <translation id="5233638681132016545">Нов раздел</translation> @@ -3017,6 +3024,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Приложенията се зареждат...</translation> <translation id="5592595402373377407">Още не са налице достатъчно данни.</translation> +<translation id="5593357315997824387">Синхронизиране на файловете ми</translation> <translation id="5595152862129936745">Много далеч</translation> <translation id="5595485650161345191">Редактиране на адреса</translation> <translation id="5596627076506792578">Още опции</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">За съжаление компютърът ви е конфигуриран с неправилно образуван идентификационен номер на хардуера. Това не позволява на Chrome OS да се актуализира с най-новите корекции за сигурност и машината ви <ph name="BEGIN_BOLD" />може да е уязвима към злонамерени атаки<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Нещо се обърка при отварянето на потребителския ви профил. Моля, излезте от профила си и влезте отново.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">спиране на таймера</translation> <translation id="667517062706956822">Искате ли Google да преведе тази страница от <ph name="SOURCE_LANGUAGE" /> на <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Свързано е посочващо устройство</translation> <translation id="6678717876183468697">URL адрес на заявката</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Запазване в лентата с инструменти</translation> <translation id="7187428571767585875">Записи в системния регистър, които ще бъдат премахнати или променени:</translation> <translation id="7189234443051076392">Уверете се, че има достатъчно място на устройството ви.</translation> +<translation id="7189965711416741966">Отпечатъкът е добавен.</translation> <translation id="7191159667348037">Неизвестен принтер (USB)</translation> <translation id="7191454237977785534">Запазване на файла като</translation> <translation id="7193374945610105795">Няма запазени пароли за <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Нов прозорец</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> сега е на цял екран.</translation> <translation id="7340650977506865820">Сайтът споделя екрана ви</translation> +<translation id="7341834142292923918">Иска достъп до този сайт</translation> <translation id="7345706641791090287">Потвърждаване на паролата</translation> <translation id="7346909386216857016">Добре, разбрах</translation> <translation id="7347751611463936647">За да използвате това разширение, въведете „<ph name="EXTENSION_KEYWORD" />“, след това натиснете „Tab“, след което въведете своята команда или търсене.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Услугата на Google за местоположение използва източници като Wi-Fi, мобилни мрежи и сензори, за да определя къде се намира устройството ви. Тя е активна, когато настройката „Местоположение“ на устройството е включена.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Можете да изключите местоположението, като деактивирате главната настройка за него на устройството си. Също така от настройките за местоположението сте в състояние да изключите използването на Wi-Fi, мобилни мрежи и сензори за определянето му.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Създаване на парола –</translation> -<translation id="7518150891539970662">Регистрационни файлове за WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7525067979554623046">Създаване</translation> <translation id="7529411698175791732">Проверете връзката си с интернет. Ако проблемът продължи, опитайте да излезете от профила си и отново да влезете в него.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Премахване на този човек</translation> <translation id="8217399928341212914">Автоматичното изтегляне на няколко файла да остане блокирано</translation> <translation id="8223479393428528563">За да запазите тези файлове за използване офлайн, върнете се онлайн, кликнете с десния бутон на мишката върху тях и изберете опцията „<ph name="OFFLINE_CHECKBOX_NAME" />“.</translation> +<translation id="8225753906568652947">Осребряване на офертите</translation> <translation id="8226222018808695353">Забранено</translation> <translation id="8226619461731305576">Опашка</translation> <translation id="8226742006292257240">По-долу е произволно генерираната чрез модула TPM парола, която е присвоена на компютъра ви:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Вход</translation> <translation id="8286963743045814739">Можете да сърфирате частно посредством прозорец в режим „инкогнито“</translation> <translation id="82871696630048499">Уеб страницата бе презаредена, защото паметта й се изчерпа.</translation> +<translation id="8288032458496410887">Деинсталиране на <ph name="APP" />...</translation> <translation id="8291967909914612644">Държава на собствения доставчик</translation> <translation id="8294431847097064396">Източник</translation> <translation id="8297006494302853456">Слаб</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Първо ще се извежда запитване (препоръчително)</translation> <translation id="8418445294933751433">&Показване като раздел</translation> <translation id="8419098111404128271">Резултати от търсенето на „<ph name="SEARCH_TEXT" />“</translation> +<translation id="8419368276599091549">Добре дошли в устройството си <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Показване на файлове от Google Документи</translation> <translation id="8424039430705546751">надолу</translation> <translation id="8425213833346101688">Промяна</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Конфигуриране на мрежовите връзки</translation> <translation id="8624205858755890468">Дава възможност на Асистент да ви показва подходящи приложения, информация и действия.</translation> <translation id="862542460444371744">&Разширения</translation> +<translation id="8626219642120025691">Таймерът завърши</translation> <translation id="8627151598708688654">Избиране на източник</translation> <translation id="862727964348362408">Спряно</translation> <translation id="862750493060684461">Кеш за CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Редакциите ви се запазват автоматично.<ph name="BREAKS" />За да съхраните копие на оригиналното изображение, премахнете отметката от „Презаписване на оригинала“</translation> <translation id="8777628254805677039">парола на root</translation> <translation id="8780443667474968681">Функцията за гласово търсене е изключена.</translation> +<translation id="878068003854005405">Да започваме. Поставете пръста си върху сензора.</translation> <translation id="878069093594050299">Този сертификат бе удостоверен за следните употреби:</translation> <translation id="8781980678064919987">Изключване при затваряне на капака</translation> <translation id="8782565991310229362">Стартирането на павилионното приложение е анулирано.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Парола</translation> <translation id="9052208328806230490">Регистрирахте принтерите си в <ph name="CLOUD_PRINT_NAME" />, използвайки профила <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Продължаване на блокирането</translation> +<translation id="9053091947372579468">Устройството ви включва лиценз за Chrome, но потребителското ви име не е свързано с конзола за администратори. За да продължите регистрирането, моля, създайте профил в тази конзола. Забележка: Ако използвате собствен домейн за създаването на нов профил в конзолата за администратори, също така трябва да потвърдите домейна след регистрацията. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Запомняне на избора ми</translation> <translation id="9055636786322918818">Задължително прилагане на RC4 шифроване. Използването на тази опция увеличава риска, тъй като шифрите RC4 са несигурни.</translation> <translation id="9056034633062863292">Актуализиране на Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Задаване по подразбиране</translation> <translation id="9219103736887031265">Изображения</translation> <translation id="9220525904950070496">Премахване на профила</translation> +<translation id="9220820413868316583">Вдигнете пръст и след това опитайте отново.</translation> <translation id="923467487918828349">Показване на всички</translation> <translation id="928985544179707652">Разширения:</translation> <translation id="930268624053534560">Подробни клейма за време</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 2e025691..4b6f7b0 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -994,7 +994,6 @@ <translation id="2508428939232952663">Google Play স্টোর অ্যাকাউন্ট</translation> <translation id="2509495747794740764">স্কেলের মাপকে অবশ্যই ১০ থেকে ১০০ এর মধ্যের একটি সংখ্যা হতে হবে।</translation> <translation id="2509566264613697683">৮x</translation> -<translation id="2512222046227390255">ফর্মগুলি স্বতঃপূর্ণ করুন</translation> <translation id="2513403576141822879">আপনার গোপনীয়তা, নিরাপত্তা এবং ডেটা সংগ্রহের সাথে সম্পর্কযুক্ত আরও সেটিংসের জন্য <ph name="BEGIN_LINK" />সিঙ্ক এবং Google পরিষেবাগুলি<ph name="END_LINK" /> দেখুন</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">স্ক্যান করুন</translation> @@ -1926,7 +1925,6 @@ <translation id="3920504717067627103">শংসাপত্রের নীতিসমূহ</translation> <translation id="392089482157167418">ChromeVox (কথ্য প্রতিক্রিয়া) সক্ষম করুন</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">আপনার কোনো সাম্প্রতিক ক্যাপচার করা WebRTC লগ নেই।</translation> <translation id="3925573269917483990">ক্যামেরা:</translation> <translation id="3925842537050977900">তাক থেকে আনপিন করুন</translation> <translation id="3926002189479431949">Smart Lock ফোন পরিবর্তিত হয়েছে</translation> @@ -4211,7 +4209,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google-এর লোকেশন পরিষেবা আপনার ডিভাইসের লোকেশন অনুমান করতে সহায়তা করার জন্য ওয়াই-ফাই, মোবাইল নেটওয়ার্ক এবং সেন্সরগুলির মতো উৎসগুলি ব্যবহার করে। আপনার ডিভাইসের লোকেশন সেটিংস চালু হলে এই পরিষেবাটি সক্রিয় হয়।<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />আপনি আপনার ডিভাইসের প্রধান লোকেশন সেটিংস বন্ধ করে লোকেশনটি বন্ধ করতে পারেন। আপনি লোকেশন সেটিংসে অবস্থানের জন্য ওয়াই-ফাই, মোবাইল নেটওয়ার্ক এবং সেন্সর ব্যবহার বন্ধ করতে পারেন।<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">একটি পাসওয়ার্ড তৈরি করুন -</translation> -<translation id="7518150891539970662">WebRTC লগগুলি (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">তৈরি করুন</translation> <translation id="7529411698175791732">আপনার ইন্টারনেট সংযোগ পরীক্ষা করুন। সমস্যাটি থেকে গেলে, সাইন আউট করে আবার প্রবেশ করার চেষ্টা করুন।</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 6d02bc5..11926d2c 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Cap xarxa</translation> <translation id="1056898198331236512">Advertiment</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registre de l'empremta digital</translation> <translation id="1061904396131502319">Ja gairebé és l'hora de fer una pausa</translation> <translation id="1062407476771304334">Substitueix</translation> <translation id="1067048845568873861">Creada</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">L'ordinador conté un dispositiu de seguretat amb mòdul de plataforma de confiança (TPM), que s'utilitza per implementar un gran nombre de funcions clau de seguretat a Chrome OS. Visiteu el Centre d'ajuda de Chromebook per obtenir més informació: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Posa en repòs quan es tanqui la tapa</translation> +<translation id="1115324527092594775">Configura Better Together</translation> <translation id="1116694919640316211">Informació</translation> <translation id="1116779635164066733">L'extensió <ph name="NAME" /> aplica aquesta opció de configuració.</translation> <translation id="111844081046043029">Confirmes que vols marxar d'aquesta pàgina?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Hora actual</translation> <translation id="1157102636231978136">Les teves dades de navegació i activitat, sincronitzades al teu Compte de Google</translation> <translation id="1161575384898972166">Inicieu la sessió a <ph name="TOKEN_NAME" /> per exportar el certificat de client.</translation> +<translation id="1161699061380012396">Mètode d'introducció de text a Chrome OS</translation> <translation id="1163931534039071049">&Visualitza l'origen del marc</translation> <translation id="1164674268730883318">Vols desactivar Smart Lock per a <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Introdueix el PUK</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Compte de Google Play Store</translation> <translation id="2509495747794740764">El valor de l'escala ha d'oscil·lar entre 10 i 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Emplena formularis automàticament</translation> <translation id="2513403576141822879">Per trobar més opcions relacionades amb la privadesa, la seguretat i la recollida de dades, consulta <ph name="BEGIN_LINK" />Sincronització i serveis de Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Cerca</translation> @@ -1356,6 +1358,7 @@ <translation id="3020990233660977256">Número de sèrie: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Visualitza l'origen del marc</translation> <translation id="3022978424994383087">No t'he entès.</translation> +<translation id="3023464535986383522">Escolta la selecció</translation> <translation id="3024374909719388945">Utilitza el rellotge de 24 hores</translation> <translation id="302781076327338683">Actualitza sense utilizar la memòria cau</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">Mètode d'introducció següent</translation> <translation id="3640214691812501263">Voleu afegir l'extensió <ph name="EXTENSION_NAME" /> per a <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Amplada</translation> +<translation id="3645372836428131288">Mou el dit lleugerament perquè es pugui capturar una altra part de l'empremta digital.</translation> <translation id="3648348069317717750">S'ha detectat <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">S'ha fet la foto.</translation> <translation id="3650952250015018111">Permet que "<ph name="APP_NAME" />" accedeixi a:</translation> @@ -1946,7 +1950,6 @@ <translation id="3920504717067627103">Normes de certificats</translation> <translation id="392089482157167418">Activa ChromeVox (comentaris de veu)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">No teniu registres de WebRTC capturats recentment.</translation> <translation id="3925573269917483990">Càmera:</translation> <translation id="3925842537050977900">No el fixis al prestatge</translation> <translation id="3926002189479431949">El telèfon amb Smart Lock ha canviat</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">Cavall</translation> <translation id="4387004326333427325">S'ha rebutjat el certificat d'autenticació de manera remota</translation> <translation id="4389091756366370506">Usuari <ph name="VALUE" /></translation> +<translation id="439266289085815679"><ph name="USER_EMAIL" /> controla la configuració del Bluetooth.</translation> <translation id="4394049700291259645">Desactiva</translation> <translation id="4400367121200150367">Els llocs que no desen contrasenyes mai es mostraran aquí</translation> <translation id="4400632832271803360">Mantén premuda la tecla Menú d'aplicacions per canviar el comportament de les tecles de la fila superior</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">Continua permetent que aquest lloc web vegi el porta-retalls</translation> <translation id="4530494379350999373">Origen</translation> <translation id="4533985347672295764">Temps de la CPU</translation> +<translation id="4534661889221639075">Torna-ho a provar.</translation> <translation id="4535127706710932914">Perfil predeterminat</translation> <translation id="4538417792467843292">Suprimeix la paraula</translation> <translation id="4538684596480161368">Bloqueja sempre els connectors fora de la zona de proves a <ph name="HOST" /></translation> @@ -2524,6 +2529,7 @@ <translation id="4880520557730313061">Correcció automàtica</translation> <translation id="4880827082731008257">Cerca a l'historial</translation> <translation id="4881695831933465202">Obre</translation> +<translation id="4882312758060467256">Té accés a aquest lloc web</translation> <translation id="4882473678324857464">Mou el focus a les adreces d'interès</translation> <translation id="4882831918239250449">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca, els anuncis i molt més</translation> <translation id="4883178195103750615">Exporta les adreces d'interès a un fitxer HTML...</translation> @@ -2589,6 +2595,7 @@ <translation id="4969785127455456148">Àlbum</translation> <translation id="4971412780836297815">Obre quan acabi</translation> <translation id="4972129977812092092">Edita la impressora</translation> +<translation id="4972164225939028131">La contrasenya no és correcta</translation> <translation id="497287958838527945">Targetes de crèdit i adreces que fan servir Google Pay.</translation> <translation id="4973307593867026061">Afegeix impressores</translation> <translation id="4973523518332075481">Utilitza un nom que tingui <ph name="MAX_LENGTH" /> caràcters com a màxim</translation> @@ -3017,6 +3024,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">S'estan carregant les aplicacions...</translation> <translation id="5592595402373377407">Encara no hi ha prou dades disponibles.</translation> +<translation id="5593357315997824387">Sincronitza els meus fitxers</translation> <translation id="5595152862129936745">Molt lluny</translation> <translation id="5595485650161345191">Edita l'adreça</translation> <translation id="5596627076506792578">Més opcions</translation> @@ -3732,6 +3740,7 @@ <translation id="6664237456442406323">L'ordinador està configurat amb un ID de maquinari amb un format incorrecte. Això impedeix a Chrome OS actualitzar-se amb les darreres correccions de seguretat i <ph name="BEGIN_BOLD" />pot ser que l'ordinador sigui vulnerable a atacs maliciosos<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">S'ha produït un error en obrir el teu perfil. Tanca la sessió i torna-la a iniciar.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">atura el temporitzador</translation> <translation id="667517062706956822">Voleu que Google tradueixi a <ph name="TARGET_LANGUAGE" /> aquesta pàgina escrita en <ph name="SOURCE_LANGUAGE" />?</translation> <translation id="6675665718701918026">S'ha connectat un dispositiu per apuntar</translation> <translation id="6678717876183468697">URL de la consulta</translation> @@ -4058,6 +4067,7 @@ <translation id="7186088072322679094">Conserva a la barra d'eines</translation> <translation id="7187428571767585875">Entrades del registre que se suprimiran o canviaran:</translation> <translation id="7189234443051076392">Comprova que hi hagi prou espai al dispositiu</translation> +<translation id="7189965711416741966">L'empremta digital s'ha afegit.</translation> <translation id="7191159667348037">Impressora desconeguda (USB)</translation> <translation id="7191454237977785534">Anomena i desa</translation> <translation id="7193374945610105795">No hi ha cap contrasenya desada per a <ph name="ORIGIN" /></translation> @@ -4158,6 +4168,7 @@ <translation id="7339898014177206373">Finestra nova</translation> <translation id="7340431621085453413">Ara <ph name="FULLSCREEN_ORIGIN" /> a pantalla completa.</translation> <translation id="7340650977506865820">El lloc web està compartint la pantalla</translation> +<translation id="7341834142292923918">Vol accedir a aquest lloc web</translation> <translation id="7345706641791090287">Confirma la contrasenya</translation> <translation id="7346909386216857016">D'acord</translation> <translation id="7347751611463936647">Per utilitzar aquesta extensió, escriviu "<ph name="EXTENSION_KEYWORD" />", premeu la tecla de tabulació i indiqueu l'ordre o la cerca.</translation> @@ -4267,7 +4278,6 @@ <ph name="BEGIN_PARAGRAPH2" />El servei d'ubicació de Google utilitza fonts com ara sensors, xarxes mòbils i Wi-Fi per calcular la ubicació del dispositiu. Aquest servei s'activa quan l'opció Ubicació del dispositiu està activada.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Pots desactivar la ubicació desactivant l'opció Ubicació principal del dispositiu. També pots desactivar l'ús de Wi-Fi, xarxes mòbils i sensors per calcular la ubicació a la configuració d'ubicació.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Crea una contrasenya</translation> -<translation id="7518150891539970662">Registres de WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Crea</translation> <translation id="7529411698175791732">Comprova la connexió a Internet. Si el problema continua, prova de tancar la sessió i tornar-la a iniciar.</translation> @@ -4743,6 +4753,7 @@ <translation id="8214962590150211830">Suprimeix aquesta persona</translation> <translation id="8217399928341212914">Continua bloquejant les baixades automàtiques de diversos fitxers</translation> <translation id="8223479393428528563">Per desar aquests fitxers per utilitzar-los fora de línia, connecteu-vos a una xarxa, feu clic amb el botó dret als fitxers i seleccioneu l'opció <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Bescanvia les teves ofertes</translation> <translation id="8226222018808695353">Prohibit</translation> <translation id="8226619461731305576">Cua</translation> <translation id="8226742006292257240">A continuació, trobareu la contrasenya de TPM generada aleatòriament que s'ha assignat al vostre ordinador:</translation> @@ -4789,6 +4800,7 @@ <translation id="8286036467436129157">Inicia la sessió</translation> <translation id="8286963743045814739">Pots navegar de manera privada utilitzant una finestra d'incògnit</translation> <translation id="82871696630048499">La pàgina web s'ha tornat a carregar perquè s'ha quedat sense memòria.</translation> +<translation id="8288032458496410887">Desinstal·la <ph name="APP" />...</translation> <translation id="8291967909914612644">País del proveïdor domèstic</translation> <translation id="8294431847097064396">Font</translation> <translation id="8297006494302853456">Feble</translation> @@ -4850,6 +4862,7 @@ <translation id="8413385045638830869">Pregunta-m'ho abans (recomanat)</translation> <translation id="8418445294933751433">&Mostra com a pestanya</translation> <translation id="8419098111404128271">Resultats de la cerca per a "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Et donem la benvinguda al teu <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Mostra els fitxers de Google Docs</translation> <translation id="8424039430705546751">avall</translation> <translation id="8425213833346101688">Canvia</translation> @@ -4976,6 +4989,7 @@ <translation id="8620765578342452535">Configurar les connexions de xarxa</translation> <translation id="8624205858755890468">Permet que l'Assistent et mostri informació, aplicacions i accions relacionades.</translation> <translation id="862542460444371744">&Extensions</translation> +<translation id="8626219642120025691">Temporitzador finalitzat</translation> <translation id="8627151598708688654">Seleccioneu una font</translation> <translation id="862727964348362408">Suspesa</translation> <translation id="862750493060684461">Memòria cau CSS</translation> @@ -5096,6 +5110,7 @@ <translation id="8775404590947523323">Els canvis es desen automàticament.<ph name="BREAKS" />Per conservar una còpia de la imatge original, desmarqueu "Sobreescriu l'original"</translation> <translation id="8777628254805677039">contrasenya arrel</translation> <translation id="8780443667474968681">La cerca per veu s'ha desactivat.</translation> +<translation id="878068003854005405">Comencem. Col·loca el dit al sensor.</translation> <translation id="878069093594050299">Aquest certificat s'ha verificat per als usos següents:</translation> <translation id="8781980678064919987">Apaga quan es tanqui la tapa</translation> <translation id="8782565991310229362">S'ha cancel·lat l'inici de l'aplicació de quiosc.</translation> @@ -5273,6 +5288,7 @@ <translation id="9050666287014529139">Frase de contrasenya</translation> <translation id="9052208328806230490">Heu registrat les vostres impressores amb <ph name="CLOUD_PRINT_NAME" /> utilitzant el compte <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Continua bloquejant</translation> +<translation id="9053091947372579468">El dispositiu inclou una llicència de Chrome, però el teu nom d'usuari no està associat a cap consola d'administració. Crea un compte de consola d'administració per continuar amb la inscripció. Nota: si decideixes crear-lo amb el teu propi domini, després de registrar-te també has de completar la verificació del domini. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Recorda la meva tria</translation> <translation id="9055636786322918818">Força l'encriptació RC4. L'ús d'aquesta opció augmenta el risc, ja que els xifratges RC4 no són segurs.</translation> <translation id="9056034633062863292">S'està actualitzant Chromebox</translation> @@ -5376,6 +5392,7 @@ <translation id="9218430445555521422">Estableix com a predeterminat</translation> <translation id="9219103736887031265">Imatges</translation> <translation id="9220525904950070496">Suprimir el compte</translation> +<translation id="9220820413868316583">Aixeca el dit i torna-ho a provar.</translation> <translation id="923467487918828349">Mostra-les totes</translation> <translation id="928985544179707652">Extensions:</translation> <translation id="930268624053534560">Marques de temps detallades</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 922a0c4..0894cd2 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Žádné sítě</translation> <translation id="1056898198331236512">Upozornění</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrace otisku prstu</translation> <translation id="1061904396131502319">Brzy bude čas na přestávku</translation> <translation id="1062407476771304334">Nahradit</translation> <translation id="1067048845568873861">Vytvořeno</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Váš počítač obsahuje bezpečnostní zařízení TPM (Trusted Platform Module), jehož pomocí je do systému Chrome OS implementováno mnoho důležitých bezpečnostních funkcí. Další informace najdete v centru nápovědy k Chromebookům: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Při zavření víka přejít do režimu spánku</translation> +<translation id="1115324527092594775">Nastavení lepší spolupráce</translation> <translation id="1116694919640316211">Informace</translation> <translation id="1116779635164066733">Toto nastavení je vynucováno rozšířením <ph name="NAME" />.</translation> <translation id="111844081046043029">Jste si jisti, že chcete opustit tuto stránku?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Aktuální čas</translation> <translation id="1157102636231978136">Vaše údaje o prohlížení a aktivita synchronizované do účtu Google</translation> <translation id="1161575384898972166">Chcete-li exportovat certifikát klienta, přihlaste se prosím do zařízení <ph name="TOKEN_NAME" />.</translation> +<translation id="1161699061380012396">Metoda zadávání v systému Chrome OS</translation> <translation id="1163931534039071049">Zobrazit zdrojový kód rámu</translation> <translation id="1164674268730883318">Vypnout v zařízení <ph name="DEVICE_TYPE" /> funkci Smart Lock?</translation> <translation id="1164899421101904659">Zadejte klíč k odemknutí kódu PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Účet Obchodu Google Play</translation> <translation id="2509495747794740764">Hodnota měřítka musí být v intervalu 10 až 200.</translation> <translation id="2509566264613697683">8×</translation> -<translation id="2512222046227390255">Automaticky vyplňovat formuláře</translation> <translation id="2513403576141822879">Další nastavení související s ochranou soukromí, zabezpečením a shromažďováním dat naleznete v části <ph name="BEGIN_LINK" />Synchronizace a služby Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Vyhledat</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Sériové číslo: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">Zobrazit zdrojo&vý kód rámce</translation> <translation id="3022978424994383087">Nerozumím.</translation> +<translation id="3023464535986383522">Poslech vybraného textu</translation> <translation id="3024374909719388945">Použít hodiny s formátem 24 h</translation> <translation id="302781076327338683">Znovu načíst bez použití mezipaměti</translation> <translation id="3031417829280473749">Agentka</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">Další metoda zadávání</translation> <translation id="3640214691812501263">Přidat aplikaci <ph name="EXTENSION_NAME" /> pro uživatele <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Šířka</translation> +<translation id="3645372836428131288">Lehce prst natočte, aby se zaznamenala jiná část otisku.</translation> <translation id="3648348069317717750">Bylo rozpoznáno zařízení <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Fotografie byla pořízena</translation> <translation id="3650952250015018111">Povolte aplikaci "<ph name="APP_NAME" />" tyto přístupy:</translation> @@ -1946,7 +1950,6 @@ <translation id="3920504717067627103">Zásady certifikátů</translation> <translation id="392089482157167418">Zapnout funkci ChromeVox (hlasovou odezvu)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nemáte žádné nedávno zaznamenané protokoly WebRTC.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Uvolnit z poličky</translation> <translation id="3926002189479431949">Došlo ke změně telefonu funkce Smart Lock</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">Hříbě</translation> <translation id="4387004326333427325">Ověřovací certifikát byl vzdáleně odmítnut</translation> <translation id="4389091756366370506">Uživatel <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfiguraci rozhraní Bluetooth spravuje <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Deaktivovat</translation> <translation id="4400367121200150367">Zde se zobrazí weby, které nikdy neukládají heslo</translation> <translation id="4400632832271803360">Podržením tlačítka spouštěče přepnete chování tlačítek v horním řádku</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">I nadále tomuto webu přístup ke schránce povolovat</translation> <translation id="4530494379350999373">Původ</translation> <translation id="4533985347672295764">Doba využití procesoru</translation> +<translation id="4534661889221639075">Zkuste to znovu.</translation> <translation id="4535127706710932914">Výchozí profil</translation> <translation id="4538417792467843292">Smazat slovo</translation> <translation id="4538684596480161368">Vždy blokovat rozbalené pluginy u hostitele <ph name="HOST" /></translation> @@ -2523,6 +2528,7 @@ <translation id="4880520557730313061">Automatická oprava</translation> <translation id="4880827082731008257">Hledat v historii</translation> <translation id="4881695831933465202">Otevřít</translation> +<translation id="4882312758060467256">Má přístup k této síti</translation> <translation id="4882473678324857464">Přejít do záložek</translation> <translation id="4882831918239250449">Nastavte, jak se má vaše historie procházení používat k personalizaci Vyhledávání, reklam a dalších služeb</translation> <translation id="4883178195103750615">Exportovat záložky do souboru HTML...</translation> @@ -2588,6 +2594,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Po dokončení otevřít</translation> <translation id="4972129977812092092">Úprava tiskárny</translation> +<translation id="4972164225939028131">Špatné heslo</translation> <translation id="497287958838527945">Platební karty a adresy pomocí služby Google Pay</translation> <translation id="4973307593867026061">Přidat tiskárny</translation> <translation id="4973523518332075481">Název nesmí být delší než <ph name="MAX_LENGTH" /> znaků</translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Načítání aplikací...</translation> <translation id="5592595402373377407">Zatím není k dispozici dostatek dat.</translation> +<translation id="5593357315997824387">Synchronizovat moje soubory</translation> <translation id="5595152862129936745">Velmi daleko</translation> <translation id="5595485650161345191">Upravit adresu</translation> <translation id="5596627076506792578">Další možnosti</translation> @@ -3729,6 +3737,7 @@ <translation id="6664237456442406323">Váš počítač je bohužel nakonfigurován pomocí chybného čísla hardwaru. Systému Chrome OS to zabraňuje získat aktualizace s nejnovějšími bezpečnostními opravami, a počítač tak <ph name="BEGIN_BOLD" />může být zranitelnější vůči škodlivým úrokům<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Při otevírání vašeho profilu se něco pokazilo. Odhlaste se a poté se znovu přihlaste.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">zastavit časovač</translation> <translation id="667517062706956822">Chcete, aby Google tuto stránku přeložil z jazyka <ph name="SOURCE_LANGUAGE" /> do jazyka <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Je připojeno polohovací zařízení</translation> <translation id="6678717876183468697">Adresa URL dotazu</translation> @@ -4055,6 +4064,7 @@ <translation id="7186088072322679094">Ponechat na liště</translation> <translation id="7187428571767585875">Záznamy v registru, které budou odstraněny nebo změněny:</translation> <translation id="7189234443051076392">V zařízení musí být dost místa</translation> +<translation id="7189965711416741966">Otisk byl přidán.</translation> <translation id="7191159667348037">Neznámá tiskárna (USB)</translation> <translation id="7191454237977785534">Uložit soubor jako</translation> <translation id="7193374945610105795">Pro web <ph name="ORIGIN" /> nejsou uložena žádná hesla</translation> @@ -4155,6 +4165,7 @@ <translation id="7339898014177206373">Nové okno</translation> <translation id="7340431621085453413">Stránka <ph name="FULLSCREEN_ORIGIN" /> se zobrazuje na celou obrazovku.</translation> <translation id="7340650977506865820">Web sdílí vaši obrazovku</translation> +<translation id="7341834142292923918">Chce přístup k tomuto webu</translation> <translation id="7345706641791090287">Potvrďte heslo</translation> <translation id="7346909386216857016">Dobře, rozumím</translation> <translation id="7347751611463936647">Chcete-li použít toto rozšíření, zadejte klíčové slovo <ph name="EXTENSION_KEYWORD" />, stiskněte klávesu Tab a poté začněte psát příslušný příkaz nebo vyhledávaný výraz.</translation> @@ -4264,7 +4275,6 @@ <ph name="BEGIN_PARAGRAPH2" />Služby určování polohy Google používají zdroje, jako jsou sítě Wi-Fi, mobilní sítě a senzory, pomocí kterých se snaží odhadnout polohu vašeho zařízení. Tato služba je aktivní, když je v zařízení zapnuto nastavení Poloha.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Určování polohy můžete vypnout tím, že v zařízení deaktivujete hlavní nastavení polohy. V nastavení polohy můžete také vypnout používání sítí Wi-Fi, mobilních sítí a senzorů k určování polohy.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Vytvořte heslo –</translation> -<translation id="7518150891539970662">Protokoly WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Vytvořit</translation> <translation id="7529411698175791732">Zkontrolujte připojení k internetu. Pokud problém přetrvává, zkuste se odhlásit a znovu přihlásit.</translation> @@ -4740,6 +4750,7 @@ <translation id="8214962590150211830">Odebrat tohoto uživatele</translation> <translation id="8217399928341212914">I nadále blokovat automatické stahování několika souborů</translation> <translation id="8223479393428528563">Chcete-li tyto soubory uložit pro používání offline, vraťte se zpět online, klikněte na ně pravým tlačítkem a vyberte možnost <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Využít nabídky</translation> <translation id="8226222018808695353">Zakázané</translation> <translation id="8226619461731305576">Fronta</translation> <translation id="8226742006292257240">Níže je náhodně vygenerované heslo modulu TPM, které bylo přiřazeno vašemu počítači:</translation> @@ -4786,6 +4797,7 @@ <translation id="8286036467436129157">Přihlásit se</translation> <translation id="8286963743045814739">V anonymním okně můžete web procházet v soukromí.</translation> <translation id="82871696630048499">Webová stránka byla načtena znovu, protože nebylo k dispozici dost paměti.</translation> +<translation id="8288032458496410887">Odinstalovat aplikaci <ph name="APP" />…</translation> <translation id="8291967909914612644">Země domácího poskytovatele</translation> <translation id="8294431847097064396">Zdroj</translation> <translation id="8297006494302853456">Slabý</translation> @@ -4847,6 +4859,7 @@ <translation id="8413385045638830869">Nejprve se dotázat (doporučeno)</translation> <translation id="8418445294933751433">Zobrazit jako kartu</translation> <translation id="8419098111404128271">Výsledky vyhledávání pro <ph name="SEARCH_TEXT" /></translation> +<translation id="8419368276599091549">Vítá vás <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Zobrazit soubory Dokumentů Google</translation> <translation id="8424039430705546751">dolů</translation> <translation id="8425213833346101688">Změnit</translation> @@ -4973,6 +4986,7 @@ <translation id="8620765578342452535">Konfigurovat síťová připojení</translation> <translation id="8624205858755890468">Umožňuje Asistentovi zobrazovat vám související informace, aplikace a akce.</translation> <translation id="862542460444371744">Rozšíř&ení</translation> +<translation id="8626219642120025691">Dokončeno</translation> <translation id="8627151598708688654">Vyberte zdroj</translation> <translation id="862727964348362408">Pozastaveno</translation> <translation id="862750493060684461">Mezipaměť CSS</translation> @@ -5093,6 +5107,7 @@ <translation id="8775404590947523323">Úpravy se ukládají automaticky.<ph name="BREAKS" />Chcete-li zachovat kopii původního obrázku, zrušte zaškrtnutí políčka Přepsat originál.</translation> <translation id="8777628254805677039">heslo uživatele root</translation> <translation id="8780443667474968681">Hlasové vyhledávání bylo vypnuto.</translation> +<translation id="878068003854005405">Začněte tím, že umístíte prst na snímač.</translation> <translation id="878069093594050299">Tento certifikát byl ověřen pro následující použití:</translation> <translation id="8781980678064919987">Při zavření víka vypnout</translation> <translation id="8782565991310229362">Spouštění aplikací pro režim veřejného terminálu bylo zrušeno.</translation> @@ -5270,6 +5285,7 @@ <translation id="9050666287014529139">Heslová fráze</translation> <translation id="9052208328806230490">Registrovali jste tiskárny ve službě <ph name="CLOUD_PRINT_NAME" /> pomocí účtu <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Pokračovat v blokování</translation> +<translation id="9053091947372579468">Vaše zařízení obsahuje licenci Chrome, ale vaše uživatelské jméno není přidruženo k administrátorské konzoli. Chcete-li pokračovat s registrací, vytvořte účet administrátorské konzole. Poznámka: Pokud se rozhodnete vytvořit nový účet administrátorské konzole za pomoci vlastní domény, musíte po registraci provést také ověření domény. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Zapamatovat si výběr</translation> <translation id="9055636786322918818">Vynutit šifrování RC4. Použití této možnosti zvyšuje riziko, protože šifry RC4 nejsou bezpečné.</translation> <translation id="9056034633062863292">Aktualizace zařízení Chromebox</translation> @@ -5373,6 +5389,7 @@ <translation id="9218430445555521422">Nastavit jako výchozí</translation> <translation id="9219103736887031265">Obrázky</translation> <translation id="9220525904950070496">Odebrat účet</translation> +<translation id="9220820413868316583">Zdvihněte prst a zkuste to znovu.</translation> <translation id="923467487918828349">Zobrazit vše</translation> <translation id="928985544179707652">Rozšíření:</translation> <translation id="930268624053534560">Podrobná časová razítka</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 4a5516a..ed70a28 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Der er ingen netværk</translation> <translation id="1056898198331236512">Advarsel</translation> <translation id="1058262162121953039">PUK-kode</translation> +<translation id="1059855432287631118">Registrering af fingeraftryk</translation> <translation id="1061904396131502319">Det er snart tid til en pause</translation> <translation id="1062407476771304334">Erstat</translation> <translation id="1067048845568873861">Oprettet</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Computeren indeholder en sikkerhedsenhed for TPM (Trusted Platform Module), som bruges til at implementere flere vigtige sikkerhedsfunktioner i Chrome OS. Du kan få flere oplysninger i Hjælp til Chromebook: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Gå i dvale, når låget er lukket</translation> +<translation id="1115324527092594775">Konfigurer Better Together</translation> <translation id="1116694919640316211">Om</translation> <translation id="1116779635164066733">Denne indstilling håndhæves af udvidelsen "<ph name="NAME" />".</translation> <translation id="111844081046043029">Er du sikker på, at du vil forlade denne side?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Aktuel tid</translation> <translation id="1157102636231978136">Dine browserdata og -aktivitet, der synkroniseres med din Google-konto</translation> <translation id="1161575384898972166">Log ind på <ph name="TOKEN_NAME" /> for at eksportere klientcertifikatet.</translation> +<translation id="1161699061380012396">Indtastningsmetode for Chrome OS</translation> <translation id="1163931534039071049">&Vis rammens kildetekst</translation> <translation id="1164674268730883318">Vil du slå Smart Lock fra for <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Angiv nøgle til oplåsning af pinkode</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play Butik-konto</translation> <translation id="2509495747794740764">Skaleringsværdien skal være et tal mellem 10 og 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Udfyld formularer automatisk</translation> <translation id="2513403576141822879">Du kan finde flere indstillinger vedrørende privatliv, sikkerhed og dataindsamling ved at gå til <ph name="BEGIN_LINK" />Synkronisering og Google-tjenester<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scan</translation> @@ -1355,6 +1357,7 @@ <translation id="3020990233660977256">Serienummer: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Vis rammens kilde</translation> <translation id="3022978424994383087">Det er ikke forstået.</translation> +<translation id="3023464535986383522">Tekstoplæsning</translation> <translation id="3024374909719388945">Brug 24-timers ur</translation> <translation id="302781076327338683">Genindlæs med omgåelse af cachen</translation> <translation id="3031417829280473749">Scully</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">Næste indtastningsmetode</translation> <translation id="3640214691812501263">Vil du tilføje "<ph name="EXTENSION_NAME" />" for <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Bredde</translation> +<translation id="3645372836428131288">Flyt fingeren en smule for at registrere en anden del af fingeraftrykket.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> blev registreret</translation> <translation id="3649138363871392317">Billede blev taget</translation> <translation id="3650952250015018111">Giv "<ph name="APP_NAME" />" tilladelse til at få adgang til:</translation> @@ -1946,7 +1950,6 @@ <translation id="3920504717067627103">Certifikatpolitikker</translation> <translation id="392089482157167418">Aktivér ChromeVox (talefeedback)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Du har ingen nylige registrerede WebRTC-logfiler.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Frigør fra hylde</translation> <translation id="3926002189479431949">Smart Lock-telefon er blevet ændret</translation> @@ -2222,6 +2225,7 @@ <translation id="438503109373656455">Tarok</translation> <translation id="4387004326333427325">Godkendelsescertifikatet blev afvist eksternt</translation> <translation id="4389091756366370506">Bruger <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth-konfiguration kontrolleres af <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Deaktiver</translation> <translation id="4400367121200150367">Websites, som aldrig gemmer adgangskoder, vises her</translation> <translation id="4400632832271803360">Hold tasten Appliste nede for at skifte funktion for den øverste række taster</translation> @@ -2295,6 +2299,7 @@ <translation id="4522600456902129422">Tillad fortsat, at dette website kan se udklipsholderen</translation> <translation id="4530494379350999373">Origin</translation> <translation id="4533985347672295764">CPU-tid</translation> +<translation id="4534661889221639075">Prøv igen.</translation> <translation id="4535127706710932914">Standardprofil</translation> <translation id="4538417792467843292">Slet ord</translation> <translation id="4538684596480161368">Bloker altid plugins, der ikke er gemt i sandbox, på <ph name="HOST" /></translation> @@ -2524,6 +2529,7 @@ <translation id="4880520557730313061">Automatisk justering</translation> <translation id="4880827082731008257">Søg i historikken</translation> <translation id="4881695831933465202">Åbn</translation> +<translation id="4882312758060467256">Udvidelsen har adgang til dette website.</translation> <translation id="4882473678324857464">Fokuser på bogmærker</translation> <translation id="4882831918239250449">Styr, hvordan din browserhistorik anvendes til at tilpasse søgeresultater, annoncer og meget mere</translation> <translation id="4883178195103750615">Eksporter bogmærker til HTML-fil...</translation> @@ -2589,6 +2595,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Åbn, når den er gennemført</translation> <translation id="4972129977812092092">Rediger printer</translation> +<translation id="4972164225939028131">Forkert adgangskode</translation> <translation id="497287958838527945">Kreditkort og adresser fra Google Pay.</translation> <translation id="4973307593867026061">Tilføj printere</translation> <translation id="4973523518332075481">Brug et navn med højst <ph name="MAX_LENGTH" /> tegn</translation> @@ -3016,6 +3023,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Indlæser apps...</translation> <translation id="5592595402373377407">Der er ikke nok data til rådighed endnu.</translation> +<translation id="5593357315997824387">Synkroniser mine filer</translation> <translation id="5595152862129936745">Meget langt væk</translation> <translation id="5595485650161345191">Rediger adresse</translation> <translation id="5596627076506792578">Flere valgmuligheder</translation> @@ -3732,6 +3740,7 @@ <translation id="6664237456442406323">Din computer er desværre konfigureret med et hardware-id i forkert format. Dette forhindrer Chrome OS i at opdatere med de nyeste sikkerhedsrettelser, og din computer <ph name="BEGIN_BOLD" />kan være sårbar over for ondartede angreb<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Der gik noget galt ved åbningen af din profil. Nogle funktioner er muligvis ikke tilgængelige.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">stop timer</translation> <translation id="667517062706956822">Skal Google oversætte denne side fra <ph name="SOURCE_LANGUAGE" /> til <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Pegeredskabet er tilsluttet</translation> <translation id="6678717876183468697">Webadresse for søgeforespørgsler</translation> @@ -4058,6 +4067,7 @@ <translation id="7186088072322679094">Behold på værktøjslinjen</translation> <translation id="7187428571767585875">Registreringsposter, der skal fjernes eller ændres:</translation> <translation id="7189234443051076392">Sørg for, at der er nok ledig plads på din enhed</translation> +<translation id="7189965711416741966">Fingeraftryk er tilføjet.</translation> <translation id="7191159667348037">Ukendt printer (USB)</translation> <translation id="7191454237977785534">Gem fil som</translation> <translation id="7193374945610105795">Der er ikke gemt nogen adgangskoder til <ph name="ORIGIN" /></translation> @@ -4158,6 +4168,7 @@ <translation id="7339898014177206373">Nyt vindue</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> er nu i fuld skærm.</translation> <translation id="7340650977506865820">Websitet deler din skærm</translation> +<translation id="7341834142292923918">Udvidelsen anmoder om adgang til dette website</translation> <translation id="7345706641791090287">Bekræft din adgangskode</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">Hvis du vil bruge denne udvidelse, skal du indtaste "<ph name="EXTENSION_KEYWORD" />" og derefter TAB. Herefter skal du indtaste din kommando eller søgning.</translation> @@ -4267,7 +4278,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googles placeringstjeneste bruger kilder som f.eks. Wi-Fi, mobilnetværk og sensorer til at fastslå din enheds placering. Tjenesten er aktiv, når indstillingen Placering er aktiveret på din enhed.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Du kan deaktivere Placering ved at deaktivere den primære indstilling for Placering på din enhed. Du kan også deaktivere brugen af Wi-Fi, mobilnetværk og sensorer i forbindelse med Placering i placeringsindstillingerne.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Opret en adgangskode –</translation> -<translation id="7518150891539970662">WebRTC-logfiler (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Opret</translation> <translation id="7529411698175791732">Tjek din internetforbindelse. Hvis problemet fortsætter, kan du prøve at logge ud og logge ind igen.</translation> @@ -4744,6 +4754,7 @@ <translation id="8214962590150211830">Fjern denne person</translation> <translation id="8217399928341212914">Fortsæt med at blokere automatiske downloads af flere filer</translation> <translation id="8223479393428528563">Hvis du vil gemme disse filer til offlinebrug, skal du gå online igen, højreklikke på filerne og vælge indstillingen <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Indløs dine tilbud</translation> <translation id="8226222018808695353">Forbudt</translation> <translation id="8226619461731305576">Kø</translation> <translation id="8226742006292257240">Nedenfor ses den vilkårlige TPM-adgangskode, der er tilknyttet din computer:</translation> @@ -4790,6 +4801,7 @@ <translation id="8286036467436129157">Log ind</translation> <translation id="8286963743045814739">Du kan bruge nettet privat ved hjælp af et inkognitovindue</translation> <translation id="82871696630048499">Websiden blev genindlæst, fordi den løb tør for hukommelse.</translation> +<translation id="8288032458496410887">Afinstaller <ph name="APP" />...</translation> <translation id="8291967909914612644">Land for udbyder til hjem</translation> <translation id="8294431847097064396">Kilde</translation> <translation id="8297006494302853456">Svag</translation> @@ -4851,6 +4863,7 @@ <translation id="8413385045638830869">Spørg først (anbefales)</translation> <translation id="8418445294933751433">&Vis som fane</translation> <translation id="8419098111404128271">Søgeresultater for "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Velkommen til din <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Vis filer fra Google Docs</translation> <translation id="8424039430705546751">ned</translation> <translation id="8425213833346101688">Skift</translation> @@ -4977,6 +4990,7 @@ <translation id="8620765578342452535">Konfigurere netværksforbindelser</translation> <translation id="8624205858755890468">Giver Google Assistent tilladelse til at vise dig relaterede oplysninger, apps og handlinger.</translation> <translation id="862542460444371744">&Udvidelser</translation> +<translation id="8626219642120025691">Timeren er færdig</translation> <translation id="8627151598708688654">Vælg kilde</translation> <translation id="862727964348362408">Midlertidigt standset</translation> <translation id="862750493060684461">CSS-cache</translation> @@ -5098,6 +5112,7 @@ <translation id="8775404590947523323">Din ændringer gemmes automatisk.<ph name="BREAKS" />Hvis du gemmer en kopi af det oprindelige billede, skal du fjerne markeringen for "Overskriv originalen"</translation> <translation id="8777628254805677039">adgangskoderod</translation> <translation id="8780443667474968681">Talesøgning er deaktiveret.</translation> +<translation id="878068003854005405">Lad os komme i gang. Placer fingeren på sensoren.</translation> <translation id="878069093594050299">Dette certifikat er blevet bekræftet til følgende brug:</translation> <translation id="8781980678064919987">Luk ned, når låget er lukket</translation> <translation id="8782565991310229362">Start af kioskapplikationen blev annulleret.</translation> @@ -5275,6 +5290,7 @@ <translation id="9050666287014529139">Adgangssætning</translation> <translation id="9052208328806230490">Du har registreret dine printere med <ph name="CLOUD_PRINT_NAME" /> via kontoen <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Fortsæt blokering</translation> +<translation id="9053091947372579468">Din enhed har en Chrome-licens, men dit brugernavn er ikke knyttet til en administrationskonsol. Opret en konto i Administrationskonsol for at fortsætte med tilmeldingen. Bemærk! Hvis du vælger at bruge dit eget domæne til at oprette en ny konto i Administrationskonsol, skal du også gennemføre domænebekræftelse efter tilmeldingen. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Husk mit valg</translation> <translation id="9055636786322918818">Gennemtving RC4-kryptering. Du løber en større risiko, hvis du vælger denne mulighed, da RC4-krypteringsalgoritmerne er usikre.</translation> <translation id="9056034633062863292">Chromebox opdateres...</translation> @@ -5378,6 +5394,7 @@ <translation id="9218430445555521422">Indstil som standard</translation> <translation id="9219103736887031265">Billeder</translation> <translation id="9220525904950070496">Fjern konto</translation> +<translation id="9220820413868316583">Løft fingeren, og prøv igen.</translation> <translation id="923467487918828349">Vis alle</translation> <translation id="928985544179707652">Udvidelser:</translation> <translation id="930268624053534560">Detaljerede tidsstempler</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 8af638f..4d0fd70 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Keine Netzwerke</translation> <translation id="1056898198331236512">Warnung</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrieren des Fingerabdrucks</translation> <translation id="1061904396131502319">Bald ist es Zeit für eine Pause</translation> <translation id="1062407476771304334">Ersetzen</translation> <translation id="1067048845568873861">Erstellt</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Raute</translation> <translation id="1114335938027186412">Ihr Computer enthält einen TPM-Sicherheitschip (Trusted Platform Module), über den viele wichtige Sicherheitsfunktionen in Chrome OS implementiert sind. Weitere Informationen dazu finden Sie in der Chromebook-Hilfe unter https://support.google.com/chromebook/?p=tpm.</translation> <translation id="1114525161406758033">Beim Zuklappen Ruhemodus aktivieren</translation> +<translation id="1115324527092594775">"Better Together" einrichten</translation> <translation id="1116694919640316211">Über</translation> <translation id="1116779635164066733">Diese Einstellung wird durch die Erweiterung "<ph name="NAME" />" erzwungen.</translation> <translation id="111844081046043029">Möchten Sie diese Seite wirklich verlassen?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Aktuelle Uhrzeit</translation> <translation id="1157102636231978136">Mit Ihrem Google-Konto synchronisierte Browserdaten und -aktivitäten</translation> <translation id="1161575384898972166">Melden Sie sich in <ph name="TOKEN_NAME" /> an, um das Clientzertifikat zu exportieren.</translation> +<translation id="1161699061380012396">Chrome OS-Eingabemethode</translation> <translation id="1163931534039071049">Frame-Quelltext &anzeigen</translation> <translation id="1164674268730883318">Smart Lock für <ph name="DEVICE_TYPE" /> deaktivieren?</translation> <translation id="1164899421101904659">PUK eingeben</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play Store-Konto</translation> <translation id="2509495747794740764">Der Wert für die Skalierung muss zwischen 10 und 200 liegen.</translation> <translation id="2509566264613697683">8-fach</translation> -<translation id="2512222046227390255">Formulare automatisch ausfüllen</translation> <translation id="2513403576141822879">Weitere Einstellungen in Verbindung mit Datenschutz, Sicherheit und der Erhebung von Daten finden Sie unter <ph name="BEGIN_LINK" />Synchronisierung und Google-Dienste<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Suchen</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">Seriennummer: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">Frame-Quelltext &anzeigen</translation> <translation id="3022978424994383087">Nicht verstanden.</translation> +<translation id="3023464535986383522">Vorlesen</translation> <translation id="3024374909719388945">24-Stunden-Format verwenden</translation> <translation id="302781076327338683">Unter Umgehung des Cache neu laden</translation> <translation id="3031417829280473749">Agentin X</translation> @@ -1749,6 +1752,7 @@ <translation id="363903084947548957">Nächste Eingabemethode</translation> <translation id="3640214691812501263">"<ph name="EXTENSION_NAME" />" für <ph name="USER_NAME" /> hinzufügen?</translation> <translation id="3644896802912593514">Breite</translation> +<translation id="3645372836428131288">Bewegen Sie Ihren Finger etwas, um einen anderen Teil des Fingerabdrucks zu erfassen.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> erkannt</translation> <translation id="3649138363871392317">Das Foto wurde aufgenommen.</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" Zugriff erlauben auf:</translation> @@ -1944,7 +1948,6 @@ <translation id="3920504717067627103">Zertifikatrichtlinien</translation> <translation id="392089482157167418">ChromeVox aktivieren (gesprochenes Feedback)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Es sind keine kürzlich erfassten WebRTC-Protokolle vorhanden.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Von Ablage loslösen</translation> <translation id="3926002189479431949">Telefon für Smart Lock geändert</translation> @@ -2220,6 +2223,7 @@ <translation id="438503109373656455">Brauner</translation> <translation id="4387004326333427325">Remote-Ablehnung des Authentifizierungszertifikats</translation> <translation id="4389091756366370506">Nutzer <ph name="VALUE" /></translation> +<translation id="439266289085815679">Die Bluetooth-Konfiguration wird von <ph name="USER_EMAIL" /> festgelegt.</translation> <translation id="4394049700291259645">Deaktivieren</translation> <translation id="4400367121200150367">Hier werden Websites angezeigt, für die keine Passwörter gespeichert werden</translation> <translation id="4400632832271803360">Halten Sie die Taste "Suche" gedrückt, um die Funktion der Tasten in der obersten Reihe zu ändern</translation> @@ -2293,6 +2297,7 @@ <translation id="4522600456902129422">Weiterhin zulassen, dass diese Website die Zwischenablage aufruft</translation> <translation id="4530494379350999373">Ursprung</translation> <translation id="4533985347672295764">CPU-Zeit</translation> +<translation id="4534661889221639075">Versuchen Sie es noch einmal.</translation> <translation id="4535127706710932914">Standardprofil</translation> <translation id="4538417792467843292">Wort löschen</translation> <translation id="4538684596480161368">Plug-ins ohne Sandbox auf <ph name="HOST" /> immer blockieren</translation> @@ -2522,6 +2527,7 @@ <translation id="4880520557730313061">Autom. Korrektur</translation> <translation id="4880827082731008257">Im Verlauf suchen</translation> <translation id="4881695831933465202">Öffnen</translation> +<translation id="4882312758060467256">Hat Zugriff auf diese Website</translation> <translation id="4882473678324857464">Fokus auf Lesezeichen</translation> <translation id="4882831918239250449">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung verwendet wird, z. B. bei der Suche und bei Werbung</translation> <translation id="4883178195103750615">Lesezeichen in HTML-Datei exportieren...</translation> @@ -2587,6 +2593,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Nach abgeschlossenem Download öffnen</translation> <translation id="4972129977812092092">Druckerinformationen bearbeiten</translation> +<translation id="4972164225939028131">Falsches Passwort</translation> <translation id="497287958838527945">Kreditkarten und Adressen aus Google Pay.</translation> <translation id="4973307593867026061">Drucker hinzufügen</translation> <translation id="4973523518332075481">Der Name darf höchstens <ph name="MAX_LENGTH" /> Zeichen lang sein</translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Apps werden geladen...</translation> <translation id="5592595402373377407">Noch nicht genügend Daten vorhanden</translation> +<translation id="5593357315997824387">Meine Dateien synchronisieren</translation> <translation id="5595152862129936745">Sehr weit entfernt</translation> <translation id="5595485650161345191">Adresse bearbeiten</translation> <translation id="5596627076506792578">Weitere Optionen</translation> @@ -3729,6 +3737,7 @@ <translation id="6664237456442406323">Ihr Computer wurde mit einer ungültigen Hardware-ID konfiguriert. Daher kann Chrome OS keine aktuellen Sicherheitsupdates installieren und Ihr Computer ist <ph name="BEGIN_BOLD" />möglicherweise anfällig für schädliche Angriffe<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Beim Öffnen Ihres Profils ist ein Fehler aufgetreten. Melden Sie sich bitte ab und dann wieder an.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">Timer stoppen</translation> <translation id="667517062706956822">Soll Google diese Seite von <ph name="SOURCE_LANGUAGE" /> in <ph name="TARGET_LANGUAGE" /> übersetzen?</translation> <translation id="6675665718701918026">Zeigegerät verbunden</translation> <translation id="6678717876183468697">Abfrage-URL</translation> @@ -4055,6 +4064,7 @@ <translation id="7186088072322679094">In Symbolleiste behalten</translation> <translation id="7187428571767585875">Registrierungseinträge, die entfernt oder geändert werden:</translation> <translation id="7189234443051076392">Achten Sie darauf, dass auf Ihrem Gerät ausreichend Speicherplatz vorhanden ist</translation> +<translation id="7189965711416741966">Fingerabdruck hinzugefügt.</translation> <translation id="7191159667348037">Unbekannter Drucker (USB)</translation> <translation id="7191454237977785534">Datei speichern unter</translation> <translation id="7193374945610105795">Für <ph name="ORIGIN" /> sind keine Passwörter gespeichert</translation> @@ -4155,6 +4165,7 @@ <translation id="7339898014177206373">Neues Fenster</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> wird jetzt im Vollbildmodus angezeigt.</translation> <translation id="7340650977506865820">Ihr Bildschirm wurde von der Website freigegeben</translation> +<translation id="7341834142292923918">Möchte auf diese Website zugreifen</translation> <translation id="7345706641791090287">Passwort bestätigen</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">Um diese Erweiterung zu verwenden, geben Sie "<ph name="EXTENSION_KEYWORD" />" ein, dann TAB, und dann Ihren Befehl oder Ihre Suchanfrage.</translation> @@ -4264,7 +4275,6 @@ <ph name="BEGIN_PARAGRAPH2" />Der Standortdienst von Google nutzt Quellen wie WLANs, Mobilfunknetze und Sensoren, um den Standort Ihres Geräts zu bestimmen. Der Dienst ist aktiv, wenn die Standorteinstellung Ihres Geräts aktiviert ist.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Sie können die Standortermittlung deaktivieren, indem Sie die Haupteinstellung "Standort" auf Ihrem Gerät deaktivieren. In den Standorteinstellungen können Sie auch die Nutzung von WLANs, Mobilfunknetzen und Sensoren für die Standortbestimmung deaktivieren.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Passwort erstellen –</translation> -<translation id="7518150891539970662">WebRTC-Protokolle (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Erstellen</translation> <translation id="7529411698175791732">Prüfen Sie Ihre Internetverbindung. Wenn das Problem weiterhin besteht, melden Sie sich ab und wieder an.</translation> @@ -4742,6 +4752,7 @@ <translation id="8214962590150211830">Diese Person entfernen</translation> <translation id="8217399928341212914">Weiterhin automatisches Herunterladen mehrerer Dateien blockieren</translation> <translation id="8223479393428528563">Wenn Sie diese Dateien zur Offline-Nutzung speichern möchten, gehen Sie online, klicken Sie mit der rechten Maustaste auf die Dateien und wählen Sie die Option "<ph name="OFFLINE_CHECKBOX_NAME" />" aus.</translation> +<translation id="8225753906568652947">Meine Angebote einlösen</translation> <translation id="8226222018808695353">Unzulässig</translation> <translation id="8226619461731305576">Warteschlange</translation> <translation id="8226742006292257240">Hier ist das zufällig generierte TPM-Passwort, das Ihrem Computer zugewiesen wurde:</translation> @@ -4788,6 +4799,7 @@ <translation id="8286036467436129157">Anmelden</translation> <translation id="8286963743045814739">In einem Inkognitofenster können Sie privat surfen</translation> <translation id="82871696630048499">Die Webseite wurde neu geladen, weil kein Arbeitsspeicher mehr verfügbar war.</translation> +<translation id="8288032458496410887"><ph name="APP" /> deinstallieren…</translation> <translation id="8291967909914612644">Land des Homepageanbieters</translation> <translation id="8294431847097064396">Quelle</translation> <translation id="8297006494302853456">Schwach</translation> @@ -4850,6 +4862,7 @@ <translation id="8413385045638830869">Zuerst fragen (empfohlen)</translation> <translation id="8418445294933751433">Al&s Tab anzeigen</translation> <translation id="8419098111404128271">Suchergebnisse für "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Willkommen bei Ihrem <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Google Docs-Dateien zeigen</translation> <translation id="8424039430705546751">Nach unten</translation> <translation id="8425213833346101688">Ändern</translation> @@ -4976,6 +4989,7 @@ <translation id="8620765578342452535">Netzwerkverbindungen konfigurieren</translation> <translation id="8624205858755890468">Ermöglicht Assistant, Ihnen relevante Informationen, Apps und Aktionen anzuzeigen.</translation> <translation id="862542460444371744">&Erweiterungen</translation> +<translation id="8626219642120025691">Timer abgelaufen</translation> <translation id="8627151598708688654">Quelle auswählen</translation> <translation id="862727964348362408">Ausgesetzt</translation> <translation id="862750493060684461">CSS-Cache</translation> @@ -5096,6 +5110,7 @@ <translation id="8775404590947523323">Ihre Änderungen werden automatisch gespeichert.<ph name="BREAKS" />Um eine Kopie des Originalbilds beizubehalten, deaktivieren Sie die Funktion "Original überschreiben".</translation> <translation id="8777628254805677039">Root-Passwort</translation> <translation id="8780443667474968681">Die Sprachsuche wurde deaktiviert.</translation> +<translation id="878068003854005405">Fangen wir an. Legen Sie Ihren Finger auf den Sensor.</translation> <translation id="878069093594050299">Dieses Zertifikat wurde für folgende Verwendungszwecke verifiziert:</translation> <translation id="8781980678064919987">Beim Zuklappen herunterfahren</translation> <translation id="8782565991310229362">Starten der Kioskanwendung wurde abgebrochen.</translation> @@ -5266,7 +5281,7 @@ <translation id="9039890312082871605">Tabs stummschalten</translation> <translation id="9040661932550800571">Passwort für <ph name="ORIGIN" /> aktualisieren?</translation> <translation id="9041692268811217999">Der Zugriff auf lokale Dateien auf Ihrem Gerät wurde von Ihrem Administrator deaktiviert</translation> -<translation id="9042893549633094279">Sicherheit und Datenschutz</translation> +<translation id="9042893549633094279">Datenschutz und Sicherheit</translation> <translation id="904451693890288097">Geben Sie bitte den Zugangscode für "<ph name="DEVICE_NAME" />" ein:</translation> <translation id="9044646465488564462">Fehler beim Herstellen einer Verbindung mit dem Netzwerk: <ph name="DETAILS" /></translation> <translation id="9045430190527754450">Die Webadresse der Seite, die Sie aufrufen möchten, wird an Google gesendet</translation> @@ -5274,6 +5289,7 @@ <translation id="9050666287014529139">Passphrase</translation> <translation id="9052208328806230490">Sie haben Ihre Drucker unter dem Konto <ph name="EMAIL" /> bei <ph name="CLOUD_PRINT_NAME" /> registriert.</translation> <translation id="9052404922357793350">Weiterhin blockieren</translation> +<translation id="9053091947372579468">Ihr Gerät beinhaltet eine Chrome-Lizenz, doch Ihr Nutzername ist mit keiner Admin-Konsole verknüpft. Erstellen Sie ein Admin-Konsole-Konto, um mit der Registrierung fortzufahren. Hinweis: Wenn Sie Ihre eigene Domain zur Erstellung eines neuen Admin-Konsole-Kontos verwenden, müssen Sie nach der Registrierung auch die Domain verifizieren. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Meine Auswahl merken</translation> <translation id="9055636786322918818">RC4-Verschlüsselung durchsetzen. Mit dieser Option ist ein höheres Risiko verbunden, da RC4-Verschlüsselungen nicht sicher sind.</translation> <translation id="9056034633062863292">Chromebox aktualisieren</translation> @@ -5377,6 +5393,7 @@ <translation id="9218430445555521422">Als Standardbrowser festlegen</translation> <translation id="9219103736887031265">Bilder</translation> <translation id="9220525904950070496">Konto entfernen</translation> +<translation id="9220820413868316583">Finger hochheben und dann Versuch wiederholen.</translation> <translation id="923467487918828349">Alle einblenden</translation> <translation id="928985544179707652">Erweiterungen:</translation> <translation id="930268624053534560">Detaillierter Zeitstempel</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index d75cb4b..4355039a 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Δεν βρέθηκαν δίκτυα</translation> <translation id="1056898198331236512">Προειδοποίηση</translation> <translation id="1058262162121953039">Κωδικός PUK</translation> +<translation id="1059855432287631118">Εγγραφή δακτυλικού αποτυπώματος</translation> <translation id="1061904396131502319">Πλησιάζει η ώρα για διάλειμμα</translation> <translation id="1062407476771304334">Αντικατάσταση</translation> <translation id="1067048845568873861">Δημιουργήθηκε</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamond</translation> <translation id="1114335938027186412">Ο υπολογιστής σας περιέχει μια συσκευή ασφαλείας TPM (Μονάδα αξιόπιστης πλατφόρμας), η οποία χρησιμοποιείται για την εφαρμογή πολλών κρίσιμων λειτουργιών ασφαλείας στο Chrome OS. Επισκεφτείτε το κέντρο βοήθειας του Chromebook, για να μάθετε περισσότερα: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Σε αδράνεια όταν το καπάκι είναι κλειστό</translation> +<translation id="1115324527092594775">Ρύθμιση λειτουργίας Better Together</translation> <translation id="1116694919640316211">Σχετικά με</translation> <translation id="1116779635164066733">Αυτή η ρύθμιση εφαρμόζεται από την επέκταση "<ph name="NAME" />".</translation> <translation id="111844081046043029">Είστε βέβαιοι ότι επιθυμείτε έξοδο από αυτή τη σελίδα;</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Τρέχουσα ώρα</translation> <translation id="1157102636231978136">Τα δεδομένα και η δραστηριότητα περιήγησής σας, συγχρονισμένα με τον Λογαριασμό σας Google</translation> <translation id="1161575384898972166">Συνδεθείτε στο <ph name="TOKEN_NAME" /> για εξαγωγή του πιστοποιητικού πελάτη.</translation> +<translation id="1161699061380012396">Μέθοδος εισαγωγής Chrome OS</translation> <translation id="1163931534039071049">&Προβολή κώδικα πλαισίου</translation> <translation id="1164674268730883318">Να απενεργοποιηθεί το Smart Lock για <ph name="DEVICE_TYPE" />;</translation> <translation id="1164899421101904659">Καταχωρίστε το κλειδί ξεκλειδώματος PIN (PUK)</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Λογαριασμός Google Play Store</translation> <translation id="2509495747794740764">Η κλίμακα πρέπει να είναι αριθμός μεταξύ του 10 και του 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Συμπληρώστε αυτόματα φόρμες</translation> <translation id="2513403576141822879">Για περισσότερες ρυθμίσεις που σχετίζονται με το απόρρητο, την ασφάλεια και τη συλλογή δεδομένων, ανατρέξτε στην ενότητα <ph name="BEGIN_LINK" />Συγχρονισμός και υπηρεσίες Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Σάρωση</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Σειριακός αριθμός: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Προβολή Πηγαίου Κώδικα Πλαισίου</translation> <translation id="3022978424994383087">Δεν έγινε κατανοητό.</translation> +<translation id="3023464535986383522">Επιλέξτε για αυτόματη ανάγνωση</translation> <translation id="3024374909719388945">Χρήση ρολογιού 24 ωρών</translation> <translation id="302781076327338683">Επανάληψη φόρτωσης με παράκαμψη της κρυφής μνήμης</translation> <translation id="3031417829280473749">Πράκτορας X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Επόμενη μέθοδος εισαγωγής</translation> <translation id="3640214691812501263">Προσθήκη "<ph name="EXTENSION_NAME" />" για <ph name="USER_NAME" />;</translation> <translation id="3644896802912593514">Πλάτος</translation> +<translation id="3645372836428131288">Μετακινήστε ελαφρώς για να αποτυπώσετε ένα διαφορετικό τμήμα του δακτυλικού αποτυπώματος.</translation> <translation id="3648348069317717750">Εντοπίστηκε συσκευή <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Έγινε λήψη φωτογραφίας</translation> <translation id="3650952250015018111">Να επιτρέπεται στην εφαρμογή "<ph name="APP_NAME" />" η πρόσβαση σε:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Πολιτικές πιστοποιητικού</translation> <translation id="392089482157167418">Ενεργοποίηση του ChromeVox (προφορικά σχόλια)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Δεν υπάρχουν πρόσφατα αρχεία καταγραφής WebRTC.</translation> <translation id="3925573269917483990">Κάμερα:</translation> <translation id="3925842537050977900">Ξεκαρφίτσωμα από το ράφι</translation> <translation id="3926002189479431949">Το τηλέφωνο που χρησιμοποιείται το Smart Lock άλλαξε</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Σαρατόγκα</translation> <translation id="4387004326333427325">Το πιστοποιητικό ελέγχου ταυτότητας απορρίφθηκε απομακρυσμένα</translation> <translation id="4389091756366370506">Χρήστης <ph name="VALUE" /></translation> +<translation id="439266289085815679">Η διαμόρφωση Bluetooth ελέγχεται από τον χρήστη <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Απενεργοποίηση</translation> <translation id="4400367121200150367">Οι ιστότοποι που δεν αποθηκεύουν ποτέ κωδικούς πρόσβασης θα εμφανίζονται εδώ</translation> <translation id="4400632832271803360">Πατήστε παρατεταμένα το πλήκτρο Εφαρμογής εκκίνησης, για να αλλάξετε τη συμπεριφορά των πλήκτρων της επάνω σειράς</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Να συνεχίσει να επιτρέπεται σε αυτόν τον ιστότοπο να βλέπει το πρόχειρο</translation> <translation id="4530494379350999373">Προέλευση</translation> <translation id="4533985347672295764">Χρόνος CPU</translation> +<translation id="4534661889221639075">Δοκιμάστε ξανά.</translation> <translation id="4535127706710932914">Προεπιλεγμένο προφίλ</translation> <translation id="4538417792467843292">Διαγραφή λέξης</translation> <translation id="4538684596480161368">Να γίνεται πάντα αποκλεισμός των προσθηκών εκτός περιβάλλοντος δοκιμών σε <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Αυτόματη επιδιόρθωση</translation> <translation id="4880827082731008257">Αναζήτηση ιστορικού</translation> <translation id="4881695831933465202">Άνοιγμα</translation> +<translation id="4882312758060467256">Έχει πρόσβαση σε αυτόν τον ιστότοπο</translation> <translation id="4882473678324857464">Σελιδοδείκτες εστίασης</translation> <translation id="4882831918239250449">Ελέγξτε τον τρόπο με τον οποίο το ιστορικό περιήγησής σας χρησιμοποιείται για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων στοιχείων</translation> <translation id="4883178195103750615">Εξαγωγή σελιδοδεικτών σε αρχείο HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Λεύκωμα</translation> <translation id="4971412780836297815">Άνοιγμα κατά την ολοκλήρωση</translation> <translation id="4972129977812092092">Επεξεργασία εκτυπωτή</translation> +<translation id="4972164225939028131">Λανθασμένος κωδικός πρόσβασης</translation> <translation id="497287958838527945">Πιστωτικές κάρτες και διευθύνσεις που χρησιμοποιούν το Google Pay.</translation> <translation id="4973307593867026061">Προσθήκη εκτυπωτών</translation> <translation id="4973523518332075481">Χρησιμοποιήστε ένα όνομα το οποίο αποτελείται από <ph name="MAX_LENGTH" /> χαρακτήρες ή λιγότερους</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Φόρτωση εφαρμογών…</translation> <translation id="5592595402373377407">Δεν υπάρχουν ακόμη αρκετά διαθέσιμα στοιχεία.</translation> +<translation id="5593357315997824387">Συγχρονισμός των αρχείων μου</translation> <translation id="5595152862129936745">Πολύ μακριά</translation> <translation id="5595485650161345191">Επεξεργασία διεύθυνσης</translation> <translation id="5596627076506792578">Περισσότερες επιλογές</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">Δυστυχώς, ο υπολογιστής σας έχει διαμορφωθεί με ένα εσφαλμένο αναγνωριστικό υλικού. Αυτό παρεμποδίζει την ενημέρωση του Chrome OS με τις πιο πρόσφατες επιδιορθώσεις ασφαλείας και ο υπολογιστής σας <ph name="BEGIN_BOLD" />ενδέχεται να είναι ευάλωτος σε κακόβουλες επιθέσεις<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Παρουσιάστηκε ένα πρόβλημα κατά το άνοιγμα του προφίλ σας. Αποσυνδεθείτε και συνδεθείτε ξανά.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">διακοπή χρονομέτρου</translation> <translation id="667517062706956822">Θέλετε να μεταφράσει το Google αυτήν τη σελίδα από <ph name="SOURCE_LANGUAGE" /> σε <ph name="TARGET_LANGUAGE" />;</translation> <translation id="6675665718701918026">Η συσκευή κατάδειξης είναι συνδεδεμένη</translation> <translation id="6678717876183468697">URL ερωτήματος</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">Διατήρηση στη γραμμή εργαλείων</translation> <translation id="7187428571767585875">Καταχωρίσεις μητρώου προς κατάργηση ή αλλαγή:</translation> <translation id="7189234443051076392">Βεβαιωθείτε ότι υπάρχει αρκετός αποθηκευτικός χώρος στη συσκευή σας</translation> +<translation id="7189965711416741966">Προστέθηκε δακτυλικό αποτύπωμα.</translation> <translation id="7191159667348037">Άγνωστος εκτυπωτής (USB)</translation> <translation id="7191454237977785534">Αποθήκευση αρχείου ως</translation> <translation id="7193374945610105795">Δεν έχουν αποθηκευτεί κωδικοί πρόσβασης για το <ph name="ORIGIN" /></translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Νέο παράθυρο</translation> <translation id="7340431621085453413">Το <ph name="FULLSCREEN_ORIGIN" /> εμφανίζεται σε πλήρη οθόνη.</translation> <translation id="7340650977506865820">Ο ιστότοπος μοιράζεται την οθόνη σας</translation> +<translation id="7341834142292923918">Ζητάει πρόσβαση σε αυτόν τον ιστότοπο</translation> <translation id="7345706641791090287">Επιβεβαιώστε τον κωδικό πρόσβασής σας</translation> <translation id="7346909386216857016">OK, το κατάλαβα</translation> <translation id="7347751611463936647">Για να χρησιμοποιήσετε αυτήν την επέκταση, πληκτρολογήστε "<ph name="EXTENSION_KEYWORD" />", κατόπιν TAB και, στη συνέχεια, την εντολή ή την αναζήτησή σας.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Η υπηρεσία τοποθεσίας της Google χρησιμοποιεί πηγές όπως το Wi-Fi, τα δίκτυα κινητής τηλεφωνίας και τους αισθητήρες για την εκτίμηση της τοποθεσίας της συσκευής σας. Αυτή η ρύθμιση είναι ενεργή όταν είναι ενεργοποιημένη η ρύθμιση Τοποθεσίας της συσκευής σας.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Μπορείτε να απενεργοποιήσετε την Τοποθεσία απενεργοποιώντας την κύρια ρύθμιση Τοποθεσίας στη συσκευή σας. Μπορείτε επίσης να απενεργοποιήσετε τη χρήση δικτύων Wi-Fi, δικτύων κινητής τηλεφωνίας και αισθητήρων για την τοποθεσία στις ρυθμίσεις τοποθεσίας.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Δημιουργήστε έναν κωδικό πρόσβασης -</translation> -<translation id="7518150891539970662">Αρχεία καταγραφής WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Δημιουργία</translation> <translation id="7529411698175791732">Ελέγξτε τη σύνδεσή σας στο διαδίκτυο. Εάν το πρόβλημα παραμένει, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε ξανά.</translation> @@ -4747,6 +4757,7 @@ <translation id="8214962590150211830">Κατάργηση αυτού του ατόμου</translation> <translation id="8217399928341212914">Συνέχιση αποκλεισμού λήψεων πολλών αρχείων</translation> <translation id="8223479393428528563">Για να αποθηκεύσετε αυτά τα αρχεία για χρήση εκτός σύνδεσης, συνδεθείτε ξανά στο διαδίκτυο, κάντε δεξί κλικ στα αρχεία και ενεργοποιήστε την επιλογή <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Εξαργυρώστε τις προσφορές σας</translation> <translation id="8226222018808695353">Απαγορευμένο</translation> <translation id="8226619461731305576">Ουρά</translation> <translation id="8226742006292257240">Ακολουθεί ο κωδικός πρόσβασης TPM που δημιουρήθηκε τυχαία και έχει εκχωρηθεί στον υπολογιστή σας:</translation> @@ -4793,6 +4804,7 @@ <translation id="8286036467436129157">Σύνδεση</translation> <translation id="8286963743045814739">Μπορείτε να περιηγηθείτε ιδιωτικά χρησιμοποιώντας ένα παράθυρο για ανώνυμη περιήγηση</translation> <translation id="82871696630048499">Η ιστοσελίδα επαναφορτώθηκε επειδή η μνήμη εξαντλήθηκε.</translation> +<translation id="8288032458496410887">Απεγκατάσταση εφαρμογής <ph name="APP" />…</translation> <translation id="8291967909914612644">Χώρα παρόχου αρχικής σελίδας</translation> <translation id="8294431847097064396">Πηγή</translation> <translation id="8297006494302853456">Αδύναμο</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Να γίνεται ερώτηση πρώτα (συνιστάται)</translation> <translation id="8418445294933751433">&Εμφάνιση ως καρτέλα</translation> <translation id="8419098111404128271">Αποτελέσματα αναζήτησης για "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Καλώς ήρθατε στο <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Εμφάνιση αρχείων Εγγράφων Google</translation> <translation id="8424039430705546751">κάτω</translation> <translation id="8425213833346101688">Αλλαγή</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Διαμόρφωση συνδέσεων δικτύου</translation> <translation id="8624205858755890468">Επιτρέπει στον Βοηθό να σας εμφανίζει σχετικές πληροφορίες, εφαρμογές και ενέργειες.</translation> <translation id="862542460444371744">&Επεκτάσεις</translation> +<translation id="8626219642120025691">Ολοκλήρωση χρονομέτρου</translation> <translation id="8627151598708688654">Επιλογή πηγής</translation> <translation id="862727964348362408">Σε αναστολή</translation> <translation id="862750493060684461">Προσωρινή μνήμη CSS</translation> @@ -5098,6 +5112,7 @@ <translation id="8775404590947523323">Οι αλλαγές σας αποθηκεύονται αυτόματα.<ph name="BREAKS" />Για να διατηρήσετε ένα αντίγραφο της αρχικής εικόνας, καταργήστε την επιλογή "Αντικατάσταση αρχικού"</translation> <translation id="8777628254805677039">ριζικός κωδικός πρόσβασης</translation> <translation id="8780443667474968681">Η Φωνητική αναζήτηση απενεργοποιήθηκε.</translation> +<translation id="878068003854005405">Ας ξεκινήσουμε. Τοποθετήστε το δάκτυλό σας στον αισθητήρα.</translation> <translation id="878069093594050299">Το πιστοποιητικό επαληθεύτηκε για τις ακόλουθες χρήσεις:</translation> <translation id="8781980678064919987">Τερματισμός λειτουργίας όταν το καπάκι είναι κλειστό</translation> <translation id="8782565991310229362">Η εκκίνηση της εφαρμογής kiosk ακυρώθηκε.</translation> @@ -5275,6 +5290,7 @@ <translation id="9050666287014529139">Φράση πρόσβασής σας</translation> <translation id="9052208328806230490">Έχετε πραγματοποιήσει εγγραφή των εκτυπωτών σας στο <ph name="CLOUD_PRINT_NAME" /> χρησιμοποιώντας τον λογαριασμό <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Συνέχιση αποκλεισμού</translation> +<translation id="9053091947372579468">Η συσκευή σας περιλαμβάνει μια άδεια Chrome, αλλά το όνομα χρήστη δεν είναι συσχετισμένο με κάποια Κονσόλα διαχειριστή. Δημιουργήστε έναν λογαριασμό Κονσόλας διαχειριστή για να συνεχίσετε την εγγραφή. Σημείωση: Εάν επιλέξετε να χρησιμοποιήσετε τον δικό σας τομέα για να δημιουργήσετε έναν νέο λογαριασμό Κονσόλας διαχειριστή, θα πρέπει επίσης να ολοκληρώσετε την επαλήθευση τομέα μετά την εγγραφή. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Απομνημόνευση της επιλογής μου</translation> <translation id="9055636786322918818">Να επιβάλλεται η κρυπτογράφηση RC4. Η χρήση αυτής της επιλογής αυξάνει τον κίνδυνο, επειδή η κρυπτογράφηση RC4 δεν είναι ασφαλής.</translation> <translation id="9056034633062863292">Ενημέρωση του Chromebox</translation> @@ -5378,6 +5394,7 @@ <translation id="9218430445555521422">Ορισμός ως προεπιλογή</translation> <translation id="9219103736887031265">Εικόνες</translation> <translation id="9220525904950070496">Κατάργηση λογαριασμού</translation> +<translation id="9220820413868316583">Ανασηκώστε το και προσπαθήστε ξανά.</translation> <translation id="923467487918828349">Εμφάνιση όλων</translation> <translation id="928985544179707652">Επεκτάσεις:</translation> <translation id="930268624053534560">Αναλυτικές χρονικές σημάνσεις</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index beee207..a8e2769 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1007,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Store Account</translation> <translation id="2509495747794740764">Scale amount must be a number between 10 and 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Auto-fill forms</translation> <translation id="2513403576141822879">For more settings that relate to privacy, security and data collection, see <ph name="BEGIN_LINK" />Sync and Google services<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scan</translation> @@ -1952,7 +1951,6 @@ <translation id="3920504717067627103">Certificate Policies</translation> <translation id="392089482157167418">Enable ChromeVox (spoken feedback)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">You have no recently captured WebRTC logs.</translation> <translation id="3925573269917483990">Camera:</translation> <translation id="3925842537050977900">Unpin from Shelf</translation> <translation id="3926002189479431949">Smart Lock phone changed</translation> @@ -4280,7 +4278,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google's Location service uses sources such as Wi-Fi, mobile networks and sensors to help estimate your device’s location. This service is active when your device’s Location setting is on.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />You can turn off Location by turning off the main Location setting on your device. You can also turn off the use of Wi-Fi, mobile networks and sensors for location in location settings.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Create a password -</translation> -<translation id="7518150891539970662">WebRTC logs (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Create</translation> <translation id="7529411698175791732">Check your Internet connection. If the problem continues, try signing out and signing in again.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 270e0a6..6d88ac3 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1001,7 +1001,6 @@ <translation id="2508428939232952663">Cuenta de Google Play Store</translation> <translation id="2509495747794740764">El valor de la escala debe ser un número entre 10 y 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Autocompletar formularios</translation> <translation id="2513403576141822879">Para obtener más opciones de configuración relacionadas con la privacidad, la seguridad y la recopilación de datos, visita <ph name="BEGIN_LINK" />Sincronización y servicios<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Buscar</translation> @@ -1945,7 +1944,6 @@ <translation id="3920504717067627103">Directivas del certificado</translation> <translation id="392089482157167418">Habilitar ChromeVox (comentarios por voz)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">No capturaste ningún registro de WebRTC recientemente.</translation> <translation id="3925573269917483990">Cámara:</translation> <translation id="3925842537050977900">No fijar en la biblioteca</translation> <translation id="3926002189479431949">Cambió el teléfono con Smart Lock</translation> @@ -4265,7 +4263,6 @@ <ph name="BEGIN_PARAGRAPH2" />El servicio de ubicación de Google usa fuentes como Wi-Fi, redes móviles y sensores para calcular la ubicación de tu dispositivo. Este servicio se activa cuando está activada la configuración de la ubicación de tu dispositivo.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Para desactivar la ubicación, desactiva la opción principal de configuración de la ubicación en tu dispositivo. También, puedes desactivar el uso de redes Wi-Fi, redes móviles y sensores para obtener la ubicación en la configuración de la ubicación.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Crear una contraseña:</translation> -<translation id="7518150891539970662">Registros de WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Crear</translation> <translation id="7529411698175791732">Comprueba tu conexión a Internet. Si el problema persiste, intenta salir de tu cuenta y acceder de nuevo.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 03e86a7e..740d807b 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">No hay redes</translation> <translation id="1056898198331236512">Advertencia</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrando huella digital</translation> <translation id="1061904396131502319">Ya casi es la hora de hacer un descanso</translation> <translation id="1062407476771304334">Sustituir</translation> <translation id="1067048845568873861">Creada</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Rombo</translation> <translation id="1114335938027186412">Tu ordenador contiene un dispositivo de seguridad del módulo de plataforma de confianza (TPM), que se utiliza para implementar un gran número de funciones clave de seguridad en Chrome OS. Puedes consultar más información en el Centro de ayuda de los Chromebook (https://support.google.com/chromebook/?p=tpm).</translation> <translation id="1114525161406758033">Suspender cuando la tapa esté cerrada</translation> +<translation id="1115324527092594775">Configurar Better Together</translation> <translation id="1116694919640316211">Información</translation> <translation id="1116779635164066733">La extensión "<ph name="NAME" />" aplica esta opción.</translation> <translation id="111844081046043029">¿Seguro que quieres abandonar esta página?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Hora actual</translation> <translation id="1157102636231978136">Tu actividad y tus datos de navegación están sincronizados con tu cuenta de Google</translation> <translation id="1161575384898972166">Inicia sesión en <ph name="TOKEN_NAME" /> para exportar el certificado de cliente.</translation> +<translation id="1161699061380012396">Método de introducción de Chrome OS</translation> <translation id="1163931534039071049">&Ver fuente del marco</translation> <translation id="1164674268730883318">¿Quieres desactivar Smart Lock para <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Introducir código PUK</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Cuenta de Google Play Store</translation> <translation id="2509495747794740764">El valor de la escala debe ser un número entre 10 y 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Autocompletar formularios</translation> <translation id="2513403576141822879">Para ver más opciones relacionadas con la privacidad, la seguridad y la recogida de datos, accede a <ph name="BEGIN_LINK" />Servicios de Google y sincronización<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Buscar</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Número de serie: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Ver fuente del marco</translation> <translation id="3022978424994383087">No te he entendido.</translation> +<translation id="3023464535986383522">Enunciar Selección</translation> <translation id="3024374909719388945">Usar reloj de 24 horas</translation> <translation id="302781076327338683">Volver a cargar omitiendo la caché</translation> <translation id="3031417829280473749">Agente X</translation> @@ -1751,6 +1754,7 @@ <translation id="363903084947548957">Siguiente método de entrada</translation> <translation id="3640214691812501263">¿Añadir <ph name="EXTENSION_NAME" /> para <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Anchura</translation> +<translation id="3645372836428131288">Mueve el dedo ligeramente para capturar otra parte de la huella digital.</translation> <translation id="3648348069317717750">Se ha detectado <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Se ha hecho la foto</translation> <translation id="3650952250015018111">Permitir que "<ph name="APP_NAME" />" acceda a:</translation> @@ -1946,7 +1950,6 @@ <translation id="3920504717067627103">Políticas de certificados</translation> <translation id="392089482157167418">Habilitar ChromeVox (mensajes de voz)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">No hay ningún registro de WebRTC capturado recientemente.</translation> <translation id="3925573269917483990">Cámara:</translation> <translation id="3925842537050977900">No fijar en la estantería</translation> <translation id="3926002189479431949">El teléfono de Smart Lock ha cambiado</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">Rocinante</translation> <translation id="4387004326333427325">Certificado de autenticación rechazado de forma remota</translation> <translation id="4389091756366370506">Usuario <ph name="VALUE" /></translation> +<translation id="439266289085815679">El usuario <ph name="USER_EMAIL" /> controla la configuración del Bluetooth.</translation> <translation id="4394049700291259645">Inhabilitar</translation> <translation id="4400367121200150367">Los sitios web de los que nunca se guarda la contraseña aparecerán aquí</translation> <translation id="4400632832271803360">Mantén pulsado el menú de aplicaciones para cambiar el comportamiento de las teclas de la fila superior</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">Seguir permitiendo que este sitio web vea el portapapeles</translation> <translation id="4530494379350999373">Origen</translation> <translation id="4533985347672295764">Tiempo de uso de la CPU</translation> +<translation id="4534661889221639075">Inténtalo de nuevo.</translation> <translation id="4535127706710932914">Perfil predeterminado</translation> <translation id="4538417792467843292">Eliminar palabra</translation> <translation id="4538684596480161368">Bloquear siempre complementos no incluidos en zona de pruebas en <ph name="HOST" /></translation> @@ -2523,6 +2528,7 @@ <translation id="4880520557730313061">Ajuste automático</translation> <translation id="4880827082731008257">Buscar en el historial</translation> <translation id="4881695831933465202">Abrir</translation> +<translation id="4882312758060467256">Tiene acceso a este sitio web</translation> <translation id="4882473678324857464">Seleccionar marcadores</translation> <translation id="4882831918239250449">Controlar cómo se utiliza el historial de navegación para personalizar la Búsqueda, los anuncios y mucho más</translation> <translation id="4883178195103750615">Exportar marcadores a archivo HTML...</translation> @@ -2588,6 +2594,7 @@ <translation id="4969785127455456148">Álbum</translation> <translation id="4971412780836297815">Abrir al finalizar</translation> <translation id="4972129977812092092">Editar impresora</translation> +<translation id="4972164225939028131">Contraseña incorrecta</translation> <translation id="497287958838527945">Tarjetas de crédito y direcciones con Google Pay.</translation> <translation id="4973307593867026061">Añadir impresoras</translation> <translation id="4973523518332075481">Utiliza un nombre que tenga <ph name="MAX_LENGTH" /> caracteres como máximo</translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Cargando aplicaciones...</translation> <translation id="5592595402373377407">Todavía no hay suficientes datos disponibles.</translation> +<translation id="5593357315997824387">Sincronizar mis archivos</translation> <translation id="5595152862129936745">Muy lejos</translation> <translation id="5595485650161345191">Editar dirección</translation> <translation id="5596627076506792578">Más opciones</translation> @@ -3728,6 +3736,7 @@ <translation id="6664237456442406323">Lamentablemente, tu ordenador está configurado con un identificador de hardware incorrecto. Esto impide que Chrome OS se actualice con los últimos parches de seguridad y hace que el ordenador <ph name="BEGIN_BOLD" />pueda ser vulnerable a ataques maliciosos<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Se ha producido un error al abrir tu perfil. Cierra sesión y vuelve a iniciarla.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">detener temporizador</translation> <translation id="667517062706956822">¿Quieres que Google traduzca esta página de <ph name="SOURCE_LANGUAGE" /> a <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Dispositivo señalador conectado</translation> <translation id="6678717876183468697">URL de la consulta</translation> @@ -4054,6 +4063,7 @@ <translation id="7186088072322679094">Mantener en la barra de herramientas</translation> <translation id="7187428571767585875">Entradas de registro que se van a eliminar o cambiar:</translation> <translation id="7189234443051076392">Deja suficiente espacio en tu dispositivo</translation> +<translation id="7189965711416741966">Huella digital añadida.</translation> <translation id="7191159667348037">Impresora desconocida (USB)</translation> <translation id="7191454237977785534">Guardar archivo como</translation> <translation id="7193374945610105795">No hay contraseñas guardadas de <ph name="ORIGIN" /></translation> @@ -4154,6 +4164,7 @@ <translation id="7339898014177206373">Nueva ventana</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> se muestra ahora en pantalla completa.</translation> <translation id="7340650977506865820">El sitio web está compartiendo tu pantalla</translation> +<translation id="7341834142292923918">Quiere acceder a este sitio web</translation> <translation id="7345706641791090287">Confirma tu contraseña</translation> <translation id="7346909386216857016">Entendido</translation> <translation id="7347751611463936647">Para utilizar esta extensión, escribe "<ph name="EXTENSION_KEYWORD" />", pulsa el tabulador e introduce el comando o la búsqueda que desees.</translation> @@ -4263,7 +4274,6 @@ <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="7517786267097410259">Crear una contraseña:</translation> -<translation id="7518150891539970662">Registros de WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Crear</translation> <translation id="7529411698175791732">Comprueba tu conexión a Internet. Si el problema persiste, prueba a cerrar sesión y volver a iniciarla.</translation> @@ -4741,6 +4751,7 @@ <translation id="8214962590150211830">Eliminar este perfil</translation> <translation id="8217399928341212914">Seguir bloqueando descargas automáticas de varios archivos</translation> <translation id="8223479393428528563">Para guardar estos archivos y poder usarlos sin conexión, vuelve a conectarte a Internet, haz clic con el botón derecho en los archivos y selecciona la opción <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Canjear tus ofertas</translation> <translation id="8226222018808695353">Prohibido</translation> <translation id="8226619461731305576">Cola</translation> <translation id="8226742006292257240">Esta es la contraseña del TPM generada aleatoriamente que se ha asignado a tu ordenador:</translation> @@ -4787,6 +4798,7 @@ <translation id="8286036467436129157">Iniciar sesión</translation> <translation id="8286963743045814739">Puedes navegar en privado con una ventana de incógnito</translation> <translation id="82871696630048499">La página web se ha vuelto a cargar porque se ha quedado sin memoria.</translation> +<translation id="8288032458496410887">Desinstalar <ph name="APP" />...</translation> <translation id="8291967909914612644">País del proveedor inicial</translation> <translation id="8294431847097064396">Origen</translation> <translation id="8297006494302853456">Débil</translation> @@ -4848,6 +4860,7 @@ <translation id="8413385045638830869">Preguntar antes (recomendado)</translation> <translation id="8418445294933751433">Mo&strar como pestaña</translation> <translation id="8419098111404128271">Resultados de búsqueda de "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Te damos la bienvenida a tu <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Mostrar archivos de Google Docs</translation> <translation id="8424039430705546751">abajo</translation> <translation id="8425213833346101688">Cambiar</translation> @@ -4974,6 +4987,7 @@ <translation id="8620765578342452535">Configurar conexiones de red</translation> <translation id="8624205858755890468">Permite que el Asistente te muestre acciones, aplicaciones e información relacionadas.</translation> <translation id="862542460444371744">&Extensiones</translation> +<translation id="8626219642120025691">El temporizador ha finalizado</translation> <translation id="8627151598708688654">Seleccionar fuente</translation> <translation id="862727964348362408">En suspensión</translation> <translation id="862750493060684461">Caché de CSS</translation> @@ -5094,6 +5108,7 @@ <translation id="8775404590947523323">Los cambios se guardan de forma automática.<ph name="BREAKS" />Para guardar una copia de la imagen original, desactiva la opción "Sobrescribir original".</translation> <translation id="8777628254805677039">contraseña raíz</translation> <translation id="8780443667474968681">Se ha desactivado la búsqueda por voz.</translation> +<translation id="878068003854005405">Empecemos. Coloca el dedo en el sensor.</translation> <translation id="878069093594050299">Este certificado se ha verificado para los siguientes usos:</translation> <translation id="8781980678064919987">Apagar cuando la tapa esté cerrada</translation> <translation id="8782565991310229362">Se ha cancelado el inicio de la aplicación del kiosco.</translation> @@ -5271,6 +5286,7 @@ <translation id="9050666287014529139">Frase de contraseña</translation> <translation id="9052208328806230490">Has registrado tus impresoras en <ph name="CLOUD_PRINT_NAME" /> con la cuenta <ph name="EMAIL" />.</translation> <translation id="9052404922357793350">Seguir bloqueando</translation> +<translation id="9053091947372579468">Tu dispositivo tiene una licencia de Chrome, pero tu nombre de usuario no está asociado a ninguna cuenta de consola de administración. Crea una para continuar con el registro. Nota: Si usas tu propio dominio para crearla, debes completar también la verificación del dominio después del registro. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Recordar mi selección</translation> <translation id="9055636786322918818">Fuerza el cifrado RC4. Esta opción aumenta el riesgo, ya que los algoritmos de cifrado de RC4 no son seguros.</translation> <translation id="9056034633062863292">Actualizando Chromebox</translation> @@ -5374,6 +5390,7 @@ <translation id="9218430445555521422">Establecer como predeterminado</translation> <translation id="9219103736887031265">Imágenes</translation> <translation id="9220525904950070496">Quitar cuenta</translation> +<translation id="9220820413868316583">Levanta el dedo y vuelve a intentarlo.</translation> <translation id="923467487918828349">Mostrar todas</translation> <translation id="928985544179707652">Extensiones:</translation> <translation id="930268624053534560">Marcas de tiempo detalladas</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index bf5ac96..a3d2e5c 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Võrke ei ole</translation> <translation id="1056898198331236512">Hoiatus</translation> <translation id="1058262162121953039">PUK-kood</translation> +<translation id="1059855432287631118">Sõrmejälje registreerimine</translation> <translation id="1061904396131502319">Pausiaeg on peagi käes</translation> <translation id="1062407476771304334">Asenda</translation> <translation id="1067048845568873861">Loodud</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Teemant</translation> <translation id="1114335938027186412">Teie arvuti sisaldab turvaseadet Trusted Platform Module (TPM), mida kasutatakse paljude väga tähtsate turvafunktsioonide rakendamiseks Chrome OS-is. Lisateavet leiate Chromebooki abikeskusest aadressil https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Unerežiim, kui kaas on suletud</translation> +<translation id="1115324527092594775">Teenuse Better Together seadistamine</translation> <translation id="1116694919640316211">Teave</translation> <translation id="1116779635164066733">Selle seade jõustab laiendus „<ph name="NAME" />”.</translation> <translation id="111844081046043029">Olete kindel, et soovite sellele lehelt lahkuda?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Praegune kellaaeg</translation> <translation id="1157102636231978136">Teie sirvimisandmed ja -tegevused, mis on sünkroonitud teie Google'i kontoga</translation> <translation id="1161575384898972166">Logige sisse rakendusse <ph name="TOKEN_NAME" /> kliendi sertifikaadi eksportimiseks.</translation> +<translation id="1161699061380012396">Chrome OS-i sisestusmeetod</translation> <translation id="1163931534039071049">&Vaata paneeli allikat</translation> <translation id="1164674268730883318">Kas lülitada Smart Lock välja seadmes <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Sisestage PUK-kood</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play poe konto</translation> <translation id="2509495747794740764">Skaleerimise määr peab olema arv vahemikus 10–200.</translation> <translation id="2509566264613697683">8-kordne</translation> -<translation id="2512222046227390255">Täida vormid automaatselt</translation> <translation id="2513403576141822879">Privaatsuse, turvalisuse ning andmete kogumisega seotud lisaseadete nägemiseks avage valik <ph name="BEGIN_LINK" />Sünkroonimine ja Google'i teenused<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Kontrolli</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Seerianumber: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Vaata raami allikat</translation> <translation id="3022978424994383087">Ei saanud aru.</translation> +<translation id="3023464535986383522">Vali ja kuula</translation> <translation id="3024374909719388945">Kasuta 24 h kella</translation> <translation id="302781076327338683">Laadib uuesti vahemälu vahele jättes</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Järgmine sisestusmeetod</translation> <translation id="3640214691812501263">Kas soovite lisada kasutajale <ph name="USER_NAME" /> laiendi „<ph name="EXTENSION_NAME" />”?</translation> <translation id="3644896802912593514">Laius</translation> +<translation id="3645372836428131288">Liigutage veidi sõrme, et sõrmejälje teine osa jäädvustada</translation> <translation id="3648348069317717750">Tuvastati <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Foto jäädvustati</translation> <translation id="3650952250015018111">Andke rakendusele „<ph name="APP_NAME" />” juurdepääs:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Sertifikaadi eeskirjad</translation> <translation id="392089482157167418">Luba ChromeVox (kõnena esitatud tagasiside)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Teil pole ühtegi hiljuti jäädvustatud WebRTC logi.</translation> <translation id="3925573269917483990">Kaamera:</translation> <translation id="3925842537050977900">Riiulilt vabastamine</translation> <translation id="3926002189479431949">Funktsiooni Smart Lock telefoni muudeti</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Ratsu</translation> <translation id="4387004326333427325">Autentimissertifikaat lükati kaugühenduse kaudu tagasi</translation> <translation id="4389091756366370506">Kasutaja <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetoothi seadistust juhib <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Keela</translation> <translation id="4400367121200150367">Siin kuvatakse saidid, millel paroole kunagi ei salvestata</translation> <translation id="4400632832271803360">Ülemise rea klahvide toimingu vahetamiseks hoidke all käivitajaklahvi</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Luba jätkuvalt sellel saidil lõikelauda näha</translation> <translation id="4530494379350999373">Päritolu</translation> <translation id="4533985347672295764">Protsessoriaeg</translation> +<translation id="4534661889221639075">Proovige uuesti.</translation> <translation id="4535127706710932914">Vaikeprofiil</translation> <translation id="4538417792467843292">Kustutab sõna</translation> <translation id="4538684596480161368">Blokeeri alati saidil <ph name="HOST" /> pistikprogrammid, mis ei ole liivakastirežiimis</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automaatparandus</translation> <translation id="4880827082731008257">Otsi ajaloost</translation> <translation id="4881695831933465202">Ava</translation> +<translation id="4882312758060467256">Laiendil on juurdepääs sellele saidile</translation> <translation id="4882473678324857464">Fookus järjehoidjatele</translation> <translation id="4882831918239250449">Juhtige, kuidas teie sirvimisajalugu kasutatakse otsingu, reklaamide ja muu isikupärastamiseks</translation> <translation id="4883178195103750615">Järjehoidjate eksportimine HTML-faili ...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Ava, kui on valmis</translation> <translation id="4972129977812092092">Printeri muutmine</translation> +<translation id="4972164225939028131">Vale parool</translation> <translation id="497287958838527945">Krediitkaardid ja aadressid, mis kasutavad teenust Google Pay.</translation> <translation id="4973307593867026061">Lisa printereid</translation> <translation id="4973523518332075481">Kasutage nime, milles on kuni <ph name="MAX_LENGTH" /> tähemärki</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Rakenduste laadimine …</translation> <translation id="5592595402373377407">Praegu pole veel saadaval piisavalt andmeid.</translation> +<translation id="5593357315997824387">Sünkrooni minu failid</translation> <translation id="5595152862129936745">Väga kaugel</translation> <translation id="5595485650161345191">Muuda aadressi</translation> <translation id="5596627076506792578">Rohkem valikuid</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Kahjuks on teie arvuti seadistatud vigase riistvara ID-ga. See ei lase Chrome OS-i värskendada uusimate turvaparandustega ja teie arvuti <ph name="BEGIN_BOLD" />võib pahatahtlike rünnakute osas haavatav olla<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Teie profiili avamisel läks midagi valesti. Logige välja ja seejärel uuesti sisse.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">peata taimer</translation> <translation id="667517062706956822">Kas soovite lasta Google'il selle lehe tõlkida <ph name="SOURCE_LANGUAGE" /> keelest <ph name="TARGET_LANGUAGE" /> keelde?</translation> <translation id="6675665718701918026">Ühendati kursoriseade</translation> <translation id="6678717876183468697">Päringu URL</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Tööriistaribale jätmine</translation> <translation id="7187428571767585875">Eemaldatavad või muudetavad registrikanded:</translation> <translation id="7189234443051076392">Veenduge, et seadmes oleks piisavalt ruumi</translation> +<translation id="7189965711416741966">Sõrmejälg lisati.</translation> <translation id="7191159667348037">Tundmatu printer (USB)</translation> <translation id="7191454237977785534">Salvesta fail nimega</translation> <translation id="7193374945610105795">Allika <ph name="ORIGIN" /> jaoks ei ole salvestatud ühtki parooli</translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Uus aken</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> kuvati nüüd täisekraanil.</translation> <translation id="7340650977506865820">Sait jagab teie ekraanikuva</translation> +<translation id="7341834142292923918">Soovib juurdepääsu saidile</translation> <translation id="7345706641791090287">Kinnitage oma parool</translation> <translation id="7346909386216857016">Selge, sain aru</translation> <translation id="7347751611463936647">Selle laiendi kasutamiseks tippige <ph name="EXTENSION_KEYWORD" />, seejärel TAB ja käsk või otsing.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google'i asukohateenus tuvastab teie seadme ligikaudse asukoha WiFi- ja mobiilsidevõrkude ning andurite alusel. Kui seadmes on seade Asukoht sisse lülitatud, on teenus aktiivne.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Asukohateenuse väljalülitamiseks võite välja lülitada oma seadme peamise asukohaseade. Asukohaseadetes võite välja lülitada ka WiFi- ja mobiilsidevõrkude ning andurite kasutamise asukoha määramiseks.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Parooli loomine –</translation> -<translation id="7518150891539970662">WebRTC logid (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7525067979554623046">Loo</translation> <translation id="7529411698175791732">Kontrollige oma Interneti-ühendust. Probleemi jätkumisel logige välja ja uuesti sisse.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Eemalda see isik</translation> <translation id="8217399928341212914">Jätka mitme faili automaatse allalaadimise blokeerimist</translation> <translation id="8223479393428528563">Kui soovite salvestada need failid võrguühenduseta kasutamiseks, minge uuesti veebi, paremklõpsake failidel ja tehke valik <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Lunastage oma pakkumised</translation> <translation id="8226222018808695353">Keelatud</translation> <translation id="8226619461731305576">Järjekord</translation> <translation id="8226742006292257240">Alljärgnev on juhuslikult loodud TPM-i parool, mis on teie arvutile määratud:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Logi sisse</translation> <translation id="8286963743045814739">Inkognito aknas saab privaatselt sirvida</translation> <translation id="82871696630048499">Veebileht laaditi uuesti, kuna mälu sai otsa.</translation> +<translation id="8288032458496410887">Rakenduse <ph name="APP" /> desinstallimine …</translation> <translation id="8291967909914612644">Koduteenuse pakkuja riik</translation> <translation id="8294431847097064396">Allikas</translation> <translation id="8297006494302853456">Nõrk</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Esmalt küsi (soovitatav)</translation> <translation id="8418445294933751433">&Kuva vahelehena</translation> <translation id="8419098111404128271">Päringu „<ph name="SEARCH_TEXT" />” otsingutulemused</translation> +<translation id="8419368276599091549">Tere tulemast kasutama <ph name="DEVICE_TYPE" />i!</translation> <translation id="8420060421540670057">Kuva Google Docsi failid</translation> <translation id="8424039430705546751">alla</translation> <translation id="8425213833346101688">Muuda</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Võrguühenduste seadistamine</translation> <translation id="8624205858755890468">Lubab assistendil esitada teile seotud teavet, rakendusi ja toiminguid.</translation> <translation id="862542460444371744">&Laiendused</translation> +<translation id="8626219642120025691">Taimer jõudis lõpule</translation> <translation id="8627151598708688654">Allika valimine</translation> <translation id="862727964348362408">Peatatud</translation> <translation id="862750493060684461">CSS-i vahemälu</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Teie muudatused salvestatakse automaatselt.<ph name="BREAKS" />Algse kujutise koopia säilitamiseks tühjendage märkeruut „Kirjuta algne fail üle”</translation> <translation id="8777628254805677039">juurparool</translation> <translation id="8780443667474968681">Häälotsing on välja lülitatud.</translation> +<translation id="878068003854005405">Alustame. Asetage sõrm andurile.</translation> <translation id="878069093594050299">Sellel sertifikaadil on järgmised kinnitatud kasutusalad:</translation> <translation id="8781980678064919987">Lülita välja, kui kaas on suletud</translation> <translation id="8782565991310229362">Kioski rakenduse käivitamine tühistati.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Parool</translation> <translation id="9052208328806230490">Olete oma printerid registreerinud rakenduse <ph name="CLOUD_PRINT_NAME" /> abil kontot <ph name="EMAIL" /> kasutades</translation> <translation id="9052404922357793350">Jätka blokeerimist</translation> +<translation id="9053091947372579468">Teie seade hõlmab Chrome'i litsentsi, ent teie kasutajanimi ei ole administraatorikonsooliga seotud. Looge administraatorikonsooli konto, et registreerimist jätkata. Märkus. Kui otsustate uue administraatorikonsooli konto loomiseks kasutada enda domeeni, tuleb teil pärast registreerumist domeen kinnitada. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Jäta valik meelde</translation> <translation id="9055636786322918818">Jõustatakse RC4-krüpteerimine. Selle valiku kasutamine suurendab riski, kuna RC4-šifrid on ebaturvalised.</translation> <translation id="9056034633062863292">Chromeboxi värskendamine</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Seadista vaikebrauseriks</translation> <translation id="9219103736887031265">Pildid</translation> <translation id="9220525904950070496">Konto eemaldamine</translation> +<translation id="9220820413868316583">Tõstke sõrm andurilt ja proovige uuesti.</translation> <translation id="923467487918828349">Kuva kõik</translation> <translation id="928985544179707652">Laiendused:</translation> <translation id="930268624053534560">Üksikasjalikud ajatemplid</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 8f282806..a95b7669 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">شبکهای وجود ندارد</translation> <translation id="1056898198331236512">اخطار</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">درحال ثبت اثرانگشت</translation> <translation id="1061904396131502319">تقریباً زمان استراحت است</translation> <translation id="1062407476771304334">جایگزینی</translation> <translation id="1067048845568873861">ایجاد شد</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">الماسی</translation> <translation id="1114335938027186412">رایانه شما حاوی یک دستگاه امنیتی با مدول پلتفورم مورداعتماد (TPM) است که برای اجرای بسیاری از ویژگیهای امنیتی مهم در سیستم عامل Chrome استفاده میشود. برای کسب اطلاعات بیشتر به مرکز راهنمایی Chromebook بروید: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">رفتن به حالت خواب، وقتی دستگاه بسته میشود</translation> +<translation id="1115324527092594775">راهاندازی Better Together</translation> <translation id="1116694919640316211">درباره</translation> <translation id="1116779635164066733">این تنظیم توسط افزونه «<ph name="NAME" />»، به اجرا درآمده است.</translation> <translation id="111844081046043029">آیا میخواهید این صفحه را ترک کنید؟</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">زمان کنونی</translation> <translation id="1157102636231978136">دادههای محصول مرور و فعالیتتان با حساب Google شما همگامسازی شد</translation> <translation id="1161575384898972166">لطفاً برای صدور مجوز سرویس گیرنده، به <ph name="TOKEN_NAME" /> وارد شوید.</translation> +<translation id="1161699061380012396">روش ورودی سیستمعامل Chrome</translation> <translation id="1163931534039071049">&نمای منبع قاب</translation> <translation id="1164674268730883318">Smart Lock برای <ph name="DEVICE_TYPE" /> خاموش شود؟</translation> <translation id="1164899421101904659">کلید باز کردن قفل پین را وارد کنید</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">حساب فروشگاه Google Play</translation> <translation id="2509495747794740764">مقیاس باید عددی بین ۱۰ تا ۲۰۰ باشد.</translation> <translation id="2509566264613697683">۸ برابر</translation> -<translation id="2512222046227390255">تکمیل خودکار فرمها</translation> <translation id="2513403576141822879">برای تنظیمات بیشتر مرتبط با حریم خصوصی، امنیت و جمعآوری دادهها، <ph name="BEGIN_LINK" />همگامسازی و سرویسهای Google<ph name="END_LINK" /> را ببینید</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">اسکن</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">شمارهٔ سریال: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&نمای منبع قاب</translation> <translation id="3022978424994383087">متوجه نشدم.</translation> +<translation id="3023464535986383522">انتخاب برای شنیدن</translation> <translation id="3024374909719388945">استفاده از ساعت ۲۴ ساعته</translation> <translation id="302781076327338683">تازهسازی دور زدن حافظه پنهان</translation> <translation id="3031417829280473749">مأمور X</translation> @@ -1749,6 +1752,7 @@ <translation id="363903084947548957">روش ورودی بعدی</translation> <translation id="3640214691812501263">«<ph name="EXTENSION_NAME" />» برای «<ph name="USER_NAME" />» اضافه شود؟</translation> <translation id="3644896802912593514">عرض</translation> +<translation id="3645372836428131288">انگشتتان را کمی حرکت دهید تا بخش دیگری از اثرانگشت ثبت شود.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> شناسایی شد</translation> <translation id="3649138363871392317">عکس گرفته شد</translation> <translation id="3650952250015018111">اجازه به «<ph name="APP_NAME" />» برای دسترسی به:</translation> @@ -1944,7 +1948,6 @@ <translation id="3920504717067627103">سیاست مربوط به گواهی</translation> <translation id="392089482157167418">فعال کردن ChromeVox (بازخورد گفتاری)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">اخیراً هیچ گزارش WebRTC را ثبت نکردید.</translation> <translation id="3925573269917483990">دوربین:</translation> <translation id="3925842537050977900">قطع اتصال از راهانداز</translation> <translation id="3926002189479431949">تلفن مربوط به Smart Lock تغییر کرد</translation> @@ -2220,6 +2223,7 @@ <translation id="438503109373656455">اسب</translation> <translation id="4387004326333427325">گواهینامه راستیآزمایی، ازراهدور، رد شد</translation> <translation id="4389091756366370506">کاربر <ph name="VALUE" /></translation> +<translation id="439266289085815679">پیکربندی Bluetooth توسط <ph name="USER_EMAIL" /> کنترل میشود.</translation> <translation id="4394049700291259645">غیر فعال کردن</translation> <translation id="4400367121200150367">سایتهایی که هرگز گذرواژه را ذخیره نمیکنند در اینجا نشان داده نخواهند شد</translation> <translation id="4400632832271803360">برای تغییر عملکرد کلیدهای ردیف بالا، کلید «راهانداز» را نگهدارید</translation> @@ -2293,6 +2297,7 @@ <translation id="4522600456902129422">دسترسی این سایت به بریدهدان همچنان مجاز باشد</translation> <translation id="4530494379350999373">مبدأ</translation> <translation id="4533985347672295764">زمان پردازش CPU</translation> +<translation id="4534661889221639075">دوباره امتحان کنید.</translation> <translation id="4535127706710932914">نمایه پیشفرض</translation> <translation id="4538417792467843292">حذف کلمه</translation> <translation id="4538684596480161368">همیشه افزایههای آزمایشی نشده در <ph name="HOST" /> مسدود شوند</translation> @@ -2522,6 +2527,7 @@ <translation id="4880520557730313061">تصحیح خودکار</translation> <translation id="4880827082731008257">سابقه جستجو</translation> <translation id="4881695831933465202">باز کردن</translation> +<translation id="4882312758060467256">به این سایت دسترسی دارد</translation> <translation id="4882473678324857464">تمرکز بر نشانکها</translation> <translation id="4882831918239250449">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو»، آگهیها و موارد دیگر</translation> <translation id="4883178195103750615">صادر کردن نشانکها به فایل HTML...</translation> @@ -2587,6 +2593,7 @@ <translation id="4969785127455456148">آلبوم</translation> <translation id="4971412780836297815">بعد از اتمام باز شود</translation> <translation id="4972129977812092092">ویرایش چاپگر</translation> +<translation id="4972164225939028131">گذرواژه اشتباه است</translation> <translation id="497287958838527945">کارتهای اعتباری و نشانیهای مورداستفاده در Google Pay.</translation> <translation id="4973307593867026061">افزودن چاپگرها</translation> <translation id="4973523518332075481">از نامی استفاده کنید که <ph name="MAX_LENGTH" /> نویسه یا کمتر داشته باشد</translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">درحال بار کردن برنامه...</translation> <translation id="5592595402373377407">هنوز داده کافی در دسترس نیست.</translation> +<translation id="5593357315997824387">همگامسازی فایلهای من</translation> <translation id="5595152862129936745">خیلی دور</translation> <translation id="5595485650161345191">ویرایش آدرس</translation> <translation id="5596627076506792578">گزینههای بیشتر</translation> @@ -3729,6 +3737,7 @@ <translation id="6664237456442406323">متأسفانه، رایانه شما با یک شناسه سختافزار ناقص پیکربندی شده است. این موضوح سیستم عامل Chrome را از بهروزرسانی با جدیدترین اصلاحات امنیتی باز میدارد که <ph name="BEGIN_BOLD" />میتواند رایانه شما را در برابر حملات مخرب آسیبپذیر نماید<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">هنگام باز کردن نمایهتان مشکلی پیش آمد. لطفاً از سیستم خارج شوید و دوباره به آن وارد شوید.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">توقف تایمر</translation> <translation id="667517062706956822">میخواهید Google این صفحه را از <ph name="SOURCE_LANGUAGE" /> به <ph name="TARGET_LANGUAGE" /> ترجمه کند؟</translation> <translation id="6675665718701918026">دستگاه نشانگر متصل شد</translation> <translation id="6678717876183468697">نشانی وب عبارت</translation> @@ -4055,6 +4064,7 @@ <translation id="7186088072322679094">نگه داشتن در نوار ابزار</translation> <translation id="7187428571767585875">ورودیهای رجیستری برای برداشتن یا تغییر دادن:</translation> <translation id="7189234443051076392">مطمئن شوید که در دستگاهتان فضای کافی وجود داشته باشد</translation> +<translation id="7189965711416741966">اثرانگشت اضافه شد.</translation> <translation id="7191159667348037">چاپگر ناشناس (USB)</translation> <translation id="7191454237977785534">ذخیره فایل بهعنوان</translation> <translation id="7193374945610105795">هیچ گذرواژهای برای <ph name="ORIGIN" /> ذخیره نشده است</translation> @@ -4155,6 +4165,7 @@ <translation id="7339898014177206373">پنجرهٔ جدید</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> اکنون در حالت تمام صفحه است.</translation> <translation id="7340650977506865820">سایت درحال همرسانی صفحهنمایش شما است</translation> +<translation id="7341834142292923918">میخواهد به این سایت دسترسی پیدا کند</translation> <translation id="7345706641791090287">گذرواژهتان را تأیید کنید</translation> <translation id="7346909386216857016">بله متوجه شدم.</translation> <translation id="7347751611463936647">برای استفاده از این برنامهٔ افزودنی، "<ph name="EXTENSION_KEYWORD" />"، سپس TAB و نظر یا جستجوی خود را تایپ کنید.</translation> @@ -4264,7 +4275,6 @@ <ph name="BEGIN_PARAGRAPH2" />خدمات مکان Google از منابعی مانند Wi-Fi، شبکههای تلفن همراه و حسگرها برای کمک به تخمین مکان دستگاهتان استفاده میکند. وقتی تنظیم «مکان» دستگاهتان روشن باشد، این سرویس فعال است.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />میتوانید با خاموش کردن تنظیم «مکان» اصلی در دستگاهتان، «مکان» را خاموش کنید. همچنین، میتوانید در تنظیمات مکان استفاده از Wi-Fi، شبکههای تلفن همراه و حسگرها را برای مکان خاموش کنید.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">ایجاد گذرواژه -</translation> -<translation id="7518150891539970662">گزارشهای WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">جاوا اسکریپت</translation> <translation id="7525067979554623046">ایجاد</translation> <translation id="7529411698175791732">اتصال اینترنت را بررسی کنید. اگر مشکل حل نشد، از سیستم خارج شوید و دوباره به آن وارد شوید.</translation> @@ -4742,6 +4752,7 @@ <translation id="8214962590150211830">حذف این شخص</translation> <translation id="8217399928341212914">ادامه مسدود کردن بارگیری خودکار چندین فایل</translation> <translation id="8223479393428528563">برای ذخیره این فایلها جهت استفاده آفلاین، دوباره آنلاین شوید، روی فایلها کلیک راست کنید و گزینه <ph name="OFFLINE_CHECKBOX_NAME" /> را انتخاب کنید.</translation> +<translation id="8225753906568652947">استفاده از پیشنهادها</translation> <translation id="8226222018808695353">ممنوع</translation> <translation id="8226619461731305576">صف</translation> <translation id="8226742006292257240">در زیر گذرواژه TPM ایجاد شده به صورت تصادفی، آورده شده که به رایانهٔ شما اختصاص داده شده است:</translation> @@ -4788,6 +4799,7 @@ <translation id="8286036467436129157">ورود به سیستم</translation> <translation id="8286963743045814739">با پنجره ناشناس، میتوانید خصوصی مرور کنید</translation> <translation id="82871696630048499">صفحه وب تازهسازی شد زیرا با کمبود حافظه روبرو شد.</translation> +<translation id="8288032458496410887">حذف نصب <ph name="APP" />...</translation> <translation id="8291967909914612644">کشور ارائهدهنده اصلی</translation> <translation id="8294431847097064396">منبع</translation> <translation id="8297006494302853456">ضعیف</translation> @@ -4849,6 +4861,7 @@ <translation id="8413385045638830869">ابتدا سؤال شود (توصیه میشود)</translation> <translation id="8418445294933751433">&نمایش بهصورت برگه</translation> <translation id="8419098111404128271">نتایج جستجو برای «<ph name="SEARCH_TEXT" />»</translation> +<translation id="8419368276599091549">به <ph name="DEVICE_TYPE" /> خوش آمدید!</translation> <translation id="8420060421540670057">نمایش فایلهای سندنگار Google</translation> <translation id="8424039430705546751">پایین</translation> <translation id="8425213833346101688">تغییر</translation> @@ -4975,6 +4988,7 @@ <translation id="8620765578342452535">پیکربندی اتصالات شبکه</translation> <translation id="8624205858755890468">«دستیار» را برای نمایش اطلاعات، برنامهها و کنشهای مرتبط فعال میکند.</translation> <translation id="862542460444371744">&برنامه های افزودنی</translation> +<translation id="8626219642120025691">تایمر تمام</translation> <translation id="8627151598708688654">انتخاب منبع</translation> <translation id="862727964348362408">معلق شد</translation> <translation id="862750493060684461">حافظهٔ پنهان CSS</translation> @@ -5095,6 +5109,7 @@ <translation id="8775404590947523323">ویرایشهای شما بهطور خودکار ذخیره میشوند.<ph name="BREAKS" />برای داشتن یک نسخه از تصویر اصلی٬ علامت «رونویسی نسخهٔ اصلی» را بردارید.</translation> <translation id="8777628254805677039">گذرواژه کاربر ریشه</translation> <translation id="8780443667474968681">جستجوی گفتاری خاموش شده است.</translation> +<translation id="878068003854005405">بیایید شروع کنیم. انگشتتان را روی حسگر قرار دهید.</translation> <translation id="878069093594050299">این گواهی برای استفادههای زیر تأیید شده است:</translation> <translation id="8781980678064919987">خاموش شدن، وقتی دستگاه بسته میشود</translation> <translation id="8782565991310229362">راهاندازی برنامه کاربردی کیوسک لغو شد.</translation> @@ -5272,6 +5287,7 @@ <translation id="9050666287014529139">عبارت عبور</translation> <translation id="9052208328806230490">شما ثبت چاپگرهای خود را با <ph name="CLOUD_PRINT_NAME" /> از طریق حساب <ph name="EMAIL" /> انجام دادهاید</translation> <translation id="9052404922357793350">ادامه مسدود کردن</translation> +<translation id="9053091947372579468">دستگاهتان دارای مجوز Chrome است، اما نام کاربریتان با «کنسول سرپرست» مرتبط نشده است. لطفاً برای ادامه ثبتنام، حساب «کنسول سرپرست» ایجاد کنید. نکته: اگر بخواهید از دامنه خود برای ایجاد حساب «کنسول سرپرست» جدید استفاده کنید، باید بعد از ثبتنام، تأیید دامنه را هم تکمیل کنید. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">انتخاب من به خاطر سپرده شود</translation> <translation id="9055636786322918818">اجرای اجباری رمزگذاری RC4. استفاده از این گزینه احتمال خطر را بالا میبرد، زیرا رمزهای RC4 امن نیست.</translation> <translation id="9056034633062863292">در حال بهروزرسانی Chromebox</translation> @@ -5375,6 +5391,7 @@ <translation id="9218430445555521422">تنظیم بهعنوان پیشفرض</translation> <translation id="9219103736887031265">تصاویر</translation> <translation id="9220525904950070496">حذف حساب</translation> +<translation id="9220820413868316583">انگشتتان را بردارید سپس دوباره امتحان کنید.</translation> <translation id="923467487918828349">نمایش همه</translation> <translation id="928985544179707652">افزونهها:</translation> <translation id="930268624053534560">مهرهای زمان با جزئیات</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index e9311952..5e27de01 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1007,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Kauppa ‑tili</translation> <translation id="2509495747794740764">Asteikon on oltava numero välillä 10–200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Täytä lomakkeet automaattisesti</translation> <translation id="2513403576141822879">Näet lisää yksityisyyteen, tietoturvaan ja datankeruuseen liittyviä asetuksia <ph name="BEGIN_LINK" />Synkronointi ja Google-palvelut<ph name="END_LINK" /> ‑kohdassa.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Etsi</translation> @@ -1954,7 +1953,6 @@ <translation id="3920504717067627103">Varmennekäytännöt</translation> <translation id="392089482157167418">Ota ChromeVox käyttöön (äänipalaute)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Sinulla ei ole äskettäin kaapattuja WebRTC-lokeja.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Poista kiinnitys hyllystä</translation> <translation id="3926002189479431949">Smart Lock -puhelin on vaihdettu</translation> @@ -4281,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googlen sijaintipalvelut pyrkivät arvioimaan laitteen sijainnin esim. Wi-Fi- ja mobiiliverkkojen sekä anturien avulla. Palvelu on aktiivinen, kun laitteen sijaintiasetus on käytössä.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Voit poistaa palvelun käytöstä poistamalla laitteen sijaintiasetuksen käytöstä. Voit myös poistaa käytöstä Wi-Fi- ja mobiiliverkkojen sekä anturien käytön sijainnin määrityksessä.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Luo salasana –</translation> -<translation id="7518150891539970662">WebRTC-lokit (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Luo</translation> <translation id="7529411698175791732">Tarkista internetyhteytesi. Jos ongelma jatkuu, kirjaudu ulos ja sitten takaisin sisään.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index b57eca1..9a50fc3 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Walang network</translation> <translation id="1056898198331236512">Babala</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Pagrehistro ng fingerprint</translation> <translation id="1061904396131502319">Halos oras na para magpahinga</translation> <translation id="1062407476771304334">Palitan</translation> <translation id="1067048845568873861">Ginawa</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamond</translation> <translation id="1114335938027186412">Ang iyong computer ay mayroong device na panseguridad na Trusted Platform Module (TPM), na ginagamit upang magpatupad ng maraming kritikal na panseguridad na feature sa Chrome OS. Puntahan ang Help Center ng Chromebook upang matuto nang higit pa: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">I-sleep kapag isinara ang takip</translation> +<translation id="1115324527092594775">I-set up ang Mas Mahusay Kung Magkasama</translation> <translation id="1116694919640316211">Tungkol sa</translation> <translation id="1116779635164066733">Ipinapatupad ng extension na "<ph name="NAME" />" ang setting na ito.</translation> <translation id="111844081046043029">Sigurado ka ba na nais mong iwanan ang pahinang ito?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Kasalukuyang oras</translation> <translation id="1157102636231978136">Naka-sync sa iyong Google Account ang data mula sa pag-browse at aktibidad.</translation> <translation id="1161575384898972166">Mangyaring mag-sign in sa <ph name="TOKEN_NAME" /> upang i-export ang certificate ng client.</translation> +<translation id="1161699061380012396">Pamamaraan ng Pag-input ng Chrome OS</translation> <translation id="1163931534039071049">&View frame source</translation> <translation id="1164674268730883318">I-off ang Smart Lock para sa <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Ilagay ang PIN Unlock Key</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Store Account</translation> <translation id="2509495747794740764">Dapat ay numero sa pagitan ng 10 at 200 ang halaga ng scale.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">I-autofill ang mga form</translation> <translation id="2513403576141822879">Para sa higit pang setting na nauugnay sa privacy, seguridad, at pangongolekta ng data, tingnan ang <ph name="BEGIN_LINK" />Pag-sync at mga serbisyo ng Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">I-scan</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Serial Number: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Tingnan ang Pinagmulan ng Frame</translation> <translation id="3022978424994383087">Hindi iyon nakuha.</translation> +<translation id="3023464535986383522">Select to speak</translation> <translation id="3024374909719388945">Gamitin ang 24-oras na orasan</translation> <translation id="302781076327338683">I-reload ang pag-bypass sa cache</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Susunod na paraan ng pag-input</translation> <translation id="3640214691812501263">Idagdag ang "<ph name="EXTENSION_NAME" />" para sa <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Lapad</translation> +<translation id="3645372836428131288">Gumalaw nang bahagya para mag-capture ng ibang bahagi ng fingerprint.</translation> <translation id="3648348069317717750">Natukoy ang <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Na-capture ang larawan</translation> <translation id="3650952250015018111">Payagan ang "<ph name="APP_NAME" />" na ma-access ang:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Mga Patakaran ng Certificate</translation> <translation id="392089482157167418">I-enable ang ChromeVox (pasalitang feedback)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Wala kang mga kamakailang na-capture na log ng WebRTC.</translation> <translation id="3925573269917483990">Camera:</translation> <translation id="3925842537050977900">I-unpin mula Shelf</translation> <translation id="3926002189479431949">Binago ang telepono ng Smart Lock</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Petra</translation> <translation id="4387004326333427325">Remote na tinanggihan ang certificate sa pagpapatunay</translation> <translation id="4389091756366370506">User <ph name="VALUE" /></translation> +<translation id="439266289085815679">Ang configuration ng bluetooth ay kinokontrol ni <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Huwag paganahin</translation> <translation id="4400367121200150367">Lalabas dito ang mga site na hindi kailanman nagse-save ng mga password</translation> <translation id="4400632832271803360">Pindutin nang matagal ang key ng Launcher upang mapalitan ang gawi ng mga key sa itaas na row</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Patuloy na payagan ang site na ito na makita ang clipboard</translation> <translation id="4530494379350999373">Pinanggalingan</translation> <translation id="4533985347672295764">Oras ng CPU</translation> +<translation id="4534661889221639075">Subukang muli.</translation> <translation id="4535127706710932914">Default na Profile</translation> <translation id="4538417792467843292">Magtanggal ng salita</translation> <translation id="4538684596480161368">Laging i-block ang mga hindi naka-sandbox na plugin sa <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Auto-fix</translation> <translation id="4880827082731008257">History ng paghahanap</translation> <translation id="4881695831933465202">Buksan</translation> +<translation id="4882312758060467256">May access sa site na ito</translation> <translation id="4882473678324857464">Tumuon sa mga bookmark</translation> <translation id="4882831918239250449">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap, mga ad, at iba pa</translation> <translation id="4883178195103750615">I-export ang mga bookmark sa file na HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Buksan kapag tapos na</translation> <translation id="4972129977812092092">I-edit ang printer</translation> +<translation id="4972164225939028131">Mali ang password</translation> <translation id="497287958838527945">Mga credit card at address na gumagamit ng Google Pay.</translation> <translation id="4973307593867026061">Magdagdag ng mga printer</translation> <translation id="4973523518332075481">Gumamit ng pangalang may <ph name="MAX_LENGTH" /> (na) character o mas kaunti</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Nilo-load ang mga app...</translation> <translation id="5592595402373377407">Wala pang available na sapat na data.</translation> +<translation id="5593357315997824387">I-sync ang aking mga file</translation> <translation id="5595152862129936745">Napakalayo</translation> <translation id="5595485650161345191">Mag-edit ng address</translation> <translation id="5596627076506792578">Higit pang opsyon</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Sa kasamaang-palad, na-configure ang iyong computer gamit ang isang hardware ID na mali ang pagkakabuo. Pinipigilan nitong mag-update ang Chrome OS upang magkaroon ng mga pinakabagong pag-aayos sa seguridad at <ph name="BEGIN_BOLD" />maaaring mawalan ng proteksyon laban sa mga nakakahamak na pag-atake<ph name="END_BOLD" /> ang iyong computer.</translation> <translation id="6664774537677393800">Nagkaproblema sa pagbukas ng iyong profile. Mangyaring mag-sign out at pagkatapos ay muling mag-sign in.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">ihinto ang timer</translation> <translation id="667517062706956822">Gusto mo bang i-translate ng Google ang page na ito mula sa <ph name="SOURCE_LANGUAGE" /> patungo sa <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">May nakakonektang pointing device</translation> <translation id="6678717876183468697">URL ng Query</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Panatilihin sa Toolbar</translation> <translation id="7187428571767585875">Mga aalisin o papalitang entry sa registry:</translation> <translation id="7189234443051076392">Tiyaking may sapat na espasyo sa iyong device</translation> +<translation id="7189965711416741966">Naidagdag ang fingerprint.</translation> <translation id="7191159667348037">Hindi Alam na Printer (USB)</translation> <translation id="7191454237977785534">I-save ang file bilang</translation> <translation id="7193374945610105795">Walang naka-save na password para sa <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Bagong window</translation> <translation id="7340431621085453413">Full screen na ngayon ang <ph name="FULLSCREEN_ORIGIN" />.</translation> <translation id="7340650977506865820">Ibinabahagi ng site ang iyong screen</translation> +<translation id="7341834142292923918">Gusto ng access sa site na ito</translation> <translation id="7345706641791090287">Kumpirmahin ang iyong password</translation> <translation id="7346909386216857016">Ok, nakuha ko</translation> <translation id="7347751611463936647">Upang gamitin ang extension na ito, i-type ang "<ph name="EXTENSION_KEYWORD" />", pagkatapos ay ang TAB, pagkatapos ay ang iyong command o paghahanap.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Gumagamit ang serbisyo sa lokasyon ng Google ng mga source gaya ng Wi-Fi, mga mobile network, at mga sensor para makatulong na matantya ang lokasyon ng device mo. Aktibo ang serbisyong ito kapag naka-on ang setting ng Lokasyon ng device mo.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Maaari mong i-off ang Lokasyon sa pamamagitan ng pag-off sa pangunahing setting ng Lokasyon sa iyong device. Maaari mo ring i-off ang paggamit ng Wi-Fi, mga mobile network, at mga sensor para sa lokasyon sa mga setting ng lokasyon.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Gumawa ng isang password -</translation> -<translation id="7518150891539970662">Mga log ng WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Gumawa</translation> <translation id="7529411698175791732">Suriin ang iyong koneksyon sa internet. Kung magpapatuloy ang problema, subukang mag-sign out at muling mag-sign in.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Alisin ang Taong Ito</translation> <translation id="8217399928341212914">Patuloy na i-block ang mga awtomatikong pagda-download ng maraming file</translation> <translation id="8223479393428528563">Upang i-save ang mga file na ito para sa offline na paggamit, mag-online muli, i-right click ang mga file at piliin ang opsyong <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">I-redeem ang iyong mga alok</translation> <translation id="8226222018808695353">Ipinagbabawal</translation> <translation id="8226619461731305576">I-queue</translation> <translation id="8226742006292257240">Sa ibaba ay ang random na binubuong TPM password na itinalaga sa iyong computer:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Mag-sign In</translation> <translation id="8286963743045814739">Maaari kang mag-browse nang pribado gamit ang isang incognito window</translation> <translation id="82871696630048499">Na-reload ang web page dahil naubusan na ito ng memory.</translation> +<translation id="8288032458496410887">I-uninstall ang <ph name="APP" />...</translation> <translation id="8291967909914612644">Bansa ng home provider</translation> <translation id="8294431847097064396">Pinagmulan</translation> <translation id="8297006494302853456">Mahina</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Magtanong muna (inirerekomenda)</translation> <translation id="8418445294933751433">&Ipakita bilang tab</translation> <translation id="8419098111404128271">Mga resulta ng paghahanap para sa '<ph name="SEARCH_TEXT" />'</translation> +<translation id="8419368276599091549">Welcome sa iyong <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Ipakita ang mga file ng Google Docs</translation> <translation id="8424039430705546751">pababa</translation> <translation id="8425213833346101688">Baguhin</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">I-configure ang mga koneksyon sa network</translation> <translation id="8624205858755890468">Binibigyang-daan ang Assistant na magpakita sa iyo ng mga kaugnay na impormasyon, app, at pagkilos.</translation> <translation id="862542460444371744">&Mga Extension</translation> +<translation id="8626219642120025691">Tapos na ang timer</translation> <translation id="8627151598708688654">Pumili ng pinagmulan</translation> <translation id="862727964348362408">Sinuspinde</translation> <translation id="862750493060684461">CSS cache</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Awtomatikong na-save ang iyong mga pag-edit.<ph name="BREAKS" />Upang maitago ang kopya ng orihinal na larawan, tanggalan ng check ang "Patungan ang orihinal"</translation> <translation id="8777628254805677039">root password</translation> <translation id="8780443667474968681">Na-off na ang paghahanap gamit ang boses.</translation> +<translation id="878068003854005405">Magsimula na tayo. Ilagay ang iyong daliri sa sensor.</translation> <translation id="878069093594050299">Ang certificate na ito ay na-verify para sa sumusunod na mga paggamit:</translation> <translation id="8781980678064919987">Mag-shut down kapag isinara ang takip</translation> <translation id="8782565991310229362">Kinansela ang paglulunsad sa kiosk application.</translation> @@ -5278,6 +5293,7 @@ <translation id="9050666287014529139">Passphrase</translation> <translation id="9052208328806230490">Inirehistro mo ang iyong mga printer sa <ph name="CLOUD_PRINT_NAME" /> gamit ang account na <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Patuloy na i-block</translation> +<translation id="9053091947372579468">May lisensya sa Chrome ang iyong device, ngunit hindi nauugnay ang username mo sa isang Admin console. Gumawa ng Admin console account para magpatuloy sa pag-enroll. Tandaan: Kung pipiliin mong gamitin ang iyong sariling domain para makagawa ng bagong Admin console account, dapat mo ring kumpletuhin ang pag-verify ng domain pagkatapos mag-sign up. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Tandaan ang aking pinili</translation> <translation id="9055636786322918818">Ipatupad ang RC4 encryption. Magiging mas mapanganib para sa iyo kapag ginamit ang opsyong ito, dahil hindi secure ang mga RC4 cipher.</translation> <translation id="9056034633062863292">Ina-update ang Chromebox</translation> @@ -5381,6 +5397,7 @@ <translation id="9218430445555521422">Itakda bilang default</translation> <translation id="9219103736887031265">Mga Larawan</translation> <translation id="9220525904950070496">Alisin ang account</translation> +<translation id="9220820413868316583">Iangat at pagkatapos ay subukang muli.</translation> <translation id="923467487918828349">Show All</translation> <translation id="928985544179707652">Mga Extension:</translation> <translation id="930268624053534560">Mga Detalyadong Timestamp</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 10fcd9dd..1a12999 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Aucun réseau</translation> <translation id="1056898198331236512">Avertissement</translation> <translation id="1058262162121953039">Clé PUK</translation> +<translation id="1059855432287631118">Enregistrer l'empreinte digitale</translation> <translation id="1061904396131502319">Il est presque temps de faire une pause</translation> <translation id="1062407476771304334">Remplacer</translation> <translation id="1067048845568873861">Date de création</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Votre ordinateur comprend un dispositif de sécurité avec module de plate-forme sécurisée (TPM, Trusted Platform Module) qui permet de mettre en œuvre plusieurs fonctionnalités de sécurité critiques dans Chrome OS. Consultez le centre d'aide Chromebook pour en savoir plus : https://support.google.com/chromebook/?p=tpm.</translation> <translation id="1114525161406758033">Mettre en veille quand l'écran est rabattu</translation> +<translation id="1115324527092594775">Configurer Better Together</translation> <translation id="1116694919640316211">À propos</translation> <translation id="1116779635164066733">Ce paramètre est appliqué par l'extension "<ph name="NAME" />".</translation> <translation id="111844081046043029">Voulez-vous vraiment quitter cette page ?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Heure actuelle</translation> <translation id="1157102636231978136">Vos données de navigation et votre activité sont synchronisées avec votre compte Google</translation> <translation id="1161575384898972166">Connectez-vous à <ph name="TOKEN_NAME" /> pour exporter le certificat client.</translation> +<translation id="1161699061380012396">Mode de saisie Chrome OS</translation> <translation id="1163931534039071049">&Afficher le code source du cadre</translation> <translation id="1164674268730883318">Désactiver Smart Lock pour l'appareil <ph name="DEVICE_TYPE" /> ?</translation> <translation id="1164899421101904659">Saisir la clé de déverrouillage du code</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Compte Google Play Store</translation> <translation id="2509495747794740764">La valeur d'échelle doit être un nombre compris entre 10 et 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Remplir form. automatiquement</translation> <translation id="2513403576141822879">Pour accéder à d'autres paramètres liés à la confidentialité, à la sécurité et à la collecte de données, consultez la section <ph name="BEGIN_LINK" />Services Google/Synchronisation<ph name="END_LINK" />.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Rechercher</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Numéro de série : <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Afficher le code source du cadre</translation> <translation id="3022978424994383087">Je n'ai pas compris.</translation> +<translation id="3023464535986383522">Sélectionner pour prononcer</translation> <translation id="3024374909719388945">Utiliser l'horloge au format 24 heures</translation> <translation id="302781076327338683">Actualiser en ignorant le cache</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Prochain mode de saisie</translation> <translation id="3640214691812501263">Ajouter <ph name="EXTENSION_NAME" /> pour <ph name="USER_NAME" /> ?</translation> <translation id="3644896802912593514">Largeur</translation> +<translation id="3645372836428131288">Déplacez légèrement votre doigt pour enregistrer une autre partie de votre empreinte digitale.</translation> <translation id="3648348069317717750">L'appareil "<ph name="USB_DEVICE_NAME" />" a été détecté</translation> <translation id="3649138363871392317">La photo a été prise.</translation> <translation id="3650952250015018111">Autoriser "<ph name="APP_NAME" />" à accéder à l'appareil suivant :</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Stratégies de certificat</translation> <translation id="392089482157167418">Activer ChromeVox (commentaires audio)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Aucun journal WebRTC n'a été créé récemment.</translation> <translation id="3925573269917483990">Appareil photo :</translation> <translation id="3925842537050977900">Retirer de l'étagère</translation> <translation id="3926002189479431949">Le téléphone Smart Lock a changé</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Longchamp</translation> <translation id="4387004326333427325">Certificat d'authentification rejeté à distance.</translation> <translation id="4389091756366370506">Utilisateur <ph name="VALUE" /></translation> +<translation id="439266289085815679">La configuration Bluetooth est contrôlée par <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Désactiver</translation> <translation id="4400367121200150367">Les sites pour lesquels vos mots de passe ne seront jamais enregistrés s'afficheront ici</translation> <translation id="4400632832271803360">Maintenir la touche du lanceur d'applications enfoncée pour modifier la fonction des touches de la rangée supérieure</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Continuer à autoriser ce site à voir le contenu du presse-papiers</translation> <translation id="4530494379350999373">Origine</translation> <translation id="4533985347672295764">Temps CPU</translation> +<translation id="4534661889221639075">Réessayez.</translation> <translation id="4535127706710932914">Profil par défaut</translation> <translation id="4538417792467843292">Supprimer le mot</translation> <translation id="4538684596480161368">Toujours bloquer l'exécution hors bac à sable des plug-ins sur <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Correction automatique</translation> <translation id="4880827082731008257">Rechercher dans l'historique</translation> <translation id="4881695831933465202">Ouvrir</translation> +<translation id="4882312758060467256">A accès à ce site</translation> <translation id="4882473678324857464">Favoris</translation> <translation id="4882831918239250449">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces, etc.</translation> <translation id="4883178195103750615">Exporter les favoris vers un fichier HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Ouvrir une fois le téléchargement terminé</translation> <translation id="4972129977812092092">Modifier l'imprimante</translation> +<translation id="4972164225939028131">Mot de passe incorrect</translation> <translation id="497287958838527945">Cartes de crédit et adresses utilisées dans Google Pay.</translation> <translation id="4973307593867026061">Ajouter des imprimantes</translation> <translation id="4973523518332075481">Utilisez un nom comportant <ph name="MAX_LENGTH" /> caractères au maximum</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Chargement des applications…</translation> <translation id="5592595402373377407">Les données disponibles sont insuffisantes pour le moment.</translation> +<translation id="5593357315997824387">Synchroniser mes fichiers</translation> <translation id="5595152862129936745">Très éloigné</translation> <translation id="5595485650161345191">Modifier l'adresse</translation> <translation id="5596627076506792578">Plus d'options</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">Malheureusement, votre ordinateur est configuré avec un ID matériel incorrect. Cette défaillance empêche l'installation des derniers correctifs de sécurité sur Chrome OS et rend votre ordinateur <ph name="BEGIN_BOLD" />potentiellement vulnérable aux attaques malveillantes<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Une erreur s'est produite lors de l'ouverture de votre profil. Veuillez vous déconnecter, puis vous connecter de nouveau.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">arrête le minuteur</translation> <translation id="667517062706956822">Souhaitez-vous que Google traduise cette page de la langue "<ph name="SOURCE_LANGUAGE" />" vers la langue "<ph name="TARGET_LANGUAGE" />" ?</translation> <translation id="6675665718701918026">Dispositif de pointage connecté</translation> <translation id="6678717876183468697">URL de requête</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">Garder dans la barre d'outils</translation> <translation id="7187428571767585875">Entrées de registre à supprimer ou à modifier :</translation> <translation id="7189234443051076392">Assurez-vous de disposer de suffisamment d'espace sur votre appareil</translation> +<translation id="7189965711416741966">Empreinte digitale ajoutée.</translation> <translation id="7191159667348037">Imprimante inconnue (USB)</translation> <translation id="7191454237977785534">Enregistrer le fichier sous</translation> <translation id="7193374945610105795">Aucun mot de passe enregistré pour <ph name="ORIGIN" /></translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Nouvelle fenêtre</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> est maintenant en mode plein écran</translation> <translation id="7340650977506865820">Le site partage votre écran</translation> +<translation id="7341834142292923918">Souhaite accéder à ce site</translation> <translation id="7345706641791090287">Confirmez votre mot de passe.</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">Pour utiliser cette extension, saisissez "<ph name="EXTENSION_KEYWORD" />", TAB, puis votre commande ou votre recherche.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Le service de localisation de Google utilise des sources comme les réseaux Wi-Fi et mobiles pour estimer la position de votre appareil. Ce service fonctionne lorsque les paramètres de localisation de votre appareil sont activés.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Pour désactiver ce service, désactivez le paramètre de localisation principal de l'appareil. Vous pouvez également désactiver l'utilisation des réseaux mobiles et Wi-Fi, ainsi que des capteurs, dans les paramètres de localisation.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Créer un mot de passe –</translation> -<translation id="7518150891539970662">Journaux WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Créer</translation> <translation id="7529411698175791732">Vérifiez votre connexion Internet. Si le problème persiste, essayez de vous déconnecter, puis de vous reconnecter.</translation> @@ -4747,6 +4757,7 @@ <translation id="8214962590150211830">Supprimer ce profil utilisateur</translation> <translation id="8217399928341212914">Continuer à bloquer le téléchargement automatique de plusieurs fichiers</translation> <translation id="8223479393428528563">Pour enregistrer ces fichiers en vue d'une utilisation hors connexion, reconnectez-vous, cliquez sur les fichiers à l'aide du bouton droit de la souris, puis sélectionnez l'option <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Utiliser vos offres</translation> <translation id="8226222018808695353">Interdit</translation> <translation id="8226619461731305576">File d'attente</translation> <translation id="8226742006292257240">Le mot de passe TPM ci-dessous, généré de façon aléatoire, a été attribué à votre ordinateur :</translation> @@ -4793,6 +4804,7 @@ <translation id="8286036467436129157">Connexion</translation> <translation id="8286963743045814739">Vous pouvez parcourir le Web en mode privé à l'aide d'une fenêtre de navigation privée</translation> <translation id="82871696630048499">La page Web a été actualisée en raison d'une mémoire insuffisante.</translation> +<translation id="8288032458496410887">Désinstaller <ph name="APP" />…</translation> <translation id="8291967909914612644">Pays du fournisseur personnel</translation> <translation id="8294431847097064396">Source</translation> <translation id="8297006494302853456">Faible</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Demander d'abord (recommandé)</translation> <translation id="8418445294933751433">Afficher dan&s un onglet</translation> <translation id="8419098111404128271">Résultats de recherche pour "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Bienvenue sur votre <ph name="DEVICE_TYPE" /> !</translation> <translation id="8420060421540670057">Afficher les fichiers Google Docs</translation> <translation id="8424039430705546751">bas</translation> <translation id="8425213833346101688">Modifier</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Configurer les connexions réseau</translation> <translation id="8624205858755890468">Active l'Assistant pour vous proposer des informations, des applications et des actions similaires.</translation> <translation id="862542460444371744">&Extensions</translation> +<translation id="8626219642120025691">Délai écoulé</translation> <translation id="8627151598708688654">Sélectionner la source</translation> <translation id="862727964348362408">Suspendu</translation> <translation id="862750493060684461">Cache CSS</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Vos modifications sont enregistrées automatiquement.<ph name="BREAKS" />Pour conserver une copie de l'image d'origine, décochez l'option "Écraser l'original".</translation> <translation id="8777628254805677039">mot de passe racine</translation> <translation id="8780443667474968681">La recherche vocale a été désactivée.</translation> +<translation id="878068003854005405">C'est parti. Posez votre doigt sur le capteur.</translation> <translation id="878069093594050299">Ce certificat a été vérifié pour les utilisations suivantes :</translation> <translation id="8781980678064919987">Éteindre quand l'écran est rabattu</translation> <translation id="8782565991310229362">Annulation du lancement de l'application kiosque.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Phrase secrète</translation> <translation id="9052208328806230490">Vous avez enregistré vos imprimantes sur <ph name="CLOUD_PRINT_NAME" /> via le compte <ph name="EMAIL" />.</translation> <translation id="9052404922357793350">Continuer de bloquer</translation> +<translation id="9053091947372579468">Une licence Chrome est bien installée sur votre appareil, mais votre nom d'utilisateur n'est associé à aucune console d'administration. Pour enregistrer votre appareil, veuillez créer un compte de console d'administration à l'adresse https://g.co/ChromeEnterpriseAccount. Remarque : si vous utilisez votre domaine pour créer le compte de console, vous devrez le valider à l'issue de cette procédure.</translation> <translation id="9053893665344928494">Mémoriser mon choix</translation> <translation id="9055636786322918818">Appliquez le chiffrement RC4. L'activation de cette option est risquée, car les algorithmes de chiffrement RC4 ne sont pas sécurisés.</translation> <translation id="9056034633062863292">Mise à jour de Chromebox en cours…</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Définir comme navigateur par défaut</translation> <translation id="9219103736887031265">Images</translation> <translation id="9220525904950070496">Supprimer le compte</translation> +<translation id="9220820413868316583">Soulevez votre doigt, puis reposez-le.</translation> <translation id="923467487918828349">Tout afficher</translation> <translation id="928985544179707652">Extensions :</translation> <translation id="930268624053534560">Horodatage détaillé</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 482ffdd..dcc7b22 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">કોઈ નેટવર્ક નથી</translation> <translation id="1056898198331236512">ચેતવણી</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">ફિંગરપ્રિન્ટ રજિસ્ટર કરવા વિશે</translation> <translation id="1061904396131502319">વિરામનો સમય થવા જ આવ્યો છે</translation> <translation id="1062407476771304334">બદલો</translation> <translation id="1067048845568873861">બનાવ્યું</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">ડાયમંડ</translation> <translation id="1114335938027186412">તમારું કમ્પ્યુટર વિશ્વસનીય પ્લેટફોર્મ મોડ્યુલ (TPM) સેવા ઉપકરણ ધરાવે છે, જેનો ઉપયોગ Chrome OS માં ઘણી મહત્વપૂર્ણ સુરક્ષા સુવિધાઓ લાગુ કરવા માટે થાય છે. વધુ જાણવા માટે Chromebook સહાય કેંદ્રની મુલાકાત લો: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">લિડ બંધ કરવામાં આવે, ત્યારે નિષ્ક્રિય કરો</translation> +<translation id="1115324527092594775">Better Together સેટઅપ કરો</translation> <translation id="1116694919640316211">વિશે</translation> <translation id="1116779635164066733">આ સેટિંગ "<ph name="NAME" />" એક્સ્ટેંશન દ્વારા લાગુ કરવામાં આવી છે.</translation> <translation id="111844081046043029">શું તમે ખરેખર આ પૃષ્ઠ છોડવા માંગો છો?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">હાલનો સમય</translation> <translation id="1157102636231978136">તમારા બ્રાઉઝિંગ ડેટા અને પ્રવૃત્તિને તમારા Google એકાઉન્ટ સાથે સિંક કરેલા છે</translation> <translation id="1161575384898972166">ક્લાયંટ પ્રમાણપત્ર નિકાસ કરવા માટે કૃપા કરીને <ph name="TOKEN_NAME" /> પર સાઇન ઇન કરો.</translation> +<translation id="1161699061380012396">Chrome OS ઇનપુટ પદ્ધતિ</translation> <translation id="1163931534039071049">ફ્રેમ સ્રોત &જુઓ</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> માટે Smart Lock બંધ કરીએ?</translation> <translation id="1164899421101904659">PIN અનલૉક કી દાખલ કરો</translation> @@ -164,6 +167,7 @@ <translation id="1225211345201532184">શેલ્ફ આઇટમ 5</translation> <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" થી કનેક્ટ કરવાનો પ્રયાસ કરતી વખતે પ્રમાણીકરણ નિષ્ફળ થયું.</translation> <translation id="1230807973377071856">સિસ્ટમનું મેનૂ</translation> +<translation id="123186018454553812">કોઈ અલગ કી અજમાવી જુઓ</translation> <translation id="1232569758102978740">શીર્ષક વિનાનું</translation> <translation id="1233721473400465416">લોકેલ</translation> <translation id="1234808891666923653">Service Workers</translation> @@ -330,6 +334,7 @@ <translation id="1485141095922496924">સંસ્કરણ <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> <translation id="1486096554574027028">પાસવર્ડ્સ શોધો</translation> <translation id="1487335504823219454">ચાલુ - કસ્ટમ સેટિંગ્સ</translation> +<translation id="1489664337021920575">બીજો વિકલ્પ પસંદ કરો</translation> <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> માટે પ્રતીક્ષારત...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> અન્ય ઉપલબ્ધ ઉપકરણો.</translation> <translation id="1497522201463361063">"<ph name="FILE_NAME" />" નું નામ બદલવામાં અક્ષમ. <ph name="ERROR_MESSAGE" /></translation> @@ -361,6 +366,7 @@ <translation id="1530838837447122178">માઉસ અને ટચપેડ ઉપકરણ સેટિંગ્સ ખોલો</translation> <translation id="1531004739673299060">ઍપ્લિકેશન વિંડો</translation> <translation id="15373452373711364">મોટું માઉસ કર્સર</translation> +<translation id="153933193410874873">અમે આ ઉપકરણ પર તમારી ઓળખની ચકાસણી કરી શક્યાં નથી</translation> <translation id="1540605929960647700">ડેમો મોડ ચાલુ કરો</translation> <translation id="1543284117603151572">Edge માંથી આયાત કરેલ</translation> <translation id="1545177026077493356">સ્વચલિત કિઓસ્ક મોડ</translation> @@ -377,6 +383,7 @@ <translation id="1564414980088536597">આ છબીનો ઉપયોગ કરી શકાતો નથી. અલગ છબી પસંદ કરો.</translation> <translation id="1566049601598938765">વેબસાઇટ</translation> <translation id="1567387640189251553">તમે છેલ્લે પાસવર્ડ દાખલ કર્યો, ત્યાર પછી એક અલગ કીબોર્ડ કનેક્ટ કરવામાં આવ્યું છે. તે તમારા કીસ્ટ્રોકની ચોરી કરવાનો પ્રયાસ કરતું હોઈ શકે છે.</translation> +<translation id="1567750922576943685">તમારી ઓળખની ચકાસણી કરવાથી તમારી વ્યક્તિગત માહિતીનું રક્ષણ કરવામાં સહાય મળી રહે છે</translation> <translation id="1567993339577891801">JavaScript કન્સોલ</translation> <translation id="1568067597247500137">સાઇટને મ્યૂટ કરો</translation> <translation id="1568323446248056064">ડિસ્પ્લે ઉપકરણ સેટિંગ્સ ખોલો</translation> @@ -991,7 +998,6 @@ <translation id="2508428939232952663">Google Play સ્ટોર એકાઉન્ટ</translation> <translation id="2509495747794740764">સ્કેલ પ્રમાણ, 10 અને 200 ની વચ્ચેની કોઈ સંખ્યા હોવી આવશ્યક છે.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">ફોર્મ સ્વતઃભરો</translation> <translation id="2513403576141822879">ગોપનીયતા, સુરક્ષા, અને ડેટા સંગ્રહથી સંબંધિત વધુ સેટિંગ માટે, <ph name="BEGIN_LINK" />સિંક અને Google સેવાઓ<ph name="END_LINK" /> જુઓ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">સ્કૅન કરો</translation> @@ -1182,6 +1188,7 @@ <translation id="2783298271312924866">ડાઉનલોડ કરેલ</translation> <translation id="2783321960289401138">શૉર્ટકટ બનાવો...</translation> <translation id="2783829359200813069">એન્ક્રિપ્શન પ્રકારો પસંદ કરો</translation> +<translation id="2783952358106015700">તમારી સુરક્ષા કીનો <ph name="APP_NAME" />ની સાથે ઉપયોગ કરો</translation> <translation id="2784407158394623927">તમારી મોબાઇલ ડેટા સેવાને સક્રિય કરી રહ્યા છીએ</translation> <translation id="2785873697295365461">ફાઇલ વર્ણનકર્તા</translation> <translation id="2787047795752739979">મૂળ પર ઓવરરાઇટ કરો</translation> @@ -1342,6 +1349,7 @@ <translation id="3020990233660977256">સીરિયલ નંબર: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">ફ્રેમ સ્રોત &જુઓ</translation> <translation id="3022978424994383087">તે મળ્યો નથી.</translation> +<translation id="3023464535986383522">સાંભળવા માટે પસંદ કરો</translation> <translation id="3024374909719388945">24-કલાકની ઘડિયાળ વાપરો</translation> <translation id="302781076327338683">બાયપાસ થતી કૅશ ફરીથી લોડ કરો</translation> <translation id="3031417829280473749">એજંટ X</translation> @@ -1495,6 +1503,7 @@ <translation id="3285322247471302225">નવું &ટૅબ</translation> <translation id="3288047731229977326">વિકાસકર્તા મોડમાં ચાલી રહેલા એક્સટેન્શન્સ તમારા કમ્પ્યુટરને નુકસાન પહોંચાડી શકે છે. જો તમે વિકાસકર્તા નથી, તો તમે સુરક્ષિત રહેવા માટે વિકાસકર્તા મોડમાં ચાલી રહેલા આ એક્સ્ટેન્શન્સને અક્ષમ કરવા જોઈએ.</translation> <translation id="3289856944988573801">અપડેટ્સ તપાસવા માટે, કૃપા કરીને ઇથરનેટ અથવા Wi-Fi નો ઉપયોગ કરો.</translation> +<translation id="3292421191230118801">તમારી Chromebook પર મોબાઇલમાંથી સાઇટ જોવાનું ફરી શરૂ કરો</translation> <translation id="32939749466444286">Linux કન્ટેનર શરૂ થયું નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="3294437725009624529">અતિથિ</translation> <translation id="329838636886466101">સુધારો</translation> @@ -1537,6 +1546,7 @@ <translation id="3348038390189153836">કાઢી નાખવા યોગ્ય ઉપકરણ મળ્યું</translation> <translation id="3348459612390503954">અભિનંદન</translation> <translation id="3349933790966648062">મેમરી ફૂટપ્રિન્ટ</translation> +<translation id="3350117557200012647">જોડાણ કરવાના મોડમાં જાઓ</translation> <translation id="3353984535370177728">અપલોડ કરવા માટે એક ફોલ્ડર પસંદ કરો</translation> <translation id="3355936511340229503">કનેક્શન ભૂલ</translation> <translation id="3356797067524893661">તમે Hangouts Meet પર ચાલુ રાખવા માટે તૈયાર છો</translation> @@ -1676,6 +1686,7 @@ <translation id="3556000484321257665">તમારું શોધ એંજિન, <ph name="URL" /> પર બદલ્યું હતું.</translation> <translation id="3563432852173030730">કિઓસ્ક ઍપ્લિકેશન ડાઉનલોડ કરી શકાઈ નથી.</translation> <translation id="3564334271939054422">તમે ઉપયોગમાં લઈ રહ્યાં છો તે Wi-Fi નેટવર્ક <ph name="NETWORK_ID" /> માટે, તમારે તેના લોગિન પૃષ્ઠની મુલાકાત લેવાની જરૂર હોઈ શકે છે.</translation> +<translation id="3564848315152754834">USB સુરક્ષા કોડ</translation> <translation id="3566721612727112615">કોઈ સાઇટ્સ ઉમેરી નથી</translation> <translation id="3569382839528428029">શું તમે ઇચ્છો છો કે <ph name="APP_NAME" /> તમારી સ્ક્રીનને શેર કરે?</translation> <translation id="3570985609317741174">વેબ કન્ટેન્ટ</translation> @@ -1726,6 +1737,7 @@ <translation id="3627588569887975815">છુ&પી વિંડોમાં લિંક ખોલો</translation> <translation id="3627671146180677314">નેટસ્કેપ પ્રમાણપત્ર નવીકરણ સમય</translation> <translation id="3627879631695760395"><ph name="APP" /> ઇન્સ્ટૉલ કરો...</translation> +<translation id="3630132874740063857">તમારો ફોન</translation> <translation id="3630995161997703415">આ સાઇટને ગમે ત્યારે ઉપયોગમાં લેવા માટે તેને તમારા શેલ્ફમાં ઉમેરો</translation> <translation id="3635030235490426869">ટૅબ 1</translation> <translation id="3636096452488277381">હેલો, <ph name="USER_GIVEN_NAME" />.</translation> @@ -1734,6 +1746,7 @@ <translation id="363903084947548957">આગલી ઇનપુટ પદ્ધતિ</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> માટે "<ph name="EXTENSION_NAME" />" ઉમેરીએ?</translation> <translation id="3644896802912593514">પહોળાઈ</translation> +<translation id="3645372836428131288">ફિંગરપ્રિન્ટનો કોઈ બીજો ભાગ કૅપ્ચર કરવા માટે તેને સહેજ ખસેડો.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> મળ્યું</translation> <translation id="3649138363871392317">ફોટો લેવામાં આવ્યો હતો</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />"ને આ ઍક્સેસ કરવાની મંજૂરી આપો:</translation> @@ -1747,6 +1760,7 @@ <translation id="3664511988987167893">એક્સ્ટેંશન આઇકન</translation> <translation id="3665589677786828986">Chrome ને જાણ થઈ છે કે તમારી કેટલીક સેટિંગ્સ બીજા પ્રોગ્રામ દ્વારા દૂષિત કરવામાં આવેલી અને તેમને તેમના મૂળ ડિફોલ્ટ્સ પર ફરીથી સેટ કરી છે.</translation> <translation id="3668570675727296296">ભાષા સેટિંગ્સ</translation> +<translation id="3668801437375206837">બ્લૂટૂથ સમસ્યાઓ અંગે વધુ સારી તપાસ કરવા માટે, Googleનાં કર્મચારીઓ તેમના પ્રતિસાદમાં વધારાના બ્લૂટૂથ લૉગનો સમાવેશ કરી શકે છે. જ્યારે આ વિકલ્પને ચેક કરેલ હોય, ત્યારે તમારા રિપોર્ટમાં તમારા વર્તમાન સત્રમાંથી btsnoop અને HCI લૉગનો સમાવેશ થશે અને તેમાંથી શક્ય હોય તેટલાં PII ને દૂર કરવામાં આવશે. આ લૉગ સુધીના ઍક્સેસને Listnrમાં Chrome OS પ્રોડક્ટ ગૃપના મેનેજરો સુધી જ નિયંત્રિત રાખવામાં આવશે. એ બધા લૉગ 90 દિવસ બાદ કાઢી નાખવામાં આવશે.</translation> <translation id="3668823961463113931">હેન્ડલર્સ</translation> <translation id="3670229581627177274">Bluetooth ચાલુ કરો</translation> <translation id="3672681487849735243">એક ફેક્ટરી ભૂલ શોધવામાં આવી છે</translation> @@ -1765,6 +1779,7 @@ <translation id="3691267899302886494"><ph name="HOST" /> તમારી સ્ક્રીન શેર કરવા માગે છે</translation> <translation id="3693415264595406141">પાસવર્ડ:</translation> <translation id="3694027410380121301">પહેલાનું ટૅબ પસંદ કરો</translation> +<translation id="369489984217678710">પાસવર્ડ અને બીજા સાઇન ઇન ડેટા</translation> <translation id="3699624789011381381">ઇમેઇલ સરનામું</translation> <translation id="3699920817649120894">સિંક અને વૈયક્તિકરણ બંધ કરીએ?</translation> <translation id="3700888195348409686">(<ph name="PAGE_ORIGIN" />) પ્રસ્તુત કરીએ છીએ</translation> @@ -1788,6 +1803,7 @@ <translation id="3727148787322499904">આ સેટિંગને બદલવું તમામ શેર કરેલ નેટવર્કને પ્રભાવિત કરશે</translation> <translation id="3727187387656390258">પૉપ અપની તપાસ કરો</translation> <translation id="3729506734996624908">મંજૂર કરેલી સાઇટની સૂચિ</translation> +<translation id="3731997362820527097">તમારો સુરક્ષા કોડ પસંદ કરો</translation> <translation id="3732078975418297900">લાઇન <ph name="ERROR_LINE" />માં ભૂલ આવી છે</translation> <translation id="3733127536501031542">સ્ટેપ-અપ સાથે SSL સર્વર </translation> <translation id="3735740477244556633">આ પ્રમાણે સૉર્ટ કરો</translation> @@ -1887,6 +1903,7 @@ <translation id="3860104611854310167"><ph name="PROFILE_NAME" />: સિંક થોભાવ્યું</translation> <translation id="3860381078714302691">Hangouts Meet પર સ્વાગત છે</translation> <translation id="3862134173397075045">Chrome માં કાસ્ટ અનુભવ પર સ્વાગત છે!</translation> +<translation id="3862693525629180217">બિલ્ટ-ઇન સેન્સર મારફતે ચકાસો</translation> <translation id="3862788408946266506">'Kiosk_only' મેનિફેસ્ટ વિશેષતાવાળી ઍપ Chrome OS કિઓસ્ક મોડમાં ઇન્સ્ટૉલ કરેલી હોવી આવશ્યક છે</translation> <translation id="3865414814144988605">રિઝોલ્યુશન</translation> <translation id="386548886866354912"><ph name="EXTENSION_NAME" /> સાથે પૅક કરો</translation> @@ -1924,7 +1941,6 @@ <translation id="3920504717067627103">પ્રમાણપત્ર નીતિઓ</translation> <translation id="392089482157167418">ChromeVox સક્ષમ કરો (બોલાયેલ પ્રતિસાદ)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">તમારી પાસે તાજેતરમાં કોઇ કેપ્ચર કરેલ WebRTC લૉગ્સ નથી.</translation> <translation id="3925573269917483990">કૅમેરા:</translation> <translation id="3925842537050977900">શેલ્ફમાંથી અનપિન કરો</translation> <translation id="3926002189479431949">Smart Lock ફોન બદલાવ્યો</translation> @@ -2012,6 +2028,7 @@ <translation id="4055023634561256217">તમારું ઉપકરણ Powerwash સાથે ફરીથી સેટ થઈ શકે તે પહેલા એક પુનર્પ્રારંભ આવશ્યક છે.</translation> <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation> <translation id="4057896668975954729">દુકાનમાં જુઓ</translation> +<translation id="4058647953897694817">બ્લૂટૂથ મારફતે ચકાસો</translation> <translation id="4058720513957747556">AppSocket (TCP/IP)</translation> <translation id="4058793769387728514">હવે દસ્તાવેજ તપાસો</translation> <translation id="406070391919917862">પૃષ્ઠભૂમિ ઍપ્લિકેશનો</translation> @@ -2025,6 +2042,7 @@ <translation id="407520071244661467">સ્કેલ</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" />ને કાસ્ટ કરવામાં અસમર્થ.</translation> <translation id="4077917118009885966">આ સાઇટ પર જાહેરાતો અવરોધિત કરી</translation> +<translation id="4079799245038595838">તમારા ફોન પર એક નોટિફિકેશન મોકલવામાં આવેલ. તે તમે જ છો તે કન્ફર્મ કરવા માટે સંકેતોને અનુસરો.</translation> <translation id="4081242589061676262">ફાઇલ કાસ્ટ કરવામાં અસમર્થ.</translation> <translation id="4084682180776658562">બુકમાર્ક</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> બંધ કરો</translation> @@ -2124,6 +2142,7 @@ <translation id="4250229828105606438">સ્ક્રીનશૉટ</translation> <translation id="4250680216510889253">નહીં</translation> <translation id="4252852543720145436">સંરક્ષિત કન્ટેન્ટ ઓળખકર્તા</translation> +<translation id="4252899949534773101">બ્લૂટૂથ બંધ છે</translation> <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - ટૅબની સામગ્રી શેર કરી</translation> <translation id="4254813446494774748">અનુવાદ ભાષા:</translation> <translation id="425573743389990240">બેટરી ડિસ્ચાર્જ દર વોટ્સમાં (ઋણ મૂલ્યનો અર્થ છે બેટરી ચાર્જ થઈ રહી છે)</translation> @@ -2197,6 +2216,7 @@ <translation id="438503109373656455">સારાતોગા</translation> <translation id="4387004326333427325">પ્રમાણીકરણ પ્રમાણપત્ર રિમોટલી નકારવામાં આવ્યું છે</translation> <translation id="4389091756366370506">વપરાશકર્તા <ph name="VALUE" /></translation> +<translation id="439266289085815679">નેટવર્ક ગોઠવણી, <ph name="USER_EMAIL" /> દ્વારા નિયંત્રિત છે.</translation> <translation id="4394049700291259645">અક્ષમ કરો</translation> <translation id="4400367121200150367">ક્યારેય પાસવર્ડ ન સાચવતી સાઇટ અહીં દેખાશે</translation> <translation id="4400632832271803360">ટોચની-પંક્તિ કીની વર્તણૂંક સ્વિચ કરવા માટે લૉન્ચર કીને દબાવી રાખો</translation> @@ -2248,6 +2268,7 @@ <translation id="4481530544597605423">જોડીથી અલગ કરેલા ઉપકરણો</translation> <translation id="4482194545587547824">Google, શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરી શકે છે</translation> <translation id="4495419450179050807">આ પૃષ્ઠ પર બતાવશો નહીં</translation> +<translation id="449938344715680828">બહાર નીકળવા માટે |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| અને પછી |<ph name="ACCELERATOR3" />| દબાવો</translation> <translation id="4499718683476608392">એક જ ક્લિકમાં ફૉર્મ ભરાય તે માટે ક્રેડિટ કાર્ડનું ઑટોફિલ ચાલુ કરો</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ક્રૅશ થયું છે</translation> <translation id="450099669180426158">ઉદ્ગાર ચિહ્નનું આયકન</translation> @@ -2268,6 +2289,7 @@ <translation id="4522600456902129422">આ સાઇટને ક્લિપબોર્ડ જોવાની મંજૂરી આપવાનું ચાલુ રાખો</translation> <translation id="4530494379350999373">મૂળ</translation> <translation id="4533985347672295764">CPU સમય</translation> +<translation id="4534661889221639075">ફરી પ્રયાસ કરો.</translation> <translation id="4535127706710932914">ડિફૉલ્ટ પ્રોફાઇલ</translation> <translation id="4538417792467843292">શબ્દ કાઢી નાખો</translation> <translation id="4538684596480161368"><ph name="HOST" /> પર અનસેન્ડબૉક્સ્ડ પ્લગિન્સને હંમેશાં અવરોધિત કરો</translation> @@ -2323,6 +2345,7 @@ <translation id="4611114513649582138">ડેટા કનેક્શન ઉપલબ્ધ</translation> <translation id="4613271546271159013">જ્યારે તમે કોઈ નવું ટેબ ખોલો છો ત્યારે જે પૃષ્ઠ બતાવવામાં આવે છે તેને એક્સ્ટેન્શને બદલ્યું છે.</translation> <translation id="4615586811063744755">કોઈ કુકી પસંદ કરી નથી</translation> +<translation id="4615618657481886098">તમે પહેલેથી જ આ કી રજિસ્ટર કરેલી છે. તમારે ફરીથી રજિસ્ટર કરવાની જરૂર નથી.</translation> <translation id="4617270414136722281">એક્સ્ટેન્શન વિકલ્પો</translation> <translation id="4619615317237390068">અન્ય ઉપકરણોમાંથી ટૅબ્સ</translation> <translation id="4620809267248568679">આ સેટિંગ એક એક્સ્ટેંશન દ્વારા લાગુ કરાઈ છે.</translation> @@ -2432,6 +2455,7 @@ <translation id="4790972063719531840">Google ને આપમેળે નિદાન અને વપરાશ ડેટા મોકલો</translation> <translation id="4792711294155034829">&સમસ્યાની જાણ કરો...</translation> <translation id="479536056609751218">વેબપૃષ્ઠ, ફક્ત HTML</translation> +<translation id="4798236378408895261">જોડો <ph name="BEGIN_LINK" />બ્લૂટૂથ લૉગ<ph name="END_LINK" /> (Google આંતરિક)</translation> <translation id="479989351350248267">search</translation> <translation id="4801448226354548035">એકાઉન્ટ્સ છુપાવો</translation> <translation id="4801512016965057443">મોબાઇલ ડેટા રોમિંગને મંજૂરી આપો</translation> @@ -2493,9 +2517,11 @@ <translation id="4880520557730313061">સ્વતઃ-સુધારો</translation> <translation id="4880827082731008257">ઇતિહાસ શોધ</translation> <translation id="4881695831933465202">ખોલો</translation> +<translation id="4882312758060467256">આ સાઇટનો ઍક્સેસ ધરાવે છે</translation> <translation id="4882473678324857464">બુકમાર્ક્સ પર ફોકસ કરો</translation> <translation id="4882831918239250449">તમારા બ્રાઉઝિંગ ઇતિહાસને શોધ, જાહેરાતો અને વધુ સુવિધાને વ્યક્તિગત કરવા માટે કેવી રીતે ઉપયોગમાં લેવાય તેને નિયંત્રિત કરો</translation> <translation id="4883178195103750615">બુકમાર્ક્સને HTML ફાઇલ પર નિકાસ કરો...</translation> +<translation id="4883274597792587930">તમારી કીની પાછળની બાજુ પર પ્રિન્ટ કરેલ નામ શોધો</translation> <translation id="4883436287898674711">તમામ <ph name="WEBSITE_1" /> સાઇટ્સ</translation> <translation id="48838266408104654">&કાર્ય વ્યવસ્થાપક</translation> <translation id="4883898390143004266">ઍપને સ્થાન શોધવામાં સહાય કરો. ઍપ માટે સ્થાનની શોધ બહેતર બનાવવા માટે Googleની સ્થાન સેવાઓનો ઉપયોગ કરો. સ્થાનની સચોટતા તથા સ્થાન-આધારિત સેવાઓને બહેતર બનાવવા માટે, Google સમયાંતરે સ્થાન ડેટા એકત્ર કરી શકે છે અને અનામી રીતે તેનો ઉપયોગ કરી શકે છે. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation> @@ -2557,6 +2583,7 @@ <translation id="4969785127455456148">આલ્બમ</translation> <translation id="4971412780836297815">પૂર્ણ થાય ત્યારે ખોલો</translation> <translation id="4972129977812092092">પ્રિન્ટર સંપાદિત કરો</translation> +<translation id="4972164225939028131">ખોટો પાસવર્ડ</translation> <translation id="497287958838527945">Google Pay નો ઉપયોગ કરતા ક્રેડિટ કાર્ડ અને સરનામાં.</translation> <translation id="4973307593867026061">પ્રિંટર્સ ઉમેરો</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> કે તેથી ઓછા અક્ષરોનું હોય તેવા નામનો ઉપયોગ કરો</translation> @@ -2966,6 +2993,7 @@ <translation id="55601339223879446">પ્રદર્શન અંતર્ગત તમારા ડેસ્કટૉપની મર્યાદાઓને સમાયોજિત કરો</translation> <translation id="5562781907504170924">આ ટૅબ Bluetooth ઉપકરણ સાથે કનેક્ટ થયેલ છે.</translation> <translation id="5563234215388768762">Google પર શોધો અથવા URL લખો</translation> +<translation id="5567950944308676169">તમારો સુરક્ષા કોડ પ્લગ ઇન કરો અને તેને સક્રિય કરો</translation> <translation id="5567989639534621706">ઍપ્લિકેશન કૅશેસ</translation> <translation id="5568069709869097550">સાઇન ઇન કરી શકાતું નથી</translation> <translation id="5568144734023334204">Android સ્ટોરેજ</translation> @@ -2983,6 +3011,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ઍપ્લિકેશનો લોડ કરી રહ્યું છે...</translation> <translation id="5592595402373377407">હજુ સુધી પર્યાપ્ત ડેટા ઉપલબ્ધ નથી.</translation> +<translation id="5593357315997824387">મારી ફાઇલો સિંક કરો</translation> <translation id="5595152862129936745">ખૂબ દૂર</translation> <translation id="5595485650161345191">સરનામું સંપાદિત કરો</translation> <translation id="5596627076506792578">વધુ વિકલ્પો</translation> @@ -3212,6 +3241,7 @@ <translation id="5931146425219109062">તમે મુલાકાત લો છો તે વેબસાઇટ્સ પરના તમારા ડેટાને વાંચો અને બદલો</translation> <translation id="5932881020239635062">શ્રૃંખલા</translation> <translation id="5933376509899483611">સમયઝોન</translation> +<translation id="5938002010494270685">સુરક્ષા અપગ્રેડ ઉપલબ્ધ</translation> <translation id="5939518447894949180">રીસેટ કરો</translation> <translation id="5939847200023027600">PDF કંપોઝિટર સેવા</translation> <translation id="5941153596444580863">વ્યક્તિ ઉમેરો...</translation> @@ -3248,6 +3278,7 @@ <translation id="6006484371116297560">ક્લાસિક</translation> <translation id="6007237601604674381">ખસેડવું નિષ્ફળ થયું. <ph name="ERROR_MESSAGE" /></translation> <translation id="6007240208646052708">વૉઇસ શોધ સેવા તમારી ભાષામાં ઉપલબ્ધ નથી.</translation> +<translation id="6009781704028455063">બિલ્ટ-ઇન સેન્સર</translation> <translation id="6010869025736512584">વિડિઓ ઇનપુટને ઍક્સેસ કરી રહ્યું છે</translation> <translation id="6011193465932186973">ફિંગરપ્રિન્ટ</translation> <translation id="6011449291337289699">સાઇટનો ડેટા સાફ કરો</translation> @@ -3258,6 +3289,7 @@ <translation id="6020431688553761150">સર્વરે આ સાધનને ઍક્સેસ કરવા માટે તમને અધિકૃત કર્યા નથી.</translation> <translation id="602251597322198729">આ સાઇટ બહુવિધ ફાઇલો ડાઉનલોડ કરવાનો પ્રયાસ કરી રહી છે. તમે આને પરવાનગી આપવા માંગો છો?</translation> <translation id="6022526133015258832">પૂર્ણ સ્ક્રીન ખોલો</translation> +<translation id="6022705094403139349">તમારા સુરક્ષા કોડનું જોડાણ બનાવવા માટે તૈયાર છો?</translation> <translation id="6023643151125006053">આ ઉપકરણ (SN: <ph name="SERIAL_NUMBER" />)ને <ph name="SAML_DOMAIN" /> વ્યવસ્થાપક દ્વારા લૉક કરવામાં આવ્યું હતું.</translation> <translation id="6025215716629925253">સ્ટેક ટ્રેસ</translation> <translation id="6026047032548434446">ઍપ ઇન્સ્ટૉલ કરીએ?</translation> @@ -3321,6 +3353,7 @@ <translation id="6105877918873366097">છેલ્લે ઍક્સેસ કર્યાની તારીખ</translation> <translation id="6107012941649240045">આને રજૂ કરેલું</translation> <translation id="6112294629795967147">કદ બદલવા માટે સ્પર્શ કરો</translation> +<translation id="6112931163620622315">તમારો ફોન તપાસો</translation> <translation id="6112952769866305444">વ્યક્તિ, <ph name="PROFILE_NAME" />, <ph name="USERNAME" /> ને સંપાદિત કરો</translation> <translation id="6116338172782435947">ક્લિપબોર્ડ પર કૉપિ કરેલ ટેક્સ્ટ અને છબીઓને જુઓ</translation> <translation id="6116921718742659598">ભાષા અને ઇનપુટ સેટિંગ્સ બદલો</translation> @@ -3366,6 +3399,7 @@ <translation id="6169666352732958425">ડેસ્કટૉપને કાસ્ટ કરવામાં અસમર્થ.</translation> <translation id="6171948306033499786">છાપવાનું થોભાવો</translation> <translation id="6175314957787328458">Microsoft ડોમેન GUID</translation> +<translation id="6176043333338857209">તમારા સુરક્ષા કોડ સાથે સંચાર કરવા માટે બ્લૂટૂથને હંગામી ધોરણે ચાલુ કરવામાં આવશે</translation> <translation id="6178664161104547336">એક પ્રમાણપત્ર પસંદ કરો</translation> <translation id="6181431612547969857">ડાઉનલોડ અવરોધિત કર્યું</translation> <translation id="6185132558746749656">ઉપકરણનું સ્થાન</translation> @@ -3453,6 +3487,7 @@ <translation id="6311220991371174222">તમારી પ્રોફાઇલ ખોલતી વખતે કોઈ ભૂલ આવાને કારણે Chrome પ્રારંભ કરી શકતાં નથી. Chrome પુનઃપ્રારંભ કરવાનો પ્રયાસ કરો.</translation> <translation id="6312400084708441752">નુકસાનકારક સૉફ્ટવેર, સિસ્ટમ સેટિંગ અને તમારા કમ્પ્યુટર પરની પ્રક્રિયાઓ વિશેની માહિતી શામેલ છે</translation> <translation id="6312403991423642364">અજ્ઞાત નેટવર્ક ભૂલ</translation> +<translation id="6313320178014547270">તમે આ વેબસાઇટમાં રજિસ્ટર ન થયેલી કીનો ઉપયોગ કરી રહ્યા છો</translation> <translation id="6313641880021325787">VRથી બહાર નીકળો</translation> <translation id="6314819609899340042">આ <ph name="IDS_SHORT_PRODUCT_NAME" /> ઉપકરણ પર તમે સફળતાપૂર્વક ડિબગિંગ સુવિધાઓ સક્ષમ કરેલી છે.</translation> <translation id="6315493146179903667">બધાને આગળ લાવો</translation> @@ -3507,6 +3542,7 @@ <translation id="6399774419735315745">જાસૂસ</translation> <translation id="6401445054534215853">શેલ્ફ આઇટમ 1</translation> <translation id="6404511346730675251">બુકમાર્ક સંપાદિત કરો</translation> +<translation id="6405510437656969977">જ્યારે તમે પિન દાખલ કરવા માટે તૈયાર હો, ત્યારે ચાલુ કરો</translation> <translation id="6406303162637086258">બ્રાઉઝર પુનઃપ્રારંભનું અનુકરણ કરો</translation> <translation id="6406506848690869874">સમન્વયન</translation> <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> પર તમારો ડેટા વાંચો અને બદલો</translation> @@ -3625,6 +3661,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ડેસ્કટૉપ કન્ટેન્ટ શેર કર્યું</translation> <translation id="6580151766480067746">ARC સંસ્કરણ</translation> <translation id="6581162200855843583">Google ડ્રાઇવ લિંક</translation> +<translation id="6582080224869403177">તમારી સુરક્ષા અપગ્રેડ કરવા માટે <ph name="DEVICE_TYPE" />ને રીસેટ કરો.</translation> <translation id="6582421931165117398">તમારી વ્યક્તિગત માહિતીને સુરક્ષિત રાખવા માટે, હમણાં જ તમારો પાસવર્ડ બદલો. તમે તમારો પાસવર્ડ બદલો તે પહેલાં, તમને સાઇન ઇન કરવાનું કહેવામાં આવશે.</translation> <translation id="6583851739559471707">ખલેલ પાડતી જાહેરાતો બતાવવાનું વલણ ધરાવતી સાઇટ પર અવરોધિત કરેલ (ભલામણ કરેલ)</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> @@ -3673,6 +3710,7 @@ <translation id="6644846457769259194">તમારું ઉપકરણ અપડેટ થઈ રહ્યું છે (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6647228709620733774">નેટસ્કેપ પ્રમાણન અધિકારી રિવોકેશન URL</translation> <translation id="6647838571840953560">હાલમાં <ph name="CHANNEL_NAME" /> પર છે</translation> +<translation id="6648051959475508072">સુરક્ષા કોડ સક્રિય કર્યો...</translation> <translation id="6648911618876616409">મહત્ત્વપૂર્ણ અપડેટ ઇન્સ્ટૉલ થવા માટે તૈયાર છે. શરૂ કરવા માટે, સાઇન ઇન કરો.</translation> <translation id="6649018507441623493">માત્ર એક જ સેકંડ…</translation> <translation id="6649563841575838401">આ આર્કાઇવ ફૉર્મેટ સમર્થિત નથી અથવા ફાઇલ ખામીયુક્ત છે.</translation> @@ -3688,6 +3726,7 @@ <translation id="6664237456442406323">દુર્ભાગ્યપણે, તમારું કમ્પ્યુટર દૂષિત હાર્ડવેર ID સાથે ગોઠવવમાં આવેલું છે. આ Chrome OS ને નવીનતમ સુરક્ષા સુધારાથી અપડેટ થવાથી અટકાવે છે અને તમારું કમ્પ્યુટર <ph name="BEGIN_BOLD" />દુર્ભાવનાપૂર્ણ હુમલાઓ માટે ભેદ્ય<ph name="END_BOLD" /> હોઈ શકે છે.</translation> <translation id="6664774537677393800">તમારી પ્રોફાઇલ ખોલતી વખતે કંઈક ખોટું થયું. કૃપા કરીને સાઇન આઉટ કરો પછી ફરીથી સાઇન ઇન કરો.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">ટાઇમર રોકો</translation> <translation id="667517062706956822">શું તમે ઇચ્છો છો કે Google, <ph name="SOURCE_LANGUAGE" /> થી <ph name="TARGET_LANGUAGE" /> માં આ પૃષ્ઠનો અનુવાદ કરે?</translation> <translation id="6675665718701918026">પોઇંટિંગ ઉપકરણ કનેક્ટ કર્યું</translation> <translation id="6678717876183468697">ક્વેરી URL</translation> @@ -3748,6 +3787,7 @@ <translation id="6759193508432371551">ફેક્ટરી ફરીથી સેટ કરો</translation> <translation id="6767639283522617719">ડોમેન જોડી શકાતું નથી. સંસ્થાકીય એકમ માટે સેટિંગ યોગ્ય છે તેની ખાતરી કરો.</translation> <translation id="6769712124046837540">પ્રિન્ટર ઉમેરી રહ્યું છે...</translation> +<translation id="6770664076092644100">NFC મારફતે ચકાસો</translation> <translation id="6771503742377376720">એ એક પ્રમાણન અધિકારી છે</translation> <translation id="6777817260680419853">રીડાયરેક્ટ કરવાનું બ્લૉક કર્યું</translation> <translation id="6778959797435875428">સાઇટને અનમ્યૂટ કરો</translation> @@ -3783,6 +3823,7 @@ <translation id="6823506025919456619">તમારા ઉપકરણોને જોવા માટે તમારે Chrome માં સાઇન ઇન કરવાની જરૂર છે</translation> <translation id="6824564591481349393">&ઇમેઇલ સરનામું કૉપિ કરો</translation> <translation id="6825184156888454064">નામ અનુસાર સૉર્ટ કરો</translation> +<translation id="6826872289184051766">USB મારફતે ચકાસો</translation> <translation id="6827236167376090743">આ વિડિઓ સમીસાંજ સુધી ચાલુ રહેશે.</translation> <translation id="6828153365543658583">નીચેના વપરાશકર્તાઓ માટે સાઇન-ઇન નિયંત્રિત કરો:</translation> <translation id="6828860976882136098">તમામ વપરાશકર્તાઓ માટે સ્વચલિત અપડેટ્સને સેટ કરવામાં નિષ્ફળ થયાં (પ્રીફ્લાઇટ અમલીકરણની ભૂલ: <ph name="ERROR_NUMBER" />)</translation> @@ -3816,6 +3857,7 @@ <translation id="6880587130513028875">આ પૃષ્ઠ પર છબીઓ અવરોધિત હતી.</translation> <translation id="6883319974225028188">અરેરે! ડિવાઇસ ગોઠવણી સાચવવામાં સિસ્ટમ નિષ્ફળ ગઈ.</translation> <translation id="6885771755599377173">સિસ્ટમ માહિતી પૂર્વાવલોકન</translation> +<translation id="6886476658664859389">NFC સુરક્ષા કોડ</translation> <translation id="6886871292305414135">લિંક નવા &ટૅબમાં ખોલો</translation> <translation id="6892812721183419409"><ph name="USER" /> તરીકે લિંક ખોલો</translation> <translation id="6896758677409633944">કૉપિ કરો</translation> @@ -3977,6 +4019,7 @@ <translation id="713122686776214250">પૃ&ષ્ઠ ઉમેરો...</translation> <translation id="7133578150266914903">તમારા વ્યવસ્થાપક આ ઉપકરણને રોલ બૅક કરી રહ્યા છે (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="7134098520442464001">ટેક્સ્ટને વધુ નાનો બનાવો</translation> +<translation id="7135729336746831607">બ્લૂટૂથ ચાલુ કરીએ?</translation> <translation id="7136694880210472378">ડિફૉલ્ટ બનાવો</translation> <translation id="7136984461011502314"><ph name="PRODUCT_NAME" /> માં આપનું સ્વાગત છે</translation> <translation id="7136993520339022828">તેમાં એક ભૂલ છે. કૃપા કરીને અન્ય છબી પસંદ કરીને ફરી પ્રયત્ન કરો.</translation> @@ -4008,6 +4051,7 @@ <translation id="7186088072322679094">ટુલબારમાં રાખો</translation> <translation id="7187428571767585875">કાઢી નાખવા અથવા બદલવા માટેની રજિસ્ટ્રી એન્ટ્રી:</translation> <translation id="7189234443051076392">ખાતરી કરો કે તમારા ઉપકરણ પર પૂરતી સ્પેસ છે</translation> +<translation id="7189965711416741966">ફિંગરપ્રિન્ટ ઉમેરી.</translation> <translation id="7191159667348037">અજાણ્યું પ્રિન્ટર (USB)</translation> <translation id="7191454237977785534">ફાઇલના રૂપમાં સાચવો</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> માટે કોઈ પાસવર્ડ સાચવેલા નથી</translation> @@ -4021,6 +4065,7 @@ <translation id="7201118060536064622">'<ph name="DELETED_ITEM_NAME" />' ડિલીટ કર્યું</translation> <translation id="7206693748120342859"><ph name="PLUGIN_NAME" /> ડાઉનલોડ કરી રહ્યું છે...</translation> <translation id="720715819012336933">{NUM_PAGES,plural, =1{પેજમાંથી બહાર નીકળો}one{પેજમાંથી બહાર નીકળો}other{પેજમાંથી બહાર નીકળો}}</translation> +<translation id="721467499098558573">તમારા સુરક્ષા કોડ પરનું બટન ઓછામાં ઓછી 5 સેકન્ડ સુધી દબાવી રાખો</translation> <translation id="7216409898977639127">સેલ્યુલર પ્રદાતા</translation> <translation id="7216595297012131718">તમારી પસંદગીના આધારે ભાષાઓને ક્રમમાં ગોઠવો</translation> <translation id="7220019174139618249">પાસવર્ડને "<ph name="FOLDER" />"માં મોકલી શકાતો નથી</translation> @@ -4056,6 +4101,7 @@ <translation id="7256710573727326513">એક ટેબમાં ખોલો</translation> <translation id="725758059478686223">પ્રિન્ટિંગ સેવા</translation> <translation id="7257666756905341374">તમે કૉપિ અને પેસ્ટ કરો એ ડેટાને વાંચો</translation> +<translation id="7260764918845374269">તમારો સુરક્ષા કોડ જોવા માટે, તે જોડાણ કરવાના મોડમાં હોવો જરૂરી છે. તમારી કી પરનું એ બટન ઓછામાં ઓછી 5 સેકન્ડ સુધી દબાવી રાખો.</translation> <translation id="7262004276116528033">આ સાઇન-ઇન સેવા <ph name="SAML_DOMAIN" /> દ્વારા હોસ્ટ થયેલી છે.</translation> <translation id="7268365133021434339">ટૅબ્સ બંધ કરો</translation> <translation id="7268659760406822741">ઉપલબ્ધ સેવાઓ</translation> @@ -4105,6 +4151,7 @@ <translation id="7339898014177206373">નવી વિંડો</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> હવે પૂર્ણ સ્ક્રીન છે.</translation> <translation id="7340650977506865820">સાઇટ તમારી સ્ક્રીન શેર કરી રહી છે</translation> +<translation id="7341834142292923918">આ સાઇટને ઍક્સેસ કરવા માગે છે</translation> <translation id="7345706641791090287">તમારા પાસવર્ડની પુષ્ટિ કરો</translation> <translation id="7346909386216857016">બરાબર, સમજાઇ ગયું</translation> <translation id="7347751611463936647">આ એક્સ્ટેંશનનો ઉપયોગ કરવા, "<ph name="EXTENSION_KEYWORD" />" ટાઇપ કરો, તે પછી TAB, તે પછી તમારો આદેશ અથવા શોધ.</translation> @@ -4173,6 +4220,7 @@ <translation id="7464490149090366184">ઝિપ કરવાનું નિષ્ફળ, આઇટમ અસ્તિત્વમાં છે: "$1"</translation> <translation id="7465778193084373987">નેટસ્કેપ પ્રમાણપત્ર રિવોકેશન URL</translation> <translation id="7469406957790636836">આ ચાલુ કરવા માટે, પહેલા <ph name="BEGIN_LINK" />ભાષાઓ અને ઇનપુટ<ph name="END_LINK" />માં જોડણીની તપાસ કાર્ય ચાલુ કરો</translation> +<translation id="7469518857922439236">તમને નોટિફિકેશન મોકલે અને Messages માટે ડિફૉલ્ટ રૂપે આ કમ્પ્યુટરને યાદ રાખે</translation> <translation id="7469894403370665791">આ નેટવર્કથી આપમેળે કનેક્ટ થાઓ</translation> <translation id="747114903913869239">ભૂલ: એક્સટેન્શનને ડિકોડ કરવામાં અક્ષમ</translation> <translation id="7473891865547856676">નહીં આભાર</translation> @@ -4213,7 +4261,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googleની સ્થાન સેવા તમારા ઉપકરણના સ્થાનનો અંદાજ મેળવવા માટે વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સર જેવા સ્રોતોનો ઉપયોગ કરે છે. જ્યારે તમારા ઉપકરણની સ્થાન સેટિંગ ચાલુ હોય, ત્યારે આ સેવા સક્રિય હોય છે.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />તમે તમારા ઉપકરણમાં મુખ્ય સ્થાન સેટિંગ બંધ કરીને સ્થાન બંધ કરી શકો છો. તમે સ્થાન સેટિંગમાં સ્થાન માટે વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સરનો ઉપયોગ પણ બંધ કરી શકો છો.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">એક પાસવર્ડ બનાવો -</translation> -<translation id="7518150891539970662">WebRTC લૉગ્સ (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">બનાવો</translation> <translation id="7529411698175791732">તમારું ઇન્ટરનેટ કનેક્શન તપાસો. જો સમસ્યા ચાલુ રહે, તો સાઇન આઉટ કરો અને ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation> @@ -4221,6 +4268,7 @@ <translation id="7531779363494549572">સેટિંગ > ઍપ અને નોટિફિકેશન > નોટિફિકેશન પર જાઓ.</translation> <translation id="7536709149194614609">કૃપા કરીને ઉપકરણને પુનઃપ્રારંભ કરો અને પછીથી ફરી પ્રયાસ કરો.</translation> <translation id="7537601449003285327">ટાસ્કબારમાં પિન કરો</translation> +<translation id="7539856059004947393">બ્લૂટૂથ સુરક્ષા કોડ</translation> <translation id="7540972813190816353">અપડેટ્સ માટે તપાસ કરતી વખતે એક ભૂલ આવી: <ph name="ERROR" /></translation> <translation id="7543104066686362383">આ <ph name="IDS_SHORT_PRODUCT_NAME" /> ઉપકરણ પર ડીબગિંગ સુવિધાઓ સક્ષમ કરો</translation> <translation id="7544853251252956727">શફલ કરો</translation> @@ -4323,6 +4371,7 @@ <translation id="7709152031285164251">નિષ્ફળ થયું - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&કાસ્ટ કરો...</translation> <translation id="7711920809702896782">છબીની માહિતી</translation> +<translation id="7712740978240882272">તમારી Chromebookને તમારા ફોન વડે અનલૉક કરો. <ph name="LINK_BEGIN" />વધુ જાણો.<ph name="LINK_END" /></translation> <translation id="7712836429117959503"><ph name="EXTENSION_ID" /> ID ધરાવતું અજાણ્યું એક્સ્ટેંશન</translation> <translation id="7714307061282548371"><ph name="DOMAIN" /> તરફથી કુકીને મંજૂરી છે</translation> <translation id="7714464543167945231">પ્રમાણપત્ર</translation> @@ -4535,6 +4584,7 @@ <translation id="7984068253310542383">મિરર <ph name="DISPLAY_NAME" /></translation> <translation id="7986295104073916105">સાચવેલ પાસવર્ડ સેટિંગ્સ વાંચો અને બદલો</translation> <translation id="7987764905897278458">વધુ Google સ્માર્ટ મેળવો</translation> +<translation id="798835209536175951">તમારી Chromebookમાંથી ટેક્સ્ટ સંદેશા મોકલો અને મેળવો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="7988355189918024273">ઍક્સેસિબિલિટી સુવિધાઓ સક્ષમ કરો </translation> <translation id="7994702968232966508">EAP પદ્ધતિ</translation> <translation id="799547531016638432">શૉર્ટકટ દૂર કરો</translation> @@ -4662,6 +4712,7 @@ <translation id="8185331656081929126">નેટવર્ક પર નવા પ્રિન્ટર્સ શોધવામાં આવે ત્યારે સૂચનાઓ બતાવો</translation> <translation id="8186609076106987817">સર્વર ફાઇલને શોધી શક્યું નથી.</translation> <translation id="8188120771410500975">&ટેક્સ્ટ ફીલ્ડ્સની જોડણી તપાસો</translation> +<translation id="8188389033983459049">તમારા ઉપકરણની સેટિંગ તપાસો અને ચાલુ રાખવા માટે તેને ચાલુ કરો</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> થી કનેક્ટ કરે છે</translation> <translation id="8191230140820435481">તમારી ઍપ્લિકેશનો, એક્સ્ટેન્શન અને થીમ્સ મેનેજ કરો</translation> <translation id="8191453843330043793">V8 પ્રોક્સી રિઝોલ્વર</translation> @@ -4680,6 +4731,7 @@ <translation id="8214962590150211830">આ વ્યક્તિને દૂર કરો</translation> <translation id="8217399928341212914">બહુવિધ ફાઇલો આપમેળે ડાઉનલોડ કરવું અવરોધિત કરવાનું ચાલુ રાખો</translation> <translation id="8223479393428528563">ઑફલાઇન વપરાશ માટે આ ફાઇલ સાચવવા, પાછા ઓનલાઇન થાઓ, ફાઇલ પર જમણી ક્લિક કરો અને <ph name="OFFLINE_CHECKBOX_NAME" /> વિકલ્પ પસંદ કરો.</translation> +<translation id="8225753906568652947">તમારી ઑફરો રિડિમ કરો</translation> <translation id="8226222018808695353">પ્રતિબંધિત</translation> <translation id="8226619461731305576">કતારમાં</translation> <translation id="8226742006292257240">નીચે રેંડમલી બનાવેલો TPM પાસવર્ડ છે જે તમારા કમ્પ્યુટરને અસાઇન કરવામાં આવ્યો છે:</translation> @@ -4726,6 +4778,7 @@ <translation id="8286036467436129157">સાઇન ઇન કરો</translation> <translation id="8286963743045814739">તમે છુપી વિંડોનો ઉપયોગ કરીને ખાનગી રૂપે બ્રાઉઝ કરી શકો છો</translation> <translation id="82871696630048499">મેમરી સમાપ્ત થવાને કારણે વેબ પેજ ફરી લોડ થયું હતું.</translation> +<translation id="8288032458496410887"><ph name="APP" />ને અનઇન્સ્ટૉલ કરો...</translation> <translation id="8291967909914612644">હોમ પ્રદાતાનો દેશ</translation> <translation id="8294431847097064396">સ્રોત</translation> <translation id="8297006494302853456">નબળું</translation> @@ -4755,6 +4808,7 @@ <translation id="8353683614194668312">તે આ કરી શકે છે:</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> <translation id="8358685469073206162">પૃષ્ઠોને પુનર્સ્થાપિત કરીએ?</translation> +<translation id="8362993567435070757">તમારી કીની પાછળની બાજુએ 6-અંકનો પિન મેળવો</translation> <translation id="8363095875018065315">સ્થિર</translation> <translation id="8363142353806532503">માઇક્રોફોન અવરોધિત</translation> <translation id="8366396658833131068">તમારી નેટવર્ક કનેક્ટિવિટી પુનઃસ્થાપિત થઈ છે. કૃપા કરીને બીજું નેટવર્ક પસંદ કરો અથવા તમારી કિઓસ્ક એપ્લિકેશનને લોંચ કરવા માટે નીચે 'ચાલુ રાખો' બટનને દબાવો.</translation> @@ -4763,6 +4817,7 @@ <translation id="8371695176452482769">હવે બોલો</translation> <translation id="8372369524088641025">ખરાબ WEP કી</translation> <translation id="8373553483208508744">ટૅબ્સને મ્યૂટ કરો</translation> +<translation id="8379878387931047019">આ ઉપકરણ આ વેબસાઇટ દ્વારા વિનંતી કરાયેલ સુરક્ષા કોડના પ્રકારનું સમર્થન કરતું નથી</translation> <translation id="8382913212082956454">&ઇમેઇલ સરનામું કૉપિ કરો</translation> <translation id="8386903983509584791">સ્કૅન પૂર્ણ થયું</translation> <translation id="8389492867173948260">આ એક્સટેંશનને તમે મુલાકાત લો તે વેબસાઇટ પરનો તમારો બધો ડેટા વાંચવાની અને બદલવાની મંજૂરી આપો:</translation> @@ -4784,6 +4839,7 @@ <translation id="8413385045638830869">પહેલા પૂછો (ભલામણ કરેલ)</translation> <translation id="8418445294933751433">ટૅબ તરીકે &બતાવો</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' માટે શોધ પરિણામ</translation> +<translation id="8419368276599091549">તમારા <ph name="DEVICE_TYPE" /> પર સ્વાગત છે!</translation> <translation id="8420060421540670057">Google દસ્તાવેજ ફાઇલો બતાવો</translation> <translation id="8424039430705546751">નીચે</translation> <translation id="8425213833346101688">બદલો</translation> @@ -4880,6 +4936,7 @@ <translation id="8557930019681227453">સ્પષ્ટ</translation> <translation id="8559694214572302298">છબી ડીકોડર</translation> <translation id="8561853412914299728"><ph name="TAB_TITLE" /> <ph name="EMOJI_PLAYING" /></translation> +<translation id="8562084399541316921">વાંચન ચાલુ રાખો</translation> <translation id="8565650234829130278">એપ્લિકેશનને ડાઉનગ્રેડ કરવાનો પ્રયાસ કર્યો</translation> <translation id="8569002732135253578">હમણાં <ph name="DOCUMENT_NAME" /> છાપી રહ્યાં છીએ</translation> <translation id="8569682776816196752">કોઈ ગંતવ્યો મળ્યાં નથી</translation> @@ -4909,6 +4966,7 @@ <translation id="8620765578342452535">નેટવર્ક કનેક્શન્સ ગોઠવો</translation> <translation id="8624205858755890468">સહાયક તમને સંબંધિત માહિતી, ઍપ અને ક્રિયાઓ બતાવે તે ચાલુ કરે છે.</translation> <translation id="862542460444371744">&એક્સ્ટેન્શન્સ</translation> +<translation id="8626219642120025691">ટાઇમર લગાવ્યું</translation> <translation id="8627151598708688654">સ્રોત પસંદ કરો</translation> <translation id="862727964348362408">સસ્પેન્ડેડ</translation> <translation id="862750493060684461">CSS કેશ</translation> @@ -4934,6 +4992,7 @@ <translation id="8655295600908251630">ચેનલ</translation> <translation id="8655319619291175901">અરેરે, કંઈક ખોટું થયું.</translation> <translation id="8655972064210167941">સાઇન-ઇન નિષ્ફળ થયું કારણ કે તમારો પાસવર્ડ ચકાસી શકાયો નથી. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation> +<translation id="8656619792520327915">બ્લૂટૂથનો બીજો સુરક્ષા કોડ ઉમેરો</translation> <translation id="8656768832129462377">તપાસ કરશો નહીં</translation> <translation id="8658595122208653918">પ્રિન્ટર વિકલ્પો બદલો...</translation> <translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે તમારી સ્ક્રીન અને ઑડિઓને શેર કરી રહી છે.</translation> @@ -5027,6 +5086,7 @@ <translation id="8775404590947523323">તમારા સંપાદનો આપમેળે સચવાયા છે.<ph name="BREAKS" />મૂળ છબીની કૉપિ રાખવા માટે, "મૂળ પર ઓવરરાઇટ કરો" ને અનચેક કરો</translation> <translation id="8777628254805677039">રુટ પાસવર્ડ</translation> <translation id="8780443667474968681">વૉઇસ શોધ સેવા બંધ કરવામાં આવી છે.</translation> +<translation id="878068003854005405">ચાલો શરૂ કરીએ. તમારી આંગળીને સેન્સર પર મૂકો.</translation> <translation id="878069093594050299">આ પ્રમાણપત્ર નીચેના ઉપયોગો માટે ચકાસવામાં આવ્યું છે:</translation> <translation id="8781980678064919987">લિડ બંધ કરવામાં આવે, ત્યારે શટ ડાઉન કરો</translation> <translation id="8782565991310229362">કિઓસ્ક ઍપ્લિકેશન લોન્ચ રદ કર્યું.</translation> @@ -5054,6 +5114,7 @@ <translation id="8814687660896548945">કૃપા કરીને રાહ જુઓ, આર્કાઇવને તપાસવામાં આવી રહ્યો છે…</translation> <translation id="881799181680267069">અન્યને છુપાવો</translation> <translation id="8818152010000655963">વૉલપેપર</translation> +<translation id="8818958672113348984">તમારા ફોન મારફતે ચકાસો</translation> <translation id="8820817407110198400">બુકમાર્ક્સ</translation> <translation id="8821045908425223359">IP સરનામું આપમેળે ગોઠવો</translation> <translation id="882204272221080310">વધારાની સુરક્ષા માટે ફર્મવેયર અપડેટ કરો.</translation> @@ -5084,11 +5145,13 @@ <translation id="8872155268274985541">અમાન્ય કિઓસ્ક બાહ્ય અપડેટ મેનિફેસ્ટ ફાઇલ મળી. કિઓસ્ક ઍપ્લિકેશન અપડેટ કરવામાં નિષ્ફળ થયાં. કૃપા કરીને USB સ્ટીક દૂર કરો.</translation> <translation id="8874184842967597500">કનેક્ટેડ નથી</translation> <translation id="8876215549894133151">ફોર્મેટ:</translation> +<translation id="8876307312329369159">ડેમો સત્રમાં આ સેટિંગ બદલી શકાતી નથી.</translation> <translation id="8876309039915144086">પાસવર્ડ જનરેટ કરો...</translation> <translation id="8877448029301136595">[પેરેન્ટ ડાયરેક્ટરી]</translation> <translation id="8879284080359814990">ટૅબ તરીકે &બતાવો</translation> <translation id="8883847527783433352">બીજા એકાઉન્ટ સાથે સિંક કરો</translation> <translation id="8885197664446363138">Smart Lock અનુપલબ્ધ છે</translation> +<translation id="88870264962436283"><ph name="APP_NAME" />ની સ્પર્શ IDનો ઉપયોગ કરો</translation> <translation id="8888432776533519951">રંગ:</translation> <translation id="8890516388109605451">સ્રોતો</translation> <translation id="8892168913673237979">બધું સેટ છે!</translation> @@ -5109,6 +5172,7 @@ <translation id="8915370057835397490">સૂચનને લોડ કરી રહ્યું છે</translation> <translation id="8916476537757519021">છુપો મોડ સબફ્રેમ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8919275547519617350">તમારા બધા ઉપકરણો પર તમારા બધા પાસવર્ડ મેળવવા માટે સાઇન ઇન કરો અને સિંક ચાલુ કરો.</translation> +<translation id="8921366488406707015">તમારો સુરક્ષા કોડ ચકાસી રહ્યાં છીએ...</translation> <translation id="8922013791253848639">આ સાઇટ પર જાહેરાતો માટે હંમેશાં પરવાનગી આપે છે</translation> <translation id="8925458182817574960">&સેટિંગ્સ</translation> <translation id="8926389886865778422">ફરિથી પુછશો નહીં</translation> @@ -5200,6 +5264,7 @@ <translation id="9050666287014529139">પાસફ્રેઝ</translation> <translation id="9052208328806230490">તમે એકાઉન્ટ <ph name="EMAIL" /> નો ઉપયોગ કરીને, તમારા પ્રિંટર્સને <ph name="CLOUD_PRINT_NAME" /> સાથે નોંધાવ્યા છે</translation> <translation id="9052404922357793350">બ્લૉક કરવાનું ચાલુ રાખો</translation> +<translation id="9053091947372579468">તમારા ઉપકરણમાં Chrome માટેનું લાઇસન્સ છે, પણ તમારું વપરાશકર્તા નામ વ્યવસ્થા કન્સોલ સાથે સંકળાયેલ નથી. નોંધણી પ્રક્રિયા ચાલુ રાખવા માટે કૃપા કરીને વ્યવસ્થા કન્સોલ એકાઉન્ટ બનાવો. નોંધ: જો તમે નવું વ્યવસ્થા કન્સોલ એકાઉન્ટ બનાવવા માટે તમારા પોતાના ડોમેનની પસંદગી કરશો, સાઇનઅપ પછી તમારે ડોમેનની ચકાસણી પૂરી કરવી પણ જરૂરી છે. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">મારી પસંદગી યાદ રાખો</translation> <translation id="9055636786322918818">RC4 એન્ક્રિપ્શન લાગુ કરો. આનાથી વિકલ્પનો ઉપયોગ કરવાનું તમારું જોખમ વધે છે, કારણ કે RC4 સાઇફર અસુરક્ષિત હોય છે.</translation> <translation id="9056034633062863292">Chromebox અપડેટ કરી રહ્યાં છે</translation> @@ -5217,6 +5282,7 @@ <translation id="9066782832737749352">ટેક્સ્ટ-ટુ-સ્પીચ</translation> <translation id="9072550133391925347"><ph name="PASSWORD_MANAGER_BRAND" />, તમને તમે સાચવેલા પાસવર્ડ્સ વડે યોગ્ય હોય તેવી સાઇટ્સ અને ઍપ્લિકેશનોમાં આપમેળે સાઇન ઇન કરે છે.</translation> <translation id="9073281213608662541">PAP</translation> +<translation id="90737709606140813">આ ઉપકરણ સાથે તમારી કીનું જોડાણ કરો, કે જેથી તમારા એકાઉન્ટમાં સાઇન ઇન કરવા માટે તમે તેનો ઉપયોગ કરી શકો</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9074836595010225693">USB માઉસ કનેક્ટ કર્યું</translation> <translation id="9076523132036239772">માફ કરશો, તમારો ઇમેઇલ અથવા પાસવર્ડ માન્ય કરી શકાયો નથી. સૌ પ્રથમ નેટવર્કથી કનેક્ટ કરવાનો પ્રયાસ કરો. </translation> @@ -5302,6 +5368,7 @@ <translation id="9218430445555521422">ડિફોલ્ટ તરીકે સેટ કરો</translation> <translation id="9219103736887031265">છબીઓ</translation> <translation id="9220525904950070496">એકાઉન્ટ દૂર કરો</translation> +<translation id="9220820413868316583">આંગળી ઉપાડી લો પછી ફરી પ્રયાસ કરો.</translation> <translation id="923467487918828349">બધું બતાવો</translation> <translation id="928985544179707652">એક્સ્ટેન્શન:</translation> <translation id="930268624053534560">વિગતવાર ટાઇમસ્ટેમ્પસ</translation> @@ -5341,6 +5408,7 @@ <translation id="971774202801778802">URL ને બુકમાર્ક કરો</translation> <translation id="973473557718930265">છોડી દો</translation> <translation id="974555521953189084">સમન્વયન શરૂ કરવા માટે તમારો પાસફ્રેઝ દાખલ કરો</translation> +<translation id="977640333593638907">મોટાભાગની કીનો ઉપયોગ કરવા માટે, માત્ર બટન દબાવો</translation> <translation id="981121421437150478">ઑફલાઇન</translation> <translation id="983511809958454316">આ સુવિધા VRમાં સમર્થિત નથી</translation> <translation id="984275831282074731">ચુકવણી પદ્ધતિઓ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 8ea8037..506ab760 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">कोई नेटवर्क नहीं</translation> <translation id="1056898198331236512">चेतावनी</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">फ़िंगरप्रिंट रजिस्टर करना</translation> <translation id="1061904396131502319">ब्रेक लेने का समय होने वाला है</translation> <translation id="1062407476771304334">प्रतिस्थापित करें</translation> <translation id="1067048845568873861">निर्मित</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">डायमंड</translation> <translation id="1114335938027186412">आपके कंप्यूटर में एक 'ट्रस्टेड प्लैटफ़ॉर्म मॉड्यूल' (टीपीएम) सुरक्षा डिवाइस है, जिसका उपयोग Chrome OS में कई ज़रूरी सुरक्षा सुविधाओं को लागू करने में किया जाता है. और जानने के लिए 'Chromebook सहायता केंद्र' पर जाएं: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">लिड बंद होने पर सुलाएं (कम बैटरी मोड)</translation> +<translation id="1115324527092594775">'एक साथ बेहतर' सेट अप करें</translation> <translation id="1116694919640316211">इसके बारे में</translation> <translation id="1116779635164066733">यह सेटिंग "<ph name="NAME" />" एक्सटेंशन के ज़रिए लागू की गई है.</translation> <translation id="111844081046043029">क्या आप वाकई इस पेज को छोड़ना चाहते हैं ?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">मौजूदा समय</translation> <translation id="1157102636231978136">आपके 'Google खाते' में सिंक किए गया आपका ब्राउज़िंग डेटा और गतिविधि</translation> <translation id="1161575384898972166">क्लाइंट प्रमाणपत्र निर्यात करने के लिए, कृपया <ph name="TOKEN_NAME" /> में प्रवेश करें.</translation> +<translation id="1161699061380012396">Chrome OS इनपुट का तरीका</translation> <translation id="1163931534039071049">फ़्रेम का स्रोत &देखें</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> के लिए Smart Lock बंद करें?</translation> <translation id="1164899421101904659">पिन अनलॉक कुंजी डालें</translation> @@ -719,7 +722,7 @@ <translation id="2075959085554270910">आपको क्लिक-के-लिए-टैप और टैप करके खींचने की सुविधा को चालू/बंद करने देता है</translation> <translation id="2076269580855484719">यह प्लग इन छुपाएं</translation> <translation id="2076672359661571384">मध्यम (सुझाया गया)</translation> -<translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation> +<translation id="2077129598763517140">उपलब्ध होने पर 'हार्डवेयर से तेज़ी लाएं' सुविधा का उपयोग करें</translation> <translation id="2078019350989722914">छोड़ने के पहले चेतावनी दें (<ph name="KEY_EQUIVALENT" />)</translation> <translation id="2079053412993822885">यदि आप अपने प्रमाणपत्रों में से किसी एक को हटाते हैं, तो आप आगे इसका उपयोग स्वयं की पहचान करने के लिए नहीं कर सकते हैं.</translation> <translation id="2079545284768500474">वापस लाएं</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play स्टोर खाता</translation> <translation id="2509495747794740764">स्केल राशि की संख्या 10 और 200 के बीच होनी चाहिए.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">फ़ॉर्म अपने आप भरने दें</translation> <translation id="2513403576141822879">निजता, सुरक्षा और डेटा इकट्ठा करने से जुड़ी ज़्यादा सेटिंग के लिए, <ph name="BEGIN_LINK" />सिंक और Google सेवाएं<ph name="END_LINK" /> देखें</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">स्कैन करें</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">क्रम संख्या: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">फ़्रेम का स्रोत &देखें</translation> <translation id="3022978424994383087">समझ नहीं आया.</translation> +<translation id="3023464535986383522">चुनें और सुनें</translation> <translation id="3024374909719388945">24-घंटे की घड़ी का उपयोग करें</translation> <translation id="302781076327338683">कैश को बाइपास कर फिर लोड करें</translation> <translation id="3031417829280473749">एजेंट X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">इनपुट का अगला तरीका</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> के लिए "<ph name="EXTENSION_NAME" />" को जोड़ें?</translation> <translation id="3644896802912593514">चौड़ाई</translation> +<translation id="3645372836428131288">फ़िंगरप्रिंट के अलग हिस्से को कैप्चर करने के लिए धीरे से हिलाएं</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> का पता चला</translation> <translation id="3649138363871392317">फ़ोटो को कैप्चर किया गया था</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" को इन्हें एक्सेस करने की मंज़ूरी दें:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">प्रमाणपत्र नीतियां</translation> <translation id="392089482157167418">ChromeVox (बोला गया फ़ीडबैक) सक्षम करें</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">आपके पास हाल ही में कैप्चर किया गया कोई WebRTC लॉग नहीं है.</translation> <translation id="3925573269917483990">कैमरा:</translation> <translation id="3925842537050977900">अलमारी से टैब बड़ी करें</translation> <translation id="3926002189479431949">Smart Lock फ़ोन बदला गया</translation> @@ -2174,7 +2177,7 @@ <translation id="428608937826130504">अलमारी आइटम 8</translation> <translation id="4287502004382794929">इस डिवाइस का नामांकन करने के लिए आपके पास पर्याप्त सॉफ़्टवेयर लाइसेंस नहीं हैं. कृपया और अधिक खरीदने के लिए विक्रय विभाग से संपर्क करें. यदि आपको लगता है कि आपको यह संदेश त्रुटिवश दिखाई दे रहा है, तो कृपया सहायता से संपर्क करें.</translation> <translation id="4289540628985791613">संक्षिप्त विवरण</translation> -<translation id="4295072614469448764">ऐप्लिकेशन आपके टर्मिनल में उपलब्ध है. आपके 'लॉन्चर' में एक आइकॉन भी मौजूद हो सकता है.</translation> +<translation id="4295072614469448764">ऐप्लिकेशन आपके 'टर्मिनल' में उपलब्ध है. आपके 'लॉन्चर' में एक आइकॉन भी मौजूद हो सकता है.</translation> <translation id="4296575653627536209">'निगरानी में रखा गया उपयोगकर्ता' जोड़ें</translation> <translation id="4297219207642690536">रीस्टार्ट करें और रीसेट करें</translation> <translation id="4297322094678649474">भाषाएं बदलें</translation> @@ -2223,6 +2226,7 @@ <translation id="438503109373656455">साराटोगा</translation> <translation id="4387004326333427325">प्रमाणीकरण प्रमाणपत्र को दूरस्थ रूप से अस्वीकार किया गया</translation> <translation id="4389091756366370506">उपयोगकर्ता <ph name="VALUE" /></translation> +<translation id="439266289085815679">ब्लूटूथ कॉन्फ़िगरेशन को <ph name="USER_EMAIL" /> से नियंत्रित किया जाता है.</translation> <translation id="4394049700291259645">बंद करें</translation> <translation id="4400367121200150367">वे साइटें जो कभी पासवर्ड नहीं सहेजती हैं, यहां दिखाई देंगी</translation> <translation id="4400632832271803360">शीर्ष-पंक्ति वाली कुंजियों का व्यवहार स्विच करने के लिए Launcher कुंजी दबाए रखें</translation> @@ -2296,6 +2300,7 @@ <translation id="4522600456902129422">इस साइट को क्लिपबोर्ड देखने देते रहें</translation> <translation id="4530494379350999373">मूल</translation> <translation id="4533985347672295764">CPU समय</translation> +<translation id="4534661889221639075">फिर से कोशिश करें.</translation> <translation id="4535127706710932914">सामान्य प्रोफ़ाइल</translation> <translation id="4538417792467843292">शब्द हटाएं</translation> <translation id="4538684596480161368">सैंडबॉक्स नहीं किए गए प्लग इन को <ph name="HOST" /> पर हमेशा अवरुद्ध करें</translation> @@ -2525,6 +2530,7 @@ <translation id="4880520557730313061">स्वत:एडजस्ट करें</translation> <translation id="4880827082731008257">खोज इतिहास</translation> <translation id="4881695831933465202">खोलें</translation> +<translation id="4882312758060467256">इस साइट का एक्सेस है</translation> <translation id="4882473678324857464">बुकमार्क पर केंद्रित करें</translation> <translation id="4882831918239250449">यह नियंत्रित करें कि खोज, विज्ञापनों वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="4883178195103750615">HTML फ़ाइल में बुकमार्क निर्यात करें...</translation> @@ -2569,7 +2575,7 @@ <translation id="4927753642311223124">यहां देखने के लिए कुछ भी नहीं है, आगे चलें.</translation> <translation id="4927846293686536410">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने के लिए साइन इन करें. आप अपनी Google सेवाओं में भी अपने आप साइन इन कर जाएंगे.</translation> <translation id="4929386379796360314">प्रिंट करने की जगहें</translation> -<translation id="4931132176527519925">स्क्रीन हमेशा शेयर करें</translation> +<translation id="4931132176527519925">हमेशा स्क्रीन शेयर करें</translation> <translation id="4933484234309072027"><ph name="URL" /> पर एम्बेड किया गया</translation> <translation id="493571969993549666">'निगरानी में रखा गया उपयोगकर्ता' जोड़ें</translation> <translation id="4941246025622441835">एंटरप्राइज़ प्रबंधन के लिए डिवाइस को नामांकित करते समय इस डिवाइस अनुरोध का उपयोग करें:</translation> @@ -2590,6 +2596,7 @@ <translation id="4969785127455456148">एल्बम</translation> <translation id="4971412780836297815">पू्र्ण होने पर खोलें</translation> <translation id="4972129977812092092">प्रिंटर संपादित करें</translation> +<translation id="4972164225939028131">दर्ज किया गया पासवर्ड गलत है</translation> <translation id="497287958838527945">Google Pay का इस्तेमाल करने वाले क्रेडिट कार्ड और पते.</translation> <translation id="4973307593867026061">प्रिंटर जोड़ें</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> या उससे कम वर्ण वाले नाम का उपयोग करें</translation> @@ -2758,7 +2765,7 @@ <translation id="5240817131241497236">Chrome में 'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाओं' को नियंत्रित करने वाली सेटिंग बदल गई हैं. आपकी मौजूदा सेटिंग पर इसका असर पड़ सकता है.</translation> <translation id="5241128660650683457">जिन वेबसाइट पर आप जाते हैं, उन पर मौजूद अपना सारा डेटा पढ़ें</translation> <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" को सक्षम करें?</translation> -<translation id="5243522832766285132">कृपया कुछ देर बाद दोबारा कोशिश करें</translation> +<translation id="5243522832766285132">कृपया कुछ देर बाद कोशिश करें</translation> <translation id="5244474230056479698"><ph name="EMAIL" /> से समन्वयित हो रहा है</translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> क्रैश हो गया है. ऐप्लिकेशन पुन: प्रारंभ करने के लिए यह गुब्बारा क्लिक करें.</translation> <translation id="5247051749037287028">दिखाई देने वाला नाम (वैकल्पिक)</translation> @@ -3017,6 +3024,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ऐप्लिकेशन लोड हो रहे हैं...</translation> <translation id="5592595402373377407">अभी पर्याप्त डेटा उपलब्ध नहीं है.</translation> +<translation id="5593357315997824387">मेरी फ़ाइलों को सिंक करें</translation> <translation id="5595152862129936745">बहुत दूर</translation> <translation id="5595485650161345191">पता संपादित करें</translation> <translation id="5596627076506792578">अधिक विकल्प</translation> @@ -3732,6 +3740,7 @@ <translation id="6664237456442406323">दुर्भाग्यवश, आपका कंप्यूटर किसी विकृत हार्डवेयर आईडी द्वारा कॉन्फ़िगर किया हुआ है. इससे Chrome OS को नवीनतम सुरक्षा सुधारों से अपडेट होने में बाधा आ रही है और आपका कंप्यूटर <ph name="BEGIN_BOLD" />दुर्भावनापूर्ण हमलों की चपेट में आ सकता है<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">आपकी प्रोफ़ाइल खोलते समय कुछ गलत हुआ. कृपया प्रस्थान करें और दोबारा प्रवेश करें.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">टाइमर बंद करें</translation> <translation id="667517062706956822">क्या आप चाहते हैं कि Google इस पेज का <ph name="SOURCE_LANGUAGE" /> से <ph name="TARGET_LANGUAGE" /> में अनुवाद करे?</translation> <translation id="6675665718701918026">सूचक डिवाइस कनेक्ट किया गया</translation> <translation id="6678717876183468697">क्वेरी यूआरएल</translation> @@ -4058,6 +4067,7 @@ <translation id="7186088072322679094">टूलबार में रखें</translation> <translation id="7187428571767585875">ऐसी रजिस्ट्री प्रविष्टियां जिन्हें हटाया या बदला जाना है:</translation> <translation id="7189234443051076392">पक्का करें कि आपके डिवाइस पर ज़रूरी जगह मौजूद हो</translation> +<translation id="7189965711416741966">फ़िंगरप्रिंट जोड़ा गया.</translation> <translation id="7191159667348037">अज्ञात प्रिंटर (USB)</translation> <translation id="7191454237977785534">फ़ाइल इस रूप में सहेजें</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> के लिए कोई पासवर्ड सेव नहीं किया गया है</translation> @@ -4158,6 +4168,7 @@ <translation id="7339898014177206373">नई विंडो</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> अब पूर्ण स्क्रीन है.</translation> <translation id="7340650977506865820">साइट आपकी स्क्रीन शेयर कर रही है</translation> +<translation id="7341834142292923918">इस साइट का एक्सेस चाहिए</translation> <translation id="7345706641791090287">अपने पासवर्ड की पुष्टि करें</translation> <translation id="7346909386216857016">ठीक है, समझ लिया</translation> <translation id="7347751611463936647">इस एक्सटेंशन का उपयोग करने के लिए, "<ph name="EXTENSION_KEYWORD" />" लिखें, फिर TAB लिखें, फिर अपना निर्देश या खोज लिखें.</translation> @@ -4267,7 +4278,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google की स्थान सेवा आपके डिवाइस के स्थान का अंदाज़ा लगाने में सहायता के लिए वाई-फ़ाई, मोबाइल नेटवर्क और सेंसर जैसे स्रोतों का इस्तेमाल कर सकती है. यह सेवा तब चालू होती है जब आपके डिवाइस की स्थान सेटिंग चालू हो.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />आप अपने डिवाइस की मुख्य स्थान सेटिंग को बंद करके स्थान को बंद कर सकते हैं. आप सेटिंग में जाकर स्थान के वाई-फ़ाई, मोबाइल नेटवर्क और सेंसर भी बंद कर सकते हैं.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">पासवर्ड बनाएं -</translation> -<translation id="7518150891539970662">WebRTC लॉग (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">बनाएं</translation> <translation id="7529411698175791732">अपना इंटरनेट कनेक्शन जाँचें. अगर समस्या बनी रहती है, तो साइन आउट करके और दोबारा प्रवेश करके देखें.</translation> @@ -4745,6 +4755,7 @@ <translation id="8214962590150211830">इस व्यक्ति को निकालें</translation> <translation id="8217399928341212914">एकाधिक फ़ाइलों के स्वचालित डाउनलोड अवरुद्ध करना जारी रखें</translation> <translation id="8223479393428528563">इन फ़ाइलों को ऑफ़लाइन उपयोग हेतु सहेजने के लिए, वापस ऑनलाइन आएं, फ़ाइलों पर राइट-क्लिक करें और <ph name="OFFLINE_CHECKBOX_NAME" /> विकल्प चुनें.</translation> +<translation id="8225753906568652947">अपने ऑफ़र रिडीम करें</translation> <translation id="8226222018808695353">निषिद्ध</translation> <translation id="8226619461731305576">सूची</translation> <translation id="8226742006292257240">नीचे यादृच्छिक रूप से निर्मित TPM पासवर्ड है जो कि आपके कंप्यूटर के लिए असाइन किया गया है:</translation> @@ -4791,6 +4802,7 @@ <translation id="8286036467436129157">साइन इन करें</translation> <translation id="8286963743045814739">आप गुप्त विंडो का उपयोग करके निजी रूप से ब्राउज़ कर सकते हैं</translation> <translation id="82871696630048499">वेब पेज दोबारा लोड किया गया क्योंकि उसके लिए ज़रूरी मेमोरी नहीं बची थी.</translation> +<translation id="8288032458496410887"><ph name="APP" /> ऐप्लिकेशन अनइंस्टॉल करें...</translation> <translation id="8291967909914612644">होम प्रदाता देश</translation> <translation id="8294431847097064396">स्रोत</translation> <translation id="8297006494302853456">कमज़ोर</translation> @@ -4852,6 +4864,7 @@ <translation id="8413385045638830869">पहले पूछें (सुझाया गया)</translation> <translation id="8418445294933751433">टैब के रूप में &दिखाएं</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' के खोज परिणाम</translation> +<translation id="8419368276599091549">आपके <ph name="DEVICE_TYPE" /> में स्वागत है!</translation> <translation id="8420060421540670057">Google डॉक्स फ़ाइलें दिखाएं</translation> <translation id="8424039430705546751">नीचे</translation> <translation id="8425213833346101688">बदलें</translation> @@ -4978,6 +4991,7 @@ <translation id="8620765578342452535">नेटवर्क कनेक्शन कॉन्फ़िगर करें</translation> <translation id="8624205858755890468">आपको संबंधित जानकारी, ऐप और कार्रवाइयां दिखाने के लिए Assistant को चालू करता है.</translation> <translation id="862542460444371744">&एक्सटेंशन</translation> +<translation id="8626219642120025691">टाइमर पूरा हुआ</translation> <translation id="8627151598708688654">स्रोत चुनें</translation> <translation id="862727964348362408">निलंबित</translation> <translation id="862750493060684461">CSS संचय</translation> @@ -5098,6 +5112,7 @@ <translation id="8775404590947523323">आपके संपादन अपने आप सहेजे जाते हैं.<ph name="BREAKS" />मूल चित्र की प्रति रखने के लिए, "मूल को अधिलेखित करें" अनचेक करें</translation> <translation id="8777628254805677039">रूट पासवर्ड</translation> <translation id="8780443667474968681">बोलकर खोजने की सेवा बंद कर दी गई है.</translation> +<translation id="878068003854005405">चलिए शुरू करें. सेंसर पर अपनी उंगली रखें.</translation> <translation id="878069093594050299">इस प्रमाणपत्र को निम्न उपयोगों के लिए सत्यापित किया गया है:</translation> <translation id="8781980678064919987">लिड बंद होने पर शट डाउन करें</translation> <translation id="8782565991310229362">कियोस्क ऐप्स लॉन्च रद्द किया गया.</translation> @@ -5241,7 +5256,7 @@ <translation id="9011178328451474963">अंतिम टैब</translation> <translation id="9013707997379828817">आपके एडमिन ने यह डिवाइस बहाल कर दिया है. कृपया ज़रूरी फ़ाइलें सेव कर लें, उसके बाद रीस्टार्ट करें. डिवाइस पर मौजूद सारा डेटा मिटा दिया जाएगा.</translation> <translation id="9014987600015527693">दूसरा मोबाइल दिखाएं</translation> -<translation id="9018218886431812662">इंस्टॉलेशन हो गया है</translation> +<translation id="9018218886431812662">इंस्टॉल हो गया है</translation> <translation id="901834265349196618">ईमेल</translation> <translation id="9019062154811256702">ऑटोमैटिक भरने वाली सेटिंग को पढ़ें और बदलें</translation> <translation id="9020362265352758658">4x</translation> @@ -5275,6 +5290,7 @@ <translation id="9050666287014529139">पासफ़्रेज़</translation> <translation id="9052208328806230490">आपने अपने प्रिंटर को खाता <ph name="EMAIL" /> का उपयोग करके <ph name="CLOUD_PRINT_NAME" /> के साथ पंजीकृत किया है </translation> <translation id="9052404922357793350">ब्लॉक करना जारी रखें</translation> +<translation id="9053091947372579468">आपके डिवाइस में Chrome लाइसेंस शामिल है, लेकिन आपका उपयोगकर्ता नाम Admin console से जुड़ा हुआ नहीं है. नामांकन के साथ आगे बढ़ने के लिए कृपया एक एडमिन कंसोल खाता बनाएं. नोट: अगर आप एक नया एडमिन कंसोल खाता बनाने के लिए अपने डोमेन का इस्तेमाल करना चुनते हैं, तो आपको साइन अप के बाद डोमेन की पुष्टि भी पूरी करनी होगी. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">मेरी पसंद याद रखें</translation> <translation id="9055636786322918818">RC4 सुरक्षा लागू करें. इस विकल्प का इस्तेमाल करने से आपका खतरा बढ़ जाता है, क्योंकि RC4 सिफ़र असुरक्षित होते हैं.</translation> <translation id="9056034633062863292">Chromebox अपडेट करना</translation> @@ -5370,7 +5386,7 @@ <translation id="9203478404496196495">टैब अनम्यूट करें</translation> <translation id="9203904171912129171">डिवाइस चुनें</translation> <translation id="9203962528777363226">इस डिवाइस के व्यवस्थापक ने नए उपयोगकर्ता जोड़े जाना अक्षम कर दिया है</translation> -<translation id="9213073329713032541">इंस्टॉल करना ठीक से शुरू हो गया है.</translation> +<translation id="9213073329713032541">ठीक से इंस्टॉल होना शुरू हो गया है.</translation> <translation id="9214520840402538427">ओह! इंस्टॉलेशन-समय विशेषताएं आरंभ करने की समय सीमा समाप्त हो गई है. कृपया अपने सहायता प्रतिनिधि से संपर्क करें.</translation> <translation id="9214695392875603905">कपकेक</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" जोड़ा गया</translation> @@ -5378,6 +5394,7 @@ <translation id="9218430445555521422">डिफ़ॉल्ट के रूप में सेट करें</translation> <translation id="9219103736887031265">चित्र</translation> <translation id="9220525904950070496">खाता हटाएं</translation> +<translation id="9220820413868316583">उंगली उठाएं और फिर से कोशिश करें.</translation> <translation id="923467487918828349">सभी दिखाएं</translation> <translation id="928985544179707652">एक्सटेंशन:</translation> <translation id="930268624053534560">विवरणों के साथ टाइमस्टैम्प</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index a96999c..f6bc060 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nema mreža</translation> <translation id="1056898198331236512">Upozorenje</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registriranje otiska prsta</translation> <translation id="1061904396131502319">Ubrzo je vrijeme za pauzu</translation> <translation id="1062407476771304334">Zamijeni</translation> <translation id="1067048845568873861">Izrađeno</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Dijamant</translation> <translation id="1114335938027186412">Vaše računalo sadrži sigurnosni uređaj Trusted Platform Module (TPM) koji se upotrebljava za primjenu mnogih važnih sigurnosnih značajki u OS-u Chrome. Posjetite Chromebookov centar za pomoć da biste saznali više: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Prijeđi u mirovanje kada se zatvori poklopac</translation> +<translation id="1115324527092594775">Postavljanje Kombiniranja prednosti</translation> <translation id="1116694919640316211">O opcijama</translation> <translation id="1116779635164066733">Tom postavkom upravlja proširenje "<ph name="NAME" />".</translation> <translation id="111844081046043029">Jeste li sigurni da želite zatvoriti ovu stranicu?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Trenutačno vrijeme</translation> <translation id="1157102636231978136">Vaši podaci o pregledavanju i aktivnost, sinkronizirani s vašim Google računom</translation> <translation id="1161575384898972166">Prijavite se u uređaj <ph name="TOKEN_NAME" /> kako biste izvezli potvrdu klijenta.</translation> +<translation id="1161699061380012396">Način unosa OS-a Chrome</translation> <translation id="1163931534039071049">&Pogledaj izvor okvira</translation> <translation id="1164674268730883318">Želite li isključiti Smart Lock za uređaj <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Unesite ključ za otključavanje PIN-a</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Račun Trgovine Google Play</translation> <translation id="2509495747794740764">Iznos skaliranja mora biti broj od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Automatski popunite obrasce</translation> <translation id="2513403576141822879">Više postavki koje se odnose na privatnost, sigurnost i prikupljanje podataka dostupno je u odjeljku <ph name="BEGIN_LINK" />Sinkronizacija i prilagodba<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Traži</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Serijski broj: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Pogledaj izvor okvira</translation> <translation id="3022978424994383087">Nisam shvatio.</translation> +<translation id="3023464535986383522">Odabir za govor</translation> <translation id="3024374909719388945">Koristi 24-satni sat</translation> <translation id="302781076327338683">Ponovno učitavanje predmemorije sa zaobilaženjem</translation> <translation id="3031417829280473749">Agentica X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Sljedeći način unosa</translation> <translation id="3640214691812501263">Želite li dodati proširenje "<ph name="EXTENSION_NAME" />" za korisnika <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Širina</translation> +<translation id="3645372836428131288">Lagano pomaknite prst da biste snimili različite dijelove otiska prsta.</translation> <translation id="3648348069317717750">Otkriven je uređaj <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Fotografija je snimljena</translation> <translation id="3650952250015018111">Dopusti aplikaciji "<ph name="APP_NAME" />" da pristupi:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Pravila certifikata</translation> <translation id="392089482157167418">Omogući ChromeVox (govorne povratne informacije)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nemate nedavno snimljenih WebRTC zapisnika.</translation> <translation id="3925573269917483990">Fotoaparat:</translation> <translation id="3925842537050977900">Otkvači s police</translation> <translation id="3926002189479431949">Telefon za Smart Lock promijenio se</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Vihor</translation> <translation id="4387004326333427325">Certifikat za autentifikaciju odbijen je daljinski</translation> <translation id="4389091756366370506">Korisnik <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfiguracijom Bluetootha upravlja <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Onemogući</translation> <translation id="4400367121200150367">Ovdje će se pojaviti web-lokacije koje nikad ne spremaju zaporke</translation> <translation id="4400632832271803360">Držite tipku Pokretač da biste izmjenjivali ponašanje tipki u najvišem retku</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Nastavi dopuštati ovoj web-lokaciji uvid u međuspremnik</translation> <translation id="4530494379350999373">Podrijetlo</translation> <translation id="4533985347672295764">Vrijeme CPU-a</translation> +<translation id="4534661889221639075">Pokušajte ponovo.</translation> <translation id="4535127706710932914">Zadani profil</translation> <translation id="4538417792467843292">Izbriši riječ</translation> <translation id="4538684596480161368">Uvijek blokiraj dodatke izvan testnog okruženja na <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automatska obrada</translation> <translation id="4880827082731008257">Pretraži povijest</translation> <translation id="4881695831933465202">Otvori</translation> +<translation id="4882312758060467256">Ima pristup ovoj web-lokaciji</translation> <translation id="4882473678324857464">Fokusiraj oznake</translation> <translation id="4882831918239250449">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja, oglasa i drugog</translation> <translation id="4883178195103750615">Izvoz oznaka u HTML datoteku ...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Otvori nakon dovršetka</translation> <translation id="4972129977812092092">Uredite pisač</translation> +<translation id="4972164225939028131">Pogrešna zaporka</translation> <translation id="497287958838527945">Kreditne kartice i adrese s Google Paya.</translation> <translation id="4973307593867026061">Dodaj pisače</translation> <translation id="4973523518332075481">Broj znakova u nazivu može biti najviše <ph name="MAX_LENGTH" /></translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Učitavanje aplikacija...</translation> <translation id="5592595402373377407">Još nije dostupno dovoljno podataka.</translation> +<translation id="5593357315997824387">Sinkroniziraj moje datoteke</translation> <translation id="5595152862129936745">Vrlo daleko</translation> <translation id="5595485650161345191">Uređivanje adrese</translation> <translation id="5596627076506792578">Više opcija</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Nažalost, vaše je računalo konfigurirano pogrešno oblikovanim ID-om hardvera. To sprječava ažuriranje OS-a Chrome najnovijim sigurnosnim popravcima pa bi vaše računalo <ph name="BEGIN_BOLD" />moglo biti ranjivo na zlonamjerne napade<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Prilikom otvaranja profila dogodila se pogreška. Odjavite se i ponovo prijavite.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">zaustavi odbrojavanje</translation> <translation id="667517062706956822">Želite li da Google prevede ovu stranicu (<ph name="SOURCE_LANGUAGE" /> – <ph name="TARGET_LANGUAGE" />)?</translation> <translation id="6675665718701918026">Pokazivački je uređaj povezan</translation> <translation id="6678717876183468697">URL upita</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Zadrži na alatnoj traci</translation> <translation id="7187428571767585875">Unosi registra koje treba ukloniti ili promijeniti:</translation> <translation id="7189234443051076392">Provjerite ima li dovoljno prostora na uređaju</translation> +<translation id="7189965711416741966">Otisak prsta je dodan.</translation> <translation id="7191159667348037">Nepoznati pisač (USB)</translation> <translation id="7191454237977785534">Spremi datoteku kao</translation> <translation id="7193374945610105795">Nema spremljenih zaporki za <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Novi prozor</translation> <translation id="7340431621085453413">Stranica <ph name="FULLSCREEN_ORIGIN" /> sada je na cijelom zaslonu.</translation> <translation id="7340650977506865820">Web-lokacija dijeli vaš zaslon</translation> +<translation id="7341834142292923918">Želi pristup ovoj web-lokaciji</translation> <translation id="7345706641791090287">Potvrdite zaporku</translation> <translation id="7346909386216857016">Dobro, shvaćam</translation> <translation id="7347751611463936647">Da biste upotrijebili to proširenje, upišite "<ph name="EXTENSION_KEYWORD" />", zatim pritisnite TAB, a zatim svoju naredbu ili pretraživanje.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googleova usluga lokacije upotrebljava izvore kao što su Wi-Fi, mobilne mreže i senzori radi lakše procjene lokacije uređaja. Ta je usluga aktivna kada je uključena postavka lokacije uređaja.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Lokaciju možete isključiti tako što ćete isključiti glavnu postavku lokacije na uređaju. U postavkama lokacije također možete isključiti upotrebu Wi‑Fi-ja, mobilnih mreža i senzora za lokaciju.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Izrada zaporke –</translation> -<translation id="7518150891539970662">WebRTC zapisnici (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Stvori</translation> <translation id="7529411698175791732">Provjerite internetsku vezu. Ako se problem ne riješi, pokušajte se odjaviti i ponovo prijaviti.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Ukloni ovu osobu</translation> <translation id="8217399928341212914">Nastavi blokirati automatska preuzimanja više datoteka</translation> <translation id="8223479393428528563">Da biste spremili te datoteke za izvanmrežnu upotrebu, ponovo se povežite s internetom, kliknite datoteke desnom tipkom i odaberite opciju <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Iskoristite svoje ponude</translation> <translation id="8226222018808695353">Zabranjeno</translation> <translation id="8226619461731305576">Red čekanja</translation> <translation id="8226742006292257240">Dolje je nasumice generirana zaporka modula pouzdane platforme dodijeljena vašem računalu:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Prijava</translation> <translation id="8286963743045814739">Možete pregledavati privatno u anonimnom prozoru</translation> <translation id="82871696630048499">Web-stranica ponovo je učitana jer je ostala bez memorije.</translation> +<translation id="8288032458496410887">Deinstaliranje aplikacije <ph name="APP" />...</translation> <translation id="8291967909914612644">Zemlja davatelja usluge kućne mreže</translation> <translation id="8294431847097064396">Izvor</translation> <translation id="8297006494302853456">Slab</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Prvo pitaj (preporučeno)</translation> <translation id="8418445294933751433">&Prikaži kao karticu</translation> <translation id="8419098111404128271">Rezultati pretraživanja za "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Dobro došli na svoj <ph name="DEVICE_TYPE" /> uređaj!</translation> <translation id="8420060421540670057">Prikaži datoteke Google dokumenata</translation> <translation id="8424039430705546751">dolje</translation> <translation id="8425213833346101688">Promijeni</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Konfiguracija mrežnih veza</translation> <translation id="8624205858755890468">Omogućuje Asistentu da vam prikazuje povezane informacije, aplikacije i radnje.</translation> <translation id="862542460444371744">&Proširenja</translation> +<translation id="8626219642120025691">Odbrojavanje gotovo</translation> <translation id="8627151598708688654">Odaberite izvor</translation> <translation id="862727964348362408">Obustavljeno</translation> <translation id="862750493060684461">CSS predmemorija</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Vaša se uređivanja spremaju automatski.<ph name="BREAKS" />Da biste zadržali kopiju izvorne slike, isključite oznaku opcije "Prebriši izvornik"</translation> <translation id="8777628254805677039">korijenska zaporka</translation> <translation id="8780443667474968681">Glasovno je pretraživanje isključeno.</translation> +<translation id="878068003854005405">Započnimo. Postavite prst na senzor.</translation> <translation id="878069093594050299">Ovaj je certifikat potvrđen za sljedeće korištenje:</translation> <translation id="8781980678064919987">Isključi računalo kada se zatvori poklopac</translation> <translation id="8782565991310229362">Pokretanje aplikacije kioska otkazano je.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Zaporka</translation> <translation id="9052208328806230490">Registrirali ste pisače kod <ph name="CLOUD_PRINT_NAME" /> putem računa <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Nastavi blokirati</translation> +<translation id="9053091947372579468">Vaš uređaj sadrži licencu za Chrome, no vaše korisničko ime nije povezano s administratorskom konzolom. Izradite račun na administratorskoj konzoli da biste nastavili s prijavom. Ako odlučite upotrebljavati vlastitu domenu za izradu novog računa na administratorskoj konzoli, nakon registracije morate izvršiti i potvrdu domene. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Zapamti odabir</translation> <translation id="9055636786322918818">Provođenje AES i RC4 šifriranja. Upotreba te opcije izlaže vas većoj opasnosti jer RC4 šifre nisu sigurne.</translation> <translation id="9056034633062863292">Ažuriranje Chromeboxa</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Postavi kao zadano</translation> <translation id="9219103736887031265">Slike</translation> <translation id="9220525904950070496">Uklanjanje računa</translation> +<translation id="9220820413868316583">Podignite, a zatim pokušajte ponovo.</translation> <translation id="923467487918828349">Prikaži sve</translation> <translation id="928985544179707652">Proširenja:</translation> <translation id="930268624053534560">Detaljne vremenske oznake</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index ac7f871..509be36 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nincs hálózat</translation> <translation id="1056898198331236512">Figyelmeztetés</translation> <translation id="1058262162121953039">PUK-kód</translation> +<translation id="1059855432287631118">Ujjlenyomat regisztrálása</translation> <translation id="1061904396131502319">Lassan ideje szünetet tartani</translation> <translation id="1062407476771304334">Csere</translation> <translation id="1067048845568873861">Létrehozva</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Gyémánt</translation> <translation id="1114335938027186412">Számítógépe tartalmaz egy platformmegbízhatósági modul (Trusted Platform Module, TPM) nevű biztonsági eszközt, amely számos kritikus biztonsági funkció megvalósítására szolgál Chrome OS-en. További információért keresse fel a Chromebook Súgót: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Alvó mód, ha le van zárva a fedél</translation> +<translation id="1115324527092594775">A Better Together beállítása</translation> <translation id="1116694919640316211">Névjegy</translation> <translation id="1116779635164066733">Ezt a beállítást a(z) „<ph name="NAME" />” bővítmény kényszeríti ki.</translation> <translation id="111844081046043029">Biztos, hogy el szeretné hagyni ezt az oldalt?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Pontos idő</translation> <translation id="1157102636231978136">Böngészési adatai és tevékenységei, Google-fiókjával szinkronizálva.</translation> <translation id="1161575384898972166">Kérjük, jelentkezzen be a(z) <ph name="TOKEN_NAME" /> szolgáltatásba az ügyféltanúsítvány exportálásához.</translation> +<translation id="1161699061380012396">Chrome OS beviteli módszere</translation> <translation id="1163931534039071049">&Keret forrásának megtekintése</translation> <translation id="1164674268730883318">Kikapcsolja a Smart Lockot a következőnél: <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">PUK-kód megadása</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Áruház-fiók</translation> <translation id="2509495747794740764">Az átméretezési értéknek 10 és 200 közötti számnak kell lennie.</translation> <translation id="2509566264613697683">8×</translation> -<translation id="2512222046227390255">Űrlapok automatikus kitöltése</translation> <translation id="2513403576141822879">A <ph name="BEGIN_LINK" />Szinkronizálás és Google<ph name="END_LINK" /> részben további beállításokat talál az adatvédelemre, biztonságra és adatgyűjtésre vonatkozóan</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Keresés</translation> @@ -1358,6 +1360,7 @@ <translation id="3020990233660977256">Sorozatszám: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Keret forrásának megtekintése</translation> <translation id="3022978424994383087">Nem értettem.</translation> +<translation id="3023464535986383522">Felolvasás</translation> <translation id="3024374909719388945">24 órás megjelenítés használata</translation> <translation id="302781076327338683">Újratöltés a gyorsítótár megkerülésével</translation> <translation id="3031417829280473749">X ügynök</translation> @@ -1754,6 +1757,7 @@ <translation id="363903084947548957">Következő beviteli mód</translation> <translation id="3640214691812501263">Hozzáadja a(z) „<ph name="EXTENSION_NAME" />” bővítményt a következő felhasználónál: <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Szélesség</translation> +<translation id="3645372836428131288">Óvatosan mozgassa ujját az ujjlenyomat újabb részének rögzítéséhez.</translation> <translation id="3648348069317717750">A rendszer <ph name="USB_DEVICE_NAME" /> eszközt észlelt</translation> <translation id="3649138363871392317">Egy fotó készült</translation> <translation id="3650952250015018111">A következőhöz való hozzáférés engedélyezése a(z) „<ph name="APP_NAME" />” számára:</translation> @@ -1949,7 +1953,6 @@ <translation id="3920504717067627103">Tanúsítvány-irányelvek</translation> <translation id="392089482157167418">A ChromeVox (beszélt visszajelzés) engedélyezése</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nincsenek mostanában rögzített WebRTC-naplói.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Rögzítés feloldása a polcon</translation> <translation id="3926002189479431949">A Smart Lockhoz használt telefon megváltozott</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Ló</translation> <translation id="4387004326333427325">A hitelesítési tanúsítvány távolról elutasítva</translation> <translation id="4389091756366370506"><ph name="VALUE" /> felhasználó</translation> +<translation id="439266289085815679">A Bluetooth-konfigurációt <ph name="USER_EMAIL" /> szabályozza.</translation> <translation id="4394049700291259645">Kikapcsolás</translation> <translation id="4400367121200150367">Itt jelennek meg azok a webhelyek, amelyeknél letiltotta a jelszavak mentését</translation> <translation id="4400632832271803360">A legfelső billentyűsor viselkedésének módosításához tartsa lenyomva az Indítót</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Annak engedélyezése, hogy a webhely továbbra is megtekinthesse a vágólapot</translation> <translation id="4530494379350999373">Eredet</translation> <translation id="4533985347672295764">Processzoridő</translation> +<translation id="4534661889221639075">Próbálja újra.</translation> <translation id="4535127706710932914">Alapértelmezett profil</translation> <translation id="4538417792467843292">Szó törlése</translation> <translation id="4538684596480161368">Mindig tiltsa le a nem sandboxban lévő beépülő modulokat a következő webhelyen: <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automatikus javítás</translation> <translation id="4880827082731008257">Keresés az előzmények között</translation> <translation id="4881695831933465202">Megnyitás</translation> +<translation id="4882312758060467256">Hozzáfér ehhez a webhelyhez</translation> <translation id="4882473678324857464">Váltás a könyvjelzőkre</translation> <translation id="4882831918239250449">Beállíthatja, hogy a rendszer hogyan szabja személyre a Keresést, a hirdetéseket és egyebeket a böngészési előzmények alapján</translation> <translation id="4883178195103750615">Könyvjelzők exportálása HTML-fájlba...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Megnyitás, amikor kész</translation> <translation id="4972129977812092092">Nyomtató szerkesztése</translation> +<translation id="4972164225939028131">Helytelen jelszó</translation> <translation id="497287958838527945">A Google Pay szolgáltatást használó hitelkártyák és címek.</translation> <translation id="4973307593867026061">Nyomtatók hozzáadása</translation> <translation id="4973523518332075481">Olyan nevet adjon meg, amely legfeljebb <ph name="MAX_LENGTH" /> karakter hosszú</translation> @@ -3019,6 +3026,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Alkalmazások betöltése…</translation> <translation id="5592595402373377407">Még nem áll rendelkezésre elég adat.</translation> +<translation id="5593357315997824387">Saját fájlok szinkronizálása</translation> <translation id="5595152862129936745">Nagyon messze</translation> <translation id="5595485650161345191">Cím szerkesztése</translation> <translation id="5596627076506792578">További lehetőségek</translation> @@ -3735,6 +3743,7 @@ <translation id="6664237456442406323">Sajnos számítógépe nem megfelelő formátumú hardverazonosítóval van konfigurálva. Emiatt a Chrome OS nem tud frissülni a legújabb biztonsági javításokkal, és számítógépét <ph name="BEGIN_BOLD" />rosszindulatú támadások érhetik<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Hiba történt a profil megnyitása során. Jelentkezzen ki, majd jelentkezzen be újra.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">időzítés leállítása</translation> <translation id="667517062706956822">Szeretné, hogy a Google lefordítsa az oldalt <ph name="SOURCE_LANGUAGE" /> nyelvről <ph name="TARGET_LANGUAGE" /> nyelvre?</translation> <translation id="6675665718701918026">Mutatóeszköz csatlakoztatva</translation> <translation id="6678717876183468697">Lekérdezés URL-je</translation> @@ -4061,6 +4070,7 @@ <translation id="7186088072322679094">Gomb megtartása az eszköztáron</translation> <translation id="7187428571767585875">Eltávolításra vagy módosításra kerülő beállításjegyzékbeli bejegyzések:</translation> <translation id="7189234443051076392">Győződjön meg arról, hogy elegendő tárhely áll rendelkezésre az eszközön</translation> +<translation id="7189965711416741966">Ujjlenyomat hozzáadva.</translation> <translation id="7191159667348037">Ismeretlen nyomtató (USB)</translation> <translation id="7191454237977785534">Mentés másként</translation> <translation id="7193374945610105795">Nincsenek mentett jelszavak a(z) <ph name="ORIGIN" /> webhelyhez</translation> @@ -4161,6 +4171,7 @@ <translation id="7339898014177206373">Új ablak</translation> <translation id="7340431621085453413">A <ph name="FULLSCREEN_ORIGIN" /> most teljes képernyős nézetben van.</translation> <translation id="7340650977506865820">A webhely megosztja a képernyőjét</translation> +<translation id="7341834142292923918">Hozzáférést kér ehhez a webhelyhez</translation> <translation id="7345706641791090287">Erősítse meg a jelszót</translation> <translation id="7346909386216857016">Rendben, értem</translation> <translation id="7347751611463936647">A kifejezés használatához írja be a következőt: "<ph name="EXTENSION_KEYWORD" />", ezután nyomja meg a TAB-ot, majd parancsát vagy keresését.</translation> @@ -4270,7 +4281,6 @@ <ph name="BEGIN_PARAGRAPH2" />A Google helymeghatározása olyan forrásokat használ az eszköze helyének megállapításához, mint amilyenek a Wi-Fi, a mobilhálózatok és az érzékelők. Ez a szolgáltatás akkor aktív, ha be van kapcsolva az eszköz Hely beállítása.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />A helymeghatározást úgy kapcsolhatja ki, hogy kikapcsolja eszközén a fő Hely beállítást. A Wi-Fi, a mobilhálózatok és érzékelők helymeghatározáshoz való használatát szintén a helybeállítások között kapcsolhatja ki.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Hozzon létre egy jelszót –</translation> -<translation id="7518150891539970662">WebRTC-naplók (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Létrehozás</translation> <translation id="7529411698175791732">Ellenőrizze az internetkapcsolatot. Ha a probléma továbbra is fennáll, próbáljon ki-, majd újra bejelentkezni.</translation> @@ -4748,6 +4758,7 @@ <translation id="8214962590150211830">Személy eltávolítása</translation> <translation id="8217399928341212914">Továbbra is tiltsa le több fájl automatikus letöltését</translation> <translation id="8223479393428528563">A fájlok offline használatra való mentéséhez lépjen fel újra az online felületre, kattintson jobb gombbal a fájlokra, és válassza a(z) <ph name="OFFLINE_CHECKBOX_NAME" /> lehetőséget.</translation> +<translation id="8225753906568652947">Ajánlatok beváltása</translation> <translation id="8226222018808695353">Tiltott</translation> <translation id="8226619461731305576">Nyomtatólista</translation> <translation id="8226742006292257240">Alább látható a véletlenszerűen generált TPM-jelszó, amelyet a számítógépéhez rendeltünk:</translation> @@ -4794,6 +4805,7 @@ <translation id="8286036467436129157">Bejelentkezés</translation> <translation id="8286963743045814739">Privát módban böngészhet, ha inkognitóablakot használ</translation> <translation id="82871696630048499">A rendszer újratöltötte a weboldalt, mert elfogyott a memória.</translation> +<translation id="8288032458496410887"><ph name="APP" /> eltávolítása…</translation> <translation id="8291967909914612644">Otthoni szolgáltató országa</translation> <translation id="8294431847097064396">Forrás</translation> <translation id="8297006494302853456">Gyenge</translation> @@ -4855,6 +4867,7 @@ <translation id="8413385045638830869">Kérdezzen rá (ajánlott)</translation> <translation id="8418445294933751433">&Megjelenítés lapként</translation> <translation id="8419098111404128271">Keresési találatok a következőre: <ph name="SEARCH_TEXT" /></translation> +<translation id="8419368276599091549">A(z) <ph name="DEVICE_TYPE" /> üdvözli!</translation> <translation id="8420060421540670057">Google Dokumentumok-fájlok megjelenítése</translation> <translation id="8424039430705546751">lefelé</translation> <translation id="8425213833346101688">Módosítás</translation> @@ -4981,6 +4994,7 @@ <translation id="8620765578342452535">Hálózati kapcsolatok beállítása</translation> <translation id="8624205858755890468">Engedélyezi a Segédnek a kapcsolódó információk, alkalmazások és műveletek megjelenítését.</translation> <translation id="862542460444371744">Bővítménye&k</translation> +<translation id="8626219642120025691">Időzítés kész</translation> <translation id="8627151598708688654">Forrás kiválasztása</translation> <translation id="862727964348362408">Felfüggesztett</translation> <translation id="862750493060684461">CSS gyorsítótár</translation> @@ -5101,6 +5115,7 @@ <translation id="8775404590947523323">A módosításokat automatikusan menti a rendszer.<ph name="BREAKS" />Az eredeti kép egy másolatának megtartásához törölje az "Eredeti felülírása" jelölőnégyzetet</translation> <translation id="8777628254805677039">root jelszó</translation> <translation id="8780443667474968681">A hangalapú keresés ki van kapcsolva.</translation> +<translation id="878068003854005405">Vágjon bele. Helyezze ujját az érzékelőre.</translation> <translation id="878069093594050299">Ezt a tanúsítványt a következő célokra lehet felhasználni:</translation> <translation id="8781980678064919987">Kikapcsolás, ha le van zárva a fedél</translation> <translation id="8782565991310229362">Kiosk-alkalmazás indítása visszavonva.</translation> @@ -5278,6 +5293,7 @@ <translation id="9050666287014529139">Összetett jelszó</translation> <translation id="9052208328806230490">Nyomtatóit regisztrálta a(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatásra a következő fiókkal: <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Letiltás fenntartása</translation> +<translation id="9053091947372579468">Eszköze tartalmaz Chrome-engedélyt, de felhasználóneve nincs társítva fiókhoz a Felügyeleti Konzolban. A regisztráció folytatásához hozzon létre egy fiókot a Felügyeleti Konzolban. Megjegyzés: Ha saját domain használatával hozza létre az új fiókot, a létrehozása után el kell végeznie a domainigazolási folyamatot is. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Jegyezze meg a döntésemet</translation> <translation id="9055636786322918818">Az RC4 titkosítás kényszerítése. A beállítás használata növeli a kockázatot, mivel az RC4-kódok nem biztonságosak.</translation> <translation id="9056034633062863292">A Chromebox frissítése</translation> @@ -5381,6 +5397,7 @@ <translation id="9218430445555521422">Beállítás alapértelmezettként</translation> <translation id="9219103736887031265">Képek</translation> <translation id="9220525904950070496">Fiók eltávolítása</translation> +<translation id="9220820413868316583">Emelje fel ujját, majd próbálja újra.</translation> <translation id="923467487918828349">Összes megjelenítése</translation> <translation id="928985544179707652">Bővítmények:</translation> <translation id="930268624053534560">Részletes időbélyegek</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index d1ec6934..2d39759 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Tidak ada jaringan</translation> <translation id="1056898198331236512">Peringatan</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Mendaftarkan sidik jari</translation> <translation id="1061904396131502319">Hampir waktunya istirahat</translation> <translation id="1062407476771304334">Ganti</translation> <translation id="1067048845568873861">Dibuat</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Berlian</translation> <translation id="1114335938027186412">Komputer Anda berisi perangkat keamanan Modul Platform Tepercaya (Trusted Platform Module/TPM), yang digunakan untuk menerapkan banyak fitur keamanan penting di Chrome OS. Kunjungi Pusat Bantuan Chromebook untuk mempelajari lebih lanjut: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Mode tidur saat penutup ditutup</translation> +<translation id="1115324527092594775">Siapkan Better Together</translation> <translation id="1116694919640316211">Tentang</translation> <translation id="1116779635164066733">Setelan ini diterapkan oleh ekstensi "<ph name="NAME" />".</translation> <translation id="111844081046043029">Yakin ingin meninggalkan halaman ini?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Waktu saat ini</translation> <translation id="1157102636231978136">Data dan aktivitas browsing internet Anda disinkronkan ke Akun Google</translation> <translation id="1161575384898972166">Masuklah ke <ph name="TOKEN_NAME" /> untuk mengeskpor sertifikat klien.</translation> +<translation id="1161699061380012396">Metode Masukan Chrome OS</translation> <translation id="1163931534039071049">&Lihat sumber bingkai</translation> <translation id="1164674268730883318">Nonaktifkan Smart Lock untuk <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Masukkan Kunci Pembuka PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Akun Google Play Store</translation> <translation id="2509495747794740764">Jumlah skala harus berupa angka antara 10 dan 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Formulir isi otomatis</translation> <translation id="2513403576141822879">Untuk setelan lainnya yang berkaitan dengan privasi, keamanan, dan pengumpulan data, lihat <ph name="BEGIN_LINK" />Sinkronisasi dan layanan Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Pindai</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Nomor Seri: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Lihat Sumber Bingkai</translation> <translation id="3022978424994383087">Tidak mengerti.</translation> +<translation id="3023464535986383522">Klik untuk Diucapkan</translation> <translation id="3024374909719388945">Gunakan model waktu 24 jam</translation> <translation id="302781076327338683">Muat ulang cache yang terlewati</translation> <translation id="3031417829280473749">Agen X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Metode masukan berikutnya</translation> <translation id="3640214691812501263">Tambahkan "<ph name="EXTENSION_NAME" />" untuk <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Lebar</translation> +<translation id="3645372836428131288">Gerakkan jari sedikit untuk menangkap bagian sidik jari yang lain.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> terdeteksi</translation> <translation id="3649138363871392317">Foto dijepret</translation> <translation id="3650952250015018111">Izinkan "<ph name="APP_NAME" />" untuk mengakses:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Kebijakan Sertifikat</translation> <translation id="392089482157167418">Aktifkan ChromeVox (masukan lisan)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Anda tidak memiliki log WebRTC yang direkam baru-baru ini.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Lepaskan pin dari Rak</translation> <translation id="3926002189479431949">Ponsel Smart Lock diubah</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Sembrani</translation> <translation id="4387004326333427325">Sertifikat atutentikasi ditolak dari jarak jauh</translation> <translation id="4389091756366370506">Pengguna <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfigurasi Bluetooth dikontrol oleh <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Nonaktifkan</translation> <translation id="4400367121200150367">Situs yang tidak pernah menyimpan sandi akan muncul di sini</translation> <translation id="4400632832271803360">Tahan tombol Peluncur untuk mengubah perilaku tombol baris atas</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Terus izinkan situs ini melihat papan klip</translation> <translation id="4530494379350999373">Asal</translation> <translation id="4533985347672295764">Waktu CPU</translation> +<translation id="4534661889221639075">Coba lagi.</translation> <translation id="4535127706710932914">Profil Default</translation> <translation id="4538417792467843292">Hapus kata</translation> <translation id="4538684596480161368">Selalu blokir plugin yang tidak dimasukkan kotak pasir di <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Perbaikan Otomatis</translation> <translation id="4880827082731008257">Telusuri histori</translation> <translation id="4881695831933465202">Buka</translation> +<translation id="4882312758060467256">Memiliki akses ke situs ini</translation> <translation id="4882473678324857464">Memfokuskan pada bookmark</translation> <translation id="4882831918239250449">Kontrol cara histori browsing digunakan untuk mempersonalisasi Penelusuran, iklan, dan lainnya</translation> <translation id="4883178195103750615">Ekspor bookmark ke file HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Buka setelah selesai</translation> <translation id="4972129977812092092">Edit printer</translation> +<translation id="4972164225939028131">Sandi salah</translation> <translation id="497287958838527945">Kartu kredit dan alamat yang menggunakan Google Pay.</translation> <translation id="4973307593867026061">Tambahkan printer</translation> <translation id="4973523518332075481">Gunakan nama yang terdiri dari <ph name="MAX_LENGTH" /> karakter atau kurang</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Memuat aplikasi...</translation> <translation id="5592595402373377407">Data yang tersedia belum cukup.</translation> +<translation id="5593357315997824387">Sinkronkan file saya</translation> <translation id="5595152862129936745">Sangat jauh</translation> <translation id="5595485650161345191">Edit alamat</translation> <translation id="5596627076506792578">Opsi lainnya</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Sayangnya, komputer Anda dikonfigurasi dengan ID hardware yang rusak. Hal ini mencegah Chrome OS memperbarui dengan perbaikan keamanan terbaru dan komputer Anda <ph name="BEGIN_BOLD" />mungkin rentan terhadap serangan berbahaya<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Terjadi kesalahan saat membuka profil Anda. Harap keluar, lalu masuk lagi.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">hentikan timer</translation> <translation id="667517062706956822">Ingin Google menerjemahkan halaman ini dari <ph name="SOURCE_LANGUAGE" /> ke <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Perangkat penunjuk telah tersambung</translation> <translation id="6678717876183468697">URL Kueri</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Tetap sematkan di Bilah Alat</translation> <translation id="7187428571767585875">Entri registry yang akan dihapus atau diubah:</translation> <translation id="7189234443051076392">Pastikan ruang di perangkat Anda mencukupi</translation> +<translation id="7189965711416741966">Sidik jari ditambahkan.</translation> <translation id="7191159667348037">Printer Tidak Dikenal (USB)</translation> <translation id="7191454237977785534">Simpan file sebagai</translation> <translation id="7193374945610105795">Tidak ada sandi yang tersimpan untuk <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Jendela baru</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> kini menjadi layar penuh.</translation> <translation id="7340650977506865820">Situs sedang membagikan layar</translation> +<translation id="7341834142292923918">Ingin mengakses situs ini</translation> <translation id="7345706641791090287">Konfirmasi sandi Anda</translation> <translation id="7346909386216857016">Oke, mengerti</translation> <translation id="7347751611463936647">Untuk menggunakan ekstensi ini, ketik "<ph name="EXTENSION_KEYWORD" />", lalu TAB, kemudian perintah atau penelusuran Anda.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Layanan lokasi Google menggunakan sumber seperti Wi-Fi, jaringan seluler, dan sensor guna membantu memperkirakan lokasi perangkat Anda. Layanan ini aktif saat Setelan lokasi perangkat Anda aktif.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Anda dapat menonaktifkan Lokasi dengan menonaktifkan Setelan lokasi utama di perangkat. Anda juga dapat menonaktifkan penggunaan Wi-Fi, jaringan seluler, dan sensor untuk lokasi di setelan lokasi.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Buat sandi -</translation> -<translation id="7518150891539970662">Log WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7525067979554623046">Buat</translation> <translation id="7529411698175791732">Periksa koneksi internet Anda. Jika masalah tetap berlanjut, coba logout lalu login lagi.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Hapus Orang ini</translation> <translation id="8217399928341212914">Lanjutkan memblokir download otomatis beberapa file</translation> <translation id="8223479393428528563">Untuk menyimpan file ini agar dapat digunakan saat offline, sambungkan ke internet, klik kanan pada file, dan pilih opsi <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Tukarkan penawaran Anda</translation> <translation id="8226222018808695353">Terlarang</translation> <translation id="8226619461731305576">Antrean</translation> <translation id="8226742006292257240">Di bawah adalah sandi TPM yang dibuat secara acak yang telah ditetapkan untuk komputer Anda:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Masuk</translation> <translation id="8286963743045814739">Anda dapat melakukan browsing rahasia menggunakan jendela samaran</translation> <translation id="82871696630048499">Halaman dimuat ulang karena kehabisan memori.</translation> +<translation id="8288032458496410887">Uninstal <ph name="APP" />...</translation> <translation id="8291967909914612644">Negara penyedia rumah</translation> <translation id="8294431847097064396">Sumber</translation> <translation id="8297006494302853456">Lemah</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Tanya dulu (disarankan)</translation> <translation id="8418445294933751433">Tampilkan &sebagai tab</translation> <translation id="8419098111404128271">Hasil penelusuran untuk '<ph name="SEARCH_TEXT" />'</translation> +<translation id="8419368276599091549">Selamat datang di <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Tampilkan file Google Dokumen</translation> <translation id="8424039430705546751">ke bawah</translation> <translation id="8425213833346101688">Ubah</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Konfigurasi sambungan jaringan</translation> <translation id="8624205858755890468">Mengaktifkan Asisten agar dapat menampilkan aplikasi, tindakan, dan info terkait.</translation> <translation id="862542460444371744">&Ekstensi</translation> +<translation id="8626219642120025691">Timer selesai</translation> <translation id="8627151598708688654">Pilih sumber</translation> <translation id="862727964348362408">Ditangguhkan</translation> <translation id="862750493060684461">Cache CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Editan Anda disimpan secara otomatis.<ph name="BREAKS" />Untuk menyimpan salinan dari gambar asli, hapus centang "Timpa yang asli"</translation> <translation id="8777628254805677039">sandi akar</translation> <translation id="8780443667474968681">Penelusuran suara telah dinonaktifkan.</translation> +<translation id="878068003854005405">Ayo kita mulai. Letakkan jari Anda pada sensor.</translation> <translation id="878069093594050299">Sertifikat ini telah diverifikasikan untuk penggunaan berikut:</translation> <translation id="8781980678064919987">Matikan saat penutup ditutup</translation> <translation id="8782565991310229362">Peluncuran aplikasi kios dibatalkan.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Frasa sandi</translation> <translation id="9052208328806230490">Anda telah mendaftarkan printer dengan <ph name="CLOUD_PRINT_NAME" /> menggunakan akun <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Lanjutkan pemblokiran</translation> +<translation id="9053091947372579468">Perangkat Anda menyertakan lisensi Chrome, tetapi nama pengguna Anda tidak dikaitkan dengan konsol Admin. Buat akun konsol Admin untuk melanjutkan pendaftaran. Catatan: Jika Anda memilih menggunakan domain sendiri untuk membuat akun konsol Admin baru, Anda juga harus menyelesaikan verifikasi domain setelah mendaftar. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Ingat pilihan saya</translation> <translation id="9055636786322918818">Terapkan enkripsi RC4. Penggunaan opsi ini akan meningkatkan risiko, karena cipher RC4 tidak aman.</translation> <translation id="9056034633062863292">Memperbarui Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Setel sebagai default</translation> <translation id="9219103736887031265">Gambar</translation> <translation id="9220525904950070496">Hapus akun</translation> +<translation id="9220820413868316583">Angkat, lalu coba lagi.</translation> <translation id="923467487918828349">Tampilkan Semua</translation> <translation id="928985544179707652">Ekstensi:</translation> <translation id="930268624053534560">Stempel Waktu Mendetail</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 35cdb064..22879bd 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nessuna rete</translation> <translation id="1056898198331236512">Avviso</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrazione dell'impronta digitale</translation> <translation id="1061904396131502319">È quasi ora di fare una pausa</translation> <translation id="1062407476771304334">Sostituisci</translation> <translation id="1067048845568873861">Data creazione</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamante</translation> <translation id="1114335938027186412">Il computer contiene un dispositivo di sicurezza TPM (Trusted Platform Module) che viene utilizzato per implementare in Chrome OS molte funzionalità di sicurezza fondamentali. Per ulteriori informazioni, visita il Centro assistenza Chromebook all'indirizzo: https://support.google.com/chromebook/?p=tpm.</translation> <translation id="1114525161406758033">Sospendi alla chiusura del coperchio</translation> +<translation id="1115324527092594775">Imposta Better Together</translation> <translation id="1116694919640316211">Informazioni</translation> <translation id="1116779635164066733">Questa impostazione è applicata dall'estensione "<ph name="NAME" />".</translation> <translation id="111844081046043029">Vuoi uscire dalla pagina?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Ora corrente</translation> <translation id="1157102636231978136">L'attività e i dati di navigazione sincronizzati con il tuo account Google</translation> <translation id="1161575384898972166">Accedi a <ph name="TOKEN_NAME" /> per esportare il certificato client.</translation> +<translation id="1161699061380012396">Metodo di immissione di Chrome OS</translation> <translation id="1163931534039071049">&Visualizza sorgente frame</translation> <translation id="1164674268730883318">Disattivare Smart Lock per <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Inserisci il codice di sblocco PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Account Google Play Store</translation> <translation id="2509495747794740764">Il valore Scala deve essere un numero compreso tra 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Compilare moduli automaticamente</translation> <translation id="2513403576141822879">Per altre impostazioni relative a privacy, sicurezza e raccolta dei dati, consulta la sezione <ph name="BEGIN_LINK" />Sincronizzazione e servizi Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scansiona</translation> @@ -1356,6 +1358,7 @@ <translation id="3020990233660977256">Numero di serie: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Visualizza sorgente frame</translation> <translation id="3022978424994383087">Non ho capito.</translation> +<translation id="3023464535986383522">Seleziona per ascoltare</translation> <translation id="3024374909719388945">Usa orologio 24 ore</translation> <translation id="302781076327338683">Ricarica ignorando la cache</translation> <translation id="3031417829280473749">Agente X</translation> @@ -1750,6 +1753,7 @@ <translation id="363903084947548957">Metodo di immissione successivo</translation> <translation id="3640214691812501263">Aggiungere "<ph name="EXTENSION_NAME" />" per <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Larghezza</translation> +<translation id="3645372836428131288">Muovi leggermente il dito per acquisire una parte diversa dell'impronta digitale.</translation> <translation id="3648348069317717750">Rilevato dispositivo <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">La foto è stata scattata</translation> <translation id="3650952250015018111">Consenti a "<ph name="APP_NAME" />" di accedere a:</translation> @@ -1945,7 +1949,6 @@ <translation id="3920504717067627103">Criteri dei certificati</translation> <translation id="392089482157167418">Attiva ChromeVox (lettura vocale)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Non hai log WebRTC acquisiti di recente.</translation> <translation id="3925573269917483990">Fotocamera:</translation> <translation id="3925842537050977900">Stacca dallo shelf</translation> <translation id="3926002189479431949">Telefono con Smart Lock cambiato</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">Furia</translation> <translation id="4387004326333427325">Certificato di autenticazione rifiutato da remoto</translation> <translation id="4389091756366370506">Utente <ph name="VALUE" /></translation> +<translation id="439266289085815679">Configurazione Bluetooth controllata da <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Disabilita</translation> <translation id="4400367121200150367">I siti che non salvano mai le password verranno visualizzati qui</translation> <translation id="4400632832271803360">Tieni premuto il tasto Avvio applicazioni per modificare la funzione dei tasti della fila superiore.</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">Continua a consentire a questo sito di leggere gli appunti</translation> <translation id="4530494379350999373">Origine</translation> <translation id="4533985347672295764">Tempo di CPU</translation> +<translation id="4534661889221639075">Riprova.</translation> <translation id="4535127706710932914">Profilo predefinito</translation> <translation id="4538417792467843292">Elimina parola</translation> <translation id="4538684596480161368">Blocca sempre i plug-in senza sandbox su <ph name="HOST" /></translation> @@ -2523,6 +2528,7 @@ <translation id="4880520557730313061">Correzione automatica</translation> <translation id="4880827082731008257">Cerca nella cronologia</translation> <translation id="4881695831933465202">Apri</translation> +<translation id="4882312758060467256">Ha accesso a questo sito</translation> <translation id="4882473678324857464">Evidenzia preferiti</translation> <translation id="4882831918239250449">Controlla il modo in cui la cronologia di navigazione viene utilizzata per personalizzare la Ricerca, gli annunci e altro ancora</translation> <translation id="4883178195103750615">Esporta i preferiti in file HTML...</translation> @@ -2588,6 +2594,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Apri al termine</translation> <translation id="4972129977812092092">Modifica stampante</translation> +<translation id="4972164225939028131">Password errata</translation> <translation id="497287958838527945">Carte di credito e indirizzi che utilizzano Google Pay.</translation> <translation id="4973307593867026061">Aggiungi stampanti</translation> <translation id="4973523518332075481">Il nome deve contenere un massimo di <ph name="MAX_LENGTH" /> caratteri</translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Caricamento app...</translation> <translation id="5592595402373377407">Dati disponibili insufficienti.</translation> +<translation id="5593357315997824387">Sincronizza i miei file</translation> <translation id="5595152862129936745">Molto lontano</translation> <translation id="5595485650161345191">Modifica indirizzo</translation> <translation id="5596627076506792578">Altre opzioni</translation> @@ -3729,6 +3737,7 @@ <translation id="6664237456442406323">Purtroppo il tuo computer è configurato con un ID hardware non valido. Ciò impedisce a Chrome OS di aggiornarsi con le ultime correzioni relative alla sicurezza e il tuo computer <ph name="BEGIN_BOLD" />potrebbe essere vulnerabile ad attacchi dannosi<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Si è verificato un problema durante l'apertura del profilo. Esci e accedi di nuovo.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">interrompi timer</translation> <translation id="667517062706956822">Vuoi che Google traduca la pagina da <ph name="SOURCE_LANGUAGE" /> in <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Dispositivo di puntamento collegato</translation> <translation id="6678717876183468697">URL query</translation> @@ -4055,6 +4064,7 @@ <translation id="7186088072322679094">Mantieni in barra degli strumenti</translation> <translation id="7187428571767585875">Voci del registro da rimuovere o modificare:</translation> <translation id="7189234443051076392">Assicurati di avere spazio sufficiente sul dispositivo</translation> +<translation id="7189965711416741966">Impronta digitale aggiunta.</translation> <translation id="7191159667348037">Stampante sconosciuta (USB)</translation> <translation id="7191454237977785534">Salva file con nome</translation> <translation id="7193374945610105795">Nessuna password salvata per il sito <ph name="ORIGIN" /></translation> @@ -4155,6 +4165,7 @@ <translation id="7339898014177206373">Nuova finestra</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ora è a schermo intero.</translation> <translation id="7340650977506865820">Il sito sta condividendo lo schermo</translation> +<translation id="7341834142292923918">Vuole accedere a questo sito</translation> <translation id="7345706641791090287">Conferma la password</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">Per utilizzare questa estensione, digita "<ph name="EXTENSION_KEYWORD" />", quindi TAB, poi il tuo comando o la tua ricerca.</translation> @@ -4264,7 +4275,6 @@ <ph name="BEGIN_PARAGRAPH2" />Il servizio di geolocalizzazione di Google utilizza fonti quali le reti Wi-Fi e mobili o i sensori per stabilire la posizione del dispositivo. Il servizio è attivo quando l'impostazione Posizione del dispositivo è attiva.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Puoi disattivare la geolocalizzazione disattivando l'impostazione Posizione principale del dispositivo. Puoi anche disattivare l'uso di reti Wi-Fi e mobili e di sensori per la geolocalizzazione nelle impostazioni di geolocalizzazione.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Crea una password -</translation> -<translation id="7518150891539970662">Log WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Crea</translation> <translation id="7529411698175791732">Controlla la connessione a Internet. Se il problema persiste, prova a uscire e ad accedere di nuovo.</translation> @@ -4740,6 +4750,7 @@ <translation id="8214962590150211830">Rimuovi questa persona</translation> <translation id="8217399928341212914">Continua a bloccare download automatici di più file</translation> <translation id="8223479393428528563">Per salvare i file da utilizzare offline, torna online, fai clic con il pulsante destro del mouse sui file e seleziona l'opzione <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Utilizza le tue offerte</translation> <translation id="8226222018808695353">Vietato</translation> <translation id="8226619461731305576">Coda</translation> <translation id="8226742006292257240">Di seguito viene indicata la password TPM generata in modo casuale che è stata assegnata al tuo computer:</translation> @@ -4786,6 +4797,7 @@ <translation id="8286036467436129157">Accedi</translation> <translation id="8286963743045814739">Puoi navigare in privato usando una finestra di navigazione in incognito</translation> <translation id="82871696630048499">La pagina web è stata ricaricata perché ha esaurito la memoria.</translation> +<translation id="8288032458496410887">Disinstallare <ph name="APP" />…</translation> <translation id="8291967909914612644">Paese del provider principale</translation> <translation id="8294431847097064396">Origine</translation> <translation id="8297006494302853456">Debole</translation> @@ -4847,6 +4859,7 @@ <translation id="8413385045638830869">Chiedi prima (opzione consigliata)</translation> <translation id="8418445294933751433">&Mostra come scheda</translation> <translation id="8419098111404128271">Risultati di ricerca per "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Ti diamo il benvenuto sul tuo <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Visualizza file Google Documenti</translation> <translation id="8424039430705546751">giù</translation> <translation id="8425213833346101688">Cambia</translation> @@ -4973,6 +4986,7 @@ <translation id="8620765578342452535">Configura connessioni di rete</translation> <translation id="8624205858755890468">Consente all'assistente di mostrarti azioni, app e informazioni correlate.</translation> <translation id="862542460444371744">&Estensioni</translation> +<translation id="8626219642120025691">Timer creato</translation> <translation id="8627151598708688654">Seleziona fonte</translation> <translation id="862727964348362408">Sospeso</translation> <translation id="862750493060684461">Cache CSS</translation> @@ -5093,6 +5107,7 @@ <translation id="8775404590947523323">Le modifiche vengono salvate automaticamente.<ph name="BREAKS" />Per conservare una copia dell'immagine originale, deseleziona l'opzione "Sovrascrivi originale".</translation> <translation id="8777628254805677039">password root</translation> <translation id="8780443667474968681">La ricerca vocale è stata disattivata.</translation> +<translation id="878068003854005405">Inizia. Posiziona il dito sul sensore.</translation> <translation id="878069093594050299">Questo certificato è stato verificato per i seguenti utilizzi:</translation> <translation id="8781980678064919987">Spegni alla chiusura del coperchio</translation> <translation id="8782565991310229362">Avvio dell'applicazione kiosk annullato.</translation> @@ -5270,6 +5285,7 @@ <translation id="9050666287014529139">Passphrase</translation> <translation id="9052208328806230490">Hai registrato le stampanti con <ph name="CLOUD_PRINT_NAME" /> utilizzando l'account <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Continua a bloccare</translation> +<translation id="9053091947372579468">Il tuo dispositivo include una licenza Chrome, ma il tuo nome utente non è associato a una console di amministrazione. Crea una console di amministrazione per procedere con la registrazione. Nota: se scegli di utilizzare il tuo dominio per creare un nuovo account Console di amministrazione, devi completare anche la verifica del dominio dopo la registrazione. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Memorizza la mia scelta</translation> <translation id="9055636786322918818">Applica la crittografia RC4. Se scegli di utilizzare quest'opzione vai incontro a un rischio maggiore, in quanto le crittografie RC4 non sono sicure.</translation> <translation id="9056034633062863292">Aggiornamento del Chromebox</translation> @@ -5373,6 +5389,7 @@ <translation id="9218430445555521422">Imposta come predefinito</translation> <translation id="9219103736887031265">Immagini</translation> <translation id="9220525904950070496">Rimuovi account</translation> +<translation id="9220820413868316583">Solleva, quindi riprova.</translation> <translation id="923467487918828349">Mostra tutte</translation> <translation id="928985544179707652">Estensioni:</translation> <translation id="930268624053534560">Timestamp dettagliati</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 239f617..b1901e2 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">אין רשתות</translation> <translation id="1056898198331236512">אזהרה</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">רישום טביעת אצבע</translation> <translation id="1061904396131502319">עוד מעט זמן להפסקה</translation> <translation id="1062407476771304334">החלף</translation> <translation id="1067048845568873861">נוצר</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">יהלום</translation> <translation id="1114335938027186412">המחשב שלך מכיל התקן אבטחה מסוג Trusted Platform Module (TPM), המשמש ליישם תכונות אבטחה קריטיות רבות במערכת ההפעלה של Chrome. היכנס למרכז העזרה של Chromebook כדי לקבל מידע נוסף: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">מצב שינה מופעל כשהמכסה סגור</translation> +<translation id="1115324527092594775">הגדרת Better Together</translation> <translation id="1116694919640316211">מידע כללי</translation> <translation id="1116779635164066733">התוסף "<ph name="NAME" />" אוכף את ההגדרה הזו.</translation> <translation id="111844081046043029">האם אתה בטוח שברצונך לצאת מדף זה?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">שעה נוכחית</translation> <translation id="1157102636231978136">סינכרון הנתונים ופעילות הגלישה עם חשבון Google שלך</translation> <translation id="1161575384898972166">היכנס אל <ph name="TOKEN_NAME" /> כדי לייצא את אישור הלקוח.</translation> +<translation id="1161699061380012396">שיטת הקלט של Chrome OS</translation> <translation id="1163931534039071049">&צפה במקור המסגרת</translation> <translation id="1164674268730883318">האם לכבות את Smart Lock ב-<ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">הזן מפתח לביטול נעילת ה-PIN</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">חשבון בחנות Google Play</translation> <translation id="2509495747794740764">שיעור קנה המידה חייב להיות מספר בין 10 ל-200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">מילוי אוטומטי של טפסים</translation> <translation id="2513403576141822879">אפשר למצוא הגדרות נוספות בנושא פרטיות, אבטחה ואיסוף נתונים בדף <ph name="BEGIN_LINK" />סנכרון ושירותי Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">סריקה</translation> @@ -1354,6 +1356,7 @@ <translation id="3020990233660977256">מספר סידורי: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&הצג את מקור המסגרת</translation> <translation id="3022978424994383087">ההודעה שלך לא ברורה.</translation> +<translation id="3023464535986383522">הקראה</translation> <translation id="3024374909719388945">השתמש בשעון של 24 שעות</translation> <translation id="302781076327338683">טען מחדש מטמון עוקף</translation> <translation id="3031417829280473749">סוכנת X</translation> @@ -1750,6 +1753,7 @@ <translation id="363903084947548957">שיטת הקלט הבאה</translation> <translation id="3640214691812501263">האם להוסיף את "<ph name="EXTENSION_NAME" />" בשביל <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">רוחב</translation> +<translation id="3645372836428131288">יש להזיז קצת את האצבע כדי לסרוק חלק אחר של טביעת האצבע.</translation> <translation id="3648348069317717750">המערכת זיהתה את <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">צולמה תמונה</translation> <translation id="3650952250015018111">הענקת גישה ל-"<ph name="APP_NAME" />":</translation> @@ -1945,7 +1949,6 @@ <translation id="3920504717067627103">מדיניות אישורים </translation> <translation id="392089482157167418">הפעל את ChromeVox (משוב קולי)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">אין לך יומני WebRTC שתועדו לאחרונה.</translation> <translation id="3925573269917483990">מצלמה:</translation> <translation id="3925842537050977900">בטל את ההצמדה למדף</translation> <translation id="3926002189479431949">הטלפון המשמש ל-Smart Lock הוחלף</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">אביר</translation> <translation id="4387004326333427325">אישור האימות נדחה מרחוק</translation> <translation id="4389091756366370506"><ph name="VALUE" /> משתמש</translation> +<translation id="439266289085815679">הגדרת ה-Bluetooth היא בשליטת <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">השבת</translation> <translation id="4400367121200150367">כאן יופיעו האתרים שאף פעם אינם שומרים סיסמאות</translation> <translation id="4400632832271803360">החזק את מקש מפעיל האפליקציות כדי לשנות את ההתנהגות של מקשי השורה העליונה</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">האתר הזה יוכל להמשיך לגשת ללוח</translation> <translation id="4530494379350999373">מקור</translation> <translation id="4533985347672295764">זמן CPU (יחידת עיבוד מרכזית)</translation> +<translation id="4534661889221639075">יש לנסות שוב.</translation> <translation id="4535127706710932914">פרופיל ברירת מחדל</translation> <translation id="4538417792467843292">מחק מילה</translation> <translation id="4538684596480161368">חסום תמיד יישומי פלאגין ללא ארגז חול ב-<ph name="HOST" /></translation> @@ -2523,6 +2528,7 @@ <translation id="4880520557730313061">תיקון אוטומטי</translation> <translation id="4880827082731008257">חפש בהיסטוריה</translation> <translation id="4881695831933465202">פתח</translation> +<translation id="4882312758060467256">יש גישה לאתר הזה</translation> <translation id="4882473678324857464">התמקד בסימניות</translation> <translation id="4882831918239250449">הגדרת השימוש בהיסטוריית הגלישה לצורך התאמה אישית של החיפוש, המודעות ועוד</translation> <translation id="4883178195103750615">יצוא סימניות לקובץ HTML...</translation> @@ -2588,6 +2594,7 @@ <translation id="4969785127455456148">אלבום</translation> <translation id="4971412780836297815">פתח בסיום</translation> <translation id="4972129977812092092">עריכת מדפסת</translation> +<translation id="4972164225939028131">סיסמה שגויה</translation> <translation id="497287958838527945">כרטיסי אשראי וכתובות דרך Google Pay.</translation> <translation id="4973307593867026061">הוסף מדפסות</translation> <translation id="4973523518332075481">יש להשתמש בשם באורך <ph name="MAX_LENGTH" /> תווים לכל היותר</translation> @@ -3016,6 +3023,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">המערכת טוענת אפליקציות...</translation> <translation id="5592595402373377407">אין עדיין מספיק נתונים זמינים.</translation> +<translation id="5593357315997824387">סנכרון הקבצים שלי</translation> <translation id="5595152862129936745">רחוק מאוד</translation> <translation id="5595485650161345191">ערוך כתובת</translation> <translation id="5596627076506792578">אפשרויות נוספות</translation> @@ -3731,6 +3739,7 @@ <translation id="6664237456442406323">לצערנו, המחשב שלך מוגדר עם זיהוי חומרה פגום. המצב הזה מונע ממערכת ההפעלה של Chrome להתקין את עדכוני האבטחה האחרונים, וייתכן שהמחשב שלך יהיה <ph name="BEGIN_BOLD" />חשוף להתקפות זדוניות<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">משהו השתבש בפתיחת הפרופיל שלך. צא ולאחר מכן היכנס מחדש.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">הפסקת הטיימר</translation> <translation id="667517062706956822">האם תרצה ש-Google תתרגם דף זה מ<ph name="SOURCE_LANGUAGE" /> ל<ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">התקן הצבעה מחובר</translation> <translation id="6678717876183468697">כתובת אתר של שאילתה</translation> @@ -4057,6 +4066,7 @@ <translation id="7186088072322679094">השאר בסרגל הכלים</translation> <translation id="7187428571767585875">ערכים בקובץ הרישום שיש להסיר או לשנות:</translation> <translation id="7189234443051076392">צריך לוודא שיש מספיק מקום פנוי במכשיר</translation> +<translation id="7189965711416741966">טביעת האצבע נוספה.</translation> <translation id="7191159667348037">מדפסת לא ידועה (USB)</translation> <translation id="7191454237977785534">שמירה בשם</translation> <translation id="7193374945610105795">לא נשמרו סיסמאות בשביל <ph name="ORIGIN" /></translation> @@ -4157,6 +4167,7 @@ <translation id="7339898014177206373">חלון חדש</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> הוא במסך מלא כעת.</translation> <translation id="7340650977506865820">האתר משתף את המסך שלך</translation> +<translation id="7341834142292923918">רוצה גישה לאתר הזה</translation> <translation id="7345706641791090287">אשר את הסיסמה שלך</translation> <translation id="7346909386216857016">בסדר, הבנתי</translation> <translation id="7347751611463936647">כדי להשתמש בתוסף זה, הקלד "<ph name="EXTENSION_KEYWORD" />", לאחר מכן הקש TAB ולאחר מכן הקלד את הפקודה או מונח החיפוש.</translation> @@ -4266,7 +4277,6 @@ <ph name="BEGIN_PARAGRAPH2" />שירות המיקום של Google משתמש במקורות כמו Wi-Fi, רשתות סלולריות וחיישנים כדי להעריך את מיקום המכשיר. השירות הזה פעיל אם הפעלת את הגדרת המיקום במכשיר.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />ניתן לכבות את המיקום על-ידי כיבוי של הגדרת המיקום הראשית במכשיר. בהגדרות המיקום ניתן גם לבטל את השימוש ב-Wi-Fi, ברשתות סלולריות ובחיישנים לאיתור המיקום.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">צור סיסמה -</translation> -<translation id="7518150891539970662">יומני WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">צור</translation> <translation id="7529411698175791732">בדוק את חיבור האינטרנט. אם הבעיה לא נפתרת, נסה לצאת מהחשבון ולהיכנס אליו שוב.</translation> @@ -4741,6 +4751,7 @@ <translation id="8214962590150211830">הסר משתמש זה</translation> <translation id="8217399928341212914">המשך לחסום הורדות אוטומטיות של קבצים מרובים</translation> <translation id="8223479393428528563">כדי לשמור קבצים אלה לשימוש לא מקוון, חזור למצב מקוון, לחץ לחיצה ימנית על הקבצים ובחר את האפשרות <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">מימוש המבצעים שלך</translation> <translation id="8226222018808695353">אסור</translation> <translation id="8226619461731305576">תור</translation> <translation id="8226742006292257240">סיסמת TPM שנוצרה באקראי והוקצתה למחשב שלך:</translation> @@ -4787,6 +4798,7 @@ <translation id="8286036467436129157">כניסה</translation> <translation id="8286963743045814739">אפשר לגלוש בפרטיות בעזרת חלון גלישה בסתר</translation> <translation id="82871696630048499">לדף האינטרנט הזה נגמר הזיכרון, כך שהוא נטען מחדש.</translation> +<translation id="8288032458496410887">הסרת <ph name="APP" />...</translation> <translation id="8291967909914612644">המדינה של הספק הביתי</translation> <translation id="8294431847097064396">מקור</translation> <translation id="8297006494302853456">חלש</translation> @@ -4848,6 +4860,7 @@ <translation id="8413385045638830869">שאל תחילה (מומלץ)</translation> <translation id="8418445294933751433">&הצג ככרטיסייה</translation> <translation id="8419098111404128271">תוצאות לחיפוש "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">ה-<ph name="DEVICE_TYPE" /> שלך מוכן להגדרה.</translation> <translation id="8420060421540670057">הצג קובצי Google Docs</translation> <translation id="8424039430705546751">למטה</translation> <translation id="8425213833346101688">שנה</translation> @@ -4974,6 +4987,7 @@ <translation id="8620765578342452535">הגדרת חיבורי רשת</translation> <translation id="8624205858755890468">מאפשר ל-Assistant להציג לך פעולות, אפליקציות ופרטים קשורים.</translation> <translation id="862542460444371744">&תוספים</translation> +<translation id="8626219642120025691">הטיימר סיים</translation> <translation id="8627151598708688654">בחירת מקור</translation> <translation id="862727964348362408">מושעה</translation> <translation id="862750493060684461">מטמון של CSS</translation> @@ -5094,6 +5108,7 @@ <translation id="8775404590947523323">שינויי העריכה שלך נשמרים אוטומטית.<ph name="BREAKS" />כדי לשמור עותק של התמונה המקורית, בטל את הסימון של "החלף קובץ מקורי"</translation> <translation id="8777628254805677039">סיסמת root</translation> <translation id="8780443667474968681">החיפוש הקולי הושבת.</translation> +<translation id="878068003854005405">שנתחיל? צריך להניח את האצבע על החיישן.</translation> <translation id="878069093594050299">אישור זה אומת לשימושים הבאים:</translation> <translation id="8781980678064919987">כיבוי כשהמכסה סגור</translation> <translation id="8782565991310229362">ההפעלה של יישום קיוסק בוטלה.</translation> @@ -5271,6 +5286,7 @@ <translation id="9050666287014529139">משפט-סיסמה</translation> <translation id="9052208328806230490">רשמת את המדפסות שלך ב-<ph name="CLOUD_PRINT_NAME" /> באמצעות החשבון <ph name="EMAIL" /></translation> <translation id="9052404922357793350">המשך חסימה</translation> +<translation id="9053091947372579468">המכשיר כולל רישיון של Chrome, אבל שם המשתמש שלך לא משויך למסוף ניהול. צריך ליצור חשבון מסוף ניהול כדי להמשיך בהרשמה. הערה: אם ברצונך להשתמש בדומיין משלך ליצירת חשבון מסוף ניהול, צריך גם להשלים את אימות הדומיין אחרי ההרשמה. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">זכור את הבחירה שלי</translation> <translation id="9055636786322918818">אכיפה של הצפנת RC4. שימוש באפשרות הזו מגדילה את הסיכון, כי הצפנות RC4 אינן מאובטחות.</translation> <translation id="9056034633062863292">עדכון Chromebox</translation> @@ -5374,6 +5390,7 @@ <translation id="9218430445555521422">הגדר כברירת מחדל</translation> <translation id="9219103736887031265">תמונות</translation> <translation id="9220525904950070496">הסר חשבון</translation> +<translation id="9220820413868316583">צריך להרים את האצבע ולנסות שוב.</translation> <translation id="923467487918828349">הצג הכל</translation> <translation id="928985544179707652">תוספים:</translation> <translation id="930268624053534560">חותמות זמן מפורטות</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index e9bae4b5..63f45af 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">ネットワークが見つかりません</translation> <translation id="1056898198331236512">警告</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">指紋の登録</translation> <translation id="1061904396131502319">もうすぐ休憩の時間です</translation> <translation id="1062407476771304334">置換</translation> <translation id="1067048845568873861">作成日</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">ひし形</translation> <translation id="1114335938027186412">ご使用のパソコンには Trusted Platform Module(TPM)セキュリティ デバイスが組み込まれています。これは Chrome OS の多くの重要なセキュリティ機能を実装するために使用されます。詳しくは Chromebook ヘルプセンター(https://support.google.com/chromebook/?p=tpm)をご覧ください。</translation> <translation id="1114525161406758033">ディスプレイを閉じたときにスリープ状態にする</translation> +<translation id="1115324527092594775">Better Together の設定</translation> <translation id="1116694919640316211">概要</translation> <translation id="1116779635164066733">この設定は拡張機能「<ph name="NAME" />」により制御されています。</translation> <translation id="111844081046043029">このページから移動してもよろしいですか?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">現在の時刻</translation> <translation id="1157102636231978136">閲覧データとアクティビティ(Google アカウントに同期)</translation> <translation id="1161575384898972166">クライアント証明書をエクスポートするには <ph name="TOKEN_NAME" /> にログインしてください。</translation> +<translation id="1161699061380012396">Chrome OS の入力方法</translation> <translation id="1163931534039071049">フレームのソースを表示(&V)</translation> <translation id="1164674268730883318">Smart Lock for <ph name="DEVICE_TYPE" /> を無効にしますか?</translation> <translation id="1164899421101904659">PIN ロック解除キーを入力</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play ストア アカウント</translation> <translation id="2509495747794740764">倍率は 10~200 の数値で指定してください。</translation> <translation id="2509566264613697683">8 倍</translation> -<translation id="2512222046227390255">フォームへの自動入力</translation> <translation id="2513403576141822879">プライバシー、セキュリティ、データ収集に関連するその他の設定については、<ph name="BEGIN_LINK" />同期と Google サービス<ph name="END_LINK" />をご覧ください</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">スキャン</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">シリアル番号: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">フレームのソースを表示(&V)</translation> <translation id="3022978424994383087">聞き取れませんでした。</translation> +<translation id="3023464535986383522">選択して読み上げ</translation> <translation id="3024374909719388945">24 時間形式を使用する</translation> <translation id="302781076327338683">キャッシュを回避して再読み込み</translation> <translation id="3031417829280473749">エージェント X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">次の入力方法</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> さんのアイテムとして「<ph name="EXTENSION_NAME" />」を追加しますか?</translation> <translation id="3644896802912593514">幅</translation> +<translation id="3645372836428131288">指紋の別の部分を登録するため、指を少し移動してください。</translation> <translation id="3648348069317717750">「<ph name="USB_DEVICE_NAME" />」を検出しました</translation> <translation id="3649138363871392317">写真を撮りました</translation> <translation id="3650952250015018111">「<ph name="APP_NAME" />」のアクセスを許可する:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">証明書ポリシー</translation> <translation id="392089482157167418">ChromeVox(音声フィードバック)を有効にする</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">最近記録された WebRTC ログはありません。</translation> <translation id="3925573269917483990">カメラ:</translation> <translation id="3925842537050977900">シェルフの固定解除</translation> <translation id="3926002189479431949">Smart Lock 用のスマートフォンが変更されました</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">サラトガ</translation> <translation id="4387004326333427325">認証証明書がリモートで拒否されました</translation> <translation id="4389091756366370506">ユーザー <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth 設定は <ph name="USER_EMAIL" /> によって管理されています。</translation> <translation id="4394049700291259645">無効にする</translation> <translation id="4400367121200150367">パスワードを保存していないサイトがここに表示されます</translation> <translation id="4400632832271803360">キーボードの最上段にあるキーの動作を切り替えるには、ランチャー キーを押したままにします</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">このサイトによるクリップボードへのアクセスを今後も許可する</translation> <translation id="4530494379350999373">発行元:</translation> <translation id="4533985347672295764">CPU 時間</translation> +<translation id="4534661889221639075">もう一度お試しください。</translation> <translation id="4535127706710932914">デフォルトのプロフィール</translation> <translation id="4538417792467843292">1 語削除する</translation> <translation id="4538684596480161368"><ph name="HOST" /> でサンドボックスの無効化プラグインを常にブロックする</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">自動修正</translation> <translation id="4880827082731008257">履歴を検索</translation> <translation id="4881695831933465202">開く</translation> +<translation id="4882312758060467256">このサイトへのアクセスが許可されています</translation> <translation id="4882473678324857464">ブックマークにフォーカスを移す</translation> <translation id="4882831918239250449">検索、広告などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="4883178195103750615">HTML ファイルにブックマークをエクスポート...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">アルバム</translation> <translation id="4971412780836297815">完了後に開く</translation> <translation id="4972129977812092092">プリンタの編集</translation> +<translation id="4972164225939028131">パスワードが違います</translation> <translation id="497287958838527945">Google Pay のクレジット カードと住所</translation> <translation id="4973307593867026061">プリンタを追加</translation> <translation id="4973523518332075481">名前は <ph name="MAX_LENGTH" /> 文字以内で指定してください</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">アプリを読み込んでいます...</translation> <translation id="5592595402373377407">利用可能なデータがまだ十分にありません。</translation> +<translation id="5593357315997824387">ファイルを同期</translation> <translation id="5595152862129936745">非常に遠い</translation> <translation id="5595485650161345191">住所の編集</translation> <translation id="5596627076506792578">その他のオプション</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">パソコンに設定されているハードウェア ID の形式が正しくありません。このため、Chrome OS に最新のセキュリティ修正を適用することができません。お使いのパソコンは、<ph name="BEGIN_BOLD" />悪意のある攻撃を受けやすくなる可能性があります<ph name="END_BOLD" />。</translation> <translation id="6664774537677393800">プロフィールを開こうとして問題が発生しました。ログアウトしてから再度ログインしてください。</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" />(USB)</translation> +<translation id="6674412557034343536">タイマーを止めて</translation> <translation id="667517062706956822">Google でこのページを <ph name="SOURCE_LANGUAGE" /> から <ph name="TARGET_LANGUAGE" /> に翻訳しますか?</translation> <translation id="6675665718701918026">ポインティング デバイスが接続されました</translation> <translation id="6678717876183468697">クエリ URL</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">ツールバーに残す</translation> <translation id="7187428571767585875">削除または変更されるレジストリ項目:</translation> <translation id="7189234443051076392">端末に十分な空き容量があることを確認してください</translation> +<translation id="7189965711416741966">指紋の登録が完了しました。</translation> <translation id="7191159667348037">不明なプリンタ(USB)</translation> <translation id="7191454237977785534">名前を付けて保存</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> 用に保存されているパスワードはありません</translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">新しいウィンドウ</translation> <translation id="7340431621085453413">現在 <ph name="FULLSCREEN_ORIGIN" /> は全画面表示です。</translation> <translation id="7340650977506865820">サイトで画面が共有されています</translation> +<translation id="7341834142292923918">このサイトへのアクセス許可が必要です</translation> <translation id="7345706641791090287">パスワードを再入力</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">この拡張機能を使用するには、「<ph name="EXTENSION_KEYWORD" />」と入力して Tab キーを押してからコマンドまたは検索キーワードを入力してください。</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google の位置情報サービスでは、端末の現在地を推定するために、Wi-Fi、モバイル ネットワーク、センサーなどの情報源が使用されます。このサービスは、端末の位置情報の設定がオンの場合に有効です。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />位置情報をオフにするには、端末でメインの位置情報の設定をオフにします。位置情報の設定では、Wi‑Fi、モバイル ネットワーク、センサーを使用した現在地の特定をオフにすることもできます。<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">パスワードを作成 -</translation> -<translation id="7518150891539970662">WebRTC ログ(<ph name="WEBRTC_LOG_COUNT" /> 件)</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7525067979554623046">作成</translation> <translation id="7529411698175791732">インターネット接続を確認してください。問題が解消しない場合は、ログアウトして再度ログインしてみてください。</translation> @@ -4747,6 +4757,7 @@ <translation id="8214962590150211830">このユーザーを削除</translation> <translation id="8217399928341212914">複数ファイルの自動ダウンロードを今後もブロックする</translation> <translation id="8223479393428528563">これらのファイルを保存してオフラインで使用できるようにするには、オンラインに戻ってファイルを右クリックし、[<ph name="OFFLINE_CHECKBOX_NAME" />] オプションを選択します。</translation> +<translation id="8225753906568652947">特典を利用</translation> <translation id="8226222018808695353">アクセスできません</translation> <translation id="8226619461731305576">キュー</translation> <translation id="8226742006292257240">ランダムに生成され、ご使用のパソコンに割り当てられた TPM パスワードは以下のとおりです:</translation> @@ -4793,6 +4804,7 @@ <translation id="8286036467436129157">ログイン</translation> <translation id="8286963743045814739">シークレット ウィンドウを使って、シークレット モードで閲覧できます</translation> <translation id="82871696630048499">ウェブページはメモリ不足のため再読み込みされました。</translation> +<translation id="8288032458496410887">「<ph name="APP" />」をアンインストール...</translation> <translation id="8291967909914612644">ホーム プロバイダの国</translation> <translation id="8294431847097064396">ソース</translation> <translation id="8297006494302853456">弱い</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">最初に確認する(推奨)</translation> <translation id="8418445294933751433">タブで表示(&S)</translation> <translation id="8419098111404128271">「<ph name="SEARCH_TEXT" />」の検索結果</translation> +<translation id="8419368276599091549"><ph name="DEVICE_TYPE" /> へようこそ</translation> <translation id="8420060421540670057">Google ドキュメントのファイルを表示する</translation> <translation id="8424039430705546751">下</translation> <translation id="8425213833346101688">変更</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">ネットワーク接続の設定</translation> <translation id="8624205858755890468">アシスタントによる関連情報、アプリ、操作の案内を有効にします。</translation> <translation id="862542460444371744">拡張機能(&E)</translation> +<translation id="8626219642120025691">タイマーが設定されました</translation> <translation id="8627151598708688654">ソースを選択</translation> <translation id="862727964348362408">停止中</translation> <translation id="862750493060684461">CSS キャッシュ</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">編集内容は自動的に保存されます。<ph name="BREAKS" />オリジナルの画像のコピーを残す場合、[オリジナルを上書き] チェックボックスをオフにしてください。</translation> <translation id="8777628254805677039">ルート パスワード</translation> <translation id="8780443667474968681">音声検索がオフになっています。</translation> +<translation id="878068003854005405">まず指をセンサーに置きます。</translation> <translation id="878069093594050299">この証明書は、以下の用途に使用できることが確認されています:</translation> <translation id="8781980678064919987">ディスプレイを閉じたときにシャットダウンする</translation> <translation id="8782565991310229362">キオスク アプリケーションの起動がキャンセルされました。</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">パスフレーズ</translation> <translation id="9052208328806230490"><ph name="CLOUD_PRINT_NAME" /> に、アカウント <ph name="EMAIL" /> を使ってプリンタを登録しました</translation> <translation id="9052404922357793350">引き続きブロックする</translation> +<translation id="9053091947372579468">ご利用の端末には Chrome ライセンスが付与されていますが、ご利用のユーザー名が管理コンソールに関連付けられていません。登録を続けるには、管理コンソール アカウントを作成してください。注: 新しい管理コンソール アカウントを作成するにあたって自社ドメインを使用する場合は、登録後にドメインの確認も行う必要があります。https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">選択内容を保存</translation> <translation id="9055636786322918818">RC4 暗号化を適用します。なお RC4 暗号は安全でないため、このオプションを使用するとリスクが高まります。</translation> <translation id="9056034633062863292">Chromebox を更新中...</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">デフォルトとして設定</translation> <translation id="9219103736887031265">画像</translation> <translation id="9220525904950070496">アカウントを削除</translation> +<translation id="9220820413868316583">いったん指を放してもう一度お試しください。</translation> <translation id="923467487918828349">すべてを表示</translation> <translation id="928985544179707652">拡張機能:</translation> <translation id="930268624053534560">詳細なタイムスタンプ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 57d0fbe0..598a4e24 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">ಯಾವುದೇ ನೆಟ್ವರ್ಕ್ಗಳಿಲ್ಲ</translation> <translation id="1056898198331236512">ಎಚ್ಚರಿಕೆ</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೋಂದಾಯಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1061904396131502319">ಬಹುತೇಕ ವಿರಾಮದ ಸಮಯ</translation> <translation id="1062407476771304334">ಸ್ಥಾನಾಂತರಿಸು</translation> <translation id="1067048845568873861">ರಚಿಸಲಾಗಿದೆ</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">ವಜ್ರ</translation> <translation id="1114335938027186412">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ Chrome OS ನಲ್ಲಿ ಹಲವು ಗಂಭೀರ ಭದ್ರತೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಬಳಸಲಾಗುವ, ವಿಶ್ವಾಸಾರ್ಹ ಪ್ಲ್ಯಾಟ್ಫಾರ್ಮ್ ಮಾಡ್ಯೂಲ್ (TPM) ಅನ್ನು ಹೊಂದಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು Chromebook ಸಹಾಯ ಕೇಂದ್ರಕ್ಕೆ ಭೇಟಿ ನೀಡಿ: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">ಲಿಡ್ ಅನ್ನು ಮುಚ್ಚಿದಾಗ ಸ್ಲೀಪ್ ಮೋಡ್ನಲ್ಲಿ ಇರಿಸಿ</translation> +<translation id="1115324527092594775">Better Together ಅನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="1116694919640316211">ಕುರಿತು</translation> <translation id="1116779635164066733">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು "<ph name="NAME" />" ವಿಸ್ತರಣೆಯಿಂದ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="111844081046043029">ನೀವು ಈ ಪುಟವನ್ನು ನಿರ್ಗಮಿಸಲು ಖಚಿತವಾಗಿ ನಿರ್ಧರಿಸಿರುವಿರಾ?</translation> @@ -105,6 +107,7 @@ <translation id="1156488781945104845">ಪ್ರಸ್ತುತ ಸಮಯ</translation> <translation id="1157102636231978136">ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾದ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ ಮತ್ತು ಚಟುವಟಿಕೆ</translation> <translation id="1161575384898972166">ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ರಫ್ತು ಮಾಡಲು <ph name="TOKEN_NAME" /> ಗೆ ದಯವಿಟ್ಟು ಸೈನ್ ಇನ್ ಆಗಿರಿ.</translation> +<translation id="1161699061380012396">Chrome OS ಇನ್ಪುಟ್ ವಿಧಾನ</translation> <translation id="1163931534039071049">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &ವೀಕ್ಷಿಸಿ</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> ಗೆ Smart Lock ಆಫ್ ಮಾಡುವುದೇ?</translation> <translation id="1164899421101904659">ಪಿನ್ ಅನ್ಲಾಕ್ ಕೀ ನಮೂದಿಸಿ</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play ಸ್ಟೋರ್ ಖಾತೆ</translation> <translation id="2509495747794740764">ಸ್ಕೇಲ್ ಪ್ರಮಾಣವು 10 ಮತ್ತು 200 ನಡುವಿನ ಸಂಖ್ಯೆಯಾಗಿರಬೇಕು.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">ಫಾರ್ಮ್ಗಳನ್ನು ಸ್ವಯಂಭರ್ತಿ ಮಾಡಿ</translation> <translation id="2513403576141822879">ಗೌಪ್ಯತೆ, ಸುರಕ್ಷತೆ ಮತ್ತು ಡೇಟಾ ಸಂಗ್ರಹಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗಾಗಿ <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮತ್ತು Google ಸೇವೆಗಳನ್ನು<ph name="END_LINK" /> ನೋಡಿ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ಸ್ಕ್ಯಾನ್</translation> @@ -1354,6 +1356,7 @@ <translation id="3020990233660977256">ಕ್ರಮ ಸಂಖ್ಯೆ: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &ವೀಕ್ಷಿಸಿ</translation> <translation id="3022978424994383087">ಅದು ಅರ್ಥವಾಗಲಿಲ್ಲ.</translation> +<translation id="3023464535986383522">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="3024374909719388945">24-ಗಂಟೆಯ ಕ್ಲಾಕ್ ಬಳಸಿ</translation> <translation id="302781076327338683">ಸಂಗ್ರಹವನ್ನು ಬೈಪಾಸ್ ಮಾಡಿ ಪುನಃ ಲೋಡ್ ಮಾಡಿ</translation> <translation id="3031417829280473749">ಏಜೆಂಟ್ X</translation> @@ -1750,6 +1753,7 @@ <translation id="363903084947548957">ಮುಂದಿನ ಇನ್ಪುಟ್ ವಿಧಾನ</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> ಬಳಕೆದಾರರಿಗೆ "<ph name="EXTENSION_NAME" />" ವಿಸ್ತರಣೆಯನ್ನು ಸೇರಿಸುವುದೇ?</translation> <translation id="3644896802912593514">ಅಗಲ</translation> +<translation id="3645372836428131288">ಫಿಂಗರ್ಪ್ರಿಂಟ್ನ ಬೇರೊಂದು ಭಾಗವನ್ನು ಸೆರೆಹಿಡಿಯಲು ಬೆರಳನ್ನು ನಿಧಾನವಾಗಿ ಸರಿಸಿ.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> ಪತ್ತೆ ಮಾಡಲಾಗಿದೆ</translation> <translation id="3649138363871392317">ಫೋಟೋವನ್ನು ಸೆರೆಹಿಡಿಯಲಾಗಿದೆ</translation> <translation id="3650952250015018111">ಇದನ್ನು ಪ್ರವೇಶಿಸಲು "<ph name="APP_NAME" />" ಅನ್ನು ಅನುಮತಿಸಿ:</translation> @@ -1945,7 +1949,6 @@ <translation id="3920504717067627103">ಪ್ರಮಾಣಪತ್ರ ನೀತಿಗಳು</translation> <translation id="392089482157167418">ChromeVox ಸಕ್ರಿಯಗೊಳಿಸಿ (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">ನಿಮ್ಮಲ್ಲಿ ಇತ್ತೀಚೆಗೆ ಅಪ್ಲೋಡ್ ಆಗಿರುವ WebRTC ಲಾಗ್ಗಳು ಇಲ್ಲ.</translation> <translation id="3925573269917483990">ಕ್ಯಾಮರಾ:</translation> <translation id="3925842537050977900">ಶೆಲ್ಫ್ನಿಂದ ಅನ್ಪಿನ್ ಮಾಡು</translation> <translation id="3926002189479431949">Smart Lock ಫೋನ್ ಬದಲಾಯಿಸಲಾಗಿದೆ</translation> @@ -2221,6 +2224,7 @@ <translation id="438503109373656455">ಸರಾಟೊಗಾ</translation> <translation id="4387004326333427325">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವನ್ನು ರಿಮೋಟ್ ಆಗಿ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ</translation> <translation id="4389091756366370506">ಬಳಕೆದಾರ <ph name="VALUE" /></translation> +<translation id="439266289085815679"><ph name="USER_EMAIL" /> ಮೂಲಕ ಬ್ಲೂಟೂತ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ.</translation> <translation id="4394049700291259645">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="4400367121200150367">ಎಂದಿಗೂ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸದೆ ಇರುವಂತಹ ಸೈಟ್ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ</translation> <translation id="4400632832271803360">ಮೇಲಿನ-ಸಾಲುಗಳ ಕೀಗಳ ನಡವಳಿಕೆಯನ್ನು ಬದಲಿಸಲು ಲಾಂಚರ್ ಕೀ ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ</translation> @@ -2294,6 +2298,7 @@ <translation id="4522600456902129422">ಈ ಸೈಟ್ಗೆ ಕ್ಲಿಪ್ಬೋರ್ಡ್ ನೋಡಲು ಅನುಮತಿಯನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="4530494379350999373">ಮೂಲ</translation> <translation id="4533985347672295764">CPU ಸಮಯ</translation> +<translation id="4534661889221639075">ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="4535127706710932914">ಡಿಫಾಲ್ಟ್ ಪ್ರೊಫೈಲ್</translation> <translation id="4538417792467843292">ಪದವನ್ನು ಅಳಿಸಿ</translation> <translation id="4538684596480161368"><ph name="HOST" /> ನಲ್ಲಿ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ ರದ್ದುಗೊಳಿಸಲಾಗಿರುವ ಪ್ಲಗ್-ಇನ್ಗಳನ್ನು ಯಾವಾಗಲೂ ನಿರ್ಬಂಧಿಸು</translation> @@ -2524,6 +2529,7 @@ <translation id="4880520557730313061">ಸ್ವಯಂ-ಹೊಂದಿಸು</translation> <translation id="4880827082731008257">ಹುಡುಕಾಟ ಇತಿಹಾಸ</translation> <translation id="4881695831933465202">ತೆರೆ</translation> +<translation id="4882312758060467256">ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶವಿದೆ</translation> <translation id="4882473678324857464">ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಗಮನಿಸಿ</translation> <translation id="4882831918239250449">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="4883178195103750615">ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು HTML ಫೈಲ್ಗೆ ರಪ್ತು ಮಾಡಿ...</translation> @@ -2589,6 +2595,7 @@ <translation id="4969785127455456148">ಆಲ್ಬಮ್</translation> <translation id="4971412780836297815">ಮುಗಿಸಿದಾಗ ತೆರೆಯಿರಿ</translation> <translation id="4972129977812092092">ಪ್ರಿಂಟರ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> +<translation id="4972164225939028131">ಪಾಸ್ವರ್ಡ್ ತಪ್ಪಾಗಿದೆ</translation> <translation id="497287958838527945">Google Pay ಬಳಸುವ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳು ಮತ್ತು ವಿಳಾಸಗಳು.</translation> <translation id="4973307593867026061">ಮುದ್ರಕಗಳನ್ನು ಸೇರಿಸಿ</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> ಅಕ್ಷರಗಳು ಅಥವಾ ಕಡಿಮೆ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರುವ ಹೆಸರನ್ನು ಬಳಸಿ</translation> @@ -3017,6 +3024,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="5592595402373377407">ಇನ್ನೂ ಸಾಕಷ್ಟು ಡೇಟಾ ಲಭ್ಯವಿಲ್ಲ.</translation> +<translation id="5593357315997824387">ನನ್ನ ಫೈಲ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="5595152862129936745">ಬಹಳ ದೂರ</translation> <translation id="5595485650161345191">ವಿಳಾಸ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="5596627076506792578">ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು</translation> @@ -3730,6 +3738,7 @@ <translation id="6664237456442406323">ದುರದೃಷ್ಟವಶಾತ್, ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ತಪ್ಪಾಗಿ ರಚಿಸಲಾದ ಹಾರ್ಡ್ವೇರ್ ID ಯೊಂದಿಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ. ಇದು Chrome OS ಅನ್ನು ಇತ್ತೀಚಿನ ಭದ್ರತೆ ಸರಿಪಡಿಸುವಿಕೆಗಳೊಂದಿಗೆ ನವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ <ph name="BEGIN_BOLD" />ದುರುದ್ದೇಶದ ದಾಳಿಗಳಿಗೆ ಗುರಿಯಾಗುವ ಸಾಧ್ಯತೆಯಿದೆ<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ತೆರೆಯುವಾಗ ಏನೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ. ದಯವಿಟ್ಟು ಸೈನ್ ಔಟ್ ಮಾಡಿ ನಂತರ ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">ಟೈಮರ್ ನಿಲ್ಲಿಸಿ</translation> <translation id="667517062706956822"><ph name="SOURCE_LANGUAGE" /> ಭಾಷೆಯಿಂದ <ph name="TARGET_LANGUAGE" /> ಭಾಷೆಗೆ ಈ ಪುಟವನ್ನು ಅನುವಾದಿಸಲು ನಿಮಗೆ Google ಸಹಾಯ ಬೇಕೇ?</translation> <translation id="6675665718701918026">ಪಾಯಿಂಟಿಂಗ್ ಸಾಧನ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</translation> <translation id="6678717876183468697">ಕ್ವೆರಿ URL</translation> @@ -4056,6 +4065,7 @@ <translation id="7186088072322679094">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ ಇರಿಸು</translation> <translation id="7187428571767585875">ತೆಗೆದುಹಾಕಬೇಕಲಾದ ಅಥವಾ ಬದಲಾಯಿಸಬೇಕಾದ ದಾಖಲಾತಿ ನಮೂದುಗಳು:</translation> <translation id="7189234443051076392">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶ ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> +<translation id="7189965711416741966">ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೇರಿಸಲಾಗಿದೆ.</translation> <translation id="7191159667348037">ಅಪರಿಚಿತ ಪ್ರಿಂಟರ್ (USB)</translation> <translation id="7191454237977785534">ಇದರಂತೆ ಫೈಲ್ ಉಳಿಸಿ</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> ಗಾಗಿ ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿಲ್ಲ</translation> @@ -4156,6 +4166,7 @@ <translation id="7339898014177206373">ಹೊಸ ವಿಂಡೊ</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ಇದೀಗ ಪೂರ್ಣ ಪರದೆಯಾಗಿದೆ.</translation> <translation id="7340650977506865820">ನಿಮ್ಮ ಪರದೆಯನ್ನು ಸೈಟ್ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ</translation> +<translation id="7341834142292923918">ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶ ಕೋರುತ್ತಿದೆ</translation> <translation id="7345706641791090287">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ</translation> <translation id="7346909386216857016">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation> <translation id="7347751611463936647">ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸಲು, "<ph name="EXTENSION_KEYWORD" />" ಅನ್ನು ಟೈಪ್ ಮಾಡಿ, ನಂತರ TAB, ನಂತರ ನಿಮ್ಮ ಆದೇಶ ಅಥವಾ ಹುಡುಕಾಟವನ್ನು ಟೈಪ್ ಮಾಡಿ.</translation> @@ -4263,7 +4274,6 @@ <ph name="BEGIN_PARAGRAPH2" />ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಅಂದಾಜು ಮಾಡುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಲು, Google ನ ಸ್ಥಳ ಸೇವೆಯು ವೈ-ಫೈ, ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಸೆನ್ಸರ್ಗಳಂತಹ ಮೂಲಗಳನ್ನು ಬಳಸುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ ಆನ್ ಆಗಿರುವಾಗ ಈ ಸೇವೆಯು ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಮುಖ್ಯ ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡುವ ಮೂಲಕ ನೀವು ಸ್ಥಳವನ್ನು ಆಫ್ ಮಾಡಬಹುದು. ನೀವು ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸ್ಥಳಕ್ಕಾಗಿ ವೈ-ಫೈ, ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಸೆನ್ಸರ್ಗಳ ಬಳಕೆಯನ್ನು ಸಹ ಆಫ್ ಮಾಡಬಹುದು.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">ಪಾಸ್ವರ್ಡ್ ರಚಿಸಿ -</translation> -<translation id="7518150891539970662">WebRTC ಲಾಗ್ಗಳು (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">ರಚಿಸಿ</translation> <translation id="7529411698175791732">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರೀಕ್ಷಿಸಿ. ಸಮಸ್ಯೆ ಮುಂದುವರೆದರೆ, ಸೈನ್ ಔಟ್ ಮಾಡಲು ಹಾಗೂ ಮರಳಿ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation> @@ -4734,6 +4744,7 @@ <translation id="8214962590150211830">ಈ ವ್ಯಕ್ತಿಯನ್ನು ತೆಗೆದುಹಾಕು</translation> <translation id="8217399928341212914">ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಫೈಲ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡದಂತೆ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸು</translation> <translation id="8223479393428528563">ಆಫ್ಲೈನ್ ಬಳಕೆಗಾಗಿ ಈ ಫೈಲ್ ಗಳನ್ನು ಉಳಿಸಲು, ಆನ್ಲೈನ್ಗೆ ಹಿಂತಿರುಗಲು, ಫೈಲ್ಗಳ ಮೇಲೆ ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ, ಮತ್ತು <ph name="OFFLINE_CHECKBOX_NAME" /> ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ.</translation> +<translation id="8225753906568652947">ನಿಮ್ಮ ಆಫರ್ಗಳನ್ನು ರಿಡೀಮ್ ಮಾಡಿಕೊಳ್ಳಿ</translation> <translation id="8226222018808695353">ನಿಷೇಧಿತ</translation> <translation id="8226619461731305576">ಸರತಿ</translation> <translation id="8226742006292257240">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಹೊಂದಿಸಲಾದ, ರ್ಯಾಂಡಮ್ ಆಗಿ ರಚಿಸಲಾದ TPM ಪಾಸ್ವರ್ಡ್ ಕೆಳಗಿದೆ:</translation> @@ -4780,6 +4791,7 @@ <translation id="8286036467436129157">ಸೈನ್ ಇನ್</translation> <translation id="8286963743045814739">ಅದೃಶ್ಯ ವಿಂಡೋವನ್ನು ಬಳಸುವ ಮೂಲಕ ನೀವು ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು</translation> <translation id="82871696630048499">ವೆಬ್ ಪುಟದಲ್ಲಿ ಸಾಕಷ್ಟು ಮೆಮೊರಿ ಇಲ್ಲದ ಕಾರಣ, ಅದನ್ನು ಪುನಃ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ.</translation> +<translation id="8288032458496410887"><ph name="APP" /> ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ...</translation> <translation id="8291967909914612644">ಹೋಮ್ ಪೂರೈಕೆದಾರರ ರಾಷ್ಟ್ರ</translation> <translation id="8294431847097064396">ಮೂಲ</translation> <translation id="8297006494302853456">ದುರ್ಬಲ</translation> @@ -4842,6 +4854,7 @@ <translation id="8413385045638830869">ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="8418445294933751433">ಟ್ಯಾಬ್ನಂತೆ &ತೋರಿಸಿ</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' ಕುರಿತ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು</translation> +<translation id="8419368276599091549">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಸಾಧನಕ್ಕೆ ಸ್ವಾಗತ!</translation> <translation id="8420060421540670057">Google ಡಾಕ್ಸ್ ಫೈಲ್ಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="8424039430705546751">ಕೆಳಗೆ</translation> <translation id="8425213833346101688">ಬದಲಿಸಿ</translation> @@ -4970,6 +4983,7 @@ <translation id="8620765578342452535">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation> <translation id="8624205858755890468">ಸಂಬಂಧಿತ ಮಾಹಿತಿ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಕ್ರಿಯೆಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸಲು ಸಹಾಯಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="862542460444371744">&ವಿಸ್ತರಣೆಗಳು</translation> +<translation id="8626219642120025691">ಟೈಮರ್ ಮುಗಿದಿದೆ</translation> <translation id="8627151598708688654">ಮೂಲವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="862727964348362408">ತಡೆಹಿಡಿಯಲಾಗಿದೆ</translation> <translation id="862750493060684461">CSS ಸಂಗ್ರಹ</translation> @@ -5090,6 +5104,7 @@ <translation id="8775404590947523323">ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಉಳಿಸಲಾಗಿದೆ. <ph name="BREAKS" /> ಮೂಲ ಚಿತ್ರದ ನಕಲೊಂದನ್ನು ಇರಿಸಿಕೊಳ್ಳಲು, "ಮೂಲವನ್ನು ಮೇಲ್ಬರಹಗೊಳಿಸು" ಅನ್ನು ಅನ್ಚೆಕ್ ಮಾಡಿ.</translation> <translation id="8777628254805677039">ಮೂಲ ಪಾಸ್ವರ್ಡ್</translation> <translation id="8780443667474968681">ಧ್ವನಿ ಹುಡುಕಾಟವನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ.</translation> +<translation id="878068003854005405">ಪ್ರಾರಂಭಿಸೋಣ. ಸೆನ್ಸರ್ನ ಮೇಲೆ ನಿಮ್ಮ ಬೆರಳನ್ನು ಇರಿಸಿ.</translation> <translation id="878069093594050299">ಈ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಮುಂದಿನ ಬಳಕೆಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗಿದೆ:</translation> <translation id="8781980678064919987">ಲಿಡ್ ಅನ್ನು ಮುಚ್ಚಿದಾಗ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಿ</translation> <translation id="8782565991310229362">ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಬಿಡುಗಡೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಗಿದೆ.</translation> @@ -5267,6 +5282,7 @@ <translation id="9050666287014529139">ಪಾಸ್ಫ್ರೇಸ್</translation> <translation id="9052208328806230490"><ph name="EMAIL" /> ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು <ph name="CLOUD_PRINT_NAME" /> ರೊಂದಿಗೆ ನಿಮ್ಮ ಪ್ರಿಂಟರ್ಗಳನ್ನು ನೀವು ನೋಂದಾಯಿಸಿರುವಿರಿ</translation> <translation id="9052404922357793350">ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> +<translation id="9053091947372579468">ನಿಮ್ಮ ಸಾಧನವು Chrome ಪರವಾನಗಿಯನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಬಳಕೆದಾರರ ಹೆಸರು ನಿರ್ವಾಹಕರ ಕನ್ಸೋಲ್ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿಲ್ಲ. ನೋಂದಣಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಮುಂದುವರಿಸಲು, ನಿರ್ವಾಹಕರ ಕನ್ಸೋಲ್ ಖಾತೆಯನ್ನು ರಚಿಸಿ. ಗಮನಿಸಿ: ಹೊಸ ನಿರ್ವಾಹಕರ ಕನ್ಸೋಲ್ ಖಾತೆಯನ್ನು ರಚಿಸುವುದಕ್ಕೆ ನಿಮ್ಮ ಸ್ವಂತ ಡೊಮೇನ್ ಅನ್ನು ಬಳಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಸೈನ್-ಅಪ್ ಮಾಡಿದ ಬಳಿಕ ಡೊಮೇನ್ ದೃಢೀಕರಣವನ್ನು ಸಹ ನೀವು ಪೂರ್ಣಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">ನನ್ನ ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡಿ</translation> <translation id="9055636786322918818">RC4 ಎನ್ಕ್ರಿಪ್ಶನ್ ಅನ್ನು ಜಾರಿಗೊಳಿಸಿ. RC4 ಸೈಫರ್ಗಳು ಅಸುರಕ್ಷಿತವಾಗಿರುವುದರಿಂದ ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸುವುದು ನಿಮ್ಮ ಅಪಾಯವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.</translation> <translation id="9056034633062863292">Chromebox ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -5371,6 +5387,7 @@ <translation id="9218430445555521422">ಡಿಫಾಲ್ಟ್ ಆಗಿ ಹೊಂದಿಸಿ</translation> <translation id="9219103736887031265">ಚಿತ್ರಗಳು</translation> <translation id="9220525904950070496">ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಿ</translation> +<translation id="9220820413868316583">ಬೆರಳನ್ನು ಸರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="923467487918828349">ಎಲ್ಲಾ ತೋರಿಸಿ</translation> <translation id="928985544179707652">ವಿಸ್ತರಣೆಗಳು:</translation> <translation id="930268624053534560">ವಿವರವಾದ ಸಮಯಮೊಹರುಗಳು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 5651e4b..0c99094c 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">네트워크 없음</translation> <translation id="1056898198331236512">경고</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">지문 등록</translation> <translation id="1061904396131502319">곧 휴식 시간입니다</translation> <translation id="1062407476771304334">바꾸기</translation> <translation id="1067048845568873861">생성됨</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">다이아몬드</translation> <translation id="1114335938027186412">컴퓨터에 TPM(신뢰할 수 있는 플랫폼 모듈) 보안 기기가 있습니다. 이 기기는 Chrome OS에서 여러 중요한 보안 기능을 구현하는 데 사용됩니다. 자세히 알아보려면 Chromebook 고객센터의 다음 페이지를 방문하세요. https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">덮개가 닫히면 절전 모드</translation> +<translation id="1115324527092594775">Better Together 설정</translation> <translation id="1116694919640316211">정보</translation> <translation id="1116779635164066733">이 설정은 '<ph name="NAME" />' 확장 프로그램에서 시행합니다.</translation> <translation id="111844081046043029">이 페이지에서 벗어나시겠습니까?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">현재 시간</translation> <translation id="1157102636231978136">Google 계정에 동기화되는 인터넷 사용 기록 및 활동</translation> <translation id="1161575384898972166"><ph name="TOKEN_NAME" />에 로그인하여 클라이언트 인증서를 내보내세요.</translation> +<translation id="1161699061380012396">Chrome OS 입력 방법</translation> <translation id="1163931534039071049">프레임 소스 보기(&V)</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" />에서 Smart Lock을 사용 중지하시겠습니까?</translation> <translation id="1164899421101904659">PIN 잠금 해제 키 입력</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play 스토어 계정</translation> <translation id="2509495747794740764">배율 값은 10에서 200 사이의 숫자여야 합니다.</translation> <translation id="2509566264613697683">8배</translation> -<translation id="2512222046227390255">양식 자동 완성</translation> <translation id="2513403576141822879">개인정보 보호, 보안, 데이터 수집에 관한 설정을 더 보려면 <ph name="BEGIN_LINK" />동기화 및 Google 서비스<ph name="END_LINK" />를 참조하세요.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">검색</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">일련번호: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">프레임 소스 보기(&V)</translation> <translation id="3022978424994383087">인식하지 못했습니다.</translation> +<translation id="3023464535986383522">텍스트 읽어주기</translation> <translation id="3024374909719388945">24시간 단위 사용</translation> <translation id="302781076327338683">캐시 무시하고 새로고침</translation> <translation id="3031417829280473749">X 요원</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">다음 입력 방법</translation> <translation id="3640214691812501263"><ph name="USER_NAME" />님에 대하여 '<ph name="EXTENSION_NAME" />'을(를) 추가할까요?</translation> <translation id="3644896802912593514">너비</translation> +<translation id="3645372836428131288">지문의 다른 부분이 인식되도록 손가락을 살짝 움직이세요.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> 발견됨</translation> <translation id="3649138363871392317">사진이 캡처되었습니다.</translation> <translation id="3650952250015018111">'<ph name="APP_NAME" />'이(가) 다음 기기에 액세스하도록 허용합니다.</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">인증서 정책</translation> <translation id="392089482157167418">ChromeVox(음성 피드백) 사용</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">최근 캡처한 WebRTC 로그가 없습니다.</translation> <translation id="3925573269917483990">카메라:</translation> <translation id="3925842537050977900">임시보관함에서 고정 해제</translation> <translation id="3926002189479431949">Smart Lock 휴대전화가 변경됨</translation> @@ -2222,6 +2225,7 @@ <translation id="438503109373656455">말</translation> <translation id="4387004326333427325">인증서가 원격으로 거부됨</translation> <translation id="4389091756366370506">사용자 <ph name="VALUE" /></translation> +<translation id="439266289085815679">네트워크 구성은 <ph name="USER_EMAIL" />님이 관리합니다.</translation> <translation id="4394049700291259645">사용 중지</translation> <translation id="4400367121200150367">비밀번호를 저장하지 않는 사이트가 표시됩니다.</translation> <translation id="4400632832271803360">맨 윗 줄 키의 동작을 전환하려면 런처 키를 길게 누르세요.</translation> @@ -2295,6 +2299,7 @@ <translation id="4522600456902129422">이 사이트에서 클립보드를 볼 수 있도록 계속 허용</translation> <translation id="4530494379350999373">오리진</translation> <translation id="4533985347672295764">CPU 시간</translation> +<translation id="4534661889221639075">다시 시도하세요.</translation> <translation id="4535127706710932914">기본 프로필</translation> <translation id="4538417792467843292">단어 삭제</translation> <translation id="4538684596480161368"><ph name="HOST" />에서 샌드박스 처리되지 않은 플러그인을 항상 차단</translation> @@ -2524,6 +2529,7 @@ <translation id="4880520557730313061">자동 보정</translation> <translation id="4880827082731008257">기록 검색</translation> <translation id="4881695831933465202">열기</translation> +<translation id="4882312758060467256">이 사이트의 액세스 권한이 있습니다.</translation> <translation id="4882473678324857464">북마크에 초점</translation> <translation id="4882831918239250449">검색, 광고 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="4883178195103750615">HTML 파일로 북마크 내보내기...</translation> @@ -2589,6 +2595,7 @@ <translation id="4969785127455456148">앨범</translation> <translation id="4971412780836297815">완료되면 열기</translation> <translation id="4972129977812092092">프린터 수정</translation> +<translation id="4972164225939028131">잘못된 비밀번호</translation> <translation id="497287958838527945">Google Pay에 사용되는 신용카드 및 주소</translation> <translation id="4973307593867026061">프린터 추가</translation> <translation id="4973523518332075481">이름은 <ph name="MAX_LENGTH" />자 이하여야 합니다</translation> @@ -3016,6 +3023,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />개)</translation> <translation id="558918721941304263">앱 로드 중...</translation> <translation id="5592595402373377407">아직 데이터가 충분하지 않습니다.</translation> +<translation id="5593357315997824387">파일 동기화</translation> <translation id="5595152862129936745">매우 멀리 있음</translation> <translation id="5595485650161345191">주소 수정</translation> <translation id="5596627076506792578">옵션 더보기</translation> @@ -3731,6 +3739,7 @@ <translation id="6664237456442406323">컴퓨터가 잘못된 형식의 하드웨어 ID로 구성되어 있습니다. 이렇게 하면 Chrome OS가 최신 보안 수정사항을 업데이트할 수 없으며 컴퓨터가<ph name="BEGIN_BOLD" />악의적인 공격에 취약해 집니다<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">프로필을 여는 동안 문제가 발생했습니다. 로그아웃했다가 다시 로그인하세요.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" />(USB)</translation> +<translation id="6674412557034343536">타이머 중지</translation> <translation id="667517062706956822">Google에서 이 페이지를 <ph name="SOURCE_LANGUAGE" />에서 <ph name="TARGET_LANGUAGE" />로 번역할까요?</translation> <translation id="6675665718701918026">포인팅 기기 연결됨</translation> <translation id="6678717876183468697">쿼리 URL</translation> @@ -4057,6 +4066,7 @@ <translation id="7186088072322679094">툴바에 보관</translation> <translation id="7187428571767585875">삭제 또는 변경할 레지스트리 항목:</translation> <translation id="7189234443051076392">기기 저장용량이 충분한지 확인합니다.</translation> +<translation id="7189965711416741966">지문이 추가되었습니다.</translation> <translation id="7191159667348037">알 수 없는 프린터(USB)</translation> <translation id="7191454237977785534">다른 이름으로 저장</translation> <translation id="7193374945610105795"><ph name="ORIGIN" />의 비밀번호가 저장되지 않음</translation> @@ -4157,6 +4167,7 @@ <translation id="7339898014177206373">새 창</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" />이(가) 이제 전체화면으로 표시됩니다.</translation> <translation id="7340650977506865820">사이트에서 화면을 공유하고 있습니다.</translation> +<translation id="7341834142292923918">이 사이트의 액세스 권한이 필요합니다.</translation> <translation id="7345706641791090287">비밀번호 확인</translation> <translation id="7346909386216857016">확인</translation> <translation id="7347751611463936647">이 확장 프로그램을 사용하려면 '<ph name="EXTENSION_KEYWORD" />'(을)를 입력하고 TAB을 누른 다음 명령어 또는 검색어를 입력하세요.</translation> @@ -4266,7 +4277,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google 위치 서비스는 Wi-Fi, 모바일 네트워크, 센서와 같은 소스를 활용하여 기기의 위치를 추정합니다. 이 서비스는 기기의 위치 설정이 사용 설정되어 있으면 활성화됩니다.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />기기에서 기본 위치 설정을 사용 중지하면 위치를 사용 중지할 수 있습니다. 또한 위치 설정에서 위치를 추정하는 데 Wi-Fi, 모바일 네트워크, 센서를 사용하지 않도록 할 수도 있습니다.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">비밀번호 만들기 -</translation> -<translation id="7518150891539970662">WebRTC 로그(<ph name="WEBRTC_LOG_COUNT" />개)</translation> <translation id="7521387064766892559">자바스크립트</translation> <translation id="7525067979554623046">만들기</translation> <translation id="7529411698175791732">인터넷 연결 상태를 확인하세요. 문제가 계속되면 로그아웃한 뒤 다시 로그인해보세요.</translation> @@ -4744,6 +4754,7 @@ <translation id="8214962590150211830">이 사용자 삭제</translation> <translation id="8217399928341212914">여러 파일을 다운로드하지 못하도록 계속 차단</translation> <translation id="8223479393428528563">오프라인 사용 목적으로 이 파일을 저장하려면 온라인으로 돌아가서 마우스 오른쪽 버튼으로 파일을 클릭한 다음 <ph name="OFFLINE_CHECKBOX_NAME" /> 옵션을 선택하세요.</translation> +<translation id="8225753906568652947">혜택 사용하기</translation> <translation id="8226222018808695353">금지됨</translation> <translation id="8226619461731305576">대기열</translation> <translation id="8226742006292257240">다음은 컴퓨터에 임의로 생성 및 할당된 TPM 비밀번호입니다.</translation> @@ -4790,6 +4801,7 @@ <translation id="8286036467436129157">로그인</translation> <translation id="8286963743045814739">시크릿 창을 사용하면 비공개로 탐색할 수 있습니다.</translation> <translation id="82871696630048499">메모리가 부족하여 웹페이지가 다시 로드되었습니다.</translation> +<translation id="8288032458496410887"><ph name="APP" /> 제거 중...</translation> <translation id="8291967909914612644">홈 공급자 국가</translation> <translation id="8294431847097064396">출처</translation> <translation id="8297006494302853456">약함</translation> @@ -4851,6 +4863,7 @@ <translation id="8413385045638830869">우선 확인(권장)</translation> <translation id="8418445294933751433">탭으로 표시(&S)</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />'에 대한 검색결과</translation> +<translation id="8419368276599091549"><ph name="DEVICE_TYPE" /> 시작</translation> <translation id="8420060421540670057">Google 문서도구 파일 표시</translation> <translation id="8424039430705546751">아래</translation> <translation id="8425213833346101688">변경</translation> @@ -4977,6 +4990,7 @@ <translation id="8620765578342452535">네트워크 연결 구성</translation> <translation id="8624205858755890468">어시스턴트를 사용 설정하여 관련된 정보, 앱, 작업을 표시합니다.</translation> <translation id="862542460444371744">확장 프로그램(&E)</translation> +<translation id="8626219642120025691">타이머 완료</translation> <translation id="8627151598708688654">소스 선택</translation> <translation id="862727964348362408">일시중지됨</translation> <translation id="862750493060684461">CSS 캐시</translation> @@ -5097,6 +5111,7 @@ <translation id="8775404590947523323">수정 사항이 자동으로 저장됩니다.<ph name="BREAKS" />원본 이미지의 사본을 보관하려면 '원본 덮어쓰기'를 선택 해제합니다.</translation> <translation id="8777628254805677039">루트 비밀번호</translation> <translation id="8780443667474968681">음성 검색이 사용 중지되었습니다.</translation> +<translation id="878068003854005405">시작해 보겠습니다. 센서 위에 손가락을 올리세요.</translation> <translation id="878069093594050299">이 인증서는 다음 용도로 확인되었습니다.</translation> <translation id="8781980678064919987">덮개가 닫히면 종료</translation> <translation id="8782565991310229362">키오스크 애플리케이션 실행이 취소되었습니다.</translation> @@ -5274,6 +5289,7 @@ <translation id="9050666287014529139">암호</translation> <translation id="9052208328806230490"><ph name="EMAIL" /> 계정을 사용하여 프린터를 <ph name="CLOUD_PRINT_NAME" />에 등록했습니다.</translation> <translation id="9052404922357793350">차단 계속</translation> +<translation id="9053091947372579468">기기에 Chrome 라이선스가 포함되어 있지만 사용자 이름이 관리 콘솔과 연결되어 있지 않습니다. 등록을 계속하려면 관리 콘솔 계정을 만드세요. 참고: 내 도메인을 사용해 새로운 관리 콘솔 계정을 만들려면 가입 후 도메인을 확인해야 합니다. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">내 선택 기억하기</translation> <translation id="9055636786322918818">RC4 암호화를 적용합니다. RC4 암호화는 안전하지 않으므로 이 옵션을 사용하면 보안 위험도가 높아집니다.</translation> <translation id="9056034633062863292">Chromebox 업데이트 중</translation> @@ -5377,6 +5393,7 @@ <translation id="9218430445555521422">기본 브라우저로 설정</translation> <translation id="9219103736887031265">이미지</translation> <translation id="9220525904950070496">계정 삭제</translation> +<translation id="9220820413868316583">손가락을 뗀 뒤 다시 시도하세요.</translation> <translation id="923467487918828349">모두 표시</translation> <translation id="928985544179707652">확장 프로그램:</translation> <translation id="930268624053534560">상세 타임스탬프</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 2eda8cf..8fc261b 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nėra tinklų</translation> <translation id="1056898198331236512">Įspėjimas</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registruojamas kontrolinis kodas</translation> <translation id="1061904396131502319">Beveik atėjo laikas padaryti pertrauką</translation> <translation id="1062407476771304334">Pakeisti</translation> <translation id="1067048845568873861">Sukurtas</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Deimantas</translation> <translation id="1114335938027186412">Jūsų kompiuteryje yra patikimos platformos modulio (TPM) saugos įrenginys, kuris naudojamas „Chrome“ OS įdiegiant daug svarbių saugos funkcijų. Jei reikia daugiau informacijos, apsilankykite „Chromebook“ pagalbos centre adresu https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Įjungti miego būseną, kai dangtis uždarytas</translation> +<translation id="1115324527092594775">Nustatyti „Geriau kartu“</translation> <translation id="1116694919640316211">Apie</translation> <translation id="1116779635164066733">Šį nustatymą paleidžia „<ph name="NAME" />“ plėtinys.</translation> <translation id="111844081046043029">Ar tikrai norite išeiti iš šio puslapio?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Dabartinis laikas</translation> <translation id="1157102636231978136">Su „Google“ paskyra sinchronizuojami jūsų naršymo duomenys ir veikla</translation> <translation id="1161575384898972166">Jei norite eksportuoti programos sertifikatą, prisijunkite prie „<ph name="TOKEN_NAME" />“.</translation> +<translation id="1161699061380012396">„Chrome OS“ įvesties metodas</translation> <translation id="1163931534039071049">&Rodyti rėmelio šaltinį</translation> <translation id="1164674268730883318">Išjungti „Smart Lock“, skirtą „<ph name="DEVICE_TYPE" />“?</translation> <translation id="1164899421101904659">Įveskite PIN kodo atrakinimo raktą</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">„Google Play“ parduotuvės paskyra</translation> <translation id="2509495747794740764">Mastelio verčių suma turi būti skaičius nuo 10 iki 200.</translation> <translation id="2509566264613697683">8 k.</translation> -<translation id="2512222046227390255">Automatiškai užpildyti formas</translation> <translation id="2513403576141822879">Daugiau nustatymų, susijusių su privatumu, sauga ir duomenų rinkimu, žr. skiltyje <ph name="BEGIN_LINK" />„Sinchronizavimas ir „Google“ paslaugos“<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Nuskaityti</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Serijos numeris: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Žiūrėti rėmelio šaltinį</translation> <translation id="3022978424994383087">Nepavyko suprasti.</translation> +<translation id="3023464535986383522">Teksto ištarimas</translation> <translation id="3024374909719388945">Naudoti 24 val. laikrodį</translation> <translation id="302781076327338683">Iš naujo įkelti talpyklos apėjimą</translation> <translation id="3031417829280473749">Slaptasis agentas</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Kitas įvesties būdas</translation> <translation id="3640214691812501263">Pridėti „<ph name="EXTENSION_NAME" />“ naudotojui <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Plotis</translation> +<translation id="3645372836428131288">Truputį pajudinkite pirštą, kad būtų užfiksuota kita kontrolinio kodo dalis.</translation> <translation id="3648348069317717750">Aptiktas „<ph name="USB_DEVICE_NAME" />“</translation> <translation id="3649138363871392317">Nuotrauka buvo užfiksuota</translation> <translation id="3650952250015018111">Leidimas „<ph name="APP_NAME" />“ pasiekti:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Sertifikato politika</translation> <translation id="392089482157167418">Įgalinti „ChromeVox“ (ekrano skaitymą balsu)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Neturite neseniai užfiksuotų „WebRTC“ žurnalų.</translation> <translation id="3925573269917483990">Fotoaparatas:</translation> <translation id="3925842537050977900">Atsegti nuo lentynos</translation> <translation id="3926002189479431949">Telefonas, kuriame naudojama „Smart Lock“, pasikeitė</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Mūšis</translation> <translation id="4387004326333427325">Autentifikavimo sertifikatas atmestas nuotoliniu būdu</translation> <translation id="4389091756366370506"><ph name="VALUE" /> naudotojas</translation> +<translation id="439266289085815679">„Bluetooth“ konfigūravimą valdo <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Neleisti</translation> <translation id="4400367121200150367">Svetainės, kuriose niekada nesaugomi slaptažodžiai, bus rodomos čia</translation> <translation id="4400632832271803360">Laikykite paspaustą paleidimo priemonės klavišą, kad perjungtumėte viršutinės eilutės klavišų veikimą</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Toliau leisti šiai svetainei peržiūrėti iškarpinę</translation> <translation id="4530494379350999373">Kilmė</translation> <translation id="4533985347672295764">Centrinio procesoriaus laikas</translation> +<translation id="4534661889221639075">Bandykite dar kartą.</translation> <translation id="4535127706710932914">Numatytasis profilis</translation> <translation id="4538417792467843292">Ištrinti žodį</translation> <translation id="4538684596480161368">Visada blokuoti į smėlio dėžę neįtrauktus papildinius, esančius <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automatinis pataisymas</translation> <translation id="4880827082731008257">Ieškoti istorijoje</translation> <translation id="4881695831933465202">Atidaryti</translation> +<translation id="4882312758060467256">Turi prieigą prie šios svetainės</translation> <translation id="4882473678324857464">Išryškinti žymes</translation> <translation id="4882831918239250449">Naršymo istorijos naudojimo paieškai, skelbimams ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="4883178195103750615">Eksportuoti žymes į HTML failą...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Albumas</translation> <translation id="4971412780836297815">Baigus atidaryti</translation> <translation id="4972129977812092092">Spausdintuvo informacijos redagavimas</translation> +<translation id="4972164225939028131">Netinkamas slaptažodis</translation> <translation id="497287958838527945">„Google Pay“ naudojamos kredito kortelės ir adresai.</translation> <translation id="4973307593867026061">Pridėti spausdintuvų</translation> <translation id="4973523518332075481">Naudokite pavadinimą, sudarytą iš <ph name="MAX_LENGTH" /> ar mažiau simbolių</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Įkeliamos programos...</translation> <translation id="5592595402373377407">Kol kas nepakanka duomenų.</translation> +<translation id="5593357315997824387">Sinchronizuoti mano failus</translation> <translation id="5595152862129936745">Labai toli</translation> <translation id="5595485650161345191">Adreso redagavimas</translation> <translation id="5596627076506792578">Daugiau parinkčių</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">Deja, jūsų kompiuteris yra sukonfigūruotas naudojant netinkamai suformuotą aparatinės įrangos ID. Tai neleidžia „Chrome“ OS atnaujinti naujausiais saugos pataisymais ir jūsų kompiuteris <ph name="BEGIN_BOLD" />gali būti neatsparus kenkėjiškoms programoms<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Atidarant profilį įvyko klaida. Atsijunkite, tada vėl prisijunkite.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">stabdyti laikmatį</translation> <translation id="667517062706956822">Ar norite, kad „Google“ išverstų puslapį iš <ph name="SOURCE_LANGUAGE" /> į <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Manipuliatorius prijungtas</translation> <translation id="6678717876183468697">Užklausos URL</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">Laikyti įrankių juostoje</translation> <translation id="7187428571767585875">Registro vertės, kurios bus pašalintos arba pakeistos:</translation> <translation id="7189234443051076392">Įsitikinkite, kad įrenginyje yra pakankamai vietos</translation> +<translation id="7189965711416741966">Kontrolinis kodas pridėtas.</translation> <translation id="7191159667348037">Nežinomas spausdintuvas (USB)</translation> <translation id="7191454237977785534">Išsaugoti failą kaip</translation> <translation id="7193374945610105795">Nėra išsaugotų <ph name="ORIGIN" /> slaptažodžių</translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Naujas langas</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> dabar veikia viso ekrano režimu.</translation> <translation id="7340650977506865820">Svetainė bendrina jūsų ekrano vaizdą</translation> +<translation id="7341834142292923918">Nori gauti prieigą prie šios svetainės</translation> <translation id="7345706641791090287">Patvirtinkite slaptažodį</translation> <translation id="7346909386216857016">Gerai, supratau</translation> <translation id="7347751611463936647">Jei norite naudoti šį plėtinį, įveskite „<ph name="EXTENSION_KEYWORD" />“, tada paspauskite TABULIAVIMO klavišą ir įveskite komandą ar paieškos terminą.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />„Google“ vietovės paslauga naudoja įvairius šaltinius, pvz., „Wi-Fi“, mobiliojo ryšio tinklus ir jutiklius, kad padėtų nustatyti įrenginio vietovę. Ši paslauga aktyvi, kai įjungtas įrenginio vietovės nustatymas.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Galite išjungti vietovės nustatymą išjungdami pagrindinį vietovės nustatymą šiame įrenginyje. Vietovės nustatymuose taip pat galite išjungti „Wi‑Fi“, mobiliojo ryšio tinklų ir jutiklių naudojimą vietovei nustatyti.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Sukurti slaptažodį –</translation> -<translation id="7518150891539970662">„WebRTC“ žurnalai (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">„JavaScript“</translation> <translation id="7525067979554623046">Sukurti</translation> <translation id="7529411698175791732">Patikrinkite interneto ryšį. Jei problema kartosis, pabandykite atsijungti ir vėl prisijungti.</translation> @@ -4747,6 +4757,7 @@ <translation id="8214962590150211830">Pašalinti šį asmenį</translation> <translation id="8217399928341212914">Toliau blokuoti automatinius kelių failų atsisiuntimus</translation> <translation id="8223479393428528563">Jei norite išsaugoti šiuos failus ir naudoti juos be interneto ryšio, vėl prisijunkite prie interneto, spustelėkite failus dešiniuoju pelės klavišu ir pasirinkite parinktį „<ph name="OFFLINE_CHECKBOX_NAME" />“.</translation> +<translation id="8225753906568652947">Išpirkti pasiūlymus</translation> <translation id="8226222018808695353">Uždrausta</translation> <translation id="8226619461731305576">Eilė</translation> <translation id="8226742006292257240">Toliau pateikiamas kompiuteriui priskirtas atsitiktinai sugeneruotas TPM slaptažodis:</translation> @@ -4793,6 +4804,7 @@ <translation id="8286036467436129157">Prisijungti</translation> <translation id="8286963743045814739">Galite naršyti privačiai naudodami inkognito langą</translation> <translation id="82871696630048499">Tinklalapis paleistas iš naujo, nes pritrūko atminties.</translation> +<translation id="8288032458496410887">Pašalinti „<ph name="APP" />“...</translation> <translation id="8291967909914612644">Namų paslaugos teikėjo šalis</translation> <translation id="8294431847097064396">Šaltinis</translation> <translation id="8297006494302853456">Silpnas</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Pirmiausia paklausti (rekomenduojama)</translation> <translation id="8418445294933751433">&Rodyti kaip skirtuką</translation> <translation id="8419098111404128271">Paieškos rezultatai pagal užklausą „<ph name="SEARCH_TEXT" />“</translation> +<translation id="8419368276599091549">Sveiki, tai – „<ph name="DEVICE_TYPE" />“!</translation> <translation id="8420060421540670057">Rodyti „Google“ dokumentų failus</translation> <translation id="8424039430705546751">žemyn</translation> <translation id="8425213833346101688">Keisti</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Konfigūruoti tinklo ryšius</translation> <translation id="8624205858755890468">Padėjėjui leidžiama rodyti susijusią informaciją, programas ir veiksmus.</translation> <translation id="862542460444371744">&Plėtiniai</translation> +<translation id="8626219642120025691">Laikmatis atliktas</translation> <translation id="8627151598708688654">Šaltinio pasirinkimas</translation> <translation id="862727964348362408">Laikinai sustabdyta</translation> <translation id="862750493060684461">CSS talpykla</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Keitimai saugomi automatiškai.<ph name="BREAKS" />Jei norite išsaugoti originalaus vaizdo kopiją, panaikinkite parinkties „Perrašyti originalą“ žymėjimą</translation> <translation id="8777628254805677039">pagrindinis slaptažodis</translation> <translation id="8780443667474968681">Paieška balsu išjungta.</translation> +<translation id="878068003854005405">Pradėkime. Padėkite pirštą ant jutiklio.</translation> <translation id="878069093594050299">Šis sertifikatas patvirtintas šiems naudojimo būdams:</translation> <translation id="8781980678064919987">Išjungti, kai dangtis uždarytas</translation> <translation id="8782565991310229362">Atšauktas viešojo terminalo programos paleidimas.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Slaptafrazė</translation> <translation id="9052208328806230490">Užregistravote spausdintuvus „<ph name="CLOUD_PRINT_NAME" />“ naudodami <ph name="EMAIL" /> paskyrą</translation> <translation id="9052404922357793350">Toliau blokuoti</translation> +<translation id="9053091947372579468">Prie jūsų įrenginio yra pridėta „Chrome“ licencija, bet jūsų naudotojo vardas nesusietas su administratoriaus pultu. Sukurkite administratoriaus pulto paskyrą, kad galėtumėte pradėti registraciją. Pastaba: jei kurdami naują administratoriaus pulto paskyrą pasirenkate naudoti savo domeną, prisiregistravę turite atlikti domeno patvirtinimo veiksmus. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Prisiminti mano pasirinkimą</translation> <translation id="9055636786322918818">Taikyti RC4 šifruotę. Naudojant šią parinktį padidėja rizika, nes RC4 šifrai nesaugūs.</translation> <translation id="9056034633062863292">„Chromebox“ atnaujinamas</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Nustatyti kaip numatytąją</translation> <translation id="9219103736887031265">Vaizdai</translation> <translation id="9220525904950070496">Pašalinti paskyrą</translation> +<translation id="9220820413868316583">Pakelkite ir bandykite dar kartą.</translation> <translation id="923467487918828349">Rodyti viską</translation> <translation id="928985544179707652">Plėtiniai:</translation> <translation id="930268624053534560">Išsamios laiko žymės</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 51354f824..47988da 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nav tīklu</translation> <translation id="1056898198331236512">Brīdinājums</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Pirksta nospieduma reģistrēšana</translation> <translation id="1061904396131502319">Tūlīt būs pārtraukums</translation> <translation id="1062407476771304334">Aizstāt</translation> <translation id="1067048845568873861">Izveidots</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Dimants</translation> <translation id="1114335938027186412">Jūsu datorā ir ietverta uzticamas platformas moduļa (Trusted Platform Module — TPM) drošības ierīce, kas tiek izmantota, lai operētājsistēmā Chrome OS ieviestu daudz svarīgu drošības funkciju. Lai uzzinātu vairāk, apmeklējiet Chromebook palīdzības centru: https://support.google.com/chromebook/?p=tpm.</translation> <translation id="1114525161406758033">Aktivizēt miega režīmu, kad vāks tiek aizvērts</translation> +<translation id="1115324527092594775">Better Together iestatīšana</translation> <translation id="1116694919640316211">Par</translation> <translation id="1116779635164066733">Šis iestatījums tiek kontrolēts, izmantojot paplašinājumu “<ph name="NAME" />”.</translation> <translation id="111844081046043029">Vai jūs tiešām vēlaties pamest šo lapu?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Pašreizējais laiks</translation> <translation id="1157102636231978136">Pārlūkošanas dati un darbības tiek sinhronizētas ar jūsu Google kontu</translation> <translation id="1161575384898972166">Pierakstieties ierīcē <ph name="TOKEN_NAME" />, lai eksportētu klienta sertifikātu.</translation> +<translation id="1161699061380012396">Chrome OS ievades metode</translation> <translation id="1163931534039071049">Skatīt rāmja avotu</translation> <translation id="1164674268730883318">Vai izslēgt Smart Lock ierīcei <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Ievadiet PIN atbloķēšanas atslēgu</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play veikala konts</translation> <translation id="2509495747794740764">Mērogošanas apjomam ir jābūt skaitlim no 10 līdz 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Veidlapu automātiskā aizpilde</translation> <translation id="2513403576141822879">Papildu iestatījumus, kas attiecas uz konfidencialitāti, drošību un datu apkopošanu, skatiet lapā <ph name="BEGIN_LINK" />Sinhronizēšana un Google pakalpojumi<ph name="END_LINK" />.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Meklēt</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Sērijas numurs: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">Skatīt rāmja a&votu</translation> <translation id="3022978424994383087">Nesapratu.</translation> +<translation id="3023464535986383522">Atlasīt, lai izrunātu</translation> <translation id="3024374909719388945">Lietot 24 stundu pulksteni</translation> <translation id="302781076327338683">Atkārtoti ielādēt, ignorējot kešatmiņu</translation> <translation id="3031417829280473749">Aģente X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Nākamā ievades metode</translation> <translation id="3640214691812501263">Vai vēlaties pievienot lietotni “<ph name="EXTENSION_NAME" />” lietotājam <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Platums</translation> +<translation id="3645372836428131288">Mazliet pakustiniet, lai uzņemtu citu pirksta nospieduma daļu</translation> <translation id="3648348069317717750">Konstatēta ierīce <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Fotoattēls tika uzņemts.</translation> <translation id="3650952250015018111">Atļaujiet lietotnei “<ph name="APP_NAME" />” piekļūt šādai ierīcei:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Sertifikātu politika</translation> <translation id="392089482157167418">Iespējot ChromeVox (balss komentārus)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Jums nav nesen ierakstītu WebRTC žurnālu.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Atspraust no plaukta</translation> <translation id="3926002189479431949">Ir mainījies ar Smart Lock saistītais tālrunis</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Bucefals</translation> <translation id="4387004326333427325">Autentifikācijas sertifikāts tika attāli noraidīts.</translation> <translation id="4389091756366370506">Lietotājs <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth konfigurāciju kontrolē <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Atspējot</translation> <translation id="4400367121200150367">Šeit tiks parādītas vietnes, kurās nekad netiek saglabātas paroles.</translation> <translation id="4400632832271803360">Turiet palaišanas programmas taustiņu, lai pārslēgtu augšējās rindas taustiņu funkcijas.</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Turpināt atļaut šai vietnei skatīt starpliktuves saturu</translation> <translation id="4530494379350999373">Avots</translation> <translation id="4533985347672295764">Centrālā procesora laiks</translation> +<translation id="4534661889221639075">Mēģiniet vēlreiz.</translation> <translation id="4535127706710932914">Noklusējuma profils</translation> <translation id="4538417792467843292">Dzēst vārdu</translation> <translation id="4538684596480161368">Vienmēr bloķēt smilškastē neievietotos spraudņus vietnē <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automātiski labot</translation> <translation id="4880827082731008257">Meklēšanas vēsture</translation> <translation id="4881695831933465202">Atvērt</translation> +<translation id="4882312758060467256">Var piekļūt šai vietnei</translation> <translation id="4882473678324857464">Izcelt grāmatzīmes</translation> <translation id="4882831918239250449">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas, reklāmu un cita satura personalizēšanai</translation> <translation id="4883178195103750615">Eksportēt grāmatzīmes HTML failā...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Albums</translation> <translation id="4971412780836297815">Atvērt, kad pabeigta</translation> <translation id="4972129977812092092">Printera rediģēšana</translation> +<translation id="4972164225939028131">Nepareiza parole</translation> <translation id="497287958838527945">Kredītkartes un adreses no pakalpojuma Google Pay</translation> <translation id="4973307593867026061">Pievienot printerus</translation> <translation id="4973523518332075481">Izmantojiet nosaukumu, kas nepārsniedz <ph name="MAX_LENGTH" /> rakstzīmes.</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Notiek lietotņu ielāde...</translation> <translation id="5592595402373377407">Vēl nav pieejams pietiekami daudz datu.</translation> +<translation id="5593357315997824387">Sinhronizēt failus</translation> <translation id="5595152862129936745">Ļoti tālu</translation> <translation id="5595485650161345191">Rediģēt adresi</translation> <translation id="5596627076506792578">Citas opcijas</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Diemžēl jūsu datora konfigurācijā tika izmantots nepareizi veidots aparatūras ID. Šī iemesla dēļ operētājsistēmu Chrome OS nevarēja atjaunināt, izmantojot jaunākos drošības labojumus, un jūsu dators, iespējams, <ph name="BEGIN_BOLD" />nebūs aizsargāts pret ļaunprātīgiem uzbrukumiem<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Atverot jūsu profilu, radās kļūda. Lūdzu, izrakstieties un vēlreiz pierakstieties.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">apturēt taimeri</translation> <translation id="667517062706956822">Vai vēlaties, lai Google tulkotu šo lapu šādā valodu kombinācijā: <ph name="SOURCE_LANGUAGE" />–<ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Rādītājierīce ir pievienota.</translation> <translation id="6678717876183468697">Vaicājuma URL</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Saglabāšana rīkjoslā</translation> <translation id="7187428571767585875">Noņemamie vai maināmie reģistra ieraksti:</translation> <translation id="7189234443051076392">Ierīcē ir jābūt pietiekami daudz vietas.</translation> +<translation id="7189965711416741966">Pirksta nospiedums tika pievienots.</translation> <translation id="7191159667348037">Nezināms printeris (USB)</translation> <translation id="7191454237977785534">Saglabāt failu kā</translation> <translation id="7193374945610105795">Vietnei <ph name="ORIGIN" /> nav saglabāta neviena parole</translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Jauns logs</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> tagad ir redzams pilnekrāna režīmā.</translation> <translation id="7340650977506865820">Vietne kopīgo jūsu ekrānu.</translation> +<translation id="7341834142292923918">Vēlas piekļūt šai vietnei</translation> <translation id="7345706641791090287">Apstipriniet savu paroli</translation> <translation id="7346909386216857016">Labi, sapratu</translation> <translation id="7347751611463936647">Lai izmantotu šo paplašinājumu, ierakstiet <ph name="EXTENSION_KEYWORD" />, pēc tam TAB un komandu vai meklēšanas vaicājumu.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google atrašanās vietu pakalpojumos tiek izmantoti tādi avoti kā Wi-Fi, mobilais tīkls un sensori, lai palīdzētu noteikt jūsu ierīces atrašanās vietu. Šis pakalpojums ir aktīvs, ja ierīces atrašanās vietas iestatījums ir ieslēgts.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Varat izslēgt atrašanās vietas noteikšanu, savā ierīcē izslēdzot galveno atrašanās vietas noteikšanas iestatījumu. Atrašanās vietas iestatījumos varat arī izslēgt Wi-Fi, mobilo tīklu un sensoru izmantošanu atrašanās vietas noteikšanai.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Paroles izveide —</translation> -<translation id="7518150891539970662">WebRTC žurnāli (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Izveidot</translation> <translation id="7529411698175791732">Pārbaudiet interneta savienojumu. Ja neizdodas novērst problēmu, izrakstieties un atkārtoti pierakstieties.</translation> @@ -4745,6 +4755,7 @@ <translation id="8214962590150211830">Noņemt šo lietotāju</translation> <translation id="8217399928341212914">Turpināt bloķēt vairāku failu automātisku lejupielādēšanu</translation> <translation id="8223479393428528563">Lai saglabātu šos failus izmantošanai bezsaistē, aktivizējiet tiešsaistes režīmu, ar peles labo pogu noklikšķiniet uz failiem un atlasiet opciju <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Izmantot piedāvājumus</translation> <translation id="8226222018808695353">Aizliegts</translation> <translation id="8226619461731305576">Rinda</translation> <translation id="8226742006292257240">Tālāk redzama nejauši izveidota TPM parole, kas piešķirta jūsu datoram:</translation> @@ -4791,6 +4802,7 @@ <translation id="8286036467436129157">Pierakstīties</translation> <translation id="8286963743045814739">Varat pārlūkot tīmekli privāti inkognito režīma logā.</translation> <translation id="82871696630048499">Tīmekļa lapa tika ielādēta atkārtoti, jo atmiņā nepietika vietas.</translation> +<translation id="8288032458496410887">Vai atinstalēt lietotni <ph name="APP" />?</translation> <translation id="8291967909914612644">Mājas pakalpojumu sniedzēja valsts</translation> <translation id="8294431847097064396">Avots</translation> <translation id="8297006494302853456">Vājš</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Vispirms jautāt (ieteicams)</translation> <translation id="8418445294933751433">Rādīt kā cilni</translation> <translation id="8419098111404128271">Vaicājuma “<ph name="SEARCH_TEXT" />” meklēšanas rezultāti</translation> +<translation id="8419368276599091549">Laipni lūdzam jūsu <ph name="DEVICE_TYPE" /> ierīcē!</translation> <translation id="8420060421540670057">Rādīt Google dokumentu failus</translation> <translation id="8424039430705546751">uz leju</translation> <translation id="8425213833346101688">Mainīt</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Konfigurēt tīkla savienojumus</translation> <translation id="8624205858755890468">Ļauj Asistentam rādīt saistītu informāciju, lietotnes un darbības.</translation> <translation id="862542460444371744">Paplašināju&mi</translation> +<translation id="8626219642120025691">Taimeris gatavs</translation> <translation id="8627151598708688654">Avota atlasīšana</translation> <translation id="862727964348362408">Atlikts</translation> <translation id="862750493060684461">CSS kešatmiņa</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Izmaiņas tiek saglabātas automātiski.<ph name="BREAKS" />Lai saglabātu sākotnējā attēla kopiju, noņemiet atzīmi no izvēles rūtiņas “Pārrakstīt sākotnējo”.</translation> <translation id="8777628254805677039">saknes parole</translation> <translation id="8780443667474968681">Balss meklēšana ir izslēgta.</translation> +<translation id="878068003854005405">Sāciet pievienošanu. Novietojiet pirkstu uz sensora.</translation> <translation id="878069093594050299">Pārbaudīti šādi sertifikāta izmantošanas veidi:</translation> <translation id="8781980678064919987">Izslēgt, kad vāks tiek aizvērts</translation> <translation id="8782565991310229362">Kioska lietojumprogrammas palaišana tika atcelta.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Ieejas frāze</translation> <translation id="9052208328806230490">Jūs esat reģistrējis savus printerus ar nosaukumu <ph name="CLOUD_PRINT_NAME" />, izmantojot kontu <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Turpināt bloķēt</translation> +<translation id="9053091947372579468">Jūsu ierīcei ir Chrome licence, tomēr jūsu lietotājvārds nav piesaistīts administrēšanas konsolei. Lai turpinātu reģistrāciju, izveidojiet administrēšanas konsoles kontu. Piezīme: ja jauna administrēšanas konsoles konta izveidei izmantosiet savu domēnu, pēc reģistrēšanas būs jāveic arī domēna verifikācijas procedūra. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Atcerēties manu izvēli</translation> <translation id="9055636786322918818">Piemērot RC4 šifrēšanu. Ja izmantosiet šo opciju, palielināsies risks, jo RC4 šifri nav droši.</translation> <translation id="9056034633062863292">Chromebox datora atjaunināšana</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Iestatīt kā noklusējumu</translation> <translation id="9219103736887031265">Attēli</translation> <translation id="9220525904950070496">Konta noņemšana</translation> +<translation id="9220820413868316583">Paceliet pirkstu un pēc tam mēģiniet vēlreiz.</translation> <translation id="923467487918828349">Rādīt visus</translation> <translation id="928985544179707652">Paplašinājumi:</translation> <translation id="930268624053534560">Detalizēti laikspiedoli</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 193822f..df3262c9 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">നെറ്റ്വർക്കുകളൊന്നും ഇല്ല</translation> <translation id="1056898198331236512">മുന്നറിയിപ്പ്</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">ഫിംഗർപ്രിന്റ് രജിസ്റ്റർ ചെയ്യുന്നു</translation> <translation id="1061904396131502319">ഇടവേളയ്ക്കുള്ള സമയം ആകാറായിരിക്കുന്നു</translation> <translation id="1062407476771304334">മാറ്റിസ്ഥാപിക്കുക</translation> <translation id="1067048845568873861">സൃഷ്ടിച്ചു</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">ഡയമണ്ട്</translation> <translation id="1114335938027186412">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ Chrome OS-ലെ നിരവധി നിർണ്ണായകമായ സുരക്ഷാ ഫീച്ചറുകൾ നടപ്പിലാക്കാൻ ഉപയോഗിക്കുന്ന സുരക്ഷാ ഉപകരണമായ പരിചിത പ്ലാറ്റ്ഫോം മൊഡ്യൂൾ (TPM) അടങ്ങിയിരിക്കുന്നു. കൂടുതലറിയാൻ Chromebook സഹായകേന്ദ്രം സന്ദർശിക്കുക: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">ലിഡ് അടഞ്ഞിരിക്കുമ്പോൾ സ്ലീപ്പാക്കുക</translation> +<translation id="1115324527092594775">Better Together സജ്ജീകരിക്കുക</translation> <translation id="1116694919640316211">വിവരം</translation> <translation id="1116779635164066733">"<ph name="NAME" />" വിപുലീകരണമാണ് ഈ ക്രമീകരണം നടപ്പിലാക്കുന്നത്.</translation> <translation id="111844081046043029">നിങ്ങള്ക്ക് ഈ പേജ് ഉപേക്ഷിക്കുന്നതിന് താല്പര്യമുണ്ടോ?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">നിലവിലെ സമയം</translation> <translation id="1157102636231978136">നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിച്ചിരിക്കുന്ന, നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയും ആക്റ്റിവിറ്റിയും</translation> <translation id="1161575384898972166">ക്ലയന്റ് സര്ട്ടിഫിക്കറ്റ് കയറ്റുമതി ചെയ്യുന്നതിന് ദയവായി <ph name="TOKEN_NAME" /> എന്നതിലേക്ക് പ്രവേശിക്കുക.</translation> +<translation id="1161699061380012396">Chrome OS ഇൻപുട്ട് രീതി</translation> <translation id="1163931534039071049">&ഫ്രെയിം ഉറവിടം കാണുക</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> ഉപകരണത്തിന്റെ Smart Lock ഓഫാക്കണോ?</translation> <translation id="1164899421101904659">പിൻ അൺലോക്ക് കീ നൽകുക</translation> @@ -530,7 +533,7 @@ <translation id="1773212559869067373">പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് പ്രാദേശികമായി നിരസിച്ചു</translation> <translation id="177336675152937177">ഹോസ്റ്റുചെയ്ത അപ്ലിക്കേഷൻ ഡാറ്റ</translation> <translation id="1774349594977710164">നിങ്ങളുടെ മറ്റ് <ph name="DEVICE_TYPE" /> ഉപകരണങ്ങളും സ്വയമേവ സമന്വയിപ്പിച്ചിരിക്കുന്നതിനാൽ ഫോൺ അവയും അൺലോക്കുചെയ്യുന്നു.</translation> -<translation id="1774833706453699074">തുറന്ന പേജുകൾ ബുക്ക്മാർക്കുചെയ്യുക...</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> @@ -757,7 +760,7 @@ <translation id="2135787500304447609">&പുനരാരംഭിക്കുക</translation> <translation id="2136372518715274136">പുതിയ പാസ്വേഡ് നൽകുക</translation> <translation id="2136476978468204130">നിങ്ങള് നല്കിയ പാസ്ഫ്രേസ് തെറ്റാണ്</translation> -<translation id="2137068468602026500">വെബ് ബ്രൗസറിൽ <ph name="BEGIN_BOLD" />Microsoft Edge<ph name="END_BOLD" /> ക്ലിക്കുചെയ്യുക</translation> +<translation id="2137068468602026500">വെബ് ബ്രൗസറിൽ <ph name="BEGIN_BOLD" />Microsoft Edge<ph name="END_BOLD" /> ക്ലിക്ക് ചെയ്യുക</translation> <translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" എന്നതിലേക്കുള്ള കണക്ഷൻ ഇപ്പോഴും പുരോഗതിയിലാണ്</translation> <translation id="214169863967063661">ദൃശ്യമാകുന്ന രീതിയുടെ ക്രമീകരണം തുറക്കുക</translation> <translation id="2142328300403846845">ലിങ്ക് ഇനിപ്പറയുന്നതായി തുറക്കുക</translation> @@ -856,7 +859,7 @@ <translation id="2276503375879033601">കൂടുതൽ അപ്ലിക്കേഷനുകൾ ചേർക്കുക</translation> <translation id="2277255602909579701">എല്ലാ കുക്കികളും സൈറ്റ് വിവരങ്ങളും</translation> <translation id="2277769717710009150">{COUNT,plural, =1{ഒരു ഇനം പകർത്തി}other{# ഇനങ്ങൾ പകർത്തി}}</translation> -<translation id="2278562042389100163">ബ്രൌസര് വിന്ഡോ തുറക്കുക</translation> +<translation id="2278562042389100163">ബ്രൗസര് വിന്ഡോ തുറക്കുക</translation> <translation id="2279874276457403668">ഒരേ സമയം ഒരു സെഷൻ മാത്രമേ സൃഷ്ടിക്കാനാവൂ.</translation> <translation id="2280486287150724112">വലത് മാര്ജിന്</translation> <translation id="2282146716419988068">GPU പ്രോസസ്സ്</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play സ്റ്റോർ അക്കൗണ്ട്</translation> <translation id="2509495747794740764">സ്കെയിൽ തുക 10-നും 200-നും ഇടയിലുള്ള സംഖ്യ ആയിരിക്കണം.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">ഫോമുകൾ ഓട്ടോഫിൽ ചെയ്യുക</translation> <translation id="2513403576141822879">സ്വകാര്യത, സുരക്ഷ, ഡാറ്റാ ശേഖരണം എന്നിവയുമായി ബന്ധപ്പെട്ട കൂടുതൽ ക്രമീകരണത്തിന്, <ph name="BEGIN_LINK" />സമന്വയവും Google സേവനങ്ങളും<ph name="END_LINK" /> കാണുക</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">സ്കാൻ ചെയ്യുക</translation> @@ -1097,7 +1099,7 @@ <translation id="2649045351178520408">Base64-എന്കോഡുചെയ്ത ASCII, സര്ട്ടിഫിക്കറ്റ് ചെയിന്</translation> <translation id="2651353619134567122">സിസ്റ്റം ഡാറ്റ അയയ്ക്കുക. ഈ ഉപകരണം നിലവിൽ Google-ന് ഡയഗ്നോസ്റ്റിക് ഡാറ്റയും ഉപയോഗ ഡാറ്റയും ആപ്പ് ഉപയോഗ ഡാറ്റയും സ്വമേധയാ അയയ്ക്കുന്നു. നിങ്ങളുടെ ഉപകരണത്തിന്റെ <ph name="BEGIN_LINK1" />ക്രമീകരണത്തിൽ<ph name="END_LINK1" /> എപ്പോൾ വേണമെങ്കിലും ഇത് മാറ്റാനാകും. അധിക 'വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി' ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, നിങ്ങളുടെ അക്കൗണ്ട് ഉപയോഗിച്ച് ഈ വിവരങ്ങൾ സംഭരിക്കപ്പെടും. അതിനാൽ, നിങ്ങൾക്ക് ഇത് എന്റെ ആക്റ്റിവിറ്റിയിൽ നിയന്ത്രിക്കാവുന്നതാണ്. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation> <translation id="2653033005692233957">തിരയൽ പരാജയപ്പെട്ടു</translation> -<translation id="2653266418988778031">നിങ്ങളൊരു സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി (CA) ഇല്ലാതാക്കുകയാണെങ്കില്, നിങ്ങളുടെ ബ്രൌസര് ഇനിമുതല് ആ CA നല്കുന്ന സാക്ഷ്യപത്രങ്ങളെയൊന്നും വിശ്വസിക്കില്ല.</translation> +<translation id="2653266418988778031">നിങ്ങളൊരു സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി (CA) സർട്ടിഫിക്കേറ്റ് ഇല്ലാതാക്കുകയാണെങ്കില്, നിങ്ങളുടെ ബ്രൗസര് ഇനിമുതല് CA നല്കുന്ന സാക്ഷ്യപത്രങ്ങളെയൊന്നും വിശ്വസിക്കില്ല.</translation> <translation id="2653659639078652383">സമര്പ്പിക്കൂ</translation> <translation id="265390580714150011">ഫീല്ഡ് മൂല്യം</translation> <translation id="2654166010170466751">പേയ്മെന്റ് ഹാൻഡ്ലറുകളെ ഇൻസ്റ്റാൾ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു</translation> @@ -1212,13 +1214,13 @@ <translation id="2806891468525657116">കുറുക്കുവഴി മുമ്പേ നിലവിലുണ്ട്</translation> <translation id="2807517655263062534">നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകൾ ഇവിടെ ദൃശ്യമാകും</translation> <translation id="2809586584051668049">ഒപ്പം <ph name="NUMBER_ADDITIONAL_DISABLED" /> എണ്ണം കൂടി</translation> -<translation id="281133045296806353">നിലവിലുള്ള ബ്രൌസിംഗ് സെഷനില് പുതിയ വിന്ഡോ സൃഷ്ടിച്ചു.</translation> +<translation id="281133045296806353">നിലവിലുള്ള ബ്രൗസിംഗ് സെഷനില് പുതിയ വിന്ഡോ സൃഷ്ടിച്ചു.</translation> <translation id="2812944337881233323">സൈൻ ഔട്ട് ചെയ്ത്, വീണ്ടും ആരംഭിക്കുന്നത് പരീക്ഷിച്ചുനോക്കൂ</translation> <translation id="2812989263793994277">ചിത്രങ്ങളൊന്നും കാണിക്കരുത്</translation> <translation id="2814489978934728345">ഈ പേജ് ലോഡ് ചെയ്യുന്നത് നിര്ത്തുക</translation> <translation id="281504910091592009">നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google അക്കൗണ്ടിൽ<ph name="END_LINK" /> സംരക്ഷിച്ച പാസ്വേഡുകൾ കാണുക, മാനേജ് ചെയ്യുക</translation> -<translation id="2815500128677761940">ബുക്മാര്ക്ക് ബാര്</translation> -<translation id="2815693974042551705">ഫോൾഡർ ബുക്ക്മാർക്കുചെയ്യുക</translation> +<translation id="2815500128677761940">ബുക്ക്മാര്ക്ക് ബാര്</translation> +<translation id="2815693974042551705">ഫോൾഡർ ബുക്ക്മാർക്ക് ചെയ്യുക</translation> <translation id="2818476747334107629">പ്രിന്റർ വിശദാംശങ്ങൾ</translation> <translation id="2820957248982571256">സ്കാൻ ചെയ്യുന്നു...</translation> <translation id="2822634587701817431">ചുരുക്കുക / വികസിപ്പിക്കുക</translation> @@ -1354,6 +1356,7 @@ <translation id="3020990233660977256">സീരിയല് നമ്പര്: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&ഫ്രെയിം ഉറവിടം കാണുക</translation> <translation id="3022978424994383087">അത് മനസ്സിലായില്ല.</translation> +<translation id="3023464535986383522">വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക</translation> <translation id="3024374909719388945">24 മണിക്കൂര് ക്ലോക്ക് ഉപയോഗിക്കുക</translation> <translation id="302781076327338683">കാഷെ ബൈപാസുചെയ്യുന്നത് റീലോഡുചെയ്യുക</translation> <translation id="3031417829280473749">ഏജന്റ് X</translation> @@ -1563,7 +1566,7 @@ <translation id="3368922792935385530">ബന്ധിപ്പിച്ചു</translation> <translation id="3369624026883419694">റിസോള്വിംഗ് ഹോസ്റ്റ്...</translation> <translation id="337286756654493126">നിങ്ങൾ അപ്ലിക്കേഷനിൽ തുറക്കുന്ന ഫോൾഡറുകൾ റീഡുചെയ്യുക</translation> -<translation id="3378503599595235699">നിങ്ങൾ ബ്രൗസറിൽ നിന്ന് പുറത്തുകടക്കും വരെ പ്രാദേശിക ഡാറ്റ സൂക്ഷിക്കുക</translation> +<translation id="3378503599595235699">നിങ്ങൾ ബ്രൗസറിൽ നിന്ന് പുറത്തുകടക്കും വരെ മാത്രം പ്രാദേശിക ഡാറ്റ സൂക്ഷിക്കുക</translation> <translation id="3378572629723696641">ഈ വിപുലീകരണം കേടായിരിക്കാം.</translation> <translation id="3378630551672149129">ഇൻപുട്ട് ഘടകങ്ങളുമായി സംവദിക്കാൻ സൈൻ ഇൻ ചെയ്ത്, ടാബ് കീ അമർത്തുക</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> ഇന്സ്റ്റാള് ചെയ്യും.</translation> @@ -1714,7 +1717,7 @@ <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="3603533104205588786">ഒരു പേജ് ബുക്ക്മാർക്ക് ചെയ്യാൻ നക്ഷത്ര ചിഹ്നത്തിൽ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="3603622770190368340">നെറ്റ്വർക്ക് സർട്ടിഫിക്കറ്റ് ലഭ്യമാക്കുക</translation> <translation id="3604048165392640554">മൊബൈൽ കണക്ഷനൊന്നും കണ്ടെത്തിയില്ല. നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ തൽക്ഷണ ടെതറിംഗ് ഓണാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക. <a target="_blank" href="<ph name="URL" />">കൂടുതലറിയുക</a></translation> <translation id="3605780360466892872">ബട്ടൺഡൗൺ</translation> @@ -1750,6 +1753,7 @@ <translation id="363903084947548957">അടുത്ത ടൈപ്പുചെയ്യൽ രീതി</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> എന്നയാൾക്കായി "<ph name="EXTENSION_NAME" />" ചേർക്കണോ?</translation> <translation id="3644896802912593514">വീതി</translation> +<translation id="3645372836428131288">ഫിംഗർപ്രിന്റിന്റെ മറ്റൊരു ഭാഗം പകർത്താൻ ചെറുതായി നീക്കുക.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> കണ്ടെത്തി</translation> <translation id="3649138363871392317">ഫോട്ടോ എടുത്തു</translation> <translation id="3650952250015018111">ആക്സസ് ചെയ്യാൻ "<ph name="APP_NAME" />" ആപ്പിനെ അനുവദിക്കുക:</translation> @@ -1791,7 +1795,7 @@ <translation id="3704331259350077894">പ്രവര്ത്തന വിരാമം</translation> <translation id="3705722231355495246">-</translation> <translation id="370665806235115550">ലോഡ്ചെയ്യുന്നു...</translation> -<translation id="3709244229496787112">ഡൗൺലോഡുചെയ്യൽ പൂർത്തിയാകുന്നതിന് മുമ്പ് ബ്രൗസർ ഷട്ട്ഡൗൺ ചെയ്തു.</translation> +<translation id="3709244229496787112">ഡൗൺലോഡ് ചെയ്യൽ പൂർത്തിയാകുന്നതിന് മുമ്പ് ബ്രൗസർ ഷട്ട്ഡൗൺ ചെയ്തു.</translation> <translation id="3711895659073496551">താൽക്കാലികമായി നിർത്തുക</translation> <translation id="3712217561553024354">നിങ്ങളുടെ Google അക്കൗണ്ടുള്ളതും മൊബൈല് ഡാറ്റാ കണക്ഷൻ ഉള്ളതുമായ മറ്റ് ഉപകരണങ്ങളെ കണ്ടെത്തുന്നതിന് ഈ ഉപകരണത്തെ അനുവദിക്കുക</translation> <translation id="3712897371525859903">പേജ് &ഇതുപോലെ സംരക്ഷിക്കുക...</translation> @@ -1945,7 +1949,6 @@ <translation id="3920504717067627103">സര്ട്ടിഫിക്കറ്റ് നയങ്ങള്</translation> <translation id="392089482157167418">ChromeVox (സ്പോക്കൺ ഫീഡ്ബാക്ക്) പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">നിങ്ങൾക്ക് സമീപകാലത്ത് ക്യാപ്ചർചെയ്ത WebRTC ലോഗുകളൊന്നുമില്ല.</translation> <translation id="3925573269917483990">ക്യാമറ:</translation> <translation id="3925842537050977900">ഷെൽഫിൽ നിന്നും അൺപിൻ ചെയ്യുക</translation> <translation id="3926002189479431949">Smart Lock ഫോൺ മാറി</translation> @@ -2220,6 +2223,7 @@ <translation id="438503109373656455">സാരറ്റോഗ</translation> <translation id="4387004326333427325">പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് വിദൂരമായി നിരസിച്ചു</translation> <translation id="4389091756366370506">ഉപയോക്താവ്<ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth കോൺഫിഗറേഷൻ നിയന്ത്രിക്കുന്നത് <ph name="USER_EMAIL" /> ആണ്.</translation> <translation id="4394049700291259645">അപ്രാപ്തമാക്കുക</translation> <translation id="4400367121200150367">ഇവിടെ ദൃശ്യമാകുന്ന സൈറ്റുകള് ഒരിക്കലും പാസ്വേഡുകള് സംരക്ഷിക്കില്ല</translation> <translation id="4400632832271803360">മുകൾ-വരിയിലെ കീകളുടെ പ്രവർത്തനരീതി മാറ്റാൻ 'ലോഞ്ചർ' കീ അമർത്തിപ്പിടിക്കുക</translation> @@ -2235,7 +2239,7 @@ <translation id="4419409365248380979">കുക്കികളെ സജ്ജീകരിക്കാന് <ph name="HOST" />-നെ എപ്പോഴും അനുവദിക്കുക</translation> <translation id="4419556793104466535">സമന്വയം, വ്യക്തിപരമാക്കൽ എന്നിവയും മറ്റും നിയന്ത്രിക്കുക</translation> <translation id="4421932782753506458">ഫ്ലഫി</translation> -<translation id="4422347585044846479">ഈ പേജിനായി ബുക്മാര്ക്ക് എഡിറ്റ് ചെയ്യുക</translation> +<translation id="4422347585044846479">ഈ പേജിനായി ബുക്ക്മാര്ക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="4423376891418188461">ക്രമീകരണം പുനഃസ്ഥാപിക്കുക</translation> <translation id="4423482519432579560">&അക്ഷരത്തെറ്റ് പരിശോധന</translation> <translation id="442397852638519243"><ph name="USER_NAME" />, അഡ്മിനിസ്ട്രേറ്റർ നിങ്ങളുടെ പാസ്വേഡ് മാറ്റാൻ ആവശ്യപ്പെടുന്നു.</translation> @@ -2293,6 +2297,7 @@ <translation id="4522600456902129422">ക്ലിപ്പ്ബോർഡ് കാണാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നത് തുടരുക</translation> <translation id="4530494379350999373">ഉറവിടം</translation> <translation id="4533985347672295764">CPU സമയം</translation> +<translation id="4534661889221639075">വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4535127706710932914">സ്ഥിരസ്ഥിതി പ്രൊഫൈൽ</translation> <translation id="4538417792467843292">പദം ഇല്ലാതാക്കുക</translation> <translation id="4538684596480161368"><ph name="HOST" /> എന്നതില് എല്ലായ്പ്പോഴും ഈ അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗിന്നുകളെ തടയുക</translation> @@ -2522,6 +2527,7 @@ <translation id="4880520557730313061">സ്വയമേവ ശരിയാക്കുക</translation> <translation id="4880827082731008257">തിരയൽ ചരിത്രം</translation> <translation id="4881695831933465202">തുറക്കുക</translation> +<translation id="4882312758060467256">ഈ സൈറ്റിലേക്ക് ആക്സസ് ഉണ്ട്</translation> <translation id="4882473678324857464">ബുക്ക്മാർക്കുകൾ കേന്ദ്രീകരിക്കുക</translation> <translation id="4882831918239250449">തിരയൽ, പരസ്യങ്ങൾ എന്നിവയും മറ്റും വ്യക്തിപരമാക്കുന്നതിനായി നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="4883178195103750615">HTML ഫയലിലേക്ക് ബുക്ക്മാർക്കുകൾ കയറ്റുമതി ചെയ്യുക...</translation> @@ -2587,6 +2593,7 @@ <translation id="4969785127455456148">ആല്ബം</translation> <translation id="4971412780836297815">പൂര്ത്തിയാക്കുമ്പോള് തുറക്കുക</translation> <translation id="4972129977812092092">പ്രിന്റർ എഡിറ്റുചെയ്യുക</translation> +<translation id="4972164225939028131">പാസ്വേഡ് തെറ്റാണ്</translation> <translation id="497287958838527945">Google Pay ഉപയോഗിക്കുന്ന ക്രെഡിറ്റ് കാർഡുകളും വിലാസങ്ങളും.</translation> <translation id="4973307593867026061">പ്രിന്ററുകൾ ചേർക്കുക</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> പ്രതീകങ്ങളോ അതിൽ കുറവോ ഉള്ള ഒരു പേര് ഉപയോഗിക്കുക</translation> @@ -2639,7 +2646,7 @@ <translation id="5050042263972837708">ഗ്രൂപ്പിന്റെ പേര്</translation> <translation id="5052499409147950210">സൈറ്റ് എഡിറ്റുചെയ്യുക</translation> <translation id="5053604404986157245">ക്രമരഹിതമായി സൃഷ്ടിച്ച TPM പാസ്വേഡ് ലഭ്യമല്ല. പുതുക്കിയെടുക്കലിന് ശേഷം ഇത് സാധാരണമാണ്.</translation> -<translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ഈ ഫോൾഡറിൽ ഒരു ബുക്ക്മാർക്ക് അടങ്ങിയിരിക്കുന്നു. നിങ്ങൾക്ക് ഇത് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?}other{ഈ ഫോൾഡറിൽ # ബുക്ക്മാർക്കുകൾ അടങ്ങിയിരിക്കുന്നു. നിങ്ങൾക്ക് ഇത് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?}}</translation> +<translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ഈ ഫോൾഡറിൽ ഒരു ബുക്ക്മാർക്ക് അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}other{ഈ ഫോൾഡറിൽ # ബുക്ക്മാർക്കുകൾ അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}}</translation> <translation id="5061708541166515394">കോണ്ട്രാസ്റ്റ്</translation> <translation id="5062930723426326933">സൈൻ ഇൻ പരാജയപ്പെട്ടു, ഇന്റർനെറ്റിൽ കണക്റ്റുചെയ്തതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="5063480226653192405">ഉപയോഗം</translation> @@ -2686,7 +2693,7 @@ <translation id="5127881134400491887">നെറ്റ്വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കുക</translation> <translation id="512903556749061217">അറ്റാച്ചുചെയ്തു</translation> <translation id="5133483819862530305">സൂര്യോദയം മുതൽ അസ്തമയം വരെ</translation> -<translation id="5135533361271311778">ബുക്ക്മാര്ക്ക് ഇനം സൃഷ്ടിക്കാന് കഴിഞ്ഞില്ല.</translation> +<translation id="5135533361271311778">ബുക്ക്മാര്ക്ക് ഇനം സൃഷ്ടിക്കാനായില്ല.</translation> <translation id="5136529877787728692">F7</translation> <translation id="5137501176474113045">ഈ ഇനം ഇല്ലാതാക്കുക</translation> <translation id="5139955368427980650">&തുറക്കൂ</translation> @@ -2857,7 +2864,7 @@ <translation id="5374359983950678924">ചിത്രം മാറ്റുക</translation> <translation id="5376169624176189338">പുറകിലേക്ക് പോകാൻ ക്ലിക്കുചെയ്യുക, ചരിത്രം കാണാൻ ഹോൾഡുചെയ്യുക</translation> <translation id="5376931455988532197">ഫയല് വളരെ വലുതാണ്</translation> -<translation id="537813040452600081">ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ സൈൻ ഔട്ട് ചെയ്ത ശേഷം ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, ഒപ്പം കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും നിങ്ങൾ ഡൗൺലോഡുചെയ്യുന്ന ഫയലുകളും സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളും സംരക്ഷിക്കപ്പെടില്ല.</translation> +<translation id="537813040452600081">ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ സൈൻ ഔട്ട് ചെയ്ത ശേഷം ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, ഒപ്പം കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകളും സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളും സംരക്ഷിക്കപ്പെടില്ല.</translation> <translation id="5379140238605961210">മൈക്രോഫോൺ ആക്സസ്സ് തടയുന്നത് തുടരുക</translation> <translation id="5379268888377976432">ഇല്ലാതാക്കിയത് പഴയപടിയാക്കുക</translation> <translation id="5380103295189760361">ആ മോഡിഫയറുകൾക്കുള്ള കീബോർഡ് കുറുക്കുവഴികൾ കാണുന്നതിന് Control, Alt, Shift അമർത്തിപ്പിടിക്കുക അല്ലെങ്കിൽ തിരയുക.</translation> @@ -2933,7 +2940,7 @@ <translation id="5485754497697573575">എല്ലാ ടാബുകളും പുനസ്ഥാപിക്കുക</translation> <translation id="5486261815000869482">പാസ്വേഡ് സ്ഥിരീകരിക്കുക</translation> <translation id="5486275809415469523"><ph name="APP_NAME" />,<ph name="TAB_NAME" /> എന്നതുമായി നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു.</translation> -<translation id="5486561344817861625">ബ്രൗസർ പുനരാരംഭിക്കൽ പരീക്ഷിച്ചുനോക്കുക</translation> +<translation id="5486561344817861625">ബ്രൗസർ പുനരാരംഭിക്കൽ പരീക്ഷിക്കുക</translation> <translation id="5487521232677179737">ഡാറ്റ മായ്ക്കുക</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />' പകർത്തി</translation> <translation id="5488468185303821006">ആള്മാറാട്ടത്തില് അനുവദിക്കുക</translation> @@ -2968,7 +2975,7 @@ <translation id="5526745900034778153">സമന്വയം പുനരാരംഭിക്കാനായി വീണ്ടും സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="5527463195266282916">എക്സ്റ്റന്ഷന് തരം താഴ്ത്തുന്നതിന് ശ്രമിച്ചു.</translation> <translation id="5527474464531963247">നിങ്ങൾക്ക് മറ്റൊരു നെറ്റ്വർക്കും തിരഞ്ഞെടുക്കാവുന്നതാണ്.</translation> -<translation id="5528368756083817449">ബുക്മാര്ക്ക് മാനേജര്</translation> +<translation id="5528368756083817449">ബുക്ക്മാർക്ക് മാനേജര്</translation> <translation id="5530160549030561969">ഓരോ ഫീച്ചറിനുമുള്ള ക്രമീകരണം അവലോകനം ചെയ്ത് ആവശ്യമെങ്കിൽ അവ മാറ്റുക</translation> <translation id="5530766185686772672">ആൾമാറാട്ട ടാബുകൾ അടയ്ക്കുക</translation> <translation id="5532223876348815659">ആഗോളം</translation> @@ -2988,7 +2995,7 @@ <translation id="5553089923092577885">സര്ട്ടിഫിക്കറ്റ് നയ മാപ്പിംഗുകള്</translation> <translation id="5554489410841842733">വിപുലീകരണത്തിന് നിലവിലുള്ള പേജില് പ്രവര്ത്തിക്കാന് കഴിയുമ്പോള്, ഈ ഐക്കണ് കാണാനാകും.</translation> <translation id="5554720593229208774">ഇമെയില് സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി</translation> -<translation id="5556206011531515970">നിങ്ങളുടെ സ്ഥിരം ബ്രൗസർ തിരഞ്ഞെടുക്കാൻ അടുത്തത് ക്ലിക്കുചെയ്യുക.</translation> +<translation id="5556206011531515970">നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ തിരഞ്ഞെടുക്കാൻ അടുത്തത് ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="5556459405103347317">വീണ്ടും ലോഡുചെയ്യുക</translation> <translation id="555746285996217175">ലോക്ക് / പവർ</translation> <translation id="5557991081552967863">സുഷുപ്തിയിലായിരിക്കുമ്പോൾ Wi-Fi ഓണാക്കി നിലനിർത്തുക</translation> @@ -3008,12 +3015,13 @@ <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation> <translation id="5582839680698949063">പ്രധാന മെനു</translation> <translation id="5583640892426849032">ബാക്ക്സ്പെയ്സ്</translation> -<translation id="5585118885427931890">ബുക്ക്മാര്ക്ക് ഫോള്ഡര് സൃഷ്ടിക്കാന് കഴിഞ്ഞില്ല.</translation> +<translation id="5585118885427931890">ബുക്ക്മാര്ക്ക് ഫോള്ഡര് സൃഷ്ടിക്കാനായില്ല.</translation> <translation id="558563010977877295">ഒരു നിർദ്ദിഷ്ട പേജോ ഒരു കൂട്ടം പേജുകളോ തുറക്കുക</translation> <translation id="5585912436068747822">ഫോർമാറ്റുചെയ്യൽ പരാജയപ്പെട്ടു</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ആപ്പുകൾ ലോഡുചെയ്യുന്നു...</translation> <translation id="5592595402373377407">ഇതുവരെയും മതിയായ ഡാറ്റ ലഭ്യമല്ല.</translation> +<translation id="5593357315997824387">എന്റെ ഫയലുകൾ സമന്വയിപ്പിക്കുക</translation> <translation id="5595152862129936745">വളരെ ദൂരെ</translation> <translation id="5595485650161345191">വിലാസം എഡിറ്റുചെയ്യുക</translation> <translation id="5596627076506792578">കൂടുതൽ ഓപ്ഷനുകൾ</translation> @@ -3269,7 +3277,7 @@ <translation id="5976160379964388480">മറ്റുള്ളവര്</translation> <translation id="5978264784700053212">സന്ദേശ കേന്ദ്രം</translation> <translation id="5979421442488174909">& <ph name="LANGUAGE" /> ലേക്ക് വിവർത്തനം ചെയ്യുക</translation> -<translation id="5979469435153841984">പേജുകൾ ബുക്ക്മാർക്ക് ചെയ്യുന്നതിന്, വിലാസ ബാറിലെ നക്ഷത്ര ചിഹ്നത്തിൽ ക്ലിക്കുചെയ്യുക</translation> +<translation id="5979469435153841984">പേജുകൾ ബുക്ക്മാർക്ക് ചെയ്യുന്നതിന്, വിലാസ ബാറിലെ നക്ഷത്ര ചിഹ്നത്തിൽ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="5982621672636444458">അടുക്കൽ ഓപ്ഷനുകൾ</translation> <translation id="5984222099446776634">സമീപകാലത്ത് സന്ദർശിച്ചത്</translation> <translation id="5990386583461751448">വിവർത്തനം ചെയ്തു</translation> @@ -3518,7 +3526,7 @@ <translation id="6351063337294363751">നിങ്ങൾക്ക് ഈ മെനുവിൽ നിന്ന് ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കാനാവും</translation> <translation id="6352773953037195952">ഏറ്റവും ഉയർന്നത്</translation> <translation id="6354918092619878358">SECG എലിപ്റ്റിക് കർവ് secp256r1 (ANSI X9.62 prime256v1, NIST P-256 എന്നും അറിയപ്പെടുന്നു)</translation> -<translation id="6356138805250111037">നിങ്ങൾ ബ്രൗസറിൽ ടൈപ്പുചെയ്യുന്നവ Google-ന് അയച്ചുകൊണ്ടുള്ള മികച്ച അക്ഷരപ്പിശക് പരിശോധന</translation> +<translation id="6356138805250111037">നിങ്ങൾ ബ്രൗസറിൽ ടൈപ്പ് ചെയ്യുന്നവ Google-ന് അയയ്ക്കുന്നത് വഴി മികച്ച അക്ഷരതെറ്റ് പരിശോധന</translation> <translation id="63566973648609420">നിങ്ങളുടെ പാസ്ഫ്രെയ്സുള്ള ഒരാൾക്ക് മാത്രമേ എൻക്രിപ്റ്റുചെയ്ത ഡാറ്റ വായിക്കാനാവൂ. Google-ലേക്ക് പാസ്ഫ്രെയ്സ് അയയ്ക്കുകയോ Google അത് സൂക്ഷിക്കുകയോ ചെയ്യില്ല. പാസ്ഫ്രെയ്സ് മറന്നുപോയെങ്കിലോ ഈ ക്രമീകരണം മാറ്റണമെങ്കിലോ നിങ്ങൾ <ph name="BEGIN_LINK" />സമന്വയിപ്പിക്കൽ റീസെറ്റുചെയ്യേണ്ടതുണ്ട്<ph name="END_LINK" />.</translation> <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> കുടുംബത്തിലേക്ക് സ്വാഗതം. ഇതൊരു സാധാരണ കമ്പ്യൂട്ടറല്ല.</translation> <translation id="6361850914223837199">പിശക് വിശദാംശങ്ങൾ:</translation> @@ -3535,7 +3543,7 @@ <translation id="6384275966486438344">നിങ്ങളുടെ തിരയൽ ക്രമീകരണങ്ങൾ മാറ്റുക: <ph name="SEARCH_HOST" /></translation> <translation id="6385543213911723544">സൈറ്റുകൾക്ക് കുക്കി വിവരം സംരക്ഷിക്കാനും വായിക്കാനുമാകും</translation> <translation id="6388429472088318283">ഭാഷകൾ തിരയുക</translation> -<translation id="6390799748543157332">തുറന്നിരിക്കുന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ചുകഴിഞ്ഞാൽ, ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ നിങ്ങളുടെ ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും, നിങ്ങൾ ഡൗൺലോഡുചെയ്യുന്ന എല്ലാ ഫയലുകളും സൂക്ഷിക്കും.</translation> +<translation id="6390799748543157332">തുറന്നിരിക്കുന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ചുകഴിഞ്ഞാൽ, ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ നിങ്ങളുടെ ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും, നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന എല്ലാ ഫയലുകളും സൂക്ഷിക്കും.</translation> <translation id="6390994422085833176">സജ്ജീകരണത്തിന് ശേഷം സമന്വയിപ്പിക്കൽ, വ്യക്തിഗതമാക്കൽ ഫീച്ചറുകൾ അവലോകനം ചെയ്യുക</translation> <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്സും<ph name="END_LINK2" /> അയയ്ക്കുക</translation> <translation id="6397094776139756010">സമന്വയവും വ്യക്തിപരമാക്കലും ഓപ്ഷനുകൾ</translation> @@ -3545,9 +3553,9 @@ <translation id="6398765197997659313">പൂര്ണ്ണ സ്ക്രീനില് നിന്ന് പുറത്തുകടക്കുക</translation> <translation id="6399774419735315745">ചാരവനിത</translation> <translation id="6401445054534215853">ഷെൽഫ് ഇനം 1</translation> -<translation id="6404511346730675251">ബുക്ക്മാർക്ക് എഡിറ്റുചെയ്യുക</translation> +<translation id="6404511346730675251">ബുക്ക്മാർക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="6405510437656969977">പിൻ നൽകാൻ നിങ്ങൾ തയ്യാറാവുമ്പോൾ തുടരുക</translation> -<translation id="6406303162637086258">ബ്രൗസർ പുനരാരംഭിക്കൽ പരീക്ഷിച്ചുനോക്കുക</translation> +<translation id="6406303162637086258">ബ്രൗസർ പുനരാരംഭിക്കൽ പരീക്ഷിക്കുക</translation> <translation id="6406506848690869874">Sync</translation> <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നിവയിലെ നിങ്ങളുടെ ഡാറ്റ വായിക്കുക, മാറ്റുക</translation> <translation id="6410257289063177456">ചിത്ര ഫയലുകള്</translation> @@ -3731,6 +3739,7 @@ <translation id="6664237456442406323">നിർഭാഗ്യവശാൽ, കേടായ ഒരു ഹാർഡ്വെയർ ID ഉപയോഗിച്ചാണ് നിങ്ങളുടെ കമ്പ്യൂട്ടർ കോൺഫിഗർ ചെയ്തിരിക്കുന്നത്. ഇത് ഏറ്റവും പുതിയ സുരക്ഷാ പരിഹാരങ്ങൾ അപ്ഡേറ്റുചെയ്യുന്നതിൽ നിന്നും Chrome OS-നെ തടയുന്നു, ഒപ്പം നിങ്ങളുടെ കമ്പ്യൂട്ടർ <ph name="BEGIN_BOLD" />ക്ഷുദ്രകരമായ ആക്രമണങ്ങളാൽ കേടാകാനുമിടയുണ്ട്<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">നിങ്ങളുടെ പ്രൊഫൈൽ തുറക്കുമ്പോൾ എന്തോ കുഴപ്പമുണ്ടായി. സൈൻ ഔട്ട് ചെയ്ത്, വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">ടൈമർ നിർത്തുക</translation> <translation id="667517062706956822">Google ഈ പേജ്, <ph name="SOURCE_LANGUAGE" /> ഭാഷയിൽ നിന്ന് <ph name="TARGET_LANGUAGE" /> ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യണോ?</translation> <translation id="6675665718701918026">പോയിന്റുചെയ്യുന്ന ഉപകരണം കണക്റ്റുചെയ്തു</translation> <translation id="6678717876183468697">ചോദ്യ URL</translation> @@ -4057,6 +4066,7 @@ <translation id="7186088072322679094">ടൂൾബാറിൽ സൂക്ഷിക്കുക</translation> <translation id="7187428571767585875">നീക്കം ചെയ്യേണ്ടതോ മാറ്റേണ്ടതോ ആയ രജിസ്ട്രി എൻട്രികൾ:</translation> <translation id="7189234443051076392">നിങ്ങളുടെ ഉപകരണത്തിൽ ആവശ്യമായ ഇടം ഉണ്ടെന്ന് ഉറപ്പാക്കുക</translation> +<translation id="7189965711416741966">ഫിംഗർപ്രിന്റ് ചേർത്തു.</translation> <translation id="7191159667348037">അജ്ഞാത പ്രിന്റർ (USB)</translation> <translation id="7191454237977785534">ഇതായി ഫയൽ സംരക്ഷിക്കുക</translation> <translation id="7193374945610105795"><ph name="ORIGIN" />-നായി പാസ്വേഡുകളൊന്നും സംരക്ഷിച്ചിട്ടില്ല</translation> @@ -4157,6 +4167,7 @@ <translation id="7339898014177206373">പുതിയ വിന്ഡോ</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ഇപ്പോൾ പൂർണ്ണ സ്ക്രീനിലാണ്.</translation> <translation id="7340650977506865820">സൈറ്റ് നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു</translation> +<translation id="7341834142292923918">ഈ സൈറ്റിലേക്ക് ആക്സസ് ആവശ്യമുണ്ട്</translation> <translation id="7345706641791090287">പാസ്വേഡ് സ്ഥിരീകരിക്കുക</translation> <translation id="7346909386216857016">മനസ്സിലായി!</translation> <translation id="7347751611463936647">ഈ വിപുലീകരണം ഉപയോഗിക്കുക, "<ph name="EXTENSION_KEYWORD" />" ടൈപ്പുചെയ്യുക, തുടര്ന്ന് TAB, തുടര്ന്ന് നിങ്ങളുടെ കമാന്റ് അല്ലെങ്കില് തിരയൽ.</translation> @@ -4255,7 +4266,7 @@ <translation id="7497215489070763236">സെർവർ CA സർട്ടിഫിക്കറ്റ്</translation> <translation id="7502658306369382406">IPv6 വിലാസം</translation> <translation id="7503191893372251637">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കറ്റ് തരം</translation> -<translation id="7503821294401948377">ബ്രൌസര് പ്രവര്ത്തനത്തിനായി '<ph name="ICON" />' ഐക്കണ് ലോഡുചെയ്യാനായില്ല.</translation> +<translation id="7503821294401948377">ബ്രൗസർ പ്രവർത്തനത്തിനായി '<ph name="ICON" />' ഐക്കൺ ലോഡ് ചെയ്യാനായില്ല.</translation> <translation id="750509436279396091">ഡൗൺലോഡുകൾ ഫോൾഡർ തുറക്കുക</translation> <translation id="7505167922889582512">ഒളിപ്പിച്ചിരിക്കുന്ന ഫയലുകൾ കാണിക്കുക</translation> <translation id="7506541170099744506">എന്റർപ്രൈസ് മാനേജ്മെന്റിന് വേണ്ടി നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഉപകരണത്തെ എൻറോൾ ചെയ്തു.</translation> @@ -4266,7 +4277,6 @@ <ph name="BEGIN_PARAGRAPH2" />നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ അനുമാനിക്കാൻ വൈഫൈയും മൊബൈൽ നെറ്റ്വർക്കുകളും സെൻസറുകളും പോലുള്ള ഉറവിടങ്ങളെ Google-ന്റെ ലൊക്കേഷൻ സേവനം ഉപയോഗിക്കുന്നു. ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ക്രമീകരണം ഓണായിരിക്കുമ്പോൾ ഈ സേവനം സജീവമാകും.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />ഈ ഉപകരണത്തിലെ പ്രധാന ലൊക്കേഷൻ ക്രമീകരണം ഓഫാക്കുക വഴി നിങ്ങൾക്ക് ലൊക്കേഷൻ ഓഫാക്കാവുന്നതാണ്. കൂടാതെ ലൊക്കേഷൻ ക്രമീകരണത്തിൽ, ലൊക്കേഷന് വേണ്ടിയുള്ള വൈഫൈ, മൊബൈൽ നെറ്റ്വർക്കുകൾ, സെൻസറുകൾ എന്നിവയുടെ ഉപയോഗവും ഓഫാക്കാനാവും.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">ഒരു പാസ്വേഡ് സൃഷ്ടിക്കുക -</translation> -<translation id="7518150891539970662">WebRTC ലോഗുകൾ (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">സൃഷ്ടിക്കുക</translation> <translation id="7529411698175791732">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. പ്രശ്നം തുടരുകയാണെങ്കിൽ, സൈൻ ഔട്ട് ചെയ്ത് വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നത് പരീക്ഷിക്കൂ.</translation> @@ -4292,7 +4302,7 @@ <translation id="7563991800558061108">ഈ പിശകിൽ നിന്നും വീണ്ടെടുക്കുന്നതിന്, നിങ്ങൾക്ക് സൈൻ-ഇൻ സ്ക്രീനിൽ നിന്ന് Google അക്കൗണ്ടിൽ സൈൻ ഇൻ ചെയ്യേണ്ടിവരും. തുടർന്ന് നിങ്ങൾക്ക് Google അക്കൗണ്ട് സൈൻ ഔട്ട് ചെയ്ത് സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവിനെ വീണ്ടും സൃഷ്ടിക്കുന്നത് പരീക്ഷിക്കാനാകും.</translation> -<translation id="756445078718366910">ബ്രൌസര് വിന്ഡോ തുറക്കുക</translation> +<translation id="756445078718366910">ബ്രൗസര് വിന്ഡോ തുറക്കുക</translation> <translation id="7564847347806291057">പ്രക്രിയയുടെ അവസാനം</translation> <translation id="7566118625369982896">Play ആപ്പ് ലിങ്കുകൾ നിയന്ത്രിക്കുക</translation> <translation id="7566723889363720618">F12</translation> @@ -4371,7 +4381,7 @@ <translation id="7704305437604973648">ടാസ്ക്</translation> <translation id="7704317875155739195">സ്വമേധയാ പൂർത്തിയാക്കുന്ന തിരയലുകളും URL-കളും</translation> <translation id="7704521324619958564">Play സ്റ്റോർ തുറക്കുക</translation> -<translation id="7705276765467986571">ബുക്ക്മാര്ക്ക് മോഡല് ലോഡുചെയ്യാന് കഴിഞ്ഞില്ല.</translation> +<translation id="7705276765467986571">ബുക്ക്മാര്ക്ക് മോഡല് ലോഡ് ചെയ്യാനാവില്ല</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7707922173985738739">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുക</translation> <translation id="7709152031285164251">പരാജയപ്പെട്ടു - <ph name="INTERRUPT_REASON" /></translation> @@ -4605,7 +4615,7 @@ നിങ്ങളുടെ പ്രധാന ഫയല് ഒരു സുരക്ഷിത സ്ഥലത്ത് സൂക്ഷിക്കുക. നിങ്ങളുടെ വിപുലീകരണത്തിന്റെ പുതിയ പതിപ്പുകള് സൃഷ്ടിക്കുന്നതിന് നിങ്ങള്ക്ക് അത് ആവശ്യമാണ്.</translation> <translation id="799923393800005025">കാണാനാകുന്നത്</translation> <translation id="8000066093800657092">നെറ്റ്വര്ക്ക് ഇല്ല</translation> -<translation id="8004582292198964060">ബ്രൌസര്</translation> +<translation id="8004582292198964060">ബ്രൗസര്</translation> <translation id="8005600846065423578">ക്ലിപ്പ്ബോർഡ് കാണാൻ <ph name="HOST" /> എന്നതിനെ എപ്പോഴും അനുവദിക്കുക.</translation> <translation id="8008356846765065031">ഇന്റർനെറ്റ് വിച്ഛേദിച്ചു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക.</translation> <translation id="8009225694047762179">പാസ്വേഡുകൾ മാനേജ് ചെയ്യുക</translation> @@ -4744,6 +4754,7 @@ <translation id="8214962590150211830">ഈ വ്യക്തിയെ നീക്കംചെയ്യുക</translation> <translation id="8217399928341212914">ഒന്നിലേറെ ഫയലുകളുടെ യാന്ത്രിക ഡൗൺലോഡുകൾ തടയുന്നത് തുടരുക</translation> <translation id="8223479393428528563">ഓഫ്ലൈൻ ഉപയോഗത്തിനായി ഈ ഫയലുകൾ സംരക്ഷിക്കാൻ, ഓൺലൈനിൽ തിരികെ വന്ന് ഫയലുകൾ റൈറ്റ് ക്ലിക്ക് ചെയ്ത്, <ph name="OFFLINE_CHECKBOX_NAME" /> ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക.</translation> +<translation id="8225753906568652947">നിങ്ങളുടെ ഓഫറുകൾ റിഡീം ചെയ്യുക</translation> <translation id="8226222018808695353">നിരോധിക്കപ്പെട്ടത്</translation> <translation id="8226619461731305576">ക്യൂവിൽ</translation> <translation id="8226742006292257240">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലേക്ക് നിര്ണ്ണയിച്ച ക്രമരഹിതമായി ജനറേറ്റുചെയ്ത TPM പാസ്വേഡ് ചുവടെ:</translation> @@ -4790,6 +4801,7 @@ <translation id="8286036467436129157">സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="8286963743045814739">അദൃശ്യ വിൻഡോ ഉപയോഗിച്ച് നിങ്ങൾക്ക് സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാനാകും</translation> <translation id="82871696630048499">മെമ്മറി നിറഞ്ഞതിനാൽ വെബ് പേജ് റീലോഡ് ചെയ്തു.</translation> +<translation id="8288032458496410887"><ph name="APP" /> അൺ ഇൻസ്റ്റാൾ ചെയ്യുക...</translation> <translation id="8291967909914612644">ഹോം പ്രൊവൈഡറിന്റെ രാജ്യം</translation> <translation id="8294431847097064396">ഉറവിടം</translation> <translation id="8297006494302853456">ദുര്ബലം</translation> @@ -4851,6 +4863,7 @@ <translation id="8413385045638830869">ആദ്യം ചോദിക്കുക (ശുപാർശ ചെയ്തത്)</translation> <translation id="8418445294933751433">&ടാബ് പോലെ കാണിക്കുക</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' എന്നതിനുള്ള തിരയൽ ഫലം</translation> +<translation id="8419368276599091549">നിങ്ങളുടെ <ph name="DEVICE_TYPE" />-ലേക്ക് സ്വാഗതം!</translation> <translation id="8420060421540670057">Google ഡോക്സ് ഫയലുകൾ കാണിക്കുക</translation> <translation id="8424039430705546751">താഴേക്കുള്ള കീ</translation> <translation id="8425213833346101688">മാറ്റുക</translation> @@ -4977,6 +4990,7 @@ <translation id="8620765578342452535">നെറ്റ്വർക്ക് കണക്ഷനുകൾ കോൺഫിഗർ ചെയ്യുക</translation> <translation id="8624205858755890468">ബന്ധപ്പെട്ട വിവരങ്ങളും ആപ്പുകളും പ്രവർത്തനങ്ങളും നിങ്ങളെ കാണിക്കാൻ സഹായിയെ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="862542460444371744">&വിപുലീകരണങ്ങള്</translation> +<translation id="8626219642120025691">ടൈമർ സജ്ജമാക്കി</translation> <translation id="8627151598708688654">ഉറവിടം തിരഞ്ഞെടുക്കുക</translation> <translation id="862727964348362408">താൽക്കാലികമായി നിർത്തി</translation> <translation id="862750493060684461">CSS കാഷേ</translation> @@ -5096,6 +5110,7 @@ <translation id="8775404590947523323">നിങ്ങളുടെ എഡിറ്റുകൾ സ്വയമേവ സംരക്ഷിച്ചു.<ph name="BREAKS" />യഥാർത്ഥ ചിത്രത്തിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കുന്നതിന്, "യഥാർത്ഥമായത് പുനരാലേഖനം ചെയ്യുക" എന്നത് അൺചെക്ക് ചെയ്യുക</translation> <translation id="8777628254805677039">റൂട്ട് പാസ്വേഡ്</translation> <translation id="8780443667474968681">ശബ്ദ തിരയൽ ഓഫാക്കിയിരിക്കുന്നു.</translation> +<translation id="878068003854005405">നമുക്ക് ആരംഭിക്കാം. നിങ്ങളുടെ വിരൽ സെൻസറിൽ വയ്ക്കൂ.</translation> <translation id="878069093594050299">ഇനിപ്പറയുന്ന ഉപയോഗങ്ങള്ക്കായി ഈ സര്ട്ടിഫിക്കറ്റ് പരിശോധിച്ചു:</translation> <translation id="8781980678064919987">ലിഡ് അടഞ്ഞിരിക്കുമ്പോൾ ഷട്ട് ഡൗൺ ചെയ്യുക</translation> <translation id="8782565991310229362">കിയോസ്ക് അപ്ലിക്കേഷൻ സമാരംഭം റദ്ദാക്കി.</translation> @@ -5273,6 +5288,7 @@ <translation id="9050666287014529139">പാസ്ഫ്രെയ്സ്</translation> <translation id="9052208328806230490"><ph name="EMAIL" /> അക്കൗണ്ട് ഉപയോഗിച്ച് <ph name="CLOUD_PRINT_NAME" /> ല് നിങ്ങളുടെ പ്രിന്ററുകളെ രജിസ്റ്റര് ചെയ്തു</translation> <translation id="9052404922357793350">ബ്ലോക്ക് ചെയ്യുന്നത് തുടരുക</translation> +<translation id="9053091947372579468">ഉപകരണത്തിൽ ഒരു Chrome ലൈസൻസ് ഉൾപ്പെടുന്നു, എന്നാൽ നിങ്ങളുടെ ഉപയോക്തൃനാമം ഒരു അഡ്മിൻ കൺസോളുമായി ബന്ധപ്പെട്ടതല്ല. എൻറോൾ ചെയ്യലുമായി മുന്നോട്ടു പോവുന്നതിന്, ഒരു അഡ്മിൻ കൺസോൾ അക്കൗണ്ട് സൃഷ്ടിക്കുക. കുറിപ്പ്: പുതിയ അഡ്മിൻ കൺസോൾ അക്കൗണ്ട് സൃഷ്ടിക്കുന്നതിന് നിങ്ങളുടെ സ്വന്തം ഡൊമെയ്ൻ ഉപയോഗിക്കാൻ തീരുമാനിക്കുകയാണെങ്കിൽ, സൈൻ അപ്പ് ചെയ്തതിന് ശേഷം ഡൊമെയ്ൻ പരിശോധിച്ചുറപ്പിക്കലും പൂർത്തിയാക്കേണ്ടതുണ്ട്. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">എന്റെ ചോയ്സ് ഓർമ്മിക്കുക</translation> <translation id="9055636786322918818">RC4 എൻക്രിപ്ഷൻ നടപ്പിലാക്കുക. RC4 രഹസ്യലിപി സുരക്ഷിതമല്ലാത്തതിനാൽ ഈ ഓപ്ഷൻ ഉപയോഗിക്കുന്നത് അപകടസാധ്യത വർദ്ധിപ്പിക്കുന്നു.</translation> <translation id="9056034633062863292">Chromebox അപ്ഡേറ്റുചെയ്യുന്നു</translation> @@ -5308,7 +5324,7 @@ <translation id="9103868373786083162">ചരിത്രം കാണാൻ തിരികെ പോകുന്നതിന് സന്ദർഭ മെനു അമർത്തുക</translation> <translation id="9105212490906037469">F2</translation> <translation id="9109122242323516435">ഇടം സൃഷ്ടിക്കാൻ, ഉപകരണ സ്റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation> -<translation id="9110990317705400362">നിങ്ങളുടെ ബ്രൗസിംഗ് സുരക്ഷിതമാക്കുന്നതിനുള്ള മാർഗങ്ങൾക്കായി ഞങ്ങൾ സ്ഥിരമായി തിരയുന്നു. മുമ്പ്, എല്ലാ വെബ്സൈറ്റും നിങ്ങളുടെ ബ്രൗസറിൽ ഒരു വിപുലീകരണം ചേർക്കുന്നതിന് ആവശ്യപ്പെടുമായിരുന്നു. Google Chrome-ന്റെ ഏറ്റവും പുതിയ പതിപ്പുകളിൽ, വിപുലീകരണങ്ങളുടെ പേജ് മുഖേന ഈ വിപുലീകരണങ്ങൾ ചേർത്ത് അവ ഇൻസ്റ്റാളുചെയ്യണമെന്ന് നിങ്ങൾ Chrome-നോട് സ്പഷ്ടമായി പറയേണ്ടതുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> +<translation id="9110990317705400362">നിങ്ങളുടെ ബ്രൗസിംഗ് സുരക്ഷിതമാക്കുന്നതിനുള്ള മാർഗങ്ങൾക്കായി ഞങ്ങൾ സ്ഥിരമായി തിരയുന്നു. മുമ്പ്, എല്ലാ വെബ്സൈറ്റും നിങ്ങളുടെ ബ്രൗസറിൽ ഒരു വിപുലീകരണം ചേർക്കുന്നതിന് ആവശ്യപ്പെടുമായിരുന്നു. Google Chrome-ന്റെ ഏറ്റവും പുതിയ പതിപ്പുകളിൽ, വിപുലീകരണങ്ങളുടെ പേജ് മുഖേന ഈ വിപുലീകരണങ്ങൾ ചേർത്ത് അവ ഇൻസ്റ്റാൾ ചെയ്യണമെന്ന് നിങ്ങൾ Chrome-നോട് സ്പഷ്ടമായി പറയേണ്ടതുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="9111102763498581341">അണ്ലോക്ക് ചെയ്യുക</translation> <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation> <translation id="9112748030372401671">നിങ്ങളുടെ വാൾപേപ്പർ മാറ്റുക</translation> @@ -5376,6 +5392,7 @@ <translation id="9218430445555521422">സ്ഥിരസ്ഥിതിയാക്കുക</translation> <translation id="9219103736887031265">ചിത്രങ്ങൾ</translation> <translation id="9220525904950070496">അക്കൗണ്ട് നീക്കംചെയ്യൽ</translation> +<translation id="9220820413868316583">വിരൽ ഉയർത്തി വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="923467487918828349">എല്ലാം കാണിക്കുക</translation> <translation id="928985544179707652">വിപുലീകരണങ്ങള്:</translation> <translation id="930268624053534560">മുഴുവൻ വിവരങ്ങളുമടങ്ങിയ ടൈംസ്റ്റാമ്പുകൾ</translation> @@ -5387,7 +5404,7 @@ <translation id="935490618240037774">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിന് ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നതാണ്.</translation> <translation id="936801553271523408">സിസ്റ്റം ഡയഗണോസ്റ്റിക് ഡാറ്റ</translation> <translation id="93766956588638423">വിപുലീകരണം റിപ്പയർ ചെയ്യുക</translation> -<translation id="938339467127511841">Linux (ബീറ്റ) സംഭരണം</translation> +<translation id="938339467127511841">Linux (ബീറ്റ) സ്റ്റോറേജ്</translation> <translation id="938470336146445890">ഒരു ഉപയോക്തൃ സര്ട്ടിഫിക്കേറ്റ് ദയവായി ഇന്സ്റ്റാള് ചെയ്യുക.</translation> <translation id="938582441709398163">കീബോര്ഡ് ഓവര്ലേ</translation> <translation id="939252827960237676">സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു</translation> @@ -5412,7 +5429,7 @@ <translation id="968174221497644223">അപ്ലിക്കേഷന് കാഷെ</translation> <translation id="969096075394517431">ഭാഷകൾ മാറ്റുക</translation> <translation id="970047733946999531">{NUM_TABS,plural, =1{ഒരു ടാബ്}other{# ടാബുകൾ}}</translation> -<translation id="971774202801778802">URL ബുക്ക്മാർക്കുചെയ്യുക</translation> +<translation id="971774202801778802">URL ബുക്ക്മാർക്ക് ചെയ്യുക</translation> <translation id="973473557718930265">പുറത്തുകടക്കുക</translation> <translation id="974555521953189084">സമന്വയിപ്പിക്കാൻ തുടങ്ങുന്നതിന് നിങ്ങളുടെ പാസ്ഫ്രെയ്സ് നൽകുക</translation> <translation id="977640333593638907">ഭൂരിഭാഗം കീകളും ഉപയോഗിക്കുന്നതിന്, ബട്ടണിൽ അമർത്തിയാൽ മതി</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 674a7eb..24220d4a 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">कोणतीही नेटवर्क नाहीत</translation> <translation id="1056898198331236512">चेतावणी</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">फिंगरप्रिंट नोंदवत आहे</translation> <translation id="1061904396131502319">विश्रांतीची वेळ झाली आहे</translation> <translation id="1062407476771304334">पुनर्स्थित करा</translation> <translation id="1067048845568873861">तयार केले</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">डायमंड</translation> <translation id="1114335938027186412">आपल्या संगणकामध्ये विश्वसनीय प्लॅटफॉर्म मॉड्यूल (TPM) सुरक्षितता डिव्हाइस असते, जे Chrome OS मध्ये अनेक गंभीर सुरक्षितता वैशिष्ट्ये अंमलात आणण्यासाठी वापरले जाते. अधिक जाणून घेण्यासाठी Chromebook मदत केंद्रावर भेट द्या: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">लिड बंद असताना स्लीप मोड ऑन करा</translation> +<translation id="1115324527092594775">Better Together सेट करा</translation> <translation id="1116694919640316211">बद्दल</translation> <translation id="1116779635164066733">या सेटिंगची "<ph name="NAME" />" विस्ताराद्वारे अंमलबजावणी केली आहे.</translation> <translation id="111844081046043029">तुमची खात्री आहे की आपण हे पृष्ठ सोडू इच्छिता?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">वर्तमान वेळ</translation> <translation id="1157102636231978136">तुमच्या Google खात्याशी सिंक केलेला, तुमचा ब्राउझ केलेला डेटा आणि अॅक्टिव्हिटी</translation> <translation id="1161575384898972166">कृपया क्लायंट प्रमाणपत्र निर्यात करण्यासाठी <ph name="TOKEN_NAME" /> मध्ये साइन इन करा.</translation> +<translation id="1161699061380012396">Chrome OS इनपुट पद्धत</translation> <translation id="1163931534039071049">फ्रेम स्त्रोत &पहा</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> साठी Smart Lock बंंद करायचे?</translation> <translation id="1164899421101904659">पिन अनलॉक की एंटर करा</translation> @@ -1003,7 +1006,6 @@ <translation id="2508428939232952663">Google Play स्टोअर खाते</translation> <translation id="2509495747794740764">स्केल मूल्य 10 आणि 200 दरम्यानचा नंबर असणे आवश्यक आहे.</translation> <translation id="2509566264613697683">८x</translation> -<translation id="2512222046227390255">फॉर्म स्वयं-भरण करा</translation> <translation id="2513403576141822879">गोपनीयता, सुरक्षितता आणि डेटा संकलनाशी संबंधित अधिक सेटिंग्जसाठी, <ph name="BEGIN_LINK" />सिंक आणि Google सेवा<ph name="END_LINK" /> पाहा</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">स्कॅन करा</translation> @@ -1356,6 +1358,7 @@ <translation id="3020990233660977256">अनुक्रमांक: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">फ्रेम स्त्रोत &पहा</translation> <translation id="3022978424994383087">ते समजू शकले नाही.</translation> +<translation id="3023464535986383522">बोलण्यासाठी निवडा</translation> <translation id="3024374909719388945">24-तासांचे घड्याळ वापरा</translation> <translation id="302781076327338683">कॅश बायपास करणे रीलोड करा</translation> <translation id="3031417829280473749">एजंट X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">पुढील इनपुट पद्धत</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> साठी "<ph name="EXTENSION_NAME" />" जोडायचे?</translation> <translation id="3644896802912593514">रूंदी</translation> +<translation id="3645372836428131288">फिंगरप्रिंटचा वेगळा भाग कॅप्चर करण्यासाठी बोट किंचित हलवा.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> आढळले</translation> <translation id="3649138363871392317">फोटो कॅप्चर केला</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" ला अॅक्सेसची अनुमती द्या:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">प्रमाणपत्र धोरणे</translation> <translation id="392089482157167418">ChromeVox (बोललेला अभिप्राय) सक्षम करा</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">आपल्याकडे कोणतेही अलीकडील कॅप्चर केलेले WebRTC लॉग नाहीत.</translation> <translation id="3925573269917483990">कॅमेराः</translation> <translation id="3925842537050977900">शेल्फपासून अनपिन करा</translation> <translation id="3926002189479431949">Smart Lock फोन बदलला</translation> @@ -2223,6 +2226,7 @@ <translation id="438503109373656455">Saratoga</translation> <translation id="4387004326333427325">प्रमाणीकरण प्रमाणपत्र दूरस्थपणे नाकारले</translation> <translation id="4389091756366370506">वापरकर्ता <ph name="VALUE" /></translation> +<translation id="439266289085815679">ब्लूटूथ कॉन्फिगरेशन <ph name="USER_EMAIL" /> नियंत्रित करते.</translation> <translation id="4394049700291259645">अक्षम करा</translation> <translation id="4400367121200150367">ज्या साइट पासवर्ड सेव्ह करत नाहीत त्या येथे दिसून येतील</translation> <translation id="4400632832271803360">शीर्ष-पंक्ती की चे वर्तन स्विच करण्यासाठी लाँचर की धरून ठेवा.</translation> @@ -2296,6 +2300,7 @@ <translation id="4522600456902129422">या साइटला क्लिपबोर्ड पाहण्याची नेहमी अनुमती द्या</translation> <translation id="4530494379350999373">मूळ</translation> <translation id="4533985347672295764">CPU वेळ</translation> +<translation id="4534661889221639075">पुन्हा प्रयत्न करा.</translation> <translation id="4535127706710932914">डीफॉल्ट प्रोफाइल</translation> <translation id="4538417792467843292">शब्द हटवा </translation> <translation id="4538684596480161368">नेहमी सॅन्डबॉक्स नसलेल्या प्लगिन <ph name="HOST" /> वर अवरोधित करा</translation> @@ -2525,6 +2530,7 @@ <translation id="4880520557730313061">स्वयं-निश्चित</translation> <translation id="4880827082731008257">इतिहास शोध</translation> <translation id="4881695831933465202">उघडा</translation> +<translation id="4882312758060467256">या साइटचा अॅक्सेस आहे</translation> <translation id="4882473678324857464">बुकमार्कवर लक्ष द्या</translation> <translation id="4882831918239250449">तुम्ही ब्राउझ करत असलेला इतिहास पर्सनलाइझ शोध, जाहिराती आणि बरेच काही करण्यासाठी कसा वापरला जातो ते नियंत्रित करा</translation> <translation id="4883178195103750615">HTML फायलीमध्ये बुकमार्क निर्यात करा...</translation> @@ -2590,6 +2596,7 @@ <translation id="4969785127455456148">अल्बम</translation> <translation id="4971412780836297815">पूर्ण झाल्यानंतर उघडा</translation> <translation id="4972129977812092092">प्रिंटर संपादित करा</translation> +<translation id="4972164225939028131">चुकीचा पासवर्ड</translation> <translation id="497287958838527945">Google Pay वापरून क्रेडिट कार्ड आणि पत्ते.</translation> <translation id="4973307593867026061">प्रिंटर जोडा</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> किंवा त्यापेक्षा कमी वर्णांचे नाव वापरा</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">अॅप्स लोड करीत आहे...</translation> <translation id="5592595402373377407">अद्याप पुरेसा डेटा उपलब्ध नाही.</translation> +<translation id="5593357315997824387">माझ्या फायली सिंक करा</translation> <translation id="5595152862129936745">खूप दूर आहे</translation> <translation id="5595485650161345191">पत्ता संपादित करा</translation> <translation id="5596627076506792578">अधिक पर्याय</translation> @@ -3735,6 +3743,7 @@ <translation id="6664237456442406323">दुर्दैवाने, आपला कॉंप्युटर एका विकृत हार्डवेअर आयडी सह कॉन्फिगर केला आहे. हे नवीनतम सुरक्षितता निराकरणे अपडेट करण्यापासून Chrome OS ला प्रतिबंध करते आणि आपल्या कॉंप्युटरावर <ph name="BEGIN_BOLD" />दुर्भावनापूर्ण आक्रमणांमुळे सहज परिणाम होऊ शकतो<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">आपले प्रोफाईल उघडताना काहीतरी चूक झाली. कृपया साइन आउट करा नंतर पुन्हा साइन इन करा.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">टायमर थांबवा</translation> <translation id="667517062706956822">Google ने हे पृष्ठ <ph name="SOURCE_LANGUAGE" /> मधून <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित करावे असे आपण इच्छिता?</translation> <translation id="6675665718701918026">निर्देशित करणारे डिव्हाइस कनेक्ट केले</translation> <translation id="6678717876183468697">क्वेरी URL</translation> @@ -4061,6 +4070,7 @@ <translation id="7186088072322679094">टूलबारमध्ये ठेवा</translation> <translation id="7187428571767585875">काढून टाकण्यासाठी किंवा बदलण्यासाठी रजिस्ट्री प्रविष्ट्या:</translation> <translation id="7189234443051076392">तुमच्या डिव्हाइसवर पुरेशी जागा असल्याची खात्री करा</translation> +<translation id="7189965711416741966">फिंगरप्रिंट जोडले.</translation> <translation id="7191159667348037">अज्ञात मुद्रक (USB)</translation> <translation id="7191454237977785534">या रूपात फाइल सेव्ह करा</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> चे कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation> @@ -4161,6 +4171,7 @@ <translation id="7339898014177206373">नवीन विंडो</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> आता फुल स्क्रीन आहे.</translation> <translation id="7340650977506865820">साइट तुमची स्क्रीन शेअर करत आहे</translation> +<translation id="7341834142292923918">या साइटचा अॅक्सेस हवा आहे</translation> <translation id="7345706641791090287">आपल्या संकेतशब्दाची पुष्टी करा</translation> <translation id="7346909386216857016">ठीक आहे, समजले</translation> <translation id="7347751611463936647">हा विस्तार वापरण्यासाठी, "<ph name="EXTENSION_KEYWORD" />", नंतर TAB, नंतर तुमची आज्ञा किंवा शोध टाइप करा.</translation> @@ -4270,7 +4281,6 @@ <ph name="BEGIN_PARAGRAPH2" />तुमच्या डिव्हाइसच्या स्थानाचा अंदाज घेण्यात मदत करण्यासाठी Google ची स्थान सेवा वाय फाय, मोबाईल नेटवर्क आणि सेन्सर सारखे स्त्रोत वापरते. तुमच्या डिव्हाइसची स्थान सेटिंग चालू असताना ही सेवा सुरू असेल.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />तुमच्या डिव्हाइसवर मुख्य स्थान सेटिंग बंद करून तुम्ही स्थान बंद करू शकता. तुम्ही स्थान सेटिंग्जमध्ये वाय फाय, मोबाईल नेटवर्क आणि स्थानासाठी सेन्सरचा वापर देखील बंद करू शकता.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">एक पासवर्ड तयार करा -</translation> -<translation id="7518150891539970662">WebRTC लॉग (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">तयार करा</translation> <translation id="7529411698175791732">आपले इंटरनेट कनेक्शन तपासा. समस्या कायम राहिल्यास, साइन आउट करून आणि पुन्हा साइन इन करून पहा.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">या व्यक्तीस काढा</translation> <translation id="8217399928341212914">एकाधिक फायलींचे स्वयंचलित डाउनलोड अवरोधित करणे सुरू ठेवा</translation> <translation id="8223479393428528563">ऑफलाइन वापराकरिता या फायली सेव्ह करण्यासाठी, परत ऑनलाइन व्हा, फायलींवर उजवे-क्लिक करा आणि <ph name="OFFLINE_CHECKBOX_NAME" /> पर्याय निवडा.</translation> +<translation id="8225753906568652947">तुमच्या ऑफर रिडीम करा</translation> <translation id="8226222018808695353">निषिद्ध केलेले</translation> <translation id="8226619461731305576">रांग</translation> <translation id="8226742006292257240">खाली यादृच्छिकपणे व्युत्पन्न केलेला TPM पासवर्ड आहे जो आपल्या संगणकासाठी नियुक्त केला गेला आहे:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">साइन इन</translation> <translation id="8286963743045814739">तुम्ही गुप्त विंडो वापरून खाजगीरीत्या ब्राउझ करू शकता</translation> <translation id="82871696630048499">वेब पेज रीलोड करण्यात आले कारण त्याची मेमरी संपली.</translation> +<translation id="8288032458496410887"><ph name="APP" /> अनइंस्टॉल करा...</translation> <translation id="8291967909914612644">मुख्यपृष्ठ प्रदाता देश</translation> <translation id="8294431847097064396">स्रोत</translation> <translation id="8297006494302853456">कमकुवत</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">प्रथम विचारा (शिफारस केलेले)</translation> <translation id="8418445294933751433">टॅब म्हणून &दर्शवा</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' साठी शोध परिणाम</translation> +<translation id="8419368276599091549">तुमच्या <ph name="DEVICE_TYPE" /> वर स्वागत आहे!</translation> <translation id="8420060421540670057">Google दस्तऐवज फायली दर्शवा</translation> <translation id="8424039430705546751">खाली</translation> <translation id="8425213833346101688">बदल करा</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">नेटवर्क कनेक्शन कॉन्फिगर करा</translation> <translation id="8624205858755890468">Assistant ला तुम्हाला संबंधित माहिती, अॅप्स आणि क्रिया दाखवू देते.</translation> <translation id="862542460444371744">&विस्तार</translation> +<translation id="8626219642120025691">टायमर झाला</translation> <translation id="8627151598708688654">स्त्रोत निवडा</translation> <translation id="862727964348362408">निलंबित</translation> <translation id="862750493060684461">CSS कॅश </translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">तुमची संपादने स्वयंचलितपणे सेव्ह केली जातात.<ph name="BREAKS" /> मूळ प्रतिमेची प्रत ठेवण्यासाठी ''मूळवर खाडाखोड करा'' अनचेक करा</translation> <translation id="8777628254805677039">मूळ संकतेशब्द</translation> <translation id="8780443667474968681">व्हॉइस शोध बंद केले गेले आहे.</translation> +<translation id="878068003854005405">चला सुरुवात करूया. तुमचे बोट सेन्सरवर ठेवा.</translation> <translation id="878069093594050299">हे प्रमाणपत्र खालील वापरासाठी सत्यापित केलेले आहे:</translation> <translation id="8781980678064919987">झाकण बंद असताना बंद करा</translation> <translation id="8782565991310229362">कियोस्क अॅप्लिकेशन लाँच रद्द झाले.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">सांकेतिक वाक्यांश</translation> <translation id="9052208328806230490">आपण आपले मुद्रक <ph name="EMAIL" /> खाते वापरून <ph name="CLOUD_PRINT_NAME" /> सह नोंदणीकृत केले आहेत</translation> <translation id="9052404922357793350">ब्लॉक करणे सुरू ठेवा</translation> +<translation id="9053091947372579468">तुमच्या डिव्हाइसमध्ये Chrome परवाना समाविष्ट आहे, परंतु तुमचे वापरकर्तानाव अॅडमिन कन्सोलशी संलग्न नाही. नोंदवणे सुरू ठेवण्यासाठी कृपया अॅडमिन कन्सोल खाते तयार करा. टीप: नवीन अॅडमिन कन्सोल खाते तयार करण्यासाठी तुम्ही तुमचे स्वतःचे डोमेन निवडल्यास, साइन अपनंतर तुम्ही संपूर्ण डोमेन पडताळणी करणेदेखील आवश्यक आहे. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">माझी निवड लक्षात ठेवा</translation> <translation id="9055636786322918818">RC4 एंक्रिप्शन लागू करा. हा पर्याय वापरल्याने तुमचा धोका वाढतो, कारण RC4 सायफर असुरक्षित आहेत.</translation> <translation id="9056034633062863292">Chromebox अपडेट करीत आहे</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">डीफॉल्ट म्हणून सेट करा</translation> <translation id="9219103736887031265">इमेज</translation> <translation id="9220525904950070496">खाते काढा</translation> +<translation id="9220820413868316583">उचला आणि नंतर पुन्हा प्रयत्न करा.</translation> <translation id="923467487918828349">सर्व दर्शवा</translation> <translation id="928985544179707652">एक्स्टेंशन</translation> <translation id="930268624053534560">तपशीलवार टाइमस्टॅम्प</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 702f584f..991ad3a 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1007,7 +1007,6 @@ <translation id="2508428939232952663">Akaun Gedung Google Play</translation> <translation id="2509495747794740764">Amaun skala mestilah nombor antara 10 dan 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Auto isi borang</translation> <translation id="2513403576141822879">Untuk mendapatkan lebih banyak tetapan yang berkaitan dengan privasi, keselamatan dan pengumpulan data, lihat <ph name="BEGIN_LINK" />Penyegerakan dan perkhidmatan Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Imbas</translation> @@ -1954,7 +1953,6 @@ <translation id="3920504717067627103">Dasar Sijil</translation> <translation id="392089482157167418">Dayakan ChromeVox (maklum balas dituturkan)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Anda tiada log WebRTC yang dirakam baru-baru ini.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Nyahsemat dari Rak</translation> <translation id="3926002189479431949">Telefon Smart Lock telah berubah</translation> @@ -4282,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Perkhidmatan lokasi Google menggunakan sumber seperti Wi-Fi, rangkaian mudah alih dan penderia untuk menganggarkan lokasi peranti anda. Perkhidmatan ini aktif apabila tetapan Lokasi peranti anda dihidupkan.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Anda boleh mematikan Lokasi dengan mematikan tetapan Lokasi utama pada peranti anda. Anda juga boleh mematikan penggunaan Wi-Fi, rangkaian mudah alih dan penderia untuk lokasi dalam tetapan lokasi.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Buat kata laluan -</translation> -<translation id="7518150891539970662">Log WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Cipta</translation> <translation id="7529411698175791732">Semak sambungan Internet anda. Jika masalah ini masih berterusan, cuba log keluar dan log masuk semula.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index b6502e54..7a1cae2 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Geen netwerken</translation> <translation id="1056898198331236512">Waarschuwing</translation> <translation id="1058262162121953039">Pukcode</translation> +<translation id="1059855432287631118">Vingerafdruk registreren</translation> <translation id="1061904396131502319">Bijna tijd voor pauze</translation> <translation id="1062407476771304334">Vervangen</translation> <translation id="1067048845568873861">Gemaakt</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Je computer bevat een TPM-beveiligingsapparaat (Trusted Platform Module) dat wordt gebruikt om veel van de belangrijke beveiligingsfuncties in Chrome OS te implementeren. Ga voor meer informatie naar het Helpcentrum voor Chromebooks: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Slaapstand activeren wanneer klep wordt gesloten</translation> +<translation id="1115324527092594775">Better Together instellen</translation> <translation id="1116694919640316211">Over</translation> <translation id="1116779635164066733">Deze instelling wordt afgedwongen door de extensie "<ph name="NAME" />".</translation> <translation id="111844081046043029">Pagina verlaten?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Huidige tijd</translation> <translation id="1157102636231978136">Je browsergegevens en activiteit die zijn gesynchroniseerd met je Google-account</translation> <translation id="1161575384898972166">Log in bij <ph name="TOKEN_NAME" /> om het klantcertificaat te exporteren.</translation> +<translation id="1161699061380012396">Invoermethode voor Chrome OS</translation> <translation id="1163931534039071049">&Framebron weergeven</translation> <translation id="1164674268730883318">Smart Lock voor <ph name="DEVICE_TYPE" /> uitschakelen?</translation> <translation id="1164899421101904659">Pukcode opgeven</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Store-account</translation> <translation id="2509495747794740764">De waarde voor de schaal moet een getal tussen de 10 en 200 zijn.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Formulieren automatisch invullen</translation> <translation id="2513403576141822879">Bekijk <ph name="BEGIN_LINK" />Synchronisatie en Google-services<ph name="END_LINK" /> voor meer instellingen die verband houden met privacy, beveiliging en gegevensverzameling.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scannen</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Serienummer: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Framebron weergeven</translation> <translation id="3022978424994383087">Dat heb ik niet verstaan.</translation> +<translation id="3023464535986383522">Selecteer om uitgesproken te worden</translation> <translation id="3024374909719388945">24-uurs klok gebruiken</translation> <translation id="302781076327338683">Opnieuw laden en cachegeheugen omzeilen</translation> <translation id="3031417829280473749">Agente X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Volgende invoermethode</translation> <translation id="3640214691812501263">'<ph name="EXTENSION_NAME" />' toevoegen voor <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Breedte</translation> +<translation id="3645372836428131288">Beweeg je vinger enigszins om een ander deel van de vingerafdruk vast te leggen.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> gedetecteerd</translation> <translation id="3649138363871392317">Foto is vastgelegd</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" toegang verlenen:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Certificaatbeleid</translation> <translation id="392089482157167418">ChromeVox (gesproken feedback) inschakelen</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Je hebt geen onlangs vastgelegde WebRTC-logboeken.</translation> <translation id="3925573269917483990">Camera:</translation> <translation id="3925842537050977900">Losmaken van plank</translation> <translation id="3926002189479431949">Smart Lock-telefoon gewijzigd</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Salinero</translation> <translation id="4387004326333427325">Verificatiecertificaat afgewezen op afstand</translation> <translation id="4389091756366370506">Gebruiker <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth-configuratie wordt beheerd door <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Uitschakelen</translation> <translation id="4400367121200150367">Sites die nooit wachtwoorden opslaan, worden hier weergegeven</translation> <translation id="4400632832271803360">Houd de Launcher-toets ingedrukt om het gedrag van de toetsen in de bovenste rij om te schakelen</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Bekijken van het klembord door deze site blijven toestaan</translation> <translation id="4530494379350999373">Herkomst</translation> <translation id="4533985347672295764">CPU-tijd</translation> +<translation id="4534661889221639075">Probeer het opnieuw.</translation> <translation id="4535127706710932914">Standaardprofiel</translation> <translation id="4538417792467843292">Woord verwijderen</translation> <translation id="4538684596480161368">Plug-ins zonder sandbox op <ph name="HOST" /> altijd blokkeren</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automatisch bewerken</translation> <translation id="4880827082731008257">Geschiedenis doorzoeken</translation> <translation id="4881695831933465202">Openen</translation> +<translation id="4882312758060467256">Heeft toegang tot deze site</translation> <translation id="4882473678324857464">Focus op bladwijzers</translation> <translation id="4882831918239250449">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken, advertenties en meer te personaliseren</translation> <translation id="4883178195103750615">Bladwijzers exporteren naar HTML-bestand...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Openen wanneer gereed</translation> <translation id="4972129977812092092">Printer bewerken</translation> +<translation id="4972164225939028131">Onjuist wachtwoord</translation> <translation id="497287958838527945">Creditcards en adressen die Google Pay gebruiken.</translation> <translation id="4973307593867026061">Printers toevoegen</translation> <translation id="4973523518332075481">Gebruik een naam die maximaal <ph name="MAX_LENGTH" /> tekens bevat</translation> @@ -3019,6 +3026,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Apps laden...</translation> <translation id="5592595402373377407">Nog niet voldoende gegevens beschikbaar.</translation> +<translation id="5593357315997824387">Mijn bestanden synchroniseren</translation> <translation id="5595152862129936745">Heel veraf</translation> <translation id="5595485650161345191">Adres bewerken</translation> <translation id="5596627076506792578">Meer opties</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">Je computer is geconfigureerd met een hardware-ID met een onjuiste notatie. Dit zorgt ervoor dat Chrome OS niet kan worden bijgewerkt met de nieuwste beveiligingsoplossingen, waardoor je computer <ph name="BEGIN_BOLD" />kwetsbaar kan zijn voor schadelijke aanvallen<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Er is iets misgegaan bij het openen van je profiel. Log uit en log vervolgens weer in.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">timer stoppen</translation> <translation id="667517062706956822">Wil je dat Google deze pagina vertaalt van het <ph name="SOURCE_LANGUAGE" /> naar het <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Aanwijsapparaat verbonden</translation> <translation id="6678717876183468697">Query-URL</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">In werkbalk houden</translation> <translation id="7187428571767585875">Registervermeldingen die moeten worden verwijderd of gewijzigd:</translation> <translation id="7189234443051076392">Zorg dat er voldoende ruimte op je apparaat beschikbaar is</translation> +<translation id="7189965711416741966">Vingerafdruk is toegevoegd.</translation> <translation id="7191159667348037">Onbekende printer (USB)</translation> <translation id="7191454237977785534">Bestand opslaan als</translation> <translation id="7193374945610105795">Geen wachtwoorden opgeslagen voor <ph name="ORIGIN" /></translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Nieuw venster</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> wordt nu op volledig scherm weergegeven.</translation> <translation id="7340650977506865820">Site deelt je scherm</translation> +<translation id="7341834142292923918">Wil toegang tot deze site</translation> <translation id="7345706641791090287">Je wachtwoord bevestigen</translation> <translation id="7346909386216857016">OK, begrepen</translation> <translation id="7347751611463936647">Als je deze extensie wilt gebruiken, typ je '<ph name="EXTENSION_KEYWORD" />', druk je op Tab en geef je je opdracht of zoekopdracht op.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />De locatieservice van Google maakt gebruik van bronnen zoals wifi, mobiele netwerken en sensoren om de locatie van je apparaat te schatten. Deze service is actief wanneer de instelling Locatie van je apparaat is ingeschakeld.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Je kunt Locatie uitschakelen door de hoofdinstelling Locatie op je apparaat uit te schakelen. Je kunt het gebruik van wifi, mobiele netwerken en sensoren voor locaties ook uitschakelen via de locatie-instellingen.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Een wachtwoord maken –</translation> -<translation id="7518150891539970662">WebRTC-logboeken (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Maken</translation> <translation id="7529411698175791732">Controleer de internetverbinding. Als het probleem blijft optreden, log je uit en weer in.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Deze persoon verwijderen</translation> <translation id="8217399928341212914">Automatische downloads van meerdere bestanden blijven blokkeren</translation> <translation id="8223479393428528563">Als je deze bestanden wilt opslaan voor offline gebruik, ga je weer online, klik je met de rechtermuisknop op de bestanden en selecteer je de optie <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Je aanbiedingen inwisselen</translation> <translation id="8226222018808695353">Verboden</translation> <translation id="8226619461731305576">Wachtrij</translation> <translation id="8226742006292257240">Hieronder staat het willekeurig gegenereerde TPM-wachtwoord dat aan je computer is toegekend:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Inloggen</translation> <translation id="8286963743045814739">Je kunt privé browsen in een incognitovenster</translation> <translation id="82871696630048499">De webpagina is opnieuw geladen omdat het geheugen vol was.</translation> +<translation id="8288032458496410887"><ph name="APP" /> verwijderen...</translation> <translation id="8291967909914612644">Land thuisprovider</translation> <translation id="8294431847097064396">Bron</translation> <translation id="8297006494302853456">Zwak</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Eerst vragen (aanbevolen)</translation> <translation id="8418445294933751433">Weergeven al&s tabblad</translation> <translation id="8419098111404128271">Zoekresultaten voor '<ph name="SEARCH_TEXT" />'</translation> +<translation id="8419368276599091549">Welkom bij je <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Bestanden van Google Documenten weergeven</translation> <translation id="8424039430705546751">omlaag</translation> <translation id="8425213833346101688">Wijzigen</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Netwerkverbindingen configureren</translation> <translation id="8624205858755890468">Hiermee kan de Assistent je gerelateerde informatie, apps en acties laten zien.</translation> <translation id="862542460444371744">&Extensies</translation> +<translation id="8626219642120025691">Timer gereed</translation> <translation id="8627151598708688654">Bron selecteren</translation> <translation id="862727964348362408">Opgeschort</translation> <translation id="862750493060684461">CSS-cachegeheugen</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Je bewerkingen worden automatisch opgeslagen.<ph name="BREAKS" />Als je een kopie van de oorspronkelijke afbeelding wilt behouden, verwijder je het vinkje uit het selectievakje 'Oorspronkelijk bestand overschrijven'.</translation> <translation id="8777628254805677039">root-wachtwoord</translation> <translation id="8780443667474968681">Gesproken zoekopdracht is uitgeschakeld.</translation> +<translation id="878068003854005405">Ga aan de slag door je vinger op de sensor te plaatsen.</translation> <translation id="878069093594050299">Dit certificaat is geverifieerd voor de volgende certificaatdoeleinden:</translation> <translation id="8781980678064919987">Uitschakelen wanneer de klep wordt gesloten</translation> <translation id="8782565991310229362">Starten van kiosk-app geannuleerd.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Wachtwoordzin</translation> <translation id="9052208328806230490">Je hebt met het account <ph name="EMAIL" /> je printers geregistreerd bij <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9052404922357793350">Doorgaan met blokkeren</translation> +<translation id="9053091947372579468">Bij je apparaat is een Chrome-licentie inbegrepen, maar je gebruikersnaam is niet gekoppeld aan een beheerdersconsole. Maak een beheerdersconsoleaccount om verder te gaan met de inschrijving. Opmerking: Als je je eigen domein gebruikt om een nieuw beheerdersconsoleaccount te maken, moet je na de aanmelding ook de domeinverificatie doorlopen. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Mijn keuze onthouden</translation> <translation id="9055636786322918818">RC4-versleuteling afdwingen. Als je deze optie gebruikt, loop je meer risico, aangezien RC4-codering onbeveiligd is.</translation> <translation id="9056034633062863292">Chromebox bijwerken</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Instellen als standaard</translation> <translation id="9219103736887031265">Afbeeldingen</translation> <translation id="9220525904950070496">Rekening verwijderen</translation> +<translation id="9220820413868316583">Til je vinger op en probeer het opnieuw.</translation> <translation id="923467487918828349">Toon alles</translation> <translation id="928985544179707652">Extensies:</translation> <translation id="930268624053534560">Gedetailleerde tijdstempels</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 9985bfb1..f7b09c0e 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Ingen nettverk</translation> <translation id="1056898198331236512">Advarsel</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrerer fingeravtrykk</translation> <translation id="1061904396131502319">Snart tid for en pause</translation> <translation id="1062407476771304334">Erstatt</translation> <translation id="1067048845568873861">Opprettet</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Datamaskinen din inneholder en TPM-sikkerhetsenhet (Trusted Platform Module) som brukes til å implementere mange viktige sikkerhetsfunksjoner i Chrome OS. Gå til Chromebook-brukerstøtten for å finne ut mer: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Gå i hvilemodus når maskinen lukkes</translation> +<translation id="1115324527092594775">Konfigurer Better Together</translation> <translation id="1116694919640316211">Info</translation> <translation id="1116779635164066733">Denne innstillingen håndheves av «<ph name="NAME" />»-utvidelsen.</translation> <translation id="111844081046043029">Er du sikker på at du vil forlate denne siden?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Klokkeslettet nå</translation> <translation id="1157102636231978136">Nettleserdata og nettleseraktivitet blir synkronisert med Google-kontoen din</translation> <translation id="1161575384898972166">Logg på <ph name="TOKEN_NAME" /> for å eksportere klientsertifikatet.</translation> +<translation id="1161699061380012396">Chrome OS-inndatametode</translation> <translation id="1163931534039071049">&Vis rammekilde</translation> <translation id="1164674268730883318">Vis du slå av Smart Lock for <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Skriv inn PUK-koden</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play Butikk-konto</translation> <translation id="2509495747794740764">Skaleringsverdien må være et tall mellom 10 og 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Fyll ut skjemaer automatisk</translation> <translation id="2513403576141822879">Se <ph name="BEGIN_LINK" />Synkronisering og Google tjenester<ph name="END_LINK" /> for flere innstillinger knyttet til personvern, sikkerhet og datainnsamling.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Skann</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">Serienummer: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Vis rammekilde</translation> <translation id="3022978424994383087">Det skjønte jeg ikke.</translation> +<translation id="3023464535986383522">Tekstopplesing</translation> <translation id="3024374909719388945">Bruk 24-timersklokke</translation> <translation id="302781076327338683">Last inn omgåelsesbufferen på nytt</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1748,6 +1751,7 @@ <translation id="363903084947548957">Neste inndatametode</translation> <translation id="3640214691812501263">Vil du legge til «<ph name="EXTENSION_NAME" />» for <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Bredde</translation> +<translation id="3645372836428131288">Flytt litt på fingeren for å registrere en annen del av fingeravtrykket.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> oppdaget</translation> <translation id="3649138363871392317">Bildet er tatt</translation> <translation id="3650952250015018111">Tillat at «<ph name="APP_NAME" />» får tilgang til</translation> @@ -1943,7 +1947,6 @@ <translation id="3920504717067627103">Administratorinnstillinger for sertifikater</translation> <translation id="392089482157167418">Slå på ChromeVox (taletilbakemelding)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Du har ingen nylig lagrede WebRTC-logger.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Løsne fra hyllen</translation> <translation id="3926002189479431949">Smart Lock-telefon endret</translation> @@ -2217,6 +2220,7 @@ <translation id="438503109373656455">Jockey</translation> <translation id="4387004326333427325">Autentiseringssertifikatet ble avvist eksternt</translation> <translation id="4389091756366370506">Bruker <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth-konfigurasjonen kontrolleres av <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Slå av</translation> <translation id="4400367121200150367">Nettsteder som aldri lagrer passord, vises her</translation> <translation id="4400632832271803360">Hold Appoversikt-tasten inne for å endre funksjonene for tastene på øverste rad</translation> @@ -2290,6 +2294,7 @@ <translation id="4522600456902129422">Fortsett å gi dette nettstedet tillatelse til å se utklippstavlen</translation> <translation id="4530494379350999373">Opprinnelse</translation> <translation id="4533985347672295764">CPU-tid</translation> +<translation id="4534661889221639075">Prøv på nytt.</translation> <translation id="4535127706710932914">Standardprofil</translation> <translation id="4538417792467843292">Slett ord</translation> <translation id="4538684596480161368">Blokkér alltid programtillegg som ikke er prosessisolert, på <ph name="HOST" /></translation> @@ -2519,6 +2524,7 @@ <translation id="4880520557730313061">Autokorrigering</translation> <translation id="4880827082731008257">Søk i loggen</translation> <translation id="4881695831933465202">Åpne</translation> +<translation id="4882312758060467256">Har tilgang til dette nettstedet</translation> <translation id="4882473678324857464">Fokus på bokmerker</translation> <translation id="4882831918239250449">Kontrollér hvordan nettleserloggen din brukes til personlig tilpasning av søk, annonser med mer</translation> <translation id="4883178195103750615">Eksportér bokmerker til HTML-fil</translation> @@ -2584,6 +2590,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Åpne når ferdig</translation> <translation id="4972129977812092092">Endre skriveren</translation> +<translation id="4972164225939028131">Feil passord</translation> <translation id="497287958838527945">Kredittkort og adresser ved bruk av Google Pay.</translation> <translation id="4973307593867026061">Legg til skrivere</translation> <translation id="4973523518332075481">Bruk et navn på <ph name="MAX_LENGTH" /> eller færre tegn</translation> @@ -3010,6 +3017,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Laster inn apper …</translation> <translation id="5592595402373377407">Nok data er ikke tilgjengelig ennå.</translation> +<translation id="5593357315997824387">Synkroniser filene mine</translation> <translation id="5595152862129936745">Veldig langt unna</translation> <translation id="5595485650161345191">Rediger adresse</translation> <translation id="5596627076506792578">Flere alternativer</translation> @@ -3724,6 +3732,7 @@ <translation id="6664237456442406323">Dessverre er datamaskinen konfigurert med en feilformatert maskinvare-ID. Dette hindrer Chrome OS fra å oppdatere til de siste sikkerhetsoppdateringene, og datamaskinen din <ph name="BEGIN_BOLD" />kan utsettes for skadelige angrep<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Det oppsto en feil ved åpning av profilen din. Logg av og på igjen.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">stopp nedtellingen</translation> <translation id="667517062706956822">Vil du at Google skal oversette denne siden fra <ph name="SOURCE_LANGUAGE" /> til <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">En pekeenhet er koblet til</translation> <translation id="6678717876183468697">Nettadresse for søk</translation> @@ -4050,6 +4059,7 @@ <translation id="7186088072322679094">Behold i verktøyraden</translation> <translation id="7187428571767585875">Registeroppføringer som skal fjernes eller endres:</translation> <translation id="7189234443051076392">Sørg for at det er nok plass på enheten</translation> +<translation id="7189965711416741966">Fingeravtrykket er lagt til.</translation> <translation id="7191159667348037">Ukjent skriver (USB)</translation> <translation id="7191454237977785534">Lagre filen som</translation> <translation id="7193374945610105795">Ingen passord er lagret for <ph name="ORIGIN" /></translation> @@ -4150,6 +4160,7 @@ <translation id="7339898014177206373">Nytt vindu</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> kjører nå i full skjerm.</translation> <translation id="7340650977506865820">Nettstedet deler skjermen din</translation> +<translation id="7341834142292923918">Vil ha tilgang til dette nettstedet</translation> <translation id="7345706641791090287">Bekreft passordet</translation> <translation id="7346909386216857016">Greit</translation> <translation id="7347751611463936647">For å bruke denne utvidelsen, skriver du «<ph name="EXTENSION_KEYWORD" />» , trykker på TAB, og skriver kommandoordet eller søkeordet.</translation> @@ -4259,7 +4270,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å beregne enhetens posisjon. Denne tjenesten er aktiv når posisjonsinnstillingen på enheten din er slått på.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Du kan slå av Posisjon ved å slå av hovedinnstillingen for Posisjon på enheten. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for posisjon fra posisjonsinnstillingene.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Lag et passord –</translation> -<translation id="7518150891539970662">WebRTC-logger (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Opprett</translation> <translation id="7529411698175791732">Sjekk Internett-tilkoblingen din. Hvis problemet vedvarer, bør du prøve å logge av og så logge på igjen.</translation> @@ -4735,6 +4745,7 @@ <translation id="8214962590150211830">Fjern denne personen</translation> <translation id="8217399928341212914">Fortsett blokkeringen av automatisk nedlasting av flere filer</translation> <translation id="8223479393428528563">For å lagre disse filene for bruk utenfor Internett, går du på nettet, høyreklikker på filene og velger <ph name="OFFLINE_CHECKBOX_NAME" />-alternativet.</translation> +<translation id="8225753906568652947">Løs inn tilbudene dine</translation> <translation id="8226222018808695353">Forbudt</translation> <translation id="8226619461731305576">Kø</translation> <translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som er tildelt datamaskinen din:</translation> @@ -4781,6 +4792,7 @@ <translation id="8286036467436129157">Logg på</translation> <translation id="8286963743045814739">Med et inkognitovindu kan du besøke nettsteder anonymt</translation> <translation id="82871696630048499">Nettsiden ble oppdatert fordi den gikk tom for minne.</translation> +<translation id="8288032458496410887">Avinstaller <ph name="APP" /></translation> <translation id="8291967909914612644">Land for leverandøren av hjemmeenheten</translation> <translation id="8294431847097064396">Kilde</translation> <translation id="8297006494302853456">Svak</translation> @@ -4842,6 +4854,7 @@ <translation id="8413385045638830869">Spør først (anbefales)</translation> <translation id="8418445294933751433">Vi&s som fane</translation> <translation id="8419098111404128271">Søkeresultater for «<ph name="SEARCH_TEXT" />»</translation> +<translation id="8419368276599091549">Velkommen til <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Vis filer fra Google Dokumenter</translation> <translation id="8424039430705546751">ned</translation> <translation id="8425213833346101688">Endre</translation> @@ -4968,6 +4981,7 @@ <translation id="8620765578342452535">Konfigurering av nettverkstilkoblinger</translation> <translation id="8624205858755890468">Gjør at assistenten kan vise deg relatert informasjon og relaterte apper og handlinger.</translation> <translation id="862542460444371744">&Utvidelser</translation> +<translation id="8626219642120025691">Nedtellingen er ferdig</translation> <translation id="8627151598708688654">Velg kilde</translation> <translation id="862727964348362408">Stanset</translation> <translation id="862750493060684461">CSS-buffer</translation> @@ -5088,6 +5102,7 @@ <translation id="8775404590947523323">Endringene dine lagres automatisk.<ph name="BREAKS" />For å beholde en kopi av originalbildet, må du fjerne avmerkingen for «Overskriv originalen»</translation> <translation id="8777628254805677039">rotpassord</translation> <translation id="8780443667474968681">Talesøk er slått av.</translation> +<translation id="878068003854005405">La oss komme i gang. Plassér fingeren på sensoren.</translation> <translation id="878069093594050299">Dette sertifikatet er verifisert for følgende bruksområder:</translation> <translation id="8781980678064919987">Slå av maskinen når den lukkes</translation> <translation id="8782565991310229362">Oppstart av kiosk-appen er avbrutt.</translation> @@ -5265,6 +5280,7 @@ <translation id="9050666287014529139">Passordfrase</translation> <translation id="9052208328806230490">Du har registrert skriverne dine med <ph name="CLOUD_PRINT_NAME" /> ved hjelp av konto <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Fortsett blokkering</translation> +<translation id="9053091947372579468">Enheten din leveres med en Chrome-lisens, men brukernavnet ditt er ikke tilknyttet noen administrasjonskonsoll. Opprett en konto for administrasjonskonsollen for å fortsette registreringen. Merk: Hvis du velger å bruke ditt eget domene for å opprette en ny konto for administrasjonskonsollen, må du også fullføre en domenebekreftelse etter registreringen. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Husk valget mitt</translation> <translation id="9055636786322918818">Start håndheving av RC4-kryptering. Hvis du bruker dette alternativet, øker risikoen, ettersom RC4-chiffere ikke er sikre.</translation> <translation id="9056034633062863292">Oppdaterer Chromeboxen</translation> @@ -5368,6 +5384,7 @@ <translation id="9218430445555521422">Bruk som standard</translation> <translation id="9219103736887031265">Bilder</translation> <translation id="9220525904950070496">Fjern konto</translation> +<translation id="9220820413868316583">Løft fingeren, og prøv deretter på nytt.</translation> <translation id="923467487918828349">Vis alle</translation> <translation id="928985544179707652">Utvidelser:</translation> <translation id="930268624053534560">Detaljerte tidsstempler</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index ff49efa..29cd6bb 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Brak sieci</translation> <translation id="1056898198331236512">Ostrzeżenie</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Rejestrowanie odcisku palca</translation> <translation id="1061904396131502319">Wielkimi krokami nadchodzi przerwa</translation> <translation id="1062407476771304334">Zastąp</translation> <translation id="1067048845568873861">Utworzono</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Romb</translation> <translation id="1114335938027186412">Twój komputer ma układ TPM (Trusted Platform Module), który umożliwia zastosowanie wielu krytycznych funkcji zabezpieczeń w Chrome OS. Więcej informacji znajdziesz w Centrum pomocy Chromebooka na stronie https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Przejdź w tryb uśpienia, gdy pokrywa jest zamknięta</translation> +<translation id="1115324527092594775">Skonfiguruj Razem lepiej</translation> <translation id="1116694919640316211">Informacje</translation> <translation id="1116779635164066733">To ustawienie jest wymuszone przez rozszerzenie <ph name="NAME" />.</translation> <translation id="111844081046043029">Czy na pewno chcesz opuścić tę stronę?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Bieżąca godzina</translation> <translation id="1157102636231978136">Dane przeglądania i aktywność związana z przeglądaniem, które są synchronizowane z Twoim kontem Google</translation> <translation id="1161575384898972166">Zaloguj się do urządzenia <ph name="TOKEN_NAME" />, aby wyeksportować certyfikat klienta.</translation> +<translation id="1161699061380012396">Metoda wprowadzania Chrome OS</translation> <translation id="1163931534039071049">&Wyświetl źródło ramki</translation> <translation id="1164674268730883318">Wyłączyć Smart Lock na urządzenie <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Wpisz klucz odblokowujący kod PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Konto w Sklepie Google Play</translation> <translation id="2509495747794740764">Współczynnik skalowania musi wynosić od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Autouzupełniaj formularze</translation> <translation id="2513403576141822879">Więcej ustawień związanych z prywatnością, bezpieczeństwem i zbieraniem danych znajdziesz w sekcji <ph name="BEGIN_LINK" />Synchronizacja i usługi Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Skanuj</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Numer seryjny: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Wyświetl źródło ramki</translation> <translation id="3022978424994383087">Nie rozumiem.</translation> +<translation id="3023464535986383522">Przeczytaj na głos</translation> <translation id="3024374909719388945">Zegar 24-godzinny</translation> <translation id="302781076327338683">Załaduj ponownie, pomijając pamięć podręczną</translation> <translation id="3031417829280473749">Agentka X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Następna metoda wprowadzania</translation> <translation id="3640214691812501263">Dodać „<ph name="EXTENSION_NAME" />” dla: <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Szerokość</translation> +<translation id="3645372836428131288">Przesuń odrobinę, by zeskanować inną część odcisku palca.</translation> <translation id="3648348069317717750">Wykryto <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Zdjęcie zostało zrobione</translation> <translation id="3650952250015018111">Zezwól aplikacji „<ph name="APP_NAME" />” na dostęp do:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Zasady certyfikatu</translation> <translation id="392089482157167418">Włącz ChromeVox (potwierdzenia głosowe)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nie ma zapisanych ostatnio dzienników WebRTC.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Odepnij od półki</translation> <translation id="3926002189479431949">Telefon z funkcją Smart Lock został zmieniony</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Walor</translation> <translation id="4387004326333427325">Certyfikat uwierzytelniania został odrzucony zdalnie</translation> <translation id="4389091756366370506">Użytkownik <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfiguracją Bluetooth zarządza <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Wyłącz</translation> <translation id="4400367121200150367">Tutaj będą wyświetlane strony, które nigdy nie zapisują haseł</translation> <translation id="4400632832271803360">Przytrzymaj klawisz programu uruchamiającego, by zmienić działanie klawiszy z górnego rzędu</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Nadal zezwalaj tej stronie na dostęp do schowka</translation> <translation id="4530494379350999373">Pochodzenie</translation> <translation id="4533985347672295764">Czas pracy procesora</translation> +<translation id="4534661889221639075">Spróbuj ponownie.</translation> <translation id="4535127706710932914">Profil domyślny</translation> <translation id="4538417792467843292">Usuń słowo</translation> <translation id="4538684596480161368">Zawsze blokuj wtyczki poza piaskownicą na <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Autokorekta</translation> <translation id="4880827082731008257">Przeszukaj historię</translation> <translation id="4881695831933465202">Otwórz</translation> +<translation id="4882312758060467256">Ma dostęp do tej strony</translation> <translation id="4882473678324857464">Zaznacz zakładki</translation> <translation id="4882831918239250449">Zarządzaj personalizacją wyszukiwarki, reklam i innych funkcji na podstawie historii przeglądania</translation> <translation id="4883178195103750615">Eksportuj zakładki do pliku HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Otwórz po zakończeniu</translation> <translation id="4972129977812092092">Edytuj drukarkę</translation> +<translation id="4972164225939028131">Nieprawidłowe hasło</translation> <translation id="497287958838527945">Karty kredytowe i adresy z Google Pay.</translation> <translation id="4973307593867026061">Dodaj drukarki</translation> <translation id="4973523518332075481">Użyj nazwy, której długość nie przekracza <ph name="MAX_LENGTH" /> znaków</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Wczytuję aplikacje…</translation> <translation id="5592595402373377407">Brak wystarczającej ilości danych.</translation> +<translation id="5593357315997824387">Synchronizuj moje pliki</translation> <translation id="5595152862129936745">Bardzo daleko</translation> <translation id="5595485650161345191">Edytuj adres</translation> <translation id="5596627076506792578">Więcej opcji</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Twój komputer jest skonfigurowany przy użyciu błędnie sformatowanego identyfikatora sprzętu. Ta sytuacja uniemożliwia zaktualizowanie systemu operacyjnego Chrome za pomocą najnowszych poprawek zabezpieczeń, a komputer <ph name="BEGIN_BOLD" />może być narażony na złośliwe ataki<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Podczas otwierania Twojego profilu coś poszło nie tak. Wyloguj się i ponownie zaloguj.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">zatrzymaj minutnik</translation> <translation id="667517062706956822">Chcesz zobaczyć tłumaczenie Google tej strony z języka <ph name="SOURCE_LANGUAGE" /> na <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Podłączono urządzenie wskazujące</translation> <translation id="6678717876183468697">URL zapytania</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Zachowaj na pasku narzędzi</translation> <translation id="7187428571767585875">Wpisy w rejestrze, które zostaną usunięte lub zmienione:</translation> <translation id="7189234443051076392">Upewnij się, że masz wystarczająco dużo miejsca na urządzeniu</translation> +<translation id="7189965711416741966">Odcisk palca dodany.</translation> <translation id="7191159667348037">Nieznana drukarka (USB)</translation> <translation id="7191454237977785534">Zapisz plik jako</translation> <translation id="7193374945610105795">Nie zapisano żadnych haseł do <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Nowe okno</translation> <translation id="7340431621085453413">Strona <ph name="FULLSCREEN_ORIGIN" /> jest teraz wyświetlana w trybie pełnoekranowym.</translation> <translation id="7340650977506865820">Strona udostępnia ekran</translation> +<translation id="7341834142292923918">Chce mieć dostęp do tej strony</translation> <translation id="7345706641791090287">Potwierdź hasło</translation> <translation id="7346909386216857016">Rozumiem</translation> <translation id="7347751611463936647">Aby skorzystać z tego rozszerzenia, wpisz „<ph name="EXTENSION_KEYWORD" />”, naciśnij klawisz TAB i wpisz odpowiednie polecenie lub wyszukiwany tekst.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Usługa lokalizacyjna Google określa lokalizację urządzenia na podstawie takich źródeł jak sieci Wi-Fi i komórkowe oraz czujniki. Ta usługa jest aktywna, gdy na urządzeniu jest włączona Lokalizacja.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Aby wyłączyć tę usługę, wyłącz główne ustawienie Lokalizacja na urządzeniu. Możesz też wyłączyć w ustawieniach lokalizacji korzystanie z sieci Wi‑Fi, sieci komórkowych i czujników przy określaniu lokalizacji.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Utwórz hasło –</translation> -<translation id="7518150891539970662">Dzienniki WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Utwórz</translation> <translation id="7529411698175791732">Sprawdź połączenie z internetem. Jeśli problem nie ustąpi, wyloguj się i zaloguj ponownie.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Usuń tę osobę</translation> <translation id="8217399928341212914">Dalej blokuj automatyczne pobieranie wielu plików</translation> <translation id="8223479393428528563">Aby zapisać te pliki i używać ich offline, przejdź do trybu online, kliknij pliki prawym przyciskiem myszy i wybierz opcję <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Wykorzystaj swoje oferty</translation> <translation id="8226222018808695353">Zabroniony</translation> <translation id="8226619461731305576">Kolejka</translation> <translation id="8226742006292257240">Poniżej znajduje się losowo wygenerowane hasło modułu TPM, które zostało przypisane do Twojego komputera:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Zaloguj się</translation> <translation id="8286963743045814739">Możesz przeglądać prywatnie w oknie incognito</translation> <translation id="82871696630048499">Strona została załadowana ponownie, bo zabrakło pamięci.</translation> +<translation id="8288032458496410887">Odinstaluj aplikację <ph name="APP" />…</translation> <translation id="8291967909914612644">Kraj operatora macierzystego</translation> <translation id="8294431847097064396">Źródło</translation> <translation id="8297006494302853456">Słaby</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Najpierw zapytaj (zalecane)</translation> <translation id="8418445294933751433">&Pokaż jako kartę</translation> <translation id="8419098111404128271">Wyniki wyszukiwania dla „<ph name="SEARCH_TEXT" />”</translation> +<translation id="8419368276599091549">Oto Twój <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Pokazuj pliki Dokumentów Google</translation> <translation id="8424039430705546751">w dół</translation> <translation id="8425213833346101688">Zmień</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Konfigurowanie połączenia sieciowego</translation> <translation id="8624205858755890468">Umożliwia Asystentowi wyświetlanie powiązanych informacji, aplikacji i działań.</translation> <translation id="862542460444371744">&Rozszerzenia</translation> +<translation id="8626219642120025691">Minutnik gotowy</translation> <translation id="8627151598708688654">Wybierz źródło</translation> <translation id="862727964348362408">Zawieszona</translation> <translation id="862750493060684461">Pamięć podręczna CSS</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Twoje zmiany są zapisywane automatycznie.<ph name="BREAKS" />Aby zachować kopię oryginalnego obrazu, odznacz „Zastąp oryginalny”.</translation> <translation id="8777628254805677039">hasło główne</translation> <translation id="8780443667474968681">Wyszukiwanie głosowe zostało wyłączone.</translation> +<translation id="878068003854005405">Zaczynamy. Umieść palec na czujniku.</translation> <translation id="878069093594050299">Ten certyfikat został zweryfikowany na potrzeby następujących zastosowań:</translation> <translation id="8781980678064919987">Wyłącz, gdy pokrywa jest zamknięta</translation> <translation id="8782565991310229362">Uruchamianie aplikacji kiosku zostało anulowane.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Hasło</translation> <translation id="9052208328806230490">Zarejestrowano drukarki w usłudze <ph name="CLOUD_PRINT_NAME" /> przy użyciu konta <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Nadal blokuj</translation> +<translation id="9053091947372579468">Na Twoim urządzeniu jest licencja Chrome, ale Twoja nazwa użytkownika nie jest powiązana z konsolą administracyjną. Utwórz konto konsoli administracyjnej, by kontynuować rejestrację. Uwaga: jeśli do utworzenia nowego konta konsoli administracyjnej użyjesz własnej domeny, po utworzeniu konta musisz przeprowadzić weryfikację domeny. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Zapamiętaj mój wybór</translation> <translation id="9055636786322918818">Wymusza szyfrowanie RC4. Używanie tej opcji jest ryzykowne, ponieważ szyfrowanie RC4 nie zapewnia bezpieczeństwa.</translation> <translation id="9056034633062863292">Aktualizuję Chromeboxa</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Ustaw jako domyślną</translation> <translation id="9219103736887031265">Grafika</translation> <translation id="9220525904950070496">Usuń konto</translation> +<translation id="9220820413868316583">Podnieś i spróbuj ponownie.</translation> <translation id="923467487918828349">Pokaż wszystko</translation> <translation id="928985544179707652">Rozszerzenia</translation> <translation id="930268624053534560">Szczegółowe sygnatury czasowe</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index bb9aa718..da78637 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nenhuma rede encontrada</translation> <translation id="1056898198331236512">Aviso</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrando impressão digital</translation> <translation id="1061904396131502319">Está quase na hora de fazer uma pausa</translation> <translation id="1062407476771304334">Substituir</translation> <translation id="1067048845568873861">Criado em</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamante</translation> <translation id="1114335938027186412">Seu computador possui um dispositivo de segurança Trusted Platform Module (TPM, na sigla em inglês), que é utilizado para implementar muitos recursos de segurança importantes no Chrome OS. Visite a Central de Ajuda do Chromebook para saber mais: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Colocar em modo de suspensão quando a tampa estiver fechada</translation> +<translation id="1115324527092594775">Configurar o "Better Together"</translation> <translation id="1116694919640316211">Sobre</translation> <translation id="1116779635164066733">Esta configuração é aplicada pela extensão "<ph name="NAME" />".</translation> <translation id="111844081046043029">Tem certeza que quer sair desta página?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Hora atual</translation> <translation id="1157102636231978136">Seus dados e atividades de navegação, sincronizados com sua Conta do Google</translation> <translation id="1161575384898972166">Faça login no <ph name="TOKEN_NAME" /> para exportar o certificado do cliente.</translation> +<translation id="1161699061380012396">Método de entrada do Chrome OS</translation> <translation id="1163931534039071049">&Exibir código fonte do frame</translation> <translation id="1164674268730883318">Desativar o Smart Lock para <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Informar chave para desbloqueio de PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Conta da Google Play Store</translation> <translation id="2509495747794740764">O valor do dimensionamento precisa ser um número entre 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Preencher form. automaticamente</translation> <translation id="2513403576141822879">Para ver mais configurações relacionadas à privacidade, segurança e coleta de dados, acesse <ph name="BEGIN_LINK" />Serviços do Google e de sincronização<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Verificar</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Número de série: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Exibir código fonte do frame</translation> <translation id="3022978424994383087">Não entendi.</translation> +<translation id="3023464535986383522">Selecionar para ouvir</translation> <translation id="3024374909719388945">Usar relógio no formato 24 horas</translation> <translation id="302781076327338683">Atualizar ignorando o cache</translation> <translation id="3031417829280473749">Agente X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Próximo método de entrada</translation> <translation id="3640214691812501263">Adicionar "<ph name="EXTENSION_NAME" />" para <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Largura</translation> +<translation id="3645372836428131288">Mova o dedo levemente para capturar outra parte da impressão digital.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> detectado</translation> <translation id="3649138363871392317">A foto foi capturada</translation> <translation id="3650952250015018111">Permitir que o app "<ph name="APP_NAME" />" acesse:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Diretivas de certificação</translation> <translation id="392089482157167418">Ativar ChromeVox (feedback falado)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Você não tem nenhum registro WebRTC capturado recentemente.</translation> <translation id="3925573269917483990">Câmera:</translation> <translation id="3925842537050977900">Desafixar da estante</translation> <translation id="3926002189479431949">Smartphone com Smart Lock alterado</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Silver</translation> <translation id="4387004326333427325">Certificado de autenticação rejeitado remotamente</translation> <translation id="4389091756366370506">Usuário <ph name="VALUE" /></translation> +<translation id="439266289085815679">A configuração do Bluetooth é controlada por <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Desativar</translation> <translation id="4400367121200150367">Sites que nunca salvam senhas serão mostrados aqui</translation> <translation id="4400632832271803360">Toque na tecla Iniciador e mantenha-a pressionada para alternar o comportamento das teclas de função</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Continuar permitindo que esse site veja a área de transferência</translation> <translation id="4530494379350999373">Origem</translation> <translation id="4533985347672295764">Tempo de CPU</translation> +<translation id="4534661889221639075">Tente novamente.</translation> <translation id="4535127706710932914">Perfil padrão</translation> <translation id="4538417792467843292">Excluir palavra</translation> <translation id="4538684596480161368">Sempre bloquear plug-ins sem sandbox em <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Correção automática</translation> <translation id="4880827082731008257">Histórico de pesquisa</translation> <translation id="4881695831933465202">Abrir</translation> +<translation id="4882312758060467256">Tem acesso a este site</translation> <translation id="4882473678324857464">Focar favoritos</translation> <translation id="4882831918239250449">Controlar como o histórico de navegação é usado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4883178195103750615">Exportar favoritos para arquivo HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Álbum</translation> <translation id="4971412780836297815">Abrir quando estiver concluído</translation> <translation id="4972129977812092092">Editar impressora</translation> +<translation id="4972164225939028131">Senha incorreta</translation> <translation id="497287958838527945">Cartões de crédito e endereços que usam o Google Pay.</translation> <translation id="4973307593867026061">Adicionar impressoras</translation> <translation id="4973523518332075481">Use um nome que tenha no máximo <ph name="MAX_LENGTH" /> caracteres</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Carregando apps…</translation> <translation id="5592595402373377407">Ainda não há dados suficientes.</translation> +<translation id="5593357315997824387">Sincronizar meus arquivos</translation> <translation id="5595152862129936745">Muito longe</translation> <translation id="5595485650161345191">Editar endereço</translation> <translation id="5596627076506792578">Mais opções</translation> @@ -3735,6 +3743,7 @@ <translation id="6664237456442406323">Infelizmente, seu computador está configurado com um ID de hardware mal formado. Isso impede que o Chrome OS seja atualizado com as correções de segurança mais recentes e, por isso, seu computador <ph name="BEGIN_BOLD" />pode ficar vulnerável a ataques maliciosos<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Ocorreu um erro ao abrir seu perfil. Saia da conta e faça login novamente.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">parar timer</translation> <translation id="667517062706956822">Quer que o Google traduza esta página de <ph name="SOURCE_LANGUAGE" /> para <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Dispositivo apontador conectado</translation> <translation id="6678717876183468697">URL de consulta</translation> @@ -4061,6 +4070,7 @@ <translation id="7186088072322679094">Manter na barra de ferramentas</translation> <translation id="7187428571767585875">Entradas de registro que devem ser removidas ou alteradas:</translation> <translation id="7189234443051076392">Verifique se há espaço suficiente no seu dispositivo</translation> +<translation id="7189965711416741966">Impressão digital adicionada.</translation> <translation id="7191159667348037">Impressora desconhecida (USB)</translation> <translation id="7191454237977785534">Salvar arquivo como</translation> <translation id="7193374945610105795">Nenhuma senha salva para <ph name="ORIGIN" /></translation> @@ -4161,6 +4171,7 @@ <translation id="7339898014177206373">Nova janela</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> está agora no modo de tela inteira.</translation> <translation id="7340650977506865820">O site está compartilhando sua tela</translation> +<translation id="7341834142292923918">Quer ter acesso a este site</translation> <translation id="7345706641791090287">Confirmar sua senha</translation> <translation id="7346909386216857016">Ok, entendi.</translation> <translation id="7347751611463936647">Para usar esta extensão, digite "<ph name="EXTENSION_KEYWORD" />" e, em seguida, pressione a tecla TAB e insira seu comando ou termo de pesquisa.</translation> @@ -4270,7 +4281,6 @@ <ph name="BEGIN_PARAGRAPH2" />O serviço de localização do Google utiliza fontes como Wi-Fi, redes móveis e sensores para ajudar a estimar o local do dispositivo. Esse serviço fica ativo quando a configuração Local do dispositivo está ativada.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />É possível desativar a localização desativando a configuração principal de Local no seu dispositivo. Você também pode desativar o uso de Wi-Fi, redes móveis e sensores de local nas configurações.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Criar uma senha:</translation> -<translation id="7518150891539970662">Registros WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Criar</translation> <translation id="7529411698175791732">Verifique sua conexão com a Internet. Se o problema continuar, tente sair e fazer login novamente.</translation> @@ -4748,6 +4758,7 @@ <translation id="8214962590150211830">Remover esta pessoa</translation> <translation id="8217399928341212914">Continuar a bloquear downloads automáticos de vários arquivos</translation> <translation id="8223479393428528563">Para salvar esses arquivos para uso off-line, fique on-line novamente, clique com o botão direito nos arquivos e selecione a opção <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Resgatar suas ofertas</translation> <translation id="8226222018808695353">Proibido</translation> <translation id="8226619461731305576">Fila</translation> <translation id="8226742006292257240">A senha abaixo foi gerada de forma aleatória e atribuída ao seu computador:</translation> @@ -4794,6 +4805,7 @@ <translation id="8286036467436129157">Fazer login</translation> <translation id="8286963743045814739">Você pode navegar com privacidade usando uma janela anônima</translation> <translation id="82871696630048499">A página da Web foi atualizada porque ficou sem memória.</translation> +<translation id="8288032458496410887">Desinstalar <ph name="APP" />...</translation> <translation id="8291967909914612644">País do provedor doméstico</translation> <translation id="8294431847097064396">Origem</translation> <translation id="8297006494302853456">Fraco</translation> @@ -4856,6 +4868,7 @@ <translation id="8413385045638830869">Perguntar primeiro (recomendado)</translation> <translation id="8418445294933751433">&Mostrar como guia</translation> <translation id="8419098111404128271">Resultados de pesquisa para "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Bem-vindo ao <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Mostrar arquivos do Google Docs</translation> <translation id="8424039430705546751">para baixo</translation> <translation id="8425213833346101688">Alterar</translation> @@ -4982,6 +4995,7 @@ <translation id="8620765578342452535">Configurar conexões de rede</translation> <translation id="8624205858755890468">Permite que o Assistente mostre informações, ações e apps relacionados para você.</translation> <translation id="862542460444371744">&Extensões</translation> +<translation id="8626219642120025691">Timer concluído</translation> <translation id="8627151598708688654">Selecionar fonte</translation> <translation id="862727964348362408">Em suspensão</translation> <translation id="862750493060684461">Cache CSS</translation> @@ -5102,6 +5116,7 @@ <translation id="8775404590947523323">Suas edições são salvas automaticamente. <ph name="BREAKS" />Para manter uma cópia da imagem original, desmarque a opção "Substituir original"</translation> <translation id="8777628254805677039">senha raiz</translation> <translation id="8780443667474968681">A pesquisa por voz foi desativada.</translation> +<translation id="878068003854005405">Vamos começar. Coloque seu dedo no sensor.</translation> <translation id="878069093594050299">Este certificado foi confirmado para os seguintes usos:</translation> <translation id="8781980678064919987">Desligar quando a tampa estiver fechada</translation> <translation id="8782565991310229362">A inicialização do aplicativo de quiosque foi cancelada.</translation> @@ -5279,6 +5294,7 @@ <translation id="9050666287014529139">Senha</translation> <translation id="9052208328806230490">Você registrou suas impressoras com <ph name="CLOUD_PRINT_NAME" /> utilizando a conta <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Continuar bloqueando</translation> +<translation id="9053091947372579468">Seu dispositivo inclui uma licença do Chrome, mas seu nome de usuário não está associado a um Admin console. Crie uma conta do Admin console para dar continuidade à inscrição. Observação: se você optar por usar seu próprio domínio para criar uma nova conta do Admin console, também poderá concluir a confirmação de domínio após a inscrição. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Lembrar minha escolha</translation> <translation id="9055636786322918818">Aplicar a codificação RC4. O uso dessa opção é mais arriscado, porque as criptografias RC4 não são seguras.</translation> <translation id="9056034633062863292">Atualizando o Chromebox</translation> @@ -5382,6 +5398,7 @@ <translation id="9218430445555521422">Definir como padrão</translation> <translation id="9219103736887031265">Imagens</translation> <translation id="9220525904950070496">Remover conta</translation> +<translation id="9220820413868316583">Levante o dedo e tente novamente.</translation> <translation id="923467487918828349">Mostrar todas</translation> <translation id="928985544179707652">Extensões:</translation> <translation id="930268624053534560">Timestamps detalhados</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 1468a74b..ef7f1d4c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nenhuma rede</translation> <translation id="1056898198331236512">Aviso</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registar a impressão digital</translation> <translation id="1061904396131502319">Está quase na altura de fazer uma pausa</translation> <translation id="1062407476771304334">Substituir</translation> <translation id="1067048845568873861">Data da criação</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamante</translation> <translation id="1114335938027186412">O seu computador contém um dispositivo de segurança com TPM (Trusted Platform Module, Módulo de plataforma fidedigna), que é utilizado para implementar várias funcionalidades de segurança essenciais no Chrome OS. Visite o Centro de Ajuda do Chromebook em https://support.google.com/chromebook/?p=tpm para saber mais.</translation> <translation id="1114525161406758033">Suspender quando a tampa for fechada</translation> +<translation id="1115324527092594775">Configurar Better Together</translation> <translation id="1116694919640316211">Acerca de</translation> <translation id="1116779635164066733">Esta definição é aplicada pela extensão "<ph name="NAME" />".</translation> <translation id="111844081046043029">Tem a certeza de que pretende sair desta página?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Hora atual</translation> <translation id="1157102636231978136">A sua atividade e os dados de navegação são sincronizados com a sua Conta Google.</translation> <translation id="1161575384898972166">Inicie sessão no <ph name="TOKEN_NAME" /> para exportar o certificado de cliente.</translation> +<translation id="1161699061380012396">Método de introdução do Chrome OS</translation> <translation id="1163931534039071049">&Ver fonte da moldura</translation> <translation id="1164674268730883318">Pretende desativar o Smart Lock para o <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Introduzir chave de desbloqueio do PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Conta da Google Play Store</translation> <translation id="2509495747794740764">O valor de dimensionamento tem de ser um número entre 10 e 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Preencher autom. formulários</translation> <translation id="2513403576141822879">Para obter mais definições relacionadas com privacidade, segurança e recolha de dados, consulte <ph name="BEGIN_LINK" />Sincronização e serviços Google<ph name="END_LINK" />.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Analisar</translation> @@ -1358,6 +1360,7 @@ <translation id="3020990233660977256">Número de série: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Ver Origem da Moldura</translation> <translation id="3022978424994383087">Não entendido.</translation> +<translation id="3023464535986383522">Selecionar para falar</translation> <translation id="3024374909719388945">Utilizar relógio de 24h</translation> <translation id="302781076327338683">Atualizar processo para ignorar a cache</translation> <translation id="3031417829280473749">Agente X</translation> @@ -1754,6 +1757,7 @@ <translation id="363903084947548957">Método de introdução seguinte</translation> <translation id="3640214691812501263">Adicionar "<ph name="EXTENSION_NAME" />" para <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Largura</translation> +<translation id="3645372836428131288">Mova ligeiramente para capturar uma parte diferente da impressão digital.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> detetado</translation> <translation id="3649138363871392317">Foi capturada uma foto</translation> <translation id="3650952250015018111">Permitir que o "<ph name="APP_NAME" />" tenha acesso:</translation> @@ -1949,7 +1953,6 @@ <translation id="3920504717067627103">Políticas de certificados</translation> <translation id="392089482157167418">Ativar ChromeVox (comentários falados)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Não existem registos de WebRTC capturados recentemente.</translation> <translation id="3925573269917483990">Câmara:</translation> <translation id="3925842537050977900">Soltar da prateleira</translation> <translation id="3926002189479431949">Telemóvel Smart Lock alterado</translation> @@ -2225,6 +2228,7 @@ <translation id="438503109373656455">Trovão</translation> <translation id="4387004326333427325">Certificado de autenticação rejeitado remotamente</translation> <translation id="4389091756366370506">Utilizador <ph name="VALUE" /></translation> +<translation id="439266289085815679">A configuração do Bluetooth é controlada por <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Desactivar</translation> <translation id="4400367121200150367">Os sites que nunca guardam a palavra-passe aparecem aqui</translation> <translation id="4400632832271803360">Prima sem soltar a tecla do iniciador para alterar o comportamento das teclas da linha superior.</translation> @@ -2298,6 +2302,7 @@ <translation id="4522600456902129422">Continuar a permitir que este site veja a área de transferência</translation> <translation id="4530494379350999373">Origem</translation> <translation id="4533985347672295764">Tempo da CPU</translation> +<translation id="4534661889221639075">Tente novamente.</translation> <translation id="4535127706710932914">Perfil Predefinido</translation> <translation id="4538417792467843292">Eliminar palavra</translation> <translation id="4538684596480161368">Bloquear sempre plug-ins sem isolamento de processos em <ph name="HOST" /></translation> @@ -2527,6 +2532,7 @@ <translation id="4880520557730313061">Correção automática</translation> <translation id="4880827082731008257">Pesquisar histórico</translation> <translation id="4881695831933465202">Abrir</translation> +<translation id="4882312758060467256">Tem acesso a este site</translation> <translation id="4882473678324857464">Foco nos marcadores</translation> <translation id="4882831918239250449">Controlar a forma como o histórico de navegação é utilizado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4883178195103750615">Exportar marcadores para ficheiro HTML...</translation> @@ -2592,6 +2598,7 @@ <translation id="4969785127455456148">Álbum</translation> <translation id="4971412780836297815">Abrir quando estiver concluído</translation> <translation id="4972129977812092092">Editar impressora</translation> +<translation id="4972164225939028131">Palavra-passe incorreta.</translation> <translation id="497287958838527945">Cartões de crédito e endereços com o Google Pay.</translation> <translation id="4973307593867026061">Adicionar impressoras</translation> <translation id="4973523518332075481">Utilize um nome com, no máximo, <ph name="MAX_LENGTH" /> carateres</translation> @@ -3019,6 +3026,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">A carregar aplicações…</translation> <translation id="5592595402373377407">Ainda não estão disponíveis dados suficientes.</translation> +<translation id="5593357315997824387">Sincronizar os meus ficheiros</translation> <translation id="5595152862129936745">Muito afastado</translation> <translation id="5595485650161345191">Editar morada</translation> <translation id="5596627076506792578">Mais opções</translation> @@ -3735,6 +3743,7 @@ <translation id="6664237456442406323">Infelizmente, o seu computador está configurado com um ID de hardware formatado incorretamente. Este facto impede que o Chrome OS faça a atualização das últimas correções de segurança e o seu computador <ph name="BEGIN_BOLD" />pode estar vulnerável a ataques maliciosos<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Ocorreu um erro ao abrir o seu perfil. Termine sessão e inicie-a novamente.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">parar temporizador</translation> <translation id="667517062706956822">Pretende que o Google traduza esta página de <ph name="SOURCE_LANGUAGE" /> para <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Dispositivo apontador ligado</translation> <translation id="6678717876183468697">URL de consulta</translation> @@ -4061,6 +4070,7 @@ <translation id="7186088072322679094">Manter na Barra de ferramentas</translation> <translation id="7187428571767585875">Entradas de registo a remover ou a alterar:</translation> <translation id="7189234443051076392">Certifique-se de que existe espaço suficiente no seu dispositivo.</translation> +<translation id="7189965711416741966">Impressão digital adicionada.</translation> <translation id="7191159667348037">Impressora desconhecida (USB)</translation> <translation id="7191454237977785534">Guardar ficheiro como</translation> <translation id="7193374945610105795">Sem palavras-passe guardadas para <ph name="ORIGIN" /></translation> @@ -4161,6 +4171,7 @@ <translation id="7339898014177206373">Nova janela</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> está agora em ecrã inteiro.</translation> <translation id="7340650977506865820">O site está a partilhar o ecrã.</translation> +<translation id="7341834142292923918">Pretende o acesso a este site</translation> <translation id="7345706641791090287">Confirmar a palavra-passe</translation> <translation id="7346909386216857016">OK, compreendi</translation> <translation id="7347751611463936647">Para utilizar esta extensão, escreva "<ph name="EXTENSION_KEYWORD" />", prima TAB e, em seguida, introduza o seu comando ou pesquisa.</translation> @@ -4270,7 +4281,6 @@ <ph name="BEGIN_PARAGRAPH2" />O serviço de localização da Google utiliza fontes como redes Wi-Fi e móveis, bem como sensores, para ajudar a obter uma estimativa da localização do dispositivo. Este serviço está ativo quando a definição de localização do dispositivo está ativada.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Pode desativar a Localização ao desativar a definição de Localização principal no dispositivo. Também pode desativar a utilização das redes Wi-Fi e móveis, bem como de sensores, para fins de localização nas definições de localização.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Criar palavra-passe –</translation> -<translation id="7518150891539970662">Registos de WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Criar</translation> <translation id="7529411698175791732">Verifique a sua ligação à Internet. Se o problema continuar, experimente terminar e iniciar sessão novamente.</translation> @@ -4748,6 +4758,7 @@ <translation id="8214962590150211830">Remover esta pessoa</translation> <translation id="8217399928341212914">Continuar a bloquear transferências automáticas de vários ficheiros</translation> <translation id="8223479393428528563">Para guardar estes ficheiros para utilização offline, ligue-se novamente à Internet, clique com o botão direito do rato nos ficheiros e selecione a opção <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Resgatar as suas ofertas</translation> <translation id="8226222018808695353">Proibido</translation> <translation id="8226619461731305576">Fila</translation> <translation id="8226742006292257240">A palavra-passe TPM abaixo foi gerada aleatoriamente e atribuída ao seu computador:</translation> @@ -4794,6 +4805,7 @@ <translation id="8286036467436129157">Iniciar Sessão</translation> <translation id="8286963743045814739">Pode navegar em privado com uma janela de navegação anónima</translation> <translation id="82871696630048499">A página Web foi atualizada, pois ficou sem memória.</translation> +<translation id="8288032458496410887">Desinstalar a aplicação <ph name="APP" />…</translation> <translation id="8291967909914612644">País do fornecedor base</translation> <translation id="8294431847097064396">Origem</translation> <translation id="8297006494302853456">Fraca</translation> @@ -4855,6 +4867,7 @@ <translation id="8413385045638830869">Perguntar primeiro (recomendado)</translation> <translation id="8418445294933751433">Mo&strar como separador</translation> <translation id="8419098111404128271">Resultados da pesquisa para "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Bem-vindo a <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Mostrar ficheiros do Google Docs</translation> <translation id="8424039430705546751">para baixo</translation> <translation id="8425213833346101688">Alterar</translation> @@ -4981,6 +4994,7 @@ <translation id="8620765578342452535">Configurar ligações de rede</translation> <translation id="8624205858755890468">Ativa o Assistente para lhe mostrar informações relacionadas, aplicações e ações.</translation> <translation id="862542460444371744">&Extensões</translation> +<translation id="8626219642120025691">Temporizador concluído</translation> <translation id="8627151598708688654">Selecionar fonte</translation> <translation id="862727964348362408">Suspenso</translation> <translation id="862750493060684461">Cache CSS</translation> @@ -5101,6 +5115,7 @@ <translation id="8775404590947523323">As suas edições são guardadas automaticamente.<ph name="BREAKS" />Para manter uma cópia da imagem original, desmarque a opção "Substituir original"</translation> <translation id="8777628254805677039">palavra-passe de raiz</translation> <translation id="8780443667474968681">A pesquisa por voz foi desativada.</translation> +<translation id="878068003854005405">Vamos começar. Coloque o dedo no sensor.</translation> <translation id="878069093594050299">Este certificado foi confirmado para as seguintes utilizações:</translation> <translation id="8781980678064919987">Encerrar quando a tampa for fechada</translation> <translation id="8782565991310229362">A iniciação da aplicação de quiosque foi cancelada.</translation> @@ -5278,6 +5293,7 @@ <translation id="9050666287014529139">Frase de acesso</translation> <translation id="9052208328806230490">Registou as suas impressoras com <ph name="CLOUD_PRINT_NAME" /> utilizando a conta <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Continuar a bloquear</translation> +<translation id="9053091947372579468">O seu dispositivo inclui uma licença do Chrome, mas o seu nome de utilizador não está associado a uma Consola do administrador. Crie uma conta da Consola do administrador para continuar a inscrição. Nota: se optar por criar a conta da Consola do administrador com o seu próprio domínio, também tem de concluir a validação de domínio após a inscrição. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Memorizar a minha escolha</translation> <translation id="9055636786322918818">Aplicar a encriptação RC4. A utilização desta opção aumenta o seu risco, uma vez que as cifras RC4 são inseguras.</translation> <translation id="9056034633062863292">Atualização do Chromebox</translation> @@ -5381,6 +5397,7 @@ <translation id="9218430445555521422">Definir como predefinição</translation> <translation id="9219103736887031265">Imagens</translation> <translation id="9220525904950070496">Remover conta</translation> +<translation id="9220820413868316583">Levante e tente novamente.</translation> <translation id="923467487918828349">Mostrar todas</translation> <translation id="928985544179707652">Extensões.</translation> <translation id="930268624053534560">Data/hora em detalhe</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 09daec72..a44e0d6 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Nu s-au găsit rețele</translation> <translation id="1056898198331236512">Avertisment</translation> <translation id="1058262162121953039">Codul PUK</translation> +<translation id="1059855432287631118">Înregistrează amprenta digitală</translation> <translation id="1061904396131502319">Se apropie timpul pentru o pauză</translation> <translation id="1062407476771304334">Înlocuiți</translation> <translation id="1067048845568873861">Creat</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Computerul conține un dispozitiv de securitate Trusted Platform Module (TPM), care este folosit pentru a implementa numeroase funcții esențiale de securitate în sistemul de operare Chrome. Accesează Centrul de ajutor Chromebook pentru a afla mai multe: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Când capacul este închis: modul inactiv</translation> +<translation id="1115324527092594775">Configurează mai bine împreună</translation> <translation id="1116694919640316211">Despre</translation> <translation id="1116779635164066733">Această setare este impusă de extensia „<ph name="NAME" />”.</translation> <translation id="111844081046043029">Sigur vrei să ieși de pe această pagină?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Ora actuală</translation> <translation id="1157102636231978136">Datele de navigare și activitatea ta, sincronizate în Contul Google</translation> <translation id="1161575384898972166">Conectează-te la <ph name="TOKEN_NAME" /> pentru a exporta certificatul client.</translation> +<translation id="1161699061380012396">Metoda de introducere text din sistemul de operare Chrome</translation> <translation id="1163931534039071049">&Afișează sursa cadrului</translation> <translation id="1164674268730883318">Dezactivezi Smart Lock pentru <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Introdu cheia de deblocare a codului PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Contul Magazin Google Play</translation> <translation id="2509495747794740764">Valoarea redimensionării trebuie să fie un număr între 10 și 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Completează automat formularele</translation> <translation id="2513403576141822879">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizare și servicii Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Scanează</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Numărul de serie: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Afișează sursa cadrului</translation> <translation id="3022978424994383087">Nu am înțeles.</translation> +<translation id="3023464535986383522">Selectează și ascultă</translation> <translation id="3024374909719388945">Utilizează formatul de 24 de ore</translation> <translation id="302781076327338683">Reîncarcă ignorând memoria cache</translation> <translation id="3031417829280473749">Agenta X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Următoarea metodă de introducere</translation> <translation id="3640214691812501263">Adaugi „<ph name="EXTENSION_NAME" />” pentru <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Lățime</translation> +<translation id="3645372836428131288">Mută ușor pentru a înregistra o altă parte a amprentei digitale</translation> <translation id="3648348069317717750">S-a detectat <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Fotografia a fost creată</translation> <translation id="3650952250015018111">Permite accesul „<ph name="APP_NAME" />” la:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Politici de certificat</translation> <translation id="392089482157167418">Activați ChromeVox (feedback rostit)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nu aveți jurnale WebRTC înregistrate recent.</translation> <translation id="3925573269917483990">Cameră foto:</translation> <translation id="3925842537050977900">Anulați fixarea din raft</translation> <translation id="3926002189479431949">Telefonul cu funcția Smart Lock s-a schimbat</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Fulgeraș</translation> <translation id="4387004326333427325">Certificatul de autentificare a fost respins de la distanță</translation> <translation id="4389091756366370506">Utilizator <ph name="VALUE" /></translation> +<translation id="439266289085815679">Configurația Bluetooth este controlată de <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Dezactivează</translation> <translation id="4400367121200150367">Site-urile care nu salvează niciodată parole vor apărea aici</translation> <translation id="4400632832271803360">Ține apăsată tasta Lansator pentru a schimba comportamentul tastelor de pe rândul de sus</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Permite în continuare acestui site să vadă clipboardul</translation> <translation id="4530494379350999373">Origine</translation> <translation id="4533985347672295764">Timp CPU</translation> +<translation id="4534661889221639075">Încearcă din nou.</translation> <translation id="4535127706710932914">Profil prestabilit</translation> <translation id="4538417792467843292">Șterge cuvântul</translation> <translation id="4538684596480161368">Blochează întotdeauna pluginurile scoase din mediul de testare pe <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Remediere automată</translation> <translation id="4880827082731008257">Caută în istoric</translation> <translation id="4881695831933465202">Deschide</translation> +<translation id="4882312758060467256">Are acces la acest site</translation> <translation id="4882473678324857464">Focalizează pe marcaje</translation> <translation id="4882831918239250449">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea, anunțurile și alte servicii</translation> <translation id="4883178195103750615">Exportați marcajele într-un fișier HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Deschide când s-a finalizat</translation> <translation id="4972129977812092092">Editează imprimanta</translation> +<translation id="4972164225939028131">Parolă greșită</translation> <translation id="497287958838527945">Carduri de credit și adrese care folosesc Google Pay.</translation> <translation id="4973307593867026061">Adăugați imprimante</translation> <translation id="4973523518332075481">Folosește un nume de maximum <ph name="MAX_LENGTH" /> caractere</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Se încarcă aplicațiile...</translation> <translation id="5592595402373377407">Nu există încă date suficiente.</translation> +<translation id="5593357315997824387">Sincronizează-mi fișierele</translation> <translation id="5595152862129936745">Foarte departe</translation> <translation id="5595485650161345191">Editează adresa</translation> <translation id="5596627076506792578">Mai multe opțiuni</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Din păcate, computerul dvs. este configurat cu un ID de hardware incorect. Acest lucru împiedică actualizarea sistemului de operare Chrome cu cele mai recente remedieri de securitate. În plus, computerul <ph name="BEGIN_BOLD" />ar putea fi vulnerabil la atacuri ale site-urilor web rău intenționate<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">A apărut o eroare la deschiderea profilului. Deconectează-te și conectează-te din nou.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">oprește cronometrul</translation> <translation id="667517062706956822">Dorești ca Google să traducă această pagină din <ph name="SOURCE_LANGUAGE" /> în <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Dispozitivul de indicat este conectat</translation> <translation id="6678717876183468697">Adresa URL a interogării</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Păstrează în bara de instrumente</translation> <translation id="7187428571767585875">Intrări din registry care trebuie eliminate sau modificate:</translation> <translation id="7189234443051076392">Asigură-te că există spațiu suficient pe dispozitiv</translation> +<translation id="7189965711416741966">Amprentă digitală adăugată.</translation> <translation id="7191159667348037">Imprimantă necunoscută (USB)</translation> <translation id="7191454237977785534">Salvează fișierul ca</translation> <translation id="7193374945610105795">Nu s-au salvat parole pentru <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Fereastră nouă</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> este acum pe ecran complet.</translation> <translation id="7340650977506865820">Site-ul permite accesul la ecranul tău</translation> +<translation id="7341834142292923918">Vrea acces la acest site</translation> <translation id="7345706641791090287">Confirmă parola</translation> <translation id="7346909386216857016">OK, am înțeles</translation> <translation id="7347751611463936647">Pentru a utiliza această extensie, introdu „<ph name="EXTENSION_KEYWORD" />”, apoi apasă pe TAB și folosește comanda sau căutarea.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Serviciul de localizare Google folosește surse precum rețelele Wi-Fi, rețelele mobile și senzorii pentru a estima locația dispozitivului. Serviciul este activ atunci când setarea Locație a dispozitivului este activă.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Poți dezactiva locația dezactivând setarea principală Locație pe dispozitiv. De asemenea, poți dezactiva utilizarea rețelelor Wi-Fi, a rețelelor mobile și a senzorilor pentru locație din setările privind locația.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Creați o parolă –</translation> -<translation id="7518150891539970662">Jurnale WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Creați</translation> <translation id="7529411698175791732">Verifică conexiunea la internet. Dacă problema persistă, deconectează-te și conectează-te din nou.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Elimină această persoană</translation> <translation id="8217399928341212914">Blocați în continuare descărcarea automată a mai multor fișiere</translation> <translation id="8223479393428528563">Pentru a salva aceste fișiere pentru utilizare offline, revino online, dă clic dreapta pe fișiere și selectează opțiunea <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Valorifică-ți ofertele</translation> <translation id="8226222018808695353">Interzis</translation> <translation id="8226619461731305576">Coadă</translation> <translation id="8226742006292257240">Mai jos se află parola TPM generată aleatoriu, care a fost atribuită computerului tău:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Conectați-vă</translation> <translation id="8286963743045814739">Poți naviga privat folosind o fereastră incognito</translation> <translation id="82871696630048499">Pagina web a fost reîncărcată pentru că nu a avut suficientă memorie.</translation> +<translation id="8288032458496410887">Dezinstalează <ph name="APP" />...</translation> <translation id="8291967909914612644">Țara furnizorului local</translation> <translation id="8294431847097064396">Sursă</translation> <translation id="8297006494302853456">Slab</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Mai întâi întreabă (recomandat)</translation> <translation id="8418445294933751433">&Afișează ca filă</translation> <translation id="8419098111404128271">Rezultatele de căutare pentru „<ph name="SEARCH_TEXT" />”</translation> +<translation id="8419368276599091549">Bun venit pe <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Afișați fișierele Documente Google</translation> <translation id="8424039430705546751">jos</translation> <translation id="8425213833346101688">Modificați</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Configurează conexiunile la rețea</translation> <translation id="8624205858755890468">Permite Asistentului să afișeze informații, aplicații și acțiuni conexe.</translation> <translation id="862542460444371744">&Extensii</translation> +<translation id="8626219642120025691">Temporizator creat</translation> <translation id="8627151598708688654">Selectează sursa</translation> <translation id="862727964348362408">Suspendat</translation> <translation id="862750493060684461">Memorie cache CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Editările dvs. sunt salvate în mod automat.<ph name="BREAKS" />Pentru a păstra o copie a imaginii originale, debifați „Suprascrieți fișierul original”</translation> <translation id="8777628254805677039">parola directorului rădăcină</translation> <translation id="8780443667474968681">Căutarea vocală a fost dezactivată.</translation> +<translation id="878068003854005405">Să începem. Pune degetul pe senzor.</translation> <translation id="878069093594050299">Acest certificat a fost confirmat pentru următoarele utilizări:</translation> <translation id="8781980678064919987">Când capacul este închis: oprire</translation> <translation id="8782565991310229362">Lansarea aplicațiilor de tip chioșc a fost anulată.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Expresie de acces</translation> <translation id="9052208328806230490">Ai înregistrat imprimantele la <ph name="CLOUD_PRINT_NAME" /> utilizând contul <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Continuă blocarea</translation> +<translation id="9053091947372579468">Dispozitivul tău include o licență Chrome, însă numele de utilizator nu este asociat cu o consolă de administrare. Creează un cont pentru consola de administrare pentru a continua înregistrarea. Notă: dacă alegi să folosești propriul domeniu pentru a crea un nou cont pentru consola de administrare, trebuie să parcurgi procesul de verificare a domeniului după înscriere. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Reține alegerea mea</translation> <translation id="9055636786322918818">Aplică criptarea RC4. Folosirea acestei opțiuni îți mărește riscul, deoarece suitele de codificare RC4 sunt nesecurizate.</translation> <translation id="9056034633062863292">Actualizarea Chromeboxului</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Setează ca prestabilit</translation> <translation id="9219103736887031265">Imagini</translation> <translation id="9220525904950070496">Eliminați contul</translation> +<translation id="9220820413868316583">Ridică, apoi încearcă din nou.</translation> <translation id="923467487918828349">Afișează-le pe toate</translation> <translation id="928985544179707652">Extensii:</translation> <translation id="930268624053534560">Marcaje temporale detaliate</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 0714c04..b2a8f78 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Нет сетей</translation> <translation id="1056898198331236512">Внимание</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Регистрация отпечатка пальца</translation> <translation id="1061904396131502319">Скоро перерыв</translation> <translation id="1062407476771304334">Заменить</translation> <translation id="1067048845568873861">Создано</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamond</translation> <translation id="1114335938027186412">Компьютер оснащен устройством безопасности модуля доверительной платформы (TPM), используемым для реализации многих критических функций безопасности в Chrome OS. Более подробную информацию можно получить в Справочном центре Chromebook: https://support.google.com/chromebook/?p=tpm.</translation> <translation id="1114525161406758033">Перейти в спящий режим, когда крышка закрыта</translation> +<translation id="1115324527092594775">Настройка режима Better Together</translation> <translation id="1116694919640316211">О программе</translation> <translation id="1116779635164066733">Значение этого параметра задано расширением "<ph name="NAME" />".</translation> <translation id="111844081046043029">Вы действительно хотите покинуть эту страницу?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Текущее время</translation> <translation id="1157102636231978136">Данные о работе в браузере и ваших действиях, связанных с аккаунтом Google</translation> <translation id="1161575384898972166">Чтобы экспортировать сертификат клиента, войдите в <ph name="TOKEN_NAME" />.</translation> +<translation id="1161699061380012396">Способ ввода в Chrome OS</translation> <translation id="1163931534039071049">&Просмотр кода фрейма</translation> <translation id="1164674268730883318">Отключить Smart Lock для устройства <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Введите PUK-код</translation> @@ -1003,7 +1006,6 @@ <translation id="2508428939232952663">Аккаунт Google Play</translation> <translation id="2509495747794740764">Укажите значение от 10 до 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Заполнять формы автоматически</translation> <translation id="2513403576141822879">Остальные настройки конфиденциальности, безопасности и сбора данных вы можете найти в разделе <ph name="BEGIN_LINK" />Синхронизация сервисов Google<ph name="END_LINK" />.</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Искать</translation> @@ -1358,6 +1360,7 @@ <translation id="3020990233660977256">Серийный номер: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">Просмотр кода фрейма</translation> <translation id="3022978424994383087">Повторите ещё раз.</translation> +<translation id="3023464535986383522">Озвучивание при нажатии</translation> <translation id="3024374909719388945">Использовать 24-часовой формат</translation> <translation id="302781076327338683">Обновить, не используя кеш</translation> <translation id="3031417829280473749">Секретный агент</translation> @@ -1754,6 +1757,7 @@ <translation id="363903084947548957">Следующий способ ввода</translation> <translation id="3640214691812501263">Добавить расширение "<ph name="EXTENSION_NAME" />" для пользователя <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Ширина</translation> +<translation id="3645372836428131288">Немного перемещайте палец, чтобы отсканировать его полностью.</translation> <translation id="3648348069317717750">Обнаружено устройство "<ph name="USB_DEVICE_NAME" />"</translation> <translation id="3649138363871392317">Снимок сделан.</translation> <translation id="3650952250015018111">Разрешить приложению "<ph name="APP_NAME" />" доступ к этому устройству:</translation> @@ -1949,7 +1953,6 @@ <translation id="3920504717067627103">Политики сертификатов</translation> <translation id="392089482157167418">Включить ChromeVox (голосовое сопровождение)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Не обнаружено недавно сохраненных журналов WebRTC.</translation> <translation id="3925573269917483990">Камера:</translation> <translation id="3925842537050977900">Открепить от панели запуска</translation> <translation id="3926002189479431949">Smart Lock – телефон заменен</translation> @@ -1998,7 +2001,7 @@ <translation id="3983586614702900908">устройства от неизвестного поставщика</translation> <translation id="3984159763196946143">Не удалось запустить демонстрационный режим</translation> <translation id="3985261842049607969">Резервное копирование на Google Диск. Позволяет в любой момент восстановить данные (в том числе данные приложений) или загрузить их на новое устройство. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation> -<translation id="3987348946546879621">Показана версия для предпросмотра</translation> +<translation id="3987348946546879621">Версия для предпросмотра</translation> <translation id="3987938432087324095">Извините, не слышно.</translation> <translation id="3988996860813292272">Выбор часового пояса</translation> <translation id="399179161741278232">Выполнен импорт</translation> @@ -2225,6 +2228,7 @@ <translation id="438503109373656455">Скачки</translation> <translation id="4387004326333427325">Сертификат аутентификации отклонен удаленно</translation> <translation id="4389091756366370506">Пользователь <ph name="VALUE" /></translation> +<translation id="439266289085815679">Конфигурацию Bluetooth контролирует пользователь <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Отключить</translation> <translation id="4400367121200150367">Здесь появятся сайты, которые никогда не сохраняют пароли</translation> <translation id="4400632832271803360">Чтобы сменить функции клавиш верхнего ряда, удерживайте клавишу Launcher</translation> @@ -2298,6 +2302,7 @@ <translation id="4522600456902129422">Оставить этому сайту доступ к буферу обмена</translation> <translation id="4530494379350999373">Происхождение</translation> <translation id="4533985347672295764">Процессорное время</translation> +<translation id="4534661889221639075">Повторите попытку.</translation> <translation id="4535127706710932914">Профиль по умолчанию</translation> <translation id="4538417792467843292">Удалить слово</translation> <translation id="4538684596480161368">Всегда блокировать плагины вне тестовой среды на сайте <ph name="HOST" /></translation> @@ -2527,6 +2532,7 @@ <translation id="4880520557730313061">Автокоррекция</translation> <translation id="4880827082731008257">Искать в истории</translation> <translation id="4881695831933465202">Открыть</translation> +<translation id="4882312758060467256">У расширения есть доступ к этому сайту</translation> <translation id="4882473678324857464">Активировать закладки</translation> <translation id="4882831918239250449">Использование данных о посещенных страницах для персонализации Поиска, рекламы и т. д.</translation> <translation id="4883178195103750615">Экспортировать закладки в файл HTML...</translation> @@ -2592,6 +2598,7 @@ <translation id="4969785127455456148">Альбом</translation> <translation id="4971412780836297815">Открыть по завершении</translation> <translation id="4972129977812092092">Настройка принтера</translation> +<translation id="4972164225939028131">Неправильный пароль</translation> <translation id="497287958838527945">Кредитные карты и адреса из Google Pay</translation> <translation id="4973307593867026061">Добавить принтеры</translation> <translation id="4973523518332075481">Слишком длинное название. Максимальное количество символов: <ph name="MAX_LENGTH" />.</translation> @@ -3019,6 +3026,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Загрузка...</translation> <translation id="5592595402373377407">Недостаточно данных.</translation> +<translation id="5593357315997824387">Синхронизировать мои файлы</translation> <translation id="5595152862129936745">Слишком далеко</translation> <translation id="5595485650161345191">Изменить адрес</translation> <translation id="5596627076506792578">Ещё</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">К сожалению, в настройках компьютера указан недействительный аппаратный код. Chrome OS не сможет устанавливать обновления для системы безопасности, и ваш компьютер <ph name="BEGIN_BOLD" />может подвергаться атакам вредоносных сайтов<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Не удалось открыть профиль. Попробуйте выйти из аккаунта и войти снова.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">остановить таймер</translation> <translation id="667517062706956822">Вы хотите, чтобы Google сделал перевод страницы: <ph name="SOURCE_LANGUAGE" /> >> <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Подключено дополнительное устройство</translation> <translation id="6678717876183468697">URL запроса</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">Сохранить на Панели инструментов</translation> <translation id="7187428571767585875">Записи реестра, которые будут удалены или изменены:</translation> <translation id="7189234443051076392">Убедитесь, что на вашем устройстве достаточно свободного места.</translation> +<translation id="7189965711416741966">Отпечаток добавлен.</translation> <translation id="7191159667348037">Неизвестный принтер (USB)</translation> <translation id="7191454237977785534">Сохранить файл как</translation> <translation id="7193374945610105795">Для сайта <ph name="ORIGIN" /> нет сохраненных паролей</translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Новое окно</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> отображается в полноэкранном режиме.</translation> <translation id="7340650977506865820">Сайт открывает доступ к вашему экрану</translation> +<translation id="7341834142292923918">Расширение запрашивает доступ к этому сайту</translation> <translation id="7345706641791090287">Подтвердите пароль</translation> <translation id="7346909386216857016">ОК</translation> <translation id="7347751611463936647">Чтобы использовать это расширение, введите "<ph name="EXTENSION_KEYWORD" />", нажмите клавишу табуляции, а затем введите команду или поисковый запрос.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Для определения местоположения мы используем различные источники, например сети Wi-Fi, мобильные сети или датчики. Эта функция работает, когда на устройстве включен доступ к геоданным.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Отключить геолокацию можно в настройках доступа к данным о местоположении. Там же вы можете запретить использование сетей Wi‑Fi, сотовой связи и датчиков для уточнения местоположения.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Придумайте пароль –</translation> -<translation id="7518150891539970662">Журналы WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Создать</translation> <translation id="7529411698175791732">Проверьте подключение к Интернету. Если оно установлено, попробуйте выйти из аккаунта и войти снова.</translation> @@ -4747,6 +4757,7 @@ <translation id="8214962590150211830">Удалить пользователя</translation> <translation id="8217399928341212914">Всегда блокировать автоскачивание нескольких файлов</translation> <translation id="8223479393428528563">Чтобы работать с этими файлами в офлайн-режиме, подключитесь к Интернету, нажмите правой кнопкой мыши на каждый документ и выберите вариант "<ph name="OFFLINE_CHECKBOX_NAME" />".</translation> +<translation id="8225753906568652947">Использовать бонусы</translation> <translation id="8226222018808695353">Запрещено</translation> <translation id="8226619461731305576">Очередь</translation> <translation id="8226742006292257240">Этот модуль случайным образом сгенерировал для вашего компьютера следующий пароль:</translation> @@ -4793,6 +4804,7 @@ <translation id="8286036467436129157">Вход</translation> <translation id="8286963743045814739">В режиме инкогнито можно просматривать сайты анонимно</translation> <translation id="82871696630048499">Из-за нехватки памяти произошла перезагрузка веб-страницы.</translation> +<translation id="8288032458496410887">Удалить приложение "<ph name="APP" />"...</translation> <translation id="8291967909914612644">Страна провайдера</translation> <translation id="8294431847097064396">Источник</translation> <translation id="8297006494302853456">Слабый</translation> @@ -4854,6 +4866,7 @@ <translation id="8413385045638830869">Всегда спрашивать (рекомендуется)</translation> <translation id="8418445294933751433">&Показать как вкладку</translation> <translation id="8419098111404128271">Результаты поиска по запросу "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Настройка устройства <ph name="DEVICE_TYPE" /></translation> <translation id="8420060421540670057">Показать файлы в службе Документов Google</translation> <translation id="8424039430705546751">вниз</translation> <translation id="8425213833346101688">Изменить</translation> @@ -4980,6 +4993,7 @@ <translation id="8620765578342452535">Настройка сетевых подключений</translation> <translation id="8624205858755890468">Разрешить Ассистенту показывать похожую информацию, приложения и действия.</translation> <translation id="862542460444371744">Расширения</translation> +<translation id="8626219642120025691">Таймер остановлен</translation> <translation id="8627151598708688654">Выбор источника</translation> <translation id="862727964348362408">Приостановлено</translation> <translation id="862750493060684461">Кеш CSS</translation> @@ -5100,6 +5114,7 @@ <translation id="8775404590947523323">Изменения сохраняются автоматически.<ph name="BREAKS" />Чтобы оставить копию исходного изображения, снимите флажок "Перезаписать оригинал".</translation> <translation id="8777628254805677039">пароль суперпользователя</translation> <translation id="8780443667474968681">Голосовой поиск отключен.</translation> +<translation id="878068003854005405">Положите палец на сканер.</translation> <translation id="878069093594050299">Этот сертификат был проверен на возможность использования в следующих целях:</translation> <translation id="8781980678064919987">Завершать работу при закрытии крышки</translation> <translation id="8782565991310229362">Запуск киоск-приложения был отменен.</translation> @@ -5277,6 +5292,7 @@ <translation id="9050666287014529139">Кодовая фраза</translation> <translation id="9052208328806230490">Вы зарегистрировали принтеры в <ph name="CLOUD_PRINT_NAME" /> с использованием аккаунта <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Продолжать блокировать</translation> +<translation id="9053091947372579468">На этом устройстве есть лицензия Chrome, но ваше имя пользователя не связано с консолью администратора. Чтобы продолжить, создайте в ней аккаунт. Если для этого вы используете свой домен, после регистрации его необходимо подтвердить. Подобную информацию можно найти по ссылке https://g.co/ChromeEnterpriseAccount.</translation> <translation id="9053893665344928494">Запомнить</translation> <translation id="9055636786322918818">Использовать шифрование по алгоритму RC4. Этот вариант небезопасен, так как потоковый шифр RC4 ненадежен.</translation> <translation id="9056034633062863292">Обновление Chromebox</translation> @@ -5380,6 +5396,7 @@ <translation id="9218430445555521422">Сделать браузером по умолчанию</translation> <translation id="9219103736887031265">Картинки</translation> <translation id="9220525904950070496">Удалить аккаунт</translation> +<translation id="9220820413868316583">Поднимите палец и попробуйте ещё раз.</translation> <translation id="923467487918828349">Показать все</translation> <translation id="928985544179707652">Расширения</translation> <translation id="930268624053534560">Подробные временные метки</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 358d3c1..be3d3c9cf 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Žiadne siete</translation> <translation id="1056898198331236512">Upozornenie</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Registrácia odtlačku prsta</translation> <translation id="1061904396131502319">Už je takmer čas na prestávku</translation> <translation id="1062407476771304334">Nahradiť</translation> <translation id="1067048845568873861">Vytvorené</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Káro</translation> <translation id="1114335938027186412">Váš počítač obsahuje bezpečnostné zariadenie Trusted Platform Module (TPM), ktoré sa v systéme Chrome OS používa na implementáciu mnohých dôležitých bezpečnostných funkcií. Ďalšie informácie nájdete v Centre pomoci pre Chromebooky: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Pri zavretí krytu aktivovať režim spánku</translation> +<translation id="1115324527092594775">Nastavenie funkcie Spoločne ešte lepšie</translation> <translation id="1116694919640316211">Informácie</translation> <translation id="1116779635164066733">Toto nastavenie je vynútené rozšírením <ph name="NAME" />.</translation> <translation id="111844081046043029">Naozaj chcete odísť z tejto stránky?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Aktuálny čas</translation> <translation id="1157102636231978136">Dáta prehliadania a aktivita sa synchronizujú do vášho účtu Google</translation> <translation id="1161575384898972166">Ak chcete exportovať certifikát klienta, prihláste sa do <ph name="TOKEN_NAME" />.</translation> +<translation id="1161699061380012396">Metóda vstupu Chrome OS</translation> <translation id="1163931534039071049">&Zobraziť zdrojový kód rámu</translation> <translation id="1164674268730883318">Vypnúť v zariadení <ph name="DEVICE_TYPE" /> funkciu Smart Lock?</translation> <translation id="1164899421101904659">Zadanie kľúča na odomknutie kódu PIN</translation> @@ -1005,7 +1008,6 @@ <translation id="2508428939232952663">Účet Obchodu Google Play</translation> <translation id="2509495747794740764">Hodnota mierky musí byť v rozsahu od 10 do 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Automaticky vypĺňať formuláre</translation> <translation id="2513403576141822879">Ďalšie nastavenia týkajúce sa ochrany súkromia, zabezpečenia a zhromažďovania dát nájdete v časti <ph name="BEGIN_LINK" />Synchronizácia a služby Googlu<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Vyhľadať</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Sériové číslo: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Zobraziť zdrojový kód rámca</translation> <translation id="3022978424994383087">Nebolo rozumieť.</translation> +<translation id="3023464535986383522">Počúvanie vybraného textu</translation> <translation id="3024374909719388945">Použiť 24-hodinový režim hodín</translation> <translation id="302781076327338683">Znova načítať vyrovnávaciu pamäť na obídenie</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Nasledujúca metóda vstupu</translation> <translation id="3640214691812501263">Pridať rozšírenie <ph name="EXTENSION_NAME" /> pre používateľa <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Šírka</translation> +<translation id="3645372836428131288">Zľahka pohýbte, aby sa nasnímala ďalšia časť odtlačku.</translation> <translation id="3648348069317717750">Rozpoznané zariadenie: <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Fotografia bola nasnímaná</translation> <translation id="3650952250015018111">Povoľte aplikácii "<ph name="APP_NAME" />" prístup do zariadenia:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Certifikačné politiky</translation> <translation id="392089482157167418">Povoliť funkciu ChromeVox (hlasovú spätnú väzbu)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nemáte žiadne nedávno zaznamenané denníky WebRTC.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Odopnúť z poličky</translation> <translation id="3926002189479431949">Zmenil sa telefón združený s funkciou Smart Lock</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Saratoga</translation> <translation id="4387004326333427325">Certifikát na overenie totožnosti bol zamietnutý na diaľku</translation> <translation id="4389091756366370506">Používateľ <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfiguráciu rozhrania Bluetooth spravuje <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Zakázať</translation> <translation id="4400367121200150367">Tu sa zobrazia weby, ktoré nikdy neukladajú heslo</translation> <translation id="4400632832271803360">Pridržaním klávesa spúšťača prepnete správanie klávesov v hornom riadku</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Tomuto webu aj naďalej povoľovať zobrazenie schránky</translation> <translation id="4530494379350999373">Pôvod</translation> <translation id="4533985347672295764">Čas využitia procesora</translation> +<translation id="4534661889221639075">Skúste to znova.</translation> <translation id="4535127706710932914">Predvolený profil</translation> <translation id="4538417792467843292">Odstrániť slovo</translation> <translation id="4538684596480161368">Na stránkach <ph name="HOST" /> vždy blokovať doplnky, ktoré nie sú v karanténe</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Automatická oprava</translation> <translation id="4880827082731008257">Hľadať v histórii</translation> <translation id="4881695831933465202">Otvoriť</translation> +<translation id="4882312758060467256">Má prístup k tomuto webu</translation> <translation id="4882473678324857464">Prejsť do záložiek</translation> <translation id="4882831918239250449">Ovládajte, ako sa pomocou histórie prehliadania prispôsobuje Vyhľadávanie, reklamy a ďalší obsah</translation> <translation id="4883178195103750615">Exportovať záložky do súboru HTML ...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Otvoriť po stiahnutí</translation> <translation id="4972129977812092092">Úprava tlačiarne</translation> +<translation id="4972164225939028131">Nesprávne heslo</translation> <translation id="497287958838527945">Kreditné karty a adresy pomocou služby Google Pay</translation> <translation id="4973307593867026061">Pridať tlačiarne</translation> <translation id="4973523518332075481">Použite názov s maximálne <ph name="MAX_LENGTH" /> znakmi</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Načítavajú sa aplikácie...</translation> <translation id="5592595402373377407">Zatiaľ nie je k dispozícii dostatok údajov.</translation> +<translation id="5593357315997824387">Synchronizovať moje súbory</translation> <translation id="5595152862129936745">Veľmi ďaleko</translation> <translation id="5595485650161345191">Upraviť adresu</translation> <translation id="5596627076506792578">Ďalšie možnosti</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Váš počítač je žiaľ nakonfigurovaný pomocou poškodeného ID hardvéru. Systému Chrome OS to zabraňuje získať aktualizácie s najnovšími opravami zabezpečenia a váš počítač <ph name="BEGIN_BOLD" />môže byť zraniteľný voči škodlivým útokom<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Pri pokuse o otvorenie profilu sa vyskytla chyba. Odhláste sa a potom sa znova prihláste.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">zastaviť časovač</translation> <translation id="667517062706956822">Chcete, aby Google preložil túto stránku z jazyka <ph name="SOURCE_LANGUAGE" /> do jazyka <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Bolo pripojené ukazovacie zariadenie</translation> <translation id="6678717876183468697">Webová adresa dopytu</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Ponechať na paneli s nástrojmi</translation> <translation id="7187428571767585875">Záznamy databázy Registry, ktoré sa majú odstrániť alebo zmeniť:</translation> <translation id="7189234443051076392">Uistite sa, či máte v zariadení dosť miesta</translation> +<translation id="7189965711416741966">Odtlačok prsta bol pridaný.</translation> <translation id="7191159667348037">Neznáma tlačiareň (USB)</translation> <translation id="7191454237977785534">Uložiť súbor ako</translation> <translation id="7193374945610105795">Žiadne uložené heslá pre <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Nové okno</translation> <translation id="7340431621085453413">Stránka <ph name="FULLSCREEN_ORIGIN" /> sa teraz zobrazuje na celú obrazovku.</translation> <translation id="7340650977506865820">Web zdieľa vašu obrazovku</translation> +<translation id="7341834142292923918">Požaduje prístup k tomuto webu</translation> <translation id="7345706641791090287">Potvrdenie hesla</translation> <translation id="7346909386216857016">Ok, rozumiem</translation> <translation id="7347751611463936647">Ak chcete použiť toto rozšírenie, zadajte text „<ph name="EXTENSION_KEYWORD" />“, stlačte kláves Tab a začnite písať svoj príkaz alebo vyhľadávaný výraz.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Služba určovania polohy od Googlu používa zdroje, ako sú siete Wi-Fi a mobilné siete, na presnejšie odhadovanie polohy vášho zariadenia .<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Túto službu aktivujete v zariadení zapnutím nastavenia Poloha. V nastaveniach polohy môžete tiež vypnúť určovanie polohy pomocou siete Wi‑Fi, mobilnej siete a senzorov.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Vytvorte heslo –</translation> -<translation id="7518150891539970662">Denníky WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Vytvoriť</translation> <translation id="7529411698175791732">Skontrolujte internetové pripojenie. Ak problém pretrváva, skúste sa odhlásiť a znovu prihlásiť.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Odstrániť túto osobu</translation> <translation id="8217399928341212914">Naďalej blokovať automatické sťahovanie viacerých súborov súčasne</translation> <translation id="8223479393428528563">Ak chcete tieto súbory uložiť na používanie offline, prejdite online, kliknite na súbory pravým tlačidlom a vyberte možnosť <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Uplatniť ponuky</translation> <translation id="8226222018808695353">Zakázané</translation> <translation id="8226619461731305576">Poradie</translation> <translation id="8226742006292257240">Nižšie je uvedené náhodne vygenerované heslo modulu TPM, ktoré bolo priradené k vášmu počítaču:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Prihlásenie</translation> <translation id="8286963743045814739">Prehliadať v súkromí môžete v okne inkognito</translation> <translation id="82871696630048499">Webová stránka sa načítala znova, pretože nebolo k dispozícii dosť pamäte.</translation> +<translation id="8288032458496410887">Odinštalovať aplikáciu <ph name="APP" />…</translation> <translation id="8291967909914612644">Krajina poskytovateľa domácej siete</translation> <translation id="8294431847097064396">Zdroj</translation> <translation id="8297006494302853456">Slabé</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Najprv sa opýtať (odporúčané)</translation> <translation id="8418445294933751433">&Zobraziť ako kartu</translation> <translation id="8419098111404128271">Výsledky vyhľadávania pre výraz „<ph name="SEARCH_TEXT" />“</translation> +<translation id="8419368276599091549">Vitajte v zariadení <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Zobraziť súbory služby Dokumenty Google</translation> <translation id="8424039430705546751">dole</translation> <translation id="8425213833346101688">Zmeniť</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Konfigurovať sieťové pripojenia</translation> <translation id="8624205858755890468">Umožňuje Asistentovi zobraziť vám súvisiace informácie, aplikácie a akcie.</translation> <translation id="862542460444371744">&Rozšírenia</translation> +<translation id="8626219642120025691">Časovač skončil</translation> <translation id="8627151598708688654">Výber zdroja</translation> <translation id="862727964348362408">Pozastavené</translation> <translation id="862750493060684461">Vyrovnávacia pamäť CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Úpravy sa ukladajú automaticky.<ph name="BREAKS" />Ak chcete zachovať kópiu pôvodného obrázka, zrušte začiarknutie políčka Prepísať originál</translation> <translation id="8777628254805677039">heslo používateľa typu root</translation> <translation id="8780443667474968681">Hlasové vyhľadávanie bolo vypnuté</translation> +<translation id="878068003854005405">Poďme na to. Položte prst na senzor.</translation> <translation id="878069093594050299">Tento certifikát bol overený pre nasledujúce typy použitia:</translation> <translation id="8781980678064919987">Pri zavretí krytu vypnúť</translation> <translation id="8782565991310229362">Spustenie aplikácie pre režim kiosku sa zrušilo.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Prístupová fráza</translation> <translation id="9052208328806230490">Tlačiarne ste zaregistrovali v službe <ph name="CLOUD_PRINT_NAME" /> prostredníctvom účtu <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Pokračovať v blokovaní</translation> +<translation id="9053091947372579468">Vaše zariadenie má licenciu Chrome, ale k vášmu používateľskému menu nie je priradená správcovská konzola. Ak chcete pokračovať v registrácii, vytvorte si účet správcovskej konzoly. Poznámka: Ak si vytvoríte nový účet správcovskej konzoly pomocou vlastnej domény, musíte po registrácii dokončiť aj overenie domény. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Zapamätať si výber</translation> <translation id="9055636786322918818">Vynúťte šifrovanie RC4. Šifry RC4 sú nezabezpečené, takže použitím tejto možnosti zvýšite riziko.</translation> <translation id="9056034633062863292">Aktualizácia zariadenia Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Nastaviť ako predvolený</translation> <translation id="9219103736887031265">Obrázky</translation> <translation id="9220525904950070496">Odstrániť účet</translation> +<translation id="9220820413868316583">Zodvihnite a zopakujte.</translation> <translation id="923467487918828349">Zobraziť všetko</translation> <translation id="928985544179707652">Rozšírenia:</translation> <translation id="930268624053534560">Podrobné časové pečiatky</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 6337746..1f71047 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -56,7 +56,7 @@ <translation id="1076698951459398590">Omogoči temo</translation> <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1079766198702302550">Vedno prepreči dostop do kamere</translation> -<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> želi vaše nastavitve za Chrome ponastaviti na izvirne privzete nastavitve. S tem bodo ponastavljeni domača stran, stran »Nov zavihek« in iskalnik ter onemogočene razširitve in odpeti vsi zavihki. S tem bodo tudi izbrisani začasni in predpomnjeni podatki, kot so piškotki, vsebina in podatki spletnih mest.</translation> +<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> želi vaše nastavitve za Chrome ponastaviti na izvirne privzete nastavitve. S tem bodo ponastavljeni domača stran, nov zavihek s povezavami in iskalnik ter onemogočene razširitve in odpeti vsi zavihki. S tem bodo tudi izbrisani začasni in predpomnjeni podatki, kot so piškotki, vsebina in podatki spletnih mest.</translation> <translation id="1082725763867769612">Datoteke brez povezave</translation> <translation id="1084824384139382525">Kopiraj naslov pove&zave</translation> <translation id="1085697365578766383">Navideznega računalnika ni bilo mogoče zagnati. Poskusite znova.</translation> @@ -300,7 +300,7 @@ <translation id="1430915738399379752">Natisni</translation> <translation id="1432581352905426595">Upravljanje iskalnikov</translation> <translation id="1433811987160647649">Vprašaj pred dostopom</translation> -<translation id="1434696352799406980">S tem bodo ponastavljeni začetna stran, stran »Nov zavihek«, iskalnik in pripeti zavihki. Prav tako bodo onemogočene vse razširitve in izbrisani bodo začasni podatki, kot so piškotki. Zaznamki, zgodovina in shranjena gesla ne bodo izbrisani.</translation> +<translation id="1434696352799406980">S tem bodo ponastavljeni začetna stran, nov zavihek s povezavami, iskalnik in pripeti zavihki. Prav tako bodo onemogočene vse razširitve in izbrisani bodo začasni podatki, kot so piškotki. Zaznamki, zgodovina in shranjena gesla ne bodo izbrisani.</translation> <translation id="1434886155212424586">Domača stran je nov zavihek s povezavami</translation> <translation id="1436671784520050284">Nadaljuj nastavitev</translation> <translation id="1436784010935106834">Odstranjeno</translation> @@ -542,7 +542,7 @@ <translation id="177694132944350798">Podatki so bili šifrirani z vašim geslom za Google <ph name="TIME" />. Vnesite ga, če želite začeti sinhronizacijo.</translation> <translation id="1779652936965200207">Geslo vnesite v napravi »<ph name="DEVICE_NAME" />«:</translation> <translation id="1779766957982586368">Zapre okno</translation> -<translation id="1781502536226964113">Odpri stran »Nov zavihek«</translation> +<translation id="1781502536226964113">Odpri nov zavihek s povezavami</translation> <translation id="1782196717298160133">Iskanje telefona</translation> <translation id="1782530111891678861">Sprememba načina HUD za dotik</translation> <translation id="1784849162047402014">V napravi primanjkuje prostora na disku</translation> @@ -1007,7 +1007,6 @@ <translation id="2508428939232952663">Račun za Trgovino Google Play</translation> <translation id="2509495747794740764">Vrednost za prilagajanje velikosti mora biti število med 10 in 200.</translation> <translation id="2509566264613697683">8 x</translation> -<translation id="2512222046227390255">Samodejno izpolnjevanje obrazcev</translation> <translation id="2513403576141822879">Če vas zanima več nastavitev, povezanih z zasebnostjo, varnostjo in zbiranjem podatkov, si oglejte razdelek <ph name="BEGIN_LINK" />Sinhronizacija in Googlove storitve<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Išči</translation> @@ -1570,7 +1569,7 @@ <translation id="3368922792935385530">Povezano</translation> <translation id="3369624026883419694">Razrešujem gostitelja ...</translation> <translation id="337286756654493126">Branje map, ki jih odprete v aplikaciji</translation> -<translation id="3378503599595235699">Ohrani lokalne podatke do zaprtja brskalnika</translation> +<translation id="3378503599595235699">Ohrani lokalne podatke le do zaprtja brskalnika</translation> <translation id="3378572629723696641">Ta razširitev je morda poškodovana.</translation> <translation id="3378630551672149129">Prijavite se, pritisnite tipko TAB za uporabo elementov za vnos</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> bo nameščen.</translation> @@ -1946,14 +1945,13 @@ <translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> in še en jezik</translation> <translation id="3909791450649380159">Izrež&i</translation> <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (ime, ki se uporablja v tej napravi)</translation> -<translation id="3911824782900911339">Stran »Nov zavihek«</translation> +<translation id="3911824782900911339">Nov zavihek s povezavami</translation> <translation id="3915280005470252504">Glasovno iskanje</translation> <translation id="3916445069167113093">Ta vrsta datoteke lahko poškoduje vaš računalnik. Ali želite vseeno obdržati datoteko <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Sporoči podrobnosti Googlu</translation> <translation id="3920504717067627103">Pravilniki potrdila</translation> <translation id="392089482157167418">Omogoči ChromeVox (izgovarjava povratnih informacij)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Nimate nedavno zajetih dnevnikov za WebRTC.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Odpni s police</translation> <translation id="3926002189479431949">Telefon za Smart Lock spremenjen</translation> @@ -3022,7 +3020,7 @@ <translation id="5582839680698949063">Glavni meni</translation> <translation id="5583640892426849032">Vračalka</translation> <translation id="5585118885427931890">Mape z zaznamkom ni bilo mogoče ustvariti.</translation> -<translation id="558563010977877295">Odpiranje ustrezne strani ali več strani</translation> +<translation id="558563010977877295">Odpri ustrezno stran ali več strani</translation> <translation id="5585912436068747822">Formatiranje ni uspelo</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Nalaganje aplikacij ...</translation> @@ -4281,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Googlova lokacijska storitev si pri določanju lokacije vaše naprave pomaga z viri, kot so omrežja Wi-Fi, mobilna omrežja in tipala. Ta storitev je aktivna, ko je nastavitev lokacije v napravi vklopljena.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Zaznavanje lokacije lahko izklopite tako, da v napravi izklopite glavno lokacijsko nastavitev. V lokacijskih nastavitvah lahko izklopite tudi uporabo omrežij Wi‑Fi, mobilnih omrežij in tipal za zaznavanje lokacije.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Ustvarjanje gesla –</translation> -<translation id="7518150891539970662">Preneseni dnevniki za WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Ustvari</translation> <translation id="7529411698175791732">Preverite internetno povezavo. Če težave ne odpravite, se poskusite odjaviti in znova prijaviti.</translation> @@ -4516,7 +4513,7 @@ <translation id="7853747251428735">Več &orodij</translation> <translation id="7856006446339184955">Pošiljanje podatkov o sistemu. Ta naprava trenutno samodejno pošilja diagnostične podatke ter podatke o uporabi naprav in aplikacij Googlu. To <ph name="BEGIN_LINK1" />nastavitev<ph name="END_LINK1" /> je uveljavil lastnik. Če ste vklopili dodatno dejavnost v spletu in aplikacijah, bodo ti podatki shranjeni v računu, tako da jih lahko upravljate v Moji dejavnosti. <ph name="BEGIN_LINK2" />Več o tem<ph name="END_LINK2" /></translation> <translation id="7857117644404132472">Dodaj izjemo</translation> -<translation id="7857949311770343000">Ste pričakovali takšno stran »Nov zavihek«?</translation> +<translation id="7857949311770343000">Ste pričakovali takšen nov zavihek s povezavami?</translation> <translation id="786073089922909430">Storitev: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="7861215335140947162">&Prenosi</translation> <translation id="7864662577698025113">Dodaj novo storitev</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 61adf99c..7a57dce48 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Нема мрежа</translation> <translation id="1056898198331236512">Упозорење</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Региструје се отисак прста</translation> <translation id="1061904396131502319">Скоро је време за паузу</translation> <translation id="1062407476771304334">Замени</translation> <translation id="1067048845568873861">Направљено</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Дијамант</translation> <translation id="1114335938027186412">Рачунар садржи безбедносни уређај са модулом поуздане платформе (TPM), који се користи за примену многих безбедносних функција од суштинске важности у Chrome ОС-у. Посетите Центар за помоћ за Chromebook да бисте сазнали више: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Пређи у стање спавања кад се поклопац затвори</translation> +<translation id="1115324527092594775">Подесите Better Together</translation> <translation id="1116694919640316211">Основни подаци</translation> <translation id="1116779635164066733">Додатак „<ph name="NAME" />“ примењује ово подешавање.</translation> <translation id="111844081046043029">Желите ли стварно да затворите ову страницу?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Тренутно време</translation> <translation id="1157102636231978136">Подаци и активност прегледања, синхронизовани на Google налог</translation> <translation id="1161575384898972166">Пријавите се на <ph name="TOKEN_NAME" /> да бисте извезли сертификат клијента.</translation> +<translation id="1161699061380012396">Метод уноса за Chrome ОС</translation> <translation id="1163931534039071049">&Прикажи извор оквира</translation> <translation id="1164674268730883318">Желите ли да искључите Smart Lock за <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Унесите шифру за откључавање PIN-а</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Налог Google Play продавнице</translation> <translation id="2509495747794740764">Износ промене величине мора да буде број између 10 и 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Аутоматски попуњавајте обрасце</translation> <translation id="2513403576141822879">Више подешавања у вези са приватношћу, безбедношћу и прикупљањем података потражите у одељку <ph name="BEGIN_LINK" />Синхронизација и Google услуге<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Скенирај</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">Серијски број: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Прикажи извор оквира</translation> <translation id="3022978424994383087">Нисмо вас разумели.</translation> +<translation id="3023464535986383522">Изаберите за говор</translation> <translation id="3024374909719388945">Користи 24-часовни сат</translation> <translation id="302781076327338683">Поновно учитавање уз заобилажење кеша</translation> <translation id="3031417829280473749">Агент Икс</translation> @@ -1749,6 +1752,7 @@ <translation id="363903084947548957">Следећи метод уноса</translation> <translation id="3640214691812501263">Додај „<ph name="EXTENSION_NAME" />“ за корисника <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Ширина</translation> +<translation id="3645372836428131288">Мало померите да бисте снимили други део отиска прста.</translation> <translation id="3648348069317717750">Уређај <ph name="USB_DEVICE_NAME" /> је откривен</translation> <translation id="3649138363871392317">Слика је снимљена</translation> <translation id="3650952250015018111">Дозволите да „<ph name="APP_NAME" />“ приступа:</translation> @@ -1944,7 +1948,6 @@ <translation id="3920504717067627103">Смернице сертификата</translation> <translation id="392089482157167418">Омогући ChromeVox (говорне повратне информације)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Нисте недавно снимили ниједну WebRTC евиденцију.</translation> <translation id="3925573269917483990">Камера:</translation> <translation id="3925842537050977900">Откачи са полице</translation> <translation id="3926002189479431949">Телефон за Smart Lock је промењен</translation> @@ -2220,6 +2223,7 @@ <translation id="438503109373656455">Саратога</translation> <translation id="4387004326333427325">Сертификат за потврду аутентичности је одбијен даљински</translation> <translation id="4389091756366370506">Корисник <ph name="VALUE" /></translation> +<translation id="439266289085815679">Конфигурацију Bluetooth-а контролише <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Онемогући</translation> <translation id="4400367121200150367">Сајтови који никада не чувају лозинке ће се појавити овде</translation> <translation id="4400632832271803360">Задржите тастер за Покретач да бисте променили понашање тастера у горњем реду</translation> @@ -2293,6 +2297,7 @@ <translation id="4522600456902129422">Настави да дозвољаваш овом сајту да види привремену меморију</translation> <translation id="4530494379350999373">Извор</translation> <translation id="4533985347672295764">CPU време</translation> +<translation id="4534661889221639075">Пробајте поново.</translation> <translation id="4535127706710932914">Подразумевани профил</translation> <translation id="4538417792467843292">Брисање речи</translation> <translation id="4538684596480161368">Увек блокирај додатне компоненте које су изван заштићеног окружења на <ph name="HOST" /></translation> @@ -2522,6 +2527,7 @@ <translation id="4880520557730313061">Аутоматски исправи</translation> <translation id="4880827082731008257">Претражи историју</translation> <translation id="4881695831933465202">Отвори</translation> +<translation id="4882312758060467256">Може да приступа овом сајту</translation> <translation id="4882473678324857464">Фокус на обележивачима</translation> <translation id="4882831918239250449">Контролишите начин на који се историја прегледања користи за персонализацију Претраге, огласа и других услуга</translation> <translation id="4883178195103750615">Извоз обележивача у HTML датотеку...</translation> @@ -2587,6 +2593,7 @@ <translation id="4969785127455456148">Албум</translation> <translation id="4971412780836297815">Отвори када буде довршено</translation> <translation id="4972129977812092092">Измените штампач</translation> +<translation id="4972164225939028131">Погрешна лозинка</translation> <translation id="497287958838527945">Кредитне картице и адресе из Google Pay-а.</translation> <translation id="4973307593867026061">Додај штампаче</translation> <translation id="4973523518332075481">Користите назив чији је максимални број знакова <ph name="MAX_LENGTH" /></translation> @@ -3014,6 +3021,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Апликације се учитавају…</translation> <translation id="5592595402373377407">Још увек није доступна довољна количина података.</translation> +<translation id="5593357315997824387">Синхронизуј моје датотеке</translation> <translation id="5595152862129936745">Врло далеко</translation> <translation id="5595485650161345191">Измена адресе</translation> <translation id="5596627076506792578">Још опција</translation> @@ -3730,6 +3738,7 @@ <translation id="6664237456442406323">Нажалост, рачунар је конфигурисан помоћу погрешно направљеног ИД-а хардвера. То спречава Chrome ОС да се ажурира најновијим безбедносним исправкама и рачунар је <ph name="BEGIN_BOLD" />можда подложан злонамерним нападима<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Дошло је до проблема при отварању профила. Одјавите се, па се поново пријавите.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">заустави тајмер</translation> <translation id="667517062706956822">Желите ли да Google преведе ову страницу са језика <ph name="SOURCE_LANGUAGE" /> на <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Показивачки уређај је повезан</translation> <translation id="6678717876183468697">URL упита</translation> @@ -4056,6 +4065,7 @@ <translation id="7186088072322679094">Задржи на траци с алаткама</translation> <translation id="7187428571767585875">Уноси у регистру које треба уклонити или променити:</translation> <translation id="7189234443051076392">Проверите да ли на уређају има довољно простора</translation> +<translation id="7189965711416741966">Додали сте отисак прста.</translation> <translation id="7191159667348037">Непознат штампач (USB)</translation> <translation id="7191454237977785534">Сачувај датотеку као</translation> <translation id="7193374945610105795">Ниједна лозинка није сачувана за <ph name="ORIGIN" /></translation> @@ -4156,6 +4166,7 @@ <translation id="7339898014177206373">Нови прозор</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> је сада у режиму целог екрана.</translation> <translation id="7340650977506865820">Сајт дели екран</translation> +<translation id="7341834142292923918">Жели да приступа овом сајту</translation> <translation id="7345706641791090287">Потврдите лозинку</translation> <translation id="7346909386216857016">Важи</translation> <translation id="7347751611463936647">Да бисте користили овај додатак, унесите „<ph name="EXTENSION_KEYWORD" />“ и притисните тастер TAB, а затим унесите команду или обавите претрагу.</translation> @@ -4265,7 +4276,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google услуга локације користи изворе као што су Wi-Fi, мобилне мреже и сензори за бољу процену локације уређаја. Ова услуга је активна када је локација уређаја укључена.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Можете да искључите локацију ако искључите главно подешавање локације на уређају. У подешавањима локације можете да искључите и коришћење Wi-Fi мреже, мобилних мрежа и сензора за локацију.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Прављење лозинке –</translation> -<translation id="7518150891539970662">WebRTC евиденције (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Направи</translation> <translation id="7529411698175791732">Проверите интернет везу. Ако се проблем и даље јавља, пробајте да се одјавите и поново пријавите.</translation> @@ -4743,6 +4753,7 @@ <translation id="8214962590150211830">Уклони ову особу</translation> <translation id="8217399928341212914">Настави да блокираш аутоматска преузимања више датотека</translation> <translation id="8223479393428528563">Да бисте сачували ове датотеке за офлајн коришћење, повежите се поново на интернет, кликните десним тастером на датотеке и изаберите опцију <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Искористите понуде</translation> <translation id="8226222018808695353">Забрањено је</translation> <translation id="8226619461731305576">Ред</translation> <translation id="8226742006292257240">У наставку је насумично генерисана TPM лозинка која је додељена рачунару:</translation> @@ -4789,6 +4800,7 @@ <translation id="8286036467436129157">Пријави ме</translation> <translation id="8286963743045814739">Можете да прегледате приватно у прозору без архивирања</translation> <translation id="82871696630048499">Веб-страница се поново учитала зато што јој је понестало меморије.</translation> +<translation id="8288032458496410887">Деинсталирај: <ph name="APP" />...</translation> <translation id="8291967909914612644">Земља добављача за Home</translation> <translation id="8294431847097064396">Извор</translation> <translation id="8297006494302853456">Слаб</translation> @@ -4850,6 +4862,7 @@ <translation id="8413385045638830869">Прво питај (препоручено)</translation> <translation id="8418445294933751433">&Прикажи као картицу</translation> <translation id="8419098111404128271">Резултати претраге за „<ph name="SEARCH_TEXT" />“</translation> +<translation id="8419368276599091549">Добро дошли у <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Прикажи датотеке Google докумената</translation> <translation id="8424039430705546751">надоле</translation> <translation id="8425213833346101688">Промени</translation> @@ -4976,6 +4989,7 @@ <translation id="8620765578342452535">Конфигуриши мрежне везе</translation> <translation id="8624205858755890468">Омогућава да Помоћник приказује повезане податке, апликације и радње.</translation> <translation id="862542460444371744">&Додаци</translation> +<translation id="8626219642120025691">Тајмер је искључен</translation> <translation id="8627151598708688654">Изаберите извор</translation> <translation id="862727964348362408">Обустављено</translation> <translation id="862750493060684461">CSS кеш</translation> @@ -5096,6 +5110,7 @@ <translation id="8775404590947523323">Измене се аутоматски чувају.<ph name="BREAKS" />Да бисте задржали копију оригиналне слике, опозовите избор у пољу за потврду „Замени оригинал“</translation> <translation id="8777628254805677039">основна лозинка</translation> <translation id="8780443667474968681">Гласовна претрага је искључена.</translation> +<translation id="878068003854005405">Започнимо. Поставите прст на сензор.</translation> <translation id="878069093594050299">Овај сертификат је верификован за следеће употребе:</translation> <translation id="8781980678064919987">Искључи се кад се поклопац затвори</translation> <translation id="8782565991310229362">Покретање киоск апликације је отказано.</translation> @@ -5273,6 +5288,7 @@ <translation id="9050666287014529139">Приступна фраза</translation> <translation id="9052208328806230490">Регистровали сте штампаче за <ph name="CLOUD_PRINT_NAME" /> помоћу налога <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Настави са блокирањем</translation> +<translation id="9053091947372579468">Уређај обухвата лиценцу за Chrome, али корисничко име није повезано са конзолом за администратора. Отворите налог за конзолу за администратора да бисте наставили са регистрацијом. Напомена: Ако одаберете да користите сопствени домен да бисте отворили налог за конзолу за администратора, после регистрације морате да довршите и верификацију домена. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Запамти избор</translation> <translation id="9055636786322918818">Примењује RC4 шифровање. Коришћење ове опције вас излаже већем ризику јер су RC4 шифре небезбедне.</translation> <translation id="9056034633062863292">Ажурирање Chromebox-а</translation> @@ -5376,6 +5392,7 @@ <translation id="9218430445555521422">Подеси као подразумеван</translation> <translation id="9219103736887031265">Слике</translation> <translation id="9220525904950070496">Уклањање налога</translation> +<translation id="9220820413868316583">Подигните, па пробајте поново.</translation> <translation id="923467487918828349">Прикажи све</translation> <translation id="928985544179707652">Додаци:</translation> <translation id="930268624053534560">Детаљне временске ознаке</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 8e25dd2..77e6d10 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Inga nätverk</translation> <translation id="1056898198331236512">Varning</translation> <translation id="1058262162121953039">PUK-kod</translation> +<translation id="1059855432287631118">Registrera fingeravtryck</translation> <translation id="1061904396131502319">Snart dags för en paus</translation> <translation id="1062407476771304334">Ersätt</translation> <translation id="1067048845568873861">Skapad</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Diamant</translation> <translation id="1114335938027186412">Datorn innehåller säkerhetsenheten TPM (Trusted Platform Module), som används för att implementera flera viktiga säkerhetsfunktioner i Chrome OS. Besök hjälpcentret för Chromebook om du vill läsa mer: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Aktivera viloläget när locket stängs</translation> +<translation id="1115324527092594775">Konfigurera Better Together</translation> <translation id="1116694919640316211">Om</translation> <translation id="1116779635164066733">På grund av tillägget <ph name="NAME" /> är inställningen låst</translation> <translation id="111844081046043029">Vill du lämna den här sidan?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Aktuell tid</translation> <translation id="1157102636231978136">Din webbinformation och aktivitet som synkroniseras med Google-kontot</translation> <translation id="1161575384898972166">Logga in på <ph name="TOKEN_NAME" /> om du vill exportera klientcertifikatet.</translation> +<translation id="1161699061380012396">Inmatningsmetod för Chrome OS</translation> <translation id="1163931534039071049">&Visa ramkälla</translation> <translation id="1164674268730883318">Vill du inaktivera Smart Lock för <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Ange upplåsningskod för pinkod</translation> @@ -1003,7 +1006,6 @@ <translation id="2508428939232952663">Konto i Google Play Butik</translation> <translation id="2509495747794740764">Förstoringsgraden måste vara ett tal mellan 10 och 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Fyll i formulär automatiskt</translation> <translation id="2513403576141822879">Fler inställningar som rör sekretess, säkerhet och datainsamling finns under <ph name="BEGIN_LINK" />Synkronisering och Googles tjänster<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Sök</translation> @@ -1356,6 +1358,7 @@ <translation id="3020990233660977256">Serienummer: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Visa ramkälla</translation> <translation id="3022978424994383087">Jag hörde inte.</translation> +<translation id="3023464535986383522">Textuppläsning</translation> <translation id="3024374909719388945">Använd 24-timmars klocka</translation> <translation id="302781076327338683">Läs in igen och förbigå cacheminnet</translation> <translation id="3031417829280473749">Agent X</translation> @@ -1752,6 +1755,7 @@ <translation id="363903084947548957">Nästa inmatningsmetod</translation> <translation id="3640214691812501263">Vill du lägga till <ph name="EXTENSION_NAME" /> för <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Bredd</translation> +<translation id="3645372836428131288">Flytta fingret något så att en annan del av fingeravtrycket registreras.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> hittades</translation> <translation id="3649138363871392317">En bild har tagits</translation> <translation id="3650952250015018111">Ge ”<ph name="APP_NAME" />” åtkomstbehörighet till:</translation> @@ -1947,7 +1951,6 @@ <translation id="3920504717067627103">Certifikatpolicyer</translation> <translation id="392089482157167418">Aktivera ChromeVox (talad feedback)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Du har inga nyligen registrerade WebRTC-loggar.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Ta bort från hyllan</translation> <translation id="3926002189479431949">Du har bytt ut mobilen som är kopplad till Smart Lock</translation> @@ -2223,6 +2226,7 @@ <translation id="438503109373656455">Brunte</translation> <translation id="4387004326333427325">Autentiseringscertifikatet godkändes inte av fjärrvärden</translation> <translation id="4389091756366370506">Användare <ph name="VALUE" /></translation> +<translation id="439266289085815679">Konfiguration av Bluetooth styrs av <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Inaktivera</translation> <translation id="4400367121200150367">Webbplatser som aldrig sparar lösenord visas här</translation> <translation id="4400632832271803360">Håll ned starttangenten om du vill ändra hur tangenterna på översta raden fungerar</translation> @@ -2296,6 +2300,7 @@ <translation id="4522600456902129422">Ge den här webbplatsen tillgång till Urklipp även i fortsättningen</translation> <translation id="4530494379350999373">Ursprung</translation> <translation id="4533985347672295764">CPU-tid</translation> +<translation id="4534661889221639075">Försök igen.</translation> <translation id="4535127706710932914">Standardprofil</translation> <translation id="4538417792467843292">Ta bort ord</translation> <translation id="4538684596480161368">Blockera alltid plugin-program som inte är i sandlådeläge på <ph name="HOST" /></translation> @@ -2525,6 +2530,7 @@ <translation id="4880520557730313061">Åtgärda automatiskt</translation> <translation id="4880827082731008257">Sök i historiken</translation> <translation id="4881695831933465202">Öppna</translation> +<translation id="4882312758060467256">Har åtkomst till webbplatsen</translation> <translation id="4882473678324857464">Fokus på bokmärken</translation> <translation id="4882831918239250449">Styr hur Sök, annonser och annat ska anpassas utifrån webbhistoriken</translation> <translation id="4883178195103750615">Exportera bokmärken till HTML-fil...</translation> @@ -2590,6 +2596,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Öppna när nedladdningen är klar</translation> <translation id="4972129977812092092">Redigera skrivare</translation> +<translation id="4972164225939028131">Fel lösenord</translation> <translation id="497287958838527945">Kreditkort och adresser som används med Google Pay.</translation> <translation id="4973307593867026061">Lägg till skrivare</translation> <translation id="4973523518332075481">Ange ett namn på högst <ph name="MAX_LENGTH" /> tecken</translation> @@ -3017,6 +3024,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Läser in appar …</translation> <translation id="5592595402373377407">Det finns inte tillräckligt mycket data ännu.</translation> +<translation id="5593357315997824387">Synkronisera mina filer</translation> <translation id="5595152862129936745">Mycket långt</translation> <translation id="5595485650161345191">Redigera adress</translation> <translation id="5596627076506792578">Fler alternativ</translation> @@ -3732,6 +3740,7 @@ <translation id="6664237456442406323">Tyvärr är din dator konfigurerad med ett felaktigt maskinvaru-ID. Detta förhindrar att Chrome OS uppdateras med de senaste säkerhetskorrigeringarna och datorn <ph name="BEGIN_BOLD" />kan vara utsatt för skadlig programvara<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Något gick snett när profilen skulle öppnas. Logga ut och sedan in igen.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">stoppa timer</translation> <translation id="667517062706956822">Vill du att Google ska översätta sidan från <ph name="SOURCE_LANGUAGE" /> till <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Pekdon har anslutits</translation> <translation id="6678717876183468697">Frågewebbadress</translation> @@ -4058,6 +4067,7 @@ <translation id="7186088072322679094">Spara i verktygsfältet</translation> <translation id="7187428571767585875">Registerposter som tas bort eller ändras:</translation> <translation id="7189234443051076392">Kontrollera att det finns tillräckligt mycket utrymme på enheten</translation> +<translation id="7189965711416741966">Fingeravtrycket har lagts till.</translation> <translation id="7191159667348037">Okänd skrivare (USB)</translation> <translation id="7191454237977785534">Spara filen som</translation> <translation id="7193374945610105795">Inga lösenord har sparats för <ph name="ORIGIN" /></translation> @@ -4158,6 +4168,7 @@ <translation id="7339898014177206373">Nytt fönster</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> visas nu i helskärm.</translation> <translation id="7340650977506865820">Webbplatsen delar din skärm</translation> +<translation id="7341834142292923918">Begär åtkomst till webbplatsen</translation> <translation id="7345706641791090287">Bekräfta lösenordet</translation> <translation id="7346909386216857016">Ok, jag förstår</translation> <translation id="7347751611463936647">Om du vill använda det här tillägget skriver du ”<ph name="EXTENSION_KEYWORD" />”, trycker på tabbtangenten och anger kommandot eller sökningen.</translation> @@ -4267,7 +4278,6 @@ <ph name="BEGIN_PARAGRAPH2" />I Googles platstjänster används källor som Wi-Fi, mobilnätverk och sensorer för att beräkna enhetens plats. Tjänsten är aktiv när inställningen Plats har aktiverats på enheten.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Du kan inaktivera tjänsten genom att inaktivera huvudinställningen för Plats på enheten. Du kan även inaktivera användningen av Wi-Fi, mobila nätverk och sensorer för plats i platsinställningarna.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Skapa ett lösenord –</translation> -<translation id="7518150891539970662">WebRTC-loggar (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Skapa</translation> <translation id="7529411698175791732">Kontrollera internetanslutningen. Om problemet kvarstår testar du att logga ut och logga in igen.</translation> @@ -4745,6 +4755,7 @@ <translation id="8214962590150211830">Ta bort personen</translation> <translation id="8217399928341212914">Fortsätt att blockera automatiska nedladdningar av flera filer</translation> <translation id="8223479393428528563">Om du vill spara filerna och använda dem offline ansluter du till internet igen, högerklickar på filerna och väljer alternativet <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Lös in erbjudanden</translation> <translation id="8226222018808695353">Förbjuden</translation> <translation id="8226619461731305576">Utskriftskö</translation> <translation id="8226742006292257240">Nedan visas det slumpmässigt genererade lösenordet för TPM som har tilldelats din dator:</translation> @@ -4791,6 +4802,7 @@ <translation id="8286036467436129157">Logga in</translation> <translation id="8286963743045814739">Du kan surfa privat med ett inkognitofönster</translation> <translation id="82871696630048499">Webbsidan lästes in igen eftersom minnet tog slut.</translation> +<translation id="8288032458496410887">Avinstallera <ph name="APP" /> …</translation> <translation id="8291967909914612644">Hemleverantörens land</translation> <translation id="8294431847097064396">Källa</translation> <translation id="8297006494302853456">Svag</translation> @@ -4852,6 +4864,7 @@ <translation id="8413385045638830869">Fråga först (rekommenderas)</translation> <translation id="8418445294933751433">&Visa som flik</translation> <translation id="8419098111404128271">Sökresultat för ”<ph name="SEARCH_TEXT" />”</translation> +<translation id="8419368276599091549">Välkommen till <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Visa Google Dokument-filer</translation> <translation id="8424039430705546751">ned</translation> <translation id="8425213833346101688">Ändra</translation> @@ -4978,6 +4991,7 @@ <translation id="8620765578342452535">Konfigurera nätverksanslutningar</translation> <translation id="8624205858755890468">Tillåter att assistenten visar relaterade uppgifter, appar och åtgärder.</translation> <translation id="862542460444371744">&Tillägg</translation> +<translation id="8626219642120025691">Timer klar</translation> <translation id="8627151598708688654">Välj källa</translation> <translation id="862727964348362408">Tillfälligt avstängd</translation> <translation id="862750493060684461">CSS-cacheminne</translation> @@ -5098,6 +5112,7 @@ <translation id="8775404590947523323">Dina redigeringar sparas automatiskt.<ph name="BREAKS" />Om du vill spara en kopia av originalbilden avmarkerar du Ersätt original</translation> <translation id="8777628254805677039">rotlösenord</translation> <translation id="8780443667474968681">Röstsökning har inaktiverats.</translation> +<translation id="878068003854005405">Nu sätter vi igång. Placera fingret på sensorn.</translation> <translation id="878069093594050299">Certifikatet har verifierats för följande användningsområden:</translation> <translation id="8781980678064919987">Stäng av när locket stängs</translation> <translation id="8782565991310229362">Starten av kioskappen avbröts.</translation> @@ -5275,6 +5290,7 @@ <translation id="9050666287014529139">Lösenfras</translation> <translation id="9052208328806230490">Du har registrerat dina skrivare med <ph name="CLOUD_PRINT_NAME" /> och du använde kontot <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Fortsätt blockera</translation> +<translation id="9053091947372579468">Det finns en Chrome-licens på enheten men användarnamnet är inte kopplat till en administratörskonsol. Fortsätt med registreringen genom att skapa ett konto för administratörskonsolen. Obs! Om du väljer att använda din egen domän när du skapar ett nytt konto för administratörskonsolen måste du slutföra verifieringen av domänen efter registreringen. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Kom ihåg mitt val</translation> <translation id="9055636786322918818">Tillämpa RC4-kryptering. Det här alternativet är mer riskabelt eftersom RC4-chiffer är osäkra.</translation> <translation id="9056034633062863292">Uppdaterar Chromebox</translation> @@ -5378,6 +5394,7 @@ <translation id="9218430445555521422">Använd som standard</translation> <translation id="9219103736887031265">Bilder</translation> <translation id="9220525904950070496">Ta bort konto</translation> +<translation id="9220820413868316583">Lyft fingret och testa igen.</translation> <translation id="923467487918828349">Visa alla</translation> <translation id="928985544179707652">Tillägg:</translation> <translation id="930268624053534560">Detaljerade tidsstämplar</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 57a00ff8..7987ff4 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Hakuna mitandao</translation> <translation id="1056898198331236512">Ilani</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Inasajili alama bainifu</translation> <translation id="1061904396131502319">Muda wa kupumzika umekaribia</translation> <translation id="1062407476771304334">Badilisha</translation> <translation id="1067048845568873861">Kiliundwa</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Almasi</translation> <translation id="1114335938027186412">Kompyuta yako ina kifaa cha usalama cha Mfumo wa Uendeshaji Unaoaminika (TPM), ambacho kinatumiwa kutekeleza vipengee vingi muhimu vya usalama kwenye Chrome OS. Tembelea Kituo cha Usaidizi cha Chromebook ili upate malezo zaidi: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Wezesha hali tuli kifuniko kikiwa kimefungwa</translation> +<translation id="1115324527092594775">Weka Mipangilio ya Better Together</translation> <translation id="1116694919640316211">Kuhusu</translation> <translation id="1116779635164066733">Mipangilio hii inatekelezwa na kiendelezi cha "<ph name="NAME" />".</translation> <translation id="111844081046043029">Je, una hakika kuwa ungependa kuondoka kwenye ukurasa huu?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Saa ya sasa</translation> <translation id="1157102636231978136">Imesawazisha data na shughuli za kuvinjari kwenye Akaunti yako ya Google</translation> <translation id="1161575384898972166">Tafadhali ingia kwenye <ph name="TOKEN_NAME" /> ili kuhamisha cheti cha mteja.</translation> +<translation id="1161699061380012396">Mbinu ya Kuingiza Data kwenye Mfumo wa Uendeshaji wa Chrome</translation> <translation id="1163931534039071049">&Tazama asili ya fremu</translation> <translation id="1164674268730883318">Ungependa kuzima kipengele cha Smart Lock cha <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Weka Ufunguo wa Kufungua PIN</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Akaunti ya Duka la Google Play</translation> <translation id="2509495747794740764">Lazima kiwango kiwe nambari kati ya 10 na 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Jaza fomu kiotomatiki</translation> <translation id="2513403576141822879">Ili upate mipangilio zaidi inayohusiana na faragha, usalama na ukusanyaji wa data, angalia <ph name="BEGIN_LINK" />Usawazishaji na huduma za Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Tafuta</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">Nambari ya Kufuatilia: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Ona Asili ya Fremu</translation> <translation id="3022978424994383087">Imeshindwa kutafsiri.</translation> +<translation id="3023464535986383522">Chagua ili izungumze</translation> <translation id="3024374909719388945">Tumia mfumo wa saa 24</translation> <translation id="302781076327338683">Pakia upya hatua ya kupuuza akiba</translation> <translation id="3031417829280473749">Wakala X</translation> @@ -1746,6 +1749,7 @@ <translation id="363903084947548957">Mbinu ya kuingiza data inayofuata</translation> <translation id="3640214691812501263">Ungependa kuongeza "<ph name="EXTENSION_NAME" />" kwa <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Upana</translation> +<translation id="3645372836428131288">Sogeza kidogo ili unase sehemu tofauti ya alama bainifu.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> kimegunduliwa</translation> <translation id="3649138363871392317">Picha ilipigwa</translation> <translation id="3650952250015018111">Ruhusu "<ph name="APP_NAME" />" ifikie:</translation> @@ -1941,7 +1945,6 @@ <translation id="3920504717067627103">Sera za Vyeti</translation> <translation id="392089482157167418">Washa ChromeVox (maoni yaliyotamkwa)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Huna kumbukumbu za WebRTC zilizopigwa picha hivi majuzi.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Banua kutoka kwenye Rafu</translation> <translation id="3926002189479431949">Simu ya Smart Lock imebadilishwa</translation> @@ -2215,6 +2218,7 @@ <translation id="438503109373656455">Saratoga</translation> <translation id="4387004326333427325">Cheti cha uthibitishaji kimekataliwa kwa mbali</translation> <translation id="4389091756366370506">Mtumiaji <ph name="VALUE" /></translation> +<translation id="439266289085815679">Mipangilio ya Bluetooth inadhibitiwa na <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Zima</translation> <translation id="4400367121200150367">Tovuti ambazo hazihifadhi manenosiri kamwe zitaonekana hapa</translation> <translation id="4400632832271803360">Shikilia kitufe cha Kifungua Programu ili ubadilishe utendaji wa vitufe vya juu vya safu mlalo</translation> @@ -2288,6 +2292,7 @@ <translation id="4522600456902129422">Endelea kuruhusu tovuti hii kuona ubao wa kunakili</translation> <translation id="4530494379350999373">Asili</translation> <translation id="4533985347672295764">Muda wa Kuchakata</translation> +<translation id="4534661889221639075">Jaribu tena.</translation> <translation id="4535127706710932914">Wasifu Chaguomsingi</translation> <translation id="4538417792467843292">Futa neno</translation> <translation id="4538684596480161368">Zuia programu-jalizi zisizo kwenye sanbox kwenye <ph name="HOST" /> wakati wowote</translation> @@ -2517,6 +2522,7 @@ <translation id="4880520557730313061">Rekebisha kiotomatiki</translation> <translation id="4880827082731008257">Tafuta katika historia</translation> <translation id="4881695831933465202">Fungua</translation> +<translation id="4882312758060467256">Inaweza kufikia tovuti hii</translation> <translation id="4882473678324857464">Lenga alamisho</translation> <translation id="4882831918239250449">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo ya Kutafuta matangazo na zaidi</translation> <translation id="4883178195103750615">Hamisha alamisho hadi faili ya HTML...</translation> @@ -2582,6 +2588,7 @@ <translation id="4969785127455456148">Albamu</translation> <translation id="4971412780836297815">Fungua baada ya kukamilisha</translation> <translation id="4972129977812092092">Badilisha maelezo ya printa</translation> +<translation id="4972164225939028131">Nenosiri si sahihi</translation> <translation id="497287958838527945">Kadi za mikopo na anwani zinazotumia Google Pay.</translation> <translation id="4973307593867026061">Ongeza printa</translation> <translation id="4973523518332075481">Tumia jina lenye herufi <ph name="MAX_LENGTH" /> au chache</translation> @@ -3009,6 +3016,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Inapakia programu...</translation> <translation id="5592595402373377407">Bado hakuna data ya kutosha.</translation> +<translation id="5593357315997824387">Sawazisha faili zangu</translation> <translation id="5595152862129936745">Mbali sana</translation> <translation id="5595485650161345191">Badilisha anwani</translation> <translation id="5596627076506792578">Chaguo zaidi</translation> @@ -3724,6 +3732,7 @@ <translation id="6664237456442406323">Kwa bahati mbaya, kompyuta yako imesanidiwa na kitambulisho cha maunzi kilichoharibika. Hii inazuia Chrome OS isisasishe na sasisho za usalama za hivi karibuni na kompyuta yako <ph name="BEGIN_BOLD" />inaweza ikawa hatarini kutokana na mashambulizi hasidi<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Hitilafu imetokea wakati wa kufungua wasifu wako. Tafadhali ondoka na uingie katika akaunti tena.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">simamisha kipima muda</translation> <translation id="667517062706956822">Je, ungependa Google itafsiri ukurasa huu kutoka <ph name="SOURCE_LANGUAGE" /> hadi <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Kifaa cha kuonyeshea kimeunganishwa</translation> <translation id="6678717876183468697">URL ya Hoja</translation> @@ -4050,6 +4059,7 @@ <translation id="7186088072322679094">Weka katika Upau wa Vidhibiti</translation> <translation id="7187428571767585875">Data ya sajili itakayoondolewa au kubadilishwa:</translation> <translation id="7189234443051076392">Hakikisha kuwa una nafasi ya kutosha kwenye kifaa chako</translation> +<translation id="7189965711416741966">Imeongeza alama bainifu.</translation> <translation id="7191159667348037">Printa Isiyojulikana (USB)</translation> <translation id="7191454237977785534">Hifadhi faili kama</translation> <translation id="7193374945610105795">Hakuna manenosiri yaliyohifadhiwa ya <ph name="ORIGIN" /></translation> @@ -4150,6 +4160,7 @@ <translation id="7339898014177206373">Dirisha jipya</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> sasa ni skrini nzima.</translation> <translation id="7340650977506865820">Tovuti inashiriki skrini yako</translation> +<translation id="7341834142292923918">Ingependa kufikia tovuti hii</translation> <translation id="7345706641791090287">Thibitisha nenosiri lako</translation> <translation id="7346909386216857016">Sawa, nimeelewa</translation> <translation id="7347751611463936647">Ili kutumia kiendelezi hiki, charaza " <ph name="EXTENSION_KEYWORD" /> ", kisha KICHUPO, halafu amri au utafutaji wako.</translation> @@ -4258,7 +4269,6 @@ <translation id="7515154058529101840"><ph name="BEGIN_PARAGRAPH1" />Zisaidie programu zitambue mahali. Tumia huduma za mahali za Google kuboresha data ya mahali katika programu. Google inaweza kukusanya data ya mahali mara kwa mara na kuitumia kwa njia ambayo haiwezi kukutambulisha ili kuboresha usahihi wa mahali na huduma zinazohusiana na mahali.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Huduma za mahali za Google hutumia vyanzo kama vile Wi-Fi, mitandao ya simu na vitambuzi ili kukadiria mahali kifaa chako kilipo. Huduma hii inatumika wakati umewasha mipangilio ya Mahali kwenye kifaa chako.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Unaweza kuzima mipangilio ya Mahali kwa kuzima mipangilio ya msingi ya Mahali katika kifaa chako. Unaweza pia kuzima matumizi ya Wi-Fi, mitandao ya simu na vitambuzi vya mahali katika mipangilio ya mahali.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Tunga nenosiri -</translation> -<translation id="7518150891539970662">Kumbukumbu za WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Unda</translation> <translation id="7529411698175791732">Angalia muunganisho wako wa intaneti. Iwapo tatizo litaendelea, jaribu kuondoka na uingie tena katika akaunti.</translation> @@ -4738,6 +4748,7 @@ <translation id="8214962590150211830">Ondoa Mtumiaji Huyu</translation> <translation id="8217399928341212914">Endelea kuzuia upakuaji otomatiki wa faili nyingi</translation> <translation id="8223479393428528563">Ili kuhifadhi faili hizi kwa matumizi ya nje ya mtandao, rudi mtandaoni, bofya faili kulia, na uchague chaguo la <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Tumia ofa zako</translation> <translation id="8226222018808695353">Hairuhusiwi</translation> <translation id="8226619461731305576">Foleni</translation> <translation id="8226742006292257240">Hapa chini kuna nenosiri la TPM lililoundwa kinasibu ambalo limetolewa kwa kompyuta yako:</translation> @@ -4784,6 +4795,7 @@ <translation id="8286036467436129157">Ingia</translation> <translation id="8286963743045814739">Unaweza kuvinjari kwa faragha ukitumia dirisha fiche</translation> <translation id="82871696630048499">Imepakia upya ukurasa wa wavuti kwa sababu nafasi ya hifadhi imejaa.</translation> +<translation id="8288032458496410887">Ondoa <ph name="APP" />...</translation> <translation id="8291967909914612644">Nchi ya mtoa huduma</translation> <translation id="8294431847097064396">Chanzo</translation> <translation id="8297006494302853456">Dhaifu</translation> @@ -4846,6 +4858,7 @@ <translation id="8413385045638830869">Uliza kwanza (imependekezwa)</translation> <translation id="8418445294933751433">Onye&sha kama kichupo</translation> <translation id="8419098111404128271">Matokeo ya utafutaji wa '<ph name="SEARCH_TEXT" />'</translation> +<translation id="8419368276599091549">Karibu kwenye <ph name="DEVICE_TYPE" /> yako!</translation> <translation id="8420060421540670057">Onyesha faili za Hati za Google</translation> <translation id="8424039430705546751">chini</translation> <translation id="8425213833346101688">Badilisha</translation> @@ -4972,6 +4985,7 @@ <translation id="8620765578342452535">Sanidi miunganisho ya mtandao</translation> <translation id="8624205858755890468">Huwasha programu ya Mratibu ili kukuonyesha maelezo, programu na hatua zinazohusiana.</translation> <translation id="862542460444371744">Vi&endelezi</translation> +<translation id="8626219642120025691">Kipima muda kimemaliza kuhesabu</translation> <translation id="8627151598708688654">Chagua chanzo</translation> <translation id="862727964348362408">Imesitishwa</translation> <translation id="862750493060684461">Akiba ya CSS</translation> @@ -5092,6 +5106,7 @@ <translation id="8775404590947523323">Uhariri wako umehifadhiwa otomatiki.<ph name="BREAKS" />Ili kuweka nakala ya picha halisi, ondoa tiki kwenye "Futa halisi"</translation> <translation id="8777628254805677039">nenosiri msingi</translation> <translation id="8780443667474968681">Kipengele cha kutafuta kwa kutamka kimezimwa.</translation> +<translation id="878068003854005405">Tuanze kutumia. Weka kidole chako kwenye kitambuzi.</translation> <translation id="878069093594050299">Cheti hiki kimethibitishwa kwa matumizi yafuatayo:</translation> <translation id="8781980678064919987">Zima kifuniko kikiwa kimefungwa</translation> <translation id="8782565991310229362">Uzinduzi wa programu ya kioski umeghairiwa.</translation> @@ -5269,6 +5284,7 @@ <translation id="9050666287014529139">Kaulisiri</translation> <translation id="9052208328806230490">Umesajili printa zako kwenye <ph name="CLOUD_PRINT_NAME" /> ukitumia akaunti ya <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Endelea kuzuia</translation> +<translation id="9053091947372579468">Kifaa chako kinajumuisha leseni ya Chrome, lakini jina lako la mtumiaji halijahusishwa na Dashibodi ya msimamizi. Tafadhali fungua akaunti ya Dashibodi ya msimamizi ili uendelee kujisajili. Kumbuka: Kama utachagua kutumia kikoa chako mwenyewe ili ufungue akaunti ya Dashibodi ya msimamizi, lazima pia ukamilishe uthibitishaji wa kikoa baada ya kujisajili. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Kumbuka chaguo langu</translation> <translation id="9055636786322918818">Wezesha usimbaji wa RC4. Hatua ya kutumia chaguo hili huongeza uwezekano wa hatari kwa kuwa misimbo ya RC4 si salama.</translation> <translation id="9056034633062863292">Inasasisha Chromebox</translation> @@ -5372,6 +5388,7 @@ <translation id="9218430445555521422">Weka iwe chaguomsingi</translation> <translation id="9219103736887031265">Picha</translation> <translation id="9220525904950070496">Ondoa akaunti</translation> +<translation id="9220820413868316583">Inua kisha ujaribu tena.</translation> <translation id="923467487918828349">Onyesha Yote</translation> <translation id="928985544179707652">Viendelezi:</translation> <translation id="930268624053534560">Mihuri ya muda iliyo na maelezo ya kina</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 6146818..5b7064b 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">நெட்வொர்க்குகள் இல்லை</translation> <translation id="1056898198331236512">எச்சரிக்கை</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">கைரேகையைப் பதிவுசெய்தல்</translation> <translation id="1061904396131502319">சாதனம் பூட்டப்பட உள்ளது</translation> <translation id="1062407476771304334">மாற்றியமை</translation> <translation id="1067048845568873861">உருவாக்கப்பட்டது</translation> @@ -65,7 +66,7 @@ <translation id="1093457606523402488">தெரியும் நெட்வொர்க்குகள்:</translation> <translation id="1094607894174825014">படித்தல் அல்லது எழுதுதல் செயல்பாடு தவறான ஆஃப்செட்டுடன் கோரப்பட்ட சாதனம்: "<ph name="DEVICE_NAME" />".</translation> <translation id="109758035718544977">தளங்களில் ஒலி இயக்கு</translation> -<translation id="1097658378307015415">உள்நுழைவதற்கு முன்பாக, நெட்வொர்க் <ph name="NETWORK_ID" /> ஐச் செயல்படுத்த விருந்தினராக உள்ளிடுக</translation> +<translation id="1097658378307015415">உள்நுழைவதற்கு முன், <ph name="NETWORK_ID" /> என்ற நெட்வொர்க்கை இயக்க, விருந்தினராக நுழைக</translation> <translation id="1103523840287552314">எப்போதும் இந்த மொழியை மொழிபெயர் <ph name="LANGUAGE" /></translation> <translation id="1108600514891325577">&Stop</translation> <translation id="1110155001042129815">காத்திருங்கள்</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">டைமண்ட்</translation> <translation id="1114335938027186412">உங்கள் கணினியில் உள்ள நம்பகமான இயங்குதள மாட்யூல் (TPM) பாதுகாப்புச் சாதனம், Chrome OS இல் உள்ள பல முக்கியமான பாதுகாப்பு அம்சங்களைச் செயல்படுத்தப் பயன்படுத்தப்படுகிறது. மேலும் அறிய Chromebook உதவி மையத்தைப் பார்வையிடவும்: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">மூடியிருக்கும் போது, உறக்கநிலைக்குச் செல்</translation> +<translation id="1115324527092594775">Better Togetherரை அமைக்கவும்</translation> <translation id="1116694919640316211">அறிமுகம்</translation> <translation id="1116779635164066733">இந்த அமைப்பு "<ph name="NAME" />" நீட்டிப்பால் செயல்படுத்தப்படுகிறது.</translation> <translation id="111844081046043029">இந்த பக்கத்தை விட்டு நிச்சயமாக வெளியேற வேண்டுமா?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">தற்போதைய நேரம்</translation> <translation id="1157102636231978136">உங்கள் Google கணக்குடன் ஒத்திசைக்கப்பட்ட உலாவிய தரவு மற்றும் செயல்பாடு</translation> <translation id="1161575384898972166">கிளையன்ட் சான்றிதழை ஏற்றுமதி செய்ய, தயவுசெய்து <ph name="TOKEN_NAME" /> இல் உள்நுழைக.</translation> +<translation id="1161699061380012396">Chrome OS உள்ளீட்டு முறை</translation> <translation id="1163931534039071049">சட்டக ஆதாரங்களைக் &காண்க</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" />க்கான Smart Lockஐ முடக்கவா?</translation> <translation id="1164899421101904659">பின்னின் தடையை நீக்குவதற்கான குறியீட்டை உள்ளிடவும்</translation> @@ -126,7 +129,7 @@ <translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1183237619868651138">அக தற்காலிகச் சேமிப்பில் <ph name="EXTERNAL_CRX_FILE" />ஐ நிறுவ முடியாது.</translation> -<translation id="1185924365081634987">இந்த நெட்வொர்க் பிழையைச் சரிசெய்ய, <ph name="GUEST_SIGNIN_LINK_START" />விருந்தினராக உலாவ<ph name="GUEST_SIGNIN_LINK_END" /> முயற்சிக்கலாம்.</translation> +<translation id="1185924365081634987">இந்த நெட்வொர்க் பிழையைச் சரிசெய்ய, <ph name="GUEST_SIGNIN_LINK_START" />விருந்தினராக உலாவவும்<ph name="GUEST_SIGNIN_LINK_END" /> முயற்சி செய்யலாம்.</translation> <translation id="1186771945450942097">தீங்கிழைக்கும் மென்பொருளை அகற்று</translation> <translation id="1187722533808055681">செயல்படாமல் இருக்கும் நினைவூட்டல்கள்</translation> <translation id="1188807932851744811">பதிவு பதிவேற்றப்படவில்லை.</translation> @@ -218,7 +221,7 @@ <translation id="1313705515580255288">உங்கள் புத்தகக்குறிகள், வரலாறு மற்றும் பிற அமைப்புகள் ஆகியவை உங்கள் Google கணக்கில் ஒத்திசைக்கப்படும்.</translation> <translation id="1313832887664610176">Chromeboxக்கான இணைப்பு துண்டிக்கப்பட்டது</translation> <translation id="1314565355471455267">Android VPN</translation> -<translation id="131461803491198646">ரோமிங் அற்ற உள்ளூர் பிணையம்</translation> +<translation id="131461803491198646">உள்ளூர் நெட்வொர்க், ரோமிங் இல்லை</translation> <translation id="1316136264406804862">தேடுகிறது...</translation> <translation id="1316495628809031177">ஒத்திசைவு இடைநிறுத்தப்பட்டது</translation> <translation id="1319979322914001937">Chrome இணைய அங்காடியிலிருந்து வடிகட்டப்பட்ட நீட்டிப்புகளின் பட்டியலைக் காட்டும் பயன்பாடு. பட்டியலிலுள்ள நீட்டிப்புகளை, பயன்பாட்டிலிருந்து நேரடியாக நிறுவலாம்.</translation> @@ -251,7 +254,7 @@ <translation id="1371301976177520732">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புத்தகக்குறிகள், கடவுச்சொற்கள், வரலாறு, மேலும் பலவற்றைப் பெறலாம்</translation> <translation id="1372681413396468867">{NUM_ITEMS,plural, =1{1 உருப்படியை அகற்ற வேண்டும்}other{# உருப்படிகளை அகற்ற வேண்டும்}}</translation> <translation id="1372841398847029212">எனது கணக்குடன் ஒத்திசை</translation> -<translation id="1374844444528092021">"<ph name="NETWORK_NAME" />" நெட்வொர்க் மூலம் தேவைப்படும் சான்றிதழானது நிறுவப்படாமலோ அல்லது இனி செல்லுபடியாகாத நிலையிலோ உள்ளது. புதிய சான்றிதழைப் பெற்று, மீண்டும் இணைக்க முயலவும்.</translation> +<translation id="1374844444528092021">"<ph name="NETWORK_NAME" />" நெட்வொர்க்குக்குத் தேவைப்படும் சான்றிதழானது நிறுவப்படாமலோ இனி செல்லுபடியாகாத நிலையிலோ உள்ளது. புதிய சான்றிதழைப் பெற்று, மீண்டும் இணைக்க முயலவும்.</translation> <translation id="1375321115329958930">சேமிக்கப்பட்ட கடவுச்சொற்கள்</translation> <translation id="137651782282853227">சேமித்த முகவரிகள் இங்கே தோன்றும்</translation> <translation id="1377600615067678409">இப்போது தவிர்</translation> @@ -349,10 +352,10 @@ <translation id="150962533380566081">தவறான PUK.</translation> <translation id="1510030919967934016">இந்தப் பக்கம் உங்கள் இருப்பிடத்தைத் தடமறிவதில் இருந்து தடுக்கப்பட்டுள்ளது.</translation> <translation id="1510238584712386396">துவக்கி</translation> -<translation id="1510785804673676069">நீங்கள் பிராக்ஸி சர்வரைப் பயன்படுத்தினால், பிராக்ஸி அமைப்புகளைச் சரிபார்க்கவும் அல்லது - பிணைய நிர்வாகியைத் தொடர்புகொண்டு, - பிராக்ஸி சர்வர் செயல்படுவதைச் சரிபார்க்கவும். நீங்கள் பிராக்ஸி சர்வரைப் பயன்படுத்துகிறீர்கள் - என்பதை நம்பவில்லை எனில், <ph name="LINK_START" />பிராக்ஸி அமைப்புகளைச்<ph name="LINK_END" /> சரிசெய்யவும்.</translation> +<translation id="1510785804673676069">நீங்கள் ப்ராக்ஸி சர்வரைப் பயன்படுத்தினால், ப்ராக்ஸி அமைப்புகளைச் சரிபார்க்கவும் அல்லது + நெட்வொர்க் நிர்வாகியைத் தொடர்புகொண்டு, + ப்ராக்ஸி சர்வர் செயல்படுவதைச் சரிபார்க்கவும். நீங்கள் ப்ராக்ஸி சர்வரைப் பயன்படுத்தலாம் + என்பதை நம்பவில்லை எனில், <ph name="LINK_START" />ப்ராக்ஸி அமைப்புகளைச்<ph name="LINK_END" /> சரிசெய்யவும்.</translation> <translation id="1511388193702657997">எனது இணைய கடவுச்சொற்களைச் சேமிக்க வேண்டுமா எனக் கேட்கவும்</translation> <translation id="1512210426710821809">இதைச் செயல்தவிர்ப்பதற்கு ஒரே வழி, <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ஐ மீண்டும் நிறுவ வேண்டும்</translation> <translation id="151501797353681931">Safari இலிருந்து இறக்குமதி செய்யப்பட்டவை</translation> @@ -393,21 +396,21 @@ <translation id="1572876035008611720">மின்னஞ்சலை உள்ளிடவும்</translation> <translation id="1576594961618857597">இயல்பு வெள்ளைநிற அவதார்</translation> <translation id="1581962803218266616">&கண்டுபிடிப்பானில் காண்பி</translation> -<translation id="1584990664401018068">பயன்படுத்திக் கொண்டிருக்கும் வைஃபை நெட்வொர்க்கு <ph name="NETWORK_ID" />, அங்கீகரிப்பு தேவைப்படலாம்.</translation> +<translation id="1584990664401018068">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் வைஃபை நெட்வொர்க்குக்கு <ph name="NETWORK_ID" /> அங்கீகரிப்பு தேவைப்படலாம்.</translation> <translation id="1585238069289523942">Chromebookகில் ஆப்ஸ்களை நிறுவலாம்</translation> <translation id="1585717515139318619">உங்கள் கணினியில் உள்ள மற்றொரு நிரல், Chrome செயல்படும் முறையை மாற்றக்கூடிய தீமினைச் சேர்த்தது. <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript கன்சோல்</translation> <translation id="1588438908519853928">இயல்பு</translation> -<translation id="158849752021629804">உள்ளூர் பிணையம் தேவை</translation> +<translation id="158849752021629804">உள்ளூர் நெட்வொர்க் தேவை</translation> <translation id="1588870296199743671">இதைக் கொண்டு இணைப்பைத் திற...</translation> <translation id="1589055389569595240">இலக்கணம் மற்றும் எழுத்துப்பிழையைக் காண்பி</translation> <translation id="1593594475886691512">வடிவமைக்கிறது...</translation> <translation id="159359590073980872">படத்தின் தற்காலிக சேமிப்பு</translation> <translation id="1593926297800505364">கட்டண முறையைச் சேமிக்கும்</translation> <translation id="1598233202702788831">உங்கள் நிர்வாகியால் புதுப்பிப்புகள் முடக்கப்பட்டுள்ளன.</translation> -<translation id="1600857548979126453">பக்க பிழைதிருத்தியின் பின்தளத்தை அணுகலாம்</translation> +<translation id="1600857548979126453">பக்கப் பிழைத் திருத்தியின் பின்தளத்தை அணுகலாம்</translation> <translation id="1601560923496285236">பயன்படுத்து</translation> <translation id="1603914832182249871">(மறைநிலை)</translation> <translation id="1607139524282324606">உள்ளீட்டை அழி</translation> @@ -436,7 +439,7 @@ <translation id="163993578339087550"><ph name="SERVICE_NAME" /> நீங்கள் தகுதியான Chrome OS சாதனத்தைப் பயன்படுத்துகிறீர்களா என்பதைச் சரிபார்க்க விரும்புகிறது.</translation> <translation id="1640283014264083726">RSA குறியாக்கத்துடன் PKCS #1 MD4</translation> <translation id="1641113438599504367">பாதுகாப்பாக உலாவுதல்</translation> -<translation id="1642494467033190216">வேறு பிழைத்திருத்த அம்சங்களை இயக்கும் முன், rootfs பாதுகாப்பை அகற்றி, மீண்டும் தொடங்க வேண்டும்.</translation> +<translation id="1642494467033190216">வேறு பிழைத் திருத்த அம்சங்களை இயக்கும் முன், rootfs பாதுகாப்பை அகற்றி, மீண்டும் தொடங்க வேண்டும்.</translation> <translation id="1643050526526937107">ஒத்திசைவை மட்டும் இயக்கு</translation> <translation id="1643072738649235303">SHA-1 உடனான X9.62 ECDSA கையொப்பம்</translation> <translation id="1644574205037202324">வரலாறு</translation> @@ -617,7 +620,7 @@ <translation id="189358972401248634">பிற மொழிகள்</translation> <translation id="1895658205118569222">நிறுத்தம்</translation> <translation id="1895934970388272448">இந்தச் செயல்முறையை முடிக்க உங்கள் அச்சுப்பொறியில் பதிவை உறுதிப்படுத்த வேண்டும் - அதை இப்போது சரிபார்க்கவும்.</translation> -<translation id="1897762215429052132">நெட்வொர்க் இணைப்பு, மொழி, விசைப்பலகத் தளவமைப்பு ஆகியவற்றை அமைக்கவும்...</translation> +<translation id="1897762215429052132">நெட்வொர்க் இணைப்பு, மொழி, கீபோர்டு தளவமைப்பு ஆகியவற்றை அமைக்கவும்...</translation> <translation id="1901303067676059328">அ&னைத்தையும் தேர்ந்தெடு</translation> <translation id="1902576642799138955">செல்லுபடிக் காலம்</translation> <translation id="1905375423839394163">Chromebookகின் சாதனப் பெயர்</translation> @@ -692,7 +695,7 @@ <translation id="2019718679933488176">புதிய தாவலில் ஆடியோவை &திற</translation> <translation id="2020183425253392403">நெட்வொர்க் முகவரி அமைப்புகளைக் காட்டு</translation> <translation id="2023167225947895179">பின்னானது எளிதாக யூகிக்கும்படி உள்ளது</translation> -<translation id="202352106777823113">பதிவிறக்கம் அதிக நேரத்தை எடுத்துக்கொண்டதால், பிணையம் அதை நிறுத்திவிட்டது.</translation> +<translation id="202352106777823113">பதிவிறக்கம் அதிக நேரத்தை எடுத்துக்கொண்டதால் நெட்வொர்க் அதை நிறுத்திவிட்டது.</translation> <translation id="2025632980034333559"><ph name="APP_NAME" /> செயலிழந்தது. நீட்டிப்பை மறுஏற்றம் செய்ய இந்த பலூனைக் கிளிக் செய்க.</translation> <translation id="2028997212275086731">RAR archive</translation> <translation id="2034346955588403444">பிற வைஃபை நெட்வொர்க்கைச் சேர்</translation> @@ -703,7 +706,7 @@ <translation id="2045117674524495717">கீபோர்ட் ஷார்ட்கட் உதவி</translation> <translation id="2045969484888636535">தொடர்ந்து குக்கீகளைத் தடுக்கவும்</translation> <translation id="204622017488417136">ஏற்கனவே நிறுவப்பட்ட Chrome இன் பதிப்பிற்கு உங்கள் சாதனம் மாற்றியமைக்கப்படும். எல்லா பயனர் கணக்குகளும் அகத் தரவும் அகற்றப்படும். இதைச் செயல்தவிர்க்க முடியாது.</translation> -<translation id="2048182445208425546">உங்கள் நெட்வொர்க் ட்ராஃபிக்கை அணுகுதல்</translation> +<translation id="2048182445208425546">உங்கள் நெட்வொர்க் ட்ராஃபிக்கை அணுகலாம்</translation> <translation id="2048653237708779538">இச்செயலைச் செய்ய இயலாது</translation> <translation id="204914487372604757">குறுக்குவழியை உருவாக்குக</translation> <translation id="2050339315714019657">செங்குத்து நிலை</translation> @@ -736,7 +739,7 @@ <translation id="2091887806945687916">ஒலி</translation> <translation id="2097372108957554726">புதிய சாதனங்களைப் பதிவுசெய்ய நீங்கள் Chrome இல் உள்நுழைய வேண்டும்</translation> <translation id="2098305189700762159">கண்டறிய முடியவில்லை</translation> -<translation id="2099172618127234427">sshd daemonஐ அமைக்கும் மற்றும் USB டிரைவ்களிலிருந்து தொடங்குவதை இயக்கும் Chrome OS பிழைத்திருத்த அம்சங்களை இயக்குகிறீர்கள்.</translation> +<translation id="2099172618127234427">sshd daemonனை அமைத்து, USB டிரைவ்களிலிருந்து தொடங்குவதை இயக்கும் Chrome OS பிழைத் திருத்த அம்சங்களை இயக்குகிறீர்கள்.</translation> <translation id="2099686503067610784">சேவையக சான்றிதழ் "<ph name="CERTIFICATE_NAME" />" ஐ நீக்கவா?</translation> <translation id="2100273922101894616">தானாக உள்நுழையவும்</translation> <translation id="2101225219012730419">பதிப்பு:</translation> @@ -875,7 +878,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" />ஐத் தனிப்பயனாக்கி, கட்டுப்படுத்தும்</translation> <translation id="2301382460326681002">நீட்டிப்பு மூல கோப்பகம் செல்லாதது.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ஆனது கூடுதல் அனுமதிகளைக் கோரியுள்ளது.</translation> -<translation id="2307462900900812319">பிணையத்தை உள்ளமை</translation> +<translation id="2307462900900812319">நெட்வொர்க்கை உள்ளமை</translation> <translation id="230927227160767054">இந்தப் பக்கம் சேவை ஹேண்ட்லரை நிறுவ உள்ளது.</translation> <translation id="2309620859903500144">இந்தத் தளம் உங்கள் நகர்வு அல்லது ஒளி சென்சார்களை அணுகுவதிலிருந்து தடைசெய்யப்பட்டுள்ளது.</translation> <translation id="2315414688463285945">Linux கோப்புகளை உள்ளமைப்பதில் பிழை. மீண்டும் முயலவும்.</translation> @@ -944,10 +947,10 @@ <translation id="2428510569851653187">தாவல் சிதைந்த போது, நீங்கள் என்ன செய்து கொண்டிருந்தீர்கள் என்பதை விளக்கவும்</translation> <translation id="2431027948063157455">Google அசிஸ்டண்ட்டை ஏற்ற முடியவில்லை. உங்கள் நெட்வொர்க் இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation> <translation id="2432753757290432042">Linux (பீட்டா) புதுப்பிப்பு தேவை</translation> -<translation id="2433452467737464329">பக்கத்தைத் தானாகவே புதுப்பிக்க URL இல் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://network/?refresh=<sec></translation> +<translation id="2433452467737464329">பக்கத்தைத் தானாகவே புதுப்பிக்க URLலில் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://network/?refresh=<sec></translation> <translation id="2433507940547922241">தோற்றம்</translation> <translation id="2433836460518180625">சாதனத்தை மட்டும் திற</translation> -<translation id="2435248616906486374">பிணையம் துண்டிக்கப்பட்டது</translation> +<translation id="2435248616906486374">நெட்வொர்க் துண்டிக்கப்பட்டது</translation> <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation> <translation id="2436186046335138073">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation> <translation id="2436707352762155834">குறைந்தபட்சம்</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play ஸ்டோர் கணக்கு</translation> <translation id="2509495747794740764">அளவீட்டின் மதிப்பானது 10 முதல் 200க்கு இடையில் இருக்க வேண்டும்.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">படிவங்களைத் தானாக நிரப்பு</translation> <translation id="2513403576141822879">தனியுரிமை, பாதுகாப்பு, தரவுச் சேகரிப்பு ஆகியவற்றுடன் தொடர்புடைய மேலும் பல அமைப்புகளுக்கு, <ph name="BEGIN_LINK" />ஒத்திசைவும் Google சேவைகளும்<ph name="END_LINK" /> என்பதைப் பார்க்கவும்</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">ஸ்கேன் செய்</translation> @@ -1025,11 +1027,11 @@ <translation id="2538361623464451692">ஒத்திசைவு முடக்கப்பட்டது</translation> <translation id="2541002089857695151">முழுத்திரை அலைபரப்பலை மேம்படுத்தவா?</translation> <translation id="2542049655219295786">Google அட்டவணை</translation> -<translation id="2544853746127077729">அங்கீகரிப்புச் சான்றிதழ் பிணையத்தால் நிராகரிக்கப்பட்டது</translation> +<translation id="2544853746127077729">அங்கீகரிப்புச் சான்றிதழ் நெட்வொர்க்கால் நிராகரிக்கப்பட்டது</translation> <translation id="2547921442987553570"><ph name="EXTENSION_NAME" /> இல் சேர்</translation> <translation id="2550212893339833758">ஸ்வாப்டு மெமரி</translation> <translation id="2550596535588364872"><ph name="FILE_NAME" />ஐத் திறக்க <ph name="EXTENSION_NAME" />ஐ அனுமதிக்கவா?</translation> -<translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ஆல் <ph name="NETWORK_ID" /> உடன் இணைய முடியவில்லை. தயவுசெய்து மற்றொரு பிணையத்தைத் தேர்ந்தெடுங்கள் அல்லது மீண்டும் முயற்சி செய்யுங்கள்.</translation> +<translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ஆல் <ph name="NETWORK_ID" /> உடன் இணைய முடியவில்லை. மற்றொரு நெட்வொர்க்கைத் தேர்ந்தெடுங்கள் அல்லது மீண்டும் முயற்சி செய்யுங்கள்.</translation> <translation id="2553440850688409052">இந்தச் செருகுநிரலை மறை</translation> <translation id="2554553592469060349">தேர்ந்தெடுத்தக் கோப்பு மிகப் பெரியதாகும் (அதிகபட்ச அளவு: 3மெ.பை.).</translation> <translation id="2557899542277210112">விரைவு அணுகலுக்கு, உங்கள் புக்மார்க்ஸை புக்மார்க்ஸ் பட்டியில் இங்கே பொருத்துக.</translation> @@ -1045,7 +1047,7 @@ <translation id="257088987046510401">தீம்கள்</translation> <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> இல் படிப்பதற்கான அணுகல் வழங்கப்பட்டது.</translation> <translation id="2575247648642144396">நீட்டிப்பானது தற்போதைய பக்கத்தில் செயல்படும்போது, இந்த ஐகான் தெரியும். ஐகானில் கிளிக் செய்து அல்லது <ph name="EXTENSION_SHORTCUT" /> ஐ அழுத்தி இந்த நீட்டிப்பைப் பயன்படுத்துக.</translation> -<translation id="2575268751393592580">மொபைலைக் கண்டறிய முடியவில்லை. <ph name="DEVICE_TYPE" /> சாதனமானது வைஃபை அல்லது மொபைல் நெட்வொர்க்குடன் இணைக்கப்பட்டிருப்பதை உறுதிப்படுத்திக்கொள்ளவும். <a>மேலும் அறிக</a></translation> +<translation id="2575268751393592580">மொபைலைக் கண்டறிய முடியவில்லை. உங்கள் <ph name="DEVICE_TYPE" /> வைஃபை அல்லது மொபைல் நெட்வொர்க்குடன் இணைக்கப்பட்டிருப்பதை உறுதிப்படுத்திக்கொள்ளவும். <a>மேலும் அறிக</a></translation> <translation id="257779572837908839">சந்திப்புகளுக்கான Chromebox சாதனமாக அமை</translation> <translation id="2579575372772932244">சுயவிவரத்தை மீண்டும் உருவாக்குகிறது, காத்திருக்கவும்...</translation> <translation id="2580889980133367162">பல கோப்புகளைப் பதிவிறக்க எப்போதும் <ph name="HOST" /> ஐ அனுமதி</translation> @@ -1061,7 +1063,7 @@ <translation id="258932246702879617"><ph name="BEGIN_BOLD" />பணிப்பட்டியில் பொருத்து<ph name="END_BOLD" /> என்பதைத் தேர்ந்தெடுக்கவும்</translation> <translation id="259421303766146093">சிறிதாக்கு</translation> <translation id="2594999711683503743">Google இல் தேடவும் அல்லது URLஐ உள்ளிடவும்</translation> -<translation id="2597852038534460976">Chrome ஆல் வால்பேப்பர்களை அணுக முடியவில்லை. பிணையத்துடன் இணைக்கவும்.</translation> +<translation id="2597852038534460976">Chromeமால் வால்பேப்பர்களை அணுக முடியவில்லை. நெட்வொர்க்குடன் இணைக்கவும்.</translation> <translation id="2600115369439982409">கோப்புகள் மற்றும் நிரல்கள்:</translation> <translation id="2603115962224169880">கணினியைச் சுத்தமாக்கு</translation> <translation id="2603463522847370204">&மறைநிலை சாளரத்தில் திற</translation> @@ -1118,7 +1120,7 @@ <translation id="2667463864537187133">எழுத்துப் பிழை சரிபார்ப்பானை நிர்வகி</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome தாவலைப் பகிர்கிறது.</translation> <translation id="2670429602441959756">VR இல் இன்னும் ஆதரிக்கப்படாத அம்சங்கள், இந்தப் பக்கத்தில் உள்ளன. வெளியேறுகிறது...</translation> -<translation id="2670531586141364277">'<ph name="NAME" />' ஐச் செயல்படுத்துவதற்கு பிணைய இணைப்பு அவசியம்.</translation> +<translation id="2670531586141364277">'<ph name="NAME" />' இயக்கப் படுவதற்கு நெட்வொர்க் இணைப்பு அவசியம்.</translation> <translation id="2671451824761031126">உங்கள் புத்தகக்குறிகளும் அமைப்புகளும் தயாராக உள்ளன</translation> <translation id="2672142220933875349">தவறான crx கோப்பு, அசல் நிலைக்கு மாற்றுவது தோல்வி.</translation> <translation id="2672394958563893062">பிழை ஏற்பட்டது. ஆரம்பத்திலிருந்து மீண்டும் தொடங்க கிளிக் செய்க.</translation> @@ -1191,7 +1193,7 @@ <translation id="2772936498786524345">ஸ்னீக்கி</translation> <translation id="2773802008104670137">இது போன்ற கோப்புகள் உங்கள் கணினிக்குத் தீங்குவிளைவிக்கக்கூடும்.</translation> <translation id="2775104091073479743">கைரேகைகளை மாற்று</translation> -<translation id="2776441542064982094">பிணையத்தில் பதிவுசெய்வதற்கான சாதனங்கள் எதுவும் இல்லாததுபோல் தெரிகிறது. உங்கள் சாதனம் இயக்கத்தில் இருந்து இணையத்துடன் இணைக்கப்பட்டிருந்தால், அதன் வழிகாட்டி கையேட்டில் உள்ள வழிமுறைகளைப் பயன்படுத்தி பதிவுசெய்ய முயற்சிக்கவும்.</translation> +<translation id="2776441542064982094">நெட்வொர்க்கில் பதிவுசெய்வதற்கான சாதனங்கள் எதுவும் இல்லாததுபோல் தெரிகிறது. உங்கள் சாதனம் இயக்கத்தில் இருந்து இணையத்துடன் இணைக்கப்பட்டிருந்தால், அதன் வழிகாட்டிக் கையேட்டில் உள்ள வழிமுறைகளைப் பயன்படுத்தி பதிவுசெய்ய முயலவும்.</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">ஒரு Linux ஆப்ஸை நிறுவும்போது பிழை நேர்ந்தது</translation> <translation id="2783298271312924866">பதிவிறக்கப்பட்டது</translation> @@ -1230,7 +1232,7 @@ <translation id="2828650939514476812">வைஃபை நெட்வொர்க்குடன் இணை</translation> <translation id="2836269494620652131">செயலிழப்பு</translation> <translation id="2836635946302913370">இந்தப் பயனர்பெயரில் உள்நுழைவது, உங்களின் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation> -<translation id="283669119850230892">நெட்வொர்க் <ph name="NETWORK_ID" /> ஐப் பயன்படுத்த, முதலில் கீழே உள்ள இணையத்திற்கு உங்கள் இணைப்பை முடிக்கவும்.</translation> +<translation id="283669119850230892"><ph name="NETWORK_ID" /> நெட்வொர்க்கைப் பயன்படுத்த, முதலில் கீழே உள்ளபடி இணையத்தோடு இணைக்கவும்.</translation> <translation id="2838379631617906747">நிறுவுகிறது</translation> <translation id="2841837950101800123">வழங்குநர்</translation> <translation id="2843806747483486897">இயல்புநிலைக்கு மாற்று...</translation> @@ -1358,6 +1360,7 @@ <translation id="3020990233660977256">வரிசை எண்: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">சட்டக ஆதாரங்களைக் &காண்க</translation> <translation id="3022978424994383087">மொழிபெயர்க்க முடியவில்லை.</translation> +<translation id="3023464535986383522">பேசும் திரை</translation> <translation id="3024374909719388945">24-மணிநேர கடிகாரத்தைப் பயன்படுத்து</translation> <translation id="302781076327338683">தற்காலிகச் சேமிப்பைப் புறக்கணித்து மீண்டும் ஏற்று</translation> <translation id="3031417829280473749">ஏஜென்ட் X</translation> @@ -1488,7 +1491,7 @@ <translation id="3254434849914415189"><ph name="FILE_TYPE" /> கோப்புகளுக்கான இயல்புநிலை பயன்பாட்டைத் தேர்வுசெய்:</translation> <translation id="3254516606912442756">தானியங்கு நேர மண்டலத்தைக் கண்டறிதல் முடக்கப்பட்டது</translation> <translation id="3264544094376351444">Sans-Serif எழுத்துரு</translation> -<translation id="3264547943200567728">உங்கள் Chromebox இன் நெட்வொர்க்கை அமைக்க முடியவில்லை</translation> +<translation id="3264547943200567728">உங்கள் Chromeboxஸின் நெட்வொர்க்கை அமைக்க முடியவில்லை</translation> <translation id="3264582393905923483">சூழல்</translation> <translation id="3265459715026181080">சாளரத்தை மூடு</translation> <translation id="3267726687589094446">பல கோப்புகளைத் தானாக பதிவிறக்க, அனுமதிப்பதைத் தொடர்</translation> @@ -1564,7 +1567,7 @@ <translation id="3365598184818502391">கன்ட்ரோல் அல்லது ஆல்ட் விசையைப் பயன்படுத்தவும்</translation> <translation id="3367047597842238025">நீங்கள் விரும்பும் வகையில் <ph name="DEVICE_TYPE" />ஐ அமைத்து, அதன் அனைத்துச் சிறந்த அம்சங்களையும் மிக எளிதாகக் கண்டறியலாம்.</translation> <translation id="3368922792935385530">இணைக்கப்பட்டது</translation> -<translation id="3369624026883419694">ஹோஸ்ட் சிக்கலைத் தீர்க்கிறது...</translation> +<translation id="3369624026883419694">ஹோஸ்ட்டைக் கண்டறிகிறது...</translation> <translation id="337286756654493126">பயன்பாட்டில் நீங்கள் திறக்கும் கோப்புறைகளைப் படிக்கலாம்</translation> <translation id="3378503599595235699">நான் உலாவியிலிருந்து வெளியேறும்வரை அகத் தரவை மட்டுமே வைத்திரு</translation> <translation id="3378572629723696641">இந்த நீட்டிப்பு சேதமடைந்திருக்கலாம்.</translation> @@ -1692,7 +1695,7 @@ <translation id="3555812735919707620">நீட்டிப்பை அகற்று</translation> <translation id="3556000484321257665">தேடல் இன்ஜின் <ph name="URL" />க்கு மாற்றப்பட்டது.</translation> <translation id="3563432852173030730">கியோஸ்க் பயன்பாட்டைப் பதிவிறக்க முடியவில்லை.</translation> -<translation id="3564334271939054422">பயன்படுத்திக் கொண்டிருக்கும் வைஃபை நெட்வொர்க் <ph name="NETWORK_ID" />, அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்குமாறு கேட்கலாம்.</translation> +<translation id="3564334271939054422">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் வைஃபை நெட்வொர்க் <ph name="NETWORK_ID" />, அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்குமாறு கோரலாம்.</translation> <translation id="3564848315152754834">USB பாதுகாப்பு விசை</translation> <translation id="3566721612727112615">தளங்கள் எதுவும் சேர்க்கப்படவில்லை</translation> <translation id="3569382839528428029">உங்கள் திரையை <ph name="APP_NAME" /> பகிர்வதற்கு விரும்புகிறீர்களா?</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">அடுத்த உள்ளீட்டு முறை</translation> <translation id="3640214691812501263"><ph name="USER_NAME" />க்கு "<ph name="EXTENSION_NAME" />"ஐச் சேர்க்கவா?</translation> <translation id="3644896802912593514">அகலம்</translation> +<translation id="3645372836428131288">கைரேகையின் வேறொரு பகுதியைப் பதிவுசெய்ய, விரலைக் கொஞ்சம் நகர்த்தவும்.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> கண்டறியப்பட்டது</translation> <translation id="3649138363871392317">படம் எடுக்கப்பட்டது</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />"ஐ அணுக அனுமதி:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">சான்றிதழ் கொள்கைகள்</translation> <translation id="392089482157167418">ChromeVox (பேச்சுவடிவ கருத்து) ஐ இயக்கு</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">சமீபத்தில் எடுக்கப்பட்ட WebRTC பதிவுகள் உங்களிடம் இல்லை.</translation> <translation id="3925573269917483990">கேமரா:</translation> <translation id="3925842537050977900">அடுக்கிலிருந்துக் காட்டு</translation> <translation id="3926002189479431949">Smart Lock இன் ஃபோன் மாற்றப்பட்டது</translation> @@ -2008,7 +2011,7 @@ <translation id="4005817994523282006">நேர மண்டலம் கண்டறிதல் முறை</translation> <translation id="4008291085758151621">VR இல் தளத் தகவல் இல்லை</translation> <translation id="4010917659463429001">மொபைல் சாதனத்தில் உங்கள் புத்தகக்குறிகளைப் பெற, <ph name="GET_IOS_APP_LINK" />.</translation> -<translation id="4013132157686828973">"<ph name="CLIENT_NAME" />" இந்த உலாவியைப் பிழைத்திருத்தம் செய்கிறது</translation> +<translation id="4013132157686828973">"<ph name="CLIENT_NAME" />" இந்த உலாவியில் பிழைத் திருத்தம் செய்கிறது</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />"ஐப் புதுப்பிக்கவா?</translation> <translation id="4020106588733303597">அச்சச்சோ! கிடைக்கும் உரிமங்களை ஏற்ற முடியவில்லை.</translation> <translation id="4020327272915390518">விருப்பங்கள் மெனு</translation> @@ -2041,7 +2044,7 @@ <translation id="4058793769387728514">ஆவணத்தை இப்போது சரிபார்</translation> <translation id="406070391919917862">பின்புல ஆப்ஸ்</translation> <translation id="4063283930106169759">உங்கள் மொபைல் அருகில் இருப்பதை உறுதிப்படுத்திக்கொள்ளவும். மொபைலைக் கண்டறிய, உங்கள் கணக்கைக் கொண்டுள்ள எல்லாச் சாதனங்களிலும் புளூடூத் இயக்கப்படும். <a>மேலும் அறிக</a></translation> -<translation id="4065876735068446555">பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க் (<ph name="NETWORK_ID" />), அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்குமாறு கேட்கலாம்.</translation> +<translation id="4065876735068446555">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க் (<ph name="NETWORK_ID" />), அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்குமாறு கோரலாம்.</translation> <translation id="4068506536726151626">உங்கள் இருப்பிடத்தைத் தெரிந்து கொள்ளக் கூடிய பின்வரும் தளங்களின் கூறுகள் இந்தப் பக்கத்தில் உள்ளன:</translation> <translation id="4068776064906523561">சேமித்த கைரேகைகள்</translation> <translation id="407173827865827707">கிளிக் செய்யும் போது</translation> @@ -2144,9 +2147,9 @@ <translation id="424546999567421758">அதிக வட்டுப் பயன்பாடு கண்டுபிடிக்கப்பட்டது</translation> <translation id="424726838611654458">எப்போதும் Adobe Reader இல் திற</translation> <translation id="4247901771970415646"><ph name="USERNAME" />க்கு ஒத்திசைக்க முடியவில்லை</translation> -<translation id="4249248555939881673">பிணைய இணைப்பிற்காக காத்திருக்கிறது...</translation> +<translation id="4249248555939881673">நெட்வொர்க் இணைப்பிற்காகக் காத்திருக்கிறது...</translation> <translation id="4249373718504745892">உங்கள் கேமராவையும், மைக்ரோஃபோனையும் அணுகுவதிலிருந்து இந்தப் பக்கம் தடுக்கப்பட்டுள்ளது.</translation> -<translation id="424963718355121712">பயன்பாடுகள் எந்த ஹோஸ்ட்டை பாதிக்கின்றதோ, அந்த ஹோஸ்டில் இருந்தே அவை வழங்கப்பட வேண்டும்</translation> +<translation id="424963718355121712">ஆப்ஸ் எந்த ஹோஸ்ட்டை பாதிக்கின்றனவோ, அதிலிருந்தே வழங்கப்பட வேண்டும்</translation> <translation id="4250229828105606438">ஸ்கிரீன் ஷாட்</translation> <translation id="4250680216510889253">இல்லை</translation> <translation id="4252852543720145436">பாதுகாக்கப்படும் உள்ளடக்க அடையாளங்காட்டிகள்</translation> @@ -2196,7 +2199,7 @@ <translation id="4330437798887640816">அதிக ஒளி மாறுபாட்டுப் பயன்முறையை நிலைமாற்றும்</translation> <translation id="4333854382783149454">RSA குறியாக்கத்துடன் PKCS #1 SHA-1</translation> <translation id="4336032328163998280">நகலெடுக்கும் செயல்பாடு தோல்வி. <ph name="ERROR_MESSAGE" /></translation> -<translation id="4336979451636460645">நெட்வொர்க் பதிவுகளுக்கு, இதைப் பார்க்கவும்: <ph name="DEVICE_LOG_LINK" /></translation> +<translation id="4336979451636460645">நெட்வொர்க் பதிவுகளுக்கு இதைப் பார்க்கவும்: <ph name="DEVICE_LOG_LINK" /></translation> <translation id="4340515029017875942"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" பயன்பாட்டுடன் தொடர்புகொள்ள விழைகிறது</translation> <translation id="4342311272543222243">அச்சச்சோ, TPM பிழை.</translation> <translation id="4345587454538109430">உள்ளமை...</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">சரடோகா</translation> <translation id="4387004326333427325">அங்கீகரிப்புச் சான்றிதழ் தொலைநிலையில் நிராகரிக்கப்பட்டது</translation> <translation id="4389091756366370506">பயனர் <ph name="VALUE" /></translation> +<translation id="439266289085815679">புளூடூத் உள்ளமைவைக் கட்டுப்படுத்துபவர்: <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">முடக்கு</translation> <translation id="4400367121200150367">கடவுச்சொல்லை ஒருபோதும் சேமிக்க வேண்டாம் எனக் குறிக்கப்பட்ட தளங்கள் இங்கே தோன்றும்</translation> <translation id="4400632832271803360">மேல் வரிசையில் உள்ள விசைகளின் செயல்பாட்டை மாற்ற, தொடக்கி விசையைத் தொடர்ந்து அழுத்திப் பிடிக்கவும்</translation> @@ -2254,7 +2258,7 @@ <translation id="4441548209689510310">எழுத்துப் பிழை சரிபார்ப்பு விருப்பங்களைக் காட்டு</translation> <translation id="4442424173763614572">DNS தேடுதல் தோல்வி</translation> <translation id="4443536555189480885">&Help</translation> -<translation id="4444304522807523469">USB அல்லது பிற அக நெட்வொர்க் மூலம் இணைக்கப்பட்ட ஆவண ஸ்கேனர்களை அணுகுதல்</translation> +<translation id="4444304522807523469">USB அல்லது அக நெட்வொர்க் மூலம் இணைக்கப்பட்ட ஆவண ஸ்கேனர்களை அணுகுதல்</translation> <translation id="4444512841222467874">போதுமான இடம் காலியாக்கப்படவில்லை எனில், பயனர்களும் தரவும் தானாகவே அகற்றப்படலாம்.</translation> <translation id="4446933390699670756">பிரதிபலிக்கப்பட்டது</translation> <translation id="4448844063988177157">வைஃபை பிணையங்களைத் தேடுகிறது...</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">இந்தத் தளம், கிளிப்போர்டைப் பார்ப்பதைத் தொடர்ந்து அனுமதி</translation> <translation id="4530494379350999373">அசல்</translation> <translation id="4533985347672295764">CPU நேரம்</translation> +<translation id="4534661889221639075">மீண்டும் முயலவும்.</translation> <translation id="4535127706710932914">இயல்புநிலை சுயவிவரம்</translation> <translation id="4538417792467843292">சொல்லை நீக்கு</translation> <translation id="4538684596480161368">எப்போதும் <ph name="HOST" /> இல் சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தடு</translation> @@ -2473,7 +2478,7 @@ <translation id="480990236307250886">முகப்புப் பக்கத்தைத் திற</translation> <translation id="4812632551187706935">இணைப்பைத் துவக்க முடியவில்லை</translation> <translation id="4813136279048157860">எனது படங்கள்</translation> -<translation id="4813512666221746211">பிணைய பிழை</translation> +<translation id="4813512666221746211">நெட்வொர்க் பிழை</translation> <translation id="4816492930507672669">பக்கத்தில் பொருத்து</translation> <translation id="4820334425169212497">இல்லை, குறியீடு தெரியவில்லை</translation> <translation id="4821935166599369261">&சுயவிவரமாக்கம் இயக்கப்பட்டது</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">தானாகச் சரிசெய்</translation> <translation id="4880827082731008257">வரலாற்றில் தேடு</translation> <translation id="4881695831933465202">திற</translation> +<translation id="4882312758060467256">இந்தத் தளத்திற்கு அணுகலைப் பெற்றுள்ளது</translation> <translation id="4882473678324857464">புக்மார்க்குகளில் கவனம் செலுத்துக</translation> <translation id="4882831918239250449">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்துதல்</translation> <translation id="4883178195103750615">புக்மார்க்குகளை HTML கோப்பாக ஏற்றுமதி செய்க...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">ஆல்பம்</translation> <translation id="4971412780836297815">முடிந்ததும் திற</translation> <translation id="4972129977812092092">பிரிண்டரின் தகவலை மாற்று</translation> +<translation id="4972164225939028131">தவறான கடவுச்சொல்</translation> <translation id="497287958838527945">Google Payஐப் பயன்படுத்தும் கிரெடிட் கார்டுகள் மற்றும் முகவரிகள்.</translation> <translation id="4973307593867026061">அச்சுப்பொறிகளைச் சேர்</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> அல்லது அதற்குக் குறைவான எழுத்துக்குறிகள் உள்ள பெயரைப் பயன்படுத்தவும்</translation> @@ -2669,7 +2676,7 @@ <translation id="5088534251099454936">RSA குறியாக்கத்துடன் PKCS #1 SHA-512</translation> <translation id="509429900233858213">பிழை ஏற்பட்டது.</translation> <translation id="5094721898978802975">ஒண்றிணைந்த குறிப்பிட்ட சாதனத்திற்கான பயன்பாடுகளுடன் தொடர்புகொள்ளவும்</translation> -<translation id="5097002363526479830">'<ph name="NAME" />' நெட்வொர்க்குடன் இணைப்பதில் தோல்வி: <ph name="DETAILS" /> </translation> +<translation id="5097002363526479830">'<ph name="NAME" />' நெட்வொர்க்குடன் இணைய முடியவில்லை: <ph name="DETAILS" /></translation> <translation id="5099354524039520280">மேல்</translation> <translation id="5100114659116077956">புதிய அம்சங்களை வழங்குவதற்காக, Chromebox புதுப்பிக்கப்பட வேண்டும்.</translation> <translation id="5101042277149003567">புத்தகக்குறிகள் அனைத்தையும் திற</translation> @@ -2889,7 +2896,7 @@ <translation id="5422781158178868512">வெளிப்புற சேகரிப்பு சாதனத்தை அறிய முடியவில்லை. மன்னிக்கவும்.</translation> <translation id="5423849171846380976">செயலாக்கப்பட்டது</translation> <translation id="5425042808445046667">பதிவிறக்கத்தைத் தொடர்க</translation> -<translation id="5425722269016440406">இந்த அமைப்பு உங்கள் மொபைல் மற்றும் பிற சாதனங்களில் ஒத்திசைக்கப்பட்டுள்ளதால், Smart Lock ஐ முடக்க ஆன்லைனில் இருப்பது அவசியம். முதலில் நெட்வொர்க்குடன் இணைக்கவும்.</translation> +<translation id="5425722269016440406">Smart Lockகை முடக்க ஆன்லைனில் இருப்பது அவசியம். ஏனெனில் இந்த அமைப்பு உங்கள் மொபைலிலும் பிற சாதனங்களிலும் ஒத்திசைக்கப்பட்டுள்ளது. முதலில் நெட்வொர்க்குடன் இணைக்கவும்.</translation> <translation id="5425863515030416387">சாதனங்களில் எளிதில் உள்நுழையவும்</translation> <translation id="5426179911063097041"><ph name="SITE" /> உங்களுக்கு அறிவிப்புகளை அனுப்ப விரும்புகிறது</translation> <translation id="5427278936122846523">எப்போதும் மொழிபெயர்</translation> @@ -2971,7 +2978,7 @@ <translation id="5526701598901867718">எல்லாம் (பாதுகாப்பற்றது)</translation> <translation id="5526745900034778153">ஒத்திசைவைத் தொடர, மீண்டும் உள்நுழையவும்</translation> <translation id="5527463195266282916">நீட்டிப்பின் தரத்தைக் குறைக்க முயற்சித்தது.</translation> -<translation id="5527474464531963247">நீங்கள் மற்றொரு பிணையத்தையும் தேர்வு செய்யலாம்.</translation> +<translation id="5527474464531963247">நீங்கள் மற்றொரு நெட்வொர்க்கையும் தேர்வு செய்யலாம்.</translation> <translation id="5528368756083817449">புக்மார்க் நிர்வாகி</translation> <translation id="5530160549030561969">ஒவ்வொரு அம்சத்திற்கான அமைப்புகளை மதிப்பாய்வு செய்து, நீங்கள் மாற்ற விரும்பினால், அவற்றை மாற்றலாம்</translation> <translation id="5530766185686772672">மறைநிலை தாவல்களை மூடு</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">பயன்பாடுகளை ஏற்றுகிறது...</translation> <translation id="5592595402373377407">போதுமான தரவு இதுவரை கிடைக்கவில்லை.</translation> +<translation id="5593357315997824387">எனது கோப்புகளை ஒத்திசை</translation> <translation id="5595152862129936745">மிகவும் தொலைவு</translation> <translation id="5595485650161345191">முகவரியைத் திருத்து</translation> <translation id="5596627076506792578">கூடுதல் விருப்பங்கள்</translation> @@ -3049,7 +3057,7 @@ <translation id="5627676517703583263">Chromeஐப் பயன்படுத்தி, ஸ்மார்ட்டாக உலாவவும்</translation> <translation id="562935524653278697">புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளை ஒத்திசைப்பதை உங்கள் நிர்வாகி முடக்கியுள்ளார்.</translation> <translation id="563535393368633106">அணுகும் முன் கேள் (பரிந்துரைக்கப்படுகிறது)</translation> -<translation id="5636996382092289526"><ph name="NETWORK_ID" /> ஐப் பயன்படுத்த, நீங்கள் முதலில் சில வினாடிகளில் தானாகவே திறக்கும் <ph name="LINK_START" />நெட்வொர்க்கின் உள்நுழைவுப் பக்கத்தைப்<ph name="LINK_END" /> பார்வையிட வேண்டும். அது நடைபெறவில்லை எனில், நெட்வொர்க்கைப் பயன்படுத்த முடியாது.</translation> +<translation id="5636996382092289526"><ph name="NETWORK_ID" /> ஐப் பயன்படுத்த, நீங்கள் முதலில் <ph name="LINK_START" />நெட்வொர்க்கின் உள்நுழைவுப் பக்கத்தைப்<ph name="LINK_END" /> பார்வையிட வேண்டும். இது சில வினாடிகளில் தானாகவே திறக்கும். அது நடைபெறவில்லை எனில், நெட்வொர்க்கைப் பயன்படுத்த முடியாது.</translation> <translation id="5637476008227280525">மொபைல் டேட்டாவை இயக்கு</translation> <translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome இணைய அங்காடியில்<ph name="END_LINK" /> நீட்டிப்புகளையும் தீம்களையும் பெறுங்கள்</translation> <translation id="5638497698949808140">புதுப்பித்தது: <ph name="HOURS" />ம முன்பு</translation> @@ -3193,7 +3201,7 @@ <translation id="5854912040170951372">ஸ்லைஸ்</translation> <translation id="5855119960719984315">சாளரத்தை மாற்று</translation> <translation id="5855773610748894548">அச்சச்சோ, பாதுகாப்பு மாட்யூலில் பிழை.</translation> -<translation id="5856721540245522153">பிழைதிருத்த அம்சங்களை இயக்குதல்</translation> +<translation id="5856721540245522153">பிழைத் திருத்த அம்சங்களை இயக்குதல்</translation> <translation id="5857090052475505287">புதிய கோப்புறை</translation> <translation id="585979798156957858">வெளி மீத்தரவு விசை</translation> <translation id="5860033963881614850">ஆஃப்</translation> @@ -3305,7 +3313,7 @@ <translation id="6029587122245504742">குறைந்தபட்ச வேகம்</translation> <translation id="6032912588568283682">கோப்பு முறைமை</translation> <translation id="6034662038931255275">OS புதுப்பிக்கப்பட்டது</translation> -<translation id="6039651071822577588">பிணைய சொத்துக்கான அகராதி தவறான வடிவமைப்பில் உள்ளது</translation> +<translation id="6039651071822577588">நெட்வொர்க் பண்பு அகராதி தவறான வடிவமைப்பில் உள்ளது</translation> <translation id="604001903249547235">கிளவுடு காப்புப் பிரதி</translation> <translation id="6040143037577758943">மூடு</translation> <translation id="6040852767465482106">அநாமதேய அடையாளம்</translation> @@ -3470,7 +3478,7 @@ <translation id="6272643420381259437">செருகுநிரலைப் பதிவிறக்கும் போது, பிழை (<ph name="ERROR" />) ஏற்பட்டது</translation> <translation id="6273677812470008672">தரம்</translation> <translation id="6276301056778294989">சாதனமும் அதே குறியீட்டைக் காட்டுவதை உறுதிப்படுத்தவும்.</translation> -<translation id="6277105963844135994">பிணைய நேரம் முடிந்தது</translation> +<translation id="6277105963844135994">நெட்வொர்க் டைம்அவுட்</translation> <translation id="6277518330158259200">ஸ்கிரீன் ஷாட்டை எடு</translation> <translation id="6278057325678116358">GTK+ஐப் பயன்படுத்து</translation> <translation id="6279183038361895380">உங்கள் சுட்டியைக் காட்ட |<ph name="ACCELERATOR" />| என்பதை அழுத்தவும்</translation> @@ -3493,10 +3501,10 @@ <translation id="6308937455967653460">இணை&ப்பை இவ்வாறு சேமி…</translation> <translation id="6311220991371174222">Chromeஐத் தொடங்க முடியவில்லை. ஏனெனில், சுயவிவரத்தைத் திறக்கும் போது ஏதோ தவறாகிவிட்டது. Chromeஐ மீண்டும் தொடங்கவும்.</translation> <translation id="6312400084708441752">உங்கள் கணினியில் உள்ள தீங்கிழைக்கும் மென்பொருள், சாதன அமைப்புகள் மற்றும் செயல்முறைகள் பற்றிய தகவல் அடங்கும்</translation> -<translation id="6312403991423642364">அறியப்படாத பிணையப் பிழை</translation> +<translation id="6312403991423642364">அறியப்படாத நெட்வொர்க் பிழை</translation> <translation id="6313320178014547270">இந்த இணையதளத்தில் பதிவுசெய்யப்படாத பாதுகாப்பு விசையைப் பயன்படுத்துகிறீர்கள்</translation> <translation id="6313641880021325787">VR இலிருந்து வெளியேறு</translation> -<translation id="6314819609899340042">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தின் பிழைதிருத்த அம்சங்களை வெற்றிகரமாக இயக்கிவிட்டீர்கள்.</translation> +<translation id="6314819609899340042">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத் திருத்த அம்சங்களை வெற்றிகரமாக இயக்கிவிட்டீர்கள்.</translation> <translation id="6315493146179903667">அனைத்தையும் முதலில் வை</translation> <translation id="6316806695097060329">இந்த <ph name="SHORT_PRODUCT_NAME" /> சாதனம் உங்களுக்குச் சிறந்த இணைய அனுபவத்தை வழங்கும்படி வடிவமைக்கப்பட்டுள்ளது.</translation> <translation id="6317318380444133405">இனி ஆதரிக்கப்படாது.</translation> @@ -3508,15 +3516,15 @@ <translation id="6326855256003666642">கீப்அலைவ் கவுண்ட்</translation> <translation id="632744581670418035">விசைப்பலகை மேல்தோற்றம்</translation> <translation id="6327785803543103246">இணைய ப்ராக்ஸியைத் தானாகக் கண்டறி</translation> -<translation id="6333064448949140209">பிழைத்திருத்தத்திற்காக, Googleக்குக் கோப்பு அனுப்பப்படும்</translation> +<translation id="6333064448949140209">கோப்பு பிழைத் திருத்தத்திற்காக Googleளுக்கு அனுப்பப்படும்</translation> <translation id="6333834492048057036">தேடலிற்காக முகவரி பட்டியைக் கவனி</translation> <translation id="6336451774241870485">புதிய மறைநிலைத் தாவல்</translation> <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" />க்குப் புதிய சுயவிவரத்தை உருவாக்கு</translation> -<translation id="6340017061976355871">சேவையகத்துடன் இணைக்க முடியவில்லை. நெட்வொர்க் இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும். சிக்கல் தொடர்ந்தால், Chromebookஐ மீண்டும் தொடங்கவும்.</translation> +<translation id="6340017061976355871">சேவையகத்துடன் இணைக்க முடியவில்லை. நெட்வொர்க் இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும். சிக்கல் தொடர்ந்தால், Chromebookகை மீண்டும் தொடங்கவும்.</translation> <translation id="6340071272923955280">இன்டர்நெட் பிரிண்டிங் புரோட்டோகால் (IPPS)</translation> <translation id="6341850831632289108">உங்கள் நிஜ இருப்பிடத்தைக் கண்டறியலாம்</translation> <translation id="634208815998129842">காரிய நிர்வாகி</translation> -<translation id="6344170822609224263">பிணைய இணைப்புகளின் பட்டியலை அணுகு</translation> +<translation id="6344170822609224263">நெட்வொர்க் இணைப்புகளின் பட்டியலை அணுகு</translation> <translation id="6346310558342052870">அணுகல் கட்டுப்படுத்தப்பட்டுள்ளது</translation> <translation id="6349170655202535379">ஒத்திசைவு வேலை செய்யவில்லை. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation> <translation id="6351063337294363751">உலாவல் தரவை இந்த மெனுவிலிருந்து அழிக்கலாம்</translation> @@ -3618,7 +3626,7 @@ <translation id="6494445798847293442">சான்றளிக்கும் அங்கீகாரம் அல்ல</translation> <translation id="649454645705377674">மூடு</translation> <translation id="6498249116389603658">&உங்கள் எல்லா மொழிகளும்</translation> -<translation id="6499143127267478107">ப்ராக்ஸி ஸ்கிரிப்டில் ஹோஸ்டைக் கண்டறிகிறது...</translation> +<translation id="6499143127267478107">ப்ராக்ஸி ஸ்கிரிப்டில் ஹோஸ்ட்டைக் கண்டறிகிறது...</translation> <translation id="6499681088828539489">பகிர்ந்த நெட்வொர்க்குகளுக்கு ப்ராக்ஸிகளை அனுமதிக்காதே</translation> <translation id="6503077044568424649">அதிகமாகப் பார்வையிடப்பட்டது</translation> <translation id="6504611359718185067">பிரிண்டரைச் சேர்க்க, இணையத்துடன் இணைக்கவும்</translation> @@ -3627,7 +3635,7 @@ <translation id="6508261954199872201">பயன்பாடு: <ph name="APP_NAME" /></translation> <translation id="6509207748479174212">மீடியா உரிமம்</translation> <translation id="6510568984200103950">குறைவான அமைப்புகள்</translation> -<translation id="6513247462497316522">வேறு பிணையத்துடன் நீங்கள் இணைந்திருக்காதபோது மொபைல் டேட்டாவை Google Chrome பயன்படுத்தும்.</translation> +<translation id="6513247462497316522">நீங்கள் வேறு நெட்வொர்க்குடன் இணையாதபோது Google Chrome மொபைல் டேட்டாவைப் பயன்படுத்தும்.</translation> <translation id="6514010653036109809">இணைப்பதற்கு உள்ள சாதனம்:</translation> <translation id="6514565641373682518">இந்தப் பக்கம் உங்களுடைய இடஞ்சுட்டியை முடக்கியுள்ளது.</translation> <translation id="6518014396551869914">படத்தை நகலெ&டு</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">எதிர்பாராதவிதமாக, உங்கள் கணினியானது ஒரு தவறான வன்பொருள் ஐடியுடன் உள்ளமைக்கப்பட்டது. இதனால் சமீபத்திய பாதுகாப்பு திருத்தங்கள் மூலம் Chrome OS ஐப் புதுப்பிப்பதிலிருந்து தடுக்கும், உங்கள் கணினி <ph name="BEGIN_BOLD" />தீங்கிழைக்கும் தாக்குதல்களின்<ph name="END_BOLD" /> மூலம் பாதிக்கப்படலாம்.</translation> <translation id="6664774537677393800">சுயவிவரத்தைத் திறக்கும் போது, ஏதோ தவறாகிவிட்டது. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">டைமரை நிறுத்து</translation> <translation id="667517062706956822">இந்தப் பக்கத்தை <ph name="SOURCE_LANGUAGE" /> மொழியிலிருந்து <ph name="TARGET_LANGUAGE" /> மொழிக்கு Google மொழிபெயர்க்க வேண்டும் என விரும்புகிறீர்களா?</translation> <translation id="6675665718701918026">சுட்டும் சாதனம் இணைக்கப்பட்டது</translation> <translation id="6678717876183468697">வினவல் URL</translation> @@ -4045,7 +4054,7 @@ <translation id="7154130902455071009">உங்கள் தொடக்கப் பக்கத்தை இதற்கு மாற்றவும்: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">கேமரா அல்லது கோப்பிலிருக்கும் படம்</translation> <translation id="7156235233373189579">Windows மென்பொருள் பயன்படுத்தும் கணினிக்காக இந்தக் கோப்பு வடிவமைக்கப்பட்டது. இது Chrome OS இல் இயங்கும் உங்கள் சாதனத்திற்கு ஏற்றதல்ல. சரியான மாற்று பயன்பாட்டிற்காக <ph name="BEGIN_LINK" />Chrome இணைய அங்காடியில்<ph name="END_LINK" /> தேடவும்.<ph name="BEGIN_LINK_HELP" />மேலும் அறிக<ph name="END_LINK_HELP" /></translation> -<translation id="7165320105431587207">பிணையத்தை உள்ளமைப்பது தோல்வியடைந்தது</translation> +<translation id="7165320105431587207">நெட்வொர்க் உள்ளமைவு தோல்வியடைந்தது</translation> <translation id="716640248772308851">தேர்வுசெய்யப்பட்ட இடங்களில் உள்ள படங்கள், வீடியோ மற்றும் ஒலி கோப்புகள் ஆகியவற்றை "<ph name="EXTENSION" />" ஆல் படிக்க முடியும்.</translation> <translation id="7167486101654761064">&எப்போதும் இந்த வகை கோப்புகளைத் திற</translation> <translation id="716810439572026343"><ph name="FILE_NAME" />ஐப் பதிவிறக்குகிறது</translation> @@ -4060,13 +4069,14 @@ <translation id="7186088072322679094">கருவிப்பட்டியில் வை</translation> <translation id="7187428571767585875">அகற்ற வேண்டிய அல்லது மாற்ற வேண்டிய பதிவக உள்ளீடுகள்:</translation> <translation id="7189234443051076392">சாதனத்தில் போதுமான சேமிப்பிடம் இருப்பதை உறுதிப்படுத்திக்கொள்ளவும்</translation> +<translation id="7189965711416741966">கைரேகை சேர்க்கப்பட்டது.</translation> <translation id="7191159667348037">அறியப்படாத பிரிண்டர் (USB)</translation> <translation id="7191454237977785534">கோப்பை இவ்வாறு சேமி </translation> <translation id="7193374945610105795"><ph name="ORIGIN" />க்குக் கடவுச்சொற்கள் எதுவும் சேமிக்கப்படவில்லை</translation> <translation id="7196835305346730603">அருகிலுள்ள Chromeboxகளைத் தேடுகிறது...</translation> -<translation id="7197160646667308890"><ph name="BEGIN_PARAGRAPH1" />உங்கள் சாதனம் மற்றும் அதை நீங்கள் பயன்படுத்தும் விதம் (எ.கா: பேட்டரி நிலை, பயன்பாட்டு உபயோகம், நெட்வொர்க் இணைப்புநிலை) குறித்த பொதுவான தகவல் இதுவாகும். எல்லோருக்காகவும் Google இன் தயாரிப்புகளையும் சேவைகளையும் மேம்படுத்த, தரவு பயன்படுத்தப்படும். ஒருங்கிணைக்கப்பட்ட சில தகவலானது கூட்டாளர்கள் (எ.கா. Android டெவெலப்பர்கள்) தங்கள் பயன்பாடுகளையும் தயாரிப்புகளையும் மேலும் சிறப்பாக்க உதவும்.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />இந்த அம்சத்தை முடக்குவதால், சாதனப் புதுப்பிப்புகள், பாதுகாப்பு போன்ற அத்தியாவசிய சேவைகளைப் பெறத் தேவைப்படும் தகவலை அனுப்புவதற்கான சாதனத் திறனில் பாதிப்பு ஏற்படாது.<ph name="END_PARAGRAPH2" /> - <ph name="BEGIN_PARAGRAPH3" />அமைப்புகள் > Google என்பதற்குச் சென்று, இந்த அம்சத்தைக் கட்டுப்படுத்தலாம். மெனுவிலிருந்து உபயோகம் & பிழை அறிக்கைகள் என்பதைத் தேர்ந்தெடுக்கவும்.<ph name="END_PARAGRAPH3" /></translation> +<translation id="7197160646667308890"><ph name="BEGIN_PARAGRAPH1" />இது உங்கள் சாதனம் மற்றும் அதை நீங்கள் பயன்படுத்தும் விதம் (எ.கா: பேட்டரி நிலை, ஆப்ஸ் உபயோகம், நெட்வொர்க் இணைப்புநிலை) குறித்த பொதுவான தகவல் ஆகும். Google தயாரிப்புகளையும் சேவைகளையும் அனைவருக்கும் மேம்படுத்த இந்தத் தரவு பயன்படுத்தப்படும். ஒருங்கிணைக்கப்பட்ட சில தகவல்கள் Android டெவெலப்பர்களைப் போன்ற கூட்டாளர்களுக்குத் தங்கள் ஆப்ஸையும் தயாரிப்புகளையும் மேலும் சிறப்பாக்கக் கூட உதவும்.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />இந்த அம்சத்தை முடக்குவதால் சாதனப் புதுப்பிப்புகள், பாதுகாப்பு போன்ற அத்தியாவசிய சேவைகளைப் பெறத் தேவைப்படும் தகவலை சாதனம் அனுப்புவது பாதிக்கப்படாது.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />'அமைப்புகள் > Google' என்பதற்குச் சென்று இந்த அம்சத்தைக் கட்டுப்படுத்தலாம். மெனுவிலிருந்து 'உபயோகம் & பிழை அறிக்கைகள்' என்பதைத் தேர்ந்தெடுக்கவும்.<ph name="END_PARAGRAPH3" /></translation> <translation id="7197632491113152433">உங்கள் கணக்கிலிருந்து, இந்தச் சாதனத்தில் பயன்படுத்தக் கூடிய <ph name="NUMBER_OF_APPS" /> ஆப்ஸைக் கண்டறிந்துள்ளோம்.</translation> <translation id="7199158086730159431">உதவி பெறுக</translation> <translation id="7200083590239651963">உள்ளமைவைத் தேர்ந்தெடுக்கவும்</translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">புதிய சாளரம்</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" />, இப்போது முழுத் திரையில் உள்ளது.</translation> <translation id="7340650977506865820">தளமானது உங்கள் திரையைப் பகிர்கிறது</translation> +<translation id="7341834142292923918">இந்தத் தளத்திற்கு அணுகலைக் கோருகிறது</translation> <translation id="7345706641791090287">கடவுச்சொல்லை உறுதிப்படுத்தவும்</translation> <translation id="7346909386216857016">சரி, புரிந்தது</translation> <translation id="7347751611463936647">இந்த நீட்டிப்பைப் பயன்படுத்துவதற்கு, "<ph name="EXTENSION_KEYWORD" />", எனத் தட்டச்சு செய்து TAB ஐ அழுத்தி, பின்னர் உங்கள் கட்டளை அல்லது தேடலைத் தட்டச்சு செய்க.</translation> @@ -4203,7 +4214,7 @@ <translation id="741204030948306876">ஏற்கிறேன்</translation> <translation id="7412226954991670867">GPU நினைவகம்</translation> <translation id="7414464185801331860">18x</translation> -<translation id="7416362041876611053">அறியாத பிணையப் பிழை.</translation> +<translation id="7416362041876611053">அறியப்படாத நெட்வொர்க் பிழை.</translation> <translation id="7417705661718309329">Google வரைபடம்</translation> <translation id="741906494724992817">இந்தப் பயன்பாட்டிற்கு சிறப்பு அனுமதிகள் தேவையில்லை.</translation> <translation id="7421925624202799674">&பக்கத்தின் ஆதாரத்தைக் காண்க</translation> @@ -4229,7 +4240,7 @@ <translation id="7465778193084373987">Netscape சான்றிதழ் தளர்த்தல் URL</translation> <translation id="7469406957790636836">இதை இயக்க, முதலில் <ph name="BEGIN_LINK" />மொழிகள் மற்றும் உள்ளீடு<ph name="END_LINK" /> என்பதில் எழுத்துப் பிழை சரிபார்ப்பானை இயக்கவும்</translation> <translation id="7469518857922439236">இந்தக் கம்ப்யூட்டரை இயல்பாக நினைவில் வைத்து, மெசேஜஸ் அறிவிப்புகளை அனுப்பும்</translation> -<translation id="7469894403370665791">இந்த பிணையத்துடன் தானாகவே இணைக்கவும்</translation> +<translation id="7469894403370665791">இந்த நெட்வொர்க்குடன் தானாகவே இணைக்கவும்</translation> <translation id="747114903913869239">பிழை: நீட்டிப்பை குறி இறக்கம் செய்ய முடியவில்லை</translation> <translation id="7473891865547856676">வேண்டாம் நன்றி</translation> <translation id="747459581954555080">எல்லாம் மீட்டெடு</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />இந்தச் சாதனத்தின் இருப்பிடத்தைக் கண்டறிவதற்கு உதவியாக, வைஃபை, மொபைல் நெட்வொர்க்குகள், சென்சார்கள் போன்றவற்றை Google இருப்பிடச் சேவை பயன்படுத்தும்.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />சாதனத்தில் முதன்மை இருப்பிட அமைப்பை முடக்குவதன் மூலம், இருப்பிடத்தை முடக்கலாம். அத்துடன், இருப்பிடத்தைக் கண்டறிவதற்காக வைஃபை, மொபைல் நெட்வொர்க்குகள், சென்சார்கள் ஆகியவை பயன்படுத்தப்படுவதை இருப்பிட அமைப்புகளில் முடக்கலாம்.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">கடவுச்சொல்லை உருவாக்கு -</translation> -<translation id="7518150891539970662">WebRTC பதிவுகள் (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">உருவாக்கு</translation> <translation id="7529411698175791732">இணைய இணைப்பைச் சரிபார்க்கவும். சிக்கல் தொடர்ந்தால், வெளியேறி மீண்டும் உள்நுழையவும்.</translation> @@ -4279,9 +4289,9 @@ <translation id="7537601449003285327">பணிப்பட்டியில் பொருத்து</translation> <translation id="7539856059004947393">புளூடூத் பாதுகாப்பு விசை</translation> <translation id="7540972813190816353">புதுப்பிப்பதற்கு தேர்வுசெய்யும்போது பிழை ஏற்பட்டது: <ph name="ERROR" /></translation> -<translation id="7543104066686362383">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைதிருத்த அம்சங்களை இயக்கும்</translation> +<translation id="7543104066686362383">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத் திருத்த அம்சங்களை இயக்கும்</translation> <translation id="7544853251252956727">கலை</translation> -<translation id="7547317915858803630">எச்சரிக்கை: உங்கள் <ph name="PRODUCT_NAME" /> அமைப்புகள் பிணைய இயக்ககத்தில் சேமிக்கப்பட்டுள்ளன. இதனால் வேகம் குறைக்கலாம், சிதையலாம் அல்லது தரவை கூட இழக்கலாம்.</translation> +<translation id="7547317915858803630">எச்சரிக்கை: உங்கள் <ph name="PRODUCT_NAME" /> அமைப்புகள் நெட்வொர்க் டிரைவில் சேமிக்கப்பட்டுள்ளன. இதனால் வேகம் குறைதல், சிதைவுகள் அல்லது தரவு இழப்பு கூட ஏற்படலாம்.</translation> <translation id="7548856833046333824">லெமனேட்</translation> <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை</translation> @@ -4306,7 +4316,7 @@ <translation id="7579149537961810247">தளங்களில் ஒலியடக்கு</translation> <translation id="7580671184200851182">எல்லா ஸ்பீக்கர்களிலும் ஒரே ஆடியோவை இயக்கு (மோனோ ஆடியோ)</translation> <translation id="7581462281756524039">சுத்திகரிப்புக் கருவி</translation> -<translation id="7582582252461552277">இந்தப் பிணையத்திற்கு முன்னுரிமை வழங்குக</translation> +<translation id="7582582252461552277">இந்த நெட்வொர்க்குக்கு முன்னுரிமை வழங்குக</translation> <translation id="7586498138629385861">Chrome பயன்பாடுகள் திறக்கப்பட்டிருக்கும்போதும், Chrome தொடர்ந்து இயங்கும்.</translation> <translation id="7589461650300748890">கவனமாக இருக்கவும்.</translation> <translation id="7589661784326793847">ஒரு வினாடி காத்திருக்கவும்</translation> @@ -4392,7 +4402,7 @@ <translation id="7728668285692163452">சேனல் மாற்றம் பின்னர் பயன்படுத்தப்படும்</translation> <translation id="7730449930968088409">உங்கள் திரையின் உள்ளடக்கத்தைப் பதிவுசெய்யலாம்</translation> <translation id="7730494089396812859">கிளவுடு காப்புப் பிரதி விவரங்களைக் காட்டு</translation> -<translation id="7732111077498238432">கொள்கையால் நெட்வொர்க் கட்டுப்படுத்தப்படுகிறது</translation> +<translation id="7732111077498238432">இது கொள்கையால் கட்டுப்படுத்தப்படும் நெட்வொர்க்</translation> <translation id="7737238973539693982">Linuxஸை (பீட்டா) நீக்கு</translation> <translation id="773905249182896430">ஆபத்தான தளங்களிலிருந்து உங்களையும் உங்கள் சாதனத்தையும் பாதுகாக்கும்</translation> <translation id="7740996059027112821">நிலையானது</translation> @@ -4459,24 +4469,28 @@ <ph name="LINE_BREAK2" /> குறைவான படங்களைத் தேர்ந்தெடுத்து முயலவும்.</translation> <translation id="782590969421016895">தற்போதைய பக்கங்களைப் பயன்படுத்து</translation> -<translation id="7826790948326204519"><ph name="BEGIN_H3" />பிழைத்திருத்த அம்சங்கள்<ph name="END_H3" /> +<translation id="7826790948326204519"><ph name="BEGIN_H3" />பிழைத் திருத்த அம்சங்கள்<ph name="END_H3" /> <ph name="BR" /> - உங்கள் சாதனத்தில் தனிப்பயன் குறியீட்டை நிறுவி, சோதனை செய்வதற்கு, Chrome OS சாதனத்தில் பிழைத்திருத்த அம்சங்களை இயக்கலாம். இதனால் நீங்கள் இவற்றைச் செய்யலாம்:<ph name="BR" /> + உங்கள் சாதனத்தில் தனிப்பயன் குறியீட்டை நிறுவி, சோதனை செய்வதற்கு உங்கள் Chrome OS சாதனத்தில் பிழைத் திருத்த அம்சங்களை இயக்கலாம். இதனால் நீங்கள் இவற்றைச் செய்யலாம்:<ph name="BR" /> <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />OS கோப்புகளை மாற்றுவதற்காக, rootfs சரிபார்ப்பை அகற்றலாம் - <ph name="LIST_ITEM" />வழக்கமான சோதனை விசைகளைப் பயன்படுத்தி சாதனத்திற்கான SSH அணுகலை இயக்கலாம், இதன் மூலம் <ph name="BEGIN_CODE" />'கிராஸ் ஃபிளாஷ்'<ph name="END_CODE" /> போன்ற கருவிகளைப் பயன்படுத்தி சாதனத்தை அணுகலாம் - <ph name="LIST_ITEM" />USB இலிருந்து பூட் செய்யும் அம்சத்தை இயக்கலாம், இதன் மூலம் USB டிரைவிலிருந்து OS பிரதியை நிறுவலாம் - <ph name="LIST_ITEM" />dev மற்றும் முறைமை ரூட் உள்நுழைவுக் கடவுச்சொல் ஆகிய இரண்டையும் தனிப்பயன் மதிப்பிற்கு அமைக்கலாம், இதன் மூலம் சாதனத்தை கைமுறையாக SSH மூலம் அணுகலாம் + + <ph name="LIST_ITEM" />வழக்கமான சோதனை விசைகளைப் பயன்படுத்தி சாதனத்திற்கான SSH அணுகலை இயக்கலாம், இதன் மூலம் <ph name="BEGIN_CODE" />'cros flash'<ph name="END_CODE" /> போன்ற கருவிகளைப் பயன்படுத்தி சாதனத்தை அணுகலாம் + <ph name="LIST_ITEM" />USBயிலிருந்து பூட் செய்யும் அம்சத்தை இயக்கி USB டிரைவிலிருந்து OS பிரதியை நிறுவலாம் + + <ph name="LIST_ITEM" />dev மற்றும் சிஸ்டம் ரூட் உள்நுழைவுக் கடவுச்சொற்களைத் தனிப்பயன் மதிப்பிற்கு அமைத்து சாதனத்தைக் கைமுறையாக SSH மூலம் அணுகலாம் + <ph name="END_LIST" /> <ph name="BR" /> - இதை இயக்கிவிட்டால், பெரும்பாலான பிழைத்திருத்த அம்சங்கள், நிறுவனத்தால் நிர்வகிக்கப்படும் சாதனத்தில் பவர்வாஷ் அல்லது தரவை அழித்த பிறகும் கூட இயக்கப்பட்டே இருக்கும். பிழைத்திருத்த அம்சங்களை முழுமையாக முடக்க, Chrome OS மீட்டெடுப்புச் செயல்முறையை மேற்கொள்ளவும் (https://support.google.com/chromebook/answer/1080595). + ஒருமுறை இயக்கிவிட்டால், பெரும்பாலான பிழைத் திருத்த அம்சங்கள், நிறுவனத்தால் நிர்வகிக்கப்படும் சாதனத்தில் பவர்வாஷ் செய்தாலும் தரவை அழித்தாலும் கூட இயக்கப்பட்டே இருக்கும். பிழைத் திருத்த அம்சங்களை முழுமையாக முடக்க, Chrome OS மீட்டெடுப்புச் செயல்முறையை நிறைவு செய்யவும் (https://support.google.com/chromebook/answer/1080595) +. <ph name="BR" /> <ph name="BR" /> - பிழைத்திருத்த அம்சங்களைப் பற்றிய மேலும் தகவல்களுக்கு இந்த இணைப்பைப் பார்க்கவும்:<ph name="BR" /> + பிழைத் திருத்த அம்சங்களைப் பற்றிய மேலும் தகவல்களுக்கு இந்த இணைப்பைப் பார்க்கவும்:<ph name="BR" /> https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/debugging-features <ph name="BR" /> <ph name="BR" /> - <ph name="BEGIN_BOLD" />குறிப்பு:<ph name="END_BOLD" /> செயல்முறையின் போது சாதனம் மறுதொடக்கம் செய்யப்படும்.</translation> + <ph name="BEGIN_BOLD" />குறிப்பு:<ph name="END_BOLD" /> செயல்முறையின் போது சாதனம் மீண்டும் தொடங்கும்.</translation> <translation id="7829298379596169484">ஆடியோ உள்ளீட்டை அணுகுகிறது</translation> <translation id="7831491651892296503">நெட்வொர்க்கை உள்ளமைப்பதில் பிழை</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> @@ -4723,7 +4737,7 @@ இந்தத் தளம் தடைசெய்யப்பட வேண்டும் என நான் நினைக்கவில்லை!</translation> <translation id="8184288427634747179"><ph name="AVATAR_NAME" />க்கு மாறு</translation> <translation id="8184318863960255706">மேலும் தகவல்</translation> -<translation id="8185331656081929126">பிணையத்தில் புதிய பிரிண்டர்கள் கண்டறியப்படும்போது அறிவிப்புகளைக் காட்டு</translation> +<translation id="8185331656081929126">நெட்வொர்க்கில் புதிய பிரிண்டர்கள் கண்டறியப்படும்போது அறிவிப்புகளைக் காட்டு</translation> <translation id="8186609076106987817">சேவையகத்தால் கோப்பை கண்டறிய முடியவில்லை.</translation> <translation id="8188120771410500975">&உரைப் புலங்களில் எழுத்துப்பிழை உள்ளதா எனச் சரிபார்</translation> <translation id="8188389033983459049">தொடர்வதற்கு, சாதன அமைப்புகளைச் சரிபார்த்து, புளூடூத்தை இயக்கவும்</translation> @@ -4745,6 +4759,7 @@ <translation id="8214962590150211830">இவரை அகற்று</translation> <translation id="8217399928341212914">பல கோப்புகள் தானாகப் பதிவிறக்கப்படுவதைத் தொடர்ந்து தடு</translation> <translation id="8223479393428528563">இந்தக் கோப்புகளை ஆஃப்லைனில் பயன்படுத்துவதற்காக சேமிக்க, ஆன்லைனிற்கு சென்று, கோப்புகளில் வலது-கிளிக் செய்து, <ph name="OFFLINE_CHECKBOX_NAME" /> விருப்பத்தைத் தேர்தெடுக்கவும்.</translation> +<translation id="8225753906568652947">உங்கள் சலுகைகளை ரீடீம் செய்க</translation> <translation id="8226222018808695353">தடுக்கப்பட்டது</translation> <translation id="8226619461731305576">வரிசை</translation> <translation id="8226742006292257240">உங்கள் கணினிக்கு ஒதுக்கப்பட்ட, தோராயமாக உருவாக்கப்பட்ட TPM கடவுச்சொல் பின்வருமாறு:</translation> @@ -4791,6 +4806,7 @@ <translation id="8286036467436129157">உள்நுழை</translation> <translation id="8286963743045814739">மறைநிலைச் சாளரத்தைப் பயன்படுத்தி, தனிப்பட்ட முறையில் உலாவலாம்</translation> <translation id="82871696630048499">நினைவகம் குறைவாக உள்ளதால் இணையப் பக்கம் ரெஃப்ரெஷ் செய்யப்பட்டது.</translation> +<translation id="8288032458496410887"><ph name="APP" />ஐ நிறுவல்நீக்கு...</translation> <translation id="8291967909914612644">உள்நாட்டு மொபைல் சேவை வழங்குநரின் நாடு</translation> <translation id="8294431847097064396">மூலம்</translation> <translation id="8297006494302853456">வலுவாக இல்லை</translation> @@ -4824,7 +4840,7 @@ <translation id="8362993567435070757">உங்கள் விசையின் பின்புறத்தில் உள்ள 6 இலக்க பின்னைக் கண்டறியவும்</translation> <translation id="8363095875018065315">நிலையானது</translation> <translation id="8363142353806532503">மைக்ரோஃபோன் தடுக்கப்பட்டது</translation> -<translation id="8366396658833131068">உங்கள் நெட்வொர்க் இணைப்பு மீட்டெடுக்கப்பட்டது. உங்கள் kiosk பயன்பாட்டைத் தொடங்க, வேறு நெட்வொர்க்கைத் தேர்ந்தெடுக்கவும் அல்லது கீழேயுள்ள 'தொடரவும்' பொத்தானை அழுத்தவும்.</translation> +<translation id="8366396658833131068">உங்கள் நெட்வொர்க் இணைப்பு மீட்டெடுக்கப்பட்டது. உங்கள் kiosk ஆப்ஸைத் தொடங்க வேறு நெட்வொர்க்கைத் தேர்ந்தெடுக்கவும் அல்லது கீழேயுள்ள 'தொடரவும்' என்ற பட்டனை அழுத்தவும்.</translation> <translation id="8366947248864804596">மொபைல் திறக்கப்பட்டு அருகில் இருக்கும் போது, Chromebook சாதனத்தைத் திறக்க, அதற்கான விருப்பத்தைத் தேர்ந்தெடுத்தால் போதும். இல்லை எனில், கடவுச்சொல் அல்லது பின்னை உள்ளிடவும்.</translation> <translation id="8368859634510605990">புக்மார்க்ஸ் அனைத்தையும் &திற</translation> <translation id="8371695176452482769">இப்போது பேசுக</translation> @@ -4852,6 +4868,7 @@ <translation id="8413385045638830869">முதலில் கேள் (பரிந்துரைத்தது)</translation> <translation id="8418445294933751433">தாவலாக &காண்பி</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' உடன் பொருந்தும் தேடல் முடிவுகள்</translation> +<translation id="8419368276599091549">உங்கள் <ph name="DEVICE_TYPE" />க்கு வரவேற்கிறோம்!</translation> <translation id="8420060421540670057">Google டாக்ஸ் கோப்புகளைக் காண்பி</translation> <translation id="8424039430705546751">கீழ்</translation> <translation id="8425213833346101688">மாற்று</translation> @@ -4882,7 +4899,7 @@ <translation id="8457451314607652708">புத்தகக்குறிகளை இறக்குமதி செய்</translation> <translation id="8460336040822756677"><ph name="DEVICE_TYPE" /> சாதனத்திற்கு Smart Lockஐ முடக்கினால், உங்கள் மொபைலைப் பயன்படுத்தி Chrome சாதனங்களைத் திறக்க முடியாது. கடவுச்சொல்லை உள்ளிட வேண்டியிருக்கும்.</translation> <translation id="8461329675984532579">உள்நாட்டு மொபைல் சேவை வழங்குநர் பெயர்</translation> -<translation id="84613761564611563">நெட்வொர்க் உள்ளமைவு UI கோரப்பட்டது, காத்திருக்கவும்...</translation> +<translation id="84613761564611563">நெட்வொர்க் உள்ளமைவு UI கோரப்பட்டுள்ளது, காத்திருக்கவும்...</translation> <translation id="8461914792118322307">ப்ராக்ஸி</translation> <translation id="8463215747450521436">இந்தக் கண்காணிக்கப்பட்ட பயனர், நிர்வாகியால் நீக்கப்பட்டிருக்கலாம் அல்லது முடக்கப்பட்டிருக்கலாம். இந்தப் பயனராக உள்நுழைய விருப்பமெனில், நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="846374874681391779">பதிவிறக்கங்கள் பட்டி</translation> @@ -4978,6 +4995,7 @@ <translation id="8620765578342452535">நெட்வொர்க் இணைப்புகளை உள்ளமைக்கவும்</translation> <translation id="8624205858755890468">தொடர்புடைய தகவல், பயன்பாடுகள் மற்றும் செயல்களைக் காட்டுவதற்கு, அசிஸ்டண்ட்டை அனுமதிக்கும்.</translation> <translation id="862542460444371744">&நீட்சிகள்</translation> +<translation id="8626219642120025691">டைமர் முடிந்தது</translation> <translation id="8627151598708688654">ஆதாரத்தைத் தேர்ந்தெடு</translation> <translation id="862727964348362408">இடைநீக்கப்பட்டது</translation> <translation id="862750493060684461">CSS தற்காலிக சேமிப்பு</translation> @@ -5009,7 +5027,7 @@ <translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் உங்கள் திரையையும் ஆடியோவையும் பகிர்கிறது.</translation> <translation id="8659875081143553823">சற்று காத்திருக்கவும்</translation> <translation id="8661290697478713397">மறை&நிலை சாளரத்தில் இணைப்பைத் திற</translation> -<translation id="8662671328352114214"><ph name="TYPE" /> நெட்வொர்க்கில் சேரவும்</translation> +<translation id="8662671328352114214"><ph name="TYPE" /> நெட்வொர்க்கில் சேர்தல்</translation> <translation id="8662795692588422978">நபர்கள்</translation> <translation id="8662811608048051533">பெரும்பாலான தளங்களிலிருந்து உங்களை வெளியேற்றும்.</translation> <translation id="8662911384982557515">உங்கள் முகப்புப் பக்கத்தை இதற்கு மாற்றவும்: <ph name="HOME_PAGE" /></translation> @@ -5098,6 +5116,7 @@ <translation id="8775404590947523323">உங்கள் திருத்தங்கள் தானாகவே சேமிக்கப்படுகின்றன.<ph name="BREAKS" />அசல் படத்தின் நகலை வைத்திருக்க, "அசலில் மேலெழுது" என்பதை நீக்கவும்</translation> <translation id="8777628254805677039">மூல கடவுச்சொல்</translation> <translation id="8780443667474968681">குரல் தேடல் முடக்கப்பட்டுள்ளது.</translation> +<translation id="878068003854005405">தொடங்குவோம். உங்கள் விரலை சென்சார் மீது வைக்கவும்.</translation> <translation id="878069093594050299">பின்வரும் பயன்பாடுகளுக்காக, இந்த சான்றிதழானது சரிபார்க்கப்பட்டது:</translation> <translation id="8781980678064919987">மூடியிருக்கும் போது, சாதனத்தை நிறுத்து</translation> <translation id="8782565991310229362">Kiosk பயன்பாட்டின் துவக்கம் ரத்தானது.</translation> @@ -5198,7 +5217,7 @@ <translation id="894360074127026135">Netscape சர்வதேச மேம்படுத்தல்</translation> <translation id="8944099748578356325">பேட்டரியை அதிகமாகப் பயன்படுத்தும் (தற்போது <ph name="BATTERY_PERCENTAGE" />%)</translation> <translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் சாளரத்தைப் பகிர்கிறது.</translation> -<translation id="8946359700442089734">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத்திருத்த அம்சங்கள் முழுமையாக இயக்கப்படவில்லை.</translation> +<translation id="8946359700442089734">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத் திருத்த அம்சங்கள் முழுமையாக இயக்கப்படவில்லை.</translation> <translation id="894871326938397531">மறைநிலையிலிருந்து வெளியேறவா?</translation> <translation id="895347679606913382">தொடங்குகிறது...</translation> <translation id="8954952943849489823">நகர்வு தோல்வி, எதிர்பாராதப் பிழை: $1</translation> @@ -5213,7 +5232,7 @@ <translation id="8967866634928501045">காட்ட, Alt Shift A ஆகிய விசைகளை அழுத்தவும்</translation> <translation id="8970203673128054105">அனுப்பும் பயன்முறையின் பட்டியலைக் காட்டு</translation> <translation id="89720367119469899">Escape</translation> -<translation id="8972513834460200407">Google சேவையகங்களிலிருந்து பதிவிறக்குவதை தீச்சுவர் தடுக்கவில்லை என்பதை உங்கள் பிணைய நிர்வாகியிடம் கேட்டு உறுதிப்படுத்திக்கொள்ளவும்.</translation> +<translation id="8972513834460200407">Google சேவையகங்களிலிருந்து பதிவிறக்குவதை ஃபயர்வால் தடுக்கவில்லை என்பதை உங்கள் நெட்வொர்க் நிர்வாகியிடம் கேட்டு உறுதிப்படுத்திக்கொள்ளவும்.</translation> <translation id="8973557916016709913">அளவை மாற்றுவதற்கான நிலையை அகற்றும்</translation> <translation id="8973596347849323817">உங்கள் தேவைகளுக்கேற்ப இந்தச் சாதனத்தைத் தனிப்பயனாக்கலாம். இந்த அணுகல்தன்மை அம்சங்களை, அமைப்புகளுக்குச் சென்று பின்னர் மாற்றிக்கொள்ளலாம்.</translation> <translation id="897414447285476047">இணைப்பில் ஏற்பட்ட சிக்கலின் காரணமாக, இலக்குக் கோப்பின் பதிவிறக்கம் முழுமையடையவில்லை.</translation> @@ -5269,12 +5288,13 @@ <translation id="9041692268811217999">உங்கள் கணினியில் இருக்கும் அகக் கோப்புகளுக்கான அணுகலை நிர்வாகி முடக்கியுள்ளார்</translation> <translation id="9042893549633094279">தனியுரிமை மற்றும் பாதுகாப்பு</translation> <translation id="904451693890288097">"<ph name="DEVICE_NAME" />" க்கான கடவுக்குறியீட்டை உள்ளிடுக:</translation> -<translation id="9044646465488564462">பிணையத்துடன் இணைப்பதில் தோல்வி: <ph name="DETAILS" /></translation> +<translation id="9044646465488564462">நெட்வொர்க்குடன் இணைப்பதில் தோல்வி: <ph name="DETAILS" /></translation> <translation id="9045430190527754450">நீங்கள் செல்ல முயற்சிக்கும் பக்கத்தின் இணைய முகவரியை Googleக்கு அனுப்பும்</translation> <translation id="9046895021617826162">இணைப்பு தோல்வியடைந்தது</translation> <translation id="9050666287014529139">கடவுச்சொற்றொடர்</translation> <translation id="9052208328806230490"><ph name="CLOUD_PRINT_NAME" /> உடன் <ph name="EMAIL" /> கணக்கைப் பயன்படுத்தி உங்கள் பிரிண்டர்களைப் பதிவு செய்துள்ளீர்கள்</translation> <translation id="9052404922357793350">தடுப்பதைத் தொடர்</translation> +<translation id="9053091947372579468">உங்கள் சாதனத்திற்கு Chrome உரிமம் வழங்கப்பட்டுள்ளது, எனினும் உங்கள் பயனர்பெயர், நிர்வாகிக் கன்சோலுடன் இணைக்கப்படவில்லை. பதிவுசெய்வதைத் தொடர, நிர்வாகிக் கன்சோல் ஒன்றை உருவாக்கவும். குறிப்பு: புதிய நிர்வாகிக் கன்சோல் கணக்கை உருவாக்குவதற்கு உங்கள் சொந்த டொமைனைத் தேர்வுசெய்தால், பதிவுசெய்த பின்னர் டொமைன் சரிபார்ப்பையும் முடிக்க வேண்டும். https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">எனது தேர்வை நினைவில்கொள்</translation> <translation id="9055636786322918818">RC4 என்க்ரிப்ஷனைச் செயல்படுத்தும். RC4 சைஃபர்கள் பாதுகாப்பற்றவை என்பதால், இந்த விருப்பத்தைப் பயன்படுத்துவது, உங்கள் அபாயத்தை அதிகரிக்கும்.</translation> <translation id="9056034633062863292">Chromeboxஐப் புதுப்பிக்கிறது</translation> @@ -5295,7 +5315,7 @@ <translation id="90737709606140813">இந்தச் சாதனத்துடன் விசையை இணைப்பதன் மூலம், உங்கள் கணக்கில் உள்நுழைய அதைப் பயன்படுத்தலாம்</translation> <translation id="9074739597929991885">புளூடூத்</translation> <translation id="9074836595010225693">USB மவுஸ் இணைக்கப்பட்டது</translation> -<translation id="9076523132036239772">மன்னிக்கவும், உங்கள் மின்னஞ்சல் அல்லது கடவுச்சொல்லைச் சரிபார்க்க முடியவில்லை. முதலில் பிணையத்துடன் இணைவதை முயற்சிக்கவும்.</translation> +<translation id="9076523132036239772">மன்னிக்கவும், உங்கள் மின்னஞ்சல் அல்லது கடவுச்சொல்லைச் சரிபார்க்க முடியவில்லை. முதலில் நெட்வொர்க்குடன் இணைய முயலவும்.</translation> <translation id="9084064520949870008">சாளரமாகத் திற</translation> <translation id="9088234649737575428">நிறுவனக் கொள்கையால் <ph name="PLUGIN_NAME" /> முடக்கப்பட்டுள்ளது</translation> <translation id="9088917181875854783">"<ph name="DEVICE_NAME" />" இல் காண்பிக்கப்படும் இந்த கடவுவிசையை உறுதிப்படுத்துக:</translation> @@ -5324,7 +5344,7 @@ <translation id="9124003689441359348">சேமித்த கடவுச்சொற்கள் இங்கே தோன்றும்</translation> <translation id="912419004897138677">கோடெக்</translation> <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ரெம்)</translation> -<translation id="9128870381267983090">பிணையத்துடன் இணை</translation> +<translation id="9128870381267983090">நெட்வொர்க்குடன் இணையவும்</translation> <translation id="9129010913019873477"><ph name="PERCENTAGE" /> (இயல்பு)</translation> <translation id="9130015405878219958">செல்லாத பயன்முறை உள்ளிடப்பட்டது. </translation> <translation id="9130775360844693113">'<ph name="DESTINATION_NAME" />' இன் உறுப்பினர்கள், இந்தக் கோப்புகளுக்கான அணுகலைப் பெறுவார்கள்.</translation> @@ -5348,7 +5368,7 @@ <translation id="9154418932169119429">இந்தப் படம் ஆஃப்லைனில் கிடைக்காது.</translation> <translation id="91568222606626347">குறுக்கு வழியை உருவாக்கு...</translation> <translation id="9157697743260533322">அனைத்து பயனர்களுக்கும் தானியங்கு புதுப்பிப்புகளை அமைக்க முடியவில்லை (ப்ரீஃபிளைட் செயலாக்கப் பிழை: <ph name="ERROR_NUMBER" />)</translation> -<translation id="9158715103698450907">அச்சச்சோ! அங்கீகரிப்பின்போது பிணைய தகவல்தொடர்பு சிக்கல் ஏற்பட்டது. உங்கள் பிணைய இணைப்பைச் சோதித்து மீண்டும் முயலவும்.</translation> +<translation id="9158715103698450907">அச்சச்சோ! அங்கீகரிப்பின்போது நெட்வொர்க் தகவல்தொடர்பு சிக்கல் ஏற்பட்டது. உங்கள் நெட்வொர்க் இணைப்பைச் சோதித்து மீண்டும் முயலவும்.</translation> <translation id="9161070040817969420">இதற்கான சப்ஃபிரேம்கள்: <ph name="PARENT_SITE" /></translation> <translation id="916501514001398070">சாதனத் தரவை அனுப்பும். இந்தச் சாதனம் தற்போது பிழை அறிக்கைகளையும் சாதனம் மற்றும் பயன்பாட்டின் உபயோகத் தரவையும் தானாகவே Googleக்கு அனுப்பும். உரிமையாளர் இந்த அமைப்பைச் செயல்படுத்துகிறார். கூடுதல் இணையம் மற்றும் பயன்பாட்டுச் செயல்பாடு இயக்கத்தில் இருந்தால், இந்தத் தகவல் உங்கள் கணக்கில் சேமிக்கப்படும், எனது செயல்பாடு என்பதில் இதை நீங்கள் நிர்வகிக்கலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation> <translation id="916607977885256133">பிக்ச்சர்-இன்-பிக்ச்சர்</translation> @@ -5358,7 +5378,7 @@ <translation id="9170884462774788842">உங்கள் கணினியில் உள்ள மற்றொரு நிரலானது, Chrome வேலைசெய்யும் வழியை மாற்றும் தீம் ஐச் சேர்த்துள்ளது.</translation> <translation id="9173995187295789444">புளூடூத் சாதனங்களை ஸ்கேன் செய்கிறது...</translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - புளூடூத் சாதனம் இணைக்கப்பட்டது</translation> -<translation id="9177499212658576372">நீங்கள் தற்போது <ph name="NETWORK_TYPE" /> பிணையத்துடன் இணைக்கப்பட்டுள்ளீர்கள்.</translation> +<translation id="9177499212658576372">நீங்கள் தற்போது <ph name="NETWORK_TYPE" /> நெட்வொர்க்குடன் இணைக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="9179734824669616955">உங்கள் <ph name="DEVICE_TYPE" /> இல் Linux (பீட்டா) பதிப்பை அமைக்கவும்</translation> <translation id="9180281769944411366">இதற்குச் சில நிமிடங்கள் ஆகலாம். Linux கண்டெய்னரைத் தொடங்குகிறது.</translation> <translation id="9180380851667544951">தளத்தால் உங்கள் திரையைப் பகிர முடியும்</translation> @@ -5378,6 +5398,7 @@ <translation id="9218430445555521422">இயல்பாக அமை</translation> <translation id="9219103736887031265">படங்கள்</translation> <translation id="9220525904950070496">கணக்கை அகற்றுக</translation> +<translation id="9220820413868316583">விரலை எடுத்துவிட்டு, மீண்டும் தொடவும்.</translation> <translation id="923467487918828349">அனைத்தும் காண்பி</translation> <translation id="928985544179707652">நீட்டிப்புகள்:</translation> <translation id="930268624053534560">விவரமான நேரமுத்திரைகள்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index f1f085c8..3039771 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">నెట్వర్క్లు లేవు</translation> <translation id="1056898198331236512">హెచ్చరిక</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">వేలిముద్రను నమోదు చేస్తోంది</translation> <translation id="1061904396131502319">దాదాపు విరామ సమయం</translation> <translation id="1062407476771304334">భర్తీ చేయి</translation> <translation id="1067048845568873861">సృష్టించబడింది</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">చతుర్భుజం</translation> <translation id="1114335938027186412">మీ కంప్యూటర్ ట్రస్టెడ్ ప్లాట్ఫారమ్ మాడ్యూల్ (TPM) భద్రతా పరికరాన్ని కలిగి ఉంది, ఇది Chrome OSలో అనేక కీలకమైన భద్రతా లక్షణాలను అమలు చేయడానికి ఉపయోగించబడుతుంది. మరింత తెలుసుకోవడానికి Chromebook సహాయ కేంద్రాన్ని సందర్శించండి: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">మూత మూసి ఉన్నప్పుడు స్లీప్ స్థితికి వెళ్లు</translation> +<translation id="1115324527092594775">అన్నీ జతచేసి బాగా సెటప్ చేయండి</translation> <translation id="1116694919640316211">గురించి</translation> <translation id="1116779635164066733">ఈ సెట్టింగ్ని "<ph name="NAME" />" ఎక్స్టెన్షన్ అమలు చేస్తుంది.</translation> <translation id="111844081046043029">మీరు దీన్ని ఖచ్చితంగా వదిలేయాలనుకుంటున్నారా?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">ప్రస్తుత సమయం</translation> <translation id="1157102636231978136">మీ బ్రౌజింగ్ డేటా మరియు కార్యాకలాపం, మీ Google ఖాతాకు సమకాలీకరించబడ్డాయి</translation> <translation id="1161575384898972166">దయచేసి క్లయింట్ ప్రమాణపత్రాన్ని ఎగుమతి చెయ్యడానికి <ph name="TOKEN_NAME" />కి సైన్ ఇన్ చెయ్యండి.</translation> +<translation id="1161699061380012396">Chrome OS ఇన్పుట్ విధానం</translation> <translation id="1163931534039071049">ఫ్రేమ్ మూలాన్ని &వీక్షించండి</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" />కు Smart Lockని ఆఫ్ చేయాలా?</translation> <translation id="1164899421101904659">PIN అన్లాక్ కీని నమోదు చేయండి</translation> @@ -719,7 +722,7 @@ <translation id="2075959085554270910">క్లిక్ చేయుటకు నొక్కండి మరియు నొక్కి పట్టుకుని, లాగండిని ప్రారంభించడానికి/నిలిపివేయడానికి మిమ్మల్ని అనుమతిస్తుంది</translation> <translation id="2076269580855484719">ఈ ప్లగ్ఇన్ని దాచిపెట్టు</translation> <translation id="2076672359661571384">మధ్యస్థం (సిఫార్సు చేయబడింది)</translation> -<translation id="2077129598763517140">హార్డ్వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation> +<translation id="2077129598763517140">హార్డ్వేర్ వేగవృద్ధి అందుబాటులో ఉన్నప్పుడు, దానిని ఉపయోగించు</translation> <translation id="2078019350989722914">నిష్క్రమించే ముందు హెచ్చరించు (<ph name="KEY_EQUIVALENT" />)</translation> <translation id="2079053412993822885">మీరు మీ స్వంత ప్రమాణపత్రాలలోని ఒకదాన్ని తొలగించినట్లయితే, మీరు దీన్ని గుర్తించడానికి మీరే ఇకపై ఉపయోగించలేరు.</translation> <translation id="2079545284768500474">చర్య రద్దు</translation> @@ -806,7 +809,7 @@ <translation id="2200356397587687044">కొనసాగడానికి Chromeకి అనుమతి అవసరం</translation> <translation id="220138918934036434">బటన్ని దాచిపెట్టు</translation> <translation id="2202898655984161076">ముద్రణలను జాబితా చెయ్యడంలో సమస్య ఉంది. <ph name="CLOUD_PRINT_NAME" />తో మీ ముద్రణలలో కొన్ని విజయవంతంగా నమోదు చెయ్యబడకపోయి ఉండవచ్చు.</translation> -<translation id="2203682048752833055"><ph name="BEGIN_LINK" />చిరునామా పట్టీ<ph name="END_LINK" />లో ఉపయోగించబడిన శోధన ఇంజిన్</translation> +<translation id="2203682048752833055"><ph name="BEGIN_LINK" />చిరునామా పట్టీ<ph name="END_LINK" />లో ఉపయోగించాల్సిన శోధన ఇంజిన్</translation> <translation id="2204034823255629767">మీరు టైప్ చేసేదాన్ని చదవడం మరియు మార్చడం</translation> <translation id="2208158072373999562">జిప్ ఆర్కైవ్</translation> <translation id="220858061631308971">దయచేసి ఈ PIN కోడ్ని "<ph name="DEVICE_NAME" />"లో నమోదు చేయండి:</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play స్టోర్ ఖాతా</translation> <translation id="2509495747794740764">స్కేల్ ప్రమాణం తప్పనిసరిగా 10 మరియు 200 మధ్య ఉండే సంఖ్య అయ్యి ఉండాలి.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">ఫారమ్లను స్వయంచాలకంగా నింపండి</translation> <translation id="2513403576141822879">గోప్యత, భద్రత మరియు డేటా సేకరణకు సంబంధించిన మరిన్ని సెట్టింగ్ల కోసం, <ph name="BEGIN_LINK" />సమకాలీకరణ మరియు Google సేవలను<ph name="END_LINK" /> చూడండి</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">స్కాన్ చేయి</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">క్రమ సంఖ్య: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">ఫ్రేమ్ మూలాన్ని &వీక్షించండి</translation> <translation id="3022978424994383087">అది పూర్తి కాలేదు.</translation> +<translation id="3023464535986383522">వినడానికి ఎంచుకోండి</translation> <translation id="3024374909719388945">24-గంటల గడియారాన్ని ఉపయోగించండి</translation> <translation id="302781076327338683">దాటవేసే కాష్ని మళ్లీ లోడ్ చేయండి</translation> <translation id="3031417829280473749">ఏజెంట్ X</translation> @@ -1621,7 +1624,7 @@ <translation id="3453612417627951340">ప్రామాణీకరణ అవసరం</translation> <translation id="3454157711543303649">సక్రియం చేయడం పూర్తయింది</translation> <translation id="345693547134384690">క్రొత్త టాబ్లో &చిత్రాన్ని తెరువు</translation> -<translation id="3459509316159669723">ముద్రిస్తోంది</translation> +<translation id="3459509316159669723">ముద్రణ</translation> <translation id="3459697287128633276">మీ ఖాతాలో Google Play స్టోర్ యాక్సెస్ని ఆరంభించాలంటే, దయచేసి మీ గుర్తింపు ప్రదాతతో ప్రమాణీకరించండి.</translation> <translation id="3459774175445953971">చివరగా సవరించబడింది:</translation> <translation id="3461266716147554923"><ph name="URL" /> క్లిప్బోర్డ్కు కాపీ చేసిన వచనం మరియు చిత్రాలను చూడాలనుకుంటోంది.</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">తదుపరి ఇన్పుట్ పద్ధతి</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> కోసం "<ph name="EXTENSION_NAME" />"ని జోడించాలా?</translation> <translation id="3644896802912593514">వెడల్పు</translation> +<translation id="3645372836428131288">వేలిముద్రలోని వేరే భాగాన్ని క్యాప్చర్ చేయడం కోసం కొద్దిగా కదిలించండి.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> గుర్తించబడింది</translation> <translation id="3649138363871392317">ఫోటో క్యాప్చర్ చేయబడింది</translation> <translation id="3650952250015018111">యాక్సెస్ చేయడానికి "<ph name="APP_NAME" />"ని అనుమతించండి:</translation> @@ -1797,7 +1801,7 @@ <translation id="3709244229496787112">డౌన్లోడ్ పూర్తి కావడానికి ముందే బ్రౌజర్ షట్డౌన్ చేయబడింది.</translation> <translation id="3711895659073496551">తాత్కాలికంగా నిలిపివేయడం</translation> <translation id="3712217561553024354">మీ Google ఖాతాతో మొబైల్ డేటా కనెక్షన్ ఉన్న ఇతర పరికరాలను గుర్తించడానికి ఈ పరికరాన్ని అనుమతించండి</translation> -<translation id="3712897371525859903">&లాగ పేజీని సేవ్ చెయ్యి</translation> +<translation id="3712897371525859903">&వలె పేజీని సేవ్ చేయి</translation> <translation id="371300529209814631">వెనుకకు/ముందుకు</translation> <translation id="3714633008798122362">వెబ్ క్యాలెండర్</translation> <translation id="3719826155360621982">హోమ్పేజీ</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">సర్టిఫికెట్ విధానాలు</translation> <translation id="392089482157167418">ChromeVox (చదవబడే అభిప్రాయం)ని ప్రారంభించు</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">మీకు ఇటీవల అప్లోడ్ చేసిన WebRTC లాగ్లు ఏవీ లేవు.</translation> <translation id="3925573269917483990">కెమెరా:</translation> <translation id="3925842537050977900">అర నుండి అన్పిన్ చేయి</translation> <translation id="3926002189479431949">Smart Lock ఫోన్ మార్చబడింది</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">సారటోగా</translation> <translation id="4387004326333427325">ప్రామాణీకరణ ప్రమాణపత్రం రిమోట్లో తిరస్కరించబడింది</translation> <translation id="4389091756366370506">వినియోగదారు <ph name="VALUE" /></translation> +<translation id="439266289085815679">బ్లూటూత్ కాన్ఫిగరేషన్ <ph name="USER_EMAIL" /> ద్వారా నియంత్రించబడుతుంది.</translation> <translation id="4394049700291259645">ఆపివెయ్యి</translation> <translation id="4400367121200150367">పాస్వర్డ్లను ఎప్పుడూ సేవ్ చేయని సైట్లు ఇక్కడ కనిపిస్తాయి</translation> <translation id="4400632832271803360">ఎగువ-అడ్డు వరుసలోని కీల ప్రవర్తనను మార్చడానికి లాంచర్ కీని నొక్కి ఉంచండి</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">క్లిప్బోర్డ్ను చూసేందుకు ఈ సైట్కు అనుమతిని కొనసాగించు</translation> <translation id="4530494379350999373">మూలం</translation> <translation id="4533985347672295764">CPU సమయం</translation> +<translation id="4534661889221639075">మళ్లీ ప్రయత్నించండి.</translation> <translation id="4535127706710932914">డిఫాల్ట్ ప్రొఫైల్</translation> <translation id="4538417792467843292">పదాన్ని తొలగించు</translation> <translation id="4538684596480161368"><ph name="HOST" />లో ఎల్లప్పుడూ శాండ్బాక్స్ చేయని ప్లగిన్లను బ్లాక్ చేయి</translation> @@ -2454,7 +2459,7 @@ <translation id="4772404146526168240">రెండు స్క్రీన్లు</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> కోసం పాస్వర్డ్</translation> <translation id="4777825441726637019">Play స్టోర్</translation> -<translation id="4779083564647765204">జూమ్ చెయ్యి</translation> +<translation id="4779083564647765204">జూమ్</translation> <translation id="477945296921629067">{NUM_POPUPS,plural, =1{పాప్-అప్ బ్లాక్ చేయబడింది}other{# పాప్-అప్లు బ్లాక్ చేయబడ్డాయి}}</translation> <translation id="4780321648949301421">ఇలా పేజీని సేవ్ చేయి...</translation> <translation id="4781787911582943401">స్క్రీన్ను దగ్గరకు జూమ్ చేయి</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">స్వీయ పరిష్కరణ</translation> <translation id="4880827082731008257">శోధన చరిత్ర</translation> <translation id="4881695831933465202">తెరువు</translation> +<translation id="4882312758060467256">ఈ సైట్కు యాక్సెస్ను కలిగి ఉంది</translation> <translation id="4882473678324857464">బుక్మార్క్లను ఫోకస్ చేయి</translation> <translation id="4882831918239250449">శోధన, ప్రకటనలు మరియు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ చరిత్ర ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="4883178195103750615">బుక్మార్క్లను HTML ఫైల్కి ఎగుమతి చేయండి...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">ఆల్బమ్</translation> <translation id="4971412780836297815">పూర్తవగానే తెరువు</translation> <translation id="4972129977812092092">ప్రింటర్ను సవరించండి</translation> +<translation id="4972164225939028131">పాస్వర్డ్ తప్పు</translation> <translation id="497287958838527945">Google Pay ఉపయోగించే క్రెడిట్ కార్డ్లు మరియు చిరునామాలు.</translation> <translation id="4973307593867026061">ముద్రకాలను జోడించు</translation> <translation id="4973523518332075481"><ph name="MAX_LENGTH" /> లేదా అంతకంటే తక్కువ అక్షరాలు ఉన్న పేరుని ఉపయోగించండి</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">అనువర్తనాలను లోడ్ చేస్తోంది...</translation> <translation id="5592595402373377407">ఇంకా తగినంత డేటా అందుబాటులో లేదు.</translation> +<translation id="5593357315997824387">నా ఫైల్లను సమకాలీకరించండి</translation> <translation id="5595152862129936745">చాలా దూరంగా ఉండాలి</translation> <translation id="5595485650161345191">చిరునామాను సవరించు</translation> <translation id="5596627076506792578">మరిన్ని ఎంపికలు</translation> @@ -3330,7 +3338,7 @@ <translation id="6068338049763724728">రిమోట్ నమోదును ఆరంభించండి</translation> <translation id="6069671174561668781">వాల్పేపర్ని సెట్ చేయండి</translation> <translation id="6071181508177083058">పాస్వర్డ్ను నిర్ధారించండి</translation> -<translation id="6073903501322152803">ప్రాప్యత లక్షణాలను జోడించండి</translation> +<translation id="6073903501322152803">యాక్సెస్ సామర్థ్య ఫీచర్లను జోడించండి</translation> <translation id="6074825444536523002">Google ఫారమ్</translation> <translation id="6075731018162044558">అయ్యో! ఈ పరికరం కోసం దీర్ఘకాల API ప్రాప్యత టోకెన్ను పొందడంలో సిస్టమ్ విఫలమైంది.</translation> <translation id="6075907793831890935"><ph name="HOSTNAME" /> పేరు గల పరికరంతో డేటాను ఇచ్చిపుచ్చుకోవడానికి అనుమతి</translation> @@ -3453,7 +3461,7 @@ <translation id="6247802389331535091">సిస్టమ్: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="624789221780392884">నవీకరణ సిద్ధంగా ఉంది</translation> <translation id="6248400709929739064">ఉపశీర్షికలను ప్రారంభించు</translation> -<translation id="6248988683584659830">శోధన సెట్టింగ్లు</translation> +<translation id="6248988683584659830">సెట్టింగ్లను వెతకండి</translation> <translation id="6251870443722440887">GDI నిర్వహించేవి</translation> <translation id="6251889282623539337"><ph name="DOMAIN" /> సేవా నిబంధనలు</translation> <translation id="6254503684448816922">కీ రాజీ</translation> @@ -3643,7 +3651,7 @@ <translation id="6531282281159901044">అపాయకరమైన ఫైల్ను అలాగే ఉంచు</translation> <translation id="6534583978616527129">కనెక్షన్ను ప్రారంభించండి</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />గమనిక:<ph name="END_BOLD" /> డేటా సేకరణ వలన పనితీరు తగ్గవచ్చు అందువలన మీరు చేస్తున్నది మీకు తెలిసినప్పుడు లేదా ఇలా చేయాలని మీకు చెప్పినప్పుడు మాత్రమే ప్రారంభించండి.</translation> -<translation id="654233263479157500">నావిగేషన్ లోపాలను పరిష్కరించడానికి సహాయం కోసం వెబ్ సేవను ఉపయోగించండి</translation> +<translation id="654233263479157500">నావిగేషన్ ఎర్రర్లను పరిష్కరించడానికి సహాయం కోసం వెబ్ సేవను ఉపయోగించు</translation> <translation id="6544215763872433504">మీ కోసం Google సమర్పిత వెబ్ బ్రౌజర్</translation> <translation id="6545665334409411530">పునరావృత రేటు</translation> <translation id="6545834809683560467">చిరునామా పట్టీలో లేదా అనువర్తన లాంచర్ శోధన పెట్టెలో టైప్ చేసే శోధనలను మరియు URLలను పూర్తి చేయడంలో సహాయకరంగా ఉండటానికి సూచన సేవను ఉపయోగించండి</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">దురదృష్టవశాత్తూ, మీ కంప్యూటర్ తప్పుగా ఆకృతి చేయబడిన హార్డ్వేర్ IDతో కాన్ఫిగర్ చేయబడింది. ఇది తాజా భద్రతా పరిష్కారాలతో నవీకరించబడనీయకుండా Chrome OSని నిరోధిస్తుంది మరియు మీ కంప్యూటర్ <ph name="BEGIN_BOLD" />హానికరమైన దాడులకు గురి కావచ్చు<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">మీ ప్రొఫైల్ను తెరుస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి సైన్ అవుట్ చేసి, మళ్లీ సైన్ ఇన్ చేయండి.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">టైమర్ను ఆపివేయండి</translation> <translation id="667517062706956822">ఈ పేజీని Google <ph name="SOURCE_LANGUAGE" /> నుండి <ph name="TARGET_LANGUAGE" />కి అనువదించాలని మీరు కోరుకుంటున్నారా?</translation> <translation id="6675665718701918026">సూచిస్తున్న పరికరం కనెక్ట్ చేయబడింది</translation> <translation id="6678717876183468697">ప్రశ్న URL</translation> @@ -3800,7 +3809,7 @@ <translation id="677965093459947883">చాలా చిన్నవిగా</translation> <translation id="6780439250949340171">ఇతర సెట్టింగ్లను నిర్వహించండి</translation> <translation id="6782111308708962316">మూడవ పక్షం వెబ్సైట్లను కుక్కీ డేటా సేవ్ చేయనీయకుండా మరియు చదవనీయకుండా నిరోధించు</translation> -<translation id="6786747875388722282">పొడిగింపులు</translation> +<translation id="6786747875388722282">ఎక్స్టెన్షన్లు</translation> <translation id="6787839852456839824">కీబోర్డ్ సత్వరమార్గాలు</translation> <translation id="6788210894632713004">ప్యాక్ చేయని పొడిగింపు</translation> <translation id="6790428901817661496">ప్లే చేయి</translation> @@ -3921,7 +3930,7 @@ <translation id="6979440798594660689">మ్యూట్ (డిఫాల్ట్)</translation> <translation id="6979737339423435258">మొత్తం సమయం</translation> <translation id="6980462514016882061">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను వ్యక్తిగతీకరించడం కోసం Google మీ బ్రౌజింగ్ చరిత్రను ఉపయోగించవచ్చు</translation> -<translation id="6981982820502123353">ప్రాప్యత</translation> +<translation id="6981982820502123353">యాక్సెస్ సామర్థ్యం</translation> <translation id="6983783921975806247">రిజిస్టర్ చేసిన OID</translation> <translation id="6983991971286645866">అన్ని సవరణలు $1కి సేవ్ చేయబడతాయి.</translation> <translation id="6984299437918708277">సైన్-ఇన్ స్క్రీన్లో మీ ఖాతా కోసం ప్రదర్శించడానికి చిత్రాన్ని ఎంచుకోండి</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">సాధనపట్టీలో ఉంచండి</translation> <translation id="7187428571767585875">తీసివేయాల్సిన లేదా మార్చాల్సిన రిజిస్ట్రీ నమోదులు:</translation> <translation id="7189234443051076392">మీ పరికరంలో తగినంత స్థలం ఉన్నట్లు నిర్ధారించుకోండి</translation> +<translation id="7189965711416741966">వేలిముద్ర జోడించబడింది.</translation> <translation id="7191159667348037">తెలియని ప్రింటర్ (USB)</translation> <translation id="7191454237977785534">దీని లాగా ఫైల్ సేవ్ చేయి</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> కోసం పాస్వర్డ్లు సేవ్ చేయబడలేదు</translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">క్రొత్త విండో</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ఇప్పుడు పూర్తి స్క్రీన్లో కనిపిస్తుంది.</translation> <translation id="7340650977506865820">సైట్ మీ స్క్రీన్ని షేర్ చేస్తోంది</translation> +<translation id="7341834142292923918">ఈ సైట్కు యాక్సెస్ కోరుతోంది</translation> <translation id="7345706641791090287">మీ పాస్వర్డ్ను నిర్ధారించండి</translation> <translation id="7346909386216857016">సరే, అర్థమైంది</translation> <translation id="7347751611463936647">ఈ పొడిగింపును ఉపయోగించడానికి, "<ph name="EXTENSION_KEYWORD" />" టైప్ చేసి, ఆపై టాబ్ చేసి, ఆపై మీ ఆదేశం లేదా శోధనను టైప్ చెయ్యండి.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />మీ పరికరం యొక్క స్థానాన్ని అంచనా వేయడం కోసం Wi-Fi, మొబైల్ నెట్వర్క్లు మరియు సెన్సార్ల వంటి మూలాధారాలను Google స్థాన సేవ ఉపయోగిస్తుంది. మీ పరికరం యొక్క స్థాన సేవ ఆన్లో ఉన్నప్పుడు ఈ సేవ యాక్టివ్గా ఉంటుంది.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />మీ పరికరంలోని ప్రధాన స్థాన సెట్టింగ్ని ఆఫ్ చేయడం ద్వారా మీరు స్థానాన్ని ఆఫ్ చేయవచ్చు. మీరు స్థాన సెట్టింగ్లలో స్థానం కోసం Wi-Fi, మొబైల్ నెట్వర్క్లు మరియు సెన్సార్లను కూడా ఆఫ్ చేయవచ్చు.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">పాస్వర్డ్ను సృష్టించండి -</translation> -<translation id="7518150891539970662">WebRTC లాగ్లు (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">సృష్టించు</translation> <translation id="7529411698175791732">మీ ఇంటర్నెట్ కనెక్షన్ను తనిఖీ చేయండి. సమస్య కొనసాగితే, సైన్ అవుట్ చేసి, మళ్లీ సైన్ ఇన్ చేయడాన్ని ప్రయత్నించండి.</translation> @@ -4742,6 +4752,7 @@ <translation id="8214962590150211830">ఈ వ్యక్తిని తీసివేయి</translation> <translation id="8217399928341212914">బహుళ ఫైల్ల యొక్క స్వయంచాలక డౌన్లోడ్లను బ్లాక్ చేయడాన్ని కొనసాగించు</translation> <translation id="8223479393428528563">ఈ ఫైల్లను ఆఫ్లైన్లో ఉపయోగించేందుకు వాటిని సేవ్ చేయడానికి, తిరిగి ఆన్లైన్లోకి వచ్చి, ఫైల్లపై కుడి-క్లిక్ చేసి, ఆపై <ph name="OFFLINE_CHECKBOX_NAME" /> ఎంపికను ఎంచుకోండి.</translation> +<translation id="8225753906568652947">మీ ఆఫర్లను రీడీమ్ చేయండి</translation> <translation id="8226222018808695353">నిషేధించబడింది</translation> <translation id="8226619461731305576">క్రమ వరుస</translation> <translation id="8226742006292257240">క్రింద యాదృచ్ఛికంగా సృష్టించబడిన TPM పాస్వర్డ్లు మీ కంప్యూటర్కు సూచించబడ్డాయి:</translation> @@ -4788,6 +4799,7 @@ <translation id="8286036467436129157">సైన్ ఇన్ చేయండి</translation> <translation id="8286963743045814739">అజ్ఞాత విండోని ఉపయోగించి మీరు ప్రైవేట్గా బ్రౌజ్ చేయవచ్చు</translation> <translation id="82871696630048499">వెబ్ పేజీ మెమరీ నిండినందున అది మళ్లీ లోడ్ చేయబడింది.</translation> +<translation id="8288032458496410887"><ph name="APP" />ని అన్ఇన్స్టాల్ చేయండి...</translation> <translation id="8291967909914612644">స్వస్థల ప్రదాత దేశం</translation> <translation id="8294431847097064396">మూలం</translation> <translation id="8297006494302853456">బలహీనం</translation> @@ -4850,6 +4862,7 @@ <translation id="8413385045638830869">ముందుగా అడుగు (సిఫార్సు చేయబడింది)</translation> <translation id="8418445294933751433">టాబ్ వలె &చూపించు</translation> <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' కోసం శోధన ఫలితాలు</translation> +<translation id="8419368276599091549">మీ <ph name="DEVICE_TYPE" />కు స్వాగతం!</translation> <translation id="8420060421540670057">Google డాక్స్ ఫైల్లను చూపించు</translation> <translation id="8424039430705546751">క్రిందికి</translation> <translation id="8425213833346101688">మార్చు</translation> @@ -4976,6 +4989,7 @@ <translation id="8620765578342452535">నెట్వర్క్ కనెక్షన్లను కాన్ఫిగర్ చేయడానికి అనుమతి</translation> <translation id="8624205858755890468">మీకు సంబంధిత సమాచారం, యాప్లు మరియు చర్యలను చూపించడానికి సహాయకాన్ని ప్రారంభిస్తుంది.</translation> <translation id="862542460444371744">&పొడిగింపులు</translation> +<translation id="8626219642120025691">టైమర్ పూర్తయింది</translation> <translation id="8627151598708688654">మూలాన్ని ఎంచుకోండి</translation> <translation id="862727964348362408">తాత్కాలికంగా రద్దు చేయబడింది</translation> <translation id="862750493060684461">CSS కాష్</translation> @@ -5096,6 +5110,7 @@ <translation id="8775404590947523323">మీ సవరణలు స్వయంచాలకంగా సేవ్ చేయబడతాయి.<ph name="BREAKS" />అసలు చిత్రం యొక్క నకలును ఉంచడానికి, "అసలును భర్తీ చేయి" ఎంపికను తీసివేయండి</translation> <translation id="8777628254805677039">మూల పాస్వర్డ్</translation> <translation id="8780443667474968681">వాయిస్ శోధన ఆపివేయబడింది.</translation> +<translation id="878068003854005405">ప్రారంభించండి. మీ వేలిని సెన్సార్పై ఉంచండి.</translation> <translation id="878069093594050299">ఈ సర్టిఫికెట్ క్రింది ఉపయోగాలకు ధృవీకరించబడింది:</translation> <translation id="8781980678064919987">మూత మూసినప్పుడు షట్ డౌన్ చేయండి</translation> <translation id="8782565991310229362">కియోస్క్ అప్లికేషన్ అమలు రద్దు చేయబడింది.</translation> @@ -5103,7 +5118,7 @@ <translation id="8784626084144195648">బిన్ చేయబడిన సగటు</translation> <translation id="8785622406424941542">స్టైలస్</translation> <translation id="8787254343425541995">భాగస్వామ్య నెట్వర్క్లకు ప్రాక్సీలను అనుమతించండి</translation> -<translation id="8791534160414513928">మీ బ్రౌజింగ్ రద్దీతో ‘ట్రాక్ చేయవద్దు’ అభ్యర్థనను పంపండి</translation> +<translation id="8791534160414513928">మీ బ్రౌజింగ్ ట్రాఫిక్కు తోడుగా ‘ట్రాక్ చేయవద్దు’ అభ్యర్థనను పంపండి</translation> <translation id="8794025342371547160">పరిమితం చేయబడిన IP</translation> <translation id="879413103056696865">హాట్స్పాట్ ఆన్లో ఉన్నప్పుడు, మీ <ph name="PHONE_NAME" /> ఇలా చేస్తుంది:</translation> <translation id="8795916974678578410">క్రొత్త విండో</translation> @@ -5223,7 +5238,7 @@ <translation id="8983677657449185470">సురక్షిత బ్రౌజింగ్ను మెరుగుపరచడంలో సహాయపడండి</translation> <translation id="8984654317541110628">ఫైల్ షేర్ URL</translation> <translation id="8986362086234534611">మరిచిపోయారా</translation> -<translation id="8986494364107987395">Googleకు స్వయంచాలకంగా ఉపయోగ గణాంకాలను మరియు క్రాష్ నివేదికలను పంపు</translation> +<translation id="8986494364107987395">వినియోగ గణాంకాలు మరియు క్రాష్ నివేదికలను ఆటోమేటిక్గా Googleకు పంపు</translation> <translation id="8987927404178983737">నెల</translation> <translation id="8991520179165052608">సైట్ మీ మైక్రోఫోన్ని ఉపయోగించవచ్చు</translation> <translation id="899403249577094719">Netscape సర్టిఫికెట్ ఆధార URL</translation> @@ -5273,6 +5288,7 @@ <translation id="9050666287014529139">పాస్ఫ్రేజ్</translation> <translation id="9052208328806230490">మీరు <ph name="EMAIL" /> ఖాతాని ఉపయోగించి <ph name="CLOUD_PRINT_NAME" />తో మీ ముద్రకాలను నమోదు చేసారు</translation> <translation id="9052404922357793350">బ్లాక్ చేయడాన్ని కొనసాగించు</translation> +<translation id="9053091947372579468">మీ పరికరంలో Chrome లైసెన్స్ ఉంది, కానీ నిర్వాహకుల కన్సోల్తో మీ వినియోగదారు పేరు అనుబంధంగా లేదు. నమోదు చేయడం కొనసాగించడానికి దయచేసి నిర్వాహకుల కన్సోల్ ఖాతాను సృష్టించండి. గమనిక: కొత్త నిర్వాహకుల కన్సోల్ ఖాతాను సృష్టించడానికి మీరు మీ స్వంత డొమైన్ని ఉపయోగించాలని ఎంచుకుంటే, మీరు సైన్అప్ తర్వాత డొమైన్ ధృవీకరణను కూడా తప్పనిసరిగా పూర్తి చేయవలసి ఉంటుంది. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">నా ఎంపికను గుర్తుంచుకో</translation> <translation id="9055636786322918818">RC4 ఎన్క్రిప్షన్ని అమలు చేయండి. ఈ ఎంపికని ఉపయోగించడం వలన RC4 సైఫర్లు అసురక్షితమైనవి కాబట్టి మీకు హాని పెరుగుతుంది.</translation> <translation id="9056034633062863292">Chromeboxను నవీకరించడం</translation> @@ -5376,6 +5392,7 @@ <translation id="9218430445555521422">డిఫాల్ట్ లా సెట్ చెయ్యండి</translation> <translation id="9219103736887031265">చిత్రాలు</translation> <translation id="9220525904950070496">ఖాతాను తీసివేయండి</translation> +<translation id="9220820413868316583">వేలిని తీసివేసి, మళ్లీ పెట్టండి.</translation> <translation id="923467487918828349">అన్నీ చూపించు</translation> <translation id="928985544179707652">ఎక్స్టెన్షన్లు:</translation> <translation id="930268624053534560">వివరణాత్మక సమయముద్రలు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 89c573e..abb258b 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">ไม่พบเครือข่าย</translation> <translation id="1056898198331236512">คำเตือน</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">การลงทะเบียนลายนิ้วมือ</translation> <translation id="1061904396131502319">เกือบถึงเวลาพักแล้ว</translation> <translation id="1062407476771304334">แทนที่</translation> <translation id="1067048845568873861">สร้างแล้ว</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">เพชร</translation> <translation id="1114335938027186412">คอมพิวเตอร์ของคุณมีอุปกรณ์รักษาความปลอดภัย Trusted Platform Module (TPM) ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS โปรดไปที่ศูนย์ช่วยเหลือของ Chromebook เพื่อดูข้อมูลเพิ่มเติม: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">เข้าสู่โหมดสลีปเมื่อปิดฝา</translation> +<translation id="1115324527092594775">ตั้งค่า Better Together</translation> <translation id="1116694919640316211">เกี่ยวกับ</translation> <translation id="1116779635164066733">การตั้งค่านี้ถูกบังคับใช้โดยส่วนขยาย "<ph name="NAME" />"</translation> <translation id="111844081046043029">คุณแน่ใจหรือไม่ว่าต้องการออกจากหน้านี้</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">เวลาปัจจุบัน</translation> <translation id="1157102636231978136">ข้อมูลและกิจกรรมการท่องเว็บซึ่งซิงค์กับบัญชี Google</translation> <translation id="1161575384898972166">โปรดลงชื่อเข้าใช้ <ph name="TOKEN_NAME" /> เพื่อส่งออกใบรับรองไคลเอ็นต์</translation> +<translation id="1161699061380012396">วิธีการป้อนข้อมูลของ Chrome OS</translation> <translation id="1163931534039071049">&ดูรหัสต้นฉบับของเฟรม</translation> <translation id="1164674268730883318">ปิด Smart Lock สำหรับ <ph name="DEVICE_TYPE" /> ไหม</translation> <translation id="1164899421101904659">ป้อนคีย์ปลดล็อก PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">บัญชี Google Play Store</translation> <translation id="2509495747794740764">จำนวนขนาดต้องเป็นตัวเลขระหว่าง 10 และ 200</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">ป้อนฟอร์มอัตโนมัติ</translation> <translation id="2513403576141822879">ดูการตั้งค่าเพิ่มเติมเกี่ยวกับความเป็นส่วนตัว ความปลอดภัย และการรวบรวมข้อมูลได้ที่<ph name="BEGIN_LINK" />การซิงค์และบริการต่างๆ ของ Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">สแกน</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">หมายเลขซีเรียล: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&ดูแหล่งที่มาของเฟรม</translation> <translation id="3022978424994383087">ฟังไม่เข้าใจ</translation> +<translation id="3023464535986383522">เลือกเพื่อให้อ่าน</translation> <translation id="3024374909719388945">ใช้เวลารูปแบบ 24 ชั่วโมง</translation> <translation id="302781076327338683">โหลดแคชการข้ามซ้ำ</translation> <translation id="3031417829280473749">เอเจนต์เอ็กซ์</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">วิธีการป้อนข้อมูลถัดไป</translation> <translation id="3640214691812501263">เพิ่ม "<ph name="EXTENSION_NAME" />" สำหรับ <ph name="USER_NAME" /> ไหม</translation> <translation id="3644896802912593514">ความกว้าง</translation> +<translation id="3645372836428131288">เลื่อนนิ้วเล็กน้อยเพื่อจับภาพส่วนต่างๆ ของลายนิ้วมือ</translation> <translation id="3648348069317717750">ตรวจพบ <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">จับภาพแล้ว</translation> <translation id="3650952250015018111">อนุญาตให้ "<ph name="APP_NAME" />" เข้าถึง:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">นโยบายใบรับรอง</translation> <translation id="392089482157167418">เปิดใช้ ChromeVox (การตอบสนองด้วยเสียง)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">คุณไม่มีบันทึก WebRTC ที่จับภาพเมื่อเร็วๆ นี้</translation> <translation id="3925573269917483990">กล้อง:</translation> <translation id="3925842537050977900">เลิกตรึงในชั้นวาง</translation> <translation id="3926002189479431949">โทรศัพท์ของ Smart Lock มีการเปลี่ยนแปลง</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">ซาราโทกะ</translation> <translation id="4387004326333427325">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธจากระยะไกล</translation> <translation id="4389091756366370506">ผู้ใช้ <ph name="VALUE" /></translation> +<translation id="439266289085815679">การกำหนดค่าบลูทูธควบคุมโดย <ph name="USER_EMAIL" /></translation> <translation id="4394049700291259645">ปิดการใช้งาน</translation> <translation id="4400367121200150367">เว็บไซต์ที่ไม่เคยบันทึกรหัสผ่านจะแสดงที่นี่</translation> <translation id="4400632832271803360">กดแป้น "Launcher" ค้างไว้เพื่อเปลี่ยนการทำงานของแป้นแถวบนสุด</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">อนุญาตให้เว็บไซต์นี้ดูคลิปบอร์ดต่อไปได้</translation> <translation id="4530494379350999373">ต้นทาง</translation> <translation id="4533985347672295764">เวลา CPU</translation> +<translation id="4534661889221639075">ลองอีกครั้ง</translation> <translation id="4535127706710932914">โปรไฟล์เริ่มต้น</translation> <translation id="4538417792467843292">ลบคำ</translation> <translation id="4538684596480161368">บล็อกปลั๊กอินที่อยู่นอกแซนด์บ็อกซ์ใน <ph name="HOST" /> เสมอ</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">แก้ไขอัตโนมัติ</translation> <translation id="4880827082731008257">ค้นประวัติการเข้าชม</translation> <translation id="4881695831933465202">เปิด</translation> +<translation id="4882312758060467256">มีสิทธิ์เข้าถึงเว็บไซต์นี้</translation> <translation id="4882473678324857464">โฟกัสบุ๊กมาร์ก</translation> <translation id="4882831918239250449">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="4883178195103750615">ส่งออกบุ๊กมาร์กไปยังไฟล์ HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">อัลบั้ม</translation> <translation id="4971412780836297815">เปิดเมื่อเสร็จสิ้น</translation> <translation id="4972129977812092092">แก้ไขเครื่องพิมพ์</translation> +<translation id="4972164225939028131">รหัสผ่านไม่ถูกต้อง</translation> <translation id="497287958838527945">ใช้ข้อมูลบัตรเครดิตและที่อยู่จาก Google Pay</translation> <translation id="4973307593867026061">เพิ่มเครื่องพิมพ์</translation> <translation id="4973523518332075481">ใช้ชื่อที่มีอักขระไม่เกิน <ph name="MAX_LENGTH" /> อักขระ</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">กำลังโหลดแอป...</translation> <translation id="5592595402373377407">ยังไม่มีข้อมูลเพียงพอ</translation> +<translation id="5593357315997824387">ซิงค์ไฟล์</translation> <translation id="5595152862129936745">ไกลมาก</translation> <translation id="5595485650161345191">แก้ไขที่อยู่</translation> <translation id="5596627076506792578">ตัวเลือกเพิ่มเติม</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">น่าเสียดายที่คอมพิวเตอร์ของคุณถูกกำหนดค่าด้วย ID ฮาร์ดแวร์ที่มีรูปแบบที่ไม่ถูกต้อง ซึ่งจะป้องกันไม่ให้ Chrome OS อัปเดตการแก้ใขปัญหาความปลอดภัยล่าสุดได้ และคอมพิวเตอร์ของคุณ <ph name="BEGIN_BOLD" />อาจเสี่ยงต่อการโจมตีที่เป็นอันตราย<ph name="END_BOLD" /></translation> <translation id="6664774537677393800">เกิดข้อผิดพลาดขณะเปิดโปรไฟล์ของคุณ โปรดออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">หยุดตัวจับเวลา</translation> <translation id="667517062706956822">คุณต้องการให้ Google แปลหน้านี้จากภาษา<ph name="SOURCE_LANGUAGE" />เป็นภาษา<ph name="TARGET_LANGUAGE" />ไหม</translation> <translation id="6675665718701918026">เชื่อมต่ออุปกรณ์ชี้ตำแหน่งแล้ว</translation> <translation id="6678717876183468697">URL ของคำค้นหา</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">เก็บในแถบเครื่องมือ</translation> <translation id="7187428571767585875">รายการรีจิสทรีที่จะนำออกหรือเปลี่ยนแปลง:</translation> <translation id="7189234443051076392">ตรวจสอบว่าอุปกรณ์มีพื้นที่ว่างเพียงพอ</translation> +<translation id="7189965711416741966">เพิ่มลายนิ้วมือแล้ว</translation> <translation id="7191159667348037">เครื่องพิมพ์ที่ไม่รู้จัก (USB)</translation> <translation id="7191454237977785534">บันทึกแฟ้มเป็น</translation> <translation id="7193374945610105795">ไม่มีรหัสผ่านบันทึกไว้สำหรับ <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">หน้าต่างใหม่</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> แสดงแบบเต็มหน้าจออยู่</translation> <translation id="7340650977506865820">เว็บไซต์กำลังแชร์หน้าจอของคุณ</translation> +<translation id="7341834142292923918">ต้องการเข้าถึงเว็บไซต์นี้</translation> <translation id="7345706641791090287">ยืนยันรหัสผ่าน</translation> <translation id="7346909386216857016">รับทราบ</translation> <translation id="7347751611463936647">ในการใช้ส่วนขยายนี้ ให้พิมพ์ "<ph name="EXTENSION_KEYWORD" />" แล้วกด TAB ตามด้วยคำสั่งหรือการค้นหาของคุณ</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />บริการตำแหน่งของ Google จะใช้แหล่งที่มาอย่าง Wi-Fi เครือข่ายมือถือ และเซ็นเซอร์ในการประมาณตำแหน่งของอุปกรณ์ และจะทำงานเมื่อมีการเปิดการตั้งค่าตำแหน่งของอุปกรณ์<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />คุณปิดตำแหน่งได้ด้วยการปิดการตั้งค่าตำแหน่งหลักในอุปกรณ์ หรือจะปิดการใช้ Wi‑Fi, เครือข่ายมือถือ และเซ็นเซอร์สำหรับการบอกตำแหน่งในการตั้งค่าตำแหน่งก็ได้<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">สร้างรหัสผ่าน -</translation> -<translation id="7518150891539970662">บันทึก WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">สร้าง</translation> <translation id="7529411698175791732">ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ หากปัญหายังคงอยู่ ให้ลองออกจากระบบและลงชื่อเข้าใช้อีกครั้ง</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">นำบุคคลนี้ออก</translation> <translation id="8217399928341212914">ดำเนินการบล็อกการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติต่อไป</translation> <translation id="8223479393428528563">หากต้องการบันทึกไฟล์เหล่านี้เพื่อใช้งานแบบออฟไลน์ ให้คลิกขวาที่ไฟล์ และเลือกตัวเลือก <ph name="OFFLINE_CHECKBOX_NAME" /></translation> +<translation id="8225753906568652947">แลกข้อเสนอพิเศษ</translation> <translation id="8226222018808695353">ต้องห้าม</translation> <translation id="8226619461731305576">คิว</translation> <translation id="8226742006292257240">ด้านล่างนี้คือรหัสผ่าน TPM ที่สร้างขึ้นโดยการสุ่มและได้รับการกำหนดให้กับคอมพิวเตอร์ของคุณ:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">ลงชื่อเข้าใช้</translation> <translation id="8286963743045814739">คุณจะท่องเว็บแบบส่วนตัวได้โดยใช้หน้าต่างที่ไม่ระบุตัวตน</translation> <translation id="82871696630048499">มีการโหลดหน้าเว็บซ้ำเพราะหน่วยความจำเต็ม</translation> +<translation id="8288032458496410887">ถอนการติดตั้ง <ph name="APP" />...</translation> <translation id="8291967909914612644">ประเทศผู้ให้บริการหน้าแรก</translation> <translation id="8294431847097064396">แหล่งที่มา</translation> <translation id="8297006494302853456">อ่อน</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">ถามก่อน (แนะนำ)</translation> <translation id="8418445294933751433">แ&สดงเป็นแถบ</translation> <translation id="8419098111404128271">ผลการค้นหาของ "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">ยินดีต้อนรับสู่ <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">แสดงไฟล์ Google เอกสาร</translation> <translation id="8424039430705546751">ลง</translation> <translation id="8425213833346101688">เปลี่ยน</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">กำหนดค่าการเชื่อมต่อเครือข่าย</translation> <translation id="8624205858755890468">เปิดใช้ Assistant เพื่อแสดงข้อมูล แอป และการดำเนินการต่างๆ ที่เกี่ยวข้อง</translation> <translation id="862542460444371744">&ส่วนขยาย</translation> +<translation id="8626219642120025691">ตัวจับเวลาสิ้นสุดแล้ว</translation> <translation id="8627151598708688654">เลือกแหล่งที่มา</translation> <translation id="862727964348362408">ระงับไว้ชั่วคราว</translation> <translation id="862750493060684461">แคช CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">การแก้ไขของคุณจะถูกบันทึกไว้โดยอัตโนมัติ<ph name="BREAKS" />หากต้องการเก็บสำเนาของภาพต้นฉบับ ให้ยกเลิกการทำเครื่องหมาย "เขียนทับต้นฉบับ"</translation> <translation id="8777628254805677039">รหัสผ่านระดับรูท</translation> <translation id="8780443667474968681">ปิดการค้นหาด้วยเสียงแล้ว</translation> +<translation id="878068003854005405">มาเริ่มกันเลย วางนิ้วบนเซ็นเซอร์</translation> <translation id="878069093594050299">ใบรับรองนี้ได้รับการตรวจสอบเพื่อการใช้งานดังต่อไปนี้:</translation> <translation id="8781980678064919987">ปิดเครื่องเมื่อปิดฝา</translation> <translation id="8782565991310229362">การเรียกใช้แอปพลิเคชันคีออสก์ถูกยกเลิก</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">ข้อความรหัสผ่าน</translation> <translation id="9052208328806230490">คุณได้ลงทะเบียนเครื่องพิมพ์กับ <ph name="CLOUD_PRINT_NAME" /> โดยใช้บัญชี <ph name="EMAIL" /></translation> <translation id="9052404922357793350">บล็อกต่อไป</translation> +<translation id="9053091947372579468">อุปกรณ์มีใบอนุญาต Chrome แต่ชื่อผู้ใช้ของคุณไม่ได้เชื่อมโยงกับคอนโซลผู้ดูแลระบบ โปรดสร้างบัญชีคอนโซลผู้ดูแลระบบเพื่อลงทะเบียนต่อ โปรดทราบว่าหากคุณเลือกใช้โดเมนของตัวเองเพื่อสร้างบัญชีคอนโซลผู้ดูแลระบบใหม่ ก็จะต้องยืนยันโดเมนหลังจากที่ลงทะเบียนแล้วด้วย https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">จดจำตัวเลือกของฉัน</translation> <translation id="9055636786322918818">บังคับใช้การเข้ารหัส RC4 การใช้ตัวเลือกนี้เป็นการเพิ่มความเสี่ยงเนื่องจากการเข้ารหัส RC4 นั้นไม่ปลอดภัย</translation> <translation id="9056034633062863292">กำลังอัปเดต Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">ตั้งเป็นค่าเริ่มต้น</translation> <translation id="9219103736887031265">ภาพ</translation> <translation id="9220525904950070496">ลบบัญชี</translation> +<translation id="9220820413868316583">ยกนิ้วขึ้นแล้วลองอีกครั้ง</translation> <translation id="923467487918828349">แสดงทั้งหมด</translation> <translation id="928985544179707652">ส่วนขยาย:</translation> <translation id="930268624053534560">การประทับเวลาโดยละเอียด</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 41d1655..f777bac 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Hücresel ağ yok</translation> <translation id="1056898198331236512">Uyarı</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Parmak izi kaydedin</translation> <translation id="1061904396131502319">Mola verme zamanı yaklaştı</translation> <translation id="1062407476771304334">Değiştir</translation> <translation id="1067048845568873861">Oluşturulduğu tarih</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Karo</translation> <translation id="1114335938027186412">Bilgisayarınızda, Chrome OS'deki pek çok kritik güvenlik özelliğini uygulamak için kullanılan bir Güvenilir Platform Modülü (TPM) güvenlik cihazı bulunmaktadır. Daha fazla bilgi edinmek için Chromebook Yardım Merkezi'ni ziyaret edin: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Kapak kapatıldığında uyku moduna geç</translation> +<translation id="1115324527092594775">Better Together'ı Kurun</translation> <translation id="1116694919640316211">Hakkında</translation> <translation id="1116779635164066733">Bu ayar, "<ph name="NAME" />" uzantısı tarafından zorunlu kılınmıştır.</translation> <translation id="111844081046043029">Bu sayfadan ayrılmak istediğinizden emin misiniz?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Şu anki saat:</translation> <translation id="1157102636231978136">Google Hesabınızla senkronize edilen tarama verileriniz ve etkinliğiniz</translation> <translation id="1161575384898972166">Lütfen istemci sertifikasını dışa aktarmak için <ph name="TOKEN_NAME" /> cihazında oturum açın.</translation> +<translation id="1161699061380012396">Chrome OS Giriş Yöntemi</translation> <translation id="1163931534039071049">&Çerçeve kaynağını görüntüle</translation> <translation id="1164674268730883318"><ph name="DEVICE_TYPE" /> için Smart Lock kapatılsın mı?</translation> <translation id="1164899421101904659">PIN Kilit Açma Anahtarını Girin</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play Store Hesabı</translation> <translation id="2509495747794740764">Ölçek değeri, 10 - 200 arasında bir sayı olmalı.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Formları otomatik doldurma</translation> <translation id="2513403576141822879">Gizlilik, güvenlik ve veri toplamayla ilgili daha fazla ayar için <ph name="BEGIN_LINK" />Senkronizasyon ve Google hizmetleri<ph name="END_LINK" /> konusuna bakın</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Tara</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Seri Numarası: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">Çerçeve Kaynağını &Görüntüle</translation> <translation id="3022978424994383087">Anlaşılmadı.</translation> +<translation id="3023464535986383522">Seç ve dinle</translation> <translation id="3024374909719388945">24 saatlik biçimi kullan</translation> <translation id="302781076327338683">Önbelleği atlayarak yeniden yükle</translation> <translation id="3031417829280473749">Ajan X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Sonraki giriş yöntemi</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> için "<ph name="EXTENSION_NAME" />" uzantısı eklensin mi?</translation> <translation id="3644896802912593514">Genişlik</translation> +<translation id="3645372836428131288">Parmak izinizin farklı bir kısmının yakalanması için parmağınızı çok az hareket ettirin.</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> algılandı</translation> <translation id="3649138363871392317">Fotoğraf çekildi</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" uygulamasının şu öğeye erişmesine izin ver:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Sertifika Politikaları</translation> <translation id="392089482157167418">ChromeVox'u (sesli geri bildirim) etkinleştir</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Son zamanlarda yakalanmış herhangi bir WebRTC günlüğünüz yok.</translation> <translation id="3925573269917483990">Kamera:</translation> <translation id="3925842537050977900">Raftaki sabitlemeyi kaldır</translation> <translation id="3926002189479431949">Smart Lock telefonu değişti</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Şimşek</translation> <translation id="4387004326333427325">Kimlik doğrulama sertifikası uzaktan reddedildi</translation> <translation id="4389091756366370506">Kullanıcı <ph name="VALUE" /></translation> +<translation id="439266289085815679">Bluetooth yapılandırması <ph name="USER_EMAIL" /> tarafından kontrol ediliyor.</translation> <translation id="4394049700291259645">Devre dışı bırak</translation> <translation id="4400367121200150367">Şifreleri hiçbir zaman kaydedilmeyecek siteler burada görünür</translation> <translation id="4400632832271803360">Üst satırdaki tuşların davranışını değiştirmek için Başlatıcı tuşunu basılı tutun</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Bu sitenin panoyu görmesine izin vermeye devam et</translation> <translation id="4530494379350999373">Kaynak</translation> <translation id="4533985347672295764">CPU Süresi</translation> +<translation id="4534661889221639075">Tekrar deneyin.</translation> <translation id="4535127706710932914">Varsayılan Profil</translation> <translation id="4538417792467843292">Kelime sil</translation> <translation id="4538684596480161368"><ph name="HOST" /> üzerinde koruma alanında olmayan eklentileri her zaman engelle</translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Otomatik düzelt</translation> <translation id="4880827082731008257">Geçmişte ara</translation> <translation id="4881695831933465202">Aç</translation> +<translation id="4882312758060467256">Bu siteye erişimi var</translation> <translation id="4882473678324857464">Yer işaretlerine odaklan</translation> <translation id="4882831918239250449">Göz atma geçmişinizin Arama, reklamlar ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="4883178195103750615">Yer işaretlerini HTML dosyasına aktar...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Albüm</translation> <translation id="4971412780836297815">İşlem tamamlandığında aç</translation> <translation id="4972129977812092092">Yazıcı bilgilerini düzenleyin</translation> +<translation id="4972164225939028131">Yanlış şifre</translation> <translation id="497287958838527945">Google Pay'i kullanan kredi kartları ve adresler.</translation> <translation id="4973307593867026061">Yazıcı ekle</translation> <translation id="4973523518332075481">En fazla <ph name="MAX_LENGTH" /> karakterden oluşan bir ad kullanın</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Uygulamalar yükleniyor...</translation> <translation id="5592595402373377407">Henüz yeterli veri yok.</translation> +<translation id="5593357315997824387">Dosyalarımı senkronize et</translation> <translation id="5595152862129936745">Çok uzak</translation> <translation id="5595485650161345191">Adresi düzenle</translation> <translation id="5596627076506792578">Diğer seçenekler</translation> @@ -3734,6 +3742,7 @@ <translation id="6664237456442406323">Maalesef bilgisayarınız, hatalı oluşturulmuş bir donanım kimliğiyle yapılandırılmış. Bu durum Chrome OS'nin en son güvenlik düzeltmeleriyle güncellenmesini engeller ve bilgisayarınız <ph name="BEGIN_BOLD" />kötü niyetli saldırılara<ph name="END_BOLD" /> açık duruma gelebilir.</translation> <translation id="6664774537677393800">Profiliniz açılırken bir sorun oluştu. Lütfen oturumu kapatıp sonra tekrar oturum açın.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">zamanlayıcıyı durdur</translation> <translation id="667517062706956822">Google'ın bu sayfayı <ph name="SOURCE_LANGUAGE" /> dilinden <ph name="TARGET_LANGUAGE" /> diline çevirmesini istiyor musunuz?</translation> <translation id="6675665718701918026">İşaretleme cihazı bağlı</translation> <translation id="6678717876183468697">Sorgu URL'si</translation> @@ -4060,6 +4069,7 @@ <translation id="7186088072322679094">Araç Çubuğunda Tut</translation> <translation id="7187428571767585875">Kaldırılacak veya değiştirilecek kayıt defteri girişleri:</translation> <translation id="7189234443051076392">Cihazınızda yeterli alan bulunduğundan emin olun</translation> +<translation id="7189965711416741966">Parmak izi eklendi.</translation> <translation id="7191159667348037">Bilinmeyen Yazıcı (USB)</translation> <translation id="7191454237977785534">Dosyayı farklı kaydet</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> için şifre kaydedilmedi</translation> @@ -4160,6 +4170,7 @@ <translation id="7339898014177206373">Yeni pencere</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> şimdi tam ekran görüntüleniyor.</translation> <translation id="7340650977506865820">Site, ekranınızı paylaşıyor</translation> +<translation id="7341834142292923918">Bu siteye erişim izni istiyor</translation> <translation id="7345706641791090287">Şifrenizi onaylayın</translation> <translation id="7346909386216857016">Tamam, anladım</translation> <translation id="7347751611463936647">Bu uzantıyı kullanmak için "<ph name="EXTENSION_KEYWORD" />" yazın, ardından SEKME tuşuna basın ve komutunuzu veya arama teriminizi girin.</translation> @@ -4269,7 +4280,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google'ın konum hizmeti, cihazınızın konumunu tahmin etmesine yardımcı olması için kablosuz ağ, mobil ağlar ve sensörler gibi kaynaklar kullanır. Bu hizmet, cihazınızın Konum ayarı açıkken etkin olur.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Cihazınızdaki ana Konum ayarını kapatarak Konum hizmetini devre dışı bırakabilirsiniz. Ayrıca konum ayarlarından, konum hizmetleri için kablosuz ağ, mobil ağlar ve sensörlerin kullanımını da kapatabilirsiniz.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Bir şifre oluşturun -</translation> -<translation id="7518150891539970662">WebRTC günlükleri (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Oluştur</translation> <translation id="7529411698175791732">İnternet bağlantınızı kontrol edin. Sorun devam ederse oturumu kapatıp tekrar açmayı deneyin.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Bu kişiyi kaldır</translation> <translation id="8217399928341212914">Otomatik olarak birden fazla dosya indirilmesini engellemeye devam et</translation> <translation id="8223479393428528563">Bu dosyaları çevrimdışı kullanım için kaydetmek üzere tekrar çevrimiçi olun, dosyaları sağ tıklayın ve <ph name="OFFLINE_CHECKBOX_NAME" /> seçeneğini belirleyin.</translation> +<translation id="8225753906568652947">Tekliflerinizi kullanın</translation> <translation id="8226222018808695353">Yasak</translation> <translation id="8226619461731305576">Sıra</translation> <translation id="8226742006292257240">Aşağıda bilgisayarınıza atanmış ve rastgele oluşturulmuş TPM şifresini görebilirsiniz:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Oturum Aç</translation> <translation id="8286963743045814739">Gizli pencere kullanarak gizli olarak göz atabilirsiniz</translation> <translation id="82871696630048499">Bellek tükendiği için web sayfası yeniden yüklendi.</translation> +<translation id="8288032458496410887"><ph name="APP" /> Uygulamasının Yüklemesini Kaldır...</translation> <translation id="8291967909914612644">Ev sağlayıcısının ülkesi</translation> <translation id="8294431847097064396">Kaynak</translation> <translation id="8297006494302853456">Zayıf</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Önce sor (önerilir)</translation> <translation id="8418445294933751433">&Sekme olarak göster</translation> <translation id="8419098111404128271">"<ph name="SEARCH_TEXT" />" için arama sonuçları</translation> +<translation id="8419368276599091549"><ph name="DEVICE_TYPE" /> cihazınıza hoş geldiniz!</translation> <translation id="8420060421540670057">Google Dokümanlar dosyalarını göster</translation> <translation id="8424039430705546751">aşağı</translation> <translation id="8425213833346101688">Değiştir</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Ağ bağlantılarını yapılandırma</translation> <translation id="8624205858755890468">Asistan'ın ilgili bilgi, uygulama ve işlemleri göstermesini sağlar.</translation> <translation id="862542460444371744">&Uzantılar</translation> +<translation id="8626219642120025691">Zamanlayıcı bitti</translation> <translation id="8627151598708688654">Kaynak seçin</translation> <translation id="862727964348362408">Askıya alındı</translation> <translation id="862750493060684461">CSS önbelleği</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Yaptığınız düzenlemeler otomatik olarak kaydedilir. <ph name="BREAKS" />Orijinal resmin kopyasını saklamak için "Orijinalin üzerine yaz" seçeneğinin işaretini kaldırın</translation> <translation id="8777628254805677039">kök şifre</translation> <translation id="8780443667474968681">Sesli arama özelliği kapatıldı.</translation> +<translation id="878068003854005405">Haydi başlayalım. Parmağınızı sensörün üzerine yerleştirin.</translation> <translation id="878069093594050299">Bu sertifika, aşağıdaki kullanımlar için doğrulanmıştır:</translation> <translation id="8781980678064919987">Kapak kapatıldığında gücü kapat</translation> <translation id="8782565991310229362">Kiosk uygulaması başlatma iptal edildi.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Parola</translation> <translation id="9052208328806230490">Yazıcılarınızı, <ph name="EMAIL" /> hesabını kullanarak <ph name="CLOUD_PRINT_NAME" /> hizmetine kaydettirdiniz.</translation> <translation id="9052404922357793350">Engellemeye devam et</translation> +<translation id="9053091947372579468">Cihazınız bir Chrome lisansı içeriyor ancak kullanıcı adınız bir Yönetici konsolu ile ilişkilendirilmemiş. Kayda devam etmek için lütfen bir Yönetici konsolu hesabı oluşturun. Not: Yeni bir Yönetici konsolu hesabı oluşturmak için kendi alanınızı kullanmayı seçerseniz kaydolduktan sonra alan doğrulamasını da tamamlamanız gerekir. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Seçimimi hatırla</translation> <translation id="9055636786322918818">RC4 şifrelemesini uygula. RC4 şifreleri güvenli olmadığından bu seçeneğin kullanılması, riskinizi artırır.</translation> <translation id="9056034633062863292">Chromebox'u güncelleme</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Varsayılan olarak ayarla</translation> <translation id="9219103736887031265">Resimler</translation> <translation id="9220525904950070496">Hesabı kaldır</translation> +<translation id="9220820413868316583">Kaldırın, ardından tekrar deneyin.</translation> <translation id="923467487918828349">Tümünü Göster</translation> <translation id="928985544179707652">Uzantılar:</translation> <translation id="930268624053534560">Ayrıntılı Zaman Damgaları</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index fd4b2b4..95bb8e5 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Немає мереж</translation> <translation id="1056898198331236512">Застереження</translation> <translation id="1058262162121953039">PUK-код</translation> +<translation id="1059855432287631118">Реєстрація відбитка</translation> <translation id="1061904396131502319">Невдовзі час зробити перерву</translation> <translation id="1062407476771304334">Замінити</translation> <translation id="1067048845568873861">Створено</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Ромб</translation> <translation id="1114335938027186412">Ваш комп’ютер оснащено пристроєм Trusted Platform Module (TPM), який виконує багато важливих функцій безпеки в ОС Chrome. Щоб дізнатися більше, відвідайте Довідковий центр Chromebook: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Переходити в режим сну, коли кришка закрита</translation> +<translation id="1115324527092594775">Налаштувати Better Together</translation> <translation id="1116694919640316211">Про Google Chrome</translation> <translation id="1116779635164066733">Цей параметр встановлюється розширенням "<ph name="NAME" />".</translation> <translation id="111844081046043029">Дійсно залишити цю сторінку?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Поточний час</translation> <translation id="1157102636231978136">Дані веб-перегляду й історія активності, синхронізовані з обліковим записом Google</translation> <translation id="1161575384898972166">Увійдіть у <ph name="TOKEN_NAME" />, щоб експортувати сертифікат клієнта.</translation> +<translation id="1161699061380012396">Метод введення ОС Chrome</translation> <translation id="1163931534039071049">&Переглянути джерело фрейма</translation> <translation id="1164674268730883318">Вимкнути Smart Lock для пристрою <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Введіть ключ для розблокування PIN-коду</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Обліковий запис Google Play</translation> <translation id="2509495747794740764">Розмір масштабування має бути числом від 10 до 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Автоматично заповняти форми</translation> <translation id="2513403576141822879">Інші налаштування конфіденційності, безпеки та збору даних доступні в розділі <ph name="BEGIN_LINK" />Синхронізація та сервіси Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Сканувати</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Серійний номер: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Переглянути джерело фрейму</translation> <translation id="3022978424994383087">Незрозуміло.</translation> +<translation id="3023464535986383522">Читання з екрана</translation> <translation id="3024374909719388945">Використовувати 24-годинний формат</translation> <translation id="302781076327338683">Оновити в обхід кешу</translation> <translation id="3031417829280473749">Агент X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Наступний спосіб введення</translation> <translation id="3640214691812501263">Додати розширення <ph name="EXTENSION_NAME" /> для користувача <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Ширина</translation> +<translation id="3645372836428131288">Трохи перемістіть палець, щоб зісканувати весь відбиток.</translation> <translation id="3648348069317717750">Виявлено пристрій <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Фотографію збережено</translation> <translation id="3650952250015018111">Надати додатку "<ph name="APP_NAME" />" доступ:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Політика сертифікатів</translation> <translation id="392089482157167418">Увімкнути ChromeVox (голосові підказки)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Немає нещодавно створених журналів WebRTC.</translation> <translation id="3925573269917483990">Камера:</translation> <translation id="3925842537050977900">Відкріпити з полиці</translation> <translation id="3926002189479431949">Телефон для Smart Lock змінено</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Жокей</translation> <translation id="4387004326333427325">Сертифікат автентифікації відхилений дистанційно</translation> <translation id="4389091756366370506">Користувач <ph name="VALUE" /></translation> +<translation id="439266289085815679"><ph name="USER_EMAIL" /> керує налаштуваннями Bluetooth.</translation> <translation id="4394049700291259645">Вимкнути</translation> <translation id="4400367121200150367">Тут відображатимуться сайти, які ніколи не зберігають паролі</translation> <translation id="4400632832271803360">Утримуйте клавішу панелі запуску, щоб змінити функції клавіш верхнього ряду</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Дозволяти цьому сайту переглядати буфер обміну</translation> <translation id="4530494379350999373">Походження</translation> <translation id="4533985347672295764">Процесорний час</translation> +<translation id="4534661889221639075">Повторіть спробу.</translation> <translation id="4535127706710932914">Профіль за умовчанням</translation> <translation id="4538417792467843292">Видалити слово</translation> <translation id="4538684596480161368">Завжди блокувати плагіни з неізольованим програмним середовищем на сайті <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Автовиправлення</translation> <translation id="4880827082731008257">Пошук в історії</translation> <translation id="4881695831933465202">Відкрити</translation> +<translation id="4882312758060467256">Має доступ до цього сайту</translation> <translation id="4882473678324857464">Перейти до закладок</translation> <translation id="4882831918239250449">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку, оголошень тощо</translation> <translation id="4883178195103750615">Експортувати закладки у файл HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Альбом</translation> <translation id="4971412780836297815">Відкрити після завантаження</translation> <translation id="4972129977812092092">Змінити принтер</translation> +<translation id="4972164225939028131">Неправильний пароль</translation> <translation id="497287958838527945">Кредитні картки й адреси, пов’язані з Google Pay.</translation> <translation id="4973307593867026061">Додати принтери</translation> <translation id="4973523518332075481">Задовга назва. Максимальна кількість символів: <ph name="MAX_LENGTH" />.</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Завантаження додатків…</translation> <translation id="5592595402373377407">Ще недостатньо даних.</translation> +<translation id="5593357315997824387">Синхронізувати мої файли</translation> <translation id="5595152862129936745">Дуже далеко</translation> <translation id="5595485650161345191">Редагувати адресу</translation> <translation id="5596627076506792578">Інші опції</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">На жаль, ваш комп’ютер налаштовано за допомогою ідентифікатора апаратного забезпечення з невірною структурою. Це перешкоджає оновленню ОС Chrome найновішими виправленнями системи безпеки, а тому ваш комп’ютер <ph name="BEGIN_BOLD" />може бути вразливим до зловмисних атак<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Не вдалося відкрити профіль. Вийдіть і знову ввійдіть.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">зупинити таймер</translation> <translation id="667517062706956822">Перекласти цю сторінку (<ph name="SOURCE_LANGUAGE" />) такою мовою: <ph name="TARGET_LANGUAGE" />?</translation> <translation id="6675665718701918026">Маніпулятор підключено</translation> <translation id="6678717876183468697">URL-адреса пошукового запиту</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Залишити на панелі інструментів</translation> <translation id="7187428571767585875">Записи в реєстрі, які буде видалено або змінено:</translation> <translation id="7189234443051076392">Переконайтеся, що на пристрої достатньо вільного місця</translation> +<translation id="7189965711416741966">Відбиток додано.</translation> <translation id="7191159667348037">Невідомий принтер (USB)</translation> <translation id="7191454237977785534">Зберегти файл як</translation> <translation id="7193374945610105795">Немає збережених паролів для <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Нове вікно</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> зараз у повноекранному режимі.</translation> <translation id="7340650977506865820">Сайт показує ваш екран</translation> +<translation id="7341834142292923918">Хоче отримати доступ до цього сайту</translation> <translation id="7345706641791090287">Підтвердьте пароль</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347751611463936647">Щоб користуватися цим розширенням, введіть "<ph name="EXTENSION_KEYWORD" />", потім TAB, а потім свою команду чи пошук.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Щоб визначати місцезнаходження пристрою, служба локації Google використовує такі джерела, як-от Wi-Fi, мобільні мережі й датчики. Вона активна, коли на пристрої ввімкнено налаштування місцезнаходження.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Ви можете не визначати місцезнаходження, дезактивувавши на цьому пристрої функцію "Доступ до моїх геоданих". Вимкнути визначення місцезнаходження за допомогою Wi-Fi, мобільних мереж і датчиків можна також у налаштуваннях меню "Доступ до моїх геоданих".<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Створити пароль –</translation> -<translation id="7518150891539970662">Журнали WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Створити</translation> <translation id="7529411698175791732">Перевірте з’єднання з Інтернетом. Якщо проблема не зникне, вийдіть з облікового запису та знову ввійдіть.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Видалити цього користувача</translation> <translation id="8217399928341212914">Надалі блокувати автоматичне завантаження декількох файлів</translation> <translation id="8223479393428528563">Щоб зберегти ці файли для використання в режимі офлайн, під’єднайте пристрій до Інтернету, натисніть файли правою кнопкою миші та виберіть опцію <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Скористатися пропозиціями</translation> <translation id="8226222018808695353">Заборонено</translation> <translation id="8226619461731305576">Черга</translation> <translation id="8226742006292257240">Нижче наведено навмання створений пароль для модуля TPM, присвоєний вашому комп'ютеру:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Вхід</translation> <translation id="8286963743045814739">Ви можете переглядати веб-сторінки конфіденційно в режимі анонімного перегляду</translation> <translation id="82871696630048499">Веб-сторінку оновлено, оскільки недостатньо пам’яті.</translation> +<translation id="8288032458496410887">Видалити додаток <ph name="APP" />…</translation> <translation id="8291967909914612644">Країна локального постачальника</translation> <translation id="8294431847097064396">Джерело</translation> <translation id="8297006494302853456">Слабкий</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Спершу запитувати (рекомендується)</translation> <translation id="8418445294933751433">&Показати як вкладку</translation> <translation id="8419098111404128271">Результати пошуку для запиту "<ph name="SEARCH_TEXT" />"</translation> +<translation id="8419368276599091549">Вітаємо на пристрої <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Показувати файли Документів Google</translation> <translation id="8424039430705546751">униз</translation> <translation id="8425213833346101688">Змінити</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Налаштувати з’єднання з мережею</translation> <translation id="8624205858755890468">Дозволяє Асистенту показувати вам пов’язані дані, додатки та дії.</translation> <translation id="862542460444371744">&Розширення</translation> +<translation id="8626219642120025691">Таймер вимкнено</translation> <translation id="8627151598708688654">Виберіть джерело</translation> <translation id="862727964348362408">Призупинено</translation> <translation id="862750493060684461">Кеш CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Ваші зміни зберігаються автоматично.<ph name="BREAKS" />Щоб зберегти копію оригінального зображення, зніміть прапорець поруч з опцією "Замінити оригінал"</translation> <translation id="8777628254805677039">кореневий пароль</translation> <translation id="8780443667474968681">Голосовий пошук вимкнено.</translation> +<translation id="878068003854005405">Розпочнімо. Покладіть палець на датчик.</translation> <translation id="878069093594050299">Цей сертифікат підтверджено для використання таким чином:</translation> <translation id="8781980678064919987">Завершувати роботу, коли кришка закрита</translation> <translation id="8782565991310229362">Скасовано запуск програми для терміналів.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Парольна фраза</translation> <translation id="9052208328806230490">Ви зареєстрували свої принтери в <ph name="CLOUD_PRINT_NAME" />, використавши обліковий запис <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Продовжити блокування</translation> +<translation id="9053091947372579468">Ваш пристрій містить ліцензію Chrome, але ім’я користувача не пов’язане з Консоллю адміністратора. Щоб продовжити реєстрацію, створіть обліковий запис Консолі адміністратора. Примітка. Якщо ви створите новий обліковий запис за допомогою власного домену, після реєстрації потрібно буде підтвердити домен. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Запам’ятати мій вибір</translation> <translation id="9055636786322918818">Застосовує шифрування RC4. Використання цієї опції підвищує ризик, оскільки шифри RC4 ненадійні.</translation> <translation id="9056034633062863292">Оновлення Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Установити за умовчанням</translation> <translation id="9219103736887031265">Зображення</translation> <translation id="9220525904950070496">Видалення облікового запису</translation> +<translation id="9220820413868316583">Підніміть палець, а потім повторіть спробу.</translation> <translation id="923467487918828349">Показати всі</translation> <translation id="928985544179707652">Розширення:</translation> <translation id="930268624053534560">Детальні позначки часу</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 06e1d18..de2cc86 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">Không có mạng</translation> <translation id="1056898198331236512">Cảnh báo</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">Đăng ký dấu vân tay</translation> <translation id="1061904396131502319">Sắp đến giờ nghỉ giải lao</translation> <translation id="1062407476771304334">Thay thế</translation> <translation id="1067048845568873861">Đã tạo</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">Kim cương</translation> <translation id="1114335938027186412">Máy tính của bạn chứa thiết bị bảo mật Mô-đun nền tảng đáng tin cậy (TPM) dùng để triển khai nhiều tính năng bảo mật quan trọng trong Chrome OS. Hãy truy cập Trung tâm trợ giúp Chromebook để tìm hiểu thêm: https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">Chuyển sang chế độ ngủ khi đóng nắp</translation> +<translation id="1115324527092594775">Thiết lập tính năng Better Together</translation> <translation id="1116694919640316211">Giới thiệu về</translation> <translation id="1116779635164066733">Cài đặt này do tiện ích "<ph name="NAME" />" thực thi.</translation> <translation id="111844081046043029">Bạn có chắc chắn muốn thoát khỏi trang này không?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">Thời gian hiện tại</translation> <translation id="1157102636231978136">Hoạt động và dữ liệu duyệt web của bạn, được đồng bộ hóa với Tài khoản Google</translation> <translation id="1161575384898972166">Vui lòng đăng nhập vào <ph name="TOKEN_NAME" /> để xuất chứng chỉ ứng dụng khách.</translation> +<translation id="1161699061380012396">Phương thức nhập trên Chrome OS</translation> <translation id="1163931534039071049">&Xem nguồn khung</translation> <translation id="1164674268730883318">Tắt Smart Lock cho <ph name="DEVICE_TYPE" />?</translation> <translation id="1164899421101904659">Nhập khóa mở khóa mã PIN</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Tài khoản Cửa hàng Google Play</translation> <translation id="2509495747794740764">Số tỷ lệ phải là một số giữa 10 và 200.</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">Tự động điền biểu mẫu</translation> <translation id="2513403576141822879">Bạn có thể xem thêm tùy chọn cài đặt liên quan đến quyền riêng tư, bảo mật và hoạt động thu thập dữ liệu trong phần <ph name="BEGIN_LINK" />Đồng bộ hóa và dịch vụ của Google<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Quét</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">Số Sê-ri: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">&Xem Nguồn Khung</translation> <translation id="3022978424994383087">Không hiểu được.</translation> +<translation id="3023464535986383522">Chọn để nói</translation> <translation id="3024374909719388945">Sử dụng đồng hồ 24 giờ</translation> <translation id="302781076327338683">Tải lại bộ nhớ đệm bỏ qua</translation> <translation id="3031417829280473749">Đặc vụ X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">Phương thức nhập tiếp theo</translation> <translation id="3640214691812501263">Thêm "<ph name="EXTENSION_NAME" />" cho <ph name="USER_NAME" />?</translation> <translation id="3644896802912593514">Chiều rộng</translation> +<translation id="3645372836428131288">Di chuyển nhẹ để quét một phần khác của vân tay.</translation> <translation id="3648348069317717750">Đã phát hiện thấy <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Đã chụp ảnh</translation> <translation id="3650952250015018111">Cho phép "<ph name="APP_NAME" />" truy cập vào:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">Chính sách Chứng chỉ</translation> <translation id="392089482157167418">Bật ChromeVox (phản hồi bằng giọng nói)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">Bạn không có nhật ký WebRTC được ghi gần đây.</translation> <translation id="3925573269917483990">Máy ảnh:</translation> <translation id="3925842537050977900">Bỏ ghim khỏi giá</translation> <translation id="3926002189479431949">Đã thay đổi điện thoại Smart Lock</translation> @@ -2224,6 +2227,7 @@ <translation id="438503109373656455">Ngựa đua Saratoga</translation> <translation id="4387004326333427325">Chứng chỉ xác thực bị từ chối từ xa</translation> <translation id="4389091756366370506">Người dùng <ph name="VALUE" /></translation> +<translation id="439266289085815679">Cấu hình Bluetooth do <ph name="USER_EMAIL" /> kiểm soát.</translation> <translation id="4394049700291259645">Vô hiệu hóa</translation> <translation id="4400367121200150367">Trang web không bao giờ lưu mật khẩu sẽ xuất hiện tại đây</translation> <translation id="4400632832271803360">Giữ phím Trình khởi chạy để chuyển đổi chức năng của các phím hàng trên cùng</translation> @@ -2297,6 +2301,7 @@ <translation id="4522600456902129422">Tiếp tục cho phép trang web này xem khay nhớ tạm</translation> <translation id="4530494379350999373">Nguồn gốc</translation> <translation id="4533985347672295764">Thời gian của CPU</translation> +<translation id="4534661889221639075">Hãy thử lại.</translation> <translation id="4535127706710932914">Hồ sơ mặc định</translation> <translation id="4538417792467843292">Xóa từ</translation> <translation id="4538684596480161368">Luôn chặn các plugin không có hộp cát trên <ph name="HOST" /></translation> @@ -2526,6 +2531,7 @@ <translation id="4880520557730313061">Tự động sửa</translation> <translation id="4880827082731008257">Lịch sử tìm kiếm</translation> <translation id="4881695831933465202">Mở</translation> +<translation id="4882312758060467256">Có quyền truy cập vào trang web này</translation> <translation id="4882473678324857464">Lấy tiêu điểm dấu trang</translation> <translation id="4882831918239250449">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm, quảng cáo và các dịch vụ khác</translation> <translation id="4883178195103750615">Xuất dấu trang sang tệp HTML...</translation> @@ -2591,6 +2597,7 @@ <translation id="4969785127455456148">Album</translation> <translation id="4971412780836297815">Mở khi hoàn tất</translation> <translation id="4972129977812092092">Chỉnh sửa máy in</translation> +<translation id="4972164225939028131">Mật khẩu sai</translation> <translation id="497287958838527945">Thẻ tín dụng và địa chỉ sử dụng Google Pay.</translation> <translation id="4973307593867026061">Thêm máy in</translation> <translation id="4973523518332075481">Hãy sử dụng tên có tối đa <ph name="MAX_LENGTH" /> ký tự</translation> @@ -3018,6 +3025,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Đang tải ứng dụng...</translation> <translation id="5592595402373377407">Chưa có đủ dữ liệu.</translation> +<translation id="5593357315997824387">Đồng bộ hóa tệp của tôi</translation> <translation id="5595152862129936745">Rất xa</translation> <translation id="5595485650161345191">Chỉnh sửa địa chỉ</translation> <translation id="5596627076506792578">Tùy chọn khác</translation> @@ -3733,6 +3741,7 @@ <translation id="6664237456442406323">Rất tiếc, máy tính của bạn được định cấu hình bằng ID phần cứng không đúng định dạng. Điều này ngăn Chrome OS cập nhật các bản vá bảo mật mới nhất và máy tính của bạn <ph name="BEGIN_BOLD" />có thể bị các cuộc tấn công làm hại<ph name="END_BOLD" />.</translation> <translation id="6664774537677393800">Đã xảy ra sự cố khi mở hồ sơ của bạn. Vui lòng đăng xuất rồi đăng nhập lại.</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">dừng hẹn giờ</translation> <translation id="667517062706956822">Bạn có muốn Google dịch trang này từ <ph name="SOURCE_LANGUAGE" /> sang <ph name="TARGET_LANGUAGE" /> không?</translation> <translation id="6675665718701918026">Đã kết nối thiết bị trỏ</translation> <translation id="6678717876183468697">URL truy vấn</translation> @@ -4059,6 +4068,7 @@ <translation id="7186088072322679094">Giữ trong thanh công cụ</translation> <translation id="7187428571767585875">Các mục sổ đăng ký sẽ bị xóa hoặc thay đổi:</translation> <translation id="7189234443051076392">Hãy đảm bảo thiết bị của bạn có đủ dung lượng</translation> +<translation id="7189965711416741966">Đã thêm vân tay.</translation> <translation id="7191159667348037">Máy in không xác định (USB)</translation> <translation id="7191454237977785534">Lưu tệp dưới dạng</translation> <translation id="7193374945610105795">Không có mật khẩu nào được lưu cho <ph name="ORIGIN" /></translation> @@ -4159,6 +4169,7 @@ <translation id="7339898014177206373">Cửa sổ mới</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> hiện ở chế độ toàn màn hình.</translation> <translation id="7340650977506865820">Trang web đang chia sẻ màn hình của bạn</translation> +<translation id="7341834142292923918">Muốn truy cập vào trang web này</translation> <translation id="7345706641791090287">Xác nhận mật khẩu của bạn</translation> <translation id="7346909386216857016">Ok</translation> <translation id="7347751611463936647">Để sử dụng tiện ích này, nhập "<ph name="EXTENSION_KEYWORD" />", sau đó nhấn TAB rồi câu lệnh hoặc tìm kiếm của bạn.</translation> @@ -4268,7 +4279,6 @@ <ph name="BEGIN_PARAGRAPH2" />Dịch vụ vị trí của Google sử dụng các nguồn như Wi-Fi, mạng di động và cảm biến để giúp ước đoán vị trí của thiết bị. Dịch vụ này hoạt động khi tùy chọn cài đặt Vị trí của thiết bị đang bật.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Bạn có thể tắt Vị trí bằng cách tắt tùy chọn cài đặt Vị trí chính trên thiết bị. Ngoài ra, bạn cũng có thể tắt cài đặt sử dụng mạng Wi-Fi, mạng di động và các cảm biến vị trí trong phần cài đặt vị trí.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">Tạo mật khẩu -</translation> -<translation id="7518150891539970662">Nhật ký WebRTC (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">Tạo</translation> <translation id="7529411698175791732">Kiểm tra kết nối Internet. Nếu sự cố vẫn tiếp diễn, hãy thử đăng xuất và đăng nhập lại.</translation> @@ -4746,6 +4756,7 @@ <translation id="8214962590150211830">Xóa người này</translation> <translation id="8217399928341212914">Tiếp tục chặn tự động tải nhiều tệp xuống</translation> <translation id="8223479393428528563">Để lưu các tệp này để sử dụng ngoại tuyến, hãy trực tuyến trở lại, nhấp chuột phải vào tệp và chọn tùy chọn <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> +<translation id="8225753906568652947">Đổi ưu đãi của bạn</translation> <translation id="8226222018808695353">Bị cấm</translation> <translation id="8226619461731305576">Hàng đợi</translation> <translation id="8226742006292257240">Dưới đây là mật khẩu TPM được tạo ngẫu nhiên đã được gán cho máy tính của bạn:</translation> @@ -4792,6 +4803,7 @@ <translation id="8286036467436129157">Đăng nhập</translation> <translation id="8286963743045814739">Bạn có thể duyệt web riêng tư bằng cách sử dụng cửa sổ ẩn danh</translation> <translation id="82871696630048499">Trang web này đã được tải lại do hết bộ nhớ.</translation> +<translation id="8288032458496410887">Gỡ cài đặt <ph name="APP" />...</translation> <translation id="8291967909914612644">Quốc gia của nhà cung cấp Home</translation> <translation id="8294431847097064396">Nguồn</translation> <translation id="8297006494302853456">Yếu</translation> @@ -4853,6 +4865,7 @@ <translation id="8413385045638830869">Hỏi trước (được đề xuất)</translation> <translation id="8418445294933751433">&Hiển thị dưới dạng tab</translation> <translation id="8419098111404128271">Kết quả tìm kiếm cho '<ph name="SEARCH_TEXT" />'</translation> +<translation id="8419368276599091549">Chào mừng bạn đến với <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">Hiển thị các tệp được lưu trữ trong Google Documents</translation> <translation id="8424039430705546751">xuống</translation> <translation id="8425213833346101688">Thay đổi</translation> @@ -4979,6 +4992,7 @@ <translation id="8620765578342452535">Định cấu hình kết nối mạng</translation> <translation id="8624205858755890468">Cho phép Trợ lý hiển thị cho bạn các hành động, ứng dụng và thông tin có liên quan.</translation> <translation id="862542460444371744">&Tiện ích mở rộng</translation> +<translation id="8626219642120025691">Đã thiết lập xong bộ hẹn giờ</translation> <translation id="8627151598708688654">Chọn nguồn</translation> <translation id="862727964348362408">Bị tạm ngưng</translation> <translation id="862750493060684461">Bộ nhớ đệm CSS</translation> @@ -5099,6 +5113,7 @@ <translation id="8775404590947523323">Chỉnh sửa của bạn đã được lưu tự động.<ph name="BREAKS" />Để giữ bản sao của ảnh gốc, hãy bỏ chọn "Ghi đè tệp gốc"</translation> <translation id="8777628254805677039">mật khẩu gốc</translation> <translation id="8780443667474968681">Tính năng tìm kiếm bằng giọng nói đã bị tắt.</translation> +<translation id="878068003854005405">Bắt đầu thôi nào. Hãy đặt ngón tay lên bộ cảm biến.</translation> <translation id="878069093594050299">Chứng chỉ này đã được xác minh cho các mục đích sử dụng sau:</translation> <translation id="8781980678064919987">Tắt máy khi đóng nắp</translation> <translation id="8782565991310229362">Đã hủy chạy ứng dụng kiosk.</translation> @@ -5276,6 +5291,7 @@ <translation id="9050666287014529139">Cụm mật khẩu</translation> <translation id="9052208328806230490">Bạn vừa đăng ký máy in của mình với <ph name="CLOUD_PRINT_NAME" /> bằng tài khoản <ph name="EMAIL" /></translation> <translation id="9052404922357793350">Tiếp tục chặn</translation> +<translation id="9053091947372579468">Thiết bị của bạn bao gồm giấy phép Chrome, nhưng tên người dùng lại không liên kết với Bảng điều khiển dành cho quản trị viên. Vui lòng tạo tài khoản Bảng điều khiển dành cho quản trị viên để tiếp tục đăng ký. Lưu ý: Nếu chọn dùng miền của riêng mình để tạo tài khoản mới trên Bảng điều khiển dành cho quản trị viên, bạn vẫn phải hoàn tất xác minh miền sau khi đăng ký. https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">Ghi nhớ lựa chọn của tôi</translation> <translation id="9055636786322918818">Thực thi mã hóa RC4. Việc sử dụng tùy chọn này sẽ làm gia tăng rủi ro vì các thuật toán mã hóa RC4 là không an toàn.</translation> <translation id="9056034633062863292">Đang cập nhật Chromebox</translation> @@ -5379,6 +5395,7 @@ <translation id="9218430445555521422">Đặt làm mặc định</translation> <translation id="9219103736887031265">Hình ảnh</translation> <translation id="9220525904950070496">Xóa tài khoản</translation> +<translation id="9220820413868316583">Nhấc ngón tay lên rồi thử lại.</translation> <translation id="923467487918828349">Hiển thị Tất cả</translation> <translation id="928985544179707652">Tiện ích:</translation> <translation id="930268624053534560">Dấu thời gian chi tiết</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 8352e3e6..9809a3e 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">找不到任何网络</translation> <translation id="1056898198331236512">警告</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">正在注册指纹</translation> <translation id="1061904396131502319">快到休息时间了</translation> <translation id="1062407476771304334">替换</translation> <translation id="1067048845568873861">创建时间</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">菱形</translation> <translation id="1114335938027186412">您的计算机包含可信平台模块 (TPM) 安全装置,该装置可用于在 Chrome 操作系统中实施许多关键的安全功能。要了解详情,请访问 Chromebook 帮助中心:https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">在盖被合上之后进入休眠模式</translation> +<translation id="1115324527092594775">设置 Better Together</translation> <translation id="1116694919640316211">关于</translation> <translation id="1116779635164066733">此设置是由“<ph name="NAME" />”这一扩展程序强制指定的。</translation> <translation id="111844081046043029">确定要离开此页吗?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">当前时间</translation> <translation id="1157102636231978136">您的浏览数据和活动,会同步到您的 Google 帐号</translation> <translation id="1161575384898972166">请登录“<ph name="TOKEN_NAME" />”,导出客户端证书。</translation> +<translation id="1161699061380012396">Chrome 操作系统输入法</translation> <translation id="1163931534039071049">查看框架的源代码(&V)</translation> <translation id="1164674268730883318">要关闭 Smart Lock(<ph name="DEVICE_TYPE" /> 版)吗?</translation> <translation id="1164899421101904659">输入 PIN 码解锁密钥</translation> @@ -1001,7 +1004,6 @@ <translation id="2508428939232952663">Google Play 商店帐号</translation> <translation id="2509495747794740764">缩放值必须是一个介于 10 到 200 之间的数字。</translation> <translation id="2509566264613697683">8 倍</translation> -<translation id="2512222046227390255">自动填充表单</translation> <translation id="2513403576141822879">若想了解更多与隐私、安全和数据收集相关的设置,请参阅<ph name="BEGIN_LINK" />同步功能和 Google 服务<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">扫描</translation> @@ -1353,6 +1355,7 @@ <translation id="3020990233660977256">序列号:<ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">查看框架的源代码(&V)</translation> <translation id="3022978424994383087">无法解析您所说的内容。</translation> +<translation id="3023464535986383522">随选朗读</translation> <translation id="3024374909719388945">使用24小时制</translation> <translation id="302781076327338683">忽略缓存重新加载</translation> <translation id="3031417829280473749">女特工</translation> @@ -1747,6 +1750,7 @@ <translation id="363903084947548957">下一种输入法</translation> <translation id="3640214691812501263">要为<ph name="USER_NAME" />添加“<ph name="EXTENSION_NAME" />”吗?</translation> <translation id="3644896802912593514">宽度</translation> +<translation id="3645372836428131288">请稍微移动一下手指,以便系统记录您指纹的不同部分。</translation> <translation id="3648348069317717750">检测到<ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">照片已拍摄</translation> <translation id="3650952250015018111">允许“<ph name="APP_NAME" />”访问:</translation> @@ -1942,7 +1946,6 @@ <translation id="3920504717067627103">证书政策</translation> <translation id="392089482157167418">启用 ChromeVox(语音反馈)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">您最近没有记录WebRTC日志。</translation> <translation id="3925573269917483990">摄像头:</translation> <translation id="3925842537050977900">取消固定到任务栏</translation> <translation id="3926002189479431949">Smart Lock 的配对手机已更改</translation> @@ -2217,6 +2220,7 @@ <translation id="438503109373656455">小马</translation> <translation id="4387004326333427325">身份验证证书遭到远程拒绝</translation> <translation id="4389091756366370506">用户 <ph name="VALUE" /></translation> +<translation id="439266289085815679">蓝牙配置由 <ph name="USER_EMAIL" /> 控制。</translation> <translation id="4394049700291259645">停用</translation> <translation id="4400367121200150367">一律不保存密码的网站将显示在这里</translation> <translation id="4400632832271803360">按住启动器键可切换顶行键的行为</translation> @@ -2290,6 +2294,7 @@ <translation id="4522600456902129422">继续允许此网站查看剪贴板</translation> <translation id="4530494379350999373">来源</translation> <translation id="4533985347672295764">CPU 时间</translation> +<translation id="4534661889221639075">请重试。</translation> <translation id="4535127706710932914">默认个人资料</translation> <translation id="4538417792467843292">删除字词</translation> <translation id="4538684596480161368">一律禁止在 <ph name="HOST" /> 上使用未经过沙盒屏蔽的插件</translation> @@ -2519,6 +2524,7 @@ <translation id="4880520557730313061">自动修正</translation> <translation id="4880827082731008257">搜索历史记录</translation> <translation id="4881695831933465202">打开</translation> +<translation id="4882312758060467256">可以访问此网站</translation> <translation id="4882473678324857464">将焦点移到书签</translation> <translation id="4882831918239250449">控制 Google 如何利用您的浏览记录为您提供个性化的搜索、广告和其他服务</translation> <translation id="4883178195103750615">将书签导出到 HTML 文件...</translation> @@ -2584,6 +2590,7 @@ <translation id="4969785127455456148">专辑</translation> <translation id="4971412780836297815">完成后打开</translation> <translation id="4972129977812092092">修改打印机</translation> +<translation id="4972164225939028131">密码错误</translation> <translation id="497287958838527945">Google Pay 中存储的信用卡和地址信息。</translation> <translation id="4973307593867026061">添加打印机</translation> <translation id="4973523518332075481">所用名称的长度不得超过 <ph name="MAX_LENGTH" /> 个字符</translation> @@ -3005,6 +3012,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">正在加载应用…</translation> <translation id="5592595402373377407">尚无足够的数据。</translation> +<translation id="5593357315997824387">同步我的文件</translation> <translation id="5595152862129936745">非常远</translation> <translation id="5595485650161345191">修改地址</translation> <translation id="5596627076506792578">更多选项</translation> @@ -3719,6 +3727,7 @@ <translation id="6664237456442406323">很遗憾,您的计算机配置了格式错误的硬件 ID。这导致 Chrome 操作系统无法使用最新的安全修正程序进行更新,以致您的计算机<ph name="BEGIN_BOLD" />很容易遭到恶意攻击<ph name="END_BOLD" />。</translation> <translation id="6664774537677393800">打开您的个人资料时出了点问题。请先退出,然后重新登录。</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">停止计时器</translation> <translation id="667517062706956822">您希望 Google 将此网页的内容从<ph name="SOURCE_LANGUAGE" />翻译为<ph name="TARGET_LANGUAGE" />吗?</translation> <translation id="6675665718701918026">已连接指针设备</translation> <translation id="6678717876183468697">查询网址</translation> @@ -4045,6 +4054,7 @@ <translation id="7186088072322679094">固定在工具栏中</translation> <translation id="7187428571767585875">要移除或要更改的注册表项:</translation> <translation id="7189234443051076392">确保您的设备上有足够的空间</translation> +<translation id="7189965711416741966">已添加指纹。</translation> <translation id="7191159667348037">未知打印机 (USB)</translation> <translation id="7191454237977785534">文件另存为</translation> <translation id="7193374945610105795">未保存任何用于登录 <ph name="ORIGIN" /> 的密码</translation> @@ -4145,6 +4155,7 @@ <translation id="7339898014177206373">打开新的窗口</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> 现处于全屏模式。</translation> <translation id="7340650977506865820">该网站正在共享您的屏幕</translation> +<translation id="7341834142292923918">想要访问此网站</translation> <translation id="7345706641791090287">确认您的密码</translation> <translation id="7346909386216857016">知道了</translation> <translation id="7347751611463936647">要使用该扩展程序,请依次键入“<ph name="EXTENSION_KEYWORD" />”和 TAB,然后键入您的命令或搜索。</translation> @@ -4254,7 +4265,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google 的位置信息服务会使用 WLAN、移动网络和传感器等来源协助推测设备所在的位置。当您开启设备上的“位置信息”设置时,系统即会启用这项服务。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />您可通过关闭设备上的主要“位置信息”设置来关闭位置信息服务。此外,您也可在“位置信息”设置中关闭使用 WLAN、移动网络和传感器来确定位置的功能。<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">设置密码 -</translation> -<translation id="7518150891539970662">WebRTC日志(<ph name="WEBRTC_LOG_COUNT" />个)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">创建</translation> <translation id="7529411698175791732">请检查您的互联网连接。如果问题仍然存在,请尝试退出帐号并重新登录。</translation> @@ -4730,6 +4740,7 @@ <translation id="8214962590150211830">移除此用户</translation> <translation id="8217399928341212914">继续阻止自动下载多个文件</translation> <translation id="8223479393428528563">要保存这些文件以供离线使用,请恢复联网状态,右键点击文件,然后选择<ph name="OFFLINE_CHECKBOX_NAME" />选项。</translation> +<translation id="8225753906568652947">兑换优惠</translation> <translation id="8226222018808695353">已被禁止</translation> <translation id="8226619461731305576">队列</translation> <translation id="8226742006292257240">以下是一个分配给您计算机的、随机生成的 TPM 密码:</translation> @@ -4776,6 +4787,7 @@ <translation id="8286036467436129157">登录</translation> <translation id="8286963743045814739">无痕式窗口可让您私密地浏览</translation> <translation id="82871696630048499">该网页用尽了内存,因此已重新加载。</translation> +<translation id="8288032458496410887">卸载<ph name="APP" />…</translation> <translation id="8291967909914612644">家用移动网络提供商所属国家/地区</translation> <translation id="8294431847097064396">来源</translation> <translation id="8297006494302853456">弱</translation> @@ -4837,6 +4849,7 @@ <translation id="8413385045638830869">先询问(推荐)</translation> <translation id="8418445294933751433">显示为标签页(&S)</translation> <translation id="8419098111404128271">与“<ph name="SEARCH_TEXT" />”相符的搜索结果</translation> +<translation id="8419368276599091549">欢迎使用您的 <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">显示 Google 文档文件</translation> <translation id="8424039430705546751">向下</translation> <translation id="8425213833346101688">更改</translation> @@ -4963,6 +4976,7 @@ <translation id="8620765578342452535">配置网络连接</translation> <translation id="8624205858755890468">允许智能助理向您显示相关的信息、应用和操作。</translation> <translation id="862542460444371744">扩展程序(&E)</translation> +<translation id="8626219642120025691">计时完成</translation> <translation id="8627151598708688654">选择来源</translation> <translation id="862727964348362408">已暂停</translation> <translation id="862750493060684461">CSS 缓存</translation> @@ -5083,6 +5097,7 @@ <translation id="8775404590947523323">系统会自动保存您所做的修改。<ph name="BREAKS" />要保留原始图像的副本,请取消选中“覆盖原始文件”。</translation> <translation id="8777628254805677039">根密码</translation> <translation id="8780443667474968681">已关闭语音搜索功能。</translation> +<translation id="878068003854005405">让我们开始吧。请将您的手指放在传感器上。</translation> <translation id="878069093594050299">此证书已通过验证,具有以下用法:</translation> <translation id="8781980678064919987">在盖被合上之后关闭</translation> <translation id="8782565991310229362">已取消启动自助服务终端应用。</translation> @@ -5260,6 +5275,7 @@ <translation id="9050666287014529139">密码</translation> <translation id="9052208328806230490">您已使用帐号 <ph name="EMAIL" /> 将您的打印机注册为<ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9052404922357793350">继续拦截</translation> +<translation id="9053091947372579468">您的设备包含 Chrome 许可,但您的用户名未与任何管理控制台相关联。请创建一个管理控制台帐号,以便继续注册。请注意:如果您选择使用自己的网域来创建新的管理控制台帐号,则在注册后还必须要完成网域验证。https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">记住我的选择</translation> <translation id="9055636786322918818">强制执行 RC4 加密。选中此选项会令您面临更大的风险,因为 RC4 加密不安全。</translation> <translation id="9056034633062863292">正在更新 Chromebox</translation> @@ -5363,6 +5379,7 @@ <translation id="9218430445555521422">设为默认浏览器</translation> <translation id="9219103736887031265">图片</translation> <translation id="9220525904950070496">移除帐号</translation> +<translation id="9220820413868316583">请抬起手指,然后重试。</translation> <translation id="923467487918828349">显示全部</translation> <translation id="928985544179707652">扩展程序:</translation> <translation id="930268624053534560">详细时间戳</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index b44efcd..9978b8f5 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -42,6 +42,7 @@ <translation id="1056775291175587022">沒有網路</translation> <translation id="1056898198331236512">警告</translation> <translation id="1058262162121953039">PUK</translation> +<translation id="1059855432287631118">註冊指紋</translation> <translation id="1061904396131502319">快到休息時間了</translation> <translation id="1062407476771304334">取代</translation> <translation id="1067048845568873861">建立時間</translation> @@ -74,6 +75,7 @@ <translation id="1114202307280046356">菱形鍵</translation> <translation id="1114335938027186412">您的電腦含有可信任平台模組 (TPM) 安全性裝置,用於實作 Chrome 作業系統中許多重要的安全性功能。如需瞭解詳情,請造訪 Chromebook 說明中心:https://support.google.com/chromebook/?p=tpm</translation> <translation id="1114525161406758033">蓋上機蓋時進入休眠狀態</translation> +<translation id="1115324527092594775">設定 Better Together</translation> <translation id="1116694919640316211">關於</translation> <translation id="1116779635164066733">這項設定是由「<ph name="NAME" />」擴充功能強制執行。</translation> <translation id="111844081046043029">你確定要離開此網頁嗎?</translation> @@ -109,6 +111,7 @@ <translation id="1156488781945104845">目前時間</translation> <translation id="1157102636231978136">讓你的瀏覽資料和活動與你的 Google 帳戶保持同步</translation> <translation id="1161575384898972166">登入 <ph name="TOKEN_NAME" /> 即可匯出用戶端憑證。</translation> +<translation id="1161699061380012396">Chrome 作業系統輸入法</translation> <translation id="1163931534039071049">檢視框架原始碼(&V)</translation> <translation id="1164674268730883318">要關閉 <ph name="DEVICE_TYPE" /> 專用 Smart Lock 嗎?</translation> <translation id="1164899421101904659">輸入 PIN 解鎖金鑰</translation> @@ -1004,7 +1007,6 @@ <translation id="2508428939232952663">Google Play 商店帳戶</translation> <translation id="2509495747794740764">縮放比例必須為介於 10 和 200 之間的數字。</translation> <translation id="2509566264613697683">8x</translation> -<translation id="2512222046227390255">自動填入表單</translation> <translation id="2513403576141822879">如需更多隱私權、安全性和資料收集的相關設定,請參閱<ph name="BEGIN_LINK" />同步處理和 Google 服務<ph name="END_LINK" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">掃描</translation> @@ -1357,6 +1359,7 @@ <translation id="3020990233660977256">序號:<ph name="SERIAL_NUMBER" /></translation> <translation id="3021678814754966447">檢視頁框原始碼(&V)</translation> <translation id="3022978424994383087">無法辨識語音內容。</translation> +<translation id="3023464535986383522">隨選朗讀</translation> <translation id="3024374909719388945">使用 24 小時制時鐘</translation> <translation id="302781076327338683">略過快取重新載入</translation> <translation id="3031417829280473749">特務 X</translation> @@ -1753,6 +1756,7 @@ <translation id="363903084947548957">下一個輸入法</translation> <translation id="3640214691812501263">為<ph name="USER_NAME" />新增「<ph name="EXTENSION_NAME" />」?</translation> <translation id="3644896802912593514">寬度</translation> +<translation id="3645372836428131288">請稍微移動手指,讓系統擷取完整指紋</translation> <translation id="3648348069317717750">偵測到 <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">已擷取相片</translation> <translation id="3650952250015018111">允許「<ph name="APP_NAME" />」存取:</translation> @@ -1948,7 +1952,6 @@ <translation id="3920504717067627103">憑證原則</translation> <translation id="392089482157167418">啟用 ChromeVox (互動朗讀)</translation> <translation id="3924145049010392604">Meta</translation> -<translation id="3925247638945319984">你最近並未擷取 WebRTC 記錄。</translation> <translation id="3925573269917483990">相機:</translation> <translation id="3925842537050977900">從檔案櫃中取消固定</translation> <translation id="3926002189479431949">Smart Lock 手機已變更</translation> @@ -2223,6 +2226,7 @@ <translation id="438503109373656455">赤兔馬</translation> <translation id="4387004326333427325">遠端已拒絕驗證憑證</translation> <translation id="4389091756366370506">使用者 <ph name="VALUE" /></translation> +<translation id="439266289085815679">藍牙設定由 <ph name="USER_EMAIL" /> 控制。</translation> <translation id="4394049700291259645">停用</translation> <translation id="4400367121200150367">一律不儲存密碼的網站會顯示在這裡</translation> <translation id="4400632832271803360">按住啟動器鍵即可切換最上排按鍵的行為</translation> @@ -2296,6 +2300,7 @@ <translation id="4522600456902129422">繼續允許這個網站讀取剪貼簿</translation> <translation id="4530494379350999373">來源</translation> <translation id="4533985347672295764">CPU 時間</translation> +<translation id="4534661889221639075">請再試一次。</translation> <translation id="4535127706710932914">預設設定檔</translation> <translation id="4538417792467843292">刪除文字</translation> <translation id="4538684596480161368">一律禁止在 <ph name="HOST" /> 執行無沙箱防護的外掛程式</translation> @@ -2525,6 +2530,7 @@ <translation id="4880520557730313061">自動修正</translation> <translation id="4880827082731008257">搜尋記錄</translation> <translation id="4881695831933465202">開啟</translation> +<translation id="4882312758060467256">有權存取這個網站</translation> <translation id="4882473678324857464">將焦點移至書籤</translation> <translation id="4882831918239250449">控制 Google 使用瀏覽記錄提供個人化搜尋服務、廣告和其他內容的方式</translation> <translation id="4883178195103750615">將書籤匯出為 HTML 檔案...</translation> @@ -2590,6 +2596,7 @@ <translation id="4969785127455456148">相簿</translation> <translation id="4971412780836297815">完成後開啟</translation> <translation id="4972129977812092092">編輯印表機資訊</translation> +<translation id="4972164225939028131">密碼錯誤</translation> <translation id="497287958838527945">使用 Google Pay 儲存的信用卡和地址資訊。</translation> <translation id="4973307593867026061">新增印表機</translation> <translation id="4973523518332075481">請使用長度不超過 <ph name="MAX_LENGTH" /> 個字元的名稱</translation> @@ -3016,6 +3023,7 @@ <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">正在載入應用程式...</translation> <translation id="5592595402373377407">目前還沒有足夠的資料。</translation> +<translation id="5593357315997824387">同步處理我的檔案</translation> <translation id="5595152862129936745">非常遠</translation> <translation id="5595485650161345191">編輯地址</translation> <translation id="5596627076506792578">更多選項</translation> @@ -3730,6 +3738,7 @@ <translation id="6664237456442406323">抱歉,你的電腦是由格式錯誤的硬體 ID 所設定。這樣會防止 Chrome 作業系統更新最新的安全性修復,你的電腦也可能<ph name="BEGIN_BOLD" />容易遭受惡意攻擊<ph name="END_BOLD" />。</translation> <translation id="6664774537677393800">開啟你的設定檔時發生錯誤。請先登出,然後再次登入。</translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> +<translation id="6674412557034343536">停止計時器</translation> <translation id="667517062706956822">您要讓 Google 將這個網頁的內容從<ph name="SOURCE_LANGUAGE" />翻譯成<ph name="TARGET_LANGUAGE" />嗎?</translation> <translation id="6675665718701918026">已連上指標裝置</translation> <translation id="6678717876183468697">查詢網址</translation> @@ -4056,6 +4065,7 @@ <translation id="7186088072322679094">固定在工具列中</translation> <translation id="7187428571767585875">系統將移除或變更下列登錄檔項目:</translation> <translation id="7189234443051076392">確認你的裝置上有足夠空間</translation> +<translation id="7189965711416741966">指紋新增成功。</translation> <translation id="7191159667348037">不明的印表機 (USB)</translation> <translation id="7191454237977785534">另存新檔</translation> <translation id="7193374945610105795">系統沒有儲存 <ph name="ORIGIN" /> 的密碼</translation> @@ -4156,6 +4166,7 @@ <translation id="7339898014177206373">新視窗</translation> <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕。</translation> <translation id="7340650977506865820">網站正在分享你的螢幕畫面</translation> +<translation id="7341834142292923918">需要這個網站的存取權限</translation> <translation id="7345706641791090287">確認您的密碼</translation> <translation id="7346909386216857016">好,我知道了</translation> <translation id="7347751611463936647">如要使用這個擴充功能,請輸入「<ph name="EXTENSION_KEYWORD" />」,然後按 TAB 鍵,接著再輸入你的指令或搜尋項目。</translation> @@ -4265,7 +4276,6 @@ <ph name="BEGIN_PARAGRAPH2" />Google 的定位服務會使用 Wi-Fi、行動網路和感應器等資源,藉此判定你裝置的所在位置。只要裝置的位置資訊設定處於開啟狀態,這項服務就會保持運作。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />關閉裝置的主要位置資訊設定即可關閉定位功能。你也可以前往位置資訊設定,將使用 Wi‑Fi、行動網路和感應器的定位功能關閉。<ph name="END_PARAGRAPH3" /></translation> <translation id="7517786267097410259">建立密碼 -</translation> -<translation id="7518150891539970662">WebRTC 記錄 (<ph name="WEBRTC_LOG_COUNT" />)</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7525067979554623046">建立</translation> <translation id="7529411698175791732">檢查你的網際網路連線。如果問題持續發生,請嘗試登出,然後再次登入。</translation> @@ -4742,6 +4752,7 @@ <translation id="8214962590150211830">移除這個使用者</translation> <translation id="8217399928341212914">繼續禁止自動下載多個檔案</translation> <translation id="8223479393428528563">如要儲存這些檔案以供離線使用,請重新上網,在檔案上按一下滑鼠右鍵,然後選取 [<ph name="OFFLINE_CHECKBOX_NAME" />] 選項。</translation> +<translation id="8225753906568652947">兌換優惠</translation> <translation id="8226222018808695353">已禁止</translation> <translation id="8226619461731305576">佇列</translation> <translation id="8226742006292257240">以下是你的電腦專用的 TPM 密碼 (由系統隨機產生):</translation> @@ -4788,6 +4799,7 @@ <translation id="8286036467436129157">登入</translation> <translation id="8286963743045814739">使用無痕式視窗,安心進行私密瀏覽</translation> <translation id="82871696630048499">這個網頁用盡了記憶體,因此已重新載入。</translation> +<translation id="8288032458496410887">正在解除安裝「<ph name="APP" />」...</translation> <translation id="8291967909914612644">家用提供者國家/地區</translation> <translation id="8294431847097064396">來源</translation> <translation id="8297006494302853456">弱</translation> @@ -4849,6 +4861,7 @@ <translation id="8413385045638830869">先詢問我 (建議)</translation> <translation id="8418445294933751433">顯示為分頁(&S)</translation> <translation id="8419098111404128271">「<ph name="SEARCH_TEXT" />」的搜尋結果</translation> +<translation id="8419368276599091549">歡迎使用你的 <ph name="DEVICE_TYPE" />!</translation> <translation id="8420060421540670057">顯示 Google 文件檔案</translation> <translation id="8424039430705546751">向下鍵</translation> <translation id="8425213833346101688">變更</translation> @@ -4975,6 +4988,7 @@ <translation id="8620765578342452535">設定網路連線</translation> <translation id="8624205858755890468">允許 Google 助理向你顯示相關資訊、應用程式和操作。</translation> <translation id="862542460444371744">擴充功能(&E)</translation> +<translation id="8626219642120025691">計時完成</translation> <translation id="8627151598708688654">選取來源</translation> <translation id="862727964348362408">已暫停</translation> <translation id="862750493060684461">CSS 快取</translation> @@ -5095,6 +5109,7 @@ <translation id="8775404590947523323">你的編輯已自動儲存。<ph name="BREAKS" />如要保留原始圖片複本,請取消勾選 [覆寫原始檔案]</translation> <translation id="8777628254805677039">Root 密碼</translation> <translation id="8780443667474968681">語音搜尋功能已停用。</translation> +<translation id="878068003854005405">歡迎開始設定,請將手指放在感應器上。</translation> <translation id="878069093594050299">此憑證已驗證可用於下列用途:</translation> <translation id="8781980678064919987">蓋上機蓋時關機</translation> <translation id="8782565991310229362">Kiosk 應用程式已取消執行。</translation> @@ -5272,6 +5287,7 @@ <translation id="9050666287014529139">通關密語</translation> <translation id="9052208328806230490">你已透過 <ph name="EMAIL" /> 帳戶並使用 <ph name="CLOUD_PRINT_NAME" /> 為你的印表機註冊</translation> <translation id="9052404922357793350">繼續封鎖</translation> +<translation id="9053091947372579468">你的裝置擁有 Chrome 授權,但你的使用者名稱尚未與管理控制台建立連結。如要註冊,請建立管理控制台帳戶。注意:如果你選擇使用自己的網域建立新的管理控制台帳戶,則必須在建立帳戶後完成網域驗證程序。https://g.co/ChromeEnterpriseAccount</translation> <translation id="9053893665344928494">記住我的選擇</translation> <translation id="9055636786322918818">強制執行 RC4 加密。由於 RC4 加密不安全,使用這個加密選項會提高風險。</translation> <translation id="9056034633062863292">更新 Chromebox</translation> @@ -5375,6 +5391,7 @@ <translation id="9218430445555521422">設定為預設瀏覽器</translation> <translation id="9219103736887031265">圖片</translation> <translation id="9220525904950070496">移除帳戶</translation> +<translation id="9220820413868316583">請移開手指,然後再試一次。</translation> <translation id="923467487918828349">全部顯示</translation> <translation id="928985544179707652">擴充功能:</translation> <translation id="930268624053534560">詳細時間戳記</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index cbd1e4862..b799933 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -30,7 +30,7 @@ <translation id="1682634494516646069">Google Chrome अपनी डेटा निर्देशिका को पढ़ और उस पर लिख नहीं सकता :\n\n<ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome एक ऐसा वेब ब्राउज़र है, जो वेब पेज और ऐप्स को बिजली की गति से चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. Google Chrome में अंतर्निहित मैलवेयर और फ़िशिंग सुरक्षा के साथ अधिक सुरक्षित रूप से वेब ब्राउज़ करें.</translation> <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /> चुनें</translation> -<translation id="1734234790201236882">Chrome इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपके इसे याद रखने की ज़रूरत नहीं है.</translation> +<translation id="1734234790201236882">Chrome इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपको इसे याद रखने की ज़रूरत नहीं है.</translation> <translation id="174539241580958092">प्रवेश करने में गड़बड़ी के कारण Google Chrome आपका डेटा समन्वयित नहीं कर सका.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">Chrome OS का उपयोग करने के बारे में सहायता प्राप्त करें</translation> @@ -168,7 +168,7 @@ <translation id="5430073640787465221">आपकी पसंदीदा फ़ाइल खराब या अमान्य है. Google Chrome आपकी सेटिंग बहाल नहीं कर सकता.</translation> -<translation id="5483595757826856374">{0,plural, =0{अब Chrome फिर से लॉन्च होगा}=1{Chrome दिनों सेकंड में फिर से लॉन्च होगा}one{Chrome # सेकंड में फिर से लॉन्च होगा}other{Chrome # सेकंड में फिर से लॉन्च होगा}}</translation> +<translation id="5483595757826856374">{0,plural, =0{अब Chrome फिर से लॉन्च होगा}=1{Chrome एक सेकंड में फिर से लॉन्च होगा}one{Chrome # सेकंड में फिर से लॉन्च होगा}other{Chrome # सेकंड में फिर से लॉन्च होगा}}</translation> <translation id="556024056938947818">Google Chrome पासवर्ड दिखाने का प्रयास कर रहा है.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> खरतरनाक हो सकता है, इसलिए Chrome ने उसे अवरोधित कर दिया है.</translation> @@ -224,7 +224,7 @@ <translation id="7419046106786626209">Chrome OS आपका डेटा समन्वयित नहीं कर सका क्योंकि आपके डोमेन के लिए समन्वयन उपलब्ध नहीं है.</translation> <translation id="7459554271817304652">वेब पर अपनी व्यक्तिगत ब्राउज़र सुविधाएं सहेजने के लिए समन्वयन सेट करें और उन तक किसी भी कंप्यूटर पर Google Chrome से पहुंचें.</translation> <translation id="7473136999113284234">Chrome अपने आप अपडेट हो जाता है इसलिए आपके पास हमेशा नवीनतम वर्शन रहता है.</translation> -<translation id="7486227612705979895">Chrome पता बार में सुझाव देने के लिए आपका 'डिस्क' एक्सेस करेगा</translation> +<translation id="7486227612705979895">पता बार में सुझाव देने के लिए Chrome आपका 'डिस्क' एक्सेस करेगा</translation> <translation id="7535429826459677826">Google Chrome डेवलपर</translation> <translation id="7552219221109926349">Chrome OS इस भाषा में दिखाएं</translation> <translation id="7561940363513215021">{0,plural, =1{Chrome एक मिनट में फिर से लॉन्च होगा}one{Chrome # मिनटों में फिर से लॉन्च होगा}other{Chrome # मिनटों में फिर से लॉन्च होगा}}</translation> @@ -253,7 +253,7 @@ <translation id="8129812357326543296">&Google Chrome के बारे में</translation> <translation id="8179874765710681175">अपने फ़ोन पर Chrome इंस्टॉल करें. हम आपके फ़ोन पर एक मैसेज (एसएमएस) भेजेंगे.</translation> <translation id="8183957050892517584">Chrome आपके व्यक्तिगत विवरण को सुरक्षित रूप से संग्रहित करेगा, इसलिए आपको इन्हें पुनः लिखने की आवश्यकता नहीं है.</translation> -<translation id="8226081633851087288">{0,plural, =0{अब Chrome OS रीस्टार्ट होगा}=1{Chrome OS एक सेकंड में रीस्टार्ट होगा}one{Chrome OS # सेकंड में रीस्टार्ट होगा}other{Chrome OS # सेकंड में रीस्टार्ट होगा}}</translation> +<translation id="8226081633851087288">{0,plural, =0{Chrome OS अब रीस्टार्ट होगा}=1{Chrome OS एक सेकंड में रीस्टार्ट होगा}one{Chrome OS # सेकंड में रीस्टार्ट होगा}other{Chrome OS # सेकंड में रीस्टार्ट होगा}}</translation> <translation id="825412236959742607">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए Chrome ने कुछ सामग्री हटा दी है.</translation> <translation id="8255190535488645436">Google Chrome आपके कैमरे और माइक्रोफ़ोन का उपयोग कर रहा है.</translation> <translation id="8286862437124483331">Google Chrome पासवर्ड दिखाने का प्रयास कर रहा है. इसकी अनुमति देने के लिए अपना Windows पासवर्ड लिखें.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index be79fbe..d99898546 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -32,7 +32,7 @@ <translation id="1682634494516646069">Google Chrome-ന് ഇതിന്റെ ഡാറ്റാ ഡയറക്ടറി വായിക്കാനും അതിൽ എഴുതാനും കഴിയില്ല: <ph name="USER_DATA_DIRECTORY" /></translation> -<translation id="1698376642261615901">Google Chrome എന്നത് അതിവേഗത്തില് വെബ്പേജുകളും അപ്ലിക്കേഷനുകളും പ്രവര്ത്തിപ്പിക്കുന്ന ഒരു വെബ് ബ്രൗസറാണ്. അത് വേഗതയുള്ളതും, സ്ഥിരതയുള്ളതും ഉപയോഗിക്കാൻ എളുപ്പവുമാണ്. Google Chrome-ലേക്ക് ബില്റ്റുചെയ്ത ക്ഷുദ്രവെയര്, ഫിഷിംഗ് പരിരക്ഷണം ഉപയോഗിച്ച് വെബ് കൂടുതൽ സുരക്ഷിതമായി ബ്രൗസുചെയ്യുക.</translation> +<translation id="1698376642261615901">Google Chrome എന്നത് അതിവേഗത്തില് വെബ്പേജുകളും അപ്ലിക്കേഷനുകളും പ്രവര്ത്തിപ്പിക്കുന്ന ഒരു വെബ് ബ്രൗസറാണ്. അത് വേഗതയുള്ളതും, സ്ഥിരതയുള്ളതും ഉപയോഗിക്കാൻ എളുപ്പവുമാണ്. Google Chrome-ലേക്ക് ബില്റ്റ് ചെയ്ത മാൽവേർ, ഫിഷിംഗ് പരിരക്ഷണം ഉപയോഗിച്ച് വെബ് കൂടുതല് സുരക്ഷിതമായി ബ്രൗസ് ചെയ്യുക.</translation> <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /> തിരഞ്ഞെടുക്കുക</translation> <translation id="1734234790201236882">നിങ്ങളുടെ Google അക്കൗണ്ടിൽ Chrome ഈ പാസ്വേഡ് സംരക്ഷിക്കും. നിങ്ങൾ അത് ഓർത്ത് വയ്ക്കേണ്ടതില്ല.</translation> <translation id="174539241580958092">സൈൻ ഇൻ ചെയ്യുന്നതിലെ ഒരു പിശകിനാൽ Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> @@ -40,7 +40,7 @@ <translation id="1773601347087397504">Chrome OS ഉപയോഗിച്ച് സഹായം തേടുക</translation> <translation id="1795405610103747296">നിങ്ങളുടെ ഫോണിൽ Chrome ഇൻസ്റ്റാൾ ചെയ്യുക. ഫോണിലേക്ക് ഞങ്ങളൊരു SMS അയയ്ക്കും: <ph name="PHONE_NUMBER" /></translation> <translation id="1860536484129686729">ഈ സൈറ്റിനായി, Chrome-ന് നിങ്ങളുടെ ക്യാമറ ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> -<translation id="1873233029667955273">Google Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറല്ല</translation> +<translation id="1873233029667955273">നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ Google Chrome അല്ല.</translation> <translation id="1874309113135274312">Google Chrome ബീറ്റ (mDNS-In)</translation> <translation id="1877026089748256423">Chrome കാലഹരണപ്പെട്ടതാണ്</translation> <translation id="1915828456209461693">Chrome-നായുള്ള പുതിയൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്, നിങ്ങൾ വീണ്ടും സമാരംഭിക്കുമ്പോൾ ഉടൻ അത് പ്രാബല്യത്തിലാകും.</translation> @@ -76,7 +76,7 @@ <translation id="2665296953892887393">Google-ലേക്ക് ക്രാഷ് റിപ്പോർട്ടുകളും <ph name="UMA_LINK" /> എന്നതും അയയ്ക്കുന്നതിലൂടെ Google Chrome മികച്ചതാക്കാൻ സഹായിക്കുക</translation> <translation id="2689103672227170538">നിങ്ങൾ Chrome ആരംഭിക്കുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ ഈ വിപുലീകരണം മാറ്റി.</translation> <translation id="2765403129283291972">ഈ സൈറ്റിനായി, Chrome-ന് നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> -<translation id="2770231113462710648">സ്ഥിരസ്ഥി ബ്രൌസര് ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> +<translation id="2770231113462710648">ഡിഫോൾട്ട് ബ്രൗസർ ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="2847461019998147611">ഈ ഭാഷയില് Google Chrome പ്രദര്ശിപ്പിക്കുക</translation> <translation id="2857540653560290388">Chrome സമാരംഭിക്കുന്നു...</translation> @@ -89,9 +89,9 @@ <translation id="3089968997497233615">ഒരു പുതിയ സുരക്ഷിതമായGoogle Chrome ന്റെ പതിപ്പ് ലഭ്യമാണ്.</translation> <translation id="3149510190863420837">Chrome അപ്ലിക്കേഷനുകൾ</translation> <translation id="3180085900771989961">നിങ്ങളുടെ മാനേജർ നീക്കംചെയ്ത് Chrome-ലേക്ക് തിരികെ ചേർക്കേണ്ടതാണ്.</translation> -<translation id="3251381707915721925"><ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് ഏതൊക്കെ വെബ്സൈറ്റുകൾ കാണാനാകുമെന്ന് സജ്ജമാക്കാൻ, <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. സന്ദർശിച്ച് നിയന്ത്രണങ്ങളും ക്രമീകരണവും കോൺഫിഗർ ചെയ്യാം. നിങ്ങൾ ഡിഫോൾട്ട് ക്രമീകരണം മാറ്റുന്നില്ലെങ്കിൽ, <ph name="NEW_PROFILE_NAME" /> എന്നയാൾക്ക് വെബിൽ എല്ലാ കാര്യങ്ങളും ബ്രൗസുചെയ്യാനാകും. +<translation id="3251381707915721925"><ph name="NEW_PROFILE_NAME" /> എന്നതിന് ഏതൊക്കെ വെബ്സൈറ്റുകൾ കാണാനാകുമെന്ന് സജ്ജമാക്കാൻ, <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. സന്ദർശിച്ച് നിയന്ത്രണങ്ങളും ക്രമീകരണവും കോൺഫിഗർ ചെയ്യാം. നിങ്ങൾ ഡിഫോൾട്ട് ക്രമീകരണം മാറ്റുന്നില്ലെങ്കിൽ, <ph name="NEW_PROFILE_NAME" /> എന്നതിന് വെബിൽ എല്ലാ കാര്യങ്ങളും ബ്രൗസ് ചെയ്യാനാകും. -നിങ്ങളുടെ അക്കൗണ്ട് ആക്സസ്സ് ചെയ്യുന്നതിൽ നിന്ന് <ph name="NEW_PROFILE_NAME" /> എന്നയാളെ തടയാൻ, Chrome ഉപയോഗിക്കാത്തപ്പോൾ നിങ്ങളുടെ പ്രൊഫൈൽ ലോക്കുചെയ്യുന്നകാര്യം ഉറപ്പാക്കുക. ഇങ്ങനെ ചെയ്യാൻ, ബ്രൗസറിന് മുകളിൽ വലതുകോണിലുള്ള നിങ്ങളുടെ പ്രൊഫൈൽ പേരിൽ ക്ലിക്കുചെയ്ത്, "പുറത്ത് കടന്ന് ചൈൽഡ്ലോക്ക് ചെയ്യുക" തിരഞ്ഞെടുക്കുക. +നിങ്ങളുടെ അക്കൗണ്ട് ആക്സസ്സ് ചെയ്യുന്നതിൽ നിന്ന് <ph name="NEW_PROFILE_NAME" /> എന്നതിനെ തടയാൻ, Chrome ഉപയോഗിക്കാത്തപ്പോൾ നിങ്ങളുടെ പ്രൊഫൈൽ ലോക്ക് ചെയ്യുന്ന കാര്യം ഉറപ്പാക്കുക. ഇങ്ങനെ ചെയ്യാൻ, ബ്രൗസറിന് മുകളിൽ വലതുകോണിലുള്ള നിങ്ങളുടെ പ്രൊഫൈൽ പേരിൽ ക്ലിക്ക് ചെയ്ത്, "പുറത്ത് കടന്ന് ചൈൽഡ്ലോക്ക് ചെയ്യുക" തിരഞ്ഞെടുക്കുക. <ph name="BEGIN_LINK_2" />കൂടുതലറിയുക<ph name="END_LINK_2" /> കൂടുതൽ നിർദ്ദേശങ്ങൾക്ക് <ph name="ACCOUNT_EMAIL" /> എന്നതിൽ നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക.</translation> @@ -142,7 +142,7 @@ <translation id="4631713731678262610">Chrome മെനുവിൽ മറയ്ക്കുക</translation> <translation id="4633000520311261472">Chrome സുരക്ഷിതമാക്കുന്നതിന്, <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> എന്നതിൽ ലിസ്റ്റുചെയ്യാത്ത ചില വിപുലീകരണങ്ങൾ ഞങ്ങൾ പ്രവർത്തനരഹിതമാക്കി, അവ നിങ്ങളുടെ അറിവില്ലാതെ ചേർത്തിരിക്കാനിടയുണ്ട്.</translation> <translation id="4664415150087723341">Google Chrome-നുള്ള ഒരു പ്രത്യേക സുരക്ഷാ അപ്ഡേറ്റ് ഇപ്പോൾ പ്രയോഗിച്ചിരിക്കുന്നു; ഇത് പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങൾ ഇപ്പോൾ പുനഃരാരംഭിക്കേണ്ടതുണ്ട് (ഞങ്ങൾ നിങ്ങളുടെ ടാബുകൾ പുനഃസ്ഥാപിക്കും).</translation> -<translation id="4700157086864140907">Google തിരയൽ ഉപയോഗിക്കുന്ന സമാനമായ അക്ഷരപ്പിശക് പരിശോധനാ സാങ്കേതികവിദ്യ ഉപയോഗിക്കാൻ അനുവദിച്ചുകൊണ്ട്, ബ്രൗസറിൽ ടൈപ്പുചെയ്യുന്നതെന്തും Google സെർവറുകളിലേക്ക് അയച്ച് മികച്ച അക്ഷരപ്പിശക് പരിശോധന നൽകാൻ Google Chrome-ന് കഴിയുന്നു.</translation> +<translation id="4700157086864140907">Google തിരയൽ ഉപയോഗിക്കുന്ന സമാനമായ അക്ഷരപ്പിശക് പരിശോധനാ സാങ്കേതികവിദ്യ ഉപയോഗിക്കാൻ അനുവദിച്ച്, ബ്രൗസറിൽ ടൈപ്പ് ചെയ്യുന്നതെന്തും Google സെർവറുകളിലേക്ക് അയച്ച് മികച്ച അക്ഷരപ്പിശക് പരിശോധന നൽകാൻ Google Chrome-ന് കഴിയുന്നു.</translation> <translation id="4728575227883772061">വ്യക്തമല്ലാത്ത പിശക് കാരണം ഇന്സ്റ്റാളേഷന് പരാജയപ്പെട്ടു. Google Chrome നിലവില് പ്രവര്ത്തിക്കുകയാണെങ്കില്, ദയവായി അത് അടച്ചിട്ട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4750550185319565338"><ph name="PLUGIN_NAME" /> പ്രവർത്തനക്ഷമമാക്കാൻ Chrome റീസ്റ്റാർട്ടുചെയ്യുക</translation> <translation id="4754614261631455953">Google Chrome കാനറി (mDNS-In)</translation> @@ -153,7 +153,7 @@ <translation id="4895437082222824641">പുതിയ Chrome &ടാബിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="4921569541910214635">ഒരു കമ്പ്യൂട്ടർ പങ്കിടണോ? ഇപ്പോൾ നിങ്ങൾക്ക് ഇഷ്ടപ്പെട്ട രീതിയിൽ Chrome സജ്ജീകരിക്കാനാകും.</translation> <translation id="4945319281866068441">{0,plural, =1{ ഒരു ദിവസത്തിനുള്ളിൽ Chrome OS പുനഃരാരംഭിക്കുക}other{# ദിവസത്തിനുള്ളിൽ Chrome OS പുനഃരാരംഭിക്കുക}}</translation> -<translation id="4953650215774548573">Google Chrome-നെ നിങ്ങളുടെ സ്ഥിര ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> +<translation id="4953650215774548573">Google Chrome-നെ നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> <translation id="495931528404527476">Chrome-ൽ</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് അപ്ഡേറ്റ് ചെയ്യുക.</translation> @@ -185,7 +185,7 @@ <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> <translation id="5906655207909574370">എകദേശം അപ്ടുഡേറ്റാണ്! അപ്ഡേറ്റുചെയ്യൽ പൂർത്തിയാക്കാൻ ഉപകരണം പുനഃരാരംഭിക്കുക.</translation> <translation id="5940385492829620908">നിങ്ങളുടെ വെബും ബുക്ക്മാർക്കുകളും മറ്റ് Chrome ഫയലും ഇവിടെ തത്സമയമാണ്.</translation> -<translation id="5941830788786076944">Google Chrome നെ സ്ഥിരസ്ഥിതി ബ്രൌസറായി മാറ്റുക</translation> +<translation id="5941830788786076944">Google Chrome നെ ഡിഫോൾട്ട് ബ്രൗസറാക്കുക</translation> <translation id="6014844626092547096">നിങ്ങൾ ഇപ്പോൾ Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്തു! നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയം പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="6040143037577758943">അടയ്ക്കുക</translation> <translation id="6070348360322141662">കൂടുതൽ സുരക്ഷ ലഭ്യമാക്കാൻ, Google Chrome നിങ്ങളുടെ ഡാറ്റ എന്ക്രിപ്റ്റുചെയ്യും</translation> @@ -226,7 +226,7 @@ <translation id="7398801000654795464">നിങ്ങൾ Chrome-ൽ <ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്തു. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നതിന് സമാന അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation> <translation id="7408085963519505752">Chrome OS നിബന്ധനകൾ</translation> <translation id="7419046106786626209">നിങ്ങളുടെ ഡൊമെയ്നിനായി സമന്വയം ലഭ്യമല്ലാത്തതിനാൽ Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> -<translation id="7459554271817304652">വെബിലേക്ക് നിങ്ങളുടെ വ്യക്തിഗതമാക്കിയ ബ്രൗസർ സവിശേഷതകൾ സംരക്ഷിക്കുന്നതിനും ഏതൊരു കമ്പ്യൂട്ടറിൽ നിന്നും Google Chrome-ലേക്ക് അവയെ ആക്സസ് ചെയ്യുന്നതിനും സമന്വയം സജ്ജമാക്കുക.</translation> +<translation id="7459554271817304652">വെബിലേക്ക് നിങ്ങളുടെ വ്യക്തിഗതമാക്കിയ ബ്രൗസർ സവിശേഷതകൾ സംരക്ഷിക്കുന്നതിനും ഏതൊരു കമ്പ്യൂട്ടറിൽ നിന്നും Google Chrome-വഴി അവയെ ആക്സസ് ചെയ്യുന്നതിനും സമന്വയം സജ്ജമാക്കുക.</translation> <translation id="7473136999113284234">Chrome സ്വയമേവ അപ്ഡേറ്റുചെയ്യുന്നതിനാൽ, നിങ്ങളുടേത് എല്ലായ്പ്പോഴും ഏറ്റവും പുതിയ പതിപ്പായിരിക്കും.</translation> <translation id="7486227612705979895">വിലാസ ബാറിൽ നിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കാൻ, Chrome നിങ്ങളുടെ ഡ്രൈവ് ആക്സസ് ചെയ്യും</translation> <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index a5bcd7c..2f00749 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -81,7 +81,7 @@ <translation id="3037838751736561277">Google Chrome నేపథ్య మోడ్లో ఉంది.</translation> <translation id="3047079729301751317"><ph name="USERNAME" />ని డిస్కనెక్ట్ చేయడం వలన ఈ పరికరంలో నిల్వ చేయబడిన మీ చరిత్ర, బుక్మార్క్లు, సెట్టింగ్లు మరియు ఇతర Chrome డేటా క్లియర్ చేయబడతాయి. మీ Google ఖాతాలో నిల్వ చేయబడిన డేటా క్లియర్ చేయబడదు మరియు దాన్ని <ph name="GOOGLE_DASHBOARD_LINK" />Google డాష్బోర్డ్<ph name="END_GOOGLE_DASHBOARD_LINK" />లో నిర్వహించవచ్చు.</translation> <translation id="3065168410429928842">Chrome ట్యాబ్</translation> -<translation id="3080151273017101988">Google Chrome మూసివేసినపుడు అనువర్తనాలను నేపథ్యంలో అమలు చేయడాన్ని కొనసాగించు</translation> +<translation id="3080151273017101988">Google Chromeను మూసివేసినపుడు, యాప్లను నేపథ్యంలో అమలు చేయడాన్ని కొనసాగించు</translation> <translation id="3089968997497233615">Google Chrome యొక్క క్రొత్త సురక్షితమైన సంస్కరణ అందుబాటులో ఉంది.</translation> <translation id="3149510190863420837">Chrome అనువర్తనాలు</translation> <translation id="3180085900771989961">మీ నిర్వాహకులు తప్పనిసరిగా మిమ్మల్ని Chrome నుండి తీసివేసి, తిరిగి జోడించాలి.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 4a1b2dae..d4b0ea5 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -2317,7 +2317,7 @@ <message name="IDS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_TITLE" desc="Name of the settings sub-page which allows enabling and disabling input methods."> Manage input methods </message> - <message name="IDS_SETTINGS_LANGUAGES_SHOW_IME_MENU" desc="The label for he toggle button controlling showing the IME menu in the shelf."> + <message name="IDS_SETTINGS_LANGUAGES_SHOW_IME_MENU" desc="The label for the toggle button controlling showing the IME menu in the shelf."> Show input options in the shelf </message> <message name="IDS_SETTINGS_LANGUAGES_KEYBOARD_APPS" desc="Title for the list of keyboard apps installed via Play Store by the user."> @@ -4236,6 +4236,9 @@ <message name="IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY" desc="Description of the idea that the user can get a better experience on their Chromebook by connecting it to their phone."> Your Chromebook works even better with your phone. <ph name="LINK_BEGIN"><a target="_blank" href="$1<ex>https://google.com/</ex>"></ph>Learn more.<ph name="LINK_END"></a></ph> </message> + <message name="IDS_SETTINGS_MULTIDEVICE_NO_ELIGIBLE_HOSTS" desc="Tells the user that there is no phone with their account on it that can connect to their Chromebook."> + No eligible devices. <ph name="LINK_BEGIN"><a target="_blank" href="$1<ex>https://google.com/</ex>"></ph>Learn more.<ph name="LINK_END"></a></ph> + </message> <message name="IDS_SETTINGS_MULTIDEVICE_VERIFICATION_TEXT" desc="Text to tell user that their Chromebook needs to verify that it can connect with their phone."> Waiting for verification. <ph name="LINK_BEGIN"><a target="_blank" href="$1<ex>https://google.com/</ex>"></ph>Learn more.<ph name="LINK_END"></a></ph> </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0bc12065..e563d062 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1435,8 +1435,6 @@ "signin/signin_tracker_factory.h", "signin/signin_util.cc", "signin/signin_util.h", - "signin/unified_consent_helper.cc", - "signin/unified_consent_helper.h", "site_details.cc", "site_details.h", "speech/chrome_speech_recognition_manager_delegate.cc", @@ -1570,6 +1568,8 @@ "thumbnails/thumbnailing_context.h", "tracing/background_tracing_field_trial.cc", "tracing/background_tracing_field_trial.h", + "tracing/chrome_browser_main_extra_parts_tracing.cc", + "tracing/chrome_browser_main_extra_parts_tracing.h", "tracing/chrome_tracing_delegate.cc", "tracing/chrome_tracing_delegate.h", "tracing/crash_service_uploader.cc", @@ -2235,7 +2235,6 @@ "android/omnibox/omnibox_prerender.cc", "android/omnibox/omnibox_prerender.h", "android/omnibox/query_in_omnibox_android.cc", - "android/omnibox/query_in_omnibox_android.h", "android/oom_intervention/near_oom_monitor.cc", "android/oom_intervention/near_oom_monitor.h", "android/oom_intervention/oom_intervention_config.cc", @@ -4457,6 +4456,8 @@ "android/feed/feed_journal_bridge.h", "android/feed/feed_network_bridge.cc", "android/feed/feed_network_bridge.h", + "android/feed/feed_offline_bridge.cc", + "android/feed/feed_offline_bridge.h", "android/feed/feed_scheduler_bridge.cc", "android/feed/feed_scheduler_bridge.h", ] @@ -4732,6 +4733,7 @@ "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedImageLoaderBridge.java", "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedJournalBridge.java", "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java", + "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java", "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java", ] }
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index b1a60be..3ece52b 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -179,6 +179,7 @@ "+third_party/blink/public/platform/autoplay.mojom.h", "+third_party/blink/public/platform/web_feature.mojom.h", "+third_party/blink/public/platform/modules/app_banner/app_banner.mojom.h", + "+third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h", "+third_party/blink/public/platform/modules/budget_service/budget_service.mojom.h", "+third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom.h", "+third_party/blink/public/platform/modules/installation/installation.mojom.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 3ae8c5b..8c89c82 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -87,6 +87,7 @@ #include "components/security_state/core/features.h" #include "components/security_state/core/security_state.h" #include "components/services/heap_profiling/public/cpp/switches.h" +#include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/core/browser/signin_buildflags.h" #include "components/signin/core/browser/signin_switches.h" #include "components/spellcheck/common/spellcheck_features.h" @@ -110,6 +111,7 @@ #include "device/vr/buildflags/buildflags.h" #include "extensions/buildflags/buildflags.h" #include "google_apis/drive/drive_switches.h" +#include "gpu/config/gpu_finch_features.h" #include "gpu/config/gpu_switches.h" #include "media/audio/audio_features.h" #include "media/base/media_switches.h" @@ -2127,7 +2129,7 @@ {"extension-active-script-permission", flag_descriptions::kUserConsentForExtensionScriptsName, flag_descriptions::kUserConsentForExtensionScriptsDescription, kOsDesktop, - FEATURE_VALUE_TYPE(extensions::features::kRuntimeHostPermissions)}, + FEATURE_VALUE_TYPE(extensions_features::kRuntimeHostPermissions)}, #endif // ENABLE_EXTENSIONS #if BUILDFLAG(ENABLE_EXTENSIONS) {"enable-embedded-extension-options", @@ -2694,20 +2696,10 @@ kOsAndroid, FEATURE_VALUE_TYPE( chrome::android::kContentSuggestionsThumbnailDominantColor)}, - {"enable-content-suggestions-settings", - flag_descriptions::kEnableContentSuggestionsSettingsName, - flag_descriptions::kEnableContentSuggestionsSettingsDescription, - kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kContentSuggestionsSettings)}, {"interest-feed-content-suggestions", flag_descriptions::kInterestFeedContentSuggestionsName, flag_descriptions::kInterestFeedContentSuggestionsDescription, kOsAndroid, FEATURE_VALUE_TYPE(feed::kInterestFeedContentSuggestions)}, - {"enable-ntp-article-suggestions-expandable-header", - flag_descriptions::kEnableNtpArticleSuggestionsExpandableHeaderName, - flag_descriptions::kEnableNtpArticleSuggestionsExpandableHeaderDescription, - kOsAndroid, - FEATURE_VALUE_TYPE(ntp_snippets::kArticleSuggestionsExpandableHeader)}, {"enable-ntp-remote-suggestions", flag_descriptions::kEnableNtpRemoteSuggestionsName, flag_descriptions::kEnableNtpRemoteSuggestionsDescription, kOsAndroid, @@ -3103,7 +3095,8 @@ autofill::features::kAutofillUpstreamUpdatePromptExplanation)}, {"enable-autofill-native-dropdown-views", flag_descriptions::kEnableAutofillNativeDropdownViewsName, - flag_descriptions::kEnableAutofillNativeDropdownViewsDescription, kOsAll, + flag_descriptions::kEnableAutofillNativeDropdownViewsDescription, + kOsDesktop, FEATURE_VALUE_TYPE(autofill::features::kAutofillExpandedPopupViews)}, {"enable-autofill-save-card-dialog-unlabeled-expiration-date", flag_descriptions:: @@ -3135,6 +3128,10 @@ #endif // OS_WIN #if defined(OS_ANDROID) + {"enable-autofill-refresh-style", + flag_descriptions::kEnableAutofillRefreshStyleName, + flag_descriptions::kEnableAutofillRefreshStyleDescription, kOsAndroid, + FEATURE_VALUE_TYPE(autofill::features::kAutofillRefreshStyleAndroid)}, {"lsd-permission-prompt", flag_descriptions::kLsdPermissionPromptName, flag_descriptions::kLsdPermissionPromptDescription, kOsAndroid, FEATURE_VALUE_TYPE(features::kLsdPermissionPrompt)}, @@ -3608,6 +3605,10 @@ #endif // DCHECK_IS_CONFIGURABLE #if defined(OS_CHROMEOS) + {"slide-top-chrome-with-page-scrolls", + flag_descriptions::kSlideTopChromeWithPageScrollsName, + flag_descriptions::kSlideTopChromeWithPageScrollsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kSlideTopChromeWithPageScrolls)}, {"sys-internals", flag_descriptions::kSysInternalsName, flag_descriptions::kSysInternalsDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kSysInternals)}, @@ -4345,6 +4346,11 @@ SINGLE_VALUE_TYPE(chromeos::switches::kEnableChromevoxDeveloperOption)}, #endif + {"sync-USS-autofill-profile", + flag_descriptions::kSyncUSSAutofillProfileName, + flag_descriptions::kSyncUSSAutofillProfileDescription, kOsAll, + FEATURE_VALUE_TYPE(switches::kSyncUSSAutofillProfile)}, + {"sync-USS-autofill-wallet-data", flag_descriptions::kSyncUSSAutofillWalletDataName, flag_descriptions::kSyncUSSAutofillWalletDataDescription, kOsAll, @@ -4416,6 +4422,10 @@ flag_descriptions::kSyncSupportSecondaryAccountDescription, kOsAll, FEATURE_VALUE_TYPE(switches::kSyncSupportSecondaryAccount)}, + {"use-multilogin-endpoint", flag_descriptions::kUseMultiloginEndpointName, + flag_descriptions::kUseMultiloginEndpointDescription, kOsAll, + FEATURE_VALUE_TYPE(kUseMultiloginEndpoint)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc index 8bcd2e4..c2fa683f 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc +++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -6,14 +6,21 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" +#include "base/command_line.h" +#include "chrome/common/channel_info.h" #include "components/autofill_assistant/browser/controller.h" +#include "components/version_info/channel.h" #include "content/public/browser/web_contents.h" +#include "google_apis/google_api_keys.h" #include "jni/AutofillAssistantUiController_jni.h" using base::android::AttachCurrentThread; using base::android::JavaParamRef; namespace autofill_assistant { +namespace switches { +const char* const kAutofillAssistantServerKey = "autofill-assistant-key"; +} // namespace switches UiControllerAndroid::UiControllerAndroid( JNIEnv* env, @@ -65,6 +72,25 @@ std::move(callback).Run(""); } +std::string UiControllerAndroid::GetApiKey() { + std::string api_key; + if (google_apis::IsGoogleChromeAPIKeyUsed()) { + api_key = chrome::GetChannel() == version_info::Channel::STABLE + ? google_apis::GetAPIKey() + : google_apis::GetNonStableAPIKey(); + } + const auto* command_line = base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kAutofillAssistantServerKey)) { + api_key = command_line->GetSwitchValueASCII( + switches::kAutofillAssistantServerKey); + } + return api_key; +} + +UiController* UiControllerAndroid::GetUiController() { + return this; +} + void UiControllerAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { ui_delegate_->OnDestroy();
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.h b/chrome/browser/android/autofill_assistant/ui_controller_android.h index 82ac868..6217334 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android.h +++ b/chrome/browser/android/autofill_assistant/ui_controller_android.h
@@ -5,16 +5,16 @@ #ifndef CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_UI_CONTROLLER_ANDROID_H_ #define CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_UI_CONTROLLER_ANDROID_H_ -#include "components/autofill_assistant/browser/ui_controller.h" - #include <string> #include "base/android/scoped_java_ref.h" #include "base/macros.h" +#include "components/autofill_assistant/browser/client.h" +#include "components/autofill_assistant/browser/ui_controller.h" namespace autofill_assistant { -// Class implements UiController and starts the Controller. -class UiControllerAndroid : public UiController { +// Class implements UiController, Client and starts the Controller. +class UiControllerAndroid : public UiController, public Client { public: UiControllerAndroid(JNIEnv* env, jobject jcaller, @@ -31,6 +31,10 @@ void ChooseCard( base::OnceCallback<void(const std::string&)> callback) override; + // Overrides Client: + std::string GetApiKey() override; + UiController* GetUiController() override; + // Called by Java. void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index ffa3972..aeb6ca2 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -47,7 +47,7 @@ // this array may either refer to features defined in the header of this file or // in other locations in the code base (e.g. chrome/, components/, etc). const base::Feature* kFeaturesExposedToJava[] = { - &autofill::features::kAutofillExpandedPopupViews, + &autofill::features::kAutofillRefreshStyleAndroid, &autofill::features::kAutofillScanCardholderName, &contextual_suggestions::kContextualSuggestionsAlternateCardLayout, &contextual_suggestions::kContextualSuggestionsBottomSheet, @@ -92,7 +92,6 @@ &kChromeModernFullRoll, &kCommandLineOnNonRooted, &kContentSuggestionsScrollToLoad, - &kContentSuggestionsSettings, &kContentSuggestionsThumbnailDominantColor, &kContextualSearchMlTapSuppression, &kContextualSearchSecondTap, @@ -150,7 +149,6 @@ &payments::features::kWebPaymentsSingleAppUiSkip, &language::kExplicitLanguageAsk, &media::kCafMediaRouterImpl, - &ntp_snippets::kArticleSuggestionsExpandableHeader, &ntp_snippets::kArticleSuggestionsFeature, &ntp_snippets::kIncreasedVisibility, &ntp_snippets::kForeignSessionsSuggestionsFeature, @@ -252,9 +250,6 @@ const base::Feature kContentSuggestionsScrollToLoad{ "ContentSuggestionsScrollToLoad", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kContentSuggestionsSettings{ - "ContentSuggestionsSettings", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kContentSuggestionsThumbnailDominantColor{ "ContentSuggestionsThumbnailDominantColor", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 3d573a7..bafd5fc1 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -34,7 +34,6 @@ extern const base::Feature kChromeSmartSelection; extern const base::Feature kCommandLineOnNonRooted; extern const base::Feature kContentSuggestionsScrollToLoad; -extern const base::Feature kContentSuggestionsSettings; extern const base::Feature kContentSuggestionsThumbnailDominantColor; extern const base::Feature kContextualSearchMlTapSuppression; extern const base::Feature kContextualSearchSecondTap;
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index 9889e1b..89c947e1 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/translate/translate_service.h" #include "chrome/common/pref_names.h" @@ -392,7 +391,6 @@ anonymized_unified_consent_url_helper = UrlKeyedDataCollectionConsentHelper:: NewAnonymizedDataCollectionConsentHelper( - IsUnifiedConsentFeatureEnabled(profile), ProfileManager::GetActiveUserProfile()->GetPrefs(), sync_service); // If they have, then allow sending of the URL.
diff --git a/chrome/browser/android/digital_asset_links/DEPS b/chrome/browser/android/digital_asset_links/DEPS index 7023254..9eb012c 100644 --- a/chrome/browser/android/digital_asset_links/DEPS +++ b/chrome/browser/android/digital_asset_links/DEPS
@@ -1,9 +1,8 @@ # It is likely that this code will eventually be shared across platforms, so # excluding dependencies that would make this being a component impossible. include_rules = [ - "-content", "-chrome", - "+base", + "-content", "+content/public/test", "+chrome/browser/android/digital_asset_links", "+net",
diff --git a/chrome/browser/android/download/download_media_parser.cc b/chrome/browser/android/download/download_media_parser.cc index 091cb8a2..45295b1 100644 --- a/chrome/browser/android/download/download_media_parser.cc +++ b/chrome/browser/android/download/download_media_parser.cc
@@ -6,44 +6,146 @@ #include "base/bind.h" #include "base/files/file.h" +#include "base/numerics/safe_conversions.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" #include "chrome/browser/android/download/local_media_data_source_factory.h" #include "content/public/common/service_manager_connection.h" namespace { -void OnParseMetadataDone( - std::unique_ptr<SafeMediaMetadataParser> parser_keep_alive, - SafeMediaMetadataParser::DoneCallback done_callback, - bool parse_success, - chrome::mojom::MediaMetadataPtr metadata, - std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images) { - // Call done callback on main thread. - std::move(done_callback) - .Run(parse_success, std::move(metadata), std::move(attached_images)); +// Returns if the mime type is video or audio. +bool IsSupportedMediaMimeType(const std::string& mime_type) { + return base::StartsWith(mime_type, "audio/", + base::CompareCase::INSENSITIVE_ASCII) || + base::StartsWith(mime_type, "video/", + base::CompareCase::INSENSITIVE_ASCII); } } // namespace -DownloadMediaParser::DownloadMediaParser( - scoped_refptr<base::SequencedTaskRunner> file_task_runner) - : file_task_runner_(file_task_runner) {} +DownloadMediaParser::DownloadMediaParser(int64_t size, + const std::string& mime_type, + const base::FilePath& file_path, + ParseCompleteCB parse_complete_cb) + : size_(size), + mime_type_(mime_type), + file_path_(file_path), + parse_complete_cb_(std::move(parse_complete_cb)), + file_task_runner_( + base::CreateSingleThreadTaskRunnerWithTraits({base::MayBlock()})), + weak_factory_(this) {} DownloadMediaParser::~DownloadMediaParser() = default; -void DownloadMediaParser::ParseMediaFile( - int64_t size, - const std::string& mime_type, - const base::FilePath& file_path, - SafeMediaMetadataParser::DoneCallback callback) { - auto media_data_source_factory = - std::make_unique<LocalMediaDataSourceFactory>(file_path, - file_task_runner_); - auto parser = std::make_unique<SafeMediaMetadataParser>( - size, mime_type, true /* get_attached_images */, - std::move(media_data_source_factory)); - SafeMediaMetadataParser* parser_ptr = parser.get(); - parser_ptr->Start( - content::ServiceManagerConnection::GetForProcess()->GetConnector(), - base::BindOnce(&OnParseMetadataDone, std::move(parser), - std::move(callback))); +void DownloadMediaParser::Start() { + // Only process media mime types. + if (!IsSupportedMediaMimeType(mime_type_)) { + OnError(); + return; + } + + RetrieveMediaParser( + content::ServiceManagerConnection::GetForProcess()->GetConnector()); +} + +void DownloadMediaParser::OnMediaParserCreated() { + auto media_source_factory = std::make_unique<LocalMediaDataSourceFactory>( + file_path_, file_task_runner_); + chrome::mojom::MediaDataSourcePtr source_ptr; + media_data_source_ = media_source_factory->CreateMediaDataSource( + &source_ptr, base::BindRepeating(&DownloadMediaParser::OnMediaDataReady, + weak_factory_.GetWeakPtr())); + + media_parser()->ParseMediaMetadata( + mime_type_, size_, true /* get_attached_images */, std::move(source_ptr), + base::BindOnce(&DownloadMediaParser::OnMediaMetadataParsed, + weak_factory_.GetWeakPtr())); +} + +void DownloadMediaParser::OnConnectionError() { + if (parse_complete_cb_) + std::move(parse_complete_cb_).Run(false); +} + +void DownloadMediaParser::OnMediaMetadataParsed( + bool parse_success, + chrome::mojom::MediaMetadataPtr metadata, + const std::vector<metadata::AttachedImage>& attached_images) { + if (!parse_success) { + std::move(parse_complete_cb_).Run(false); + return; + } + metadata_ = std::move(metadata); + + // TODO(xingliu): Make |attached_images| movable and use this as a thumbnail + // source as well as video frame. + attached_images_ = attached_images; + + // For audio file, we only need metadata and poster. + if (base::StartsWith(mime_type_, "audio/", + base::CompareCase::INSENSITIVE_ASCII)) { + NotifyComplete(); + return; + } + + DCHECK(base::StartsWith(mime_type_, "video/", + base::CompareCase::INSENSITIVE_ASCII)); + + // Retrieves video thumbnail if needed. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&DownloadMediaParser::RetrieveEncodedVideoFrame, + weak_factory_.GetWeakPtr())); +} + +void DownloadMediaParser::RetrieveEncodedVideoFrame() { + media_data_source_.reset(); + + auto media_source_factory = std::make_unique<LocalMediaDataSourceFactory>( + file_path_, file_task_runner_); + chrome::mojom::MediaDataSourcePtr source_ptr; + media_data_source_ = media_source_factory->CreateMediaDataSource( + &source_ptr, base::BindRepeating(&DownloadMediaParser::OnMediaDataReady, + weak_factory_.GetWeakPtr())); + + media_parser()->ExtractVideoFrame( + mime_type_, base::saturated_cast<uint32_t>(size_), std::move(source_ptr), + base::BindOnce(&DownloadMediaParser::OnEncodedVideoFrameRetrieved, + weak_factory_.GetWeakPtr())); +} + +void DownloadMediaParser::OnEncodedVideoFrameRetrieved( + bool success, + const std::vector<uint8_t>& data, + const media::VideoDecoderConfig& config) { + if (data.empty()) { + OnError(); + return; + } + + encoded_data_ = data; + config_ = config; + + // TODO(xingliu): Decode the video frame with MojoVideoDecoder. + NotifyComplete(); +} + +void DownloadMediaParser::OnMediaDataReady( + chrome::mojom::MediaDataSource::ReadCallback callback, + std::unique_ptr<std::string> data) { + // TODO(xingliu): Change media_parser.mojom to move the data instead of copy. + if (media_parser()) + std::move(callback).Run(std::vector<uint8_t>(data->begin(), data->end())); +} + +void DownloadMediaParser::NotifyComplete() { + // TODO(xingliu): Return the metadata and video thumbnail data in + // |parse_complete_cb_|. + if (parse_complete_cb_) + std::move(parse_complete_cb_).Run(true); +} + +void DownloadMediaParser::OnError() { + if (parse_complete_cb_) + std::move(parse_complete_cb_).Run(false); }
diff --git a/chrome/browser/android/download/download_media_parser.h b/chrome/browser/android/download/download_media_parser.h index bb90893..33cc4d6f 100644 --- a/chrome/browser/android/download/download_media_parser.h +++ b/chrome/browser/android/download/download_media_parser.h
@@ -9,35 +9,84 @@ #include <string> #include <vector> +#include "base/callback.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "chrome/common/media_galleries/metadata_types.h" -#include "chrome/services/media_gallery_util/public/cpp/safe_media_metadata_parser.h" +#include "chrome/services/media_gallery_util/public/cpp/media_parser_provider.h" #include "chrome/services/media_gallery_util/public/mojom/media_parser.mojom.h" +namespace media { +class VideoDecoderConfig; +} // namespace media + // Local media files parser is used to process local media files. This object // lives on main thread in browser process. -class DownloadMediaParser { +class DownloadMediaParser : public MediaParserProvider { public: - explicit DownloadMediaParser( - scoped_refptr<base::SequencedTaskRunner> file_task_runner); - ~DownloadMediaParser(); + using ParseCompleteCB = base::OnceCallback<void(bool)>; + + DownloadMediaParser(int64_t size, + const std::string& mime_type, + const base::FilePath& file_path, + ParseCompleteCB parse_complete_cb); + ~DownloadMediaParser() override; // Parse media metadata in a local file. All file IO will run on // |file_task_runner|. The metadata is parsed in an utility process safely. // However, the result is still comes from user-defined input, thus should be // used with caution. - void ParseMediaFile(int64_t size, - const std::string& mime_type, - const base::FilePath& file_path, - SafeMediaMetadataParser::DoneCallback callback); + void Start(); private: + // MediaParserProvider implementation: + void OnMediaParserCreated() override; + void OnConnectionError() override; + + // Called after media metadata are parsed. + void OnMediaMetadataParsed( + bool parse_success, + chrome::mojom::MediaMetadataPtr metadata, + const std::vector<metadata::AttachedImage>& attached_images); + + // Retrieves an encoded video frame. + void RetrieveEncodedVideoFrame(); + void OnEncodedVideoFrameRetrieved(bool success, + const std::vector<uint8_t>& data, + const media::VideoDecoderConfig& config); + + // Overlays media data source read operation. Gradually read data from media + // file. + void OnMediaDataReady(chrome::mojom::MediaDataSource::ReadCallback callback, + std::unique_ptr<std::string> data); + + void NotifyComplete(); + void OnError(); + + int64_t size_; + std::string mime_type_; + base::FilePath file_path_; + + ParseCompleteCB parse_complete_cb_; + chrome::mojom::MediaMetadataPtr metadata_; + std::vector<metadata::AttachedImage> attached_images_; + + std::unique_ptr<chrome::mojom::MediaDataSource> media_data_source_; + // The task runner to do blocking disk IO. scoped_refptr<base::SequencedTaskRunner> file_task_runner_; + // Encoded frame to be decoded. The data comes from a safe sandboxed process. + // This data can be large for high resolution video, should be std::move or + // cleared whenever possible. + std::vector<uint8_t> encoded_data_; + media::VideoDecoderConfig config_; + + base::WeakPtrFactory<DownloadMediaParser> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(DownloadMediaParser); };
diff --git a/chrome/browser/android/download/download_media_parser_bridge.cc b/chrome/browser/android/download/download_media_parser_bridge.cc index 3d32146..e29b7864 100644 --- a/chrome/browser/android/download/download_media_parser_bridge.cc +++ b/chrome/browser/android/download/download_media_parser_bridge.cc
@@ -4,34 +4,25 @@ #include "chrome/browser/android/download/download_media_parser_bridge.h" +#include "base/android/callback_android.h" #include "base/android/jni_string.h" #include "base/files/file_path.h" #include "base/task/post_task.h" -#include "chrome/browser/android/download/download_media_parser.h" #include "jni/DownloadMediaParserBridge_jni.h" +namespace { + +void OnMediaParsed(const base::android::ScopedJavaGlobalRef<jobject> jcallback, + bool success) { + base::android::RunBooleanCallbackAndroid(jcallback, success); +} + +} // namespace + // static jlong JNI_DownloadMediaParserBridge_Init( JNIEnv* env, - const base::android::JavaParamRef<jobject>& jcaller) { - auto* bridge = new DownloadMediaParserBridge; - return reinterpret_cast<intptr_t>(bridge); -} - -DownloadMediaParserBridge::DownloadMediaParserBridge() - : disk_io_task_runner_( - base::CreateSingleThreadTaskRunnerWithTraits({base::MayBlock()})), - parser_(std::make_unique<DownloadMediaParser>(disk_io_task_runner_)) {} - -DownloadMediaParserBridge::~DownloadMediaParserBridge() = default; - -void DownloadMediaParserBridge::Destory(JNIEnv* env, jobject obj) { - delete this; -} - -void DownloadMediaParserBridge::ParseMediaFile( - JNIEnv* env, - jobject obj, + const base::android::JavaParamRef<jobject>& jcaller, const base::android::JavaParamRef<jstring>& jmime_type, const base::android::JavaParamRef<jstring>& jfile_path, jlong jtotal_size, @@ -41,7 +32,30 @@ std::string mime_type = base::android::ConvertJavaStringToUTF8(env, jmime_type); - // TODO(xingliu): Pass the result back to Java. - parser_->ParseMediaFile(static_cast<int64_t>(jtotal_size), mime_type, - file_path, base::DoNothing()); + auto* bridge = new DownloadMediaParserBridge( + static_cast<int64_t>(jtotal_size), mime_type, file_path, + base::BindOnce(&OnMediaParsed, + base::android::ScopedJavaGlobalRef<jobject>(jcallback))); + return reinterpret_cast<intptr_t>(bridge); +} + +DownloadMediaParserBridge::DownloadMediaParserBridge( + int64_t size, + const std::string& mime_type, + const base::FilePath& file_path, + DownloadMediaParser::ParseCompleteCB parse_complete_cb) + : parser_(std::make_unique<DownloadMediaParser>( + size, + mime_type, + file_path, + std::move(parse_complete_cb))) {} + +DownloadMediaParserBridge::~DownloadMediaParserBridge() = default; + +void DownloadMediaParserBridge::Destory(JNIEnv* env, jobject obj) { + delete this; +} + +void DownloadMediaParserBridge::Start(JNIEnv* env, jobject obj) { + parser_->Start(); }
diff --git a/chrome/browser/android/download/download_media_parser_bridge.h b/chrome/browser/android/download/download_media_parser_bridge.h index 52bcba0..7bbac04 100644 --- a/chrome/browser/android/download/download_media_parser_bridge.h +++ b/chrome/browser/android/download/download_media_parser_bridge.h
@@ -10,6 +10,7 @@ #include "base/android/scoped_java_ref.h" #include "base/macros.h" #include "base/single_thread_task_runner.h" +#include "chrome/browser/android/download/download_media_parser.h" class DownloadMediaParser; @@ -17,21 +18,17 @@ // bridge is owned by the Java side. class DownloadMediaParserBridge { public: - DownloadMediaParserBridge(); + DownloadMediaParserBridge( + int64_t size, + const std::string& mime_type, + const base::FilePath& file_path, + DownloadMediaParser::ParseCompleteCB parse_complete_cb); ~DownloadMediaParserBridge(); void Destory(JNIEnv* env, jobject obj); - void ParseMediaFile(JNIEnv* env, - jobject obj, - const base::android::JavaParamRef<jstring>& jmime_type, - const base::android::JavaParamRef<jstring>& jfile_path, - jlong jtotal_size, - const base::android::JavaParamRef<jobject>& jcallback); + void Start(JNIEnv* env, jobject obj); private: - // The task runner that performs blocking disk IO. Created by this object. - scoped_refptr<base::SingleThreadTaskRunner> disk_io_task_runner_; - // The media parser that does actual jobs in a sandboxed process. std::unique_ptr<DownloadMediaParser> parser_;
diff --git a/chrome/browser/android/download/local_media_data_source_factory.h b/chrome/browser/android/download/local_media_data_source_factory.h index 4f4b352c..fb8b17ae 100644 --- a/chrome/browser/android/download/local_media_data_source_factory.h +++ b/chrome/browser/android/download/local_media_data_source_factory.h
@@ -27,12 +27,12 @@ ~LocalMediaDataSourceFactory() override; - private: // SafeMediaMetadataParser::MediaDataSourceFactory implementation. std::unique_ptr<chrome::mojom::MediaDataSource> CreateMediaDataSource( chrome::mojom::MediaDataSourcePtr* request, MediaDataCallback media_data_callback) override; + private: // Local downloaded media file path. This is user-defined input. base::FilePath file_path_; scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
diff --git a/chrome/browser/android/feed/feed_offline_bridge.cc b/chrome/browser/android/feed/feed_offline_bridge.cc new file mode 100644 index 0000000..9b2224d7 --- /dev/null +++ b/chrome/browser/android/feed/feed_offline_bridge.cc
@@ -0,0 +1,109 @@ +// 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/android/feed/feed_offline_bridge.h" + +#include <memory> +#include <string> +#include <utility> + +#include "base/android/callback_android.h" +#include "base/android/jni_android.h" +#include "base/android/jni_array.h" +#include "base/android/jni_string.h" +#include "base/bind.h" +#include "base/optional.h" +#include "base/time/time.h" +#include "chrome/browser/android/feed/feed_host_service_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_android.h" +#include "components/feed/content/feed_host_service.h" +#include "components/offline_pages/core/offline_page_model.h" +#include "jni/FeedOfflineBridge_jni.h" + +using base::android::JavaRef; +using base::android::JavaParamRef; +using base::android::ScopedJavaGlobalRef; +using base::android::ScopedJavaLocalRef; + +namespace feed { + +namespace { + +void OnGetOfflineStatus(ScopedJavaGlobalRef<jobject> callback, + const std::vector<std::string>& urls) { + JNIEnv* env = base::android::AttachCurrentThread(); + ScopedJavaLocalRef<jobjectArray> j_urls = + base::android::ToJavaArrayOfStrings(env, urls); + RunObjectCallbackAndroid(callback, j_urls); +} + +} // namespace + +static jlong JNI_FeedOfflineBridge_Init( + JNIEnv* env, + const JavaParamRef<jobject>& j_this, + const JavaParamRef<jobject>& j_profile) { + Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); + FeedHostService* host_service = + FeedHostServiceFactory::GetForBrowserContext(profile); + return reinterpret_cast<intptr_t>( + new FeedOfflineBridge(j_this, host_service->GetOfflineHost())); +} + +FeedOfflineBridge::FeedOfflineBridge(const JavaRef<jobject>& j_this, + FeedOfflineHost* offline_host) + : j_this_(ScopedJavaGlobalRef<jobject>(j_this)), + offline_host_(offline_host) { + DCHECK(offline_host_); +} + +FeedOfflineBridge::~FeedOfflineBridge() = default; + +void FeedOfflineBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) { + delete this; +} + +ScopedJavaLocalRef<jobject> FeedOfflineBridge::GetOfflineId( + JNIEnv* env, + const JavaRef<jobject>& j_this, + const JavaRef<jstring>& j_url) { + std::string url = ConvertJavaStringToUTF8(env, j_url); + base::Optional<int64_t> id = offline_host_->GetOfflineId(url); + return id ? Java_FeedOfflineBridge_createLong(env, *id) : nullptr; +} + +void FeedOfflineBridge::GetOfflineStatus(JNIEnv* env, + const JavaRef<jobject>& j_this, + const JavaRef<jobjectArray>& j_urls, + const JavaRef<jobject>& j_callback) { + std::vector<std::string> urls; + base::android::AppendJavaStringArrayToStringVector(env, j_urls.obj(), &urls); + ScopedJavaGlobalRef<jobject> callback(j_callback); + offline_host_->GetOfflineStatus( + urls, base::BindOnce(&OnGetOfflineStatus, callback)); +} + +void FeedOfflineBridge::OnContentRemoved( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jobjectArray>& j_urls) { + std::vector<std::string> urls; + base::android::AppendJavaStringArrayToStringVector(env, j_urls.obj(), &urls); + offline_host_->OnContentRemoved(urls); +} + +void FeedOfflineBridge::OnNewContentReceived( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this) { + offline_host_->OnNewContentReceived(); +} + +void FeedOfflineBridge::OnNoListeners( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this) { + offline_host_->OnNoListeners(); +} + +} // namespace feed
diff --git a/chrome/browser/android/feed/feed_offline_bridge.h b/chrome/browser/android/feed/feed_offline_bridge.h new file mode 100644 index 0000000..594a412 --- /dev/null +++ b/chrome/browser/android/feed/feed_offline_bridge.h
@@ -0,0 +1,63 @@ +// 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_ANDROID_FEED_FEED_OFFLINE_BRIDGE_H_ +#define CHROME_BROWSER_ANDROID_FEED_FEED_OFFLINE_BRIDGE_H_ + +#include <jni.h> +#include <stdint.h> +#include <vector> + +#include "base/android/scoped_java_ref.h" +#include "base/macros.h" +#include "components/feed/content/feed_offline_host.h" + +namespace feed { + +class FeedOfflineHost; + +// Native counterpart of FeedOfflineBridge.java. Holds non-owning pointers to +// native implementation, to which operations are delegated. Also capable of +// calling back into Java half. +class FeedOfflineBridge { + public: + FeedOfflineBridge(const base::android::JavaRef<jobject>& j_this, + FeedOfflineHost* offline_host); + ~FeedOfflineBridge(); + + void Destroy(JNIEnv* env, const base::android::JavaRef<jobject>& j_this); + + base::android::ScopedJavaLocalRef<jobject> GetOfflineId( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jstring>& j_url); + + void GetOfflineStatus(JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jobjectArray>& j_urls, + const base::android::JavaRef<jobject>& j_callback); + + void OnContentRemoved(JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jobjectArray>& j_urls); + + void OnNewContentReceived(JNIEnv* env, + const base::android::JavaRef<jobject>& j_this); + + void OnNoListeners(JNIEnv* env, + const base::android::JavaRef<jobject>& j_this); + + private: + // Reference to the Java half of this bridge. Always valid. + base::android::ScopedJavaGlobalRef<jobject> j_this_; + + // Object to which all Java to native calls are delegated. + FeedOfflineHost* offline_host_; + + DISALLOW_COPY_AND_ASSIGN(FeedOfflineBridge); +}; + +} // namespace feed + +#endif // CHROME_BROWSER_ANDROID_FEED_FEED_OFFLINE_BRIDGE_H_
diff --git a/chrome/browser/android/feedback/connectivity_checker.cc b/chrome/browser/android/feedback/connectivity_checker.cc index 5d61c1f0..a0505cf0 100644 --- a/chrome/browser/android/feedback/connectivity_checker.cc +++ b/chrome/browser/android/feedback/connectivity_checker.cc
@@ -13,13 +13,13 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_android.h" #include "components/data_use_measurement/core/data_use_user_data.h" +#include "content/public/browser/storage_partition.h" #include "jni/ConnectivityChecker_jni.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_fetcher_delegate.h" -#include "net/url_request/url_request_context_getter.h" -#include "net/url_request/url_request_status.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" #include "url/gurl.h" using base::android::JavaParamRef; @@ -60,7 +60,7 @@ // A utility class for checking if the device is currently connected to the // Internet. -class ConnectivityChecker : public net::URLFetcherDelegate { +class ConnectivityChecker { public: ConnectivityChecker(Profile* profile, const GURL& url, @@ -71,16 +71,14 @@ // completed, |this| is deleted. void StartAsyncCheck(); - // net::URLFetcherDelegate implementation: - void OnURLFetchComplete(const net::URLFetcher* source) override; - // Cancels the URLFetcher, and triggers the callback with a negative result // and the timeout flag set. void OnTimeout(); private: - // The context in which the connectivity check is performed. - net::URLRequestContextGetter* request_context_; + void OnURLLoadComplete(scoped_refptr<net::HttpResponseHeaders> headers); + + scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_; // The URL to connect to. const GURL& url_; @@ -92,7 +90,7 @@ base::android::ScopedJavaGlobalRef<jobject> java_callback_; // The URLFetcher that executes the connectivity check. - std::unique_ptr<net::URLFetcher> url_fetcher_; + std::unique_ptr<network::SimpleURLLoader> url_loader_; // Whether |this| is already being destroyed, at which point the callback // has already happened, and no further action should be taken. @@ -101,21 +99,18 @@ std::unique_ptr<base::OneShotTimer> expiration_timer_; }; -void ConnectivityChecker::OnURLFetchComplete(const net::URLFetcher* source) { +void ConnectivityChecker::OnURLLoadComplete( + scoped_refptr<net::HttpResponseHeaders> headers) { if (is_being_destroyed_) return; is_being_destroyed_ = true; - DCHECK_EQ(url_fetcher_.get(), source); - net::URLRequestStatus status = source->GetStatus(); - int response_code = source->GetResponseCode(); - - bool connected = status.is_success() && response_code == net::HTTP_NO_CONTENT; - if (connected) { + DCHECK(url_loader_); + bool connected = headers && headers->response_code() == net::HTTP_NO_CONTENT; + if (connected) ExecuteCallback(java_callback_, CONNECTIVITY_CHECK_RESULT_CONNECTED); - } else { + else ExecuteCallback(java_callback_, CONNECTIVITY_CHECK_RESULT_NOT_CONNECTED); - } base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); } @@ -125,25 +120,28 @@ const GURL& url, const base::TimeDelta& timeout, const base::android::JavaRef<jobject>& java_callback) - : request_context_(profile->GetRequestContext()), + : shared_url_loader_factory_( + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess()), url_(url), timeout_(timeout), java_callback_(java_callback), - is_being_destroyed_(false) { -} + is_being_destroyed_(false) {} void ConnectivityChecker::StartAsyncCheck() { - url_fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this); - data_use_measurement::DataUseUserData::AttachToFetcher( - url_fetcher_.get(), - data_use_measurement::DataUseUserData::FEEDBACK_UPLOADER); - url_fetcher_->SetRequestContext(request_context_); - url_fetcher_->SetStopOnRedirect(true); - url_fetcher_->SetAutomaticallyRetryOn5xx(false); - url_fetcher_->SetAutomaticallyRetryOnNetworkChanges(0); - url_fetcher_->SetLoadFlags(net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE); - url_fetcher_->SetAllowCredentials(false); - url_fetcher_->Start(); + auto request = std::make_unique<network::ResourceRequest>(); + request->url = url_; + request->allow_credentials = false; + request->load_flags = net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE; + // TODO(https://crbug.com/808498): Re-add data use measurement once + // SimpleURLLoader supports it. + // ID=data_use_measurement::DataUseUserData::FEEDBACK_UPLOADER + url_loader_ = network::SimpleURLLoader::Create(std::move(request), + NO_TRAFFIC_ANNOTATION_YET); + url_loader_->DownloadHeadersOnly( + shared_url_loader_factory_.get(), + base::BindOnce(&ConnectivityChecker::OnURLLoadComplete, + base::Unretained(this))); expiration_timer_.reset(new base::OneShotTimer()); expiration_timer_->Start(FROM_HERE, timeout_, this, &ConnectivityChecker::OnTimeout); @@ -153,7 +151,7 @@ if (is_being_destroyed_) return; is_being_destroyed_ = true; - url_fetcher_.reset(); + url_loader_.reset(); ExecuteCallback(java_callback_, CONNECTIVITY_CHECK_RESULT_TIMEOUT); base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); }
diff --git a/chrome/browser/android/logo_bridge.cc b/chrome/browser/android/logo_bridge.cc index e674b8e..660b2455 100644 --- a/chrome/browser/android/logo_bridge.cc +++ b/chrome/browser/android/logo_bridge.cc
@@ -16,11 +16,12 @@ #include "chrome/browser/search_provider_logos/logo_service_factory.h" #include "components/search_provider_logos/logo_service.h" #include "components/search_provider_logos/logo_tracker.h" +#include "content/public/browser/storage_partition.h" #include "jni/LogoBridge_jni.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_fetcher_delegate.h" -#include "net/url_request/url_request_context_getter.h" -#include "net/url_request/url_request_status.h" +#include "net/http/http_status_code.h" +#include "services/network/public/cpp/resource_response_info.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/android/java_bitmap.h" #include "url/gurl.h" @@ -108,73 +109,80 @@ } // namespace -class LogoBridge::AnimatedLogoFetcher : public net::URLFetcherDelegate { +class LogoBridge::AnimatedLogoLoader { public: - AnimatedLogoFetcher( - const scoped_refptr<net::URLRequestContextGetter>& request_context) - : request_context_(request_context) {} - - ~AnimatedLogoFetcher() override {} + explicit AnimatedLogoLoader( + scoped_refptr<network::SharedURLLoaderFactory> factory) + : shared_url_loader_factory_(std::move(factory)) {} void Start(JNIEnv* env, const GURL& url, const JavaParamRef<jobject>& j_callback) { DCHECK(j_callback); - if (fetcher_ && fetcher_->GetOriginalURL() == url) + if (loader_ && url_ == url) return; + url_ = url; j_callback_.Reset(env, j_callback); - fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this); - fetcher_->SetRequestContext(request_context_.get()); - fetcher_->Start(); + auto request = std::make_unique<network::ResourceRequest>(); + request->url = url; + loader_ = network::SimpleURLLoader::Create(std::move(request), + NO_TRAFFIC_ANNOTATION_YET); + loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + shared_url_loader_factory_.get(), + base::BindOnce(&AnimatedLogoLoader::OnURLLoaderComplete, + base::Unretained(this))); start_time_ = base::TimeTicks::Now(); } private: - void OnURLFetchComplete(const net::URLFetcher* source) override { - DCHECK_EQ(source, fetcher_.get()); + void OnURLLoaderComplete(std::unique_ptr<std::string> response_body) { + DCHECK(loader_); DCHECK(!j_callback_.is_null()); - if (!source->GetStatus().is_success() || - (source->GetResponseCode() != 200)) { - ClearFetcher(); + int response_code = -1; + if (loader_->ResponseInfo() && loader_->ResponseInfo()->headers) + response_code = loader_->ResponseInfo()->headers->response_code(); + if (!response_body || response_code != net::HTTP_OK) { + ClearLoader(); return; } UMA_HISTOGRAM_TIMES("NewTabPage.AnimatedLogoDownloadTime", base::TimeTicks::Now() - start_time_); - std::string response; - source->GetResponseAsString(&response); JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jbyteArray> j_bytes = - ToJavaByteArray(env, reinterpret_cast<const uint8_t*>(response.data()), - response.length()); + ScopedJavaLocalRef<jbyteArray> j_bytes = ToJavaByteArray( + env, reinterpret_cast<const uint8_t*>(response_body.get()), + response_body->size()); ScopedJavaLocalRef<jobject> j_gif_image = Java_LogoBridge_createGifImage(env, j_bytes); Java_AnimatedLogoCallback_onAnimatedLogoAvailable(env, j_callback_, j_gif_image); - ClearFetcher(); + ClearLoader(); } - void ClearFetcher() { - fetcher_.reset(); + void ClearLoader() { + loader_.reset(); j_callback_.Reset(); } - scoped_refptr<net::URLRequestContextGetter> request_context_; + scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_; base::android::ScopedJavaGlobalRef<jobject> j_callback_; - // The URLFetcher currently fetching the animated logo, or nullptr when not - // fetching. - std::unique_ptr<net::URLFetcher> fetcher_; + // The original url used for the request. + GURL url_; + + // The SimpleURLLoader currently fetching the animated logo, or nullptr when + // not fetching. + std::unique_ptr<network::SimpleURLLoader> loader_; // The time when the current fetch was started. base::TimeTicks start_time_; - DISALLOW_COPY_AND_ASSIGN(AnimatedLogoFetcher); + DISALLOW_COPY_AND_ASSIGN(AnimatedLogoLoader); }; static jlong JNI_LogoBridge_Init(JNIEnv* env, @@ -191,8 +199,9 @@ logo_service_ = LogoServiceFactory::GetForProfile(profile); - animated_logo_fetcher_ = - std::make_unique<AnimatedLogoFetcher>(profile->GetRequestContext()); + animated_logo_loader_ = std::make_unique<AnimatedLogoLoader>( + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess()); } LogoBridge::~LogoBridge() {} @@ -215,5 +224,5 @@ const JavaParamRef<jobject>& j_callback, const JavaParamRef<jstring>& j_url) { GURL url = GURL(ConvertJavaStringToUTF8(env, j_url)); - animated_logo_fetcher_->Start(env, url, j_callback); + animated_logo_loader_->Start(env, url, j_callback); }
diff --git a/chrome/browser/android/logo_bridge.h b/chrome/browser/android/logo_bridge.h index 46b49cd1..37d29cb 100644 --- a/chrome/browser/android/logo_bridge.h +++ b/chrome/browser/android/logo_bridge.h
@@ -48,13 +48,13 @@ const base::android::JavaParamRef<jstring>& j_url); private: - class AnimatedLogoFetcher; + class AnimatedLogoLoader; virtual ~LogoBridge(); search_provider_logos::LogoService* logo_service_; - std::unique_ptr<AnimatedLogoFetcher> animated_logo_fetcher_; + std::unique_ptr<AnimatedLogoLoader> animated_logo_loader_; base::WeakPtrFactory<LogoBridge> weak_ptr_factory_;
diff --git a/chrome/browser/android/ntp/content_suggestions_notifier.cc b/chrome/browser/android/ntp/content_suggestions_notifier.cc index a12823c..c4bc3173 100644 --- a/chrome/browser/android/ntp/content_suggestions_notifier.cc +++ b/chrome/browser/android/ntp/content_suggestions_notifier.cc
@@ -35,8 +35,6 @@ bool ContentSuggestionsNotifier::ShouldSendNotifications(PrefService* prefs) { // Notifications are blocked when the suggested articles list is hidden. - // The user can hide the list when kArticleSuggestionsExpandableHeader feature - // is enabled. if (!prefs->GetBoolean(ntp_snippets::prefs::kArticlesListVisible)) { return false; }
diff --git a/chrome/browser/android/omnibox/query_in_omnibox_android.cc b/chrome/browser/android/omnibox/query_in_omnibox_android.cc index 0674a266..7b3654e 100644 --- a/chrome/browser/android/omnibox/query_in_omnibox_android.cc +++ b/chrome/browser/android/omnibox/query_in_omnibox_android.cc
@@ -2,53 +2,29 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/omnibox/query_in_omnibox_android.h" - #include "base/android/jni_string.h" -#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" #include "chrome/browser/profiles/profile_android.h" -#include "chrome/browser/search_engines/template_url_service_factory.h" +#include "chrome/browser/ui/omnibox/query_in_omnibox_factory.h" #include "components/omnibox/browser/query_in_omnibox.h" #include "jni/QueryInOmnibox_jni.h" using base::android::JavaParamRef; -QueryInOmniboxAndroid::QueryInOmniboxAndroid(Profile* profile) - : query_in_omnibox_(new QueryInOmnibox( - AutocompleteClassifierFactory::GetForProfile(profile), - TemplateURLServiceFactory::GetForProfile(profile))) {} - -QueryInOmniboxAndroid::~QueryInOmniboxAndroid() {} - -static jlong JNI_QueryInOmnibox_Init(JNIEnv* env, - const JavaParamRef<jobject>& obj, - const JavaParamRef<jobject>& jprofile) { - Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); - if (!profile) - return 0; - - QueryInOmniboxAndroid* native_bridge = new QueryInOmniboxAndroid(profile); - return reinterpret_cast<intptr_t>(native_bridge); -} - -void QueryInOmniboxAndroid::Destroy(JNIEnv* env, - const JavaParamRef<jobject>& obj) { - delete this; -} - -base::android::ScopedJavaLocalRef<jstring> -QueryInOmniboxAndroid::GetDisplaySearchTerms( - JNIEnv* env, - const JavaParamRef<jobject>& obj, - jint j_security_level, - const JavaParamRef<jstring>& j_url) { +static base::android::ScopedJavaLocalRef<jstring> +JNI_QueryInOmnibox_GetDisplaySearchTerms(JNIEnv* env, + const JavaParamRef<jclass>&, + const JavaParamRef<jobject>& j_profile, + jint j_security_level, + const JavaParamRef<jstring>& j_url) { + Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); security_state::SecurityLevel security_level = static_cast<security_state::SecurityLevel>(j_security_level); GURL url = GURL(base::android::ConvertJavaStringToUTF16(env, j_url)); base::string16 search_terms; - bool should_display = query_in_omnibox_->GetDisplaySearchTerms( - security_level, url, &search_terms); + bool should_display = + QueryInOmniboxFactory::GetForProfile(profile)->GetDisplaySearchTerms( + security_level, url, &search_terms); if (!should_display) return nullptr; @@ -56,9 +32,12 @@ return base::android::ConvertUTF16ToJavaString(env, search_terms); } -void QueryInOmniboxAndroid::SetIgnoreSecurityLevel( +void JNI_QueryInOmnibox_SetIgnoreSecurityLevel( JNIEnv* env, - const JavaParamRef<jobject>& obj, - bool ignore) { - query_in_omnibox_->set_ignore_security_level(ignore); + const JavaParamRef<jclass>&, + const JavaParamRef<jobject>& j_profile, + jboolean ignore) { + Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); + QueryInOmniboxFactory::GetForProfile(profile)->set_ignore_security_level( + ignore); }
diff --git a/chrome/browser/android/omnibox/query_in_omnibox_android.h b/chrome/browser/android/omnibox/query_in_omnibox_android.h deleted file mode 100644 index 38954288..0000000 --- a/chrome/browser/android/omnibox/query_in_omnibox_android.h +++ /dev/null
@@ -1,40 +0,0 @@ -// 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_ANDROID_OMNIBOX_QUERY_IN_OMNIBOX_ANDROID_H_ -#define CHROME_BROWSER_ANDROID_OMNIBOX_QUERY_IN_OMNIBOX_ANDROID_H_ - -#include <memory> - -#include "base/android/scoped_java_ref.h" -#include "base/macros.h" - -class QueryInOmnibox; -class Profile; - -// The native part of the Java QueryInOmnibox class. -class QueryInOmniboxAndroid { - public: - explicit QueryInOmniboxAndroid(Profile* profile); - ~QueryInOmniboxAndroid(); - - void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); - - // Methods that forward to QueryInOmnibox: - base::android::ScopedJavaLocalRef<jstring> GetDisplaySearchTerms( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jint j_security_level, - const base::android::JavaParamRef<jstring>& j_url); - void SetIgnoreSecurityLevel(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - bool ignore); - - private: - std::unique_ptr<QueryInOmnibox> query_in_omnibox_; - - DISALLOW_COPY_AND_ASSIGN(QueryInOmniboxAndroid); -}; - -#endif // CHROME_BROWSER_ANDROID_OMNIBOX_QUERY_IN_OMNIBOX_ANDROID_H_
diff --git a/chrome/browser/android/signin/unified_consent_service_bridge.cc b/chrome/browser/android/signin/unified_consent_service_bridge.cc index 16e34fa6..225ae856 100644 --- a/chrome/browser/android/signin/unified_consent_service_bridge.cc +++ b/chrome/browser/android/signin/unified_consent_service_bridge.cc
@@ -3,8 +3,11 @@ // found in the LICENSE file. #include "base/android/jni_android.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_android.h" #include "chrome/browser/unified_consent/unified_consent_service_factory.h" +#include "components/prefs/pref_service.h" +#include "components/unified_consent/pref_names.h" #include "components/unified_consent/unified_consent_service.h" #include "jni/UnifiedConsentServiceBridge_jni.h" @@ -40,3 +43,35 @@ UnifiedConsentServiceFactory::GetForProfile(profile); return unifiedConsentService->ShouldShowConsentBump(); } + +static jboolean +JNI_UnifiedConsentServiceBridge_IsUrlKeyedAnonymizedDataCollectionEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jclass>& jcaller, + const base::android::JavaParamRef<jobject>& profileAndroid) { + Profile* profile = ProfileAndroid::FromProfileAndroid(profileAndroid); + return profile->GetPrefs()->GetBoolean( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled); +} + +static void +JNI_UnifiedConsentServiceBridge_SetUrlKeyedAnonymizedDataCollectionEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jclass>& jcaller, + const base::android::JavaParamRef<jobject>& profileAndroid, + const jboolean enabled) { + Profile* profile = ProfileAndroid::FromProfileAndroid(profileAndroid); + profile->GetPrefs()->SetBoolean( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, + enabled); +} + +static jboolean +JNI_UnifiedConsentServiceBridge_IsUrlKeyedAnonymizedDataCollectionManaged( + JNIEnv* env, + const base::android::JavaParamRef<jclass>& jcaller, + const base::android::JavaParamRef<jobject>& profileAndroid) { + Profile* profile = ProfileAndroid::FromProfileAndroid(profileAndroid); + return profile->GetPrefs()->IsManagedPreference( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled); +}
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index d3f1f1e..0df762c 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -566,7 +566,8 @@ jboolean is_renderer_initiated, jboolean should_replace_current_entry, jboolean has_user_gesture, - jboolean should_clear_history_list) { + jboolean should_clear_history_list, + jlong input_start_timestamp) { if (!web_contents()) return PAGE_LOAD_FAILED; @@ -629,6 +630,10 @@ load_params.should_replace_current_entry = should_replace_current_entry; load_params.has_user_gesture = has_user_gesture; load_params.should_clear_history_list = should_clear_history_list; + if (input_start_timestamp != 0) { + load_params.input_start = + base::TimeTicks::FromUptimeMillis(input_start_timestamp); + } web_contents()->GetController().LoadURLWithParams(load_params); } return DEFAULT_PAGE_LOAD;
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index 1fb61a2d..7a7b03d 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -191,7 +191,8 @@ jboolean is_renderer_initiated, jboolean should_replace_current_entry, jboolean has_user_gesture, - jboolean should_clear_history_list); + jboolean should_clear_history_list, + jlong omnibox_input_received_timestamp); void SetActiveNavigationEntryTitleForUrl( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj,
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc index 67651b0..7e2d2b5 100644 --- a/chrome/browser/android/webapk/webapk_installer.cc +++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -46,6 +46,9 @@ #include "net/base/load_flags.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/resource_response_info.h" +#include "services/network/public/cpp/simple_url_loader.h" #include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/codec/png_codec.h" #include "url/gurl.h" @@ -97,11 +100,6 @@ DISALLOW_COPY_AND_ASSIGN(CacheClearer); }; -net::URLRequestContextGetter* GetRequestContext( - content::BrowserContext* browser_context) { - return Profile::FromBrowserContext(browser_context)->GetRequestContext(); -} - // Returns the WebAPK server URL based on the command line. GURL GetServerUrl() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); @@ -533,22 +531,23 @@ SendRequest(std::move(update_request)); } -void WebApkInstaller::OnURLFetchComplete(const net::URLFetcher* source) { +void WebApkInstaller::OnURLLoaderComplete( + std::unique_ptr<std::string> response_body) { timer_.Stop(); - if (!source->GetStatus().is_success() || - source->GetResponseCode() != net::HTTP_OK) { + int response_code = -1; + if (loader_->ResponseInfo() && loader_->ResponseInfo()->headers) + response_code = loader_->ResponseInfo()->headers->response_code(); + + if (!response_body || response_code != net::HTTP_OK) { LOG(WARNING) << base::StringPrintf( - "WebAPK server returned response code %d.", source->GetResponseCode()); + "WebAPK server returned response code %d.", response_code); OnResult(WebApkInstallResult::FAILURE); return; } - std::string response_string; - source->GetResponseAsString(&response_string); - std::unique_ptr<webapk::WebApkResponse> response(new webapk::WebApkResponse); - if (!response->ParseFromString(response_string)) { + if (!response_body || !response->ParseFromString(*response_body)) { LOG(WARNING) << "WebAPK server did not return proto."; OnResult(WebApkInstallResult::FAILURE); return; @@ -574,6 +573,13 @@ InstallOrUpdateWebApk(response->package_name(), version, token); } +network::SharedURLLoaderFactory* GetURLLoaderFactory( + content::BrowserContext* browser_context) { + return content::BrowserContext::GetDefaultStoragePartition(browser_context) + ->GetURLLoaderFactoryForBrowserProcess() + .get(); +} + void WebApkInstaller::OnHaveSufficientSpaceForInstall() { // We need to take the hash of the bitmap at the icon URL prior to any // transformations being applied to the bitmap (such as encoding/decoding @@ -584,9 +590,7 @@ // We redownload the icon in order to take the Murmur2 hash. The redownload // should be fast because the icon should be in the HTTP cache. WebApkIconHasher::DownloadAndComputeMurmur2Hash( - content::BrowserContext::GetDefaultStoragePartition(browser_context_) - ->GetURLLoaderFactoryForBrowserProcess() - .get(), + GetURLLoaderFactory(browser_context_), install_shortcut_info_->best_primary_icon_url, base::Bind(&WebApkInstaller::OnGotPrimaryIconMurmur2Hash, weak_ptr_factory_.GetWeakPtr())); @@ -604,9 +608,7 @@ install_shortcut_info_->best_badge_icon_url != install_shortcut_info_->best_primary_icon_url) { WebApkIconHasher::DownloadAndComputeMurmur2Hash( - content::BrowserContext::GetDefaultStoragePartition(browser_context_) - ->GetURLLoaderFactoryForBrowserProcess() - .get(), + GetURLLoaderFactory(browser_context_), install_shortcut_info_->best_badge_icon_url, base::Bind(&WebApkInstaller::OnGotBadgeIconMurmur2Hash, weak_ptr_factory_.GetWeakPtr(), true, primary_icon_hash)); @@ -650,11 +652,16 @@ base::Bind(&WebApkInstaller::OnResult, weak_ptr_factory_.GetWeakPtr(), WebApkInstallResult::FAILURE)); - url_fetcher_ = - net::URLFetcher::Create(server_url_, net::URLFetcher::POST, this); - url_fetcher_->SetRequestContext(GetRequestContext(browser_context_)); - url_fetcher_->SetUploadData(kProtoMimeType, *serialized_proto); - url_fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); - url_fetcher_->SetAllowCredentials(false); - url_fetcher_->Start(); + auto request = std::make_unique<network::ResourceRequest>(); + request->url = server_url_; + request->method = "POST"; + request->load_flags = net::LOAD_DISABLE_CACHE; + request->allow_credentials = false; + loader_ = network::SimpleURLLoader::Create(std::move(request), + NO_TRAFFIC_ANNOTATION_YET); + loader_->AttachStringForUpload(*serialized_proto, kProtoMimeType); + loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + GetURLLoaderFactory(browser_context_), + base::BindOnce(&WebApkInstaller::OnURLLoaderComplete, + weak_ptr_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/android/webapk/webapk_installer.h b/chrome/browser/android/webapk/webapk_installer.h index b0d7aefa..3739d6e 100644 --- a/chrome/browser/android/webapk/webapk_installer.h +++ b/chrome/browser/android/webapk/webapk_installer.h
@@ -19,8 +19,6 @@ #include "chrome/browser/android/shortcut_info.h" #include "chrome/browser/android/webapk/webapk_install_service.h" #include "chrome/browser/android/webapk/webapk_types.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_fetcher_delegate.h" #include "third_party/skia/include/core/SkBitmap.h" namespace base { @@ -32,6 +30,10 @@ class BrowserContext; } +namespace network { +class SimpleURLLoader; +} + // The enum values are persisted to logs |WebApkInstallSpaceStatus| in // enums.xml, therefore they should never be reused nor renumbered. // A Java counterpart will be generated for this enum. @@ -46,11 +48,11 @@ // Talks to Chrome WebAPK server to download metadata about a WebAPK and issue // a request for it to be installed. The native WebApkInstaller owns the Java // WebApkInstaller counterpart. -class WebApkInstaller : public net::URLFetcherDelegate { +class WebApkInstaller { public: using FinishCallback = WebApkInstallService::FinishCallback; - ~WebApkInstaller() override; + virtual ~WebApkInstaller(); // Creates a self-owned WebApkInstaller instance and talks to the Chrome // WebAPK server to generate a WebAPK on the server and locally requests the @@ -175,8 +177,7 @@ // Called with the contents of the update request file. void OnReadUpdateRequest(std::unique_ptr<std::string> update_request); - // net::URLFetcherDelegate: - void OnURLFetchComplete(const net::URLFetcher* source) override; + void OnURLLoaderComplete(std::unique_ptr<std::string> response_body); // Called with the computed Murmur2 hash for the primary icon. void OnGotPrimaryIconMurmur2Hash(const std::string& primary_icon_hash); @@ -196,7 +197,7 @@ content::BrowserContext* browser_context_; // Sends HTTP request to WebAPK server. - std::unique_ptr<net::URLFetcher> url_fetcher_; + std::unique_ptr<network::SimpleURLLoader> loader_; // Fails WebApkInstaller if WebAPK server takes too long to respond or if the // download takes too long.
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc index 452cb61..7ea9906af 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -25,7 +25,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" @@ -92,7 +91,6 @@ url_consent_helper_( unified_consent::UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - IsUnifiedConsentFeatureEnabled(profile_), ProfileSyncServiceFactory::GetSyncServiceForBrowserContext( profile_))), storage_partition_(nullptr) {}
diff --git a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc index fcd952fab..4e98d83d 100644 --- a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
@@ -142,6 +142,7 @@ } autofill_manager->client()->HideAutofillPopup(); + ADD_FAILURE() << "Failed to autofill the form!"; return false; }
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc index 08cd6b4..cb8599e1 100644 --- a/chrome/browser/autofill/captured_sites_test_utils.cc +++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -194,10 +194,10 @@ bool TestRecipeReplayer::ReplayTest(const base::FilePath capture_file_path, const base::FilePath recipe_file_path) { - if (StartWebPageReplayServer(capture_file_path)) { - return ReplayRecordedActions(recipe_file_path); - } - return false; + if (!StartWebPageReplayServer(capture_file_path)) + return false; + + return ReplayRecordedActions(recipe_file_path); } // static @@ -261,8 +261,10 @@ const base::FilePath& capture_file_path) { std::vector<std::string> args; base::FilePath src_dir; - if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)) + if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)) { + ADD_FAILURE() << "Failed to extract the Chromium source directory!"; return false; + } args.push_back(base::StringPrintf("--http_port=%d", kHostHttpPort)); args.push_back(base::StringPrintf("--https_port=%d", kHostHttpsPort)); @@ -295,12 +297,22 @@ base::TimeDelta::FromSeconds(20)); wpr_launch_waiter.Run(); - return web_page_replay_server_.IsValid(); + if (!web_page_replay_server_.IsValid()) { + ADD_FAILURE() << "Failed to start the WPR replay server!"; + return false; + } + + return true; } bool TestRecipeReplayer::StopWebPageReplayServer() { - if (web_page_replay_server_.IsValid()) - return web_page_replay_server_.Terminate(0, true); + if (web_page_replay_server_.IsValid()) { + if (!web_page_replay_server_.Terminate(0, true)) { + ADD_FAILURE() << "Failed to terminate the WPR replay server!"; + return false; + } + } + // The test server hasn't started, no op. return true; } @@ -320,13 +332,14 @@ const std::vector<std::string>& args, const base::TimeDelta& timeout) { base::Process process; - if (!RunWebPageReplayCmd(cmd, args, &process)) - return false; - if (process.IsValid()) { - int exit_code; - if (process.WaitForExitWithTimeout(timeout, &exit_code)) - return (exit_code == 0); + int exit_code; + + if (RunWebPageReplayCmd(cmd, args, &process) && process.IsValid() && + process.WaitForExitWithTimeout(timeout, &exit_code) && exit_code == 0) { + return true; } + + ADD_FAILURE() << "Failed to run WPR command: '" << cmd << "'!"; return false; } @@ -336,8 +349,10 @@ base::Process* process) { base::LaunchOptions options = base::LaunchOptionsForTest(); base::FilePath exe_dir; - if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &exe_dir)) + if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &exe_dir)) { + ADD_FAILURE() << "Failed to extract the Chromium source directory!"; return false; + } base::FilePath web_page_replay_binary_dir = exe_dir.AppendASCII( "third_party/catapult/telemetry/telemetry/internal/bin"); @@ -363,8 +378,10 @@ // The custom cert and key files are different from those of the offical // WPR releases. The custom files are made to work on iOS. base::FilePath src_dir; - if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)) + if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)) { + ADD_FAILURE() << "Failed to extract the Chromium source directory!"; return false; + } base::FilePath web_page_replay_support_file_dir = src_dir.AppendASCII( "components/test/data/autofill/web_page_replay_support_files"); @@ -391,8 +408,10 @@ // Read the text of the recipe file. base::ThreadRestrictions::SetIOAllowed(true); std::string json_text; - if (!base::ReadFileToString(recipe_file_path, &json_text)) + if (!base::ReadFileToString(recipe_file_path, &json_text)) { + ADD_FAILURE() << "Failed to read recipe file '" << recipe_file_path << "'!"; return false; + } // Convert the file text into a json object. std::unique_ptr<base::DictionaryValue> recipe = @@ -407,23 +426,36 @@ // Iterate through and execute each action in the recipe. base::Value* action_list_container = recipe->FindKey("actions"); - if (!action_list_container) + if (!action_list_container) { + ADD_FAILURE() << "Failed to extract action list from the recipe!"; return false; - if (base::Value::Type::LIST != action_list_container->type()) + } + + if (base::Value::Type::LIST != action_list_container->type()) { + ADD_FAILURE() << "The recipe's actions object is not a list!"; return false; + } + base::Value::ListStorage& action_list = action_list_container->GetList(); for (base::ListValue::iterator it_action = action_list.begin(); it_action != action_list.end(); ++it_action) { base::DictionaryValue* action; - if (!it_action->GetAsDictionary(&action)) + if (!it_action->GetAsDictionary(&action)) { + ADD_FAILURE() + << "Failed to extract an individual action from the recipe!"; return false; + } base::Value* type_container = action->FindKey("type"); - if (!type_container) + if (!type_container) { + ADD_FAILURE() << "Failed to extract action type from the recipe!"; return false; - if (base::Value::Type::STRING != type_container->type()) + } + if (base::Value::Type::STRING != type_container->type()) { + ADD_FAILURE() << "Action type is not a string!"; return false; + } std::string type = type_container->GetString(); if (base::CompareCaseInsensitiveASCII(type, "autofill") == 0) { @@ -457,18 +489,26 @@ std::unique_ptr<base::DictionaryValue>& recipe) { // Extract the starting URL from the test recipe. base::Value* starting_url_container = recipe->FindKey("startingURL"); - if (!starting_url_container) + if (!starting_url_container) { + ADD_FAILURE() << "Failed to extract the starting url from the recipe!"; return false; - if (base::Value::Type::STRING != starting_url_container->type()) + } + if (base::Value::Type::STRING != starting_url_container->type()) { + ADD_FAILURE() << "Starting url is not a string!"; return false; + } + + std::string starting_url = starting_url_container->GetString(); // Navigate to the starting URL, wait for the page to complete loading. PageActivityObserver page_activity_observer(GetWebContents()); - if (!content::ExecuteScript( - GetWebContents(), - base::StringPrintf("window.location.href = '%s';", - starting_url_container->GetString().c_str()))) + if (!content::ExecuteScript(GetWebContents(), + base::StringPrintf("window.location.href = '%s';", + starting_url.c_str()))) { + ADD_FAILURE() << "Failed to navigate Chrome to '" << starting_url << "'!"; return false; + } + page_activity_observer.WaitTillPageIsIdle(); return true; } @@ -478,9 +518,11 @@ std::string xpath; if (!GetTargetHTMLElementXpathFromAction(action, &xpath)) return false; + content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + if (!WaitForElementToBeReady(frame, xpath)) return false; @@ -493,8 +535,12 @@ // signing in, the site fills the form with the user's profile // information. if (!ExecuteJavaScriptOnElementByXpath( - frame, xpath, "automation_helper.setInputElementValue(target, ``);")) + frame, xpath, + "automation_helper.setInputElementValue(target, ``);")) { + ADD_FAILURE() << "Failed to clear the input field value!"; return false; + } + if (!feature_action_executor()->AutofillForm(frame, xpath, kAutofillActionNumRetries)) return false; @@ -508,16 +554,21 @@ std::string xpath; if (!GetTargetHTMLElementXpathFromAction(action, &xpath)) return false; + content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + if (!WaitForElementToBeReady(frame, xpath)) return false; VLOG(1) << "Left mouse clicking `" << xpath << "`."; PageActivityObserver page_activity_observer(frame); - if (!ExecuteJavaScriptOnElementByXpath(frame, xpath, "target.click();")) + if (!ExecuteJavaScriptOnElementByXpath(frame, xpath, "target.click();")) { + ADD_FAILURE() << "Failed to left click element with JavaScript!"; return false; + } + page_activity_observer.WaitTillPageIsIdle(); return true; } @@ -525,18 +576,27 @@ bool TestRecipeReplayer::ExecuteSelectDropdownAction( const base::DictionaryValue& action) { const base::Value* index_container = action.FindKey("index"); - if (!index_container) + if (!index_container) { + ADD_FAILURE() + << "Failed to extract selection index from the select action!"; return false; - if (base::Value::Type::INTEGER != index_container->type()) + } + + if (base::Value::Type::INTEGER != index_container->type()) { + ADD_FAILURE() << "Selection index is not an integer!"; return false; + } + int index = index_container->GetInt(); std::string xpath; if (!GetTargetHTMLElementXpathFromAction(action, &xpath)) return false; + content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + if (!WaitForElementToBeReady(frame, xpath)) return false; @@ -547,8 +607,11 @@ base::StringPrintf( "automation_helper" " .selectOptionFromDropDownElementByIndex(target, %d);", - index_container->GetInt()))) + index_container->GetInt()))) { + ADD_FAILURE() << "Failed to select drop down option with JavaScript!"; return false; + } + page_activity_observer.WaitTillPageIsIdle(); return true; } @@ -556,18 +619,26 @@ bool TestRecipeReplayer::ExecuteTypeAction( const base::DictionaryValue& action) { const base::Value* value_container = action.FindKey("value"); - if (!value_container) + if (!value_container) { + ADD_FAILURE() << "Failed to extract value from the type action!"; return false; - if (base::Value::Type::STRING != value_container->type()) + } + + if (base::Value::Type::STRING != value_container->type()) { + ADD_FAILURE() << "Value is not a string!"; return false; + } + std::string value = value_container->GetString(); std::string xpath; if (!GetTargetHTMLElementXpathFromAction(action, &xpath)) return false; + content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + if (!WaitForElementToBeReady(frame, xpath)) return false; @@ -577,8 +648,11 @@ frame, xpath, base::StringPrintf( "automation_helper.setInputElementValue(target, `%s`);", - value.c_str()))) + value.c_str()))) { + ADD_FAILURE() << "Failed to type inside input element with JavaScript!"; return false; + } + page_activity_observer.WaitTillPageIsIdle(); return true; } @@ -588,17 +662,22 @@ std::string xpath; if (!GetTargetHTMLElementXpathFromAction(action, &xpath)) return false; + content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + if (!WaitForElementToBeReady(frame, xpath)) return false; const base::Value* autofill_prediction_container = action.FindKey("expectedAutofillType"); if (autofill_prediction_container) { - if (base::Value::Type::STRING != autofill_prediction_container->type()) + if (base::Value::Type::STRING != autofill_prediction_container->type()) { + ADD_FAILURE() << "Autofill prediction is not a string!"; return false; + } + std::string expected_autofill_prediction_type = autofill_prediction_container->GetString(); VLOG(1) << "Checking the field `" << xpath << "` has the autofill type '" @@ -610,10 +689,17 @@ } const base::Value* expected_value_container = action.FindKey("expectedValue"); - if (!expected_value_container) + if (!expected_value_container) { + ADD_FAILURE() << "Failed to extract the expected value field from the " + "validate field value action!"; return false; - if (base::Value::Type::STRING != expected_value_container->type()) + } + + if (base::Value::Type::STRING != expected_value_container->type()) { + ADD_FAILURE() << "Expected value is not a string!"; return false; + } + std::string expected_value = expected_value_container->GetString(); VLOG(1) << "Checking the field `" << xpath << "`."; @@ -627,21 +713,32 @@ // Extract the list of JavaScript assertions into a vector. std::vector<std::string> state_assertions; const base::Value* assertions_list_container = action.FindKey("assertions"); - if (!assertions_list_container) + if (!assertions_list_container) { + ADD_FAILURE() + << "Failed to extract assertions from the wait for state action!"; return false; - if (base::Value::Type::LIST != assertions_list_container->type()) + } + + if (base::Value::Type::LIST != assertions_list_container->type()) { + ADD_FAILURE() << "Assertions is not a list!"; return false; + } + const base::Value::ListStorage& assertions_list = assertions_list_container->GetList(); for (const base::Value& assertion : assertions_list) { - if (base::Value::Type::STRING != assertion.type()) + if (base::Value::Type::STRING != assertion.type()) { + ADD_FAILURE() << "Assertion is not a string!"; return false; + } + state_assertions.push_back(assertion.GetString()); } content::RenderFrameHost* frame; if (!GetTargetFrameFromAction(action, &frame)) return false; + VLOG(1) << "Waiting for page to reach a state."; // Wait for all of the assertions to become true on the current page. @@ -653,10 +750,16 @@ std::string* xpath) { xpath->clear(); const base::Value* xpath_container = action.FindKey("selector"); - if (!xpath_container) + if (!xpath_container) { + ADD_FAILURE() << "Failed to extract the xpath selector from action!"; return false; - if (base::Value::Type::STRING != xpath_container->type()) + } + + if (base::Value::Type::STRING != xpath_container->type()) { + ADD_FAILURE() << "Xpath selector is not a string!"; return false; + } + *xpath = xpath_container->GetString(); return true; } @@ -665,17 +768,28 @@ const base::DictionaryValue& action, content::RenderFrameHost** frame) { const base::Value* iframe_container = action.FindKey("context"); - if (!iframe_container) + if (!iframe_container) { + ADD_FAILURE() << "Failed to extract the iframe context from action!"; return false; + } + const base::DictionaryValue* iframe; - if (!iframe_container->GetAsDictionary(&iframe)) + if (!iframe_container->GetAsDictionary(&iframe)) { + ADD_FAILURE() << "Failed to extract the iframe context object!"; return false; + } const base::Value* is_iframe_container = iframe->FindKey("isIframe"); - if (!is_iframe_container) + if (!is_iframe_container) { + ADD_FAILURE() + << "Failed to extract the isIframe field from the iframe context!"; return false; - if (base::Value::Type::BOOLEAN != is_iframe_container->type()) + } + + if (base::Value::Type::BOOLEAN != is_iframe_container->type()) { + ADD_FAILURE() << "isIframe is not a boolean value!"; return false; + } if (!is_iframe_container->GetBool()) { *frame = GetWebContents()->GetMainFrame(); @@ -684,35 +798,49 @@ const base::Value* frame_name_container = iframe->FindPath({"browserTest", "name"}); - const base::Value* frame_scheme_host_container = + const base::Value* frame_origin_container = iframe->FindPath({"browserTest", "origin"}); const base::Value* frame_url_container = iframe->FindPath({"browserTest", "url"}); IFrameWaiter iframe_waiter(GetWebContents()); + if (frame_name_container != nullptr && + base::Value::Type::STRING != frame_name_container->type()) { + ADD_FAILURE() << "Iframe name is not a string!"; + return false; + } + + if (frame_origin_container != nullptr && + base::Value::Type::STRING != frame_origin_container->type()) { + ADD_FAILURE() << "Iframe origin is not a string!"; + return false; + } + + if (frame_url_container != nullptr && + base::Value::Type::STRING != frame_url_container->type()) { + ADD_FAILURE() << "Iframe url is not a string!"; + return false; + } + if (frame_name_container != nullptr) { - if (base::Value::Type::STRING != frame_name_container->type()) - return false; - *frame = iframe_waiter.WaitForFrameMatchingName( - frame_name_container->GetString()); - return frame != nullptr; - } else if (frame_scheme_host_container != nullptr) { - if (base::Value::Type::STRING != frame_scheme_host_container->type()) - return false; - *frame = iframe_waiter.WaitForFrameMatchingOrigin( - GURL(frame_scheme_host_container->GetString())); - return frame != nullptr; + std::string frame_name = frame_name_container->GetString(); + *frame = iframe_waiter.WaitForFrameMatchingName(frame_name); + } else if (frame_origin_container != nullptr) { + std::string frame_origin = frame_origin_container->GetString(); + *frame = iframe_waiter.WaitForFrameMatchingOrigin(GURL(frame_origin)); } else if (frame_url_container != nullptr) { - if (base::Value::Type::STRING != frame_url_container->type()) - return false; - *frame = iframe_waiter.WaitForFrameMatchingUrl( - GURL(frame_url_container->GetString())); - return frame != nullptr; + std::string frame_url = frame_url_container->GetString(); + *frame = iframe_waiter.WaitForFrameMatchingUrl(GURL(frame_url)); } else { ADD_FAILURE() << "The recipe does not specify a way to find the iframe!"; } - return false; + if (frame == nullptr) { + ADD_FAILURE() << "Failed to find iframe!"; + return false; + } + + return true; } bool TestRecipeReplayer::WaitForElementToBeReady( @@ -812,7 +940,9 @@ } return true; } - VLOG(1) << element_xpath << ", " << get_property_function_body; + + ADD_FAILURE() << "Failed to extract element property! " << element_xpath + << ", " << get_property_function_body; return false; } @@ -842,9 +972,18 @@ element_xpath.c_str())); bool focused = false; - if (!ExecuteScriptAndExtractBool(frame, focus_on_target_field_js, &focused)) + if (!ExecuteScriptAndExtractBool(frame, focus_on_target_field_js, &focused)) { + ADD_FAILURE() << "Failed to place focus on the element with JavaScript!"; return false; - return focused; + } + + if (focused) { + return true; + } else { + ADD_FAILURE() << "Failed to place focus on the element: " << element_xpath + << "!"; + return false; + } } bool TestRecipeReplayer::SimulateLeftMouseClickAt( @@ -869,8 +1008,10 @@ gfx::Point reset_mouse(offset.origin()); reset_mouse = gfx::Point(reset_mouse.x() + point.x(), reset_mouse.y() + point.y()); - if (!ui_test_utils::SendMouseMoveSync(reset_mouse)) + if (!ui_test_utils::SendMouseMoveSync(reset_mouse)) { + ADD_FAILURE() << "Failed to position the mouse!"; return false; + } widget->ForwardMouseEvent(mouse_event); mouse_event.SetType(blink::WebInputEvent::kMouseUp); @@ -888,6 +1029,8 @@ content::RenderFrameHost* frame, const std::string& focus_element_css_selector, const int attempts) { + ADD_FAILURE() << "TestRecipeReplayChromeFeatureActionExecutor::AutofillForm " + "is not implemented!"; return false; }
diff --git a/chrome/browser/background_fetch/background_fetch_browsertest.cc b/chrome/browser/background_fetch/background_fetch_browsertest.cc index 971f9c6a..57ed666 100644 --- a/chrome/browser/background_fetch/background_fetch_browsertest.cc +++ b/chrome/browser/background_fetch/background_fetch_browsertest.cc
@@ -29,10 +29,13 @@ #include "components/offline_items_collection/core/offline_content_aggregator.h" #include "components/offline_items_collection/core/offline_content_provider.h" #include "components/offline_items_collection/core/offline_item.h" +#include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "services/metrics/public/cpp/metrics_utils.h" +#include "services/metrics/public/cpp/ukm_builders.h" #include "url/origin.h" using offline_items_collection::ContentId; @@ -67,6 +70,17 @@ // loaded by this test (chrome/test/data/background_fetch/background_fetch.js) const int kDownloadTotalBytesTooLow = 80; +// Number of requests in the fetch() call from the JavaScript file loaded by +// this test (chrome/test/data/background_fetch/background_fetch.js) +const int kNumRequestsInFetch = 1; + +// Number of icons in the fetch() call from the JavaScript file loaded by this +// test (chrome/test/data/background_fetch/background_fetch.js) +const int kNumIconsInFetch = 1; + +// Exponential bucket spacing for UKM event data. +const double kUkmEventDataBucketSpacing = 2.0; + // Implementation of a download system logger that provides the ability to wait // for certain events to happen, notably added and progressing downloads. class WaitableDownloadLoggerObserver : public download::Logger::Observer { @@ -188,8 +202,13 @@ ->GetForBrowserContext(profile) ->AddObserver(offline_content_provider_observer_.get()); + SetUpBrowser(browser()); + } + + void SetUpBrowser(Browser* browser) { + active_browser_ = browser; // Load the helper page that helps drive these tests. - ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(kHelperPage)); + ui_test_utils::NavigateToURL(browser, https_server_->GetURL(kHelperPage)); // Register the Service Worker that's required for Background Fetch. The // behaviour without an activated worker is covered by layout tests. @@ -198,11 +217,13 @@ ASSERT_TRUE(RunScript("RegisterServiceWorker()", &script_result)); ASSERT_EQ("ok - service worker registered", script_result); } + + test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); } void TearDownOnMainThread() override { OfflineContentAggregatorFactory::GetInstance() - ->GetForBrowserContext(browser()->profile()) + ->GetForBrowserContext(active_browser_->profile()) ->RemoveObserver(offline_content_provider_observer_.get()); download_service_->GetLogger()->RemoveObserver(download_observer_.get()); @@ -245,7 +266,7 @@ base::RunLoop run_loop; BackgroundFetchDelegateImpl* delegate = static_cast<BackgroundFetchDelegateImpl*>( - browser()->profile()->GetBackgroundFetchDelegate()); + active_browser_->profile()->GetBackgroundFetchDelegate()); DCHECK(delegate); delegate->GetVisualsForItem( offline_item_id, base::Bind(&BackgroundFetchBrowserTest::DidGetVisuals, @@ -268,7 +289,9 @@ // Runs the |script| in the current tab and writes the output to |*result|. bool RunScript(const std::string& script, std::string* result) { return content::ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), + active_browser_->tab_strip_model() + ->GetActiveWebContents() + ->GetMainFrame(), script, result); } @@ -329,6 +352,7 @@ std::unique_ptr<WaitableDownloadLoggerObserver> download_observer_; std::unique_ptr<OfflineContentProviderObserver> offline_content_provider_observer_; + std::unique_ptr<ukm::TestUkmRecorder> test_ukm_recorder_; private: // Callback for RunScriptAndWaitForOfflineItems(), called when the |items| @@ -350,6 +374,8 @@ std::unique_ptr<net::EmbeddedTestServer> https_server_; + Browser* active_browser_ = nullptr; + DISALLOW_COPY_AND_ASSIGN(BackgroundFetchBrowserTest); }; @@ -372,6 +398,35 @@ } IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, + RecordBackgroundFetchUkmEvent) { + // Start a Background Fetch for a single to-be-downloaded file and test that + // the expected UKM data has been recorded. + + ASSERT_NO_FATAL_FAILURE( + RunScriptFunction("StartSingleFileDownloadWithCorrectDownloadTotal()")); + + std::vector<const ukm::mojom::UkmEntry*> entries = + test_ukm_recorder_->GetEntriesByName( + ukm::builders::BackgroundFetch::kEntryName); + ASSERT_EQ(1u, entries.size()); + const auto* entry = entries[0]; + test_ukm_recorder_->ExpectEntryMetric( + entry, ukm::builders::BackgroundFetch::kHasTitleName, 1); + test_ukm_recorder_->ExpectEntryMetric( + entry, ukm::builders::BackgroundFetch::kNumIconsName, kNumIconsInFetch); + test_ukm_recorder_->ExpectEntryMetric( + entry, ukm::builders::BackgroundFetch::kDownloadTotalName, + ukm::GetExponentialBucketMin(kDownloadedResourceSizeInBytes, + kUkmEventDataBucketSpacing)); + test_ukm_recorder_->ExpectEntryMetric( + entry, ukm::builders::BackgroundFetch::kNumRequestsInFetchName, + ukm::GetExponentialBucketMin(kNumRequestsInFetch, + kUkmEventDataBucketSpacing)); + test_ukm_recorder_->ExpectEntryMetric( + entry, ukm::builders::BackgroundFetch::kDeniedDueToPermissionsName, 0); +} + +IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, OfflineItemCollection_SingleFileMetadata) { // Starts a Background Fetch for a single to-be-downloaded file and waits for // the fetch to be registered with the offline items collection. We then @@ -400,6 +455,7 @@ EXPECT_TRUE(offline_item.description.empty()); EXPECT_TRUE(offline_item.page_url.is_empty()); EXPECT_FALSE(offline_item.is_resumable); + EXPECT_FALSE(offline_item.is_off_the_record); } IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, @@ -522,6 +578,19 @@ } IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, + OfflineItemCollection_IncognitoPropagated) { + // Starts a fetch from an incognito profile, and makes sure that the + // OfflineItem has the appropriate fields set. + SetUpBrowser(CreateIncognitoBrowser()); + + std::vector<OfflineItem> items; + ASSERT_NO_FATAL_FAILURE( + RunScriptAndWaitForOfflineItems("StartSingleFileDownload()", &items)); + ASSERT_EQ(items.size(), 1u); + ASSERT_TRUE(items[0].is_off_the_record); +} + +IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, FetchesRunToCompletionAndUpdateTitle_Fetched) { ASSERT_NO_FATAL_FAILURE(RunScriptAndCheckResultingMessage( "RunFetchTillCompletion()", "backgroundfetchsuccess"));
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc index 5c628adc..6f46e2c 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -27,6 +27,7 @@ #include "content/public/browser/background_fetch_description.h" #include "content/public/browser/background_fetch_response.h" #include "content/public/browser/browser_thread.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" @@ -68,12 +69,14 @@ BackgroundFetchDelegateImpl::JobDetails::JobDetails( std::unique_ptr<content::BackgroundFetchDescription> fetch_description, - const std::string& provider_namespace) + const std::string& provider_namespace, + bool is_off_the_record) : cancelled(false), offline_item(offline_items_collection::ContentId( provider_namespace, fetch_description->job_unique_id)), fetch_description(std::move(fetch_description)) { + offline_item.is_off_the_record = is_off_the_record; UpdateOfflineItem(); } @@ -211,7 +214,8 @@ DCHECK(!job_details_map_.count(job_unique_id)); auto emplace_result = job_details_map_.emplace( job_unique_id, - JobDetails(std::move(fetch_description), provider_namespace_)); + JobDetails(std::move(fetch_description), provider_namespace_, + profile_->IsOffTheRecord())); const JobDetails& details = emplace_result.first->second; for (const auto& download_guid : details.fetch_description->current_guids) { @@ -508,9 +512,9 @@ const std::string unique_id = job_unique_id; Abort(job_unique_id); if (client()) { - client()->OnJobCancelled( - unique_id, - content::BackgroundFetchReasonToAbort::TOTAL_DOWNLOAD_SIZE_EXCEEDED); + client()->OnJobCancelled(unique_id, + blink::mojom::BackgroundFetchFailureReason:: + TOTAL_DOWNLOAD_SIZE_EXCEEDED); } } @@ -520,7 +524,7 @@ if (client()) { client()->OnJobCancelled( - id.id, content::BackgroundFetchReasonToAbort::CANCELLED_FROM_UI); + id.id, blink::mojom::BackgroundFetchFailureReason::CANCELLED_FROM_UI); } } @@ -532,7 +536,7 @@ JobDetails& job_details = job_details_iter->second; for (auto& download_guid : job_details.current_download_guids) - download_service_->PauseDownload(download_guid); + GetDownloadService()->PauseDownload(download_guid); // TODO(delphick): Mark overall download job as paused so that future // downloads are not started until resume. (Initially not a worry because only
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h index c1356e1..299470fa 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -116,7 +116,8 @@ JobDetails(JobDetails&&); JobDetails( std::unique_ptr<content::BackgroundFetchDescription> fetch_description, - const std::string& provider_namespace); + const std::string& provider_namespace, + bool is_off_the_record); ~JobDetails(); void UpdateOfflineItem();
diff --git a/chrome/browser/bookmarks/DEPS b/chrome/browser/bookmarks/DEPS index b70b5d4..9620199 100644 --- a/chrome/browser/bookmarks/DEPS +++ b/chrome/browser/bookmarks/DEPS
@@ -1,12 +1,9 @@ include_rules = [ - "+chrome/browser", - "+chrome/common", - "+chrome/utility", "+google_apis/gaia", ] specific_include_rules = { '.*test\.cc': [ - "+chrome/test", + "+chrome/utility", ], }
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 9b0bb77..c04570dab 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -399,6 +399,9 @@ <include name="IDR_POLICY_BASE_JS" file="resources\policy_base.js" type="BINDATA" compress="gzip" /> <include name="IDR_POLICY_JS" file="resources\policy.js" type="BINDATA" compress="gzip" /> <include name="IDR_POLICY_COMMON_CSS" file="resources\policy_common.css" type="BINDATA" compress="gzip" /> + <include name="IDR_MANAGEMENT_HTML" file="resources\management.html" allowexternalscript="true" type="BINDATA" compress="gzip" /> + <include name="IDR_MANAGEMENT_JS" file="resources\management.js" type="BINDATA" compress="gzip" /> + <include name="IDR_MANAGEMENT_CSS" file="resources\management.css" type="BINDATA" compress="gzip" /> <if expr="not is_android"> <include name="IDR_POLICY_TOOL_HTML" file="resources\policy_tool.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_POLICY_TOOL_CSS" file="resources\policy_tool.css" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc index 6266ecb..254a53d4 100644 --- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc +++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/feature_list.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/path_service.h" @@ -55,7 +54,6 @@ #include "content/public/test/browsing_data_remover_test_util.h" #include "content/public/test/download_test_observer.h" #include "content/public/test/simple_url_loader_test_helper.h" -#include "media/base/media_switches.h" #include "media/mojo/services/video_decode_perf_history.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -66,12 +64,6 @@ #include "third_party/leveldatabase/env_chromium.h" #include "third_party/re2/src/re2/re2.h" -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) -#include "base/memory/scoped_refptr.h" -#include "chrome/browser/browsing_data/browsing_data_media_license_helper.h" -#include "chrome/browser/media/library_cdm_test_helper.h" -#endif - using content::BrowserThread; using content::BrowsingDataFilterBuilder; @@ -248,7 +240,14 @@ class BrowsingDataRemoverBrowserTest : public InProcessBrowserTest { public: - BrowsingDataRemoverBrowserTest() {} + BrowsingDataRemoverBrowserTest() { + feature_list_.InitWithFeatures( + {browsing_data::features::kRemoveNavigationHistory, + // Ensure that MojoSessionStorage is enabled because the old + // SessionStorage implementation causes flaky tests. + features::kMojoSessionStorage}, + {}); + } void SetUpOnMainThread() override { base::FilePath path; @@ -300,21 +299,15 @@ } void RemoveAndWait(int remove_mask) { - RemoveAndWait(remove_mask, base::Time(), base::Time::Max()); + RemoveAndWait(remove_mask, base::Time()); } void RemoveAndWait(int remove_mask, base::Time delete_begin) { - RemoveAndWait(remove_mask, delete_begin, base::Time::Max()); - } - - void RemoveAndWait(int remove_mask, - base::Time delete_begin, - base::Time delete_end) { content::BrowsingDataRemover* remover = content::BrowserContext::GetBrowsingDataRemover(browser()->profile()); content::BrowsingDataRemoverCompletionObserver completion_observer(remover); remover->RemoveAndReply( - delete_begin, delete_end, remove_mask, + delete_begin, base::Time::Max(), remove_mask, content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, &completion_observer); completion_observer.BlockUntilCompletion(); @@ -399,27 +392,6 @@ return count; } -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) - int GetMediaLicenseCount() { - base::RunLoop run_loop; - int count = -1; - content::StoragePartition* partition = - content::BrowserContext::GetDefaultStoragePartition( - browser()->profile()); - scoped_refptr<BrowsingDataMediaLicenseHelper> media_license_helper = - BrowsingDataMediaLicenseHelper::Create( - partition->GetFileSystemContext()); - media_license_helper->StartFetching(base::BindLambdaForTesting( - [&](const std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>& - licenses) { - count = licenses.size(); - run_loop.Quit(); - })); - run_loop.Run(); - return count; - } -#endif - inline void ExpectCookieTreeModelCount(int expected) { std::unique_ptr<CookiesTreeModel> model = GetCookiesTreeModel(); EXPECT_EQ(expected, GetCookiesTreeModelCount(model->GetRoot())) @@ -494,25 +466,6 @@ return model; } - void SetUpCommandLine(base::CommandLine* command_line) override { - InProcessBrowserTest::SetUpCommandLine(command_line); - - std::vector<base::Feature> enabled_features = { - browsing_data::features::kRemoveNavigationHistory, - // Ensure that MojoSessionStorage is enabled because the old - // SessionStorage implementation causes flaky tests. - features::kMojoSessionStorage}; - -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) - // Testing MediaLicenses requires additional command line parameters as - // it uses the External Clear Key CDM. - RegisterClearKeyCdm(command_line); - enabled_features.push_back(media::kExternalClearKeyForTesting); -#endif - - feature_list_.InitWithFeatures(enabled_features, {}); - } - base::test::ScopedFeatureList feature_list_; }; @@ -840,119 +793,6 @@ TestEmptySiteData("IndexedDb", GetParam()); } -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) -// Test Media Licenses by creating one and checking it is counted by the -// cookie counter. Then delete it and check that the cookie counter is back -// to zero. -IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, MediaLicenseDeletion) { - const std::string kMediaLicenseType = "MediaLicense"; - const base::Time delete_begin = GetParam(); - - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(0, GetMediaLicenseCount()); - GURL url = - embedded_test_server()->GetURL("/browsing_data/media_license.html"); - ui_test_utils::NavigateToURL(browser(), url); - - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(0, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(0); - EXPECT_FALSE(HasDataForType(kMediaLicenseType)); - - SetDataForType(kMediaLicenseType); - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(1, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(1); - EXPECT_TRUE(HasDataForType(kMediaLicenseType)); - - // Try to remove the Media Licenses using a time frame up until an hour ago, - // which should not remove the recently created Media License. - RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, - delete_begin, kLastHour); - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(1, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(1); - EXPECT_TRUE(HasDataForType(kMediaLicenseType)); - - // Now try with a time range that includes the current time, which should - // clear the Media License created for this test. - RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, - delete_begin, base::Time::Max()); - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(0, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(0); - EXPECT_FALSE(HasDataForType(kMediaLicenseType)); -} - -// Create and save a media license (which will be deleted in the following -// test). -IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, - PRE_MediaLicenseTimedDeletion) { - const std::string kMediaLicenseType = "MediaLicense"; - - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(0, GetMediaLicenseCount()); - - GURL url = - embedded_test_server()->GetURL("/browsing_data/media_license.html"); - ui_test_utils::NavigateToURL(browser(), url); - - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(0, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(0); - EXPECT_FALSE(HasDataForType(kMediaLicenseType)); - - SetDataForType(kMediaLicenseType); - EXPECT_EQ(0, GetSiteDataCount()); - EXPECT_EQ(1, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(1); - EXPECT_TRUE(HasDataForType(kMediaLicenseType)); -} - -// Create and save a second media license, and then verify that timed deletion -// selects the correct license to delete. -IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, - MediaLicenseTimedDeletion) { - const std::string kMediaLicenseType = "MediaLicense"; - - // As the PRE_ test should run first, there should be one media license - // still stored. The time of it's creation should be sometime before - // this test starts. We can't see the license, since it's stored for a - // different origin (but we can delete it). - const base::Time start = base::Time::Now(); - EXPECT_EQ(1, GetMediaLicenseCount()); - - GURL url = - embedded_test_server()->GetURL("/browsing_data/media_license.html"); - ui_test_utils::NavigateToURL(browser(), url); - - // This test should use a different domain than the PRE_ test, so there - // should be no existing media license for it. - EXPECT_FALSE(HasDataForType(kMediaLicenseType)); - - // Create a media license for this domain. - SetDataForType(kMediaLicenseType); - EXPECT_EQ(2, GetMediaLicenseCount()); - EXPECT_TRUE(HasDataForType(kMediaLicenseType)); - - // Try to remove the Media Licenses using a time frame up until the start - // of this test, which should only delete the media license created by - // the PRE_ test. - RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, - base::Time(), start); - EXPECT_EQ(1, GetMediaLicenseCount()); - EXPECT_TRUE(HasDataForType(kMediaLicenseType)); - - // Now try with a time range that includes the current time, which should - // clear the media license created as part of this test. - RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, - base::Time(), base::Time::Now()); - EXPECT_EQ(0, GetMediaLicenseCount()); - ExpectCookieTreeModelCount(0); - EXPECT_FALSE(HasDataForType(kMediaLicenseType)); -} -#endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) - const std::vector<std::string> kStorageTypes{ "Cookie", "LocalStorage", "FileSystem", "SessionStorage", "IndexedDb", "WebSql", "ServiceWorker", "CacheStorage",
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index a62ec1e..0b4c3fb 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -763,7 +763,7 @@ // profiler. std::unique_ptr<ThreadProfiler> CreateAndStartBrowserMainThreadProfiler() { ThreadProfiler::SetBrowserProcessReceiverCallback(base::BindRepeating( - &metrics::CallStackProfileMetricsProvider::ReceiveCompletedProfile)); + &metrics::CallStackProfileMetricsProvider::ReceiveProfile)); return ThreadProfiler::CreateAndStartOnMainThread(); }
diff --git a/chrome/browser/chrome_browser_main_mac.mm b/chrome/browser/chrome_browser_main_mac.mm index 5b16b3e..616f8f82 100644 --- a/chrome/browser/chrome_browser_main_mac.mm +++ b/chrome/browser/chrome_browser_main_mac.mm
@@ -34,6 +34,7 @@ #include "components/metrics/metrics_service.h" #include "content/public/common/main_function_params.h" #include "content/public/common/result_codes.h" +#include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_handle.h" @@ -87,6 +88,15 @@ singleton_command_line->AppendSwitch(switches::kNoStartupWindow); } + // If ui_task is not NULL, the app is actually a browser_test. + if (!parameters().ui_task) { + // The browser process only wants to support the language Cocoa will use, + // so force the app locale to be overriden with that value. This must + // happen before the ResourceBundle is loaded, which happens in + // ChromeBrowserMainParts::PreEarlyInitialization(). + l10n_util::OverrideLocaleWithCocoaLocale(); + } + return ChromeBrowserMainPartsPosix::PreEarlyInitialization(); }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 728f9f2b..223472f 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -118,6 +118,7 @@ #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" #include "chrome/browser/tab_contents/tab_util.h" +#include "chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.h" #include "chrome/browser/tracing/chrome_tracing_delegate.h" #include "chrome/browser/translate/translate_service.h" #include "chrome/browser/ui/blocked_content/blocked_window_params.h" @@ -1019,8 +1020,7 @@ #endif gpu_binder_registry_.AddInterface( - base::Bind(&metrics::CallStackProfileCollector::Create, - metrics::CallStackProfileParams::GPU_PROCESS)); + base::Bind(&metrics::CallStackProfileCollector::Create)); } ChromeContentBrowserClient::~ChromeContentBrowserClient() { @@ -1135,6 +1135,7 @@ main_parts->AddParts(new ChromeBrowserMainExtraPartsResourceCoordinator); main_parts->AddParts(new ChromeBrowserMainExtraPartsProfiling); + main_parts->AddParts(new ChromeBrowserMainExtraPartsTracing); chrome::AddMetricsExtraParts(main_parts); @@ -3487,8 +3488,7 @@ g_browser_process->rappor_service()), ui_task_runner); registry->AddInterface( - base::BindRepeating(&metrics::CallStackProfileCollector::Create, - metrics::CallStackProfileParams::RENDERER_PROCESS)); + base::BindRepeating(&metrics::CallStackProfileCollector::Create)); if (NetBenchmarking::CheckBenchmarkingEnabled()) { Profile* profile =
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index c686466..0bcd2fb 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1093,6 +1093,9 @@ "login/screens/arc_terms_of_service_screen.h", "login/screens/arc_terms_of_service_screen_view.h", "login/screens/arc_terms_of_service_screen_view_observer.h", + "login/screens/assistant_optin_flow_screen.cc", + "login/screens/assistant_optin_flow_screen.h", + "login/screens/assistant_optin_flow_screen_view.h", "login/screens/base_screen.cc", "login/screens/base_screen.h", "login/screens/base_screen_delegate.h", @@ -2331,6 +2334,7 @@ "//components/drive/chromeos/file_cache_unittest.cc", "//components/drive/directory_loader_unittest.cc", "//components/drive/drive_file_util_unittest.cc", + "//components/drive/drive_notification_manager_unittest.cc", "//components/drive/drive_operation_queue_unittest.cc", "//components/drive/fake_file_system_unittest.cc", "//components/drive/file_change_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/auth/OWNERS b/chrome/browser/chromeos/arc/auth/OWNERS new file mode 100644 index 0000000..eb939e5 --- /dev/null +++ b/chrome/browser/chromeos/arc/auth/OWNERS
@@ -0,0 +1 @@ +khmel@chromium.org
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc index 72c072c..23fb0176 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
@@ -131,8 +131,7 @@ const std::string& auth_info, const std::string& account_name, mojom::ChromeAccountType account_type, - bool is_managed, - bool is_secondary_account) { + bool is_managed) { mojom::AccountInfoPtr account_info = mojom::AccountInfo::New(); account_info->account_name = account_name; if (account_type == mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT) { @@ -145,7 +144,6 @@ } account_info->account_type = account_type; account_info->is_managed = is_managed; - account_info->is_secondary_account = is_secondary_account; return account_info; } @@ -192,19 +190,6 @@ arc_bridge_service_->auth()->SetHost(nullptr); } -void ArcAuthService::OnConnectionReady() { - if (chromeos::switches::IsAccountManagerEnabled()) { - // The Mojo |OnSecondaryAccountUpserted| API is guaranteed to be called at - // least once for every account at startup. We need to get the list of - // accounts from |AccountManager|, just to be safe, since we may have missed - // the initial |AccountManager::Observer| notifications. We can safely call - // the Mojo |OnSecondaryAccountUpserted| API twice for every account since - // it is guaranteed to be idempotent. - account_manager_->GetAccounts(base::BindOnce( - &ArcAuthService::GetAccountsCallback, weak_ptr_factory_.GetWeakPtr())); - } -} - void ArcAuthService::OnConnectionClosed() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); pending_token_requests_.clear(); @@ -301,28 +286,9 @@ instance->OnAccountInfoReady(std::move(account_info), status); } -void ArcAuthService::RequestAccountInfo( - bool initial_signin, - const base::Optional<std::string>& account_name) { +void ArcAuthService::RequestAccountInfo(bool initial_signin) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Check if |account_name| points to a Secondary Account. - if (account_name.has_value()) { - DCHECK(!account_name.value().empty()); - - const std::string& gaia_id = - account_tracker_service_->FindAccountInfoByEmail(account_name.value()) - .gaia; - DCHECK(!gaia_id.empty()); - - if (!IsDeviceAccount(chromeos::AccountManager::AccountKey{ - gaia_id, - chromeos::account_manager::AccountType::ACCOUNT_TYPE_GAIA})) { - FetchSecondaryAccountInfo(account_name.value()); - return; - } - } - FetchDeviceAccountInfo(initial_signin); } @@ -334,8 +300,7 @@ CreateAccountInfo(false /* is_enforced */, std::string() /* auth_info */, std::string() /* auth_name */, account_type, - policy_util::IsAccountManaged(profile_), - false /* is_secondary_account */), + policy_util::IsAccountManaged(profile_)), mojom::ArcSignInStatus::SUCCESS); return; } @@ -358,8 +323,7 @@ OnAccountInfoReady( CreateAccountInfo(true /* is_enforced */, std::string() /* auth_info */, std::string() /* auth_name */, account_type, - true /* is_managed */, - false /* is_secondary_account */), + true /* is_managed */), mojom::ArcSignInStatus::SUCCESS); return; } @@ -387,42 +351,16 @@ const chromeos::AccountManager::AccountKey& account_key) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // We send only Secondary Account update notifications to ARC++. ARC++ has a - // polling mechanism for the Device Account (See the Mojo APIs - // |RequestAccountInfo| and |OnAccountInfoReady|). - if (IsDeviceAccount(account_key)) { - return; - } - - auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->auth(), - OnSecondaryAccountUpserted); - if (!instance) { - LOG(ERROR) << "Auth instance is not available."; - return; - } - - const std::string& account_name = - account_mapper_util_.AccountKeyToGaiaAccountInfo(account_key).email; - DCHECK(!account_name.empty()); - instance->OnSecondaryAccountUpserted(account_name); + // TODO(sinhak): Implement sending notifications to ARC++. + NOTREACHED(); } void ArcAuthService::OnAccountRemoved( const chromeos::AccountManager::AccountKey& account_key) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DCHECK(!IsDeviceAccount(account_key)); - auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->auth(), - OnSecondaryAccountRemoved); - if (!instance) { - LOG(ERROR) << "Auth instance is not available."; - return; - } - - const std::string& account_name = - account_mapper_util_.AccountKeyToGaiaAccountInfo(account_key).email; - DCHECK(!account_name.empty()); - instance->OnSecondaryAccountRemoved(account_name); + // TODO(sinhak): Implement sending notifications to ARC++. + NOTREACHED(); } void ArcAuthService::OnActiveDirectoryEnrollmentTokenFetched( @@ -445,8 +383,7 @@ CreateAccountInfo(true /* is_enforced */, enrollment_token, std::string() /* account_name */, mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT, - true /* is_managed */, - false /* is_secondary_account */), + true /* is_managed */), mojom::ArcSignInStatus::SUCCESS); break; } @@ -480,8 +417,7 @@ OnAccountInfoReady( CreateAccountInfo(!IsArcOptInVerificationDisabled(), auth_code, full_account_id, GetAccountType(profile_), - policy_util::IsAccountManaged(profile_), - false /* is_secondary_account */), + policy_util::IsAccountManaged(profile_)), mojom::ArcSignInStatus::SUCCESS); } else if (chromeos::DemoSession::Get() && chromeos::DemoSession::Get()->started()) { @@ -491,8 +427,7 @@ CreateAccountInfo(true /* is_enforced */, std::string() /* auth_info */, std::string() /* auth_name */, mojom::ChromeAccountType::OFFLINE_DEMO_ACCOUNT, - true /* is_managed */, - false /* is_secondary_account */), + true /* is_managed */), mojom::ArcSignInStatus::SUCCESS); } else { // Send error to ARC. @@ -530,8 +465,7 @@ OnAccountInfoReady( CreateAccountInfo(true /* is_enforced */, auth_code, account_name, mojom::ChromeAccountType::USER_ACCOUNT, - false /* is_managed */, - true /* is_secondary_account */), + false /* is_managed */), mojom::ArcSignInStatus::SUCCESS); } else { OnAccountInfoReady(
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.h b/chrome/browser/chromeos/arc/auth/arc_auth_service.h index e59e814..e65d309 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service.h +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
@@ -56,7 +56,6 @@ static const char kArcServiceName[]; // ConnectionObserver<mojom::AuthInstance>: - void OnConnectionReady() override; void OnConnectionClosed() override; // mojom::AuthHost: @@ -64,9 +63,7 @@ bool initial_signin) override; void OnSignInCompleteDeprecated() override; void OnSignInFailedDeprecated(mojom::ArcSignInStatus reason) override; - void RequestAccountInfo( - bool initial_signin, - const base::Optional<std::string>& account_name) override; + void RequestAccountInfo(bool initial_signin) override; void ReportMetrics(mojom::MetricsType metrics_type, int32_t value) override; void ReportAccountCheckStatus(mojom::AccountCheckStatus status) override; void ReportSupervisionChangeStatus(
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc index 6dc5137..62e8f02 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -99,32 +99,11 @@ void RequestAccountInfo(base::OnceClosure done_closure) { done_closure_ = std::move(done_closure); - host_->RequestAccountInfo(true /* initial_signin */, base::nullopt); - } - - void RequestSecondaryAccountInfo(base::OnceClosure done_closure, - const std::string& account_name) { - done_closure_ = std::move(done_closure); - host_->RequestAccountInfo(false /* initial_signin */, account_name); - } - - void OnSecondaryAccountUpserted(const std::string& account_name) override { - ++num_account_upserted_calls_; - upserted_account_name_ = account_name; - } - - void OnSecondaryAccountRemoved(const std::string& account_name) override { - ++num_account_removed_calls_; - removed_account_name_ = account_name; + host_->RequestAccountInfo(true /* initial_signin */); } mojom::AccountInfo* account_info() { return account_info_.get(); } - int num_account_upserted_calls_ = 0; - std::string upserted_account_name_; - int num_account_removed_calls_ = 0; - std::string removed_account_name_; - private: mojom::AuthHostPtr host_; mojom::AccountInfoPtr account_info_; @@ -336,83 +315,6 @@ auth_instance().account_info()->account_type); EXPECT_FALSE(auth_instance().account_info()->enrollment_token); EXPECT_FALSE(auth_instance().account_info()->is_managed); - EXPECT_FALSE(auth_instance().account_info()->is_secondary_account); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, - SecondaryAccountUpsertsArePropagated) { - const std::string gaia_id = "123999"; - const std::string email = "email.111@gmail.com"; - - SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - SeedAccountInfo(gaia_id, email); - - EXPECT_EQ(0, auth_instance().num_account_upserted_calls_); - - chromeos::AccountManager::AccountKey account_key{ - gaia_id, chromeos::account_manager::AccountType::ACCOUNT_TYPE_GAIA}; - auth_service().OnTokenUpserted(account_key); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(1, auth_instance().num_account_upserted_calls_); - EXPECT_EQ(email, auth_instance().upserted_account_name_); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, - SecondaryAccountRemovalsArePropagated) { - const std::string gaia_id = "123999"; - const std::string email = "email.111@gmail.com"; - - SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - SeedAccountInfo(gaia_id, email); - - EXPECT_EQ(0, auth_instance().num_account_removed_calls_); - - chromeos::AccountManager::AccountKey account_key{ - gaia_id, chromeos::account_manager::AccountType::ACCOUNT_TYPE_GAIA}; - auth_service().OnAccountRemoved(account_key); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(1, auth_instance().num_account_removed_calls_); - EXPECT_EQ(email, auth_instance().removed_account_name_); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, - DeviceAccountUpsertsAreNotPropagated) { - SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - - EXPECT_EQ(0, auth_instance().num_account_upserted_calls_); - - chromeos::AccountManager::AccountKey account_key{ - kFakeGaiaId, chromeos::account_manager::AccountType::ACCOUNT_TYPE_GAIA}; - auth_service().OnTokenUpserted(account_key); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(0, auth_instance().num_account_upserted_calls_); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, FetchSecondaryAccountInfoSucceeds) { - const std::string gaia_id = "123999"; - const std::string email = "email.111@gmail.com"; - - SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - SeedAccountInfo(gaia_id, email); - test_url_loader_factory().AddResponse( - arc::kAuthTokenExchangeEndPoint, - R"({ "token" : ")" + std::string(kFakeAuthCode) + R"(" })"); - - base::RunLoop run_loop; - auth_instance().RequestSecondaryAccountInfo(run_loop.QuitClosure(), email); - run_loop.Run(); - - ASSERT_TRUE(auth_instance().account_info()); - EXPECT_EQ(email, auth_instance().account_info()->account_name.value()); - EXPECT_EQ(kFakeAuthCode, auth_instance().account_info()->auth_code.value()); - EXPECT_EQ(mojom::ChromeAccountType::USER_ACCOUNT, - auth_instance().account_info()->account_type); - EXPECT_FALSE(auth_instance().account_info()->enrollment_token); - EXPECT_FALSE(auth_instance().account_info()->is_managed); - EXPECT_TRUE(auth_instance().account_info()->is_secondary_account); } class ArcRobotAccountAuthServiceTest : public ArcAuthServiceTest {
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc index 52bbcc9..35b7242 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc
@@ -131,6 +131,7 @@ void OnTabletModeToggled(bool enabled) override { owner_->SetArcIMEAllowed(enabled); + owner_->NotifyInputMethodManagerObservers(enabled); } private: @@ -300,6 +301,19 @@ return chromeos::extension_ime_util::IsArcIME(id); }); + // TODO(yhanada|yusukes): Instead of observing ImeMenuListChanged(), it's + // probably better to just observe the pref (and not disabling ones still + // in the prefs.) See also the comment below in the second for-loop. + std::set<std::string> active_ime_ids_on_prefs; + { + const std::string active_ime_ids = + profile_->GetPrefs()->GetString(prefs::kLanguageEnabledImes); + std::vector<base::StringPiece> active_ime_list = base::SplitStringPiece( + active_ime_ids, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + for (const auto& id : active_ime_list) + active_ime_ids_on_prefs.insert(id.as_string()); + } + for (const auto& id : new_arc_active_ime_ids) { // Enable the IME which is not currently enabled. if (!active_arc_ime_ids_.count(id)) @@ -307,9 +321,22 @@ } for (const auto& id : active_arc_ime_ids_) { - // Disable the IME which is currently enabled. - if (!new_arc_active_ime_ids.count(id)) + if (!new_arc_active_ime_ids.count(id) && + !active_ime_ids_on_prefs.count(id)) { + // This path is taken in the following two cases: + // 1) The device is in tablet mode, and the user disabled the IME via + // chrome://settings. + // 2) The device was just switched to laptop mode, and this service + // disallowed Android IMEs. + // In the former case, |active_ime_ids_on_prefs| doesn't have the IME, + // but in the latter case, the set still has it. Here, disable the IME + // only for the former case so that the temporary deactivation of the + // IME on laptop mode wouldn't be propagated to the container. Otherwise, + // the IME confirmation dialog will be shown again next time when you + // use the IME in tablet mode. + // TODO(yhanada|yusukes): Only observe the prefs and remove the hack. EnableIme(id, false /* enable */); + } } active_arc_ime_ids_.swap(new_arc_active_ime_ids); } @@ -425,6 +452,7 @@ installed_extensions.end()); } + std::vector<std::string> ime_ids_to_enable; if (allowed) { if (!allowed_method_ids_set.empty()) { // Some IMEs are not allowed now. Add ARC IMEs to @@ -435,7 +463,15 @@ } } - // TODO(yhanada): Re-enable ARC IMEs that was enabled before disallowed. + // Re-enable ARC IMEs that were auto-disabled when toggling to laptop mode. + const std::string active_ime_ids = + profile_->GetPrefs()->GetString(prefs::kLanguageEnabledImes); + std::vector<base::StringPiece> active_ime_list = base::SplitStringPiece( + active_ime_ids, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + for (const auto& id : active_ime_list) { + if (chromeos::extension_ime_util::IsArcIME(id.as_string())) + ime_ids_to_enable.push_back(id.as_string()); + } } else { // Disallow Arc IMEs. if (allowed_method_ids_set.empty()) { @@ -458,6 +494,30 @@ std::vector<std::string>(allowed_method_ids_set.begin(), allowed_method_ids_set.end()), false /* enable_allowed_input_methods */); + + // This has to be called after SetAllowedInputMethods() because enabling an + // IME that is disallowed always fails. + for (const auto& id : ime_ids_to_enable) + manager->GetActiveIMEState()->EnableInputMethod(id); +} + +void ArcInputMethodManagerService::NotifyInputMethodManagerObservers( + bool is_tablet_mode) { + // Togging the mode may enable or disable all the ARC IMEs. To dynamically + // reflect the potential state changes to chrome://settings, notify the + // manager's observers here. + // TODO(yusukes): This is a temporary workaround for supporting ARC IMEs + // and supports neither Chrome OS extensions nor state changes enforced by + // the policy. The better way to do this is to add a dedicated event to + // language_settings_private.idl and send the new event to the JS side + // instead. + auto* manager = chromeos::input_method::InputMethodManager::Get(); + if (!manager) + return; + if (is_tablet_mode) + manager->NotifyInputMethodExtensionRemoved(proxy_ime_extension_id_); + else + manager->NotifyInputMethodExtensionAdded(proxy_ime_extension_id_); } } // namespace arc
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h index 3477cfa..4192072 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h
@@ -84,6 +84,9 @@ // Calls InputMethodManager.SetAllowedInputMethods according to the argument. void SetArcIMEAllowed(bool allowed); + // Notifies InputMethodManager's observers of possible ARC IME state changes. + void NotifyInputMethodManagerObservers(bool is_tablet_mode); + Profile* const profile_; std::unique_ptr<ArcInputMethodManagerBridge> imm_bridge_;
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index fc79358..3e2bb22 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -64,6 +64,12 @@ removed_input_method_extensions_.push_back(extension_id); } + bool EnableInputMethod( + const std::string& new_active_input_method_id) override { + enabled_input_methods_.push_back(new_active_input_method_id); + return true; + } + void AddActiveInputMethodId(const std::string& ime_id) { if (!std::count(active_input_method_ids_.begin(), active_input_method_ids_.end(), ime_id)) { @@ -109,6 +115,7 @@ std::vector<std::tuple<std::string, im::InputMethodDescriptors>> added_input_method_extensions_; std::vector<std::string> removed_input_method_extensions_; + std::vector<std::string> enabled_input_methods_; protected: friend base::RefCounted<InputMethodManager::State>; @@ -266,12 +273,49 @@ std::get<std::string>(bridge()->enable_ime_calls_[1])); EXPECT_FALSE(std::get<bool>(bridge()->enable_ime_calls_[1])); - // EnableIme is not called when non ARC IME is disable. + // EnableIme is not called when non ARC IME is disabled. imm()->state()->RemoveActiveInputMethodId(extension_ime_id); service()->ImeMenuListChanged(); EXPECT_EQ(2u, bridge()->enable_ime_calls_.size()); } +TEST_F(ArcInputMethodManagerServiceTest, EnableIme_WithPrefs) { + namespace ceiu = chromeos::extension_ime_util; + using crx_file::id_util::GenerateId; + + base::test::ScopedFeatureList feature; + feature.InitAndEnableFeature(kEnableInputMethodFeature); + ToggleTabletMode(true); + + ASSERT_EQ(0u, bridge()->enable_ime_calls_.size()); + + const std::string component_extension_ime_id = + ceiu::GetComponentInputMethodID( + GenerateId("test.component.extension.ime"), "us"); + const std::string arc_ime_id = + ceiu::GetArcInputMethodID(GenerateId("test.arc.ime"), "us"); + + imm()->state()->AddActiveInputMethodId(component_extension_ime_id); + service()->ImeMenuListChanged(); + EXPECT_EQ(0u, bridge()->enable_ime_calls_.size()); + + imm()->state()->AddActiveInputMethodId(arc_ime_id); + service()->ImeMenuListChanged(); + ASSERT_EQ(1u, bridge()->enable_ime_calls_.size()); + + // Test the case where |arc_ime_id| is temporarily disallowed because of the + // toggling to the laptop mode. In that case, the prefs still have the IME's + // ID. + profile()->GetPrefs()->SetString( + prefs::kLanguageEnabledImes, + base::StringPrintf("%s,%s", component_extension_ime_id.c_str(), + arc_ime_id.c_str())); + imm()->state()->RemoveActiveInputMethodId(arc_ime_id); + service()->ImeMenuListChanged(); + // Verify that EnableIme(id, false) is NOT called. + EXPECT_EQ(1u, bridge()->enable_ime_calls_.size()); // still 1u, not 2u. +} + TEST_F(ArcInputMethodManagerServiceTest, SwitchImeTo) { namespace ceiu = chromeos::extension_ime_util; using crx_file::id_util::GenerateId; @@ -476,6 +520,14 @@ imm()->state()->AddActiveInputMethodId(component_extension_ime_id); imm()->state()->AddActiveInputMethodId(arc_ime_id); + // Update the prefs because the testee checks them. Note that toggling the + // mode never changes the prefs. + profile()->GetPrefs()->SetString( + prefs::kLanguageEnabledImes, + base::StringPrintf("%s,%s,%s", extension_ime_id.c_str(), + component_extension_ime_id.c_str(), + arc_ime_id.c_str())); + // All IMEs are allowed to use. EXPECT_TRUE(imm()->state()->IsInputMethodAllowed(extension_ime_id)); EXPECT_TRUE(imm()->state()->IsInputMethodAllowed(component_extension_ime_id)); @@ -490,6 +542,7 @@ EXPECT_FALSE(imm()->state()->IsInputMethodAllowed(arc_ime_id)); // Back to tablet mode. + EXPECT_TRUE(imm()->state()->enabled_input_methods_.empty()); ToggleTabletMode(true); // All IMEs are allowed to use. @@ -497,6 +550,10 @@ EXPECT_TRUE(imm()->state()->IsInputMethodAllowed(component_extension_ime_id)); EXPECT_TRUE(imm()->state()->IsInputMethodAllowed(arc_ime_id)); + // Verify they appear in the CrOS IME menu. + ASSERT_EQ(1u, imm()->state()->enabled_input_methods_.size()); + EXPECT_EQ(arc_ime_id, imm()->state()->enabled_input_methods_[0]); + // Do the same tests again, but with |extension_ime_id| disabled. imm()->state()->SetAllowedInputMethods( {component_extension_ime_id, arc_ime_id},
diff --git a/chrome/browser/chromeos/arc/process/OWNERS b/chrome/browser/chromeos/arc/process/OWNERS new file mode 100644 index 0000000..7de48dc --- /dev/null +++ b/chrome/browser/chromeos/arc/process/OWNERS
@@ -0,0 +1 @@ +cmtm@chromium.org
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index 202b8bb6..963aced4 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -1200,6 +1200,7 @@ RestartCrostiniCallback callback, RestartObserver* observer) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(!profile->IsOffTheRecord()); return CrostiniRestarterServiceFactory::GetForProfile(profile)->Register( profile, std::move(vm_name), std::move(container_name), std::move(callback), observer);
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.cc b/chrome/browser/chromeos/crostini/crostini_pref_names.cc index 4425fa4..9d73792 100644 --- a/chrome/browser/chromeos/crostini/crostini_pref_names.cc +++ b/chrome/browser/chromeos/crostini/crostini_pref_names.cc
@@ -14,11 +14,15 @@ const char kCrostiniEnabled[] = "crostini.enabled"; const char kCrostiniRegistry[] = "crostini.registry"; const char kCrostiniMimeTypes[] = "crostini.mime_types"; +// A boolean preference representing a user level enterprise policy to enable +// Crostini use. +const char kUserCrostiniAllowedByPolicy[] = "crostini.user_allowed_by_policy"; void RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(kCrostiniEnabled, false); registry->RegisterDictionaryPref(kCrostiniRegistry); registry->RegisterDictionaryPref(kCrostiniMimeTypes); + registry->RegisterBooleanPref(kUserCrostiniAllowedByPolicy, true); } } // namespace prefs
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.h b/chrome/browser/chromeos/crostini/crostini_pref_names.h index 1a42eebd..8749cdf 100644 --- a/chrome/browser/chromeos/crostini/crostini_pref_names.h +++ b/chrome/browser/chromeos/crostini/crostini_pref_names.h
@@ -13,6 +13,7 @@ extern const char kCrostiniEnabled[]; extern const char kCrostiniRegistry[]; extern const char kCrostiniMimeTypes[]; +extern const char kUserCrostiniAllowedByPolicy[]; void RegisterProfilePrefs(PrefRegistrySimple* registry);
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc index a633d709..659f95a 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.cc +++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/chromeos/crostini/crostini_registry_service.h" #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/virtual_machines/virtual_machines_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/crostini/crostini_app_icon.h" @@ -368,3 +369,14 @@ } return app_name.substr(strlen(kCrostiniAppNamePrefix)); } + +bool IsUnaffiliatedCrostiniAllowedByPolicy() { + bool unaffiliated_crostini_allowed; + if (chromeos::CrosSettings::Get()->GetBoolean( + chromeos::kDeviceUnaffiliatedCrostiniAllowed, + &unaffiliated_crostini_allowed)) { + return unaffiliated_crostini_allowed; + } + // If device policy is not set, allow Crostini. + return true; +}
diff --git a/chrome/browser/chromeos/crostini/crostini_util.h b/chrome/browser/chromeos/crostini/crostini_util.h index de6e12d0be..d743a436 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.h +++ b/chrome/browser/chromeos/crostini/crostini_util.h
@@ -108,4 +108,8 @@ "https://storage.googleapis.com/cros-containers"; constexpr char kCrostiniDefaultImageAlias[] = "debian/stretch"; +// Whether running Crostini is allowed for unaffiliated users per enterprise +// policy. +bool IsUnaffiliatedCrostiniAllowedByPolicy(); + #endif // CHROME_BROWSER_CHROMEOS_CROSTINI_CROSTINI_UTIL_H_
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.cc b/chrome/browser/chromeos/drive/drive_integration_service.cc index 66e5025..eac49a38 100644 --- a/chrome/browser/chromeos/drive/drive_integration_service.cc +++ b/chrome/browser/chromeos/drive/drive_integration_service.cc
@@ -18,6 +18,7 @@ #include "base/strings/stringprintf.h" #include "base/sys_info.h" #include "base/task/post_task.h" +#include "base/task_runner_util.h" #include "base/timer/timer.h" #include "base/unguessable_token.h" #include "chrome/browser/browser_process.h" @@ -178,6 +179,11 @@ return FILE_ERROR_FAILED; } + // When running with DriveFS and migrating pinned files, only + // |metadata_storage| is non-null and needs to be initialized. + if (!cache) + return FILE_ERROR_OK; + if (!cache->Initialize()) { LOG(WARNING) << "Failed to initialize the cache."; return FILE_ERROR_FAILED; @@ -220,6 +226,56 @@ std::move(callback).Run(error == FILE_ERROR_OK); } +base::FilePath GetFullPath(internal::ResourceMetadataStorage* metadata_storage, + const ResourceEntry& entry) { + std::vector<std::string> path_components; + ResourceEntry current_entry = entry; + constexpr int kPathComponentSanityLimit = 100; + for (int i = 0; i < kPathComponentSanityLimit; ++i) { + path_components.push_back(current_entry.base_name()); + if (!current_entry.has_parent_local_id()) { + // Ignore anything not contained within the drive grand root. + return {}; + } + if (current_entry.parent_local_id() == util::kDriveGrandRootLocalId) { + // Omit the DriveGrantRoot directory from the path; DriveFS paths are + // relative to the mount point. + break; + } + if (metadata_storage->GetEntry(current_entry.parent_local_id(), + ¤t_entry) != FILE_ERROR_OK) { + return {}; + } + } + if (path_components.empty()) { + return {}; + } + base::FilePath path("/"); + for (auto it = path_components.crbegin(); it != path_components.crend(); + ++it) { + path = path.Append(*it); + } + return path; +} + +std::vector<base::FilePath> GetPinnedFiles( + internal::ResourceMetadataStorage* metadata_storage) { + std::vector<base::FilePath> pinned_files; + for (auto it = metadata_storage->GetIterator(); !it->IsAtEnd(); + it->Advance()) { + const auto& value = it->GetValue(); + if (!value.has_file_specific_info() || + !value.file_specific_info().cache_state().is_pinned()) { + continue; + } + auto path = GetFullPath(metadata_storage, value); + if (!path.empty()) { + pinned_files.push_back(std::move(path)); + } + } + return pinned_files; +} + } // namespace // Observes drive disable Preference's change. @@ -443,10 +499,19 @@ if (preference_watcher_) preference_watcher->set_integration_service(this); + bool migrated_to_drivefs = + profile_->GetPrefs()->GetBoolean(prefs::kDriveFsPinnedMigrated); + if (!drivefs_holder_ || !migrated_to_drivefs) { + metadata_storage_.reset(new internal::ResourceMetadataStorage( + cache_root_directory_.Append(kMetadataDirectory), + blocking_task_runner_.get())); + } if (drivefs_holder_) { delete test_drive_service; delete test_file_system; - state_ = INITIALIZED; + if (migrated_to_drivefs) { + state_ = INITIALIZED; + } SetEnabled(drive::util::IsDriveEnabledForProfile(profile)); return; } @@ -481,9 +546,6 @@ scheduler_ = std::make_unique<JobScheduler>( profile_->GetPrefs(), logger_.get(), drive_service_.get(), blocking_task_runner_.get(), std::move(wake_lock_provider)); - metadata_storage_.reset(new internal::ResourceMetadataStorage( - cache_root_directory_.Append(kMetadataDirectory), - blocking_task_runner_.get())); cache_.reset(new internal::FileCache( metadata_storage_.get(), cache_root_directory_.Append(kCacheFileDirectory), @@ -748,6 +810,10 @@ if (drivefs_holder_ && preference_watcher_) { preference_watcher_->UpdateSyncPauseState(); } + if (drivefs_holder_ && + !profile_->GetPrefs()->GetBoolean(prefs::kDriveFsPinnedMigrated)) { + MigratePinnedFiles(); + } } void DriveIntegrationService::RemoveDriveMountPoint() { @@ -830,6 +896,17 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_EQ(INITIALIZING, state_); + if (drivefs_holder_) { + if (error != FILE_ERROR_OK) { + profile_->GetPrefs()->SetBoolean(prefs::kDriveFsPinnedMigrated, true); + metadata_storage_.reset(); + } + state_ = INITIALIZED; + if (enabled_) + AddDriveMountPoint(); + return; + } + SigninManagerBase* signin_manager = SigninManagerFactory::GetForProfile(profile_); drive_service_->Initialize(signin_manager->GetAuthenticatedAccountId()); @@ -916,6 +993,29 @@ } } +void DriveIntegrationService::MigratePinnedFiles() { + if (!metadata_storage_) + return; + + base::PostTaskAndReplyWithResult( + blocking_task_runner_.get(), FROM_HERE, + base::BindOnce(&GetPinnedFiles, metadata_storage_.get()), + base::BindOnce(&DriveIntegrationService::PinFiles, + weak_ptr_factory_.GetWeakPtr())); +} + +void DriveIntegrationService::PinFiles( + const std::vector<base::FilePath>& files_to_pin) { + if (!drivefs_holder_->drivefs_host()->IsMounted()) + return; + + for (const auto& path : files_to_pin) { + GetDriveFsInterface()->SetPinned(path, true, base::DoNothing()); + } + profile_->GetPrefs()->SetBoolean(prefs::kDriveFsPinnedMigrated, true); + metadata_storage_.reset(); +} + //===================== DriveIntegrationServiceFactory ======================= DriveIntegrationServiceFactory::FactoryCallback*
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.h b/chrome/browser/chromeos/drive/drive_integration_service.h index 06d32537..b33de95 100644 --- a/chrome/browser/chromeos/drive/drive_integration_service.h +++ b/chrome/browser/chromeos/drive/drive_integration_service.h
@@ -213,6 +213,12 @@ const content::NotificationSource& source, const content::NotificationDetails& details) override; + // Migrate pinned files from the old Drive integration to DriveFS. + void MigratePinnedFiles(); + + // Pin all the files in |files_to_pin| with DriveFS. + void PinFiles(const std::vector<base::FilePath>& files_to_pin); + friend class DriveIntegrationServiceFactory; Profile* profile_;
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc index c2e25b0..4c50be9 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
@@ -13,12 +13,16 @@ #include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_pref_names.h" +#include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/extensions/file_manager/event_router.h" +#include "chrome/browser/chromeos/extensions/file_manager/private_api_misc.h" #include "chrome/browser/chromeos/file_manager/file_watcher.h" #include "chrome/browser/chromeos/file_manager/mount_test_util.h" +#include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/browser/chromeos/file_system_provider/icon_set.h" #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h" #include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/common/chrome_features.h" @@ -153,27 +157,22 @@ void AddFileWatchCallback(bool success) {} -bool InitializeLocalFileSystem(std::string mount_point_name, - base::ScopedTempDir* temp_dir, - base::FilePath* mount_point_dir) { +void AddLocalFileSystem(Profile* profile, base::FilePath root) { + const char kLocalMountPointName[] = "local"; const char kTestFileContent[] = "The five boxing wizards jumped quickly"; - if (!temp_dir->CreateUniqueTempDir()) - return false; - *mount_point_dir = temp_dir->GetPath().AppendASCII(mount_point_name); - // Create the mount point. - if (!base::CreateDirectory(*mount_point_dir)) - return false; + ASSERT_TRUE(base::CreateDirectory(root.AppendASCII("test_dir"))); + ASSERT_TRUE(google_apis::test_util::WriteStringToFile( + root.AppendASCII("test_dir").AppendASCII("test_file.txt"), + kTestFileContent)); - const base::FilePath test_dir = mount_point_dir->AppendASCII("test_dir"); - if (!base::CreateDirectory(test_dir)) - return false; - - const base::FilePath test_file = test_dir.AppendASCII("test_file.txt"); - if (!google_apis::test_util::WriteStringToFile(test_file, kTestFileContent)) - return false; - - return true; + ASSERT_TRUE( + content::BrowserContext::GetMountPoints(profile)->RegisterFileSystem( + kLocalMountPointName, storage::kFileSystemTypeNativeLocal, + storage::FileSystemMountOption(), root)); + file_manager::VolumeManager::Get(profile)->AddVolumeForTesting( + root, file_manager::VOLUME_TYPE_TESTING, chromeos::DEVICE_TYPE_UNKNOWN, + false /* read_only */); } } // namespace @@ -343,6 +342,38 @@ chromeos::disks::MountCondition::MOUNT_CONDITION_NONE)); } + void EnableCrostiniForProfile( + base::test::ScopedFeatureList* scoped_feature_list) { + // TODO(joelhockey): Setting prefs and features to allow crostini is not + // ideal. It would be better if the crostini interface allowed for testing + // without such tight coupling. + browser()->profile()->GetPrefs()->SetBoolean( + crostini::prefs::kCrostiniEnabled, true); + scoped_feature_list->InitWithFeatures( + {features::kCrostini, features::kExperimentalCrostiniUI}, {}); + // Profile must be signed in with email for crostini. + identity::SetPrimaryAccount( + SigninManagerFactory::GetForProfileIfExists(browser()->profile()), + IdentityManagerFactory::GetForProfileIfExists(browser()->profile()), + "testuser@gmail.com"); + } + + void ExpectCrostiniMount() { + std::string known_hosts; + base::Base64Encode("[hostname]:2222 pubkey", &known_hosts); + std::string identity; + base::Base64Encode("privkey", &identity); + std::vector<std::string> mount_options = { + "UserKnownHostsBase64=" + known_hosts, "IdentityBase64=" + identity, + "Port=2222"}; + EXPECT_CALL(*disk_mount_manager_mock_, + MountPath("sshfs://testuser@hostname:", "", + "crostini_user_termina_penguin", mount_options, + chromeos::MOUNT_TYPE_NETWORK_STORAGE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE)) + .WillOnce(Invoke(this, &FileManagerPrivateApiTest::SshfsMount)); + } + chromeos::disks::MockDiskMountManager* disk_mount_manager_mock_; DiskMountManager::DiskMap volumes_; DiskMountManager::MountPointMap mount_points_; @@ -480,21 +511,8 @@ IN_PROC_BROWSER_TEST_F(FileManagerPrivateApiTest, ContentChecksum) { base::ScopedTempDir temp_dir; - base::FilePath mount_point_dir; - const char kLocalMountPointName[] = "local"; - - ASSERT_TRUE(InitializeLocalFileSystem(kLocalMountPointName, &temp_dir, - &mount_point_dir)) - << "Failed to initialize test file system"; - - EXPECT_TRUE(content::BrowserContext::GetMountPoints(browser()->profile()) - ->RegisterFileSystem( - kLocalMountPointName, storage::kFileSystemTypeNativeLocal, - storage::FileSystemMountOption(), mount_point_dir)); - file_manager::VolumeManager::Get(browser()->profile()) - ->AddVolumeForTesting(mount_point_dir, file_manager::VOLUME_TYPE_TESTING, - chromeos::DEVICE_TYPE_UNKNOWN, - false /* read_only */); + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + AddLocalFileSystem(browser()->profile(), temp_dir.GetPath()); ASSERT_TRUE(RunComponentExtensionTest("file_browser/content_checksum_test")); } @@ -518,37 +536,47 @@ } IN_PROC_BROWSER_TEST_F(FileManagerPrivateApiTest, Crostini) { - // TODO(joelhockey): Setting prefs and features to allow crostini is not - // ideal. It would be better if the crostini interface allowed for testing - // without such tight coupling. - browser()->profile()->GetPrefs()->SetBoolean( - crostini::prefs::kCrostiniEnabled, true); base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {features::kCrostini, features::kExperimentalCrostiniUI}, {}); + EnableCrostiniForProfile(&scoped_feature_list); + + // Setup CrostiniManager for testing. crostini::CrostiniManager::GetInstance()->set_skip_restart_for_testing(); + vm_tools::concierge::VmInfo vm_info; + crostini::CrostiniManager::GetInstance()->AddRunningVmForTesting( + CryptohomeIdForProfile(browser()->profile()), kCrostiniDefaultVmName, + std::move(vm_info)); - // Profile must be signed in with email for crostini. - identity::SetPrimaryAccount( - SigninManagerFactory::GetForProfileIfExists(browser()->profile()), - IdentityManagerFactory::GetForProfileIfExists(browser()->profile()), - "testuser@gmail.com"); + ExpectCrostiniMount(); - // DiskMountManager mock. - std::string known_hosts; - base::Base64Encode("[hostname]:2222 pubkey", &known_hosts); - std::string identity; - base::Base64Encode("privkey", &identity); - std::vector<std::string> mount_options = { - "UserKnownHostsBase64=" + known_hosts, "IdentityBase64=" + identity, - "Port=2222"}; - EXPECT_CALL(*disk_mount_manager_mock_, - MountPath("sshfs://testuser@hostname:", "", - "crostini_user_termina_penguin", mount_options, - chromeos::MOUNT_TYPE_NETWORK_STORAGE, - chromeos::MOUNT_ACCESS_MODE_READ_WRITE)) - .WillOnce( - Invoke(this, &FileManagerPrivateApiTest_Crostini_Test::SshfsMount)); + // Add 'testing' volume with 'test_dir', create 'share_dir' in Downloads. + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + AddLocalFileSystem(browser()->profile(), temp_dir.GetPath()); + base::FilePath downloads; + ASSERT_TRUE( + storage::ExternalMountPoints::GetSystemInstance()->GetRegisteredPath( + file_manager::util::GetDownloadsMountPointName(browser()->profile()), + &downloads)); + ASSERT_TRUE(base::CreateDirectory(downloads.AppendASCII("share_dir"))); ASSERT_TRUE(RunComponentExtensionTest("file_browser/crostini_test")); } + +IN_PROC_BROWSER_TEST_F(FileManagerPrivateApiTest, CrostiniIncognito) { + base::test::ScopedFeatureList scoped_feature_list; + EnableCrostiniForProfile(&scoped_feature_list); + crostini::CrostiniManager::GetInstance()->set_skip_restart_for_testing(); + ExpectCrostiniMount(); + + scoped_refptr<extensions::FileManagerPrivateMountCrostiniContainerFunction> + function( + new extensions::FileManagerPrivateMountCrostiniContainerFunction()); + // Use incognito profile. + function->set_browser_context(browser()->profile()->GetOffTheRecordProfile()); + + extensions::api_test_utils::SendResponseHelper response_helper( + function.get()); + function->RunWithValidation()->Execute(); + response_helper.WaitForResponse(); + EXPECT_TRUE(response_helper.GetResponse()); +}
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index 032488f..9fab10e44 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -20,6 +20,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/crostini/crostini_package_installer_service.h" +#include "chrome/browser/chromeos/crostini/crostini_share_path.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" @@ -655,7 +656,10 @@ ~FileManagerPrivateMountCrostiniContainerFunction() = default; bool FileManagerPrivateMountCrostiniContainerFunction::RunAsync() { - Profile* profile = Profile::FromBrowserContext(browser_context()); + // Use OriginalProfile since using crostini in incognito such as saving + // files into Linux files should still work. + Profile* profile = + Profile::FromBrowserContext(browser_context())->GetOriginalProfile(); DCHECK(IsCrostiniEnabled(profile)); crostini::CrostiniManager::GetInstance()->RestartCrostini( profile, kCrostiniDefaultVmName, kCrostiniDefaultContainerName, @@ -676,6 +680,47 @@ } ExtensionFunction::ResponseAction +FileManagerPrivateInternalSharePathWithCrostiniContainerFunction::Run() { + using extensions::api::file_manager_private_internal:: + SharePathWithCrostiniContainer::Params; + const std::unique_ptr<Params> params(Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + + Profile* profile = Profile::FromBrowserContext(browser_context()); + const scoped_refptr<storage::FileSystemContext> file_system_context = + file_manager::util::GetFileSystemContextForRenderFrameHost( + profile, render_frame_host()); + storage::FileSystemURL cracked = + file_system_context->CrackURL(GURL(params->url)); + + // TODO(joelhockey): Seneschal currently only supports sharing + // directories under Downloads. + std::string downloads_mount_name = + file_manager::util::GetDownloadsMountPointName(profile); + if (cracked.filesystem_id() != downloads_mount_name) { + return RespondNow(Error( + "Share with Linux only allowed for directories within Downloads.")); + } + + // Path must be relative under Downloads/ + std::string share_path = + cracked.virtual_path().value().substr(downloads_mount_name.size() + 1); + crostini::CrostiniSharePath::GetInstance()->SharePath( + profile, kCrostiniDefaultVmName, share_path, + base::BindOnce( + &FileManagerPrivateInternalSharePathWithCrostiniContainerFunction:: + SharePathCallback, + this)); + + return RespondLater(); +} + +void FileManagerPrivateInternalSharePathWithCrostiniContainerFunction:: + SharePathCallback(bool success, std::string failure_reason) { + Respond(success ? NoArguments() : Error(failure_reason)); +} + +ExtensionFunction::ResponseAction FileManagerPrivateInternalInstallLinuxPackageFunction::Run() { using extensions::api::file_manager_private_internal::InstallLinuxPackage:: Params;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h index cd8f86a..77e193c 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -299,6 +299,24 @@ std::string mount_label_; }; +// Implements the chrome.fileManagerPrivate.sharePathWithCrostiniContainer +// method. Shares specified path. +class FileManagerPrivateInternalSharePathWithCrostiniContainerFunction + : public UIThreadExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION( + "fileManagerPrivateInternal.sharePathWithCrostiniContainer", + FILEMANAGERPRIVATEINTERNAL_SHAREPATHWITHCROSTINICONTAINER) + + protected: + ~FileManagerPrivateInternalSharePathWithCrostiniContainerFunction() override = + default; + + private: + ResponseAction Run() override; + void SharePathCallback(bool success, std::string failure_reason); +}; + // Implements the chrome.fileManagerPrivate.installLinuxPackage method. // Starts installation of a Linux package. class FileManagerPrivateInternalInstallLinuxPackageFunction
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc index e9d181d3..fb6585f 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
@@ -722,6 +722,8 @@ SET_STRING("SHARE_BUTTON_LABEL", IDS_FILE_BROWSER_SHARE_BUTTON_LABEL); SET_STRING("MANAGE_IN_DRIVE_BUTTON_LABEL", IDS_FILE_BROWSER_MANAGE_IN_DRIVE_BUTTON_LABEL); + SET_STRING("SHARE_WITH_LINUX_BUTTON_LABEL", + IDS_FILE_BROWSER_SHARE_WITH_LINUX_BUTTON_LABEL); SET_STRING("CHANGE_TO_LISTVIEW_BUTTON_LABEL", IDS_FILE_BROWSER_CHANGE_TO_LISTVIEW_BUTTON_LABEL); SET_STRING("CHANGE_TO_THUMBNAILVIEW_BUTTON_LABEL",
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index c7f5846..9497f1a 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -735,4 +735,46 @@ StartTest(); } +// Test fixture class for testing migration to DriveFS. +class DriveFsFilesAppBrowserTest : public FileManagerBrowserTestBase { + public: + DriveFsFilesAppBrowserTest() = default; + + protected: + GuestMode GetGuestMode() const override { return NOT_IN_GUEST_MODE; } + + const char* GetTestCaseName() const override { + return test_case_name_.c_str(); + } + + std::string GetFullTestCaseName() const override { return test_case_name_; } + + const char* GetTestExtensionManifestName() const override { + return "file_manager_test_manifest.json"; + } + + void set_test_case_name(const std::string& name) { test_case_name_ = name; } + + bool GetEnableDriveFs() const override { + return !base::StringPiece( + ::testing::UnitTest::GetInstance()->current_test_info()->name()) + .starts_with("PRE"); + } + + private: + std::string test_case_name_; + + DISALLOW_COPY_AND_ASSIGN(DriveFsFilesAppBrowserTest); +}; + +IN_PROC_BROWSER_TEST_F(DriveFsFilesAppBrowserTest, PRE_MigratePinnedFiles) { + set_test_case_name("PRE_driveMigratePinnedFile"); + StartTest(); +} + +IN_PROC_BROWSER_TEST_F(DriveFsFilesAppBrowserTest, MigratePinnedFiles) { + set_test_case_name("driveMigratePinnedFile"); + StartTest(); +} + } // namespace file_manager
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index 872fd68e8..b0a86f9b1 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -353,12 +353,13 @@ bool CreateRootDirectory(const Profile* profile) { if (root_initialized_) return true; - root_initialized_ = root_.Set(profile->GetPath().Append(name_)); + root_ = profile->GetPath().Append(name_); + root_initialized_ = base::CreateDirectory(root_); return root_initialized_; } const std::string& name() const { return name_; } - const base::FilePath& root_path() const { return root_.GetPath(); } + const base::FilePath& root_path() const { return root_; } static base::FilePath GetTestDataFilePath(const std::string& file_name) { // Get the path to file manager's test data directory. @@ -374,7 +375,7 @@ } private: - base::ScopedTempDir root_; + base::FilePath root_; bool root_initialized_ = false; std::string name_;
diff --git a/chrome/browser/chromeos/file_manager/path_util.cc b/chrome/browser/chromeos/file_manager/path_util.cc index c23a219..a9b9130 100644 --- a/chrome/browser/chromeos/file_manager/path_util.cc +++ b/chrome/browser/chromeos/file_manager/path_util.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root_map.h" #include "chrome/browser/chromeos/arc/fileapi/chrome_content_provider_url_util.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" -#include "chrome/browser/chromeos/drive/file_system_util.h" +#include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/fileapi/external_file_url_util.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/download/download_prefs.h" @@ -290,6 +290,8 @@ std::string GetDownloadLocationText(Profile* profile, const std::string& path) { std::string result(path); + auto* drive_integration_service = + drive::DriveIntegrationServiceFactory::FindForProfile(profile); if (ReplacePrefix(&result, "/home/chronos/user/Downloads", kDownloadsFolderName)) { } else if (ReplacePrefix(&result, @@ -297,13 +299,15 @@ profile->GetPath().BaseName().value() + "/Downloads", kDownloadsFolderName)) { - } else if (ReplacePrefix(&result, - drive::util::GetDriveMountPointPath(profile) + } else if (drive_integration_service && + ReplacePrefix(&result, + drive_integration_service->GetMountPointPath() .Append(kRootRelativeToDriveMount) .value(), kGoogleDriveDisplayName)) { - } else if (ReplacePrefix(&result, - drive::util::GetDriveMountPointPath(profile) + } else if (drive_integration_service && + ReplacePrefix(&result, + drive_integration_service->GetMountPointPath() .Append(kTeamDrivesRelativeToDriveMount) .value(), l10n_util::GetStringUTF8(
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc index fd297dbf..0ce9b1f 100644 --- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -7,9 +7,12 @@ #include "base/files/file_path.h" #include "base/memory/ptr_util.h" #include "base/sys_info.h" +#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h" #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h" +#include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/file_system_util.h" +#include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/scoped_set_running_on_chromeos_for_testing.h" @@ -17,13 +20,16 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/chromeos_features.h" #include "components/account_id/account_id.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service_manager.h" #include "components/arc/test/connection_holder_util.h" #include "components/arc/test/fake_file_system_instance.h" +#include "components/drive/drive_pref_names.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_service_manager_context.h" #include "storage/browser/fileapi/external_mount_points.h" #include "testing/gtest/include/gtest/gtest.h" @@ -39,20 +45,15 @@ TEST(FileManagerPathUtilTest, GetDownloadLocationText) { content::TestBrowserThreadBundle thread_bundle; + content::TestServiceManagerContext service_manager_context; + TestingProfileManager profile_manager(TestingBrowserProcess::GetGlobal()); + TestingProfile profile(base::FilePath("/home/chronos/u-0123456789abcdef")); EXPECT_EQ("Downloads", GetDownloadLocationText(&profile, "/home/chronos/user/Downloads")); EXPECT_EQ("Downloads", GetDownloadLocationText( &profile, "/home/chronos/u-0123456789abcdef/Downloads")); - EXPECT_EQ("Google Drive \u203a foo", - GetDownloadLocationText( - &profile, "/special/drive-0123456789abcdef/root/foo")); - EXPECT_EQ( - "Team Drives \u203a A Team Drive \u203a foo", - GetDownloadLocationText( - &profile, - "/special/drive-0123456789abcdef/team_drives/A Team Drive/foo")); EXPECT_EQ("Play files \u203a foo \u203a bar", GetDownloadLocationText( &profile, "/run/arc/sdcard/write/emulated/0/foo/bar")); @@ -60,6 +61,50 @@ GetDownloadLocationText( &profile, "/media/fuse/crostini_0123456789abcdef_termina_penguin/foo")); + + { + base::test::ScopedFeatureList features; + features.InitAndDisableFeature(chromeos::features::kDriveFs); + drive::DriveIntegrationServiceFactory::GetForProfile(&profile); + EXPECT_EQ("Google Drive \u203a foo", + GetDownloadLocationText( + &profile, "/special/drive-0123456789abcdef/root/foo")); + EXPECT_EQ( + "Team Drives \u203a A Team Drive \u203a foo", + GetDownloadLocationText( + &profile, + "/special/drive-0123456789abcdef/team_drives/A Team Drive/foo")); + } + { + base::test::ScopedFeatureList features; + features.InitAndEnableFeature(chromeos::features::kDriveFs); + chromeos::disks::DiskMountManager::InitializeForTesting( + new FakeDiskMountManager); + TestingProfile profile2(base::FilePath("/home/chronos/u-0123456789abcdef")); + chromeos::FakeChromeUserManager user_manager; + AccountId account_id = + AccountId::FromUserEmailGaiaId(profile2.GetProfileUserName(), "12345"); + const auto* user = user_manager.AddUser(account_id); + chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting( + user, &profile2); + chromeos::ProfileHelper::Get()->SetProfileToUserMappingForTesting( + const_cast<user_manager::User*>(user)); + PrefService* prefs = profile2.GetPrefs(); + prefs->SetString(drive::prefs::kDriveFsProfileSalt, "a"); + + drive::DriveIntegrationServiceFactory::GetForProfile(&profile2); + EXPECT_EQ( + "Google Drive \u203a foo", + GetDownloadLocationText( + &profile2, + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/root/foo")); + EXPECT_EQ("Team Drives \u203a A Team Drive \u203a foo", + GetDownloadLocationText( + &profile2, + "/media/fuse/drivefs-84675c855b63e12f384d45f033826980/" + "team_drives/A Team Drive/foo")); + } + chromeos::disks::DiskMountManager::Shutdown(); } TEST(FileManagerPathUtilTest, MultiProfileDownloadsFolderMigration) {
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc index 485e66d3..075ab6e4 100644 --- a/chrome/browser/chromeos/first_run/first_run.cc +++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -21,11 +21,9 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" -#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" -#include "chromeos/assistant/buildflags.h" #include "chromeos/chromeos_switches.h" #include "components/arc/arc_prefs.h" #include "components/arc/arc_service_manager.h" @@ -135,16 +133,6 @@ } } -#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) - // Launch Assistant OOBE flow if Assistant is allowed. - if (arc::IsAssistantAllowedForProfile(profile_) == - ash::mojom::AssistantAllowedState::ALLOWED) { - chromeos::AssistantOptInDialog::Show(); - delete this; - return; - } -#endif - // If voice interaction value prop needs to be shown, the tutorial will be // shown after the voice interaction OOBE flow. if (account_supported && arc::IsArcPlayStoreEnabledForProfile(profile_) &&
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index 44c6a3c..cc77707d 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -619,6 +619,7 @@ } manager_->NotifyImeMenuListChanged(); + manager_->NotifyInputMethodExtensionAdded(extension_id); } void InputMethodManagerImpl::StateImpl::RemoveInputMethodExtension( @@ -655,6 +656,7 @@ // If |current_input_method| is no longer in |active_input_method_ids|, // switch to the first one in |active_input_method_ids|. ChangeInputMethod(current_input_method.id(), false); + manager_->NotifyInputMethodExtensionRemoved(extension_id); } void InputMethodManagerImpl::StateImpl::GetInputMethodExtensions( @@ -1278,6 +1280,18 @@ MaybeNotifyImeMenuActivationChanged(); } +void InputMethodManagerImpl::NotifyInputMethodExtensionAdded( + const std::string& extension_id) { + for (auto& observer : observers_) + observer.OnInputMethodExtensionAdded(extension_id); +} + +void InputMethodManagerImpl::NotifyInputMethodExtensionRemoved( + const std::string& extension_id) { + for (auto& observer : observers_) + observer.OnInputMethodExtensionRemoved(extension_id); +} + void InputMethodManagerImpl::NotifyImeMenuListChanged() { for (auto& observer : ime_menu_observers_) observer.ImeMenuListChanged();
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index 6d746ba..d74e08a 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h
@@ -201,6 +201,10 @@ void NotifyObserversImeExtraInputStateChange() override; ui::InputMethodKeyboardController* GetInputMethodKeyboardController() override; + void NotifyInputMethodExtensionAdded( + const std::string& extension_id) override; + void NotifyInputMethodExtensionRemoved( + const std::string& extension_id) override; // chromeos::UserAddingScreen: void OnUserAddingStarted() override;
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc index cafe3e4..d0bf2e5 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
@@ -66,9 +66,10 @@ public: TestObserver() : input_method_changed_count_(0), + input_method_extension_added_count_(0), + input_method_extension_removed_count_(0), input_method_menu_item_changed_count_(0), - last_show_message_(false) { - } + last_show_message_(false) {} ~TestObserver() override {} void InputMethodChanged(InputMethodManager* manager, @@ -77,12 +78,23 @@ ++input_method_changed_count_; last_show_message_ = show_message; } + + void OnInputMethodExtensionAdded(const std::string& id) override { + ++input_method_extension_added_count_; + } + + void OnInputMethodExtensionRemoved(const std::string& id) override { + ++input_method_extension_removed_count_; + } + void InputMethodMenuItemChanged( ui::ime::InputMethodMenuManager* manager) override { ++input_method_menu_item_changed_count_; } int input_method_changed_count_; + int input_method_extension_added_count_; + int input_method_extension_removed_count_; int input_method_menu_item_changed_count_; bool last_show_message_; @@ -385,6 +397,8 @@ manager_->AddObserver(&observer); menu_manager_->AddObserver(&observer); EXPECT_EQ(0, observer.input_method_changed_count_); + EXPECT_EQ(0, observer.input_method_extension_added_count_); + EXPECT_EQ(0, observer.input_method_extension_removed_count_); manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts); EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetActiveInputMethods()->size()); EXPECT_EQ(1, observer.input_method_changed_count_); @@ -408,6 +422,21 @@ // notified. EXPECT_EQ(1, observer.input_method_menu_item_changed_count_); + // Add an ARC IME, remove it, then check the observer counts. + MockInputMethodEngine engine; + const std::string ime_id = + extension_ime_util::GetArcInputMethodID(kExtensionId1, "engine_id"); + InputMethodDescriptor descriptor(ime_id, "arc ime", "AI", {"us"}, {"en-US"}, + false /* is_login_keyboard */, GURL(), + GURL()); + manager_->GetActiveIMEState()->AddInputMethodExtension(kExtensionId1, + {descriptor}, &engine); + EXPECT_EQ(1, observer.input_method_extension_added_count_); + EXPECT_EQ(0, observer.input_method_extension_removed_count_); + manager_->GetActiveIMEState()->RemoveInputMethodExtension(kExtensionId1); + EXPECT_EQ(1, observer.input_method_extension_added_count_); + EXPECT_EQ(1, observer.input_method_extension_removed_count_); + manager_->RemoveObserver(&observer); menu_manager_->RemoveObserver(&observer); }
diff --git a/chrome/browser/chromeos/login/configuration_keys.cc b/chrome/browser/chromeos/login/configuration_keys.cc index f633ce0..c20e6d8e6 100644 --- a/chrome/browser/chromeos/login/configuration_keys.cc +++ b/chrome/browser/chromeos/login/configuration_keys.cc
@@ -44,5 +44,67 @@ // enrollment at appropriate moment. const char kWizardAutoEnroll[] = "wizardAutoEnroll"; +using ValueType = base::Value::Type; + +constexpr struct { + const char* key; + ValueType type; + ConfigurationHandlerSide side; +} kAllConfigurationKeys[] = { + {kWelcomeNext, ValueType::BOOLEAN, ConfigurationHandlerSide::HANDLER_JS}, + {kNetworkSelectGUID, ValueType::STRING, + ConfigurationHandlerSide::HANDLER_JS}, + {kEULASendUsageStatistics, ValueType::BOOLEAN, + ConfigurationHandlerSide::HANDLER_JS}, + {kEULAAutoAccept, ValueType::BOOLEAN, ConfigurationHandlerSide::HANDLER_JS}, + {kUpdateSkipUpdate, ValueType::BOOLEAN, + ConfigurationHandlerSide::HANDLER_CPP}, + {kWizardAutoEnroll, ValueType::BOOLEAN, + ConfigurationHandlerSide::HANDLER_CPP}, + {"desc", ValueType::STRING, ConfigurationHandlerSide::HANDLER_DOC}, + {"testValue", ValueType::STRING, ConfigurationHandlerSide::HANDLER_BOTH}, +}; + +bool ValidateConfiguration(const base::Value& configuration) { + if (configuration.type() != ValueType::DICTIONARY) { + LOG(ERROR) << "Configuration should be a dictionary"; + return false; + } + base::Value clone = configuration.Clone(); + bool valid = true; + for (const auto& key : kAllConfigurationKeys) { + auto* value = clone.FindKey(key.key); + if (value) { + if (value->type() != key.type) { + valid = false; + LOG(ERROR) << "Invalid configuration: key " << key.key + << " type is invalid"; + } + clone.RemoveKey(key.key); + } + } + valid = valid && clone.DictEmpty(); + for (const auto& item : clone.DictItems()) { + LOG(ERROR) << "Unknown configuration key " << item.first; + } + return valid; +} + +void FilterConfiguration(const base::Value& configuration, + ConfigurationHandlerSide side, + base::Value& filtered_result) { + DCHECK(side == ConfigurationHandlerSide::HANDLER_CPP || + side == ConfigurationHandlerSide::HANDLER_JS); + for (const auto& key : kAllConfigurationKeys) { + if (key.side == side || + key.side == ConfigurationHandlerSide::HANDLER_BOTH) { + auto* value = configuration.FindKey(key.key); + if (value) { + filtered_result.SetKey(key.key, value->Clone()); + } + } + } +} + } // namespace configuration } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/configuration_keys.h b/chrome/browser/chromeos/login/configuration_keys.h index c7d1996..7694975 100644 --- a/chrome/browser/chromeos/login/configuration_keys.h +++ b/chrome/browser/chromeos/login/configuration_keys.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_CONFIGURATION_KEYS_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_CONFIGURATION_KEYS_H_ +#include "base/values.h" + namespace chromeos { namespace configuration { // Configuration keys that are used to automate OOBE screens go here. @@ -22,6 +24,23 @@ extern const char kWizardAutoEnroll[]; +enum class ConfigurationHandlerSide : unsigned int { + HANDLER_JS, // Handled by JS code + HANDLER_CPP, // Handled by C++ code + HANDLER_BOTH, // Used in both JS and C++ code + HANDLER_DOC // Not used by code, serves for documentation purposes only. +}; + +// Checks if configuration is valid (all fields have correct types, no extra +// fields). +bool ValidateConfiguration(const base::Value& configuration); + +// Copies only fields handled by particular |side| from |configuration| to +// |filtered_result|. +void FilterConfiguration(const base::Value& configuration, + ConfigurationHandlerSide side, + base::Value& filtered_result); + } // namespace configuration } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc index 3caf78b0..b4975dac 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -664,8 +664,13 @@ ->GetActiveIMEState() ->EnableLockScreenLayouts(); - if (IsFingerprintAuthenticationAvailableForUsers(users_)) + if (IsFingerprintAuthenticationAvailableForUsers(users_)) { + VLOG(1) << "Fingerprint is available on lock screen, start fingerprint " + << "auth session now."; fp_service_->StartAuthSession(); + } else { + VLOG(1) << "Fingerprint is not available on lock screen"; + } } bool ScreenLocker::IsUserLoggedIn(const AccountId& account_id) const {
diff --git a/chrome/browser/chromeos/login/lock/views_screen_locker.cc b/chrome/browser/chromeos/login/lock/views_screen_locker.cc index 2555b2d..5ca6ce0 100644 --- a/chrome/browser/chromeos/login/lock/views_screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/views_screen_locker.cc
@@ -248,6 +248,10 @@ return true; } +void ViewsScreenLocker::HandleFocusOobeDialog() { + NOTREACHED(); +} + void ViewsScreenLocker::HandleLoginAsGuest() { NOTREACHED(); }
diff --git a/chrome/browser/chromeos/login/lock/views_screen_locker.h b/chrome/browser/chromeos/login/lock/views_screen_locker.h index 6088bf8..9946b8e 100644 --- a/chrome/browser/chromeos/login/lock/views_screen_locker.h +++ b/chrome/browser/chromeos/login/lock/views_screen_locker.h
@@ -58,6 +58,7 @@ void HandleOnFocusPod(const AccountId& account_id) override; void HandleOnNoPodFocused() override; bool HandleFocusLockScreenApps(bool reverse) override; + void HandleFocusOobeDialog() override; void HandleLoginAsGuest() override; void HandleLaunchPublicSession(const AccountId& account_id, const std::string& locale,
diff --git a/chrome/browser/chromeos/login/oobe_configuration.cc b/chrome/browser/chromeos/login/oobe_configuration.cc index ba91311..44b9096 100644 --- a/chrome/browser/chromeos/login/oobe_configuration.cc +++ b/chrome/browser/chromeos/login/oobe_configuration.cc
@@ -8,6 +8,7 @@ #include "base/callback.h" #include "base/json/json_reader.h" #include "base/logging.h" +#include "chrome/browser/chromeos/login/configuration_keys.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/oobe_configuration_client.h" @@ -73,11 +74,16 @@ auto value = base::JSONReader::ReadAndReturnError( configuration, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, &error_code, &error_message, &row, &col); - if (!value || !value->is_dict()) { + if (!value) { LOG(ERROR) << "Error parsing OOBE configuration: " << error_message; return; } + if (!chromeos::configuration::ValidateConfiguration(*value)) { + LOG(ERROR) << "Invalid OOBE configuration"; + return; + } + configuration_ = std::move(value); for (auto& observer : observer_list_) observer.OnOobeConfigurationChanged();
diff --git a/chrome/browser/chromeos/login/oobe_screen.cc b/chrome/browser/chromeos/login/oobe_screen.cc index f1cb054c..0ffa064 100644 --- a/chrome/browser/chromeos/login/oobe_screen.cc +++ b/chrome/browser/chromeos/login/oobe_screen.cc
@@ -53,6 +53,7 @@ "voice-interaction-value-prop", // SCREEN_VOICE_INTERACTION_VALUE_PROP "wait-for-container-ready", // SCREEN_WAIT_FOR_CONTAINTER_READY "update-required", // SCREEN_UPDATE_REQUIRED + "assistant-optin-flow", // SCREEN_ASSISTANT_OPTIN_FLOW "login", // SCREEN_SPECIAL_LOGIN "oobe", // SCREEN_SPECIAL_OOBE "test:nowindow", // SCREEN_TEST_NO_WINDOW
diff --git a/chrome/browser/chromeos/login/oobe_screen.h b/chrome/browser/chromeos/login/oobe_screen.h index 037881a..0e8f00b 100644 --- a/chrome/browser/chromeos/login/oobe_screen.h +++ b/chrome/browser/chromeos/login/oobe_screen.h
@@ -50,6 +50,7 @@ SCREEN_VOICE_INTERACTION_VALUE_PROP, SCREEN_WAIT_FOR_CONTAINER_READY, SCREEN_UPDATE_REQUIRED, + SCREEN_ASSISTANT_OPTIN_FLOW, // Special "first screen" that initiates login flow. SCREEN_SPECIAL_LOGIN,
diff --git a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.cc b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.cc new file mode 100644 index 0000000..16f216e --- /dev/null +++ b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.cc
@@ -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. + +#include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h" + +#include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_view.h" +#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" + +namespace chromeos { +namespace { + +constexpr const char kFlowFinished[] = "flow-finished"; + +} // namespace + +AssistantOptInFlowScreen::AssistantOptInFlowScreen( + BaseScreenDelegate* base_screen_delegate, + AssistantOptInFlowScreenView* view) + : BaseScreen(base_screen_delegate, OobeScreen::SCREEN_ASSISTANT_OPTIN_FLOW), + view_(view) { + DCHECK(view_); + if (view_) + view_->Bind(this); +} + +AssistantOptInFlowScreen::~AssistantOptInFlowScreen() { + if (view_) + view_->Unbind(); +} + +void AssistantOptInFlowScreen::Show() { + if (!view_) + return; + + view_->Show(); +} + +void AssistantOptInFlowScreen::Hide() { + if (view_) + view_->Hide(); +} + +void AssistantOptInFlowScreen::OnViewDestroyed( + AssistantOptInFlowScreenView* view) { + if (view_ == view) + view_ = nullptr; +} + +void AssistantOptInFlowScreen::OnUserAction(const std::string& action_id) { + if (action_id == kFlowFinished) + Finish(ScreenExitCode::ASSISTANT_OPTIN_FLOW_FINISHED); + else + BaseScreen::OnUserAction(action_id); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h new file mode 100644 index 0000000..af404cf --- /dev/null +++ b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.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 CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_H_ + +#include <string> + +#include "base/macros.h" +#include "chrome/browser/chromeos/login/screens/base_screen.h" + +namespace chromeos { + +class AssistantOptInFlowScreenView; +class BaseScreenDelegate; + +class AssistantOptInFlowScreen : public BaseScreen { + public: + AssistantOptInFlowScreen(BaseScreenDelegate* base_screen_delegate, + AssistantOptInFlowScreenView* view); + ~AssistantOptInFlowScreen() override; + + // Called when view is destroyed so there's no dead reference to it. + void OnViewDestroyed(AssistantOptInFlowScreenView* view_); + + // BaseScreen: + void Show() override; + void Hide() override; + void OnUserAction(const std::string& action_id) override; + + private: + AssistantOptInFlowScreenView* view_; + + DISALLOW_COPY_AND_ASSIGN(AssistantOptInFlowScreen); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_view.h b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_view.h new file mode 100644 index 0000000..441cc3f4 --- /dev/null +++ b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_view.h
@@ -0,0 +1,37 @@ +// 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_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_VIEW_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_VIEW_H_ + +#include "chrome/browser/chromeos/login/oobe_screen.h" + +namespace chromeos { + +class AssistantOptInFlowScreen; + +// Interface for dependency injection between AssistantOptInFlowScreen +// and its WebUI representation. +class AssistantOptInFlowScreenView { + public: + constexpr static OobeScreen kScreenId = + OobeScreen::SCREEN_ASSISTANT_OPTIN_FLOW; + + virtual ~AssistantOptInFlowScreenView() = default; + + virtual void Bind(AssistantOptInFlowScreen* screen) = 0; + virtual void Unbind() = 0; + virtual void Show() = 0; + virtual void Hide() = 0; + + protected: + AssistantOptInFlowScreenView() = default; + + private: + DISALLOW_COPY_AND_ASSIGN(AssistantOptInFlowScreenView); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_ASSISTANT_OPTIN_FLOW_SCREEN_VIEW_H_
diff --git a/chrome/browser/chromeos/login/screens/screen_exit_code.h b/chrome/browser/chromeos/login/screens/screen_exit_code.h index 8df9d044..52e8364 100644 --- a/chrome/browser/chromeos/login/screens/screen_exit_code.h +++ b/chrome/browser/chromeos/login/screens/screen_exit_code.h
@@ -71,6 +71,7 @@ NETWORK_OFFLINE_DEMO_SETUP = 44, FINGERPRINT_SETUP_FINISHED = 45, MARKETING_OPT_IN_FINISHED = 46, + ASSISTANT_OPTIN_FLOW_FINISHED = 47, EXIT_CODES_COUNT // not a real code, must be the last };
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 2108500..f4469d8 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -97,6 +97,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/logging_chrome.h" #include "chrome/common/pref_names.h" +#include "chromeos/assistant/buildflags.h" #include "chromeos/cert_loader.h" #include "chromeos/chromeos_switches.h" #include "chromeos/cryptohome/cryptohome_parameters.h" @@ -147,6 +148,10 @@ #include "components/rlz/rlz_tracker.h" #endif +#if BUILDFLAG(ENABLE_CROS_ASSISTANT) +#include "chrome/browser/ui/ash/assistant/assistant_client.h" +#endif + namespace chromeos { namespace { @@ -1536,6 +1541,13 @@ ProfileHelper::Get()->ProfileStartup(profile); if (start_session_type_ == PRIMARY_USER_SESSION) { +#if BUILDFLAG(ENABLE_CROS_ASSISTANT) + // Initialize Assistant early to be used in post login Oobe steps. + if (chromeos::switches::IsAssistantEnabled()) { + AssistantClient::Get()->MaybeInit( + content::BrowserContext::GetConnectorFor(profile)); + } +#endif UserFlow* user_flow = ChromeUserManager::Get()->GetCurrentUserFlow(); WizardController* oobe_controller = WizardController::default_controller(); base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc index c7242da..43e44c8 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -404,6 +404,13 @@ return false; } +void LoginDisplayHostMojo::HandleFocusOobeDialog() { + if (!dialog_->IsVisible()) + return; + + dialog_->GetWebContents()->Focus(); +} + void LoginDisplayHostMojo::HandleLoginAsGuest() { existing_user_controller_->Login(UserContext(user_manager::USER_TYPE_GUEST, user_manager::GuestAccountId()),
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h index 5e672c1..511f350a 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -108,6 +108,7 @@ void HandleOnFocusPod(const AccountId& account_id) override; void HandleOnNoPodFocused() override; bool HandleFocusLockScreenApps(bool reverse) override; + void HandleFocusOobeDialog() override; void HandleLoginAsGuest() override; void HandleLaunchPublicSession(const AccountId& account_id, const std::string& locale,
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc index df4c4623..c8fa589 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc
@@ -202,6 +202,8 @@ extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( dialog_view_->web_contents()); + dialog_view_->web_contents()->SetDelegate(this); + captive_portal_delegate_ = new CaptivePortalDialogDelegate(dialog_view_->web_contents()); @@ -315,6 +317,19 @@ return dialog_widget_ ? dialog_widget_->GetNativeWindow() : nullptr; } +bool OobeUIDialogDelegate::TakeFocus(content::WebContents* source, + bool reverse) { + LoginScreenClient::Get()->login_screen()->FocusLoginShelf(reverse); + return true; +} + +void OobeUIDialogDelegate::HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) { + unhandled_keyboard_event_handler_.HandleKeyboardEvent( + event, dialog_widget_->GetFocusManager()); +} + void OobeUIDialogDelegate::OnDisplayMetricsChanged( const display::Display& display, uint32_t changed_metrics) {
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h index 5b1b1cb5..7f086b2 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h
@@ -16,8 +16,10 @@ #include "chrome/browser/ui/ash/tablet_mode_client_observer.h" #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" #include "components/web_modal/web_contents_modal_dialog_host.h" +#include "content/public/browser/web_contents_delegate.h" #include "ui/display/display_observer.h" #include "ui/keyboard/keyboard_controller_observer.h" +#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" #include "ui/web_dialogs/web_dialog_delegate.h" class TabletModeClient; @@ -56,6 +58,7 @@ class OobeUIDialogDelegate : public display::DisplayObserver, public TabletModeClientObserver, public ui::WebDialogDelegate, + public content::WebContentsDelegate, public keyboard::KeyboardControllerObserver, public CaptivePortalWindowProxy::Observer { public: @@ -89,6 +92,12 @@ OobeUI* GetOobeUI() const; gfx::NativeWindow GetNativeWindow() const; + // content::WebContentsDelegate: + bool TakeFocus(content::WebContents* source, bool reverse) override; + void HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) override; + private: // display::DisplayObserver: void OnDisplayMetricsChanged(const display::Display& display, @@ -144,6 +153,8 @@ std::map<ui::Accelerator, std::string> accel_map_; ash::mojom::OobeDialogState state_ = ash::mojom::OobeDialogState::HIDDEN; + views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; + // Whether the captive portal screen should be shown the next time the Gaia // dialog is opened. bool should_display_captive_portal_ = false;
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 208cf2e..269c0ea 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -1423,7 +1423,11 @@ } void WizardController::OnOobeConfigurationChanged() { - oobe_configuration_ = OobeConfiguration::Get()->GetConfiguration().Clone(); + oobe_configuration_ = base::Value(base::Value::Type::DICTIONARY); + chromeos::configuration::FilterConfiguration( + OobeConfiguration::Get()->GetConfiguration(), + chromeos::configuration::ConfigurationHandlerSide::HANDLER_CPP, + oobe_configuration_); if (current_screen_) { current_screen_->SetConfiguration(&oobe_configuration_, true /*notify */); }
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc index f0dd6a1f..1ee915c6 100644 --- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc +++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -2621,7 +2621,7 @@ // TODO(fukino): Add tests for encryption migration UI. // http://crbug.com/706017 -// TODO(updowndota): Add tests for Voice Interaction OptIn flow. +// TODO(updowndota): Add tests for Voice Interaction/Assistant OptIn flow. // TODO(alemate): Add tests for Sync Consent UI. @@ -2632,7 +2632,7 @@ // TODO(xiaoyinh): Add tests for Fingerprint Setup UI. // TODO(alemate): Add tests for Marketing Opt-In. -static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 47, +static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 48, "tests for new control flow are missing"); } // namespace chromeos
diff --git a/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl.cc b/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl.cc index e76dad8..71fabab 100644 --- a/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl.cc +++ b/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl.cc
@@ -34,9 +34,10 @@ // TODO(crbug.com/874605): Consider retries and error handling here. This call // can easily fail. pending_app_manager_->Install( - web_app::PendingAppManager::AppInfo::CreateForDefaultApp( + web_app::PendingAppManager::AppInfo( chromeos::android_sms::GetAndroidMessagesURLWithExperiments(), - web_app::PendingAppManager::LaunchContainer::kWindow), + web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled), base::BindOnce(&AndroidSmsAppHelperDelegateImpl::OnAppInstalled, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl_unittest.cc b/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl_unittest.cc index 656dd64..3a7d43e 100644 --- a/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl_unittest.cc +++ b/chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl_unittest.cc
@@ -50,10 +50,10 @@ InstallApp(); std::vector<web_app::PendingAppManager::AppInfo> expected_apps_to_install; - expected_apps_to_install.push_back( - web_app::PendingAppManager::AppInfo::CreateForDefaultApp( - chromeos::android_sms::GetAndroidMessagesURLWithExperiments(), - web_app::PendingAppManager::LaunchContainer::kWindow)); + expected_apps_to_install.push_back(web_app::PendingAppManager::AppInfo( + chromeos::android_sms::GetAndroidMessagesURLWithExperiments(), + web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled)); EXPECT_EQ(expected_apps_to_install, test_pending_app_manager()->installed_apps()); }
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.cc b/chrome/browser/chromeos/oauth2_token_service_delegate.cc index 1979aba6..92f4294 100644 --- a/chrome/browser/chromeos/oauth2_token_service_delegate.cc +++ b/chrome/browser/chromeos/oauth2_token_service_delegate.cc
@@ -12,16 +12,58 @@ #include "base/logging.h" #include "chrome/browser/chromeos/account_mapper_util.h" #include "chromeos/account_manager/account_manager.h" +#include "components/signin/core/browser/signin_error_controller.h" #include "services/network/public/cpp/shared_url_loader_factory.h" namespace chromeos { +class ChromeOSOAuth2TokenServiceDelegate::AccountErrorStatus + : public SigninErrorController::AuthStatusProvider { + public: + AccountErrorStatus(SigninErrorController* signin_error_controller, + const std::string& account_id) + : signin_error_controller_(signin_error_controller), + account_id_(account_id) { + signin_error_controller_->AddProvider(this); + } + + ~AccountErrorStatus() override { + signin_error_controller_->RemoveProvider(this); + } + + // SigninErrorController::AuthStatusProvider overrides. + std::string GetAccountId() const override { return account_id_; } + + GoogleServiceAuthError GetAuthStatus() const override { + return last_auth_error_; + } + + void SetLastAuthError(const GoogleServiceAuthError& error) { + last_auth_error_ = error; + signin_error_controller_->AuthStatusChanged(); + } + + private: + // A non-owning pointer to |SigninErrorController|. + SigninErrorController* const signin_error_controller_; + + // The account id being tracked by |this| instance of |AccountErrorStatus|. + const std::string account_id_; + + // The last auth error seen for |account_id_|. + GoogleServiceAuthError last_auth_error_; + + DISALLOW_COPY_AND_ASSIGN(AccountErrorStatus); +}; + ChromeOSOAuth2TokenServiceDelegate::ChromeOSOAuth2TokenServiceDelegate( AccountTrackerService* account_tracker_service, - chromeos::AccountManager* account_manager) + chromeos::AccountManager* account_manager, + SigninErrorController* signin_error_controller) : account_mapper_util_( std::make_unique<AccountMapperUtil>(account_tracker_service)), account_manager_(account_manager), + signin_error_controller_(signin_error_controller), weak_factory_(this) {} ChromeOSOAuth2TokenServiceDelegate::~ChromeOSOAuth2TokenServiceDelegate() { @@ -69,12 +111,21 @@ auto it = errors_.find(account_id); if (error.state() == GoogleServiceAuthError::NONE) { + // If the error status is NONE, and we were not tracking any error anyways, + // just ignore the update. + // Otherwise, delete the error tracking for this account. if (it != errors_.end()) { errors_.erase(it); FireAuthErrorChanged(account_id, error); } - } else if ((it == errors_.end()) || (it->second != error)) { - errors_[account_id] = error; + } else if ((it == errors_.end()) || (it->second->GetAuthStatus() != error)) { + // Error status is not NONE. We need to start tracking the account / update + // the last seen error, if it is different. + if (it == errors_.end()) { + errors_.emplace(account_id, std::make_unique<AccountErrorStatus>( + signin_error_controller_, account_id)); + } + errors_[account_id]->SetLastAuthError(error); FireAuthErrorChanged(account_id, error); } } @@ -83,7 +134,7 @@ const std::string& account_id) const { auto it = errors_.find(account_id); if (it != errors_.end()) { - return it->second; + return it->second->GetAuthStatus(); } return GoogleServiceAuthError::AuthErrorNone();
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.h b/chrome/browser/chromeos/oauth2_token_service_delegate.h index f8cf4da..0d66053 100644 --- a/chrome/browser/chromeos/oauth2_token_service_delegate.h +++ b/chrome/browser/chromeos/oauth2_token_service_delegate.h
@@ -18,6 +18,7 @@ #include "google_apis/gaia/oauth2_token_service_delegate.h" class AccountTrackerService; +class SigninErrorController; namespace chromeos { @@ -26,13 +27,15 @@ class ChromeOSOAuth2TokenServiceDelegate : public OAuth2TokenServiceDelegate, public AccountManager::Observer { public: - // Accepts non-owning pointers to |AccountTrackerService| and - // |AccountManager|. |AccountTrackerService| is a |KeyedService| and - // |AccountManager| transitively belongs to |g_browser_process| and they - // outlive (as they must) |this| delegate. + // Accepts non-owning pointers to |AccountTrackerService|, |AccountManager| + // and |SigninErrorController|. |AccountTrackerService| and + // |SigninErrorController| are |KeyedService|s. |AccountManager| transitively + // belongs to |g_browser_process|. They outlive (as they must) |this| + // delegate. ChromeOSOAuth2TokenServiceDelegate( AccountTrackerService* account_tracker_service, - AccountManager* account_manager); + AccountManager* account_manager, + SigninErrorController* signin_error_controller); ~ChromeOSOAuth2TokenServiceDelegate() override; // OAuth2TokenServiceDelegate overrides @@ -60,6 +63,12 @@ void OnAccountRemoved(const AccountManager::AccountKey& account_key) override; private: + // A utility class to keep track of |GoogleServiceAuthError|s for an account. + // This is used for providing account error status reports to + // |SigninErrorController| and for firing + // |OAuth2TokenService::Observer::OnAuthErrorChanged|. + class AccountErrorStatus; + // Callback handler for |AccountManager::GetAccounts|. void GetAccountsCallback( std::vector<AccountManager::AccountKey> account_keys); @@ -73,11 +82,14 @@ // throughout the lifetime of a user session. AccountManager* account_manager_; + // A non-owning pointer to |SigninErrorController|. + SigninErrorController* const signin_error_controller_; + // A cache of AccountKeys. std::set<AccountManager::AccountKey> account_keys_; // A map from account id to the last seen error for that account. - std::map<std::string, GoogleServiceAuthError> errors_; + std::map<std::string, std::unique_ptr<AccountErrorStatus>> errors_; SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<ChromeOSOAuth2TokenServiceDelegate> weak_factory_;
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc b/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc index c02771c7..1c174bf 100644 --- a/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc +++ b/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc
@@ -17,6 +17,7 @@ #include "chromeos/account_manager/account_manager.h" #include "components/signin/core/browser/account_info.h" #include "components/signin/core/browser/account_tracker_service.h" +#include "components/signin/core/browser/signin_error_controller.h" #include "components/signin/core/browser/signin_pref_names.h" #include "components/signin/core/browser/test_signin_client.h" #include "components/sync_preferences/testing_pref_service_syncable.h" @@ -80,6 +81,33 @@ std::vector<std::vector<std::string>> batch_change_records_; }; +class SigninErrorObserver : public SigninErrorController::Observer { + public: + explicit SigninErrorObserver(SigninErrorController* signin_error_controller) + : signin_error_controller_(signin_error_controller) { + signin_error_controller_->AddObserver(this); + } + + ~SigninErrorObserver() override { + signin_error_controller_->RemoveObserver(this); + } + + // |SigninErrorController::Observer| overrides. + void OnErrorChanged() override { + last_err_account_id_ = signin_error_controller_->error_account_id(); + last_err_ = signin_error_controller_->auth_error(); + } + + std::string last_err_account_id_; + GoogleServiceAuthError last_err_ = GoogleServiceAuthError::AuthErrorNone(); + + private: + // Non-owning pointer to |SigninErrorController|. + SigninErrorController* const signin_error_controller_; + + DISALLOW_COPY_AND_ASSIGN(SigninErrorObserver); +}; + } // namespace class CrOSOAuthDelegateTest : public testing::Test { @@ -87,7 +115,10 @@ CrOSOAuthDelegateTest() : test_shared_loader_factory_( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( - &test_url_loader_factory_)) {} + &test_url_loader_factory_)), + signin_error_controller_( + SigninErrorController::AccountMode::ANY_ACCOUNT), + signin_error_observer_(&signin_error_controller_) {} ~CrOSOAuthDelegateTest() override = default; protected: @@ -112,7 +143,8 @@ account_tracker_service_.SeedAccountInfo(account_info_); delegate_ = std::make_unique<ChromeOSOAuth2TokenServiceDelegate>( - &account_tracker_service_, &account_manager_); + &account_tracker_service_, &account_manager_, + &signin_error_controller_); delegate_->LoadCredentials( account_info_.account_id /* primary_account_id */); } @@ -152,6 +184,8 @@ AccountInfo account_info_; AccountTrackerService account_tracker_service_; AccountManager account_manager_; + SigninErrorController signin_error_controller_; + SigninErrorObserver signin_error_observer_; std::unique_ptr<ChromeOSOAuth2TokenServiceDelegate> delegate_; AccountManager::DelayNetworkCallRunner immediate_callback_runner_ = base::BindRepeating( @@ -274,7 +308,7 @@ // Register callbacks before AccountManager has been fully initialized. auto delegate = std::make_unique<ChromeOSOAuth2TokenServiceDelegate>( - &account_tracker_service_, &account_manager); + &account_tracker_service_, &account_manager, &signin_error_controller_); delegate->LoadCredentials(account1.account_id /* primary_account_id */); TokenServiceObserver observer; delegate->AddObserver(&observer); @@ -351,4 +385,19 @@ delegate_->RemoveObserver(&observer); } +TEST_F(CrOSOAuthDelegateTest, + SigninErrorObserversAreNotifiedOnAuthErrorChange) { + auto error = + GoogleServiceAuthError(GoogleServiceAuthError::State::SERVICE_ERROR); + + EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), + signin_error_observer_.last_err_); + delegate_->UpdateAuthError(account_info_.account_id, error); + + EXPECT_EQ(error, delegate_->GetAuthError(account_info_.account_id)); + EXPECT_EQ(account_info_.account_id, + signin_error_observer_.last_err_account_id_); + EXPECT_EQ(error, signin_error_observer_.last_err_); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc index 1535ee2..6efffe7 100644 --- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc +++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -75,6 +75,20 @@ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); } +MarketSegment TranslateMarketSegment( + em::PolicyData::MarketSegment market_segment) { + switch (market_segment) { + case em::PolicyData::MARKET_SEGMENT_UNSPECIFIED: + return MarketSegment::UNKNOWN; + case em::PolicyData::ENROLLED_EDUCATION: + return MarketSegment::EDUCATION; + case em::PolicyData::ENROLLED_ENTERPRISE: + return MarketSegment::ENTERPRISE; + } + NOTREACHED(); + return MarketSegment::UNKNOWN; +} + } // namespace BrowserPolicyConnectorChromeOS::BrowserPolicyConnectorChromeOS() @@ -283,6 +297,14 @@ return EnrollmentConfig(); } +MarketSegment BrowserPolicyConnectorChromeOS::GetEnterpriseMarketSegment() + const { + const em::PolicyData* policy = GetDevicePolicy(); + if (policy && policy->has_market_segment()) + return TranslateMarketSegment(policy->market_segment()); + return MarketSegment::UNKNOWN; +} + void BrowserPolicyConnectorChromeOS::SetUserPolicyDelegate( ConfigurationPolicyProvider* user_policy_provider) { global_user_cloud_policy_provider_->SetDelegate(user_policy_provider);
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h index e5c92f18..6efe825 100644 --- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h +++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h
@@ -151,6 +151,9 @@ return device_network_configuration_updater_.get(); } + // Returns device's market segment. + MarketSegment GetEnterpriseMarketSegment() const; + // The browser-global PolicyService is created before Profiles are ready, to // provide managed values for the local state PrefService. It includes a // policy provider that forwards policies from a delegate policy provider.
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos_browsertest.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos_browsertest.cc index e431238..d5ff7c9 100644 --- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos_browsertest.cc +++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos_browsertest.cc
@@ -64,4 +64,16 @@ connector->GetEnterpriseEnrollmentDomain()); } +IN_PROC_BROWSER_TEST_F(BrowserPolicyConnectorChromeOSTest, MarketSegment) { + BrowserPolicyConnectorChromeOS* connector = + g_browser_process->platform_part()->browser_policy_connector_chromeos(); + EXPECT_EQ(MarketSegment::UNKNOWN, connector->GetEnterpriseMarketSegment()); + + device_policy()->policy_data().set_market_segment( + enterprise_management::PolicyData::ENROLLED_EDUCATION); + RefreshDevicePolicy(); + WaitUntilPolicyLoaded(); + EXPECT_EQ(MarketSegment::EDUCATION, connector->GetEnterpriseMarketSegment()); +} + } // namespace policy
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc index 71a0c761..a4a1c747 100644 --- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -1049,6 +1049,19 @@ DecodeIntegerValue(container.rate_days()), nullptr); } } + + if (policy.has_device_unaffiliated_crostini_allowed()) { + const em::DeviceUnaffiliatedCrostiniAllowedProto& container( + policy.device_unaffiliated_crostini_allowed()); + if (container.has_device_unaffiliated_crostini_allowed()) { + policies->Set(key::kDeviceUnaffiliatedCrostiniAllowed, + POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, + POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>( + container.device_unaffiliated_crostini_allowed()), + nullptr); + } + } } } // namespace
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index 74ddb98..2cb2334f 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc
@@ -318,6 +318,7 @@ drive::prefs::kDisableDriveHostedFiles, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterStringPref(drive::prefs::kDriveFsProfileSalt, ""); + registry->RegisterBooleanPref(drive::prefs::kDriveFsPinnedMigrated, false); // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod // because they're just used to track the logout state of the device. registry->RegisterStringPref(prefs::kLanguageCurrentInputMethod, "");
diff --git a/chrome/browser/chromeos/profiles/profile_helper.h b/chrome/browser/chromeos/profiles/profile_helper.h index c1e088e..95593d9 100644 --- a/chrome/browser/chromeos/profiles/profile_helper.h +++ b/chrome/browser/chromeos/profiles/profile_helper.h
@@ -18,9 +18,7 @@ #include "components/user_manager/user_manager.h" #include "content/public/browser/browsing_data_remover.h" -class ArcAppTest; class IndependentOTRProfileManagerTest; -class SessionControllerClientTest; class Profile; namespace base { @@ -28,32 +26,6 @@ } namespace chromeos { -class QuickUnlockPrivateUnitTest; -} - -namespace extensions { -class ExtensionGarbageCollectorChromeOSUnitTest; -} - -namespace arc { -class ArcAuthServiceTest; -class ArcCertStoreBridgeTest; -class ArcSessionManagerTest; -} - -namespace ash { -class MultiUserWindowManagerChromeOSTest; -} // namespace ash - -namespace policy { -class DeviceStatusCollectorTest; -} // namespace policy - -namespace test { -class BrowserFinderChromeOSTest; -} // namespace test - -namespace chromeos { class FileFlusher; @@ -178,29 +150,27 @@ // Flushes all files of |profile|. void FlushProfile(Profile* profile); + // Associates |user| with profile with the same user_id, + // for GetUserByProfile() testing. + void SetProfileToUserMappingForTesting(user_manager::User* user); + + // Enables/disables testing GetUserByProfile() by always returning + // primary user. + static void SetAlwaysReturnPrimaryUserForTesting(bool value); + + // Associates |profile| with |user|, for GetProfileByUser() testing. + void SetUserToProfileMappingForTesting(const user_manager::User* user, + Profile* profile); + + // Removes |account_id| user from |user_to_profile_for_testing_| for testing. + void RemoveUserFromListForTesting(const AccountId& account_id); + private: // TODO(nkostylev): Create a test API class that will be the only one allowed // to access private test methods. - friend class CryptohomeAuthenticatorTest; - friend class DeviceSettingsTestBase; - friend class policy::DeviceStatusCollectorTest; - friend class ExistingUserControllerTest; - friend class extensions::ExtensionGarbageCollectorChromeOSUnitTest; friend class FakeChromeUserManager; - friend class KioskTest; friend class MockUserManager; - friend class MultiProfileUserControllerTest; - friend class PrinterDetectorAppSearchEnabledTest; friend class ProfileHelperTest; - friend class ProfileListChromeOSTest; - friend class ash::MultiUserWindowManagerChromeOSTest; - friend class arc::ArcSessionManagerTest; - friend class arc::ArcAuthServiceTest; - friend class arc::ArcCertStoreBridgeTest; - friend class chromeos::QuickUnlockPrivateUnitTest; - friend class ::ArcAppTest; - friend class ::SessionControllerClientTest; - friend class ::test::BrowserFinderChromeOSTest; friend class ::IndependentOTRProfileManagerTest; // Called when signin profile is cleared. @@ -217,26 +187,11 @@ // user_manager::UserManager::UserSessionStateObserver implementation: void ActiveUserHashChanged(const std::string& hash) override; - // Associates |user| with profile with the same user_id, - // for GetUserByProfile() testing. - void SetProfileToUserMappingForTesting(user_manager::User* user); - // Enables/disables testing code path in GetUserByProfile() like // always return primary user (when always_return_primary_user_for_testing is // set). static void SetProfileToUserForTestingEnabled(bool enabled); - // Enables/disables testing GetUserByProfile() by always returning - // primary user. - static void SetAlwaysReturnPrimaryUserForTesting(bool value); - - // Associates |profile| with |user|, for GetProfileByUser() testing. - void SetUserToProfileMappingForTesting(const user_manager::User* user, - Profile* profile); - - // Removes |account_id| user from |user_to_profile_for_testing_| for testing. - void RemoveUserFromListForTesting(const AccountId& account_id); - // Identifies path to active user profile on Chrome OS. std::string active_user_id_hash_;
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc index 7acb364..a30ea05a 100644 --- a/chrome/browser/chromeos/settings/device_settings_provider.cc +++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -675,6 +675,17 @@ new_values_cache->SetBoolean(kVirtualMachinesAllowed, false); } } + + if (policy.has_device_unaffiliated_crostini_allowed()) { + const em::DeviceUnaffiliatedCrostiniAllowedProto& container( + policy.device_unaffiliated_crostini_allowed()); + if (container.has_device_unaffiliated_crostini_allowed()) { + new_values_cache->SetValue( + kDeviceUnaffiliatedCrostiniAllowed, + std::make_unique<base::Value>( + container.device_unaffiliated_crostini_allowed())); + } + } } void DecodeLogUploadPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc index 269a898..cca2f80 100644 --- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc +++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -34,7 +34,7 @@ const ComponentConfig kConfigs[] = { {"epson-inkjet-printer-escpr", "2.1", "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"}, - {"cros-termina", "70.1", + {"cros-termina", "710.1", "e9d960f84f628e1f42d05de4046bb5b3154b6f1f65c08412c6af57a29aecaffb"}, {"rtanalytics-light", "5.0", "69f09d33c439c2ab55bbbe24b47ab55cb3f6c0bd1f1ef46eefea3216ec925038"},
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.cc b/chrome/browser/content_settings/tab_specific_content_settings.cc index 63e58720..68e0838 100644 --- a/chrome/browser/content_settings/tab_specific_content_settings.cc +++ b/chrome/browser/content_settings/tab_specific_content_settings.cc
@@ -72,6 +72,17 @@ return TabSpecificContentSettings::FromWebContents(web_contents); } +bool ShouldSendUpdatedContentSettingsRulesToRenderer( + ContentSettingsType content_type) { + // CONTENT_SETTINGS_TYPE_DEFAULT signals that multiple content settings may + // have been updated, e.g. by the PolicyProvider. This should always be sent + // to the renderer in case a relevant setting is updated. + if (content_type == CONTENT_SETTINGS_TYPE_DEFAULT) + return true; + + return RendererContentSettingRules::IsRendererContentSetting((content_type)); +} + } // namespace TabSpecificContentSettings::SiteDataObserver::SiteDataObserver( @@ -91,18 +102,14 @@ TabSpecificContentSettings::TabSpecificContentSettings(WebContents* tab) : content::WebContentsObserver(tab), + map_(HostContentSettingsMapFactory::GetForProfile( + Profile::FromBrowserContext(tab->GetBrowserContext()))), allowed_local_shared_objects_( Profile::FromBrowserContext(tab->GetBrowserContext())), blocked_local_shared_objects_( Profile::FromBrowserContext(tab->GetBrowserContext())), - geolocation_usages_state_( - HostContentSettingsMapFactory::GetForProfile( - Profile::FromBrowserContext(tab->GetBrowserContext())), - CONTENT_SETTINGS_TYPE_GEOLOCATION), - midi_usages_state_( - HostContentSettingsMapFactory::GetForProfile( - Profile::FromBrowserContext(tab->GetBrowserContext())), - CONTENT_SETTINGS_TYPE_MIDI_SYSEX), + geolocation_usages_state_(map_, CONTENT_SETTINGS_TYPE_GEOLOCATION), + midi_usages_state_(map_, CONTENT_SETTINGS_TYPE_MIDI_SYSEX), pending_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()), previous_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()), pending_protocol_handler_setting_(CONTENT_SETTING_DEFAULT), @@ -112,8 +119,7 @@ ClearContentSettingsExceptForNavigationRelatedSettings(); ClearNavigationRelatedContentSettings(); - observer_.Add(HostContentSettingsMapFactory::GetForProfile( - Profile::FromBrowserContext(tab->GetBrowserContext()))); + observer_.Add(map_); } TabSpecificContentSettings::~TabSpecificContentSettings() { @@ -757,49 +763,50 @@ const std::string& resource_identifier) { const ContentSettingsDetails details( primary_pattern, secondary_pattern, content_type, resource_identifier); - const GURL& visible_url = web_contents()->GetVisibleURL(); - if (details.update_all() || + if (!details.update_all() && // The visible URL is the URL in the URL field of a tab. // Currently this should be matched by the |primary_pattern|. - details.primary_pattern().Matches(visible_url)) { - Profile* profile = - Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - const HostContentSettingsMap* map = - HostContentSettingsMapFactory::GetForProfile(profile); - - if (content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC || - content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) { - const GURL media_origin = media_stream_access_origin(); - ContentSetting setting = map->GetContentSetting(media_origin, - media_origin, - content_type, - std::string()); - ContentSettingsStatus& status = content_settings_status_[content_type]; - status.allowed = setting == CONTENT_SETTING_ALLOW; - status.blocked = setting == CONTENT_SETTING_BLOCK; - } - - content::RenderProcessHost* process = - web_contents()->GetMainFrame()->GetProcess(); - - // Only send a message to the renderer if it is initialised and not dead. - // Otherwise, the IPC messages will be queued in the browser process, - // potentially causing large memory leaks. See https://crbug.com/875937. - if (!process->IsInitializedAndNotDead()) - return; - - // |channel| may be null in tests. - IPC::ChannelProxy* channel = process->GetChannel(); - if (!channel) - return; - - RendererContentSettingRules rules; - GetRendererContentSettingRules(map, &rules); - - chrome::mojom::RendererConfigurationAssociatedPtr rc_interface; - channel->GetRemoteAssociatedInterface(&rc_interface); - rc_interface->SetContentSettingRules(rules); + !details.primary_pattern().Matches(web_contents()->GetVisibleURL())) { + return; } + + if (content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC || + content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) { + const GURL media_origin = media_stream_access_origin(); + ContentSetting setting = map_->GetContentSetting( + media_origin, media_origin, content_type, std::string()); + ContentSettingsStatus& status = content_settings_status_[content_type]; + status.allowed = setting == CONTENT_SETTING_ALLOW; + status.blocked = setting == CONTENT_SETTING_BLOCK; + } + + if (!ShouldSendUpdatedContentSettingsRulesToRenderer(content_type)) + return; + + MaybeSendRendererContentSettingsRules(web_contents()); +} + +void TabSpecificContentSettings::MaybeSendRendererContentSettingsRules( + content::WebContents* web_contents) { + // Only send a message to the renderer if it is initialised and not dead. + // Otherwise, the IPC messages will be queued in the browser process, + // potentially causing large memory leaks. See https://crbug.com/875937. + content::RenderProcessHost* process = + web_contents->GetMainFrame()->GetProcess(); + if (!process->IsInitializedAndNotDead()) + return; + + // |channel| may be null in tests. + IPC::ChannelProxy* channel = process->GetChannel(); + if (!channel) + return; + + RendererContentSettingRules rules; + GetRendererContentSettingRules(map_, &rules); + + chrome::mojom::RendererConfigurationAssociatedPtr rc_interface; + channel->GetRemoteAssociatedInterface(&rc_interface); + rc_interface->SetContentSettingRules(rules); } void TabSpecificContentSettings::RenderFrameForInterstitialPageCreated( @@ -842,6 +849,19 @@ ClearContentSettingsChangedViaPageInfo(); } +void TabSpecificContentSettings::ReadyToCommitNavigation( + content::NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInMainFrame() || + navigation_handle->IsSameDocument()) { + return; + } + + // There may be content settings that were updated for the navigated URL. + // These would not have been sent before if we're navigating cross-origin. + // Ensure up to date rules are sent before navigation commits. + MaybeSendRendererContentSettingsRules(navigation_handle->GetWebContents()); +} + void TabSpecificContentSettings::DidFinishNavigation( content::NavigationHandle* navigation_handle) { if (!navigation_handle->IsInMainFrame() ||
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.h b/chrome/browser/content_settings/tab_specific_content_settings.h index c8a23be..b1b7759 100644 --- a/chrome/browser/content_settings/tab_specific_content_settings.h +++ b/chrome/browser/content_settings/tab_specific_content_settings.h
@@ -394,6 +394,9 @@ explicit TabSpecificContentSettings(content::WebContents* tab); + void MaybeSendRendererContentSettingsRules( + content::WebContents* web_contents); + // content::WebContentsObserver overrides. void RenderFrameForInterstitialPageCreated( content::RenderFrameHost* render_frame_host) override; @@ -401,6 +404,8 @@ content::RenderFrameHost* render_frame_host) override; void DidStartNavigation( content::NavigationHandle* navigation_handle) override; + void ReadyToCommitNavigation( + content::NavigationHandle* navigation_handle) override; void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; void AppCacheAccessed(const GURL& manifest_url, @@ -441,6 +446,9 @@ // Stores which content setting types actually have blocked content. std::map<ContentSettingsType, ContentSettingsStatus> content_settings_status_; + // Profile-bound, this will outlive this class (which is WebContents bound). + HostContentSettingsMap* map_; + // Stores the blocked/allowed cookies. LocalSharedObjectsContainer allowed_local_shared_objects_; LocalSharedObjectsContainer blocked_local_shared_objects_;
diff --git a/chrome/browser/devtools/device/tcp_device_provider.cc b/chrome/browser/devtools/device/tcp_device_provider.cc index 29d3868..476b172 100644 --- a/chrome/browser/devtools/device/tcp_device_provider.cc +++ b/chrome/browser/devtools/device/tcp_device_provider.cc
@@ -11,12 +11,16 @@ #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/devtools/device/adb/adb_client_socket.h" +#include "chrome/browser/net/system_network_context_manager.h" +#include "mojo/public/cpp/bindings/binding.h" #include "net/base/net_errors.h" #include "net/dns/host_resolver.h" #include "net/log/net_log_source.h" #include "net/log/net_log_with_source.h" #include "net/socket/tcp_client_socket.h" +#include "services/network/public/mojom/network_context.mojom.h" namespace { @@ -30,31 +34,34 @@ callback.Run(result, std::move(socket)); } -class ResolveHostAndOpenSocket final { +class ResolveHostAndOpenSocket final + : public network::mojom::ResolveHostClient { public: ResolveHostAndOpenSocket(const net::HostPortPair& address, - const AdbClientSocket::SocketCallback& callback) - : callback_(callback) { - host_resolver_ = net::HostResolver::CreateDefaultResolver(nullptr); - net::HostResolver::RequestInfo request_info(address); - int result = host_resolver_->Resolve( - request_info, net::DEFAULT_PRIORITY, &address_list_, - base::Bind(&ResolveHostAndOpenSocket::OnResolved, - base::Unretained(this)), - &request_, net::NetLogWithSource()); - if (result != net::ERR_IO_PENDING) - OnResolved(result); + const AdbClientSocket::SocketCallback& callback, + network::mojom::HostResolverPtr* host_resolver) + : callback_(callback), binding_(this) { + network::mojom::ResolveHostClientPtr client_ptr; + binding_.Bind(mojo::MakeRequest(&client_ptr)); + binding_.set_connection_error_handler( + base::BindOnce(&ResolveHostAndOpenSocket::OnComplete, + base::Unretained(this), net::ERR_FAILED, base::nullopt)); + + (*host_resolver)->ResolveHost(address, nullptr, std::move(client_ptr)); } private: - void OnResolved(int result) { - if (result < 0) { + // network::mojom::ResolveHostClient implementation: + void OnComplete( + int result, + const base::Optional<net::AddressList>& resolved_addresses) override { + if (result != net::OK) { RunSocketCallback(callback_, nullptr, result); delete this; return; } std::unique_ptr<net::StreamSocket> socket(new net::TCPClientSocket( - address_list_, NULL, NULL, net::NetLogSource())); + resolved_addresses.value(), nullptr, nullptr, net::NetLogSource())); net::StreamSocket* socket_ptr = socket.get(); net::CompletionCallback on_connect = base::Bind(&RunSocketCallback, callback_, base::Passed(&socket)); @@ -64,10 +71,8 @@ delete this; } - std::unique_ptr<net::HostResolver> host_resolver_; - std::unique_ptr<net::HostResolver::Request> request_; - net::AddressList address_list_; AdbClientSocket::SocketCallback callback_; + mojo::Binding<network::mojom::ResolveHostClient> binding_; }; } // namespace @@ -123,7 +128,14 @@ int port; base::StringToInt(socket_name, &port); net::HostPortPair host_port(serial, port); - new ResolveHostAndOpenSocket(host_port, callback); + + // OpenSocket() is run on the devtools ADB thread, while TCPDeviceProvider is + // created on the UI thread, so do any initialization of |host_resolver_| + // here. + if (!host_resolver_) { + InitializeHostResolver(); + } + new ResolveHostAndOpenSocket(host_port, callback, &host_resolver_); } void TCPDeviceProvider::ReleaseDevice(const std::string& serial) { @@ -138,3 +150,19 @@ TCPDeviceProvider::~TCPDeviceProvider() { } + +void TCPDeviceProvider::InitializeHostResolver() { + content::BrowserThread::PostTask( + content::BrowserThread::UI, FROM_HERE, + base::BindOnce(&TCPDeviceProvider::InitializeHostResolverOnUI, this, + mojo::MakeRequest(&host_resolver_))); + host_resolver_.set_connection_error_handler(base::BindOnce( + &TCPDeviceProvider::InitializeHostResolver, base::Unretained(this))); +} + +void TCPDeviceProvider::InitializeHostResolverOnUI( + network::mojom::HostResolverRequest request) { + g_browser_process->system_network_context_manager() + ->GetContext() + ->CreateHostResolver(std::move(request)); +}
diff --git a/chrome/browser/devtools/device/tcp_device_provider.h b/chrome/browser/devtools/device/tcp_device_provider.h index 25ce2a81..5f1dae6 100644 --- a/chrome/browser/devtools/device/tcp_device_provider.h +++ b/chrome/browser/devtools/device/tcp_device_provider.h
@@ -39,8 +39,12 @@ private: ~TCPDeviceProvider() override; + void InitializeHostResolver(); + void InitializeHostResolverOnUI(network::mojom::HostResolverRequest request); + HostPortSet targets_; base::Closure release_callback_; + network::mojom::HostResolverPtr host_resolver_; }; #endif // CHROME_BROWSER_DEVTOOLS_DEVICE_TCP_DEVICE_PROVIDER_H_
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc index da1cc938..b5c57ca94 100644 --- a/chrome/browser/download/download_commands.cc +++ b/chrome/browser/download/download_commands.cc
@@ -12,6 +12,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" +#include "base/threading/scoped_blocking_call.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/download/download_crx_util.h" @@ -69,7 +70,8 @@ } void StartDecoding() { - base::AssertBlockingAllowed(); + base::ScopedBlockingCall scoped_blocking_call( + base::BlockingType::WILL_BLOCK); // Re-check the filesize since the file may be modified after downloaded. int64_t filesize;
diff --git a/chrome/browser/download/image_thumbnail_request.cc b/chrome/browser/download/image_thumbnail_request.cc index 8c82a9c..a8471ee 100644 --- a/chrome/browser/download/image_thumbnail_request.cc +++ b/chrome/browser/download/image_thumbnail_request.cc
@@ -8,7 +8,7 @@ #include "base/files/file_util.h" #include "base/task/post_task.h" -#include "base/threading/thread_restrictions.h" +#include "base/threading/scoped_blocking_call.h" #include "content/public/browser/browser_thread.h" #include "skia/ext/image_operations.h" @@ -18,7 +18,7 @@ const int64_t kMaxImageSize = 10 * 1024 * 1024; // 10 MB std::string LoadImageData(const base::FilePath& path) { - base::AssertBlockingAllowed(); + base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::WILL_BLOCK); // Confirm that the file's size is within our threshold. int64_t file_size;
diff --git a/chrome/browser/extensions/active_tab_permission_granter.cc b/chrome/browser/extensions/active_tab_permission_granter.cc index 1b291578..98c3f6a 100644 --- a/chrome/browser/extensions/active_tab_permission_granter.cc +++ b/chrome/browser/extensions/active_tab_permission_granter.cc
@@ -199,7 +199,8 @@ // activeTab consumption (we likely need to build some UI around it first). // However, features::kRuntimeHostPermissions is all-but unusable without // this behaviour. - if (base::FeatureList::IsEnabled(features::kRuntimeHostPermissions)) { + if (base::FeatureList::IsEnabled( + extensions_features::kRuntimeHostPermissions)) { const content::NavigationEntry* navigation_entry = web_contents()->GetController().GetVisibleEntry(); if (!navigation_entry ||
diff --git a/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc b/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc index eb489645..155a2bb 100644 --- a/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc +++ b/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc
@@ -32,6 +32,7 @@ #include "base/feature_list.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" +#include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/login/lock/screen_locker.h" #include "chrome/browser/chromeos/printing/cups_printers_manager.h" @@ -120,6 +121,9 @@ return result; } +constexpr char kCrostiniNotAvailableForCurrentUserError[] = + "Crostini is not available for the current user"; + #else constexpr char kOnlyAvailableOnChromeOSError[] = "Only available on ChromeOS"; @@ -670,6 +674,28 @@ #endif } +AutotestPrivateSetCrostiniEnabledFunction:: + ~AutotestPrivateSetCrostiniEnabledFunction() = default; + +ExtensionFunction::ResponseAction +AutotestPrivateSetCrostiniEnabledFunction::Run() { + DVLOG(1) << "AutotestPrivateSetCrostiniEnabledFunction"; +#if defined(OS_CHROMEOS) + std::unique_ptr<api::autotest_private::SetCrostiniEnabled::Params> params( + api::autotest_private::SetCrostiniEnabled::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + if (!IsCrostiniUIAllowedForProfile(ProfileManager::GetActiveUserProfile())) { + return RespondNow(Error(kCrostiniNotAvailableForCurrentUserError)); + } + // Set the preference to indicate Crostini is enabled/disabled. + ProfileManager::GetActiveUserProfile()->GetPrefs()->SetBoolean( + crostini::prefs::kCrostiniEnabled, params->enabled); + return RespondNow(NoArguments()); +#else + return RespondNow(Error(kOnlyAvailableOnChromeOSError)); +#endif +} + AutotestPrivateRunCrostiniInstallerFunction:: ~AutotestPrivateRunCrostiniInstallerFunction() = default; @@ -678,7 +704,7 @@ DVLOG(1) << "AutotestPrivateInstallCrostiniFunction"; #if defined(OS_CHROMEOS) if (!IsCrostiniUIAllowedForProfile(ProfileManager::GetActiveUserProfile())) { - return RespondNow(Error("Crostini is not available for the current user")); + return RespondNow(Error(kCrostiniNotAvailableForCurrentUserError)); } // Run GUI installer which will install crostini vm / container and // start terminal app on completion. After starting the installer,
diff --git a/chrome/browser/extensions/api/autotest_private/autotest_private_api.h b/chrome/browser/extensions/api/autotest_private/autotest_private_api.h index 462752a..f087be3 100644 --- a/chrome/browser/extensions/api/autotest_private/autotest_private_api.h +++ b/chrome/browser/extensions/api/autotest_private/autotest_private_api.h
@@ -241,6 +241,20 @@ ResponseAction Run() override; }; +class AutotestPrivateSetCrostiniEnabledFunction + : public UIThreadExtensionFunction { + public: + AutotestPrivateSetCrostiniEnabledFunction() = default; + DECLARE_EXTENSION_FUNCTION("autotestPrivate.setCrostiniEnabled", + AUTOTESTPRIVATE_SETCROSTINIENABLED) + + private: + ~AutotestPrivateSetCrostiniEnabledFunction() override; + ResponseAction Run() override; + + DISALLOW_COPY_AND_ASSIGN(AutotestPrivateSetCrostiniEnabledFunction); +}; + class AutotestPrivateRunCrostiniInstallerFunction : public UIThreadExtensionFunction { public:
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc b/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc index e2f2a000..461d068 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc
@@ -41,7 +41,7 @@ URLPattern::SCHEME_FILE; URLPattern url_pattern(kAllowedSchemes); URLPattern::ParseResult result = url_pattern.Parse(pattern_str); - if (result != URLPattern::PARSE_SUCCESS) { + if (result != URLPattern::ParseResult::kSuccess) { *error = URLPattern::GetParseResultString(result); return ContentSettingsPattern(); } else {
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_store.cc b/chrome/browser/extensions/api/content_settings/content_settings_store.cc index 5a21d7d..3c3bbd96 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_store.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_store.cc
@@ -10,15 +10,20 @@ #include <utility> #include "base/debug/alias.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/strings/string_util.h" #include "base/values.h" #include "chrome/browser/extensions/api/content_settings/content_settings_api_constants.h" #include "chrome/browser/extensions/api/content_settings/content_settings_helpers.h" +#include "chrome/common/chrome_features.h" +#include "components/content_settings/core/browser/content_settings_info.h" #include "components/content_settings/core/browser/content_settings_origin_identifier_value_map.h" +#include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/browser/content_settings_rule.h" #include "components/content_settings/core/browser/content_settings_utils.h" +#include "components/content_settings/core/browser/website_settings_info.h" #include "components/content_settings/core/common/content_settings_utils.h" #include "content/public/browser/browser_thread.h" @@ -336,6 +341,19 @@ continue; } + const content_settings::ContentSettingsInfo* info = + content_settings::ContentSettingsRegistry::GetInstance()->Get( + content_settings_type); + if (primary_pattern != secondary_pattern && + secondary_pattern != ContentSettingsPattern::Wildcard() && + !info->website_settings_info()->SupportsEmbeddedExceptions() && + base::FeatureList::IsEnabled(::features::kPermissionDelegation)) { + // Some types may have had embedded exceptions written even though they + // aren't supported. This will implicitly delete these old settings from + // the pref store when it is written back. + continue; + } + std::string resource_identifier; dict->GetString(content_settings_api_constants::kResourceIdentifierKey, &resource_identifier);
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc b/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc index 7a951d7..439eb61 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc
@@ -8,8 +8,10 @@ #include <memory> +#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/extensions/api/content_settings/content_settings_api_constants.h" +#include "chrome/common/chrome_features.h" #include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/browser/content_settings_rule.h" #include "components/content_settings/core/browser/content_settings_utils.h" @@ -331,4 +333,84 @@ store()->RemoveObserver(&observer); } +// Test that embedded patterns are properly removed. +TEST_F(ContentSettingsStoreTest, RemoveEmbedded) { + content_settings::ContentSettingsRegistry::GetInstance(); + + ::testing::StrictMock<MockContentSettingsStoreObserver> observer; + store()->AddObserver(&observer); + + GURL primary_url("http://www.youtube.com"); + GURL secondary_url("http://www.google.com"); + + // Register first extension. + std::string ext_id("my_extension"); + RegisterExtension(ext_id); + + // Set setting via a list. + ContentSettingsPattern primary_pattern = + ContentSettingsPattern::FromURL(primary_url); + ContentSettingsPattern secondary_pattern = + ContentSettingsPattern::FromURL(secondary_url); + EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false)).Times(4); + + // Build a preference list in JSON format. + base::ListValue pref_list; + auto dict_value = std::make_unique<base::DictionaryValue>(); + dict_value->SetString(keys::kPrimaryPatternKey, primary_pattern.ToString()); + dict_value->SetString(keys::kSecondaryPatternKey, + secondary_pattern.ToString()); + dict_value->SetString(keys::kContentSettingsTypeKey, "cookies"); + dict_value->SetString(keys::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); + + dict_value = std::make_unique<base::DictionaryValue>(); + dict_value->SetString(keys::kPrimaryPatternKey, primary_pattern.ToString()); + dict_value->SetString(keys::kSecondaryPatternKey, + secondary_pattern.ToString()); + dict_value->SetString(keys::kContentSettingsTypeKey, "geolocation"); + dict_value->SetString(keys::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); + + { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + ::features::kPermissionDelegation); + store()->SetExtensionContentSettingFromList(ext_id, &pref_list, + kExtensionPrefsScopeRegular); + + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetContentSettingFromStore(store(), primary_url, secondary_url, + CONTENT_SETTINGS_TYPE_COOKIES, + std::string(), false)); + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetContentSettingFromStore(store(), primary_url, secondary_url, + CONTENT_SETTINGS_TYPE_GEOLOCATION, + std::string(), false)); + + store()->ClearContentSettingsForExtension(ext_id, + kExtensionPrefsScopeRegular); + } + + { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kPermissionDelegation); + store()->SetExtensionContentSettingFromList(ext_id, &pref_list, + kExtensionPrefsScopeRegular); + + // The embedded geolocation pattern should be removed but cookies kept. + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetContentSettingFromStore(store(), primary_url, secondary_url, + CONTENT_SETTINGS_TYPE_COOKIES, + std::string(), false)); + EXPECT_EQ(CONTENT_SETTING_DEFAULT, + GetContentSettingFromStore(store(), primary_url, secondary_url, + CONTENT_SETTINGS_TYPE_GEOLOCATION, + std::string(), false)); + } + + Mock::VerifyAndClear(&observer); + store()->RemoveObserver(&observer); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc index f748cf4..2a4dc7a 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -275,7 +275,7 @@ URLPattern::SCHEME_FILE; URLPattern pattern(kValidRuntimePermissionSchemes); - if (pattern.Parse(pattern_str) != URLPattern::PARSE_SUCCESS) + if (pattern.Parse(pattern_str) != URLPattern::ParseResult::kSuccess) return base::nullopt; // We don't allow adding paths for permissions, because they aren't meaningful
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc index f5af643..17d2e80 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -382,7 +382,8 @@ TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateUpdateExtensionConfiguration) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); // Sadly, we need a "real" directory here, because toggling prefs causes // a reload (which needs a path). const Extension* extension = LoadUnpackedExtension(); @@ -1320,7 +1321,8 @@ TEST_F(DeveloperPrivateApiUnitTest, GrantHostPermission) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("<all_urls>").Build(); @@ -1379,7 +1381,8 @@ TEST_F(DeveloperPrivateApiUnitTest, RemoveHostPermission) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("<all_urls>").Build(); @@ -1445,7 +1448,8 @@ TEST_F(DeveloperPrivateApiUnitTest, UpdateHostAccess) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("<all_urls>").Build(); @@ -1467,7 +1471,8 @@ TEST_F(DeveloperPrivateApiUnitTest, UpdateHostAccess_SpecificSitesRemovedOnTransitionToOnClick) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("<all_urls>").Build(); @@ -1510,7 +1515,8 @@ TEST_F(DeveloperPrivateApiUnitTest, UpdateHostAccess_SpecificSitesRemovedOnTransitionToAllSites) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("<all_urls>").Build(); @@ -1536,7 +1542,8 @@ TEST_F(DeveloperPrivateApiUnitTest, UpdateHostAccess_GrantScopeGreaterThanRequestedScope) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = ExtensionBuilder("test").AddPermission("http://*/*").Build();
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc index 9d8496f..07743cc3 100644 --- a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc +++ b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -399,7 +399,8 @@ TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissions) { // Start with the switch enabled. auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list->InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list->InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> all_urls_extension = CreateExtension( "all_urls", ListBuilder().Append(kAllHostsPermission).Build(), @@ -466,7 +467,8 @@ TEST_F(ExtensionInfoGeneratorUnitTest, RuntimeHostPermissionsBeyondRequestedScope) { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); scoped_refptr<const Extension> extension = CreateExtension("extension", ListBuilder().Append("http://*/*").Build(),
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc index f105732..634e757 100644 --- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc +++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
@@ -32,6 +32,7 @@ : custom_dictionary_(nullptr), context_(context), listening_spellcheck_(false), + listening_input_method_(false), profile_added_(false) { // Register with the event router so we know when renderers are listening to // our events. We first check and see if there *is* an event router, because @@ -45,6 +46,10 @@ language_settings_private::OnSpellcheckDictionariesChanged::kEventName); event_router->RegisterObserver(this, language_settings_private::OnCustomDictionaryChanged::kEventName); + event_router->RegisterObserver( + this, language_settings_private::OnInputMethodAdded::kEventName); + event_router->RegisterObserver( + this, language_settings_private::OnInputMethodRemoved::kEventName); // SpellcheckService cannot be created until Profile::DoFinalInit() has been // called. http://crbug.com/171406 @@ -56,10 +61,14 @@ GetPrefs()); StartOrStopListeningForSpellcheckChanges(); +#if defined(OS_CHROMEOS) + StartOrStopListeningForInputMethodChanges(); +#endif // defined(OS_CHROMEOS) } LanguageSettingsPrivateDelegate::~LanguageSettingsPrivateDelegate() { DCHECK(!listening_spellcheck_); + DCHECK(!listening_input_method_); pref_change_registrar_.RemoveAll(); notification_registrar_.RemoveAll(); } @@ -101,6 +110,16 @@ RemoveDictionaryObservers(); listening_spellcheck_ = false; } + +#if defined(OS_CHROMEOS) + if (listening_input_method_) { + auto* input_method_manager = + chromeos::input_method::InputMethodManager::Get(); + if (input_method_manager) + input_method_manager->RemoveObserver(this); + listening_input_method_ = false; + } +#endif // defined(OS_CHROMEOS) } void LanguageSettingsPrivateDelegate::OnListenerAdded( @@ -111,13 +130,26 @@ details.event_name == language_settings_private::OnCustomDictionaryChanged::kEventName) { StartOrStopListeningForSpellcheckChanges(); + return; } +#if defined(OS_CHROMEOS) + if (details.event_name == + language_settings_private::OnInputMethodAdded::kEventName || + details.event_name == + language_settings_private::OnInputMethodRemoved::kEventName) { + StartOrStopListeningForInputMethodChanges(); + return; + } +#endif // defined(OS_CHROMEOS) } void LanguageSettingsPrivateDelegate::OnListenerRemoved( const EventListenerInfo& details) { // Stop listening to events if there are no more listeners. StartOrStopListeningForSpellcheckChanges(); +#if defined(OS_CHROMEOS) + StartOrStopListeningForInputMethodChanges(); +#endif // defined(OS_CHROMEOS) } void LanguageSettingsPrivateDelegate::Observe( @@ -128,6 +160,37 @@ StartOrStopListeningForSpellcheckChanges(); } +#if defined(OS_CHROMEOS) +void LanguageSettingsPrivateDelegate::InputMethodChanged( + chromeos::input_method::InputMethodManager* manager, + Profile* profile, + bool show_message) { + // Nothing to do. +} + +void LanguageSettingsPrivateDelegate::OnInputMethodExtensionAdded( + const std::string& extension_id) { + std::unique_ptr<base::ListValue> args( + language_settings_private::OnInputMethodAdded::Create(extension_id)); + std::unique_ptr<extensions::Event> extension_event(new extensions::Event( + events::LANGUAGE_SETTINGS_PRIVATE_ON_INPUT_METHOD_ADDED, + language_settings_private::OnInputMethodAdded::kEventName, + std::move(args))); + EventRouter::Get(context_)->BroadcastEvent(std::move(extension_event)); +} + +void LanguageSettingsPrivateDelegate::OnInputMethodExtensionRemoved( + const std::string& extension_id) { + std::unique_ptr<base::ListValue> args( + language_settings_private::OnInputMethodRemoved::Create(extension_id)); + std::unique_ptr<extensions::Event> extension_event(new extensions::Event( + events::LANGUAGE_SETTINGS_PRIVATE_ON_INPUT_METHOD_REMOVED, + language_settings_private::OnInputMethodRemoved::kEventName, + std::move(args))); + EventRouter::Get(context_)->BroadcastEvent(std::move(extension_event)); +} +#endif // defined(OS_CHROMEOS) + void LanguageSettingsPrivateDelegate::OnHunspellDictionaryInitialized( const std::string& language) { BroadcastDictionariesChangedEvent(); @@ -229,6 +292,29 @@ listening_spellcheck_ = should_listen; } +#if defined(OS_CHROMEOS) +void LanguageSettingsPrivateDelegate:: + StartOrStopListeningForInputMethodChanges() { + EventRouter* event_router = EventRouter::Get(context_); + bool should_listen = + event_router->HasEventListener( + language_settings_private::OnInputMethodAdded::kEventName) || + event_router->HasEventListener( + language_settings_private::OnInputMethodRemoved::kEventName); + + auto* input_method_manager = + chromeos::input_method::InputMethodManager::Get(); + if (input_method_manager) { + if (should_listen && !listening_input_method_) + input_method_manager->AddObserver(this); + else if (!should_listen && listening_input_method_) + input_method_manager->RemoveObserver(this); + } + + listening_input_method_ = should_listen; +} +#endif // defined(OS_CHROMEOS) + void LanguageSettingsPrivateDelegate::RetryDownloadHunspellDictionary( const std::string& language) { for (const base::WeakPtr<SpellcheckHunspellDictionary> dictionary :
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h index 873dec9..17098f4 100644 --- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h +++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_LANGUAGE_SETTINGS_PRIVATE_LANGUAGE_SETTINGS_PRIVATE_DELEGATE_H_ #define CHROME_BROWSER_EXTENSIONS_API_LANGUAGE_SETTINGS_PRIVATE_LANGUAGE_SETTINGS_PRIVATE_DELEGATE_H_ +#include <string> #include <vector> #include "base/macros.h" @@ -18,6 +19,10 @@ #include "content/public/browser/notification_registrar.h" #include "extensions/browser/event_router.h" +#if defined(OS_CHROMEOS) +#include "ui/base/ime/chromeos/input_method_manager.h" +#endif + namespace content { class BrowserContext; } @@ -30,6 +35,9 @@ : public KeyedService, public EventRouter::Observer, public content::NotificationObserver, +#if defined(OS_CHROMEOS) + public chromeos::input_method::InputMethodManager::Observer, +#endif // defined(OS_CHROMEOS) public SpellcheckHunspellDictionary::Observer, public SpellcheckCustomDictionary::Observer { public: @@ -60,6 +68,15 @@ void OnListenerAdded(const EventListenerInfo& details) override; void OnListenerRemoved(const EventListenerInfo& details) override; +#if defined(OS_CHROMEOS) + // chromeos::input_method::InputMethodManager::Observer implementation. + void InputMethodChanged(chromeos::input_method::InputMethodManager* manager, + Profile* profile, + bool show_message) override; + void OnInputMethodExtensionAdded(const std::string& extension_id) override; + void OnInputMethodExtensionRemoved(const std::string& extension_id) override; +#endif // defined(OS_CHROMEOS) + // SpellcheckHunspellDictionary::Observer implementation. void OnHunspellDictionaryInitialized(const std::string& language) override; void OnHunspellDictionaryDownloadBegin(const std::string& language) override; @@ -88,6 +105,13 @@ // any observers. void StartOrStopListeningForSpellcheckChanges(); +#if defined(OS_CHROMEOS) + // If there are any JavaScript listeners registered for input method events, + // ensures we are registered for change notifications. Otherwise, unregisters + // any observers. + void StartOrStopListeningForInputMethodChanges(); +#endif // defined(OS_CHROMEOS) + // Handles the preference for which languages should be used for spellcheck // by resetting the dictionaries and broadcasting an event. void OnSpellcheckDictionariesChanged(); @@ -110,6 +134,8 @@ // True if there are observers listening for spellcheck events. bool listening_spellcheck_; + // True if there are observers listening for input method events. + bool listening_input_method_; // True if the profile has finished initializing. bool profile_added_;
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc index b5106121..07d05cf7 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc +++ b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
@@ -119,7 +119,7 @@ URLPattern pattern(URLPattern::SCHEME_EXTENSION); URLPattern::ParseResult result = pattern.Parse(pattern_string); - if (result != URLPattern::PARSE_SUCCESS) { + if (result != URLPattern::ParseResult::kSuccess) { *error_message = "Failed to parse pattern \"" + pattern_string + "\": " + URLPattern::GetParseResultString(result); return false;
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc b/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc index d50b84f..0df71bec 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc +++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc
@@ -134,7 +134,7 @@ allowed_schemes &= ~URLPattern::SCHEME_FILE; URLPattern origin(allowed_schemes); URLPattern::ParseResult parse_result = origin.Parse(*it); - if (URLPattern::PARSE_SUCCESS != parse_result) { + if (URLPattern::ParseResult::kSuccess != parse_result) { *error = ErrorUtils::FormatErrorMessage( kInvalidOrigin, *it,
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index afc62e6..cd8f6d3c 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -62,6 +62,7 @@ #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/storage_partition.h" @@ -858,11 +859,13 @@ EXPECT_TRUE(listener2.WaitUntilSatisfied()); } -// Tests that webRequest works with features::kRuntimeHostPermissions. +// Tests that webRequest works with +// extensions_features::kRuntimeHostPermissions. IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestWithWithheldPermissions) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); content::SetupCrossSiteRedirector(embedded_test_server()); ASSERT_TRUE(embedded_test_server()->Start()); @@ -973,7 +976,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestWithheldPermissionsCrossOriginRequests) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); content::SetupCrossSiteRedirector(embedded_test_server()); ASSERT_TRUE(embedded_test_server()->Start()); @@ -1293,6 +1297,35 @@ << message_; } +// Tests the WebRequestProxyingWebSocket does not crash when there is a +// connection error before AddChannelRequest is called. Regression test for +// http://crbug.com/878574. +IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, + WebSocketConnectionErrorBeforeChannelRequest) { + if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) + return; + + auto* web_request_api = + extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get( + profile()); + web_request_api->OnListenerAdded( + EventListenerInfo("name", "id1", GURL(), profile())); + + network::mojom::WebSocketPtr web_socket; + network::mojom::WebSocketRequest request = mojo::MakeRequest(&web_socket); + network::mojom::AuthenticationHandlerPtr auth_handler; + content::RenderFrameHost* host = + browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(); + web_request_api->MaybeProxyWebSocket(host, &request, &auth_handler); + content::BrowserContext::GetDefaultStoragePartition(profile()) + ->GetNetworkContext() + ->CreateWebSocket(std::move(request), network::mojom::kBrowserProcessId, + host->GetProcess()->GetID(), + url::Origin::Create(GURL("http://example.com")), + std::move(auth_handler)); + web_socket.reset(); +} + // Test behavior when intercepting requests from a browser-initiated url fetch. IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestURLLoaderInterception) { @@ -1959,7 +1992,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTestWithManagementPolicy, WebRequestProtectedByPolicy) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); // Host protected by policy. const std::string protected_domain = "example.com";
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc index 0bb5252..64673d9 100644 --- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc +++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
@@ -578,7 +578,7 @@ BrowserThread::UI, FROM_HERE, base::BindOnce(&WebRtcLoggingHandlerHost::StartEventLogging, webrtc_logging_handler_host, params->peer_connection_id, - params->max_log_size_bytes, callback)); + params->max_log_size_bytes, params->web_app_id, callback)); return true; }
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc index 8e336e0..ec714ee 100644 --- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc +++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -67,6 +67,8 @@ static const char kTestLoggingSessionIdValue[] = "0123456789abcdef"; static const char kTestLoggingUrl[] = "dummy url string"; +constexpr int kWebAppId = 15; // Arbitrary. + std::string ParamsToString(const base::ListValue& parameters) { std::string parameter_string; EXPECT_TRUE(base::JSONWriter::Write(parameters, ¶meter_string)); @@ -323,6 +325,7 @@ // TODO(crbug.com/829419): Return success/failure of the executed function. void StartEventLogging(const std::string& peerConnectionId, int maxLogSizeBytes, + int webAppId, bool expect_success, const std::string& expected_error = std::string()) { DCHECK_EQ(expect_success, expected_error.empty()); @@ -331,6 +334,7 @@ AppendTabIdAndUrl(¶ms); params.AppendString(peerConnectionId); params.AppendInteger(maxLogSizeBytes); + params.AppendInteger(webAppId); if (expect_success) { scoped_refptr<WebrtcLoggingPrivateStartEventLoggingFunction> function( @@ -705,6 +709,7 @@ bool WebRtcEventLogCollectionPolicy() const override { return true; } }; +// Also covers StartEventLoggingForLegalWebAppIdSucceeds scenario. IN_PROC_BROWSER_TEST_F( WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled, StartEventLoggingForKnownPeerConnectionSucceeds) { @@ -712,7 +717,8 @@ SetUpPeerConnection(peer_connection_id); const int max_size_bytes = kMaxRemoteLogFileSizeBytes; constexpr bool expect_success = true; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success); } IN_PROC_BROWSER_TEST_F( @@ -724,8 +730,8 @@ constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureUnlimitedSizeDisallowed; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } IN_PROC_BROWSER_TEST_F( @@ -736,8 +742,8 @@ const int max_size_bytes = 1; constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureMaxSizeTooSmall; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } IN_PROC_BROWSER_TEST_F( @@ -748,8 +754,8 @@ const int max_size_bytes = kMaxRemoteLogFileSizeBytes + 1; constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureMaxSizeTooLarge; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } IN_PROC_BROWSER_TEST_F( @@ -761,8 +767,8 @@ constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureUnknownOrInactivePeerConnection; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } IN_PROC_BROWSER_TEST_F( @@ -776,8 +782,8 @@ constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureUnknownOrInactivePeerConnection; - StartEventLogging(peer_connection_id_2, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id_2, max_size_bytes, kWebAppId, + expect_success, error_message); } IN_PROC_BROWSER_TEST_F( @@ -791,18 +797,51 @@ // First call succeeds. { constexpr bool expect_success = true; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success); } // Second call fails. { constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureAlreadyLogging; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } } +IN_PROC_BROWSER_TEST_F( + WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled, + StartEventLoggingForTooLowWebAppIdFails) { + const std::string peer_connection_id = "id"; + SetUpPeerConnection(peer_connection_id); + const int max_size_bytes = kMaxRemoteLogFileSizeBytes; + const size_t web_app_id = + webrtc_event_logging::kMinWebRtcEventLogWebAppId - 1; + ASSERT_LT(web_app_id, webrtc_event_logging::kMinWebRtcEventLogWebAppId); + constexpr bool expect_success = false; + const std::string error_message = + webrtc_event_logging::kStartRemoteLoggingFailureIllegalWebAppId; + StartEventLogging(peer_connection_id, max_size_bytes, web_app_id, + expect_success, error_message); +} + +IN_PROC_BROWSER_TEST_F( + WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled, + StartEventLoggingForTooHighWebAppIdFails) { + const std::string peer_connection_id = "id"; + SetUpPeerConnection(peer_connection_id); + const int max_size_bytes = kMaxRemoteLogFileSizeBytes; + const size_t web_app_id = + webrtc_event_logging::kMaxWebRtcEventLogWebAppId + 1; + ASSERT_GT(web_app_id, webrtc_event_logging::kMaxWebRtcEventLogWebAppId); + constexpr bool expect_success = false; + const std::string error_message = + webrtc_event_logging::kStartRemoteLoggingFailureIllegalWebAppId; + StartEventLogging(peer_connection_id, max_size_bytes, web_app_id, + expect_success, error_message); +} + // Testing with either the feature or the policy disabled (not both). class WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled : public WebrtcLoggingPrivateApiStartEventLoggingTestBase, @@ -836,8 +875,8 @@ const int max_size_bytes = kMaxRemoteLogFileSizeBytes; constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureFeatureDisabled; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } INSTANTIATE_TEST_CASE_P( @@ -877,8 +916,8 @@ const int max_size_bytes = kMaxRemoteLogFileSizeBytes; constexpr bool expect_success = false; const std::string error_message = kStartRemoteLoggingFailureFeatureDisabled; - StartEventLogging(peer_connection_id, max_size_bytes, expect_success, - error_message); + StartEventLogging(peer_connection_id, max_size_bytes, kWebAppId, + expect_success, error_message); } #endif // !defined(OS_ANDROID)
diff --git a/chrome/browser/extensions/api_binding_perf_browsertest.cc b/chrome/browser/extensions/api_binding_perf_browsertest.cc index 6bf3f26f..45ac31b 100644 --- a/chrome/browser/extensions/api_binding_perf_browsertest.cc +++ b/chrome/browser/extensions/api_binding_perf_browsertest.cc
@@ -37,10 +37,12 @@ void SetUp() override { if (GetParam() == NATIVE_BINDINGS) { - scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kNativeCrxBindings); } else { DCHECK_EQ(JAVASCRIPT_BINDINGS, GetParam()); - scoped_feature_list_.InitAndDisableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndDisableFeature( + extensions_features::kNativeCrxBindings); } ExtensionBrowserTest::SetUp(); }
diff --git a/chrome/browser/extensions/bookmark_app_helper.cc b/chrome/browser/extensions/bookmark_app_helper.cc index 0ba3933..da31673 100644 --- a/chrome/browser/extensions/bookmark_app_helper.cc +++ b/chrome/browser/extensions/bookmark_app_helper.cc
@@ -518,12 +518,13 @@ web_app_info_ = web_app_info; if (is_policy_installed_app_) - crx_installer_->set_install_source(Manifest::EXTERNAL_POLICY); + crx_installer_->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD); - // InstallWebApp will OR the creation flags with FROM_BOOKMARK. - crx_installer_->set_creation_flags(is_default_app_ - ? Extension::WAS_INSTALLED_BY_DEFAULT - : Extension::NO_FLAGS); + if (is_default_app_) { + crx_installer_->set_install_source(Manifest::EXTERNAL_PREF_DOWNLOAD); + // InstallWebApp will OR the creation flags with FROM_BOOKMARK. + crx_installer_->set_creation_flags(Extension::WAS_INSTALLED_BY_DEFAULT); + } crx_installer_->InstallWebApp(web_app_info_);
diff --git a/chrome/browser/extensions/bookmark_app_helper_unittest.cc b/chrome/browser/extensions/bookmark_app_helper_unittest.cc index d5735c4..a8576ad 100644 --- a/chrome/browser/extensions/bookmark_app_helper_unittest.cc +++ b/chrome/browser/extensions/bookmark_app_helper_unittest.cc
@@ -237,6 +237,7 @@ ASSERT_TRUE(helper.extension()); EXPECT_TRUE(helper.extension()->from_bookmark()); EXPECT_TRUE(helper.extension()->was_installed_by_default()); + EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, helper.extension()->location()); EXPECT_FALSE(Manifest::IsPolicyLocation(helper.extension()->location())); }
diff --git a/chrome/browser/extensions/content_verifier_browsertest.cc b/chrome/browser/extensions/content_verifier_browsertest.cc index aa263f1..45fe588 100644 --- a/chrome/browser/extensions/content_verifier_browsertest.cc +++ b/chrome/browser/extensions/content_verifier_browsertest.cc
@@ -51,7 +51,7 @@ void SetUp() override { scoped_feature_list_.InitAndDisableFeature( - features::kNewExtensionUpdaterService); + extensions_features::kNewExtensionUpdaterService); // Override content verification mode before ExtensionSystemImpl initializes // ChromeContentVerifierDelegate. ChromeContentVerifierDelegate::SetDefaultModeForTesting(
diff --git a/chrome/browser/extensions/error_console/error_console_browsertest.cc b/chrome/browser/extensions/error_console/error_console_browsertest.cc index e724c422..7cff1a9 100644 --- a/chrome/browser/extensions/error_console/error_console_browsertest.cc +++ b/chrome/browser/extensions/error_console/error_console_browsertest.cc
@@ -443,7 +443,7 @@ std::string message; bool use_native_bindings = - base::FeatureList::IsEnabled(features::kNativeCrxBindings); + base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings); if (use_native_bindings) { // TODO(devlin): The specific event name (here, 'browserAction.onClicked') // may or may not be worth preserving. In most cases, it's unnecessary with @@ -486,7 +486,7 @@ std::string source; std::string message; bool use_native_bindings = - base::FeatureList::IsEnabled(features::kNativeCrxBindings); + base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings); if (use_native_bindings) { source = extension->GetResourceURL("background.js").spec(); message = @@ -575,7 +575,7 @@ std::string message; size_t line_number = 0; size_t column_number = 0; - if (base::FeatureList::IsEnabled(features::kNativeCrxBindings)) { + if (base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) { // TODO(devlin): This is unfortunate. We lose a lot of context by using // RenderFrame::AddMessageToConsole() instead of console.error(). This could // be expanded; blink::SourceLocation knows how to capture an inspector
diff --git a/chrome/browser/extensions/extension_action_runner.cc b/chrome/browser/extensions/extension_action_runner.cc index ab63e53..d442df72a 100644 --- a/chrome/browser/extensions/extension_action_runner.cc +++ b/chrome/browser/extensions/extension_action_runner.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/permissions_updater.h" +#include "chrome/browser/extensions/scripting_permissions_modifier.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" @@ -41,6 +42,7 @@ #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permissions_data.h" #include "ipc/ipc_message_macros.h" +#include "url/origin.h" namespace extensions { @@ -93,7 +95,11 @@ if (grant_tab_permissions) { int blocked = GetBlockedActions(extension); if ((blocked & kRefreshRequiredActionsMask) != 0) { - ShowBlockedActionBubble(extension); + ShowBlockedActionBubble( + extension, + base::Bind( + &ExtensionActionRunner::OnBlockedActionBubbleForRunActionClosed, + weak_factory_.GetWeakPtr(), extension->id())); return ExtensionAction::ACTION_NONE; } TabHelper::FromWebContents(web_contents()) @@ -125,24 +131,35 @@ return ExtensionAction::ACTION_NONE; } -void ExtensionActionRunner::RunBlockedActions(const Extension* extension) { - DCHECK(base::ContainsKey(pending_scripts_, extension->id()) || - web_request_blocked_.count(extension->id()) != 0); +void ExtensionActionRunner::HandlePageAccessModified(const Extension* extension, + PageAccess current_access, + PageAccess new_access) { + DCHECK_NE(current_access, new_access); - // Clicking to run the extension counts as granting it permission to run on - // the given tab. - // The extension may already have active tab at this point, but granting - // it twice is essentially a no-op. - TabHelper::FromWebContents(web_contents()) - ->active_tab_permission_granter() - ->GrantIfRequested(extension); + // If we are restricting page access, just change permissions. + if (new_access == PageAccess::RUN_ON_CLICK) { + UpdatePageAccessSettings(extension, current_access, new_access); + return; + } - RunPendingScriptsForExtension(extension); - web_request_blocked_.erase(extension->id()); + int blocked_actions = GetBlockedActions(extension); - // The extension ran, so we need to tell the ExtensionActionAPI that we no - // longer want to act. - NotifyChange(extension); + // Refresh the page if there are pending actions which mandate a refresh. + if (blocked_actions & kRefreshRequiredActionsMask) { + // TODO(devlin): The bubble text should make it clear that permissions are + // granted only after the user accepts the refresh. + ShowBlockedActionBubble( + extension, base::Bind(&ExtensionActionRunner:: + OnBlockedActionBubbleForPageAccessGrantClosed, + weak_factory_.GetWeakPtr(), extension->id(), + web_contents()->GetLastCommittedURL(), + current_access, new_access)); + return; + } + + UpdatePageAccessSettings(extension, current_access, new_access); + if (blocked_actions) + RunBlockedActions(extension); } void ExtensionActionRunner::OnActiveTabPermissionGranted( @@ -349,14 +366,13 @@ } void ExtensionActionRunner::ShowBlockedActionBubble( - const Extension* extension) { + const Extension* extension, + const base::Callback<void(ToolbarActionsBarBubbleDelegate::CloseAction)>& + callback) { Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); ToolbarActionsBar* toolbar_actions_bar = browser ? browser->window()->GetToolbarActionsBar() : nullptr; if (toolbar_actions_bar) { - auto callback = - base::Bind(&ExtensionActionRunner::OnBlockedActionBubbleClosed, - weak_factory_.GetWeakPtr(), extension->id()); if (default_bubble_close_action_for_testing_) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -369,7 +385,7 @@ } } -void ExtensionActionRunner::OnBlockedActionBubbleClosed( +void ExtensionActionRunner::OnBlockedActionBubbleForRunActionClosed( const std::string& extension_id, ToolbarActionsBarBubbleDelegate::CloseAction action) { // If the user agreed to refresh the page, do so. @@ -392,6 +408,82 @@ } } +void ExtensionActionRunner::OnBlockedActionBubbleForPageAccessGrantClosed( + const std::string& extension_id, + const GURL& page_url, + PageAccess current_access, + PageAccess new_access, + ToolbarActionsBarBubbleDelegate::CloseAction action) { + DCHECK(new_access == PageAccess::RUN_ON_SITE || + new_access == PageAccess::RUN_ON_ALL_SITES); + DCHECK_EQ(PageAccess::RUN_ON_CLICK, current_access); + + // Don't change permissions if the user chose to not refresh the page. + if (action != ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE) + return; + + // If the web contents have navigated to a different origin, do nothing. + if (!url::IsSameOriginWith(page_url, web_contents()->GetLastCommittedURL())) + return; + + const Extension* extension = ExtensionRegistry::Get(browser_context_) + ->enabled_extensions() + .GetByID(extension_id); + if (!extension) + return; + + UpdatePageAccessSettings(extension, current_access, new_access); + web_contents()->GetController().Reload(content::ReloadType::NORMAL, false); +} + +void ExtensionActionRunner::UpdatePageAccessSettings(const Extension* extension, + PageAccess current_access, + PageAccess new_access) { + DCHECK_NE(current_access, new_access); + + const GURL& url = web_contents()->GetLastCommittedURL(); + ScriptingPermissionsModifier modifier(browser_context_, extension); + DCHECK(modifier.CanAffectExtension()); + + switch (new_access) { + case PageAccess::RUN_ON_CLICK: + if (current_access == PageAccess::RUN_ON_ALL_SITES) + modifier.SetWithholdHostPermissions(true); + if (modifier.HasGrantedHostPermission(url)) + modifier.RemoveGrantedHostPermission(url); + break; + case PageAccess::RUN_ON_SITE: + if (current_access == PageAccess::RUN_ON_ALL_SITES) + modifier.SetWithholdHostPermissions(true); + if (!modifier.HasGrantedHostPermission(url)) + modifier.GrantHostPermission(url); + break; + case PageAccess::RUN_ON_ALL_SITES: + modifier.SetWithholdHostPermissions(false); + break; + } +} + +void ExtensionActionRunner::RunBlockedActions(const Extension* extension) { + DCHECK(base::ContainsKey(pending_scripts_, extension->id()) || + web_request_blocked_.count(extension->id()) != 0); + + // Clicking to run the extension counts as granting it permission to run on + // the given tab. + // The extension may already have active tab at this point, but granting + // it twice is essentially a no-op. + TabHelper::FromWebContents(web_contents()) + ->active_tab_permission_granter() + ->GrantIfRequested(extension); + + RunPendingScriptsForExtension(extension); + web_request_blocked_.erase(extension->id()); + + // The extension ran, so we need to tell the ExtensionActionAPI that we no + // longer want to act. + NotifyChange(extension); +} + bool ExtensionActionRunner::OnMessageReceived( const IPC::Message& message, content::RenderFrameHost* render_frame_host) {
diff --git a/chrome/browser/extensions/extension_action_runner.h b/chrome/browser/extensions/extension_action_runner.h index dac959d..cddc112 100644 --- a/chrome/browser/extensions/extension_action_runner.h +++ b/chrome/browser/extensions/extension_action_runner.h
@@ -43,6 +43,12 @@ class ExtensionActionRunner : public content::WebContentsObserver, public ExtensionRegistryObserver { public: + enum class PageAccess { + RUN_ON_CLICK, + RUN_ON_SITE, + RUN_ON_ALL_SITES, + }; + class TestObserver { public: virtual void OnBlockedActionAdded() = 0; @@ -64,9 +70,11 @@ ExtensionAction::ShowAction RunAction(const Extension* extension, bool grant_tab_permissions); - // Runs any actions that were blocked for the given |extension|. As a - // requirement, this will grant activeTab permission to the extension. - void RunBlockedActions(const Extension* extension); + // Notifies the ExtensionActionRunner that the page access for |extension| has + // changed. + void HandlePageAccessModified(const Extension* extension, + PageAccess current_access, + PageAccess new_access); // Notifies the ExtensionActionRunner that an extension has been granted // active tab permissions. This will run any pending injections for that @@ -164,14 +172,38 @@ void LogUMA() const; // Shows the bubble to prompt the user to refresh the page to run the blocked - // actions for the given |extension|. - void ShowBlockedActionBubble(const Extension* extension); + // actions for the given |extension|. |callback| is invoked when the bubble is + // closed. + void ShowBlockedActionBubble( + const Extension* extension, + const base::Callback<void(ToolbarActionsBarBubbleDelegate::CloseAction)>& + callback); - // Called when the blocked actions bubble is closed. - void OnBlockedActionBubbleClosed( + // Called when the blocked actions bubble invoked to run the extension action + // is closed. + void OnBlockedActionBubbleForRunActionClosed( const std::string& extension_id, ToolbarActionsBarBubbleDelegate::CloseAction action); + // Called when the blocked actions bubble invoked for the page access grant is + // closed. + void OnBlockedActionBubbleForPageAccessGrantClosed( + const std::string& extension_id, + const GURL& page_url, + PageAccess current_access, + PageAccess new_access, + ToolbarActionsBarBubbleDelegate::CloseAction action); + + // Handles permission changes necessary for page access modification of the + // |extension|. + void UpdatePageAccessSettings(const Extension* extension, + PageAccess current_access, + PageAccess new_access); + + // Runs any actions that were blocked for the given |extension|. As a + // requirement, this will grant activeTab permission to the extension. + void RunBlockedActions(const Extension* extension); + // content::WebContentsObserver implementation. bool OnMessageReceived(const IPC::Message& message, content::RenderFrameHost* render_frame_host) override;
diff --git a/chrome/browser/extensions/extension_action_runner_browsertest.cc b/chrome/browser/extensions/extension_action_runner_browsertest.cc index 598e6236..47a204ae 100644 --- a/chrome/browser/extensions/extension_action_runner_browsertest.cc +++ b/chrome/browser/extensions/extension_action_runner_browsertest.cc
@@ -118,7 +118,8 @@ void ExtensionActionRunnerBrowserTest::SetUpCommandLine( base::CommandLine* command_line) { ExtensionBrowserTest::SetUpCommandLine(command_line); - scoped_feature_list_.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); } void ExtensionActionRunnerBrowserTest::TearDownOnMainThread() {
diff --git a/chrome/browser/extensions/extension_action_runner_unittest.cc b/chrome/browser/extensions/extension_action_runner_unittest.cc index 83e62d55..06a0f2f9 100644 --- a/chrome/browser/extensions/extension_action_runner_unittest.cc +++ b/chrome/browser/extensions/extension_action_runner_unittest.cc
@@ -79,8 +79,8 @@ void SetUp() override; - // Used to enable features::kRuntimeHostPermissions for ExtensionActionRunner - // to take effect. + // Used to enable extensions_features::kRuntimeHostPermissions for + // ExtensionActionRunner to take effect. base::test::ScopedFeatureList scoped_feature_list_; // The associated ExtensionActionRunner. @@ -175,7 +175,8 @@ void ExtensionActionRunnerUnitTest::SetUp() { ChromeRenderViewHostTestHarness::SetUp(); - scoped_feature_list_.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); // Skip syncing for testing purposes. ExtensionSyncServiceFactory::GetInstance()->SetTestingFactory(profile(),
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc index e9deed8..ac8e0bf 100644 --- a/chrome/browser/extensions/extension_apitest.cc +++ b/chrome/browser/extensions/extension_apitest.cc
@@ -172,7 +172,7 @@ } test_config_->SetBoolean( kNativeCrxBindingsEnabled, - base::FeatureList::IsEnabled(features::kNativeCrxBindings)); + base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)); TestGetConfigFunction::set_test_config_state(test_config_.get()); }
diff --git a/chrome/browser/extensions/extension_bindings_apitest.cc b/chrome/browser/extensions/extension_bindings_apitest.cc index c18fccc..0edc7f8 100644 --- a/chrome/browser/extensions/extension_bindings_apitest.cc +++ b/chrome/browser/extensions/extension_bindings_apitest.cc
@@ -42,10 +42,12 @@ void SetUp() override { if (GetParam() == NATIVE_BINDINGS) { - scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kNativeCrxBindings); } else { DCHECK_EQ(JAVASCRIPT_BINDINGS, GetParam()); - scoped_feature_list_.InitAndDisableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndDisableFeature( + extensions_features::kNativeCrxBindings); } ExtensionApiTest::SetUp(); }
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc index 4147071..c9e5b61 100644 --- a/chrome/browser/extensions/extension_context_menu_model.cc +++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -424,36 +424,25 @@ if (command_id == current_access) return; - const GURL& url = web_contents->GetLastCommittedURL(); - ScriptingPermissionsModifier modifier(profile_, extension); - DCHECK(modifier.CanAffectExtension()); - switch (command_id) { - case PAGE_ACCESS_RUN_ON_CLICK: - if (current_access == PAGE_ACCESS_RUN_ON_ALL_SITES) - modifier.SetWithholdHostPermissions(true); - if (modifier.HasGrantedHostPermission(url)) - modifier.RemoveGrantedHostPermission(url); - break; - case PAGE_ACCESS_RUN_ON_SITE: - if (current_access == PAGE_ACCESS_RUN_ON_ALL_SITES) - modifier.SetWithholdHostPermissions(true); - if (!modifier.HasGrantedHostPermission(url)) - modifier.GrantHostPermission(url); - break; - case PAGE_ACCESS_RUN_ON_ALL_SITES: - modifier.SetWithholdHostPermissions(false); - break; - default: - NOTREACHED(); - } + auto convert_page_access = [](int command_id) { + switch (command_id) { + case PAGE_ACCESS_RUN_ON_CLICK: + return ExtensionActionRunner::PageAccess::RUN_ON_CLICK; + case PAGE_ACCESS_RUN_ON_SITE: + return ExtensionActionRunner::PageAccess::RUN_ON_SITE; + case PAGE_ACCESS_RUN_ON_ALL_SITES: + return ExtensionActionRunner::PageAccess::RUN_ON_ALL_SITES; + } + NOTREACHED(); + return ExtensionActionRunner::PageAccess::RUN_ON_CLICK; + }; - if (command_id == PAGE_ACCESS_RUN_ON_SITE || - command_id == PAGE_ACCESS_RUN_ON_ALL_SITES) { - ExtensionActionRunner* runner = - ExtensionActionRunner::GetForWebContents(web_contents); - if (runner && runner->WantsToRun(extension)) - runner->RunBlockedActions(extension); - } + ExtensionActionRunner* runner = + ExtensionActionRunner::GetForWebContents(web_contents); + if (runner) + runner->HandlePageAccessModified(extension, + convert_page_access(current_access), + convert_page_access(command_id)); } content::WebContents* ExtensionContextMenuModel::GetActiveWebContents() const {
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc index 731c6dae..3322675 100644 --- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc +++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -616,7 +616,8 @@ TEST_F(ExtensionContextMenuModelTest, TestPageAccessSubmenu) { // This test relies on the click-to-script feature. auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list->InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list->InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); InitializeEmptyExtensionService(); // Add an extension with all urls, and withhold permission. @@ -772,7 +773,8 @@ // submenu either. scoped_feature_list.reset(); // Need to delete the old list first. scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list->InitAndDisableFeature(features::kRuntimeHostPermissions); + scoped_feature_list->InitAndDisableFeature( + extensions_features::kRuntimeHostPermissions); const Extension* feature_disabled_extension = AddExtensionWithHostPermission( "feature_disabled_extension", manifest_keys::kBrowserAction, Manifest::INTERNAL, "http://www.google.com/*");
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc index eec107b..b482885f 100644 --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc
@@ -365,7 +365,7 @@ std::string url_pattern; if (it->GetAsString(&url_pattern)) { URLPattern entry(URLPattern::SCHEME_ALL); - if (entry.Parse(url_pattern) == URLPattern::PARSE_SUCCESS) { + if (entry.Parse(url_pattern) == URLPattern::ParseResult::kSuccess) { global_settings_->install_sources.AddPattern(entry); } else { LOG(WARNING) << "Invalid URL pattern in for preference "
diff --git a/chrome/browser/extensions/extension_management_internal.cc b/chrome/browser/extensions/extension_management_internal.cc index df1030d0..7b831fc6 100644 --- a/chrome/browser/extensions/extension_management_internal.cc +++ b/chrome/browser/extensions/extension_management_internal.cc
@@ -137,7 +137,7 @@ unparsed_str.append("/*"); URLPattern::ParseResult parse_result = pattern.Parse( unparsed_str, URLPattern::ALLOW_WILDCARD_FOR_EFFECTIVE_TLD); - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { LOG(WARNING) << kMalformedPreferenceWarning; LOG(WARNING) << "Invalid URL pattern '" + unparsed_str + "' for attribute " + key;
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc index 76e32dff..7d85abac 100644 --- a/chrome/browser/extensions/extension_messages_apitest.cc +++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -199,10 +199,12 @@ void SetUp() override { if (GetParam() == NATIVE_BINDINGS) { - scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kNativeCrxBindings); } else { DCHECK_EQ(JAVASCRIPT_BINDINGS, GetParam()); - scoped_feature_list_.InitAndDisableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndDisableFeature( + extensions_features::kNativeCrxBindings); } ExtensionApiTest::SetUp(); }
diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc index 479dba7..e0cf2dac 100644 --- a/chrome/browser/extensions/lazy_background_page_apitest.cc +++ b/chrome/browser/extensions/lazy_background_page_apitest.cc
@@ -47,6 +47,7 @@ #include "extensions/test/result_catcher.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -652,7 +653,7 @@ // Tests that the lazy background page stays alive while a video is playing in // Picture-in-Picture mode. IN_PROC_BROWSER_TEST_F(PictureInPictureLazyBackgroundPageApiTest, - DISABLED_PictureInPictureInBackgroundPage) { + PictureInPictureInBackgroundPage) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(LoadExtensionAndWait("browser_action_picture_in_picture")); @@ -670,14 +671,16 @@ // that keep alive count is incremented. { ProcessManager* pm = ProcessManager::Get(browser()->profile()); - int previous_keep_alive_count = pm->GetLazyKeepaliveCount(extension); + const auto pip_activity = + std::make_pair(Activity::MEDIA, Activity::kPictureInPicture); + EXPECT_THAT(pm->GetLazyKeepaliveActivities(extension), + testing::Not(testing::Contains(pip_activity))); ExtensionTestMessageListener entered_pip("entered_pip", false); BrowserActionTestUtil::Create(browser())->Press(0); EXPECT_TRUE(entered_pip.WaitUntilSatisfied()); - content::RunAllTasksUntilIdle(); - EXPECT_EQ(pm->GetLazyKeepaliveCount(extension), - previous_keep_alive_count + 1); + EXPECT_THAT(pm->GetLazyKeepaliveActivities(extension), + testing::Contains(pip_activity)); } // Click on the browser action icon to exit Picture-in-Picture and the Lazy
diff --git a/chrome/browser/extensions/native_bindings_apitest.cc b/chrome/browser/extensions/native_bindings_apitest.cc index b37a4de..11a4898 100644 --- a/chrome/browser/extensions/native_bindings_apitest.cc +++ b/chrome/browser/extensions/native_bindings_apitest.cc
@@ -37,7 +37,8 @@ ~NativeBindingsApiTest() override {} void SetUp() override { - scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kNativeCrxBindings); ExtensionApiTest::SetUp(); }
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc index 281ebd68..b663743 100644 --- a/chrome/browser/extensions/permissions_updater.cc +++ b/chrome/browser/extensions/permissions_updater.cc
@@ -121,7 +121,8 @@ void PermissionsUpdater::GrantRuntimePermissions( const Extension& extension, const PermissionSet& permissions) { - DCHECK(base::FeatureList::IsEnabled(features::kRuntimeHostPermissions)); + DCHECK(base::FeatureList::IsEnabled( + extensions_features::kRuntimeHostPermissions)); // We don't want to grant the extension object/process more privilege than it // requested, even if the user grants additional permission. For instance, if @@ -182,7 +183,8 @@ void PermissionsUpdater::RevokeRuntimePermissions( const Extension& extension, const PermissionSet& permissions) { - DCHECK(base::FeatureList::IsEnabled(features::kRuntimeHostPermissions)); + DCHECK(base::FeatureList::IsEnabled( + extensions_features::kRuntimeHostPermissions)); // Similar to the process in adding permissions, we might be revoking more // permissions than the extension currently has explicit access to. For // instance, we might be revoking https://*.google.com/* even if the extension
diff --git a/chrome/browser/extensions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions_updater_unittest.cc index bc31ee3..a35d292c 100644 --- a/chrome/browser/extensions/permissions_updater_unittest.cc +++ b/chrome/browser/extensions/permissions_updater_unittest.cc
@@ -520,7 +520,8 @@ TEST_F(PermissionsUpdaterTest, UpdatingRuntimeGrantedPermissionsWithRuntimePermissions) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); InitializeEmptyExtensionService(); @@ -572,7 +573,8 @@ TEST_F(PermissionsUpdaterTest, RevokingPermissionsWithRuntimeHostPermissions) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); InitializeEmptyExtensionService(); @@ -640,7 +642,8 @@ TEST_F(PermissionsUpdaterTest, ChromeFaviconIsNotARevokableHost) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); InitializeEmptyExtensionService(); @@ -736,7 +739,8 @@ // the extension. TEST_F(PermissionsUpdaterTest, GrantingBroadRuntimePermissions) { base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + scoped_feature_list.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); InitializeEmptyExtensionService(); scoped_refptr<const Extension> extension =
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc index 4fb60d0..bf33b5d 100644 --- a/chrome/browser/extensions/policy_handlers.cc +++ b/chrome/browser/extensions/policy_handlers.cc
@@ -194,7 +194,8 @@ } URLPattern pattern(URLPattern::SCHEME_ALL); - if (pattern.Parse(url_pattern_string) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(url_pattern_string) != + URLPattern::ParseResult::kSuccess) { errors->AddError(policy_name(), entry - list_value->begin(), IDS_POLICY_VALUE_FORMAT_ERROR); @@ -309,12 +310,12 @@ // These keys don't support paths due to how we track the initiator // of a webRequest and cookie security policy. We expect a valid // pattern to return a PARSE_ERROR_EMPTY_PATH. - if (parse_result == URLPattern::PARSE_ERROR_EMPTY_PATH) { + if (parse_result == URLPattern::ParseResult::kEmptyPath) { // Add a wildcard path to the URL as it should match any path. parse_result = pattern.Parse(unparsed_url + "/*", URLPattern::ALLOW_WILDCARD_FOR_EFFECTIVE_TLD); - } else if (parse_result == URLPattern::PARSE_SUCCESS) { + } else if (parse_result == URLPattern::ParseResult::kSuccess) { // The user supplied a path, notify them that this is not supported. if (!pattern.match_all_urls()) { errors->AddError( @@ -326,7 +327,7 @@ return false; } } - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { errors->AddError(policy_name(), it.key(), "Invalid URL pattern '" + unparsed_url + "' for attribute " + key);
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc index 594d718..faae589 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -93,7 +93,8 @@ // by the runtime host permissions experiment. bool ShouldConsiderExtension(const Extension& extension) { // No extensions are affected if the experiment is disabled. - if (!base::FeatureList::IsEnabled(features::kRuntimeHostPermissions)) + if (!base::FeatureList::IsEnabled( + extensions_features::kRuntimeHostPermissions)) return false; // Certain extensions are always exempt from having permissions withheld.
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc index 4dbf9f1..ad49373 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -105,7 +105,8 @@ class RuntimeHostPermissionsEnabledScope { public: RuntimeHostPermissionsEnabledScope() { - feature_list_.InitAndEnableFeature(features::kRuntimeHostPermissions); + feature_list_.InitAndEnableFeature( + extensions_features::kRuntimeHostPermissions); } ~RuntimeHostPermissionsEnabledScope() {}
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index b993b60..f6c0229 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -124,10 +124,12 @@ void SetUp() override { if (GetParam() == NATIVE_BINDINGS) { - scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kNativeCrxBindings); } else { DCHECK_EQ(JAVASCRIPT_BINDINGS, GetParam()); - scoped_feature_list_.InitAndDisableFeature(features::kNativeCrxBindings); + scoped_feature_list_.InitAndDisableFeature( + extensions_features::kNativeCrxBindings); } ExtensionApiTest::SetUp(); }
diff --git a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc index 1ee23e8..568a461b 100644 --- a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc +++ b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc
@@ -136,7 +136,7 @@ ASSERT_TRUE(https_server_for_ping_.InitializeAndListen()); scoped_feature_list_.InitAndEnableFeature( - features::kNewExtensionUpdaterService); + extensions_features::kNewExtensionUpdaterService); ChromeUpdateClientConfig::SetChromeUpdateClientConfigFactoryForTesting( ChromeUpdateClientConfigFactory()); ExtensionBrowserTest::SetUp();
diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc index 0a92703..2a63f93 100644 --- a/chrome/browser/extensions/webstore_inline_installer.cc +++ b/chrome/browser/extensions/webstore_inline_installer.cc
@@ -305,9 +305,9 @@ URLPattern verified_site_pattern(valid_schemes); URLPattern::ParseResult parse_result = verified_site_pattern.Parse(verified_site_pattern_spec); - if (parse_result != URLPattern::PARSE_SUCCESS) { - DLOG(WARNING) << "Could not parse " << verified_site_pattern_spec << - " as URL pattern " << parse_result; + if (parse_result != URLPattern::ParseResult::kSuccess) { + DLOG(WARNING) << "Failed to parse '" << verified_site_pattern_spec + << "': " << URLPattern::GetParseResultString(parse_result); return false; } verified_site_pattern.SetScheme("*");
diff --git a/chrome/browser/favicon/DEPS b/chrome/browser/favicon/DEPS deleted file mode 100644 index bd86119..0000000 --- a/chrome/browser/favicon/DEPS +++ /dev/null
@@ -1,14 +0,0 @@ -include_rules = [ - # Favicon is a layered component [1]. You will only find Chrome specific - # factories and helper in that directory, the meat of the components is - # located at //components/favicon. - # - # [1]: http://www.chromium.org/developers/design-documents/layered-components-design - "+chrome/browser", -] - -specific_include_rules = { - '.*test\.cc': [ - "+chrome/test", - ] -}
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 1019f01..6b5cc01 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1226,6 +1226,10 @@ "Enable support for using the native notification toasts and notification " "center on platforms where these are available."; +const char kUseMultiloginEndpointName[] = "Use Multilogin endpoint."; +const char kUseMultiloginEndpointDescription[] = + "Use Gaia OAuth multilogin for identity consistency."; + #if defined(OS_POSIX) const char kNtlmV2EnabledName[] = "Enable NTLMv2 Authentication"; const char kNtlmV2EnabledDescription[] = @@ -1455,7 +1459,7 @@ const char kPasswordsMigrateLinuxToLoginDBName[] = "Migrate passwords to \"Login Data\""; const char kPasswordsMigrateLinuxToLoginDBDescription[] = - "Performs a one-off migration (with retries) of passwords from the " + "Performs a one-off irreversible migration of passwords from the " "gnome-keyring or kwallet into the profile directory."; const char kPdfIsolationName[] = "PDF Isolation"; @@ -1730,7 +1734,7 @@ "default. Here, 'Disabled' is a legacy value that actually means " "'Default,' in which case site isolation may be already enabled based on " "platform, enterprise policy, or field trial. See also " - "#site-isolation-trial-opt-outfor how to disable site isolation for " + "#site-isolation-trial-opt-out for how to disable site isolation for " "testing."; const char kSiteIsolationTrialOptOutName[] = "Site isolation trial opt-out"; @@ -1826,6 +1830,10 @@ "a signed-in account that has not been chosen as Chrome's primary account. " "This only has an effect if sync-standalone-transport is also enabled."; +const char kSyncUSSAutofillProfileName[] = "Enable USS for autofill profile"; +const char kSyncUSSAutofillProfileDescription[] = + "Enables the new implementation of autofill profile sync"; + const char kSyncUSSAutofillWalletDataName[] = "Enable USS for autofill wallet data"; const char kSyncUSSAutofillWalletDataDescription[] = @@ -2347,6 +2355,11 @@ const char kEnableAndroidPayIntegrationV2Description[] = "Enable integration with Android Pay using the second version of the API"; +const char kEnableAutofillRefreshStyleName[] = + "Enable Autofill refresh style (Android)"; +const char kEnableAutofillRefreshStyleDescription[] = + "Enable modernized style for Autofill on Android"; + const char kEnableAndroidSpellcheckerName[] = "Enable spell checking"; const char kEnableAndroidSpellcheckerDescription[] = "Enables use of the Android spellchecker."; @@ -2362,12 +2375,6 @@ "If enabled, the content suggestions (on the NTP) will get favicons from a " "new favicon server."; -const char kEnableContentSuggestionsSettingsName[] = - "Show content suggestions settings."; -const char kEnableContentSuggestionsSettingsDescription[] = - "If enabled, the content suggestions settings will be available from the " - "main settings menu."; - const char kEnableContentSuggestionsThumbnailDominantColorName[] = "Use content suggestions thumbnail dominant color."; const char kEnableContentSuggestionsThumbnailDominantColorDescription[] = @@ -2401,12 +2408,6 @@ "Provide a suggestion of the URL stored in the clipboard (if any) upon " "focus in the omnibox."; -const char kEnableNtpArticleSuggestionsExpandableHeaderName[] = - "Show article suggestions expandable header on New Tab Page"; -const char kEnableNtpArticleSuggestionsExpandableHeaderDescription[] = - "If enabled, the article suggestions content on New Tab Page can be " - "toggled shown or hidden by clicking the expandable header."; - const char kEnableNtpAssetDownloadSuggestionsName[] = "Show asset downloads on the New Tab page"; const char kEnableNtpAssetDownloadSuggestionsDescription[] = @@ -3456,6 +3457,12 @@ "Ctrl-Alt-I shows a heads-up display view in the top-left corner. Helps " "debug hardware issues that generate spurious touch events."; +const char kSlideTopChromeWithPageScrollsName[] = + "Slide top-chrome with page scrolls"; +const char kSlideTopChromeWithPageScrollsDescription[] = + "If enabled, page scrolls in tablet mode will also scroll the top-chrome" + " UI."; + const char kSmartTextSelectionName[] = "Smart Text Selection"; const char kSmartTextSelectionDescription[] = "Shows quick actions for text "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index bd681c4..16c0b56 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -762,6 +762,9 @@ extern const char kNotificationsNativeFlagName[]; extern const char kNotificationsNativeFlagDescription[]; +extern const char kUseMultiloginEndpointName[]; +extern const char kUseMultiloginEndpointDescription[]; + #if defined(OS_POSIX) extern const char kNtlmV2EnabledName[]; extern const char kNtlmV2EnabledDescription[]; @@ -1109,6 +1112,9 @@ extern const char kSyncSupportSecondaryAccountName[]; extern const char kSyncSupportSecondaryAccountDescription[]; +extern const char kSyncUSSAutofillProfileName[]; +extern const char kSyncUSSAutofillProfileDescription[]; + extern const char kSyncUSSAutofillWalletDataName[]; extern const char kSyncUSSAutofillWalletDataDescription[]; @@ -1418,6 +1424,9 @@ extern const char kEnableAndroidPayIntegrationV2Name[]; extern const char kEnableAndroidPayIntegrationV2Description[]; +extern const char kEnableAutofillRefreshStyleName[]; +extern const char kEnableAutofillRefreshStyleDescription[]; + extern const char kEnableAndroidSpellcheckerName[]; extern const char kEnableAndroidSpellcheckerDescription[]; @@ -1427,9 +1436,6 @@ extern const char kEnableContentSuggestionsNewFaviconServerName[]; extern const char kEnableContentSuggestionsNewFaviconServerDescription[]; -extern const char kEnableContentSuggestionsSettingsName[]; -extern const char kEnableContentSuggestionsSettingsDescription[]; - extern const char kEnableContentSuggestionsThumbnailDominantColorName[]; extern const char kEnableContentSuggestionsThumbnailDominantColorDescription[]; @@ -1448,9 +1454,6 @@ extern const char kEnableOmniboxClipboardProviderName[]; extern const char kEnableOmniboxClipboardProviderDescription[]; -extern const char kEnableNtpArticleSuggestionsExpandableHeaderName[]; -extern const char kEnableNtpArticleSuggestionsExpandableHeaderDescription[]; - extern const char kEnableNtpAssetDownloadSuggestionsName[]; extern const char kEnableNtpAssetDownloadSuggestionsDescription[]; @@ -2100,6 +2103,9 @@ extern const char kShowTouchHudName[]; extern const char kShowTouchHudDescription[]; +extern const char kSlideTopChromeWithPageScrollsName[]; +extern const char kSlideTopChromeWithPageScrollsDescription[]; + extern const char kSmartTextSelectionName[]; extern const char kSmartTextSelectionDescription[];
diff --git a/chrome/browser/media/android/router/media_router_android.cc b/chrome/browser/media/android/router/media_router_android.cc index 57b067d6..e590e79 100644 --- a/chrome/browser/media/android/router/media_router_android.cc +++ b/chrome/browser/media/android/router/media_router_android.cc
@@ -45,14 +45,9 @@ } void MediaRouterAndroid::PresentationConnectionProxy::OnMessage( - blink::mojom::PresentationConnectionMessagePtr message, - OnMessageCallback callback) { - if (message->is_message()) { - media_router_android_->SendRouteMessage(route_id_, message->get_message(), - std::move(callback)); - } else { - std::move(callback).Run(false); - } + blink::mojom::PresentationConnectionMessagePtr message) { + if (message->is_message()) + media_router_android_->SendRouteMessage(route_id_, message->get_message()); } void MediaRouterAndroid::PresentationConnectionProxy::RequestClose() { @@ -79,8 +74,7 @@ const std::string& message) { DCHECK(peer_); peer_->OnMessage( - blink::mojom::PresentationConnectionMessage::NewMessage(message), - base::DoNothing()); + blink::mojom::PresentationConnectionMessage::NewMessage(message)); } MediaRouterAndroid::MediaRouteRequest::MediaRouteRequest( @@ -173,19 +167,14 @@ } void MediaRouterAndroid::SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) { - int callback_id = message_callbacks_.Add( - std::make_unique<SendRouteMessageCallback>(std::move(callback))); - bridge_->SendRouteMessage(route_id, message, callback_id); + const std::string& message) { + bridge_->SendRouteMessage(route_id, message); } void MediaRouterAndroid::SendRouteBinaryMessage( const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) { + std::unique_ptr<std::vector<uint8_t>> data) { // Binary messaging is not supported on Android. - std::move(callback).Run(false); } void MediaRouterAndroid::OnUserGesture() {} @@ -330,12 +319,6 @@ message); } -void MediaRouterAndroid::OnMessageSentResult(bool success, int callback_id) { - SendRouteMessageCallback* callback = message_callbacks_.Lookup(callback_id); - std::move(*callback).Run(success); - message_callbacks_.Remove(callback_id); -} - void MediaRouterAndroid::OnMessage(const MediaRoute::Id& route_id, const std::string& message) { auto entry = presentation_connections_.find(route_id);
diff --git a/chrome/browser/media/android/router/media_router_android.h b/chrome/browser/media/android/router/media_router_android.h index 389fa0d..5c8a4dc 100644 --- a/chrome/browser/media/android/router/media_router_android.h +++ b/chrome/browser/media/android/router/media_router_android.h
@@ -54,11 +54,10 @@ void DetachRoute(const MediaRoute::Id& route_id) override; void TerminateRoute(const MediaRoute::Id& route_id) override; void SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) override; - void SendRouteBinaryMessage(const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) override; + const std::string& message) override; + void SendRouteBinaryMessage( + const MediaRoute::Id& route_id, + std::unique_ptr<std::vector<uint8_t>> data) override; void OnUserGesture() override; void SearchSinks(const MediaSink::Id& sink_id, const MediaSource::Id& source_id, @@ -90,9 +89,6 @@ void OnRouteClosedWithError(const MediaRoute::Id& route_id, const std::string& message); - // Notifies the media router about the result of sending a message. - void OnMessageSentResult(bool success, int callback_id); - // Notifies the media router about a message received from the media route. void OnMessage(const MediaRoute::Id& route_id, const std::string& message); @@ -116,8 +112,8 @@ mojom::RoutePresentationConnectionPtr Init(); // blink::mojom::PresentationConnection overrides. - void OnMessage(blink::mojom::PresentationConnectionMessagePtr message, - OnMessageCallback callback) override; + void OnMessage( + blink::mojom::PresentationConnectionMessagePtr message) override; void DidChangeState( blink::mojom::PresentationConnectionState state) override {} // Destroys |this| by removing it from MediaRouterAndroid's collection. @@ -186,10 +182,6 @@ using MediaRoutes = std::vector<MediaRoute>; MediaRoutes active_routes_; - using SendMessageCallbacks = - base::IDMap<std::unique_ptr<SendRouteMessageCallback>>; - SendMessageCallbacks message_callbacks_; - std::unordered_map<MediaRoute::Id, std::vector<std::unique_ptr<PresentationConnectionProxy>>> presentation_connections_;
diff --git a/chrome/browser/media/android/router/media_router_android_bridge.cc b/chrome/browser/media/android/router/media_router_android_bridge.cc index f20ab550..db9f61c 100644 --- a/chrome/browser/media/android/router/media_router_android_bridge.cc +++ b/chrome/browser/media/android/router/media_router_android_bridge.cc
@@ -84,15 +84,14 @@ } void MediaRouterAndroidBridge::SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - int callback_id) { + const std::string& message) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jstring> jroute_id = base::android::ConvertUTF8ToJavaString(env, route_id); ScopedJavaLocalRef<jstring> jmessage = base::android::ConvertUTF8ToJavaString(env, message); Java_ChromeMediaRouter_sendStringMessage(env, java_media_router_, jroute_id, - jmessage, callback_id); + jmessage); } void MediaRouterAndroidBridge::DetachRoute(const MediaRoute::Id& route_id) { @@ -197,13 +196,6 @@ ConvertJavaStringToUTF8(env, jmessage)); } -void MediaRouterAndroidBridge::OnMessageSentResult(JNIEnv* env, - const JavaRef<jobject>& obj, - jboolean jsuccess, - jint jcallback_id) { - native_media_router_->OnMessageSentResult(jsuccess, jcallback_id); -} - void MediaRouterAndroidBridge::OnMessage( JNIEnv* env, const JavaRef<jobject>& obj,
diff --git a/chrome/browser/media/android/router/media_router_android_bridge.h b/chrome/browser/media/android/router/media_router_android_bridge.h index d4c7891a..53cdce3 100644 --- a/chrome/browser/media/android/router/media_router_android_bridge.h +++ b/chrome/browser/media/android/router/media_router_android_bridge.h
@@ -39,8 +39,7 @@ int route_request_id); virtual void TerminateRoute(const MediaRoute::Id& route_id); virtual void SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - int callback_id); + const std::string& message); virtual void DetachRoute(const MediaRoute::Id& route_id); virtual bool StartObservingMediaSinks(const MediaSource::Id& source_id); virtual void StopObservingMediaSinks(const MediaSource::Id& source_id); @@ -70,10 +69,6 @@ const base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jstring>& jmedia_route_id, const base::android::JavaRef<jstring>& jmessage); - void OnMessageSentResult(JNIEnv* env, - const base::android::JavaRef<jobject>& obj, - jboolean jsuccess, - jint jcallback_id); void OnMessage(JNIEnv* env, const base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jstring>& jmedia_route_id,
diff --git a/chrome/browser/media/android/router/media_router_android_unittest.cc b/chrome/browser/media/android/router/media_router_android_unittest.cc index d12d62c..6e4cffd 100644 --- a/chrome/browser/media/android/router/media_router_android_unittest.cc +++ b/chrome/browser/media/android/router/media_router_android_unittest.cc
@@ -41,8 +41,8 @@ int, int)); MOCK_METHOD1(TerminateRoute, void(const MediaRoute::Id&)); - MOCK_METHOD3(SendRouteMessage, - void(const MediaRoute::Id&, const std::string&, int)); + MOCK_METHOD2(SendRouteMessage, + void(const MediaRoute::Id&, const std::string&)); MOCK_METHOD1(DetachRoute, void(const MediaRoute::Id&)); MOCK_METHOD1(StartObservingMediaSinks, bool(const MediaSource::Id&)); MOCK_METHOD1(StopObservingMediaSinks, void(const MediaSource::Id&));
diff --git a/chrome/browser/media/router/data_decoder_util.cc b/chrome/browser/media/router/data_decoder_util.cc index 8304bc7..b95db324 100644 --- a/chrome/browser/media/router/data_decoder_util.cc +++ b/chrome/browser/media/router/data_decoder_util.cc
@@ -8,11 +8,6 @@ namespace media_router { -namespace { -// The batch ID used by data_decoder_util functions. -constexpr char kDataDecoderServiceBatchId[] = "media_router"; -} // namespace - DataDecoder::DataDecoder(service_manager::Connector* connector) : connector_(connector->Clone()) {}
diff --git a/chrome/browser/media/router/data_decoder_util.h b/chrome/browser/media/router/data_decoder_util.h index b02550ba..5e934f2 100644 --- a/chrome/browser/media/router/data_decoder_util.h +++ b/chrome/browser/media/router/data_decoder_util.h
@@ -16,6 +16,9 @@ namespace media_router { +// The batch ID used by data_decoder_util functions. +static constexpr char kDataDecoderServiceBatchId[] = "media_router"; + // A wrapper over their data_decoder functions for parsing XML/JSON that batches // all calls with a shared batch ID. // Thread safety: A newly constructed DataDecoder is not bound to any thread. On
diff --git a/chrome/browser/media/router/media_router.h b/chrome/browser/media/router/media_router.h index 8f387585..ec1e174f 100644 --- a/chrome/browser/media/router/media_router.h +++ b/chrome/browser/media/router/media_router.h
@@ -72,8 +72,6 @@ // TODO(imcheng): Reduce number of parameters by putting them into structs. class MediaRouter : public KeyedService { public: - using SendRouteMessageCallback = base::OnceCallback<void(bool sent)>; - ~MediaRouter() override = default; // Creates a media route from |source_id| to |sink_id|. @@ -146,15 +144,13 @@ // Posts |message| to a MediaSink connected via MediaRoute with |route_id|. virtual void SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) = 0; + const std::string& message) = 0; // Sends |data| to a MediaSink connected via MediaRoute with |route_id|. // This is called for Blob / ArrayBuffer / ArrayBufferView types. virtual void SendRouteBinaryMessage( const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) = 0; + std::unique_ptr<std::vector<uint8_t>> data) = 0; // Returns the IssueManager owned by the MediaRouter. Guaranteed to be // non-null.
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc index 2987a4d..2bea92300 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -383,36 +383,30 @@ } void MediaRouterMojoImpl::SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) { + const std::string& message) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); base::Optional<MediaRouteProviderId> provider_id = GetProviderIdForRoute(route_id); if (!provider_id) { DVLOG_WITH_INSTANCE(1) << __func__ << ": route not found: " << route_id; - std::move(callback).Run(false); return; } - media_route_providers_[*provider_id]->SendRouteMessage(route_id, message, - std::move(callback)); + media_route_providers_[*provider_id]->SendRouteMessage(route_id, message); } void MediaRouterMojoImpl::SendRouteBinaryMessage( const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) { + std::unique_ptr<std::vector<uint8_t>> data) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); base::Optional<MediaRouteProviderId> provider_id = GetProviderIdForRoute(route_id); if (!provider_id) { DVLOG_WITH_INSTANCE(1) << __func__ << ": route not found: " << route_id; - std::move(callback).Run(false); return; } - media_route_providers_[*provider_id]->SendRouteBinaryMessage( - route_id, *data, std::move(callback)); + media_route_providers_[*provider_id]->SendRouteBinaryMessage(route_id, *data); } void MediaRouterMojoImpl::OnUserGesture() {}
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h index 570e653..07f78a5 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -70,11 +70,9 @@ void TerminateRoute(const MediaRoute::Id& route_id) final; void DetachRoute(const MediaRoute::Id& route_id) final; void SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) final; + const std::string& message) final; void SendRouteBinaryMessage(const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) final; + std::unique_ptr<std::vector<uint8_t>> data) final; void OnUserGesture() override; void SearchSinks(const MediaSink::Id& sink_id, const MediaSource::Id& source_id,
diff --git a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.cc b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.cc index 26a1b7a..35cc6b6 100644 --- a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.cc +++ b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.cc
@@ -14,11 +14,6 @@ namespace { -void OnMessageReceivedByRenderer(bool success) { - DLOG_IF(ERROR, !success) - << "Renderer PresentationConnection failed to process message!"; -} - void LogMojoPipeError() { DVLOG(1) << "BrowserPresentationConnectionProxy mojo pipe error!"; } @@ -52,17 +47,14 @@ BrowserPresentationConnectionProxy::~BrowserPresentationConnectionProxy() {} void BrowserPresentationConnectionProxy::OnMessage( - blink::mojom::PresentationConnectionMessagePtr message, - OnMessageCallback on_message_callback) { + blink::mojom::PresentationConnectionMessagePtr message) { DVLOG(2) << "BrowserPresentationConnectionProxy::OnMessage"; if (message->is_data()) { router_->SendRouteBinaryMessage( route_id_, - std::make_unique<std::vector<uint8_t>>(std::move(message->get_data())), - std::move(on_message_callback)); + std::make_unique<std::vector<uint8_t>>(std::move(message->get_data()))); } else { - router_->SendRouteMessage(route_id_, message->get_message(), - std::move(on_message_callback)); + router_->SendRouteMessage(route_id_, message->get_message()); } } @@ -74,8 +66,7 @@ for (auto& message : messages) { target_connection_ptr_->OnMessage( message_util::PresentationConnectionFromRouteMessage( - std::move(message)), - base::BindOnce(&OnMessageReceivedByRenderer)); + std::move(message))); } } } // namespace media_router
diff --git a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.h b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.h index 3582713..c62d6b6 100644 --- a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.h +++ b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy.h
@@ -40,8 +40,6 @@ : public blink::mojom::PresentationConnection, public RouteMessageObserver { public: - using OnMessageCallback = base::OnceCallback<void(bool)>; - // |router|: media router instance not owned by this class; // |route_id|: underlying media route. |target_connection_ptr_| sends message // to media route with |route_id|; @@ -57,8 +55,8 @@ ~BrowserPresentationConnectionProxy() override; // blink::mojom::PresentationConnection implementation - void OnMessage(blink::mojom::PresentationConnectionMessagePtr message, - OnMessageCallback on_message_callback) override; + void OnMessage( + blink::mojom::PresentationConnectionMessagePtr message) override; // Underlying media route is always connected. Media route class does not // support state change.
diff --git a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy_unittest.cc b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy_unittest.cc index 7eacfe0..88452f0 100644 --- a/chrome/browser/media/router/presentation/browser_presentation_connection_proxy_unittest.cc +++ b/chrome/browser/media/router/presentation/browser_presentation_connection_proxy_unittest.cc
@@ -23,16 +23,11 @@ namespace media_router { -using OnMessageCallback = BrowserPresentationConnectionProxy::OnMessageCallback; - namespace { -void ExpectMessageAndRunCallback( - const PresentationConnectionMessagePtr expected_message, - const PresentationConnectionMessagePtr message, - OnMessageCallback callback) { +void ExpectMessage(const PresentationConnectionMessagePtr expected_message, + const PresentationConnectionMessagePtr message) { EXPECT_EQ(expected_message, message); - std::move(callback).Run(true); } } // namespace @@ -97,11 +92,9 @@ PresentationConnectionMessagePtr connection_message = PresentationConnectionMessage::NewMessage(message); - EXPECT_CALL(*mock_router(), - SendRouteMessageInternal(kMediaRouteId, message, _)); + EXPECT_CALL(*mock_router(), SendRouteMessage(kMediaRouteId, message)); - browser_connection_proxy()->OnMessage(std::move(connection_message), - base::BindOnce([](bool result) {})); + browser_connection_proxy()->OnMessage(std::move(connection_message)); } TEST_F(BrowserPresentationConnectionProxyTest, TestOnMessageBinaryMessage) { @@ -112,28 +105,25 @@ PresentationConnectionMessagePtr connection_message = PresentationConnectionMessage::NewData(expected_data); - EXPECT_CALL(*mock_router(), SendRouteBinaryMessageInternal(_, _, _)) - .WillOnce(Invoke([&expected_data](const MediaRoute::Id& route_id, - std::vector<uint8_t>* data, - const OnMessageCallback& callback) { + EXPECT_CALL(*mock_router(), SendRouteBinaryMessage(_, _)) + .WillOnce([&expected_data](const MediaRoute::Id& route_id, + std::unique_ptr<std::vector<uint8_t>> data) { EXPECT_EQ(*data, expected_data); - })); + }); - browser_connection_proxy()->OnMessage(std::move(connection_message), - base::BindOnce([](bool result) {})); + browser_connection_proxy()->OnMessage(std::move(connection_message)); } TEST_F(BrowserPresentationConnectionProxyTest, OnMessagesReceived) { - EXPECT_CALL(*controller_connection_proxy(), OnMessage(_, _)) - .WillOnce([&](auto message, auto callback) { - ExpectMessageAndRunCallback( - PresentationConnectionMessage::NewMessage("foo"), - std::move(message), std::move(callback)); + EXPECT_CALL(*controller_connection_proxy(), OnMessage(_)) + .WillOnce([&](auto message) { + ExpectMessage(PresentationConnectionMessage::NewMessage("foo"), + std::move(message)); }) - .WillOnce([&](auto message, auto callback) { - ExpectMessageAndRunCallback(PresentationConnectionMessage::NewData( - std::vector<uint8_t>({1, 2, 3})), - std::move(message), std::move(callback)); + .WillOnce([&](auto message) { + ExpectMessage(PresentationConnectionMessage::NewData( + std::vector<uint8_t>({1, 2, 3})), + std::move(message)); }); std::vector<RouteMessagePtr> route_messages;
diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc index 90dc9cda..c17f965 100644 --- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc +++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
@@ -600,24 +600,18 @@ base::Unretained(&success_cb)), presentation_info, /** connection */ nullptr, media_route); - EXPECT_CALL(controller_proxy, OnMessage(_, _)) - .WillOnce([](auto message, auto cb) { - EXPECT_TRUE(message->Equals( - *PresentationConnectionMessage::NewMessage("alpha"))); - std::move(cb).Run(true); - }); - controller_ptr->OnMessage(PresentationConnectionMessage::NewMessage("alpha"), - base::DoNothing()); + EXPECT_CALL(controller_proxy, OnMessage(_)).WillOnce([](auto message) { + EXPECT_TRUE( + message->Equals(*PresentationConnectionMessage::NewMessage("alpha"))); + }); + controller_ptr->OnMessage(PresentationConnectionMessage::NewMessage("alpha")); base::RunLoop().RunUntilIdle(); - EXPECT_CALL(receiver_proxy, OnMessage(_, _)) - .WillOnce([](auto message, auto cb) { - EXPECT_TRUE(message->Equals( - *PresentationConnectionMessage::NewMessage("beta"))); - std::move(cb).Run(true); - }); - receiver_ptr->OnMessage(PresentationConnectionMessage::NewMessage("beta"), - base::DoNothing()); + EXPECT_CALL(receiver_proxy, OnMessage(_)).WillOnce([](auto message) { + EXPECT_TRUE( + message->Equals(*PresentationConnectionMessage::NewMessage("beta"))); + }); + receiver_ptr->OnMessage(PresentationConnectionMessage::NewMessage("beta")); base::RunLoop().RunUntilIdle(); EXPECT_CALL(mock_local_manager, @@ -658,19 +652,14 @@ base::Unretained(&success_cb)), presentation_info, /** connection */ nullptr, media_route); - EXPECT_CALL(*router_, SendRouteMessageInternal(media_route.media_route_id(), - "alpha", _)) - .WillOnce( - [](const std::string&, const std::string&, - base::OnceCallback<void(bool)>& cb) { std::move(cb).Run(true); }); - connection_ptr->OnMessage(PresentationConnectionMessage::NewMessage("alpha"), - base::DoNothing()); + EXPECT_CALL(*router_, + SendRouteMessage(media_route.media_route_id(), "alpha")); + connection_ptr->OnMessage(PresentationConnectionMessage::NewMessage("alpha")); base::RunLoop().RunUntilIdle(); - EXPECT_CALL(mock_proxy, OnMessage(_, _)).WillOnce([](auto message, auto cb) { + EXPECT_CALL(mock_proxy, OnMessage(_)).WillOnce([](auto message) { EXPECT_TRUE( message->Equals(*PresentationConnectionMessage::NewMessage("beta"))); - std::move(cb).Run(true); }); std::vector<mojom::RouteMessagePtr> messages; messages.emplace_back(mojom::RouteMessage::New(
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc index 80cbbb1..e86518c4 100644 --- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc +++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
@@ -19,22 +19,6 @@ static constexpr base::TimeDelta kRefreshThreshold = base::TimeDelta::FromMinutes(1); -bool ShouldRefreshAppAvailability( - const CastAppAvailabilityTracker::AppAvailability& availability, - base::TimeTicks now) { - switch (availability.first) { - case cast_channel::GetAppAvailabilityResult::kAvailable: - return false; - case cast_channel::GetAppAvailabilityResult::kUnavailable: - return now - availability.second > kRefreshThreshold; - case cast_channel::GetAppAvailabilityResult::kUnknown: - return true; - } - - NOTREACHED(); - return false; -} - } // namespace CastAppDiscoveryServiceImpl::CastAppDiscoveryServiceImpl( @@ -82,9 +66,8 @@ base::Unretained(this), source)); // Note: even though we retain availability results for an app unregistered - // from the tracker, we will send app availability requests again when it - // is re-registered. This gives us a chance to refresh the results in case - // it changed. + // from the tracker, we will refresh the results when the app is + // re-registered. base::flat_set<std::string> new_app_ids = availability_tracker_.RegisterSource(source); const auto& sinks = media_sink_service_->GetSinks(); @@ -104,21 +87,17 @@ } } } - return callback_list->Add(callback); } void CastAppDiscoveryServiceImpl::Refresh() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const auto app_ids = availability_tracker_.GetRegisteredApps(); - base::TimeTicks now = clock_->NowTicks(); const auto& sinks = media_sink_service_->GetSinks(); // Note: The following logic assumes |sinks| will not change as it is // being iterated. for (const auto& sink : sinks) { for (const auto& app_id : app_ids) { - if (ShouldRefreshAppAvailability( - availability_tracker_.GetAvailability(sink.first, app_id), now)) { int channel_id = sink.second.cast_data().cast_channel_id; cast_channel::CastSocket* socket = socket_service_->GetSocket(channel_id); @@ -126,10 +105,8 @@ DVLOG(1) << "Socket not found for id " << channel_id; continue; } - RequestAppAvailability(socket, app_id, sink.first); } - } } } @@ -164,13 +141,8 @@ // Any queries that currently contains this sink should be updated. UpdateSinkQueries(availability_tracker_.GetSupportedSources(sink_id)); - for (const std::string& app_id : availability_tracker_.GetRegisteredApps()) { - auto availability = availability_tracker_.GetAvailability(sink_id, app_id); - if (availability.first != cast_channel::GetAppAvailabilityResult::kUnknown) - continue; - + for (const std::string& app_id : availability_tracker_.GetRegisteredApps()) RequestAppAvailability(socket, app_id, sink_id); - } } void CastAppDiscoveryServiceImpl::OnSinkRemoved(const MediaSinkInternal& sink) { @@ -183,11 +155,13 @@ cast_channel::CastSocket* socket, const std::string& app_id, const MediaSink::Id& sink_id) { - message_handler_->RequestAppAvailability( - socket, app_id, - base::BindOnce(&CastAppDiscoveryServiceImpl::UpdateAppAvailability, - weak_ptr_factory_.GetWeakPtr(), clock_->NowTicks(), - sink_id)); + base::TimeTicks now = clock_->NowTicks(); + if (ShouldRefreshAppAvailability(sink_id, app_id, now)) { + message_handler_->RequestAppAvailability( + socket, app_id, + base::BindOnce(&CastAppDiscoveryServiceImpl::UpdateAppAvailability, + weak_ptr_factory_.GetWeakPtr(), now, sink_id)); + } } void CastAppDiscoveryServiceImpl::UpdateAppAvailability( @@ -231,4 +205,22 @@ return sinks; } +bool CastAppDiscoveryServiceImpl::ShouldRefreshAppAvailability( + const MediaSink::Id& sink_id, + const std::string& app_id, + base::TimeTicks now) const { + auto availability = availability_tracker_.GetAvailability(sink_id, app_id); + switch (availability.first) { + case cast_channel::GetAppAvailabilityResult::kAvailable: + return false; + case cast_channel::GetAppAvailabilityResult::kUnavailable: + return now - availability.second > kRefreshThreshold; + case cast_channel::GetAppAvailabilityResult::kUnknown: + return true; + } + + NOTREACHED(); + return false; +} + } // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h index def76dc..3da4a4a 100644 --- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h +++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h
@@ -118,6 +118,13 @@ std::vector<MediaSinkInternal> GetSinksByIds( const base::flat_set<MediaSink::Id>& sink_ids) const; + // Returns true if an app availability request should be issued for |sink_id| + // and |app_id|. |now| is used for checking whether previously cached results + // should be refreshed. + bool ShouldRefreshAppAvailability(const MediaSink::Id& sink_id, + const std::string& app_id, + base::TimeTicks now) const; + // Registered sink queries and their associated callbacks. base::flat_map<MediaSource::Id, std::unique_ptr<SinkQueryCallbackList>> sink_queries_;
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc index 63dc64ea..b2eddb8 100644 --- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc +++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
@@ -116,6 +116,33 @@ RemoveSink(sink1); } +TEST_F(CastAppDiscoveryServiceTest, ReAddSinkQueryUsesCachedValue) { + auto subscription1 = StartObservingMediaSinksInitially(source_a_1_); + + // Adding a sink after app registered causes app availability request to be + // sent. + MediaSinkInternal sink1 = CreateCastSink(1); + cast_channel::GetAppAvailabilityCallback cb; + EXPECT_CALL(message_handler_, DoRequestAppAvailability(_, "AAAAAAAA", _)) + .WillOnce([&cb](cast_channel::CastSocket*, const std::string&, + cast_channel::GetAppAvailabilityCallback& callback) { + cb = std::move(callback); + }); + + AddOrUpdateSink(sink1); + + std::vector<MediaSinkInternal> sinks_1 = {sink1}; + EXPECT_CALL(*this, OnSinkQueryUpdated(source_a_1_.source_id(), sinks_1)); + std::move(cb).Run("AAAAAAAA", GetAppAvailabilityResult::kAvailable); + + subscription1.reset(); + + // Request not re-sent; cached kAvailable value is used. + EXPECT_CALL(message_handler_, DoRequestAppAvailability(_, _, _)).Times(0); + EXPECT_CALL(*this, OnSinkQueryUpdated(source_a_1_.source_id(), sinks_1)); + subscription1 = StartObservingMediaSinksInitially(source_a_1_); +} + TEST_F(CastAppDiscoveryServiceTest, SinkQueryUpdatedOnSinkUpdate) { auto subscription1 = StartObservingMediaSinksInitially(source_a_1_);
diff --git a/chrome/browser/media/router/providers/cast/cast_media_route_provider.cc b/chrome/browser/media/router/providers/cast/cast_media_route_provider.cc index 6a309fa..53ad94e 100644 --- a/chrome/browser/media/router/providers/cast/cast_media_route_provider.cc +++ b/chrome/browser/media/router/providers/cast/cast_media_route_provider.cc
@@ -122,20 +122,15 @@ RouteRequestResult::ResultCode::NO_SUPPORTED_PROVIDER); } -void CastMediaRouteProvider::SendRouteMessage( - const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) { +void CastMediaRouteProvider::SendRouteMessage(const std::string& media_route_id, + const std::string& message) { NOTIMPLEMENTED(); - std::move(callback).Run(false); } void CastMediaRouteProvider::SendRouteBinaryMessage( const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) { + const std::vector<uint8_t>& data) { NOTIMPLEMENTED(); - std::move(callback).Run(false); } void CastMediaRouteProvider::StartObservingMediaSinks(
diff --git a/chrome/browser/media/router/providers/cast/cast_media_route_provider.h b/chrome/browser/media/router/providers/cast/cast_media_route_provider.h index b23da2d..28d7d12 100644 --- a/chrome/browser/media/router/providers/cast/cast_media_route_provider.h +++ b/chrome/browser/media/router/providers/cast/cast_media_route_provider.h
@@ -63,11 +63,9 @@ void TerminateRoute(const std::string& route_id, TerminateRouteCallback callback) override; void SendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) override; + const std::string& message) override; void SendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) override; + const std::vector<uint8_t>& data) override; void StartObservingMediaSinks(const std::string& media_source) override; void StopObservingMediaSinks(const std::string& media_source) override; void StartObservingMediaRoutes(const std::string& media_source) override;
diff --git a/chrome/browser/media/router/providers/cast/chrome_cast_message_handler.cc b/chrome/browser/media/router/providers/cast/chrome_cast_message_handler.cc index a21b9b2f..1cdec93 100644 --- a/chrome/browser/media/router/providers/cast/chrome_cast_message_handler.cc +++ b/chrome/browser/media/router/providers/cast/chrome_cast_message_handler.cc
@@ -5,17 +5,26 @@ #include "chrome/browser/media/router/providers/cast/chrome_cast_message_handler.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/media/router/data_decoder_util.h" #include "chrome/common/chrome_content_client.h" #include "components/cast_channel/cast_message_handler.h" #include "components/cast_channel/cast_socket_service.h" #include "components/version_info/version_info.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/common/service_manager_connection.h" +#include "services/service_manager/public/cpp/connector.h" namespace media_router { cast_channel::CastMessageHandler* GetCastMessageHandler() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); static cast_channel::CastMessageHandler* instance = new cast_channel::CastMessageHandler( - cast_channel::CastSocketService::GetInstance(), GetUserAgent(), + cast_channel::CastSocketService::GetInstance(), + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone(), + kDataDecoderServiceBatchId, GetUserAgent(), version_info::GetVersionNumber(), g_browser_process->GetApplicationLocale()); return instance;
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc index d86e917..e4a4fb2 100644 --- a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc +++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
@@ -197,10 +197,8 @@ DoTerminateRoute(*activity, *sink, std::move(callback)); } -void DialMediaRouteProvider::SendRouteMessage( - const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) { +void DialMediaRouteProvider::SendRouteMessage(const std::string& media_route_id, + const std::string& message) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); data_decoder_->ParseJson( message, @@ -208,9 +206,6 @@ weak_ptr_factory_.GetWeakPtr(), media_route_id), base::BindRepeating(&ReportParseError, DialParseMessageResult::kParseError)); - // TODO(https://crbug.com/866551): SendRouteMessageCallback is no longer used. - // Always invoke it with true until it is removed. - std::move(callback).Run(true); } void DialMediaRouteProvider::HandleParsedRouteMessage( @@ -393,10 +388,8 @@ void DialMediaRouteProvider::SendRouteBinaryMessage( const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) { + const std::vector<uint8_t>& data) { NOTIMPLEMENTED(); - std::move(callback).Run(false); } void DialMediaRouteProvider::StartObservingMediaSinks(
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider.h b/chrome/browser/media/router/providers/dial/dial_media_route_provider.h index 31e53ce..d79afb9 100644 --- a/chrome/browser/media/router/providers/dial/dial_media_route_provider.h +++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider.h
@@ -89,11 +89,9 @@ void TerminateRoute(const std::string& route_id, TerminateRouteCallback callback) override; void SendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) override; + const std::string& message) override; void SendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) override; + const std::vector<uint8_t>& data) override; void StartObservingMediaSinks(const std::string& media_source) override; void StopObservingMediaSinks(const std::string& media_source) override; void StartObservingMediaRoutes(const std::string& media_source) override;
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc b/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc index af9deb2..8fe7bbd 100644 --- a/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc +++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc
@@ -196,8 +196,7 @@ })"; EXPECT_CALL(*mock_sink_service_.app_discovery_service(), DoFetchDialAppInfo(_, _)); - provider_->SendRouteMessage(route_id, kClientConnectMessage, - base::DoNothing()); + provider_->SendRouteMessage(route_id, kClientConnectMessage); base::RunLoop().RunUntilIdle(); auto app_info_cb = mock_sink_service_.app_discovery_service()->PassCallback(); @@ -252,10 +251,8 @@ activity_manager_->SetExpectedRequest(app_launch_url, "POST", "pairingCode=foo"); provider_->SendRouteMessage( - route_id, - base::StringPrintf(kCustomDialLaunchMessage, - custom_dial_launch_seq_number_), - base::DoNothing()); + route_id, base::StringPrintf(kCustomDialLaunchMessage, + custom_dial_launch_seq_number_)); base::RunLoop().RunUntilIdle(); // Simulate a successful launch response. @@ -325,8 +322,7 @@ network::ResourceResponseHead(), "", network::URLLoaderCompletionStatus()); - provider_->SendRouteMessage(route_id, kStopSessionMessage, - base::DoNothing()); + provider_->SendRouteMessage(route_id, kStopSessionMessage); ExpectTerminateRouteCommon(); }
diff --git a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.cc b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.cc index dc072ef..8de3556 100644 --- a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.cc +++ b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.cc
@@ -92,24 +92,20 @@ void ExtensionMediaRouteProviderProxy::SendRouteMessage( const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) { + const std::string& message) { request_manager_->RunOrDefer( base::BindOnce(&ExtensionMediaRouteProviderProxy::DoSendRouteMessage, - weak_factory_.GetWeakPtr(), media_route_id, message, - std::move(callback)), + weak_factory_.GetWeakPtr(), media_route_id, message), MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE); } void ExtensionMediaRouteProviderProxy::SendRouteBinaryMessage( const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) { + const std::vector<uint8_t>& data) { request_manager_->RunOrDefer( base::BindOnce( &ExtensionMediaRouteProviderProxy::DoSendRouteBinaryMessage, - weak_factory_.GetWeakPtr(), media_route_id, data, - std::move(callback)), + weak_factory_.GetWeakPtr(), media_route_id, data), MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE); } @@ -302,20 +298,16 @@ void ExtensionMediaRouteProviderProxy::DoSendRouteMessage( const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) { + const std::string& message) { DVLOG(1) << "DoSendRouteMessage " << media_route_id; - media_route_provider_->SendRouteMessage(media_route_id, message, - std::move(callback)); + media_route_provider_->SendRouteMessage(media_route_id, message); } void ExtensionMediaRouteProviderProxy::DoSendRouteBinaryMessage( const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) { + const std::vector<uint8_t>& data) { DVLOG(1) << "DoSendRouteBinaryMessage " << media_route_id; - media_route_provider_->SendRouteBinaryMessage(media_route_id, data, - std::move(callback)); + media_route_provider_->SendRouteBinaryMessage(media_route_id, data); } void ExtensionMediaRouteProviderProxy::DoStartObservingMediaSinks(
diff --git a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.h b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.h index 0d7ccd9..02c876ff 100644 --- a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.h +++ b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy.h
@@ -66,11 +66,9 @@ void TerminateRoute(const std::string& route_id, TerminateRouteCallback callback) override; void SendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) override; + const std::string& message) override; void SendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) override; + const std::vector<uint8_t>& data) override; void StartObservingMediaSinks(const std::string& media_source) override; void StopObservingMediaSinks(const std::string& media_source) override; void StartObservingMediaRoutes(const std::string& media_source) override; @@ -137,11 +135,9 @@ void DoTerminateRoute(const std::string& route_id, TerminateRouteCallback callback); void DoSendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback); + const std::string& message); void DoSendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback); + const std::vector<uint8_t>& data); void DoStartObservingMediaSinks(const std::string& media_source); void DoStopObservingMediaSinks(const std::string& media_source); void DoStartObservingMediaRoutes(const std::string& media_source);
diff --git a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy_unittest.cc b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy_unittest.cc index d1adf2fc..04f78af 100644 --- a/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy_unittest.cc +++ b/chrome/browser/media/router/providers/extension/extension_media_route_provider_proxy_unittest.cc
@@ -166,29 +166,18 @@ TEST_F(ExtensionMediaRouteProviderProxyTest, SendRouteMessage) { const std::string message = "message"; - EXPECT_CALL(mock_provider_, SendRouteMessageInternal(kRouteId, message, _)) - .WillOnce(WithArg<2>(Invoke( - &mock_provider_, &MockMediaRouteProvider::SendRouteMessageSuccess))); + EXPECT_CALL(mock_provider_, SendRouteMessage(kRouteId, message)); - MockBoolCallback callback; - provider_proxy_->SendRouteMessage( - kRouteId, message, - base::BindOnce(&MockBoolCallback::Run, base::Unretained(&callback))); + provider_proxy_->SendRouteMessage(kRouteId, message); base::RunLoop().RunUntilIdle(); } TEST_F(ExtensionMediaRouteProviderProxyTest, SendRouteBinaryMessage) { std::vector<uint8_t> data = {42}; EXPECT_CALL(mock_provider_, - SendRouteBinaryMessageInternal(kRouteId, ElementsAre(42), _)) - .WillOnce(WithArg<2>( - Invoke(&mock_provider_, - &MockMediaRouteProvider::SendRouteBinaryMessageSuccess))); + SendRouteBinaryMessage(kRouteId, ElementsAre(42))); - MockBoolCallback callback; - provider_proxy_->SendRouteBinaryMessage( - kRouteId, data, - base::BindOnce(&MockBoolCallback::Run, base::Unretained(&callback))); + provider_proxy_->SendRouteBinaryMessage(kRouteId, data); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc index f6a794a..b1405af 100644 --- a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc +++ b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
@@ -186,20 +186,16 @@ void WiredDisplayMediaRouteProvider::SendRouteMessage( const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) { + const std::string& message) { // Messages should be handled by LocalPresentationManager. NOTREACHED(); - std::move(callback).Run(false); } void WiredDisplayMediaRouteProvider::SendRouteBinaryMessage( const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) { + const std::vector<uint8_t>& data) { // Messages should be handled by LocalPresentationManager. NOTREACHED(); - std::move(callback).Run(false); } void WiredDisplayMediaRouteProvider::StartObservingMediaSinks(
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h index 0fa0917..d52ffbb7 100644 --- a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h +++ b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h
@@ -73,11 +73,9 @@ void TerminateRoute(const std::string& route_id, TerminateRouteCallback callback) override; void SendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) override; + const std::string& message) override; void SendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteBinaryMessageCallback callback) override; + const std::vector<uint8_t>& data) override; void StartObservingMediaSinks(const std::string& media_source) override; void StopObservingMediaSinks(const std::string& media_source) override; void StartObservingMediaRoutes(const std::string& media_source) override;
diff --git a/chrome/browser/media/router/test/media_router_mojo_test.cc b/chrome/browser/media/router/test/media_router_mojo_test.cc index c3c2067c..60d9c0e 100644 --- a/chrome/browser/media/router/test/media_router_mojo_test.cc +++ b/chrome/browser/media/router/test/media_router_mojo_test.cc
@@ -87,15 +87,6 @@ std::move(cb).Run(std::string(), RouteRequestResult::OK); } -void MockMediaRouteProvider::SendRouteMessageSuccess( - SendRouteMessageCallback& cb) const { - std::move(cb).Run(true); -} -void MockMediaRouteProvider::SendRouteBinaryMessageSuccess( - SendRouteBinaryMessageCallback& cb) const { - std::move(cb).Run(true); -} - void MockMediaRouteProvider::SearchSinksSuccess(SearchSinksCallback& cb) const { std::string sink_id = route_ ? route_->media_sink_id() : std::string(); std::move(cb).Run(sink_id); @@ -358,19 +349,8 @@ void MediaRouterMojoTest::TestSendRouteMessage() { ProvideTestRoute(MediaRouteProviderId::EXTENSION, kRouteId); - EXPECT_CALL(mock_extension_provider_, - SendRouteMessageInternal(kRouteId, kMessage, _)) - .WillOnce( - Invoke([](const MediaRoute::Id& route_id, const std::string& message, - mojom::MediaRouteProvider::SendRouteMessageCallback& cb) { - std::move(cb).Run(true); - })); - - SendMessageCallbackHandler handler; - EXPECT_CALL(handler, Invoke(true)); - router()->SendRouteMessage(kRouteId, kMessage, - base::BindOnce(&SendMessageCallbackHandler::Invoke, - base::Unretained(&handler))); + EXPECT_CALL(mock_extension_provider_, SendRouteMessage(kRouteId, kMessage)); + router()->SendRouteMessage(kRouteId, kMessage); base::RunLoop().RunUntilIdle(); } @@ -378,22 +358,14 @@ ProvideTestRoute(MediaRouteProviderId::EXTENSION, kRouteId); auto expected_binary_data = std::make_unique<std::vector<uint8_t>>( kBinaryMessage, kBinaryMessage + arraysize(kBinaryMessage)); - EXPECT_CALL(mock_extension_provider_, - SendRouteBinaryMessageInternal(kRouteId, _, _)) - .WillOnce(Invoke( - [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data, - mojom::MediaRouteProvider::SendRouteMessageCallback& cb) { + EXPECT_CALL(mock_extension_provider_, SendRouteBinaryMessage(kRouteId, _)) + .WillOnce( + [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data) { EXPECT_EQ(0, memcmp(kBinaryMessage, &(data[0]), arraysize(kBinaryMessage))); - std::move(cb).Run(true); - })); + }); - SendMessageCallbackHandler handler; - EXPECT_CALL(handler, Invoke(true)); - router()->SendRouteBinaryMessage( - kRouteId, std::move(expected_binary_data), - base::BindOnce(&SendMessageCallbackHandler::Invoke, - base::Unretained(&handler))); + router()->SendRouteBinaryMessage(kRouteId, std::move(expected_binary_data)); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/media/router/test/media_router_mojo_test.h b/chrome/browser/media/router/test/media_router_mojo_test.h index 33e52a0..b3c2af2 100644 --- a/chrome/browser/media/router/test/media_router_mojo_test.h +++ b/chrome/browser/media/router/test/media_router_mojo_test.h
@@ -109,24 +109,12 @@ TerminateRouteCallback& callback)); MOCK_METHOD1(StartObservingMediaSinks, void(const std::string& source)); MOCK_METHOD1(StopObservingMediaSinks, void(const std::string& source)); - void SendRouteMessage(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback callback) override { - SendRouteMessageInternal(media_route_id, message, callback); - } - MOCK_METHOD3(SendRouteMessageInternal, + MOCK_METHOD2(SendRouteMessage, void(const std::string& media_route_id, - const std::string& message, - SendRouteMessageCallback& callback)); - void SendRouteBinaryMessage(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteMessageCallback callback) override { - SendRouteBinaryMessageInternal(media_route_id, data, callback); - } - MOCK_METHOD3(SendRouteBinaryMessageInternal, + const std::string& message)); + MOCK_METHOD2(SendRouteBinaryMessage, void(const std::string& media_route_id, - const std::vector<uint8_t>& data, - SendRouteMessageCallback& callback)); + const std::vector<uint8_t>& data)); MOCK_METHOD1(StartListeningForRouteMessages, void(const std::string& route_id)); MOCK_METHOD1(StopListeningForRouteMessages, @@ -170,8 +158,6 @@ void RouteRequestSuccess(RouteCallback& cb) const; void RouteRequestTimeout(RouteCallback& cb) const; void TerminateRouteSuccess(TerminateRouteCallback& cb) const; - void SendRouteMessageSuccess(SendRouteMessageCallback& cb) const; - void SendRouteBinaryMessageSuccess(SendRouteBinaryMessageCallback& cb) const; void SearchSinksSuccess(SearchSinksCallback& cb) const; void CreateMediaRouteControllerSuccess( CreateMediaRouteControllerCallback& cb) const;
diff --git a/chrome/browser/media/router/test/mock_media_router.h b/chrome/browser/media/router/test/mock_media_router.h index 4c93869..40163a1 100644 --- a/chrome/browser/media/router/test/mock_media_router.h +++ b/chrome/browser/media/router/test/mock_media_router.h
@@ -98,27 +98,12 @@ MOCK_METHOD1(DetachRoute, void(const MediaRoute::Id& route_id)); MOCK_METHOD1(TerminateRoute, void(const MediaRoute::Id& route_id)); - - void SendRouteMessage(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback callback) override { - SendRouteMessageInternal(route_id, message, callback); - } - MOCK_METHOD3(SendRouteMessageInternal, + MOCK_METHOD2(SendRouteMessage, void(const MediaRoute::Id& route_id, - const std::string& message, - SendRouteMessageCallback& callback)); - - void SendRouteBinaryMessage(const MediaRoute::Id& route_id, - std::unique_ptr<std::vector<uint8_t>> data, - SendRouteMessageCallback callback) override { - SendRouteBinaryMessageInternal(route_id, data.get(), callback); - } - MOCK_METHOD3(SendRouteBinaryMessageInternal, + const std::string& message)); + MOCK_METHOD2(SendRouteBinaryMessage, void(const MediaRoute::Id& route_id, - std::vector<uint8_t>* data, - SendRouteMessageCallback& callback)); - + std::unique_ptr<std::vector<uint8_t>> data)); MOCK_METHOD0(OnUserGesture, void()); void SearchSinks(const MediaSink::Id& sink_id,
diff --git a/chrome/browser/media/router/test/test_helper.h b/chrome/browser/media/router/test/test_helper.h index d57eacd..ebbdb2f 100644 --- a/chrome/browser/media/router/test/test_helper.h +++ b/chrome/browser/media/router/test/test_helper.h
@@ -101,9 +101,7 @@ public: MockPresentationConnectionProxy(); ~MockPresentationConnectionProxy() override; - MOCK_METHOD2(OnMessage, - void(blink::mojom::PresentationConnectionMessagePtr, - OnMessageCallback)); + MOCK_METHOD1(OnMessage, void(blink::mojom::PresentationConnectionMessagePtr)); MOCK_METHOD1(DidChangeState, void(blink::mojom::PresentationConnectionState state)); MOCK_METHOD0(RequestClose, void());
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc index 1149b03..d68a85f1 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -333,6 +333,7 @@ int render_process_id, const std::string& peer_connection_id, size_t max_file_size_bytes, + size_t web_app_id, base::OnceCallback<void(bool, const std::string&, const std::string&)> reply) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -370,7 +371,7 @@ base::Unretained(this), render_process_id, browser_context_id, peer_connection_id, browser_context->GetPath(), max_file_size_bytes, - std::move(reply))); + web_app_id, std::move(reply))); } void WebRtcEventLogManager::ClearCacheForBrowserContext( @@ -778,6 +779,7 @@ const std::string& peer_connection_id, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, + size_t web_app_id, base::OnceCallback<void(bool, const std::string&, const std::string&)> reply) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -786,7 +788,8 @@ std::string error_message; const bool result = remote_logs_manager_.StartRemoteLogging( render_process_id, browser_context_id, peer_connection_id, - browser_context_dir, max_file_size_bytes, &log_id, &error_message); + browser_context_dir, max_file_size_bytes, web_app_id, &log_id, + &error_message); // |log_id| set only if successful; |error_message| set only if unsuccessful. DCHECK_EQ(result, !log_id.empty());
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.h b/chrome/browser/media/webrtc/webrtc_event_log_manager.h index 46a99caa..bef65f3 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager.h +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
@@ -132,6 +132,7 @@ int render_process_id, const std::string& peer_connection_id, size_t max_file_size_bytes, + size_t web_app_id, base::OnceCallback<void(bool, const std::string&, const std::string&)> reply); @@ -280,6 +281,7 @@ const std::string& peer_connection_id, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, + size_t web_app_id, base::OnceCallback<void(bool, const std::string&, const std::string&)> reply);
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_common.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_common.cc index 98c21ea..77dffac 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager_common.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_common.cc
@@ -4,12 +4,18 @@ #include "chrome/browser/media/webrtc/webrtc_event_log_manager_common.h" +#include <cctype> #include <limits> #include "base/files/file_util.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" +#include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" +#include "base/strings/stringprintf.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "base/unguessable_token.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" @@ -21,12 +27,28 @@ const size_t kWebRtcEventLogManagerUnlimitedFileSize = 0; +const size_t kWebRtcEventLogIdLength = 32; + +// Be careful not to change these without updating the number of characters +// reserved in the filename. See kWebAppIdLength. +const size_t kMinWebRtcEventLogWebAppId = 1; +const size_t kMaxWebRtcEventLogWebAppId = 99; + +// Sentinel value for an invalid web-app ID. +const size_t kInvalidWebRtcEventLogWebAppId = 0; +static_assert(kInvalidWebRtcEventLogWebAppId < kMinWebRtcEventLogWebAppId || + kInvalidWebRtcEventLogWebAppId > kMaxWebRtcEventLogWebAppId, + "Sentinel value must be distinct from legal values."); + +const char kRemoteBoundWebRtcEventLogFileNamePrefix[] = "webrtc_event_log"; + const char kStartRemoteLoggingFailureFeatureDisabled[] = "Feature disabled."; const char kStartRemoteLoggingFailureUnlimitedSizeDisallowed[] = "Unlimited size disallowed."; const char kStartRemoteLoggingFailureMaxSizeTooSmall[] = "Max size too small."; const char kStartRemoteLoggingFailureMaxSizeTooLarge[] = "Excessively large max log size."; +const char kStartRemoteLoggingFailureIllegalWebAppId[] = "Illegal web-app ID."; const char kStartRemoteLoggingFailureUnknownOrInactivePeerConnection[] = "Unknown or inactive peer connection."; const char kStartRemoteLoggingFailureAlreadyLogging[] = "Already logging."; @@ -42,6 +64,8 @@ constexpr size_t kGzipHeaderBytes = 15; constexpr size_t kGzipFooterBytes = 10; +constexpr size_t kWebAppIdLength = 2; + // Tracks budget over a resource (such as bytes allowed in a file, etc.). // Allows an unlimited budget. class Budget { @@ -674,6 +698,28 @@ return success; } +// Given a string with a textual representation of a web-app ID, return the +// ID in integer form. If the textual representation does not name a valid +// web-app ID, return kInvalidWebRtcEventLogWebAppId. +size_t ExtractWebAppId(base::StringPiece str) { + DCHECK_EQ(str.length(), kWebAppIdLength); + + // Avoid leading '+', etc. + for (size_t i = 0; i < str.length(); i++) { + if (!std::isdigit(str[i])) { + return kInvalidWebRtcEventLogWebAppId; + } + } + + size_t result; + if (!base::StringToSizeT(str, &result) || + result < kMinWebRtcEventLogWebAppId || + result > kMaxWebRtcEventLogWebAppId) { + return kInvalidWebRtcEventLogWebAppId; + } + return result; +} + } // namespace const size_t kGzipOverheadBytes = kGzipHeaderBytes + kGzipFooterBytes; @@ -790,6 +836,17 @@ return result; } +// Create a random identifier of 32 hexadecimal (uppercase) characters. +std::string CreateWebRtcEventLogId() { + // UnguessableToken's interface makes no promisses over case. We therefore + // convert, even if the current implementation does not require it. + std::string log_id = + base::ToUpperASCII(base::UnguessableToken::Create().ToString()); + DCHECK_EQ(log_id.size(), kWebRtcEventLogIdLength); + DCHECK_EQ(log_id.find_first_not_of("0123456789ABCDEF"), std::string::npos); + return log_id; +} + BrowserContextId GetBrowserContextId( const content::BrowserContext* browser_context) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -815,29 +872,116 @@ return browser_context_dir.Append(kRemoteBoundLogSubDirectory); } -base::FilePath GetWebRtcEventLogHistoryFilePath(const base::FilePath& log) { - return log.RemoveExtension().AddExtension(kWebRtcEventLogHistoryExtension); +base::FilePath WebRtcEventLogPath( + const base::FilePath& remote_logs_dir, + const std::string& log_id, + size_t web_app_id, + const base::FilePath::StringPieceType& extension) { + DCHECK_GE(web_app_id, kMinWebRtcEventLogWebAppId); + DCHECK_LE(web_app_id, kMaxWebRtcEventLogWebAppId); + + static_assert(kWebAppIdLength == 2u, "Fix the code below."); + const std::string web_app_id_str = base::StringPrintf("%02zu", web_app_id); + DCHECK_EQ(web_app_id_str.length(), kWebAppIdLength); + + const std::string filename = + std::string(kRemoteBoundWebRtcEventLogFileNamePrefix) + "_" + + web_app_id_str + "_" + log_id; + + return remote_logs_dir.AppendASCII(filename).AddExtension(extension); +} + +bool IsValidRemoteBoundLogFilename(const std::string& filename) { + // The -1 is because of the implict \0. + const size_t kPrefixLength = + base::size(kRemoteBoundWebRtcEventLogFileNamePrefix) - 1; + + // [prefix]_[web_app_id]_[log_id] + const size_t expected_length = + kPrefixLength + 1 + kWebAppIdLength + 1 + kWebRtcEventLogIdLength; + if (filename.length() != expected_length) { + return false; + } + + size_t index = 0; + + // Expect prefix. + if (filename.find(kRemoteBoundWebRtcEventLogFileNamePrefix) != index) { + return false; + } + index += kPrefixLength; + + // Expect underscore between prefix and web-app ID. + if (filename[index] != '_') { + return false; + } + index += 1; + + // Expect web-app-ID. + const size_t web_app_id = + ExtractWebAppId(base::StringPiece(&filename[index], kWebAppIdLength)); + if (web_app_id == kInvalidWebRtcEventLogWebAppId) { + return false; + } + index += kWebAppIdLength; + + // Expect underscore between web-app ID and log ID. + if (filename[index] != '_') { + return false; + } + index += 1; + + // Expect log ID. + const std::string log_id = filename.substr(index); + DCHECK_EQ(log_id.length(), kWebRtcEventLogIdLength); + const char* const log_id_chars = "0123456789ABCDEF"; + if (filename.find_first_not_of(log_id_chars, index) != std::string::npos) { + return false; + } + + return true; +} + +bool IsValidRemoteBoundLogFilePath(const base::FilePath& path) { + const std::string filename = path.BaseName().RemoveExtension().MaybeAsASCII(); + return IsValidRemoteBoundLogFilename(filename); +} + +base::FilePath GetWebRtcEventLogHistoryFilePath(const base::FilePath& path) { + // TODO(crbug.com/775415): Check for validity (after fixing unit tests). + return path.RemoveExtension().AddExtension(kWebRtcEventLogHistoryExtension); } std::string ExtractRemoteBoundWebRtcEventLogLocalIdFromPath( const base::FilePath& path) { const std::string filename = path.BaseName().RemoveExtension().MaybeAsASCII(); - - if (filename.empty()) { - LOG(WARNING) << "Non-ASCII or empty filename."; + if (!IsValidRemoteBoundLogFilename(filename)) { + LOG(WARNING) << "Invalid remote-bound WebRTC event log filename."; return std::string(); } - const std::string prefix = - base::FilePath(kRemoteBoundWebRtcEventLogFileNamePrefix).MaybeAsASCII(); - DCHECK(!prefix.empty()); + DCHECK_GE(filename.length(), kWebRtcEventLogIdLength); + return filename.substr(filename.length() - kWebRtcEventLogIdLength); +} - if (filename.find(prefix) != 0) { - LOG(WARNING) << "Filename does not begin with expected prefix."; - return std::string(); +size_t ExtractRemoteBoundWebRtcEventLogWebAppIdFromPath( + const base::FilePath& path) { + const std::string filename = path.BaseName().RemoveExtension().MaybeAsASCII(); + if (!IsValidRemoteBoundLogFilename(filename)) { + LOG(WARNING) << "Invalid remote-bound WebRTC event log filename."; + return kInvalidWebRtcEventLogWebAppId; } - return filename.substr(prefix.length()); + // The -1 is because of the implict \0. + const size_t kPrefixLength = + base::size(kRemoteBoundWebRtcEventLogFileNamePrefix) - 1; + + // The +1 is for the underscore between the prefix and the web-app ID. + // Length verified by above call to IsValidRemoteBoundLogFilename(). + DCHECK_GE(filename.length(), kPrefixLength + 1 + kWebAppIdLength); + base::StringPiece id_str(&filename[kPrefixLength + 1], kWebAppIdLength); + + return ExtractWebAppId(id_str); } } // namespace webrtc_event_logging
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h b/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h index 322d9289..f00455c 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_common.h
@@ -35,6 +35,16 @@ // Maximum size for a response from Crash, which is the upload ID. extern const size_t kWebRtcEventLogMaxUploadIdBytes; +// The number of digits required to encode a remote-bound log ID. +extern const size_t kWebRtcEventLogIdLength; + +// Min/max legal web-app IDs. +extern const size_t kMinWebRtcEventLogWebAppId; +extern const size_t kMaxWebRtcEventLogWebAppId; + +// Sentinel value, guaranteed not to fall inside the range of min-max valid IDs. +extern const size_t kInvalidWebRtcEventLogWebAppId; + // Limit over the number of concurrently active (currently being written to // disk) remote-bound log files. This limits IO operations, and so it is // applied globally (all browser contexts are limited together). @@ -55,14 +65,17 @@ // Overhead incurred by GZIP due to its header and footer. extern const size_t kGzipOverheadBytes; -// Remote-bound log files' names will be of the format [prefix]_[log_id].[ext], -// where |prefix| is equal to kRemoteBoundWebRtcEventLogFileNamePrefix, -// |log_id| is composed of 32 random characters from '0'-'9' and 'A'-'F', -// and |ext| is the extension determined by the used LogCompressor::Factory, -// which will be either kWebRtcEventLogUncompressedExtension or -// kWebRtcEventLogGzippedExtension. -extern const base::FilePath::CharType - kRemoteBoundWebRtcEventLogFileNamePrefix[]; +// Remote-bound log files' names will be of the format: +// [prefix]_[web_app_id]_[log_id].[ext] +// Where: +// * |prefix| is equal to kRemoteBoundWebRtcEventLogFileNamePrefix. +// * |web_app_id| is a number between kMinWebRtcEventLogWebAppId and +// kMaxWebRtcEventLogWebAppId, with zero padding. +// * |log_id| is composed of 32 random characters from '0'-'9' and 'A'-'F'. +// * |ext| is the extension determined by the used LogCompressor::Factory, +// which will be either kWebRtcEventLogUncompressedExtension or +// kWebRtcEventLogGzippedExtension. +extern const char kRemoteBoundWebRtcEventLogFileNamePrefix[]; extern const base::FilePath::CharType kWebRtcEventLogUncompressedExtension[]; extern const base::FilePath::CharType kWebRtcEventLogGzippedExtension[]; @@ -87,6 +100,7 @@ extern const char kStartRemoteLoggingFailureUnlimitedSizeDisallowed[]; extern const char kStartRemoteLoggingFailureMaxSizeTooSmall[]; extern const char kStartRemoteLoggingFailureMaxSizeTooLarge[]; +extern const char kStartRemoteLoggingFailureIllegalWebAppId[]; extern const char kStartRemoteLoggingFailureUnknownOrInactivePeerConnection[]; extern const char kStartRemoteLoggingFailureAlreadyLogging[]; extern const char kStartRemoteLoggingFailureGeneric[]; @@ -418,6 +432,9 @@ std::unique_ptr<GzipLogCompressorFactory> gzip_compressor_factory_; }; +// Create a random identifier of 32 hexadecimal (uppercase) characters. +std::string CreateWebRtcEventLogId(); + // Translate a BrowserContext into an ID. This lets us associate PeerConnections // with BrowserContexts, while making sure that we never call the // BrowserContext's methods outside of the UI thread (because we can't call them @@ -438,15 +455,33 @@ base::FilePath GetRemoteBoundWebRtcEventLogsDir( const base::FilePath& browser_context_dir); +// Produce the path to a remote-bound WebRTC event log file with the given +// log ID, web-app ID and extension, in the given directory. +base::FilePath WebRtcEventLogPath( + const base::FilePath& remote_logs_dir, + const std::string& log_id, + size_t web_app_id, + const base::FilePath::StringPieceType& extension); + +// Checks whether the path/filename would be a valid reference to a remote-bound +// even log. These functions do not examine the file's content or its extension. +bool IsValidRemoteBoundLogFilename(const std::string& filename); +bool IsValidRemoteBoundLogFilePath(const base::FilePath& path); + // Given WebRTC event log's path, return the path to the history file that // is, or would be, associated with it. -base::FilePath GetWebRtcEventLogHistoryFilePath(const base::FilePath& log); +base::FilePath GetWebRtcEventLogHistoryFilePath(const base::FilePath& path); // Attempts to extract the local ID from the file's path. Returns the empty // string in case of an error. std::string ExtractRemoteBoundWebRtcEventLogLocalIdFromPath( const base::FilePath& path); +// Attempts to extract the web-app ID from the file's path. +// Returns kInvalidWebRtcEventLogWebAppId in case of an error. +size_t ExtractRemoteBoundWebRtcEventLogWebAppIdFromPath( + const base::FilePath& path); + } // namespace webrtc_event_logging #endif // CHROME_BROWSER_MEDIA_WEBRTC_WEBRTC_EVENT_LOG_MANAGER_COMMON_H_
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc index 448640b..3c018fb 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
@@ -17,7 +17,6 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" -#include "base/unguessable_token.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_thread.h" @@ -85,17 +84,6 @@ (range_end.is_null() || time_point < range_end); } -// Create a random identifier of 32 hexadecimal (uppercase) characters. -std::string CreateLogId() { - // UnguessableToken's interface makes no promisses over case. We therefore - // convert, even if the current implementation does not require it. - std::string log_id = - base::ToUpperASCII(base::UnguessableToken::Create().ToString()); - DCHECK_EQ(log_id.size(), 32u); - DCHECK_EQ(log_id.find_first_not_of("0123456789ABCDEF"), std::string::npos); - return log_id; -} - // Do not attempt to upload when there is no active connection. // Do not attempt to upload if the connection is known to be a mobile one. // Err on the side of caution with unknown connection types (by not uploading). @@ -199,13 +187,6 @@ // on chrome://webrtc-logs/. It is persisted for longer than the log itself. const base::TimeDelta kHistoryFileRetention = base::TimeDelta::FromDays(30); -// The "01" prefix is for future-proofing. If more than one web-app is allowed -// to log, but all upload the logs to Crash, this will allow us to distinguish -// logs from different web-apps. -// TODO(crbug.com/775415): Support additional web-apps. -const base::FilePath::CharType kRemoteBoundWebRtcEventLogFileNamePrefix[] = - FILE_PATH_LITERAL("webrtc_event_log_01_"); - WebRtcRemoteEventLogManager::WebRtcRemoteEventLogManager( WebRtcRemoteEventLogsObserver* observer, scoped_refptr<base::SequencedTaskRunner> task_runner) @@ -410,6 +391,7 @@ const std::string& peer_connection_id, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, + size_t web_app_id, std::string* log_id, std::string* error_message) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -418,7 +400,7 @@ DCHECK(error_message); DCHECK(error_message->empty()); - if (!AreLogParametersValid(max_file_size_bytes, error_message)) { + if (!AreLogParametersValid(max_file_size_bytes, web_app_id, error_message)) { // |error_message| will have been set by AreLogParametersValid(). DCHECK(!error_message->empty()) << "AreLogParametersValid() reported an " "error without an error message."; @@ -457,8 +439,8 @@ return false; } - return StartWritingLog(key, browser_context_dir, max_file_size_bytes, log_id, - error_message); + return StartWritingLog(key, browser_context_dir, max_file_size_bytes, + web_app_id, log_id, error_message); } bool WebRtcRemoteEventLogManager::EventLogWrite(const PeerConnectionKey& key, @@ -648,6 +630,7 @@ bool WebRtcRemoteEventLogManager::AreLogParametersValid( size_t max_file_size_bytes, + size_t web_app_id, std::string* error_message) const { DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -669,6 +652,13 @@ return false; } + if (web_app_id < kMinWebRtcEventLogWebAppId || + web_app_id > kMaxWebRtcEventLogWebAppId) { + LOG(WARNING) << "Illegal web-app identifier."; + *error_message = kStartRemoteLoggingFailureIllegalWebAppId; + return false; + } + return true; } @@ -803,6 +793,10 @@ base::Time last_modified) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); + if (!IsValidRemoteBoundLogFilePath(path)) { + return false; + } + const base::FilePath history_path = GetWebRtcEventLogHistoryFilePath(path); if (base::PathExists(history_path)) { // Log file has associated history file, indicating an upload was started @@ -829,6 +823,10 @@ const base::Time& prune_end) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); + if (!IsValidRemoteBoundLogFilePath(path)) { + return nullptr; + } + std::unique_ptr<WebRtcEventLogHistoryFileReader> reader = WebRtcEventLogHistoryFileReader::Create(path); if (!reader) { @@ -922,41 +920,47 @@ const PeerConnectionKey& key, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, - std::string* log_id, - std::string* error_message) { + size_t web_app_id, + std::string* log_id_out, + std::string* error_message_out) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); // The log is assigned a universally unique ID (with high probability). - const std::string id = CreateLogId(); + const std::string log_id = CreateWebRtcEventLogId(); // Use the log ID as part of the filename. In the highly unlikely event that // this filename is already taken, or that an earlier log with the same name // existed and left a history file behind, it will be treated the same way as // any other failure to start the log file. // TODO(crbug.com/775415): Add a unit test for above comment. - const base::FilePath base_path = + const base::FilePath remote_logs_dir = GetRemoteBoundWebRtcEventLogsDir(browser_context_dir); - const base::FilePath file_path = - base_path.Append(kRemoteBoundWebRtcEventLogFileNamePrefix) - .AddExtension(log_file_writer_factory_->Extension()) - .InsertBeforeExtensionASCII(id); + const base::FilePath log_path = + WebRtcEventLogPath(remote_logs_dir, log_id, web_app_id, + log_file_writer_factory_->Extension()); + + if (base::PathExists(log_path)) { + LOG(ERROR) << "Previously used ID selected."; + *error_message_out = kStartRemoteLoggingFailureGeneric; + return false; + } const base::FilePath history_file_path = - GetWebRtcEventLogHistoryFilePath(file_path); + GetWebRtcEventLogHistoryFilePath(log_path); if (base::PathExists(history_file_path)) { LOG(ERROR) << "Previously used ID selected."; - *error_message = kStartRemoteLoggingFailureGeneric; + *error_message_out = kStartRemoteLoggingFailureGeneric; return false; } // The log is now ACTIVE. DCHECK_NE(max_file_size_bytes, kWebRtcEventLogManagerUnlimitedFileSize); auto log_file = - log_file_writer_factory_->Create(file_path, max_file_size_bytes); + log_file_writer_factory_->Create(log_path, max_file_size_bytes); if (!log_file) { // TODO(crbug.com/775415): Add UMA for exact failure type. LOG(ERROR) << "Failed to initialize remote-bound WebRTC event log file."; - *error_message = kStartRemoteLoggingFailureGeneric; + *error_message_out = kStartRemoteLoggingFailureGeneric; return false; } const auto it = active_logs_.emplace(key, std::move(log_file)); @@ -964,7 +968,7 @@ observer_->OnRemoteLogStarted(key, it.first->second->path()); - *log_id = id; + *log_id_out = log_id; return true; }
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h index c5f5a70..373cfa8 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
@@ -89,12 +89,15 @@ // 3. The maximum file size must be sensible. // // If all of the restrictions were observed, and if a file was successfully - // created, true will be return. + // created, true will be returned. // // If the call succeeds, the log's identifier will be written to |log_id|. // The log identifier is exactly 32 uppercase ASCII characters from the // ranges 0-9 and A-F. // + // The log's filename will also incorporate |web_app_id|. + // |web_app_id| must be between 1 and 99 (inclusive); error otherwise. + // // If the call fails, an error message is written to |error_message|. // The error message will be specific to the failure (as opposed to a generic // one) is produced only if that error message is useful for the caller: @@ -109,6 +112,7 @@ const std::string& peer_connection_id, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, + size_t web_app_id, std::string* log_id, std::string* error_message); @@ -173,10 +177,11 @@ void ShutDownForTesting(base::OnceClosure reply); private: - // Validates log parameters (at the moment, only max file size). + // Validates log parameters. // If valid, returns true. Otherwise, false, and |error_message| gets // a relevant error. bool AreLogParametersValid(size_t max_file_size_bytes, + size_t web_app_id, std::string* error_message) const; // Checks whether a browser context has already been enabled via a call to @@ -240,8 +245,9 @@ bool StartWritingLog(const PeerConnectionKey& key, const base::FilePath& browser_context_dir, size_t max_file_size_bytes, - std::string* log_id, - std::string* error_message); + size_t web_app_id, + std::string* log_id_out, + std::string* error_message_out); // Checks if the referenced peer connection has an associated active // remote-bound log. If it does, the log is changed from ACTIVE to PENDING.
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc index 9dc2a42..aeb132d 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
@@ -113,7 +113,8 @@ #endif // Common default/arbitrary values. -static constexpr int kLid = 478; +constexpr int kLid = 478; +constexpr size_t kWebAppId = 42; PeerConnectionKey GetPeerConnectionKey(const RenderProcessHost* rph, int lid) { const BrowserContext* browser_context = rph->GetBrowserContext(); @@ -122,17 +123,32 @@ } bool CreateRemoteBoundLogFile(const base::FilePath& dir, + size_t web_app_id, const base::FilePath::StringPieceType& extension, + base::Time capture_time, base::FilePath* file_path, base::File* file) { *file_path = - dir.Append(kRemoteBoundWebRtcEventLogFileNamePrefix) - .InsertBeforeExtensionASCII("01234567890123456789012345678901") + dir.AsEndingWithSeparator() + .InsertBeforeExtensionASCII(kRemoteBoundWebRtcEventLogFileNamePrefix) + .InsertBeforeExtensionASCII("_") + .InsertBeforeExtensionASCII(std::to_string(web_app_id)) + .InsertBeforeExtensionASCII("_") + .InsertBeforeExtensionASCII(CreateWebRtcEventLogId()) .AddExtension(extension); + constexpr int file_flags = base::File::FLAG_CREATE | base::File::FLAG_WRITE | base::File::FLAG_EXCLUSIVE_WRITE; file->Initialize(*file_path, file_flags); - return (file->IsValid() && file->created()); + if (!file->IsValid() || !file->created()) { + return false; + } + + if (!base::TouchFile(*file_path, capture_time, capture_time)) { + return false; + } + + return true; } // This implementation does not upload files, nor pretends to have finished an @@ -418,9 +434,10 @@ return result; } - bool StartRemoteLogging(int render_process_id, + bool StartRemoteLogging(const PeerConnectionKey& key, const std::string& peer_connection_id, size_t max_size_bytes, + size_t web_app_id, std::string* log_id_output = nullptr, std::string* error_message_output = nullptr) { bool result; @@ -428,7 +445,7 @@ std::string error_message; event_log_manager_->StartRemoteLogging( - render_process_id, peer_connection_id, max_size_bytes, + key.render_process_id, peer_connection_id, max_size_bytes, web_app_id, ReplyClosure(&result, &log_id, &error_message)); WaitForReply(); @@ -437,37 +454,40 @@ DCHECK_EQ(result, !log_id.empty()); DCHECK_EQ(!result, !error_message.empty()); - if (error_message_output) { - *error_message_output = error_message; - } - if (log_id_output) { *log_id_output = log_id; } + if (error_message_output) { + *error_message_output = error_message; + } + return result; } - bool StartRemoteLogging(int render_process_id, + bool StartRemoteLogging(const PeerConnectionKey& key, + const std::string& peer_connection_id, + size_t max_size_bytes, + std::string* log_id_output = nullptr, + std::string* error_message_output = nullptr) { + return StartRemoteLogging(key, peer_connection_id, max_size_bytes, + kWebAppId, log_id_output, error_message_output); + } + + bool StartRemoteLogging(const PeerConnectionKey& key, const std::string& peer_connection_id, std::string* log_id_output = nullptr, std::string* error_message_output = nullptr) { - return StartRemoteLogging(render_process_id, peer_connection_id, - kMaxRemoteLogFileSizeBytes, log_id_output, - error_message_output); + return StartRemoteLogging(key, peer_connection_id, + kMaxRemoteLogFileSizeBytes, kWebAppId, + log_id_output, error_message_output); } bool StartRemoteLogging(const PeerConnectionKey& key, std::string* log_id_output = nullptr, std::string* error_message_output = nullptr) { - return StartRemoteLogging(key.render_process_id, GetUniqueId(key), - kMaxRemoteLogFileSizeBytes, log_id_output, - error_message_output); - } - - bool StartRemoteLogging(const PeerConnectionKey& key, size_t max_size_bytes) { - return StartRemoteLogging(key.render_process_id, GetUniqueId(key), - max_size_bytes); + return StartRemoteLogging(key, GetUniqueId(key), kMaxRemoteLogFileSizeBytes, + kWebAppId, log_id_output, error_message_output); } void ClearCacheForBrowserContext( @@ -1020,11 +1040,12 @@ // Seed the remote logs' directory with one log file, simulating the // creation of logs in a previous session. - ASSERT_TRUE(CreateDirectory(remote_logs_dir)); + ASSERT_TRUE(base::CreateDirectory(remote_logs_dir)); base::FilePath file_path; - ASSERT_TRUE(CreateRemoteBoundLogFile(remote_logs_dir, remote_log_extension_, - &file_path, &file_)); + ASSERT_TRUE(CreateRemoteBoundLogFile( + remote_logs_dir, kWebAppId, remote_log_extension_, base::Time::Now(), + &file_path, &file_)); expected_files_.emplace_back(browser_context_id_, file_path, GetLastModificationTime(file_path)); @@ -1928,8 +1949,7 @@ StartRemoteLoggingReturnsFalseIfUnknownPeerConnection) { const auto key = GetPeerConnectionKey(rph_.get(), 0); std::string error_message; - EXPECT_FALSE( - StartRemoteLogging(key.render_process_id, "id", nullptr, &error_message)); + EXPECT_FALSE(StartRemoteLogging(key, "id", nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureUnknownOrInactivePeerConnection); } @@ -1939,8 +1959,7 @@ const auto key = GetPeerConnectionKey(rph_.get(), 0); ASSERT_TRUE(PeerConnectionAdded(key, "real_id")); std::string error_message; - EXPECT_FALSE(StartRemoteLogging(key.render_process_id, "wrong_id", nullptr, - &error_message)); + EXPECT_FALSE(StartRemoteLogging(key, "wrong_id", nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureUnknownOrInactivePeerConnection); } @@ -1950,7 +1969,7 @@ const auto key = GetPeerConnectionKey(rph_.get(), kLid); const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); - EXPECT_TRUE(StartRemoteLogging(key.render_process_id, id)); + EXPECT_TRUE(StartRemoteLogging(key, id)); } TEST_F(WebRtcEventLogManagerTest, @@ -1958,10 +1977,9 @@ const auto key = GetPeerConnectionKey(rph_.get(), kLid); const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); - ASSERT_TRUE(StartRemoteLogging(key.render_process_id, id)); + ASSERT_TRUE(StartRemoteLogging(key, id)); std::string error_message; - EXPECT_FALSE( - StartRemoteLogging(key.render_process_id, id, nullptr, &error_message)); + EXPECT_FALSE(StartRemoteLogging(key, id, nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureAlreadyLogging); } @@ -1971,7 +1989,7 @@ const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); std::string error_message; - EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id, + EXPECT_FALSE(StartRemoteLogging(key, id, kWebRtcEventLogManagerUnlimitedFileSize, nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureUnlimitedSizeDisallowed); @@ -1982,8 +2000,7 @@ const auto key = GetPeerConnectionKey(rph_.get(), kLid); const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); - EXPECT_TRUE(StartRemoteLogging(key.render_process_id, id, - kMaxRemoteLogFileSizeBytes)); + EXPECT_TRUE(StartRemoteLogging(key, id, kMaxRemoteLogFileSizeBytes)); } TEST_F(WebRtcEventLogManagerTest, @@ -1996,8 +2013,8 @@ const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); std::string error_message; - EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id, min_size - 1, - nullptr, &error_message)); + EXPECT_FALSE( + StartRemoteLogging(key, id, min_size - 1, nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureMaxSizeTooSmall); } @@ -2007,9 +2024,8 @@ const std::string id = "id"; // For explicitness' sake. ASSERT_TRUE(PeerConnectionAdded(key, id)); std::string error_message; - EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id, - kMaxRemoteLogFileSizeBytes + 1, nullptr, - &error_message)); + EXPECT_FALSE(StartRemoteLogging(key, id, kMaxRemoteLogFileSizeBytes + 1, + nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureMaxSizeTooLarge); } @@ -2020,8 +2036,7 @@ ASSERT_TRUE(PeerConnectionAdded(key, id)); ASSERT_TRUE(PeerConnectionRemoved(key)); std::string error_message; - EXPECT_FALSE( - StartRemoteLogging(key.render_process_id, id, nullptr, &error_message)); + EXPECT_FALSE(StartRemoteLogging(key, id, nullptr, &error_message)); EXPECT_EQ(error_message, kStartRemoteLoggingFailureUnknownOrInactivePeerConnection); } @@ -2034,7 +2049,7 @@ ASSERT_TRUE(PeerConnectionRemoved(key)); std::string log_id; - ASSERT_FALSE(StartRemoteLogging(key.render_process_id, pc_id, &log_id)); + ASSERT_FALSE(StartRemoteLogging(key, pc_id, &log_id)); EXPECT_TRUE(log_id.empty()); } @@ -2046,7 +2061,7 @@ ASSERT_TRUE(PeerConnectionAdded(key, pc_id)); std::string log_id; - ASSERT_TRUE(StartRemoteLogging(key.render_process_id, pc_id, &log_id)); + ASSERT_TRUE(StartRemoteLogging(key, pc_id, &log_id)); EXPECT_EQ(log_id.size(), 32u); EXPECT_EQ(log_id.find_first_not_of("0123456789ABCDEF"), std::string::npos); @@ -2064,13 +2079,22 @@ ASSERT_TRUE(PeerConnectionAdded(key, pc_id)); std::string log_id; - ASSERT_TRUE(StartRemoteLogging(key.render_process_id, pc_id, &log_id)); + ASSERT_TRUE(StartRemoteLogging(key, pc_id, &log_id)); - const base::FilePath expected_filename = - base::FilePath(kRemoteBoundWebRtcEventLogFileNamePrefix) - .InsertBeforeExtensionASCII(log_id) - .AddExtension(remote_log_extension_); - EXPECT_EQ(file_path->BaseName(), expected_filename); + // Compare filename (without extension). + const std::string filename = + file_path->BaseName().RemoveExtension().MaybeAsASCII(); + ASSERT_FALSE(filename.empty()); + + const std::string expected_filename = + std::string(kRemoteBoundWebRtcEventLogFileNamePrefix) + "_" + + std::to_string(kWebAppId) + "_" + log_id; + EXPECT_EQ(filename, expected_filename); + + // Compare extension. + EXPECT_EQ( + base::FilePath::kExtensionSeparator + remote_log_extension_.as_string(), + file_path->Extension()); } TEST_F(WebRtcEventLogManagerTest, StartRemoteLoggingCreatesEmptyFile) { @@ -2147,8 +2171,8 @@ .WillOnce(Invoke(SaveFilePathTo(&file_paths[i]))); } - EXPECT_TRUE(StartRemoteLogging(keys[0].render_process_id, id)); - EXPECT_TRUE(StartRemoteLogging(keys[1].render_process_id, id)); + EXPECT_TRUE(StartRemoteLogging(keys[0], id)); + EXPECT_TRUE(StartRemoteLogging(keys[1], id)); EXPECT_TRUE(file_paths[0]); EXPECT_TRUE(file_paths[1]); @@ -2242,7 +2266,7 @@ const std::string log = "tpyo"; ASSERT_TRUE(PeerConnectionAdded(key)); - ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log) - 1)); + ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log) - 1)); // Failure is reported, because not everything could be written. The file // will also be closed. @@ -2267,7 +2291,7 @@ const std::string log2 = "defghijklmnopqrstuvwxyz"; ASSERT_TRUE(PeerConnectionAdded(key)); - ASSERT_TRUE(StartRemoteLogging(key, 1 + GzippedSize(log1))); + ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), 1 + GzippedSize(log1))); // First write works. ASSERT_EQ(OnWebRtcEventLogWrite(key, log1), std::make_pair(false, true)); @@ -2368,7 +2392,8 @@ for (size_t i = 0; i < keys.size(); ++i) { ASSERT_TRUE(PeerConnectionAdded(keys[i])); - ASSERT_TRUE(StartRemoteLogging(keys[i], GzippedSize(logs[i]))); + ASSERT_TRUE(StartRemoteLogging(keys[i], GetUniqueId(keys[i]), + GzippedSize(logs[i]))); } for (size_t i = 0; i < keys.size(); ++i) { @@ -2391,7 +2416,7 @@ const std::string log = "Let X equal X."; ASSERT_TRUE(PeerConnectionAdded(key)); - ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log))); + ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log))); ASSERT_TRUE(file_path); EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1); @@ -2489,7 +2514,7 @@ const auto key = GetPeerConnectionKey(rph_.get(), i); ASSERT_TRUE(PeerConnectionAdded(key)); EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _)).Times(1); - ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log))); + ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log))); } // By writing to one of the logs until it reaches capacity, we fill it, @@ -2588,6 +2613,7 @@ EXPECT_TRUE(StartRemoteLogging(key1)); } +// This also tests the scenario UploadOrderDependsOnLastModificationTime. TEST_F(WebRtcEventLogManagerTest, LogsFromPreviousSessionBecomePendingLogsWhenBrowserContextInitialized) { // Unload the profile, but remember where it stores its files. @@ -2599,18 +2625,25 @@ // Seed the remote logs' directory with log files, simulating the // creation of logs in a previous session. std::list<WebRtcLogFileInfo> expected_files; - ASSERT_TRUE(CreateDirectory(remote_logs_dir)); + ASSERT_TRUE(base::CreateDirectory(remote_logs_dir)); + + // Avoid arbitrary ordering due to files being created in the same second. + // This is OK in production, but can confuse the test, which expects a + // specific order. + base::Time time = + base::Time::Now() - + base::TimeDelta::FromSeconds(kMaxPendingRemoteBoundWebRtcEventLogs); for (size_t i = 0; i < kMaxPendingRemoteBoundWebRtcEventLogs; ++i) { - const base::FilePath file_path = remote_logs_dir.Append(IntToStringType(i)) - .AddExtension(remote_log_extension_); - constexpr int file_flags = base::File::FLAG_CREATE | - base::File::FLAG_WRITE | - base::File::FLAG_EXCLUSIVE_WRITE; - base::File file(file_path, file_flags); - ASSERT_TRUE(file.IsValid() && file.created()); - expected_files.emplace_back(browser_context_id_, file_path, - GetLastModificationTime(file_path)); + time += base::TimeDelta::FromSeconds(1); + + base::FilePath file_path; + base::File file; + ASSERT_TRUE(CreateRemoteBoundLogFile(remote_logs_dir, kWebAppId, + remote_log_extension_, time, + &file_path, &file)); + + expected_files.emplace_back(browser_context_id_, file_path, time); } // This factory enforces the expectation that the files will be uploaded, @@ -2630,7 +2663,7 @@ // We show that logs from a previous session are captured even if they are // different, with regards to compression, compared to last time. TEST_F(WebRtcEventLogManagerTest, - LogsCapturedPreviouslyMadePendingEvenIfDifferentExtensionUsed) { + LogsCapturedPreviouslyMadePendingEvenIfDifferentExtensionsUsed) { // Unload the profile, but remember where it stores its files. const base::FilePath browser_context_path = browser_context_->GetPath(); const base::FilePath remote_logs_dir = @@ -2640,25 +2673,32 @@ // Seed the remote logs' directory with log files, simulating the // creation of logs in a previous session. std::list<WebRtcLogFileInfo> expected_files; - ASSERT_TRUE(CreateDirectory(remote_logs_dir)); + ASSERT_TRUE(base::CreateDirectory(remote_logs_dir)); base::FilePath::StringPieceType extensions[] = { kWebRtcEventLogUncompressedExtension, kWebRtcEventLogGzippedExtension}; ASSERT_LE(base::size(extensions), kMaxPendingRemoteBoundWebRtcEventLogs) << "Lacking test coverage."; + // Avoid arbitrary ordering due to files being created in the same second. + // This is OK in production, but can confuse the test, which expects a + // specific order. + base::Time time = + base::Time::Now() - + base::TimeDelta::FromSeconds(kMaxPendingRemoteBoundWebRtcEventLogs); + for (size_t i = 0, ext = 0; i < kMaxPendingRemoteBoundWebRtcEventLogs; ++i) { + time += base::TimeDelta::FromSeconds(1); + const auto& extension = extensions[ext]; ext = (ext + 1) % base::size(extensions); - const base::FilePath file_path = - remote_logs_dir.Append(IntToStringType(i)).AddExtension(extension); - constexpr int file_flags = base::File::FLAG_CREATE | - base::File::FLAG_WRITE | - base::File::FLAG_EXCLUSIVE_WRITE; - base::File file(file_path, file_flags); - ASSERT_TRUE(file.IsValid() && file.created()); - expected_files.emplace_back(browser_context_id_, file_path, - GetLastModificationTime(file_path)); + + base::FilePath file_path; + base::File file; + ASSERT_TRUE(CreateRemoteBoundLogFile(remote_logs_dir, kWebAppId, extension, + time, &file_path, &file)); + + expected_files.emplace_back(browser_context_id_, file_path, time); } // This factory enforces the expectation that the files will be uploaded, @@ -2770,77 +2810,6 @@ WaitForPendingTasks(&run_loop); } -TEST_F(WebRtcEventLogManagerTest, UploadOrderDependsOnLastModificationTime) { - constexpr size_t kProfilesNum = 3; - const std::string profile_names[kProfilesNum] = {"a", "b", "c"}; - - // Create profiles. This creates their directories. - base::FilePath remote_logs_dirs[kProfilesNum]; - std::unique_ptr<BrowserContext> browser_contexts[kProfilesNum]; - for (size_t i = 0; i < kProfilesNum; ++i) { - browser_contexts[i] = CreateBrowserContext(profile_names[i]); - remote_logs_dirs[i] = RemoteBoundLogsDir(browser_contexts[i].get()); - } - - // Unload the profiles, so that whatever files we add into their directory - // could be discovered by EnableForBrowserContext when we reload them. - for (size_t i = 0; i < kProfilesNum; ++i) { - browser_contexts[i].reset(); - } - - // Seed the directories with log files. - base::FilePath file_paths[kProfilesNum]; - for (size_t i = 0; i < kProfilesNum; ++i) { - ASSERT_TRUE(base::DirectoryExists(remote_logs_dirs[i])); - file_paths[i] = remote_logs_dirs[i].AppendASCII("file").AddExtension( - remote_log_extension_); - ASSERT_TRUE(!base::PathExists(file_paths[i])); - constexpr int file_flags = base::File::FLAG_CREATE | - base::File::FLAG_WRITE | - base::File::FLAG_EXCLUSIVE_WRITE; - base::File file(file_paths[i], file_flags); - ASSERT_TRUE(file.IsValid() && file.created()); - } - - // Touch() requires setting the last access time as well. Keep it the same - // for all files, showing that the difference between them lies elsewhere. - base::File::Info file_info; - ASSERT_TRUE(base::GetFileInfo(file_paths[0], &file_info)); - const base::Time shared_last_accessed = file_info.last_accessed; - - // Set the files' last modification time according to a non-trivial - // permutation (not the order of creation or its reverse). - const size_t permutation[kProfilesNum] = {2, 0, 1}; - std::list<WebRtcLogFileInfo> expected_files; - base::Time mod_time = - base::Time::Now() - base::TimeDelta::FromSeconds(kProfilesNum); - for (size_t i = 0; i < kProfilesNum; ++i) { - mod_time += base::TimeDelta::FromSeconds(1); // Back to the future. - const base::FilePath& path = file_paths[permutation[i]]; - ASSERT_TRUE(base::TouchFile(path, shared_last_accessed, mod_time)); - expected_files.emplace_back(GetBrowserContextId(browser_contexts[i].get()), - path, GetLastModificationTime(path)); - } - - // Recognize the files as pending files by initializing their BrowserContexts. - // We keep uploading suppressed so as to avoid them being uploaded in order of - // loading, rather than in order of date. - SuppressUploading(); - for (size_t i = 0; i < kProfilesNum; ++i) { - browser_contexts[i] = CreateBrowserContext(profile_names[i]); - } - - // Show that the files are uploaded by order of modification. - base::RunLoop run_loop; - SetWebRtcEventLogUploaderFactoryForTesting( - std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>( - &expected_files, true, &run_loop)); - - UnsuppressUploading(); - - WaitForPendingTasks(&run_loop); -} - TEST_F(WebRtcEventLogManagerTest, ExpiredFilesArePrunedRatherThanUploaded) { constexpr size_t kExpired = 0; constexpr size_t kFresh = 1; @@ -2854,13 +2823,10 @@ base::FilePath file_paths[2]; for (size_t i = 0; i < 2; ++i) { - file_paths[i] = remote_logs_dir.Append(IntToStringType(i)) - .AddExtension(remote_log_extension_); - constexpr int file_flags = base::File::FLAG_CREATE | - base::File::FLAG_WRITE | - base::File::FLAG_EXCLUSIVE_WRITE; - base::File file(file_paths[i], file_flags); - ASSERT_TRUE(file.IsValid() && file.created()); + base::File file; + ASSERT_TRUE(CreateRemoteBoundLogFile( + remote_logs_dir, kWebAppId, remote_log_extension_, base::Time::Now(), + &file_paths[i], &file)); } // Touch() requires setting the last access time as well. Keep it current, @@ -3318,6 +3284,81 @@ EXPECT_TRUE(StartRemoteLogging(enabled_key)); } +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingWithTooLowWebAppIdRejected) { + const size_t web_app_id = kMinWebRtcEventLogWebAppId - 1; + ASSERT_LT(web_app_id, kMinWebRtcEventLogWebAppId); // Avoid wrap-around. + + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + ASSERT_TRUE(PeerConnectionAdded(key)); + EXPECT_FALSE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_id)); +} + +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingWithTooHighWebAppIdRejected) { + const size_t web_app_id = kMaxWebRtcEventLogWebAppId + 1; + ASSERT_GT(web_app_id, kMaxWebRtcEventLogWebAppId); // Avoid wrap-around. + + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + ASSERT_TRUE(PeerConnectionAdded(key)); + EXPECT_FALSE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_id)); +} + +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingWithInRangeWebAppIdAllowedMin) { + const size_t web_app_id = kMinWebRtcEventLogWebAppId; + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + ASSERT_TRUE(PeerConnectionAdded(key)); + EXPECT_TRUE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_id)); +} + +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingWithInRangeWebAppIdAllowedMax) { + const size_t web_app_id = kMaxWebRtcEventLogWebAppId; + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + ASSERT_TRUE(PeerConnectionAdded(key)); + EXPECT_TRUE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_id)); +} + +// Only one remote-bound event log allowed per +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingOverMultipleWebAppsDisallowed) { + // Test assumes there are at least two legal web-app IDs. + ASSERT_NE(kMinWebRtcEventLogWebAppId, kMaxWebRtcEventLogWebAppId); + const size_t web_app_ids[2] = {kMinWebRtcEventLogWebAppId, + kMaxWebRtcEventLogWebAppId}; + + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + ASSERT_TRUE(PeerConnectionAdded(key)); + EXPECT_TRUE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_ids[0])); + EXPECT_FALSE(StartRemoteLogging(key, GetUniqueId(key), + kMaxRemoteLogFileSizeBytes, web_app_ids[1])); +} + +TEST_F(WebRtcEventLogManagerTest, + StartRemoteLoggingWebAppIdIncorporatedIntoFileName) { + const auto key = GetPeerConnectionKey(rph_.get(), kLid); + + base::Optional<base::FilePath> file_path; + ON_CALL(remote_observer_, OnRemoteLogStarted(key, _)) + .WillByDefault(Invoke(SaveFilePathTo(&file_path))); + + ASSERT_TRUE(PeerConnectionAdded(key)); + const size_t expected_web_app_id = kWebAppId; + ASSERT_TRUE(StartRemoteLogging( + key, GetUniqueId(key), kMaxRemoteLogFileSizeBytes, expected_web_app_id)); + ASSERT_TRUE(file_path); + + const size_t written_web_app_id = + ExtractRemoteBoundWebRtcEventLogWebAppIdFromPath(*file_path); + EXPECT_EQ(written_web_app_id, expected_web_app_id); +} + INSTANTIATE_TEST_CASE_P(UploadCompleteResult, WebRtcEventLogManagerTest, ::testing::Bool()); @@ -3996,7 +4037,8 @@ base::FilePath file_path; base::File file; ASSERT_TRUE(base::CreateDirectory(remote_bound_dir)); - ASSERT_TRUE(CreateRemoteBoundLogFile(remote_bound_dir, remote_log_extension_, + ASSERT_TRUE(CreateRemoteBoundLogFile(remote_bound_dir, kWebAppId, + remote_log_extension_, base::Time::Now(), &file_path, &file)); file.Close(); @@ -4296,7 +4338,7 @@ ON_CALL(remote_observer_, OnRemoteLogStarted(key, _)) .WillByDefault(Invoke(SaveFilePathTo(&log_file))); ASSERT_TRUE(PeerConnectionAdded(key)); - ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log) - 1)); + ASSERT_TRUE(StartRemoteLogging(key, GetUniqueId(key), GzippedSize(log) - 1)); ASSERT_TRUE(log_file); std::list<WebRtcLogFileInfo> empty_list;
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc new file mode 100644 index 0000000..1a6068f --- /dev/null +++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -0,0 +1,123 @@ +// 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 <string> + +#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" +#include "chrome/common/chrome_switches.h" +#include "content/public/browser/web_contents.h" +#include "content/public/common/content_switches.h" +#include "content/public/test/browser_test_utils.h" +#include "media/base/media_switches.h" + +namespace { + +static const char kMainHtmlPage[] = "/webrtc/webrtc_getdisplaymedia_test.html"; + +struct TestConfig { + const char* display_surface; + const char* logical_surface; + const char* cursor; +}; + +} // namespace + +// Base class for top level tests for getDisplayMedia(). +class WebRtcGetDisplayMediaBrowserTest : public WebRtcTestBase { + public: + void SetUpInProcessBrowserTestFixture() override { + DetectErrorsInJavaScript(); + } + + void RunGetDisplayMedia(content::WebContents* tab, + const std::string& constraints) { + std::string result; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab->GetMainFrame(), + base::StringPrintf("runGetDisplayMedia(%s);", constraints.c_str()), + &result)); + EXPECT_EQ(result, "getdisplaymedia-success"); + } +}; + +// Top level test for getDisplayMedia(). Pops picker Ui and selects desktop +// capture by default. +class WebRtcGetDisplayMediaBrowserTestWithPicker + : public WebRtcGetDisplayMediaBrowserTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitch( + switches::kEnableExperimentalWebPlatformFeatures); + command_line->AppendSwitchASCII(switches::kAutoSelectDesktopCaptureSource, + "Entire screen"); + } +}; + +// Real desktop capture is flaky on below platforms. +#if defined(OS_CHROMEOS) || defined(OS_WIN) +#define MAYBE_MANUAL_GetDisplayMediaVideo DISABLED_MANUAL_GetDisplayMediaVideo +#else +#define MAYBE_MANUAL_GetDisplayMediaVideo MANUAL_GetDisplayMediaVideo +#endif +IN_PROC_BROWSER_TEST_F(WebRtcGetDisplayMediaBrowserTestWithPicker, + MAYBE_MANUAL_GetDisplayMediaVideo) { + ASSERT_TRUE(embedded_test_server()->Start()); + + content::WebContents* tab = OpenTestPageInNewTab(kMainHtmlPage); + std::string constraints("{video:true}"); + RunGetDisplayMedia(tab, constraints); +} + +// Top level test for getDisplayMedia(). Skips picker UI and uses fake device +// with specified type. +class WebRtcGetDisplayMediaBrowserTestWithFakeUI + : public WebRtcGetDisplayMediaBrowserTest, + public testing::WithParamInterface<TestConfig> { + public: + WebRtcGetDisplayMediaBrowserTestWithFakeUI() { + test_config_ = GetParam(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitch( + switches::kEnableExperimentalWebPlatformFeatures); + command_line->AppendSwitch(switches::kUseFakeUIForMediaStream); + command_line->AppendSwitchASCII( + switches::kUseFakeDeviceForMediaStream, + base::StringPrintf("display-media-type=%s", + test_config_.display_surface)); + } + + protected: + TestConfig test_config_; +}; + +IN_PROC_BROWSER_TEST_P(WebRtcGetDisplayMediaBrowserTestWithFakeUI, + MANUAL_GetDisplayMedia) { + ASSERT_TRUE(embedded_test_server()->Start()); + + content::WebContents* tab = OpenTestPageInNewTab(kMainHtmlPage); + std::string constraints("{video:true}"); + RunGetDisplayMedia(tab, constraints); + + std::string result; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab->GetMainFrame(), "getDisplaySurfaceSetting();", &result)); + EXPECT_EQ(result, test_config_.display_surface); + + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab->GetMainFrame(), "getLogicalSurfaceSetting();", &result)); + EXPECT_EQ(result, test_config_.logical_surface); + + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab->GetMainFrame(), "getCursorSetting();", &result)); + EXPECT_EQ(result, test_config_.cursor); +} + +INSTANTIATE_TEST_CASE_P(, + WebRtcGetDisplayMediaBrowserTestWithFakeUI, + testing::Values(TestConfig{"monitor", "true", "never"}, + TestConfig{"window", "true", "never"}, + TestConfig{"browser", "true", + "never"}));
diff --git a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc index adc8b6b..d07c02e 100644 --- a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc +++ b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc
@@ -254,10 +254,12 @@ void WebRtcLoggingHandlerHost::StartEventLogging( const std::string& peer_connection_id, size_t max_log_size_bytes, + size_t web_app_id, const StartEventLoggingCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); WebRtcEventLogManager::GetInstance()->StartRemoteLogging( - render_process_id_, peer_connection_id, max_log_size_bytes, callback); + render_process_id_, peer_connection_id, max_log_size_bytes, web_app_id, + callback); } #if defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/chrome/browser/media/webrtc/webrtc_logging_handler_host.h b/chrome/browser/media/webrtc/webrtc_logging_handler_host.h index e84da04..cbdc02e 100644 --- a/chrome/browser/media/webrtc/webrtc_logging_handler_host.h +++ b/chrome/browser/media/webrtc/webrtc_logging_handler_host.h
@@ -141,6 +141,7 @@ // This function must be called on the UI thread. void StartEventLogging(const std::string& peer_connection_id, size_t max_log_size_bytes, + size_t web_app_id, const StartEventLoggingCallback& callback); #if defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 5e1c0b4..879b7b9f 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -46,7 +46,6 @@ #include "chrome/browser/metrics/subprocess_metrics_provider.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/safe_browsing/certificate_reporting_metrics_provider.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/chrome_sync_client.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/translate/translate_ranker_metrics_provider.h" @@ -922,8 +921,7 @@ if (!sync) { return false; } - ObserveServiceForSyncDisables(sync, profile->GetPrefs(), - IsUnifiedConsentFeatureEnabled(profile)); + ObserveServiceForSyncDisables(sync, profile->GetPrefs()); return true; }
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc index 2c9997d..399b1b7 100644 --- a/chrome/browser/metrics/ukm_browsertest.cc +++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/metrics/chrome_metrics_services_manager_client.h" #include "chrome/browser/metrics/testing/metrics_reporting_pref_helper.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" @@ -33,6 +32,7 @@ #include "components/sync/test/fake_server/fake_server_network_resources.h" #include "components/ukm/content/source_url_recorder.h" #include "components/ukm/ukm_service.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/scoped_unified_consent.h" #include "components/variations/service/variations_field_trial_creator.h" #include "components/version_info/version_info.h" @@ -583,7 +583,7 @@ EXPECT_NE(0U, original_client_id); harness->DisableSyncForDatatype(syncer::TYPED_URLS); - if (IsUnifiedConsentFeatureEnabled(profile)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { // Disable history sync does not disable UKM when unified consent is // enabled. EXPECT_TRUE(ukm_enabled()); @@ -621,7 +621,7 @@ EXPECT_EQ(original_client_id, client_id()); harness2->DisableSyncForDatatype(syncer::TYPED_URLS); - if (IsUnifiedConsentFeatureEnabled(profile2)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { // Disable history sync does not disable UKM when unified consent is // enabled. EXPECT_TRUE(ukm_enabled());
diff --git a/chrome/browser/metrics/variations/chrome_variations_service_client.cc b/chrome/browser/metrics/variations/chrome_variations_service_client.cc index 2eef13c..420e21eb 100644 --- a/chrome/browser/metrics/variations/chrome_variations_service_client.cc +++ b/chrome/browser/metrics/variations/chrome_variations_service_client.cc
@@ -43,6 +43,10 @@ ChromeVariationsServiceClient::~ChromeVariationsServiceClient() {} +std::string ChromeVariationsServiceClient::GetApplicationLocale() { + return g_browser_process->GetApplicationLocale(); +} + base::Callback<base::Version(void)> ChromeVariationsServiceClient::GetVersionForSimulationCallback() { return base::Bind(&GetVersionForSimulation);
diff --git a/chrome/browser/metrics/variations/chrome_variations_service_client.h b/chrome/browser/metrics/variations/chrome_variations_service_client.h index f65b92e..84c50dc 100644 --- a/chrome/browser/metrics/variations/chrome_variations_service_client.h +++ b/chrome/browser/metrics/variations/chrome_variations_service_client.h
@@ -24,6 +24,7 @@ ~ChromeVariationsServiceClient() override; // variations::VariationsServiceClient: + std::string GetApplicationLocale() override; base::Callback<base::Version(void)> GetVersionForSimulationCallback() override; scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc index f9ac1ac..088b3b7 100644 --- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc +++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc
@@ -125,7 +125,7 @@ // since they can be dangerous in the context of chrome extension // permissions, but they are okay here, for NaCl GDB avoidance. URLPattern pattern(URLPattern::SCHEME_ALL); - if (pattern.Parse(pattern_str) == URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(pattern_str) == URLPattern::ParseResult::kSuccess) { // If URL pattern has scheme equal to *, Parse method resets valid // schemes mask to http and https only, so we need to reset it after // Parse to re-include chrome-extension and chrome schema.
diff --git a/chrome/browser/net/chrome_network_service_browsertest.cc b/chrome/browser/net/chrome_network_service_browsertest.cc index 75493262..4958ef39 100644 --- a/chrome/browser/net/chrome_network_service_browsertest.cc +++ b/chrome/browser/net/chrome_network_service_browsertest.cc
@@ -77,11 +77,6 @@ }; IN_PROC_BROWSER_TEST_F(ChromeNetworkServiceBrowserTest, PRE_EncryptedCookies) { -#if defined(OS_MACOSX) - // |NetworkServiceTestHelper| doesn't work on browser_tests on macOS: - // crbug.com/843324. - return; -#endif // First set a cookie with cookie encryption enabled. network::mojom::NetworkContextPtr context = CreateNetworkContext(/*enable_encrypted_cookies=*/true); @@ -96,7 +91,7 @@ EXPECT_EQ(kCookieValue, cookies[0].Value()); } -#if defined(OS_WIN) +#if defined(OS_WIN) || defined(OS_MACOSX) // The cookies.size() ASSERT is failing flakily on the Win7 bots. // See https://crbug.com/868667 #define MAYBE_EncryptedCookies DISABLED_EncryptedCookies @@ -106,11 +101,6 @@ IN_PROC_BROWSER_TEST_F(ChromeNetworkServiceBrowserTest, MAYBE_EncryptedCookies) { -#if defined(OS_MACOSX) - // |NetworkServiceTestHelper| doesn't work on browser_tests on macOS: - // crbug.com/843324. - return; -#endif net::CookieCryptoDelegate* crypto_delegate = cookie_config::GetCookieCryptoDelegate(); std::string ciphertext;
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc index 6a673351..404b550 100644 --- a/chrome/browser/net/network_context_configuration_browsertest.cc +++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -894,12 +894,6 @@ } } -// Test certs cannot currently be installed on OSX with the network service -// enabled. -// TODO(mmenke): Once that is fixed, enable this test on OSX. -// See https://crbug.com/757088 -#if !defined(OS_MACOSX) - // Visits a URL with an HSTS header, and makes sure it is respected. IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, PRE_Hsts) { net::test_server::EmbeddedTestServer ssl_server( @@ -1017,8 +1011,6 @@ } } -#endif // !defined(OS_MACOSX) - // Check that the SSLConfig is hooked up. PRE_SSLConfig checks that changing // local_state() after start modifies the SSLConfig, SSLConfig makes sure the // (now modified) initial value of local_state() is respected. @@ -1043,19 +1035,8 @@ simple_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie( loader_factory(), simple_loader_helper.GetCallback()); simple_loader_helper.WaitForCallback(); -#if defined(OS_MACOSX) - // TODO(https://crbug.com/757088): Test certs don't work on OSX, with the - // network service. - if (GetParam().network_service_state != NetworkServiceState::kDisabled) { - EXPECT_FALSE(simple_loader_helper.response_body()); - } else { - ASSERT_TRUE(simple_loader_helper.response_body()); - EXPECT_EQ(*simple_loader_helper.response_body(), "Echo"); - } -#else ASSERT_TRUE(simple_loader_helper.response_body()); EXPECT_EQ(*simple_loader_helper.response_body(), "Echo"); -#endif // Disallow TLS 1.0 via prefs. g_browser_process->local_state()->SetString(prefs::kSSLVersionMin, @@ -1253,7 +1234,15 @@ EXPECT_FALSE(GetCookies(embedded_test_server()->base_url()).empty()); } -IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, CookiesEnabled) { +#if defined(OS_MACOSX) +// https://crbug.com/880496 +#define MAYBE_CookiesEnabled DISABLED_CookiesEnabled +#else +#define MAYBE_CookiesEnabled CookiesEnabled +#endif + +IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, + MAYBE_CookiesEnabled) { // Check that the cookie from the first stage of the test was / was not // preserved between browser restarts, as expected. bool has_cookies = !GetCookies(embedded_test_server()->base_url()).empty(); @@ -1523,15 +1512,6 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationFilePacBrowserTest, FilePac) { bool network_service_disabled = !base::FeatureList::IsEnabled(network::features::kNetworkService); -#if defined(OS_MACOSX) - // https://crbug.com/843324: the NetworkServiceTestHelper does not work on Mac - // so the TestHostResolver is not used to resolve the host name when the - // network service is enabled. The system host resolver is used instead - // and goed to the network, which we don't want in tests. (and it does not - // return the expected net::ERR_NOT_IMPLEMENTED). - if (!network_service_disabled) - return; -#endif // PAC file URLs are not supported with the network service TestProxyConfigured(/*expect_success=*/network_service_disabled); } @@ -1712,56 +1692,6 @@ EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, simple_loader->NetError()); } -// |NetworkServiceTestHelper| doesn't work on browser_tests on OSX. -// See https://crbug.com/843324 -#if defined(OS_MACOSX) - -#if BUILDFLAG(ENABLE_EXTENSIONS) -#define INSTANTIATE_EXTENSION_TESTS(TestFixture) \ - INSTANTIATE_TEST_CASE_P( \ - OnDiskApp, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kOnDiskApp}))); \ - \ - INSTANTIATE_TEST_CASE_P( \ - InMemoryApp, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kInMemoryApp}))); \ - \ - INSTANTIATE_TEST_CASE_P( \ - OnDiskAppWithIncognitoProfile, TestFixture, \ - ::testing::Values( \ - TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kOnDiskAppWithIncognitoProfile}))); -#else // !BUILDFLAG(ENABLE_EXTENSIONS) -#define INSTANTIATE_EXTENSION_TESTS(TestFixture) -#endif // !BUILDFLAG(ENABLE_EXTENSIONS) - -// Instantiates tests with a prefix indicating which NetworkContext is being -// tested, and a suffix of "/0" if the network service is disabled and "/1" if -// it's enabled. -#define INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(TestFixture) \ - INSTANTIATE_EXTENSION_TESTS(TestFixture) \ - INSTANTIATE_TEST_CASE_P( \ - SystemNetworkContext, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kSystem}))); \ - \ - INSTANTIATE_TEST_CASE_P( \ - SafeBrowsingNetworkContext, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kSystem}))); \ - \ - INSTANTIATE_TEST_CASE_P( \ - ProfileMainNetworkContext, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kProfile}))); \ - \ - INSTANTIATE_TEST_CASE_P( \ - IncognitoProfileMainNetworkContext, TestFixture, \ - ::testing::Values(TestCase({NetworkServiceState::kDisabled, \ - NetworkContextType::kIncognitoProfile}))) -#else // !defined(OS_MACOSX) // Instiates tests with a prefix indicating which NetworkContext is being // tested, and a suffix of "/0" if the network service is disabled, "/1" if it's // enabled, and "/2" if it's enabled and restarted. @@ -1837,8 +1767,6 @@ TestCase({NetworkServiceState::kRestarted, \ NetworkContextType::kIncognitoProfile}))); -#endif // !defined(OS_MACOSX) - INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(NetworkContextConfigurationBrowserTest); INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE( NetworkContextConfigurationFixedPortBrowserTest);
diff --git a/chrome/browser/notifications/notification_platform_bridge_win.cc b/chrome/browser/notifications/notification_platform_bridge_win.cc index 60700aab..328aac10 100644 --- a/chrome/browser/notifications/notification_platform_bridge_win.cc +++ b/chrome/browser/notifications/notification_platform_bridge_win.cc
@@ -837,6 +837,11 @@ return false; } + if (launch_id.is_for_dismiss_button()) { + LogActivationStatus(ActivationStatus::SUCCESS); + return true; // We're done! The toast has already dismissed. + } + base::Optional<base::string16> reply; base::string16 inline_reply = command_line.GetSwitchValueNative(switches::kNotificationInlineReply);
diff --git a/chrome/browser/notifications/win/notification_launch_id.cc b/chrome/browser/notifications/win/notification_launch_id.cc index e7a6cd77..b7b1fb38 100644 --- a/chrome/browser/notifications/win/notification_launch_id.cc +++ b/chrome/browser/notifications/win/notification_launch_id.cc
@@ -15,6 +15,7 @@ NORMAL = 0, BUTTON_INDEX = 1, CONTEXT_MENU = 2, + DISMISS_BUTTON = 3, }; // These values are persisted to logs. Entries should not be renumbered and @@ -90,6 +91,11 @@ min_num_tokens = 6; is_for_context_menu_ = true; break; + case DISMISS_BUTTON: + // type|notification_type|profile_id|incognito|origin|notification_id + min_num_tokens = 6; + is_for_dismiss_button_ = true; + break; default: // |components| has an invalid value. LogLaunchIdDecodeStatus(LaunchIdDecodeStatus::kComponentIdOutOfRange); @@ -142,9 +148,16 @@ // and unsafe for origins -- and should therefore be encoded (as per // http://www.ietf.org/rfc/rfc1738.txt). std::string prefix; - LaunchIdComponents type = is_for_context_menu_ - ? CONTEXT_MENU - : (button_index_ > -1 ? BUTTON_INDEX : NORMAL); + LaunchIdComponents type; + if (is_for_context_menu_) + type = CONTEXT_MENU; + else if (is_for_dismiss_button_) + type = DISMISS_BUTTON; + else if (button_index_ > -1) + type = BUTTON_INDEX; + else + type = NORMAL; + if (button_index_ > -1) prefix = base::StringPrintf("|%d", button_index_); return base::StringPrintf(
diff --git a/chrome/browser/notifications/win/notification_launch_id.h b/chrome/browser/notifications/win/notification_launch_id.h index a9ffac1..21955dc75 100644 --- a/chrome/browser/notifications/win/notification_launch_id.h +++ b/chrome/browser/notifications/win/notification_launch_id.h
@@ -45,6 +45,11 @@ is_for_context_menu_ = true; } + void set_is_for_dismiss_button() { + DCHECK_EQ(-1, button_index_); + is_for_dismiss_button_ = true; + } + NotificationHandler::Type notification_type() const { DCHECK(is_valid()); return notification_type_; @@ -80,6 +85,11 @@ return is_for_context_menu_; } + bool is_for_dismiss_button() const { + DCHECK(is_valid()); + return is_for_dismiss_button_; + } + private: // The notification type this launch ID is associated with. NotificationHandler::Type notification_type_; @@ -100,9 +110,12 @@ // The button index this launch ID is associated with. int button_index_ = -1; - // A flag indicating if this launch ID is targeting for context menu or not. + // A flag indicating if this launch ID is targeting the context menu or not. bool is_for_context_menu_ = false; + // A flag indicating if this launch ID is targeting the dismiss button or not. + bool is_for_dismiss_button_ = false; + // A flag indicating if this launch ID is valid. bool is_valid_ = false; };
diff --git a/chrome/browser/notifications/win/notification_launch_id_unittest.cc b/chrome/browser/notifications/win/notification_launch_id_unittest.cc index 1bf7cbb..edc556cef 100644 --- a/chrome/browser/notifications/win/notification_launch_id_unittest.cc +++ b/chrome/browser/notifications/win/notification_launch_id_unittest.cc
@@ -36,6 +36,16 @@ EXPECT_EQ("2|0|Default|1|https://example.com/|notification_id", id.Serialize()); } + + { + NotificationLaunchId id(NotificationHandler::Type::WEB_PERSISTENT, + "notification_id", "Default", true, + GURL("https://example.com")); + id.set_is_for_dismiss_button(); + ASSERT_TRUE(id.is_valid()); + EXPECT_EQ("3|0|Default|1|https://example.com/|notification_id", + id.Serialize()); + } } TEST(NotificationLaunchIdTest, ParsingTests) { @@ -47,6 +57,7 @@ ASSERT_TRUE(id.is_valid()); EXPECT_EQ(-1, id.button_index()); EXPECT_FALSE(id.is_for_context_menu()); + EXPECT_FALSE(id.is_for_dismiss_button()); EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, id.notification_type()); EXPECT_TRUE(id.incognito()); @@ -63,6 +74,7 @@ ASSERT_TRUE(id.is_valid()); EXPECT_EQ(-1, id.button_index()); EXPECT_FALSE(id.is_for_context_menu()); + EXPECT_FALSE(id.is_for_dismiss_button()); EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, id.notification_type()); EXPECT_TRUE(id.incognito()); @@ -79,6 +91,7 @@ ASSERT_TRUE(id.is_valid()); EXPECT_EQ(0, id.button_index()); EXPECT_FALSE(id.is_for_context_menu()); + EXPECT_FALSE(id.is_for_dismiss_button()); EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, id.notification_type()); EXPECT_TRUE(id.incognito()); @@ -96,6 +109,7 @@ ASSERT_TRUE(id.is_valid()); EXPECT_EQ(0, id.button_index()); EXPECT_FALSE(id.is_for_context_menu()); + EXPECT_FALSE(id.is_for_dismiss_button()); EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, id.notification_type()); EXPECT_TRUE(id.incognito()); @@ -111,6 +125,23 @@ ASSERT_TRUE(id.is_valid()); EXPECT_EQ(-1, id.button_index()); EXPECT_TRUE(id.is_for_context_menu()); + EXPECT_FALSE(id.is_for_dismiss_button()); + EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, + id.notification_type()); + EXPECT_TRUE(id.incognito()); + EXPECT_EQ("Default", id.profile_id()); + EXPECT_EQ("notification_id", id.notification_id()); + } + + // Input string for when the context menu item is selected. + { + std::string encoded = "3|0|Default|1|https://example.com/|notification_id"; + NotificationLaunchId id(encoded); + + ASSERT_TRUE(id.is_valid()); + EXPECT_EQ(-1, id.button_index()); + EXPECT_FALSE(id.is_for_context_menu()); + EXPECT_TRUE(id.is_for_dismiss_button()); EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, id.notification_type()); EXPECT_TRUE(id.incognito()); @@ -142,6 +173,8 @@ {"1"}, // Missing all but the component type (type CONTEXT_MENU). {"2"}, + // Missing all but the component type (type DISMISS_BUTTON). + {"3"}, }; for (const auto& test_case : cases) {
diff --git a/chrome/browser/notifications/win/notification_template_builder.cc b/chrome/browser/notifications/win/notification_template_builder.cc index ee646691e..13f042d 100644 --- a/chrome/browser/notifications/win/notification_template_builder.cc +++ b/chrome/browser/notifications/win/notification_template_builder.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/notifications/win/notification_image_retainer.h" #include "chrome/browser/notifications/win/notification_launch_id.h" #include "chrome/grit/chromium_strings.h" +#include "chrome/grit/generated_resources.h" #include "components/url_formatter/elide_url.h" #include "third_party/libxml/chromium/libxml_utils.h" #include "ui/base/l10n/l10n_util.h" @@ -34,6 +35,7 @@ const char kArguments[] = "arguments"; const char kAttribution[] = "attribution"; const char kAudioElement[] = "audio"; +const char kBackground[] = "background"; const char kBindingElement[] = "binding"; const char kBindingElementTemplateAttribute[] = "template"; const char kContent[] = "content"; @@ -129,6 +131,7 @@ builder->StartActionsElement(); if (!notification.buttons().empty()) builder->AddActions(notification, launch_id); + builder->EnsureReminderHasButton(notification, launch_id); builder->AddContextMenu(launch_id); builder->EndActionsElement(); @@ -374,6 +377,23 @@ xml_writer_->EndElement(); } +void NotificationTemplateBuilder::EnsureReminderHasButton( + const message_center::Notification& notification, + NotificationLaunchId copied_launch_id) { + if (!notification.never_timeout() || !notification.buttons().empty()) + return; + + xml_writer_->StartElement(kActionElement); + xml_writer_->AddAttribute(kActivationType, kBackground); + // TODO(finnur): Add our own string here (we're past string-freeze so we're + // re-using the already translated "Close" from elsewhere). + xml_writer_->AddAttribute( + kContent, l10n_util::GetStringUTF8(IDS_MD_HISTORY_CLOSE_MENU_PROMO)); + copied_launch_id.set_is_for_dismiss_button(); + xml_writer_->AddAttribute(kArguments, copied_launch_id.Serialize()); + xml_writer_->EndElement(); +} + void NotificationTemplateBuilder::OverrideContextMenuLabelForTesting( const char* label) { context_menu_label_override_ = label;
diff --git a/chrome/browser/notifications/win/notification_template_builder.h b/chrome/browser/notifications/win/notification_template_builder.h index fc606df..f58f331 100644 --- a/chrome/browser/notifications/win/notification_template_builder.h +++ b/chrome/browser/notifications/win/notification_template_builder.h
@@ -130,6 +130,13 @@ void WriteContextMenuElement(const std::string& content, const std::string& arguments); + // Ensures that every reminder has at least one button, as the Action Center + // does not respect the Reminder setting on notifications with no buttons, so + // we must add a Dismiss button to the notification for those cases. For more + // details, see issue https://crbug.com/781792. + void EnsureReminderHasButton(const message_center::Notification& notification, + NotificationLaunchId copied_launch_id); + // Label to override context menu items in tests. static const char* context_menu_label_override_;
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc index 524ddf0..5906cf3 100644 --- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc +++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -307,19 +307,6 @@ : google_apis::GetNonStableAPIKey(); } - // Pass the pref name associated to the search suggest toggle, and use it to - // also guard the remote suggestions feature. - // This pref should only be used if article suggestions expandable header is - // disabled. - // TODO(https://crbug.com/710636): Cleanup this clunky dependency once the - // preference design is stable. - std::string additional_toggle_pref; - if (!base::FeatureList::IsEnabled( - ntp_snippets::kArticleSuggestionsExpandableHeader) && - base::FeatureList::IsEnabled( - chrome::android::kContentSuggestionsSettings)) { - additional_toggle_pref = prefs::kSearchSuggestEnabled; - } std::unique_ptr<PrefetchedPagesTracker> prefetched_pages_tracker; #if BUILDFLAG(ENABLE_OFFLINE_PAGES) if (IsKeepingPrefetchedSuggestionsEnabled()) { @@ -349,8 +336,7 @@ url_loader_factory), std::make_unique<RemoteSuggestionsDatabase>(database_dir), std::make_unique<RemoteSuggestionsStatusServiceImpl>( - identity_manager->HasPrimaryAccount(), pref_service, - additional_toggle_pref), + identity_manager->HasPrimaryAccount(), pref_service, std::string()), std::move(prefetched_pages_tracker), std::move(breaking_news_raw_data_provider), debug_logger, std::make_unique<base::OneShotTimer>());
diff --git a/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc index e3a07236..3dec9a4 100644 --- a/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc +++ b/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/suggestions/image_decoder_impl.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "components/image_fetcher/core/image_decoder.h" #include "components/image_fetcher/core/image_fetcher.h" @@ -27,6 +26,7 @@ #include "components/ntp_snippets/remote/cached_image_fetcher.h" #include "components/ntp_snippets/remote/remote_suggestions_database.h" #include "components/prefs/pref_service.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/service_manager_connection.h" @@ -103,10 +103,9 @@ content::BrowserContext::GetDefaultStoragePartition(context); std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper> consent_helper; - if (IsUnifiedConsentFeatureEnabled(profile)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { consent_helper = unified_consent::UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - true, /*is_unified_consent_enabled*/ ProfileSyncServiceFactory::GetSyncServiceForBrowserContext( profile)); }
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index 9857d0c..84864c269 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -43,6 +43,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" @@ -1878,3 +1879,23 @@ histogram_tester_.ExpectTotalCount( internal::kHistogramInputToFirstContentfulPaint, 1); } + +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, InputEventsForOmniboxMatch) { + embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data"); + content::SetupCrossSiteRedirector(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + + auto waiter = CreatePageLoadMetricsTestWaiter(); + waiter->AddPageExpectation(TimingField::kLoadEvent); + waiter->AddPageExpectation(TimingField::kFirstContentfulPaint); + LocationBar* location_bar = browser()->window()->GetLocationBar(); + ui_test_utils::SendToOmniboxAndSubmit( + location_bar, embedded_test_server()->GetURL("/title1.html").spec(), + base::TimeTicks::Now()); + waiter->Wait(); + + histogram_tester_.ExpectTotalCount(internal::kHistogramInputToNavigation, 1); + histogram_tester_.ExpectTotalCount(internal::kHistogramInputToFirstPaint, 1); + histogram_tester_.ExpectTotalCount( + internal::kHistogramInputToFirstContentfulPaint, 1); +}
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 6c84f827b..3e20063 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -719,12 +719,7 @@ return; #if defined(OS_ANDROID) // Either #passwords-keyboards-accessory or #experimental-ui must be enabled. - if (!PasswordAccessoryController::AllowedForWebContents(web_contents())) { - if (available) { - ShowPasswordGenerationPopup(ui_data.value(), - false /* is_manually_triggered */); - } - } else { + if (PasswordAccessoryController::AllowedForWebContents(web_contents())) { PasswordAccessoryController::CreateForWebContents(web_contents()); if (available) { password_manager::PasswordManagerDriver* driver =
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc index 3b6b2052..0669f55 100644 --- a/chrome/browser/password_manager/password_store_factory.cc +++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -267,6 +267,7 @@ ps = new PasswordStoreX( std::move(login_db), + profile->GetPath().Append(password_manager::kLoginDataFileName), profile->GetPath().Append(password_manager::kSecondLoginDataFileName), std::move(backend), prefs); RecordBackendStatistics(desktop_env, store_type, used_backend);
diff --git a/chrome/browser/password_manager/password_store_x.cc b/chrome/browser/password_manager/password_store_x.cc index e43f68f..eb60072 100644 --- a/chrome/browser/password_manager/password_store_x.cc +++ b/chrome/browser/password_manager/password_store_x.cc
@@ -62,10 +62,15 @@ return true; } -// Disables encryption for |login_db| and returns it. +// Disables encryption on |login_db|, if the migration to encryption has not +// been performed yet. std::unique_ptr<password_manager::LoginDatabase> DisableEncryption( - std::unique_ptr<password_manager::LoginDatabase> login_db) { - login_db->disable_encryption(); + std::unique_ptr<password_manager::LoginDatabase> login_db, + PrefService* prefs) { + if (prefs->GetInteger(password_manager::prefs::kMigrationToLoginDBStep) != + PasswordStoreX::LOGIN_DB_REPLACED) { + login_db->disable_encryption(); + } return login_db; } @@ -81,20 +86,51 @@ return LinuxBackendMigrationStatus::kFailed; case PasswordStoreX::COPIED_ALL: return LinuxBackendMigrationStatus::kCopiedAll; + case PasswordStoreX::LOGIN_DB_REPLACED: + return LinuxBackendMigrationStatus::kLoginDBReplaced; } NOTREACHED(); return LinuxBackendMigrationStatus::kNotAttempted; } +// Remove |forms| from |backend|. If |forms| is empty, |backend| will be cleared +// entirely. This must be called on |runner|, which has to be the same as +// |backend|'s. +void ClearNativeBackend(scoped_refptr<base::SequencedTaskRunner> runner, + std::unique_ptr<PasswordStoreX::NativeBackend> backend, + std::vector<std::unique_ptr<PasswordForm>> forms) { + if (forms.empty()) { + if (!backend->GetAllLogins(&forms)) + return; + } + + if (!forms.empty()) { + PasswordStoreChangeList changes; + backend->RemoveLogin(*forms.back(), &changes); + forms.pop_back(); + if (!forms.empty()) { + // We yield on the task runner between deletes, because this is a + // background cleanup which has to happen on the native backend's + // preferred thread, and in the case of gnome-keyring it's the main + // thread. + runner->PostTask(FROM_HERE, + base::BindOnce(&ClearNativeBackend, runner, + std::move(backend), std::move(forms))); + } + } +} + } // namespace PasswordStoreX::PasswordStoreX( std::unique_ptr<password_manager::LoginDatabase> login_db, + base::FilePath login_db_file, base::FilePath encrypted_login_db_file, std::unique_ptr<NativeBackend> backend, PrefService* prefs) - : PasswordStoreDefault(DisableEncryption(std::move(login_db))), + : PasswordStoreDefault(DisableEncryption(std::move(login_db), prefs)), backend_(std::move(backend)), + login_db_file_(std::move(login_db_file)), encrypted_login_db_file_(std::move(encrypted_login_db_file)), migration_checked_(false), allow_fallback_(false), @@ -107,6 +143,10 @@ base::UmaHistogramEnumeration( "PasswordManager.LinuxBackendMigration.Adoption", StepForMetrics(migration_to_login_db_step_)); + + // No |backend_| means serving from PasswordStoreDefault. + if (migration_to_login_db_step_ == LOGIN_DB_REPLACED) + backend_.reset(); } PasswordStoreX::~PasswordStoreX() {} @@ -294,93 +334,36 @@ if (migration_checked_ || !backend_.get()) return; migration_checked_ = true; + DCHECK_NE(migration_to_login_db_step_, LOGIN_DB_REPLACED); - // Copy everything from LoginDB (unencrypted) to the native backend if - // migration to encryption is not enabled or if it hasn't succeeded yet. - if (!base::FeatureList::IsEnabled( - password_manager::features::kMigrateLinuxToLoginDB) || - migration_to_login_db_step_ == NOT_ATTEMPTED || - migration_to_login_db_step_ == FAILED) { - base::Time migration_to_native_started = base::Time::Now(); + base::Time migration_to_native_started = base::Time::Now(); - ssize_t migrated = MigrateToNativeBackend(); - - if (migrated > 0) { - VLOG(1) << "Migrated " << migrated << " passwords to native store."; - } else if (migrated == 0) { - // As long as we are able to migrate some passwords, we know the native - // store is working. But if there is nothing to migrate, the "migration" - // can succeed even when the native store would fail. In this case we - // allow a later fallback to the default store. Once any later operation - // succeeds on the native store, we will no longer allow fallback. - allow_fallback_ = true; - } else { - LOG(WARNING) << "Native password store migration failed! " - << "Falling back on default (unencrypted) store."; - backend_.reset(); - } - - base::UmaHistogramLongTimes( - "PasswordManager.LinuxBackendMigration.TimeIntoNative", - base::Time::Now() - migration_to_native_started); + ssize_t migrated = MigrateToNativeBackend(); + if (migrated > 0) { + VLOG(1) << "Migrated " << migrated << " passwords to native store."; + } else if (migrated == 0) { + // As long as we are able to migrate some passwords, we know the native + // store is working. But if there is nothing to migrate, the "migration" + // can succeed even when the native store would fail. In this case we + // allow a later fallback to the default store. Once any later operation + // succeeds on the native store, we will no longer allow fallback. + allow_fallback_ = true; + } else { + LOG(WARNING) << "Native password store migration failed! " + << "Falling back on default (unencrypted) store."; + backend_.reset(); } + base::UmaHistogramLongTimes( + "PasswordManager.LinuxBackendMigration.TimeIntoNative", + base::Time::Now() - migration_to_native_started); + if (base::FeatureList::IsEnabled( password_manager::features::kMigrateLinuxToLoginDB) && backend_) { - base::Time migration_to_encrypted_started = base::Time::Now(); - - // Clear the location of the encrypted login database, if it's not the - // result of a successful migration. - if (migration_to_login_db_step_ == NOT_ATTEMPTED || - migration_to_login_db_step_ == FAILED) - base::DeleteFile(encrypted_login_db_file_, false); - - auto encrypted_login_db = std::make_unique<password_manager::LoginDatabase>( - encrypted_login_db_file_); - if (!encrypted_login_db->Init()) { - VLOG(1) << "Failed to init the encrypted database file. Migration " - "aborted."; - // If the migration wasn't already performed, just serve from the native - // backend. - if (migration_to_login_db_step_ != COPIED_ALL) - return; - // When the database file is corrupted, a null reference will make - // PasswordStoreDefault skip all actions on it. - encrypted_login_db.reset(); - } - - // Copy the data, if this wasn't done before. - if (migration_to_login_db_step_ == NOT_ATTEMPTED || - migration_to_login_db_step_ == FAILED) { - // TODO(crbug.com/571003) If we fail, back off and retry at a different - // opportunity. - VLOG(1) - << "Migrating all passwords to the encrypted database. Last status: " - << migration_to_login_db_step_; - migration_to_login_db_step_ = MigrateToLoginDB(encrypted_login_db.get()); - main_task_runner()->PostTask( - FROM_HERE, base::BindOnce(&PasswordStoreX::UpdateMigrationToLoginStep, - weak_ptr_factory_.GetWeakPtr(), - migration_to_login_db_step_)); - if (migration_to_login_db_step_ == FAILED) { - VLOG(1) << "Migration to encryption failed."; - base::DeleteFile(encrypted_login_db_file_, false); - } - - base::UmaHistogramLongTimes( - "PasswordManager.LinuxBackendMigration.TimeIntoEncrypted", - base::Time::Now() - migration_to_encrypted_started); - } - - // If the data is in the encrypted login database, serve from it. - if (migration_to_login_db_step_ == COPIED_ALL) { - // If there is no |backend_|, PasswordStoreX will use the - // PasswordStoreDefault behaviour. - PasswordStoreDefault::SetLoginDB(std::move(encrypted_login_db)); - backend_.reset(); - VLOG(1) << "Serving passwords from the temporary encrypted database"; - } + // Copy passwords from the backend into the login database, using + // encryption. + MigrateToEncryptedLoginDB(); } } @@ -438,7 +421,67 @@ return result; } -PasswordStoreX::MigrationToLoginDBStep PasswordStoreX::MigrateToLoginDB( +void PasswordStoreX::MigrateToEncryptedLoginDB() { + base::Time migration_to_encrypted_started = base::Time::Now(); + + // Initialise the temporary database. + auto encrypted_login_db = std::make_unique<password_manager::LoginDatabase>( + encrypted_login_db_file_); + if (!encrypted_login_db->Init()) { + VLOG(1) << "Failed to init the encrypted database file. Migration " + "aborted."; + UpdateMigrationToLoginDBStep(FAILED); + return; // Serve from the native backend. + } + + // Copy everything from the backend to the temporary database. + VLOG(1) << "Migrating all passwords to the encrypted database. Last status: " + << migration_to_login_db_step_; + UpdateMigrationToLoginDBStep(CopyBackendToLoginDB(encrypted_login_db.get())); + if (migration_to_login_db_step_ == FAILED) { + VLOG(1) << "Migration to encryption failed."; + base::DeleteFile(encrypted_login_db_file_, false); + return; + } + + base::UmaHistogramLongTimes( + "PasswordManager.LinuxBackendMigration.TimeIntoEncrypted", + base::Time::Now() - migration_to_encrypted_started); + + // Dispose of the databases, so that we release the databases' locks. + PasswordStoreDefault::SetLoginDB(nullptr); + encrypted_login_db.reset(); + // Move the new database onto the old. + if (!base::Move(encrypted_login_db_file_, login_db_file_)) { + LOG(ERROR) << "Could not replace login database."; + UpdateMigrationToLoginDBStep(FAILED); + base::DeleteFile(encrypted_login_db_file_, false); + return; // Serve from the native backend. + } + UpdateMigrationToLoginDBStep(LOGIN_DB_REPLACED); + + auto login_db = + std::make_unique<password_manager::LoginDatabase>(login_db_file_); + if (login_db->Init()) { + PasswordStoreDefault::SetLoginDB(std::move(login_db)); + } else { + // The password manager is disabled because PasswordStoreDefault is left + // with no LoginDatabase and |backend_| will be disposed of. + LOG(ERROR) << "Could not initialise database after migration. Password " + "Manager is disabled."; + } + + // Cleanup the native backend on the background, while we serve from + // PasswordStoreDefault. PasswordStoreX will use the PasswordStoreDefault + // behaviour, because we move |backend_|. + auto task_runner = CreateBackgroundTaskRunner(); + task_runner->PostTask( + FROM_HERE, + base::BindOnce(&ClearNativeBackend, task_runner, std::move(backend_), + std::vector<std::unique_ptr<autofill::PasswordForm>>())); +} + +PasswordStoreX::MigrationToLoginDBStep PasswordStoreX::CopyBackendToLoginDB( password_manager::LoginDatabase* login_db) { DCHECK(backend_); DCHECK(login_db); @@ -462,7 +505,15 @@ return COPIED_ALL; } -void PasswordStoreX::UpdateMigrationToLoginStep(MigrationToLoginDBStep step) { +void PasswordStoreX::UpdateMigrationToLoginDBStep(MigrationToLoginDBStep step) { + migration_to_login_db_step_ = step; + main_task_runner()->PostTask( + FROM_HERE, base::BindOnce(&PasswordStoreX::UpdateMigrationPref, + weak_ptr_factory_.GetWeakPtr(), + migration_to_login_db_step_)); +} + +void PasswordStoreX::UpdateMigrationPref(MigrationToLoginDBStep step) { migration_step_pref_.SetValue(step); }
diff --git a/chrome/browser/password_manager/password_store_x.h b/chrome/browser/password_manager/password_store_x.h index 6ba57ffa..98b2e5e 100644 --- a/chrome/browser/password_manager/password_store_x.h +++ b/chrome/browser/password_manager/password_store_x.h
@@ -39,6 +39,8 @@ FAILED, // All the data is in the temporary encrypted loginDB. COPIED_ALL, + // The standard login database is encrypted. + LOGIN_DB_REPLACED, }; // NativeBackends more or less implement the PaswordStore interface, but @@ -105,9 +107,11 @@ // |backend| may be NULL in which case this PasswordStoreX will act the same // as PasswordStoreDefault. |login_db| is the default location and does not - // use encryption. |encrypted_login_db_file| is a separate file and is used - // for the migration to encryption. + // use encryption. |login_db_file| is the location of |login_db|. + // |encrypted_login_db_file| is a separate file and is used for the migration + // to encryption. PasswordStoreX(std::unique_ptr<password_manager::LoginDatabase> login_db, + base::FilePath login_db_file, base::FilePath encrypted_login_db_file, std::unique_ptr<NativeBackend> backend, PrefService* prefs); @@ -172,17 +176,27 @@ // necessary.) Returns < 0 on failure. ssize_t MigrateToNativeBackend(); + // Moves the passwords from the backend to a temporary login database, using + // encryption, and then moves them over to the standard location. This + // operation can take a significant amount of time. + void MigrateToEncryptedLoginDB(); + // Synchronously copies everything from the |backend_| to |login_db|. Returns // COPIED_ALL on success and FAILED on error. - MigrationToLoginDBStep MigrateToLoginDB( + MigrationToLoginDBStep CopyBackendToLoginDB( password_manager::LoginDatabase* login_db); + // Update |migration_to_login_db_step_| and |migration_step_pref_|. + void UpdateMigrationToLoginDBStep(MigrationToLoginDBStep step); + // Update |migration_step_pref_|. It must be executed on the preference's // thread. - void UpdateMigrationToLoginStep(MigrationToLoginDBStep step); + void UpdateMigrationPref(MigrationToLoginDBStep step); // The native backend in use, or NULL if none. std::unique_ptr<NativeBackend> backend_; + // The location of the PasswordStoreDefault's database. + const base::FilePath login_db_file_; // A second login database, which will hold encrypted values during migration. const base::FilePath encrypted_login_db_file_; // Whether we have already attempted migration to the native store.
diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc index 8b0569d..aa9a623 100644 --- a/chrome/browser/password_manager/password_store_x_unittest.cc +++ b/chrome/browser/password_manager/password_store_x_unittest.cc
@@ -144,6 +144,12 @@ class MockBackend : public PasswordStoreX::NativeBackend { public: + ~MockBackend() override { + if (save_on_destruct_) { + *save_on_destruct_ = std::move(all_forms_); + } + } + bool Init() override { return true; } PasswordStoreChangeList AddLogin(const PasswordForm& form) override { @@ -245,6 +251,10 @@ return nullptr; } + void SaveFormsOnDestruct(std::vector<PasswordForm>* forms) { + save_on_destruct_ = forms; + } + private: void erase(size_t index) { if (index < all_forms_.size() - 1) @@ -252,6 +262,7 @@ all_forms_.pop_back(); } + std::vector<PasswordForm>* save_on_destruct_ = nullptr; std::vector<PasswordForm> all_forms_; }; @@ -355,7 +366,7 @@ fake_pref_service.registry()->RegisterIntegerPref( password_manager::prefs::kMigrationToLoginDBStep, PasswordStoreX::NOT_ATTEMPTED); - store_ = new PasswordStoreX(std::move(login_db), + store_ = new PasswordStoreX(std::move(login_db), test_login_db_file_path(), test_encrypted_login_db_file_path(), GetBackend(backend_type_), &fake_pref_service); store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); @@ -459,9 +470,10 @@ TEST_P(PasswordStoreXTest, Notifications) { std::unique_ptr<password_manager::LoginDatabase> login_db( new password_manager::LoginDatabase(test_login_db_file_path())); - scoped_refptr<PasswordStoreX> store(new PasswordStoreX( - std::move(login_db), test_encrypted_login_db_file_path(), - GetBackend(GetParam()), &fake_pref_service_)); + scoped_refptr<PasswordStoreX> store( + new PasswordStoreX(std::move(login_db), test_login_db_file_path(), + test_encrypted_login_db_file_path(), + GetBackend(GetParam()), &fake_pref_service_)); store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); password_manager::PasswordFormData form_data = { @@ -561,9 +573,10 @@ // Initializing the PasswordStore shouldn't trigger a native migration (yet). login_db.reset(new password_manager::LoginDatabase(login_db_file)); - scoped_refptr<PasswordStoreX> store(new PasswordStoreX( - std::move(login_db), test_encrypted_login_db_file_path(), - GetBackend(GetParam()), &fake_pref_service_)); + scoped_refptr<PasswordStoreX> store( + new PasswordStoreX(std::move(login_db), test_login_db_file_path(), + test_encrypted_login_db_file_path(), + GetBackend(GetParam()), &fake_pref_service_)); store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); MockPasswordStoreConsumer consumer; @@ -643,6 +656,11 @@ InitExpectedForms(true, 6, &old_credentials); std::unique_ptr<PasswordStoreX::NativeBackend> backend = GetBackend(GetParam()); + std::vector<PasswordForm> native_backend_last_state; + if (GetParam() == WORKING_BACKEND) { + static_cast<MockBackend*>(backend.get()) + ->SaveFormsOnDestruct(&native_backend_last_state); + } if (GetParam() != NO_BACKEND) { for (int i = 0; i < 3; i++) backend->AddLogin(*old_credentials[i]); @@ -658,9 +676,10 @@ login_db = std::make_unique<password_manager::LoginDatabase>( test_login_db_file_path()); - scoped_refptr<PasswordStoreX> store(new PasswordStoreX( - std::move(login_db), test_encrypted_login_db_file_path(), - std::move(backend), &fake_pref_service_)); + scoped_refptr<PasswordStoreX> store( + new PasswordStoreX(std::move(login_db), test_login_db_file_path(), + test_encrypted_login_db_file_path(), + std::move(backend), &fake_pref_service_)); store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); // Make modifications, so that we trigger the migration and so that we can @@ -705,9 +724,9 @@ LinuxBackendMigrationStatus::kNotAttempted, 1); if (GetParam() == WORKING_BACKEND) { - // Verify that the encrypted loginDB is up-to-date. + // Verify that the login database contains all the values, now encrypted. std::vector<std::unique_ptr<PasswordForm>> stored_forms = - ReadLoginDB(test_encrypted_login_db_file_path(), true); + ReadLoginDB(test_login_db_file_path(), true); EXPECT_EQ(6u, stored_forms.size()); EXPECT_THAT( stored_forms, @@ -715,10 +734,12 @@ Pointee(*new_form), Pointee(*old_credentials[1]), Pointee(*old_credentials[2]), Pointee(*old_credentials[3]), Pointee(*old_credentials[4]), Pointee(*old_credentials[5]))); + EXPECT_TRUE(native_backend_last_state.empty()); - stored_forms = ReadLoginDB(test_login_db_file_path(), false); + stored_forms = ReadLoginDB(test_encrypted_login_db_file_path(), false); EXPECT_TRUE(stored_forms.empty()); - EXPECT_EQ(PasswordStoreX::COPIED_ALL, migration_step_pref_.GetValue()); + EXPECT_EQ(PasswordStoreX::LOGIN_DB_REPLACED, + migration_step_pref_.GetValue()); } else { // No values should be moved without a working backend. auto stored_forms = ReadLoginDB(test_encrypted_login_db_file_path(), true); @@ -740,7 +761,7 @@ migration_step_pref_.Init(password_manager::prefs::kMigrationToLoginDBStep, &fake_pref_service_); // Signal that the migration has been completed. - migration_step_pref_.SetValue(PasswordStoreX::COPIED_ALL); + migration_step_pref_.SetValue(PasswordStoreX::LOGIN_DB_REPLACED); // We add new credentials into a backend. They should be completely ignored by // the store. @@ -750,21 +771,22 @@ for (int i = 0; i < 3; i++) backend->AddLogin(*old_credentials[i]); - // Add existing credentials into the encrypted loginDB. They should be the - // only thing that's available in the store. - auto encrypted_login_db = std::make_unique<password_manager::LoginDatabase>( - test_encrypted_login_db_file_path()); - ASSERT_TRUE(encrypted_login_db->Init()); - for (int i = 3; i < 6; i++) - ignore_result(encrypted_login_db->AddLogin(*old_credentials[i])); - encrypted_login_db.reset(); - - // Create the store. + // Add existing credentials into loginDB. They should be the only thing that's + // available in the store. auto login_db = std::make_unique<password_manager::LoginDatabase>( test_login_db_file_path()); - scoped_refptr<PasswordStoreX> store = new PasswordStoreX( - std::move(login_db), test_encrypted_login_db_file_path(), - std::move(backend), &fake_pref_service_); + ASSERT_TRUE(login_db->Init()); + for (int i = 3; i < 6; i++) + ignore_result(login_db->AddLogin(*old_credentials[i])); + login_db.reset(); + + // Create the store. + login_db = std::make_unique<password_manager::LoginDatabase>( + test_login_db_file_path()); + scoped_refptr<PasswordStoreX> store = + new PasswordStoreX(std::move(login_db), test_login_db_file_path(), + test_encrypted_login_db_file_path(), + std::move(backend), &fake_pref_service_); store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); // Make modifications and check the contents. @@ -785,17 +807,17 @@ store.reset(); WaitForPasswordStore(); - // The previous results were served from the encrypted LoginDB. + // The previous results were served from an encrypted login database. std::vector<std::unique_ptr<PasswordForm>> stored_forms = - ReadLoginDB(test_encrypted_login_db_file_path(), true); + ReadLoginDB(test_login_db_file_path(), true); EXPECT_EQ(2u, stored_forms.size()); - EXPECT_EQ(PasswordStoreX::COPIED_ALL, migration_step_pref_.GetValue()); + EXPECT_EQ(PasswordStoreX::LOGIN_DB_REPLACED, migration_step_pref_.GetValue()); EXPECT_THAT(stored_forms, UnorderedElementsAre(Pointee(*old_credentials[4]), Pointee(*old_credentials[5]))); histogram_tester_.ExpectBucketCount( "PasswordManager.LinuxBackendMigration.Adoption", - LinuxBackendMigrationStatus::kCopiedAll, 1); + LinuxBackendMigrationStatus::kLoginDBReplaced, 1); } INSTANTIATE_TEST_CASE_P(NoBackend,
diff --git a/chrome/browser/policy/DEPS b/chrome/browser/policy/DEPS index 02e8054..8275742 100644 --- a/chrome/browser/policy/DEPS +++ b/chrome/browser/policy/DEPS
@@ -1,10 +1,3 @@ -include_rules = [ - "+chrome", - "+chromeos", - "+content/public/browser", - "+content/public/common", - "+content/public/test", -] specific_include_rules = { "policy_browsertest\.cc": [ "+ash/shell.h",
diff --git a/chrome/browser/policy/browser_dm_token_storage_linux.cc b/chrome/browser/policy/browser_dm_token_storage_linux.cc index 44b63be..377e804b 100644 --- a/chrome/browser/policy/browser_dm_token_storage_linux.cc +++ b/chrome/browser/policy/browser_dm_token_storage_linux.cc
@@ -123,7 +123,7 @@ std::string BrowserDMTokenStorageLinux::InitDMToken() { base::FilePath token_file_path; - if (!GetDmTokenFilePath(&token_file_path, RetrieveClientId(), true)) + if (!GetDmTokenFilePath(&token_file_path, RetrieveClientId(), false)) return std::string(); std::string token;
diff --git a/chrome/browser/policy/browser_dm_token_storage_linux.h b/chrome/browser/policy/browser_dm_token_storage_linux.h index de10f26..b9dc10a2 100644 --- a/chrome/browser/policy/browser_dm_token_storage_linux.h +++ b/chrome/browser/policy/browser_dm_token_storage_linux.h
@@ -42,6 +42,8 @@ FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageLinuxTest, InitClientId); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageLinuxTest, InitEnrollmentToken); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageLinuxTest, InitDMToken); + FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageLinuxTest, + InitDMTokenWithoutDirectory); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageLinuxTest, SaveDMToken); DISALLOW_COPY_AND_ASSIGN(BrowserDMTokenStorageLinux);
diff --git a/chrome/browser/policy/browser_dm_token_storage_linux_unittest.cc b/chrome/browser/policy/browser_dm_token_storage_linux_unittest.cc index 0f012cf..ef3ff12 100644 --- a/chrome/browser/policy/browser_dm_token_storage_linux_unittest.cc +++ b/chrome/browser/policy/browser_dm_token_storage_linux_unittest.cc
@@ -102,6 +102,23 @@ EXPECT_EQ(kDMToken, storage.InitDMToken()); } +TEST_F(BrowserDMTokenStorageLinuxTest, InitDMTokenWithoutDirectory) { + std::unique_ptr<base::ScopedPathOverride> path_override; + base::ScopedTempDir fake_user_data_dir; + + ASSERT_TRUE(fake_user_data_dir.CreateUniqueTempDir()); + path_override.reset(new base::ScopedPathOverride( + chrome::DIR_USER_DATA, fake_user_data_dir.GetPath())); + + base::FilePath dm_token_dir_path = + fake_user_data_dir.GetPath().Append(kDmTokenBaseDir); + + MockBrowserDMTokenStorageLinux storage; + EXPECT_EQ(std::string(), storage.InitDMToken()); + + EXPECT_FALSE(base::PathExists(dm_token_dir_path)); +} + class TestStoreDMTokenDelegate { public: TestStoreDMTokenDelegate() : called_(false), success_(false) {}
diff --git a/chrome/browser/policy/browser_dm_token_storage_mac.h b/chrome/browser/policy/browser_dm_token_storage_mac.h index db39cde1..ba27e08e 100644 --- a/chrome/browser/policy/browser_dm_token_storage_mac.h +++ b/chrome/browser/policy/browser_dm_token_storage_mac.h
@@ -39,6 +39,8 @@ FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageMacTest, InitClientId); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageMacTest, InitEnrollmentToken); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageMacTest, InitDMToken); + FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageMacTest, + InitDMTokenWithoutDirectory); FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageMacTest, SaveDMToken); DISALLOW_COPY_AND_ASSIGN(BrowserDMTokenStorageMac);
diff --git a/chrome/browser/policy/browser_dm_token_storage_mac.mm b/chrome/browser/policy/browser_dm_token_storage_mac.mm index 7ed47ac..e21673a 100644 --- a/chrome/browser/policy/browser_dm_token_storage_mac.mm +++ b/chrome/browser/policy/browser_dm_token_storage_mac.mm
@@ -171,7 +171,7 @@ std::string BrowserDMTokenStorageMac::InitDMToken() { base::FilePath token_file_path; - if (!GetDmTokenFilePath(&token_file_path, RetrieveClientId(), true)) + if (!GetDmTokenFilePath(&token_file_path, RetrieveClientId(), false)) return std::string(); std::string token;
diff --git a/chrome/browser/policy/browser_dm_token_storage_mac_unittest.cc b/chrome/browser/policy/browser_dm_token_storage_mac_unittest.cc index 1dc9855..e2cb21b 100644 --- a/chrome/browser/policy/browser_dm_token_storage_mac_unittest.cc +++ b/chrome/browser/policy/browser_dm_token_storage_mac_unittest.cc
@@ -106,4 +106,22 @@ EXPECT_EQ(kDMToken, dm_token); } +TEST_F(BrowserDMTokenStorageMacTest, InitDMTokenWithoutDirectory) { + std::unique_ptr<base::ScopedPathOverride> path_override; + base::ScopedTempDir fake_app_data_dir; + + ASSERT_TRUE(fake_app_data_dir.CreateUniqueTempDir()); + path_override.reset(new base::ScopedPathOverride( + base::DIR_APP_DATA, fake_app_data_dir.GetPath())); + + TestStoreDMTokenDelegate delegate; + BrowserDMTokenStorageMac storage; + + base::FilePath dm_token_dir_path = + fake_app_data_dir.GetPath().Append(kDmTokenBaseDir); + + EXPECT_EQ(std::string(), storage.InitDMToken()); + EXPECT_FALSE(base::PathExists(dm_token_dir_path)); +} + } // namespace policy
diff --git a/chrome/browser/policy/cloud/DEPS b/chrome/browser/policy/cloud/DEPS deleted file mode 100644 index dcc7475..0000000 --- a/chrome/browser/policy/cloud/DEPS +++ /dev/null
@@ -1,46 +0,0 @@ -# The //chrome/browser/policy code is being converted into a component at -# //components/policy. This DEPS file is temporarily restricting the include -# rules for this code; once all the exceptions are fixed then the code will -# be moved, and this file will be removed. -# http://crbug.com/271392 - -include_rules = [ - "-chrome", - "-chromeos", - "-content", - "+chrome/browser/policy", - "+components/invalidation", -] - -specific_include_rules = { - # These files will stay. - r"(cloud_policy_browsertest|" - r"cloud_policy_manager_browsertest|" - r"component_cloud_policy_browsertest|" - r"device_management_service_browsertest|" - r"machine_level_user_cloud_policy_browsertest|" - r"test_request_interceptor|" - r"policy_header_service_factory|" - r"policy_header_service_unittest|" - r"user_cloud_policy_invalidator|" - r"user_cloud_policy_invalidator_factory|" - r"user_cloud_policy_manager_factory|" - r"user_policy_signin_service_base|" - r"user_policy_signin_service|" - r"user_policy_signin_service_factory|" - r"user_policy_signin_service_mobile|" - r"user_policy_signin_service_unittest)" - r"\.(cc|h|mm)": [ - "+chrome", - "+chromeos", - "+content/public/browser", - "+content/public/common", - "+content/public/test", - ], - - r"(cloud_policy_invalidator_unittest|" - r"remote_commands_invalidator_unittest)" - r"\.cc": [ - "+chrome/browser/invalidation/fake_invalidation_service.h", - ], -}
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 9cc31b5f..902ca39 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -77,6 +77,7 @@ #if defined(OS_CHROMEOS) #include "ash/public/cpp/ash_pref_names.h" #include "chrome/browser/chromeos/accessibility/magnifier_type.h" +#include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/platform_keys/key_permissions_policy_handler.h" #include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h" #include "chrome/browser/chromeos/policy/secondary_google_account_signin_policy_handler.h" @@ -676,6 +677,9 @@ { key::kNetBiosShareDiscoveryEnabled, prefs::kNetBiosShareDiscoveryEnabled, base::Value::Type::BOOLEAN }, + { key::kCrostiniAllowed, + crostini::prefs::kUserCrostiniAllowedByPolicy, + base::Value::Type::BOOLEAN }, #endif // defined(OS_CHROMEOS) // Metrics reporting is controlled by a platform specific policy for ChromeOS
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 4fc1915e..b529de2 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -353,6 +353,8 @@ // Arbitrary port range for testing the WebRTC UDP port policy. const char kTestWebRtcUdpPortRange[] = "10000-10100"; +constexpr size_t kWebAppId = 42; + void GetTestDataDirectory(base::FilePath* test_data_directory) { ASSERT_TRUE( base::PathService::Get(chrome::DIR_TEST_DATA, test_data_directory)); @@ -6516,7 +6518,7 @@ // Test focus - remote-bound logging allowed if and only if the policy // is configured to allow it. webrtc_event_log_manager->StartRemoteLogging( - render_process_id, kPeerConnectionId, kMaxFileSizeBytes, + render_process_id, kPeerConnectionId, kMaxFileSizeBytes, kWebAppId, BlockingBoolExpectingReplyWithExtras(&run_loop, remote_logging_allowed)); run_loop.Run();
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 18f3e50a..79f60d2 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -323,15 +323,6 @@ namespace { #if defined(OS_ANDROID) -// Deprecated 8/2017. -const char kStabilityForegroundActivityType[] = - "user_experience_metrics.stability.current_foreground_activity_type"; -const char kStabilityLaunchedActivityFlags[] = - "user_experience_metrics.stability.launched_activity_flags"; -const char kStabilityLaunchedActivityCounts[] = - "user_experience_metrics.stability.launched_activity_counts"; -const char kStabilityCrashedActivityCounts[] = - "user_experience_metrics.stability.crashed_activity_counts"; // Deprecated 4/2018. const char kDismissedPhysicalWebPageSuggestions[] = "ntp_suggestions.physical_web.dismissed_ids"; @@ -424,11 +415,6 @@ #if defined(OS_ANDROID) ::android::RegisterPrefs(registry); - // Obsolete activity prefs. See MigrateObsoleteBrowserPrefs(). - registry->RegisterIntegerPref(kStabilityForegroundActivityType, 0); - registry->RegisterIntegerPref(kStabilityLaunchedActivityFlags, 0); - registry->RegisterListPref(kStabilityCrashedActivityCounts); - registry->RegisterListPref(kStabilityLaunchedActivityCounts); #else media_router::RegisterLocalStatePrefs(registry); // The native GCM is used on Android instead. @@ -769,16 +755,10 @@ // This method should be periodically pruned of year+ old migrations. void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state) { -#if defined(OS_ANDROID) - // Added 8/2017. - local_state->ClearPref(kStabilityForegroundActivityType); - local_state->ClearPref(kStabilityLaunchedActivityFlags); - local_state->ClearPref(kStabilityLaunchedActivityCounts); - local_state->ClearPref(kStabilityCrashedActivityCounts); -#else +#if !defined(OS_ANDROID) // Added 1/2018. local_state->ClearPref(kShowFirstRunBubbleOption); -#endif // defined(OS_ANDROID) +#endif // !defined(OS_ANDROID) #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) // Added 5/2018.
diff --git a/chrome/browser/printing/printer_manager_dialog_linux.cc b/chrome/browser/printing/printer_manager_dialog_linux.cc index 47a23f44..75afe6e 100644 --- a/chrome/browser/printing/printer_manager_dialog_linux.cc +++ b/chrome/browser/printing/printer_manager_dialog_linux.cc
@@ -58,10 +58,6 @@ bool opened = false; switch (base::nix::GetDesktopEnvironment(env.get())) { - case base::nix::DESKTOP_ENVIRONMENT_GNOME: - opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand) || - OpenPrinterConfigDialog(kGnomeControlCenterPrintersCommand); - break; case base::nix::DESKTOP_ENVIRONMENT_KDE4: opened = OpenPrinterConfigDialog(kKde4KcmPrinterCommand) || OpenPrinterConfigDialog(kSystemConfigPrinterCommand); @@ -77,10 +73,11 @@ case base::nix::DESKTOP_ENVIRONMENT_XFCE: opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand); break; + case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_OTHER: - LOG(ERROR) - << "Failed to detect the command to open printer config dialog"; - return; + opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand) || + OpenPrinterConfigDialog(kGnomeControlCenterPrintersCommand); + break; } LOG_IF(ERROR, !opened) << "Failed to open printer manager dialog "; }
diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc index 41a85d9..8c33905 100644 --- a/chrome/browser/renderer_preferences_util.cc +++ b/chrome/browser/renderer_preferences_util.cc
@@ -135,9 +135,6 @@ if (linux_ui) { if (ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) { prefs->focus_ring_color = linux_ui->GetFocusRingColor(); - prefs->thumb_active_color = linux_ui->GetThumbActiveColor(); - prefs->thumb_inactive_color = linux_ui->GetThumbInactiveColor(); - prefs->track_color = linux_ui->GetTrackColor(); prefs->active_selection_bg_color = linux_ui->GetActiveSelectionBgColor(); prefs->active_selection_fg_color = linux_ui->GetActiveSelectionFgColor(); prefs->inactive_selection_bg_color =
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.cc index 54af90d..0a00f54 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.cc
@@ -146,10 +146,12 @@ } void LocalSiteCharacteristicsDataImpl::NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) { is_dirty_ = true; + load_duration_.AppendDatum(load_duration.InMicroseconds()); cpu_usage_estimate_.AppendDatum(cpu_usage_estimate.InMicroseconds()); private_footprint_kb_estimate_.AppendDatum(private_footprint_kb_estimate); } @@ -169,7 +171,8 @@ const url::Origin& origin, OnDestroyDelegate* delegate, LocalSiteCharacteristicsDatabase* database) - : cpu_usage_estimate_(kSampleWeightFactor), + : load_duration_(kSampleWeightFactor), + cpu_usage_estimate_(kSampleWeightFactor), private_footprint_kb_estimate_(kSampleWeightFactor), origin_(origin), loaded_tabs_count_(0U), @@ -410,6 +413,8 @@ // If there was on-disk data, update the in-memory performance averages. if (db_site_characteristics->has_load_time_estimates()) { const auto& estimates = db_site_characteristics->load_time_estimates(); + if (estimates.has_avg_load_duration_us()) + load_duration_.PrependDatum(estimates.avg_load_duration_us()); if (estimates.has_avg_cpu_usage_us()) cpu_usage_estimate_.PrependDatum(estimates.avg_cpu_usage_us()); if (estimates.has_avg_footprint_kb()) { @@ -450,6 +455,8 @@ if (cpu_usage_estimate_.num_datums() || private_footprint_kb_estimate_.num_datums()) { auto* estimates = site_characteristics_.mutable_load_time_estimates(); + if (load_duration_.num_datums()) + estimates->set_avg_load_duration_us(load_duration_.value()); if (cpu_usage_estimate_.num_datums()) estimates->set_avg_cpu_usage_us(cpu_usage_estimate_.value()); if (private_footprint_kb_estimate_.num_datums()) {
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h index b3f3b743..d910c1c6 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h
@@ -85,6 +85,9 @@ // Accessors for load-time performance measurement estimates. // If |num_datum| is zero, there's no estimate available. + const ExponentialMovingAverage& load_duration() const { + return load_duration_; + } const ExponentialMovingAverage& cpu_usage_estimate() const { return cpu_usage_estimate_; } @@ -101,6 +104,7 @@ // Call when a load-time performance measurement becomes available. void NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate); @@ -223,7 +227,8 @@ SiteCharacteristicsProto site_characteristics_; // The in-memory storage for the moving performance averages. - ExponentialMovingAverage cpu_usage_estimate_; + ExponentialMovingAverage load_duration_; // microseconds. + ExponentialMovingAverage cpu_usage_estimate_; // microseconds. ExponentialMovingAverage private_footprint_kb_estimate_; // This site's origin.
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl_unittest.cc index 3acb240b..e952013e 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl_unittest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl_unittest.cc
@@ -410,11 +410,16 @@ // Add a couple of performance samples. local_site_data->NotifyLoadTimePerformanceMeasurement( + base::TimeDelta::FromMicroseconds(100), base::TimeDelta::FromMicroseconds(1000), 2000u); local_site_data->NotifyLoadTimePerformanceMeasurement( + base::TimeDelta::FromMicroseconds(200), base::TimeDelta::FromMicroseconds(500), 1000u); // Make sure the local performance samples are averaged as expected. + EXPECT_EQ(2U, local_site_data->load_duration().num_datums()); + EXPECT_EQ(150, local_site_data->load_duration().value()); + EXPECT_EQ(2U, local_site_data->cpu_usage_estimate().num_datums()); EXPECT_EQ(750.0, local_site_data->cpu_usage_estimate().value()); @@ -462,6 +467,7 @@ // Set the previously saved performance averages. auto* estimates = test_proto->mutable_load_time_estimates(); + estimates->set_avg_load_duration_us(50); estimates->set_avg_cpu_usage_us(250); estimates->set_avg_footprint_kb(500); @@ -480,6 +486,9 @@ // Make sure the local performance samples have been updated with the previous // averages. + EXPECT_EQ(3U, local_site_data->load_duration().num_datums()); + EXPECT_EQ(137.5, local_site_data->load_duration().value()); + EXPECT_EQ(3U, local_site_data->cpu_usage_estimate().num_datums()); EXPECT_EQ(562.5, local_site_data->cpu_usage_estimate().value()); @@ -496,6 +505,8 @@ [](const url::Origin& origin, const SiteCharacteristicsProto& proto) { ASSERT_TRUE(proto.has_load_time_estimates()); const auto& estimates = proto.load_time_estimates(); + ASSERT_TRUE(estimates.has_avg_load_duration_us()); + EXPECT_EQ(137.5, estimates.avg_load_duration_us()); ASSERT_TRUE(estimates.has_avg_cpu_usage_us()); EXPECT_EQ(562.5, estimates.avg_cpu_usage_us()); ASSERT_TRUE(estimates.has_avg_footprint_kb());
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc index c7a6bbf..0942147e 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc
@@ -78,10 +78,11 @@ } void LocalSiteCharacteristicsDataWriter::NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - impl_->NotifyLoadTimePerformanceMeasurement(cpu_usage_estimate, + impl_->NotifyLoadTimePerformanceMeasurement(load_duration, cpu_usage_estimate, private_footprint_kb_estimate); }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h index 1837b5f..2edeef80 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h
@@ -31,6 +31,7 @@ void NotifyUsesAudioInBackground() override; void NotifyUsesNotificationsInBackground() override; void NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) override;
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc index d5a54af..7368cf9 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc
@@ -120,7 +120,10 @@ test_impl_->UsesNotificationsInBackground()); writer_->NotifyLoadTimePerformanceMeasurement( + base::TimeDelta::FromMicroseconds(202), base::TimeDelta::FromMicroseconds(101), 1005); + EXPECT_EQ(1u, test_impl_->load_duration().num_datums()); + EXPECT_EQ(202.0, test_impl_->load_duration().value()); EXPECT_EQ(1u, test_impl_->cpu_usage_estimate().num_datums()); EXPECT_EQ(101.0, test_impl_->cpu_usage_estimate().value());
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.cc index d213f25..36953d6 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.cc
@@ -30,6 +30,7 @@ void LocalSiteCharacteristicsNoopDataWriter:: NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) {}
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.h b/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.h index c14ffa2..47bc1fb 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.h +++ b/chrome/browser/resource_coordinator/local_site_characteristics_noop_data_writer.h
@@ -27,6 +27,7 @@ void NotifyUsesAudioInBackground() override; void NotifyUsesNotificationsInBackground() override; void NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) override;
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc index fdf7641..71c6817 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc
@@ -213,6 +213,7 @@ void LocalSiteCharacteristicsWebContentsObserver::OnLoadTimePerformanceEstimate( content::WebContents* contents, const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -236,7 +237,7 @@ .IsSameOriginWith(writer_origin_)) { if (writer_) { writer_->NotifyLoadTimePerformanceMeasurement( - cpu_usage_estimate, private_footprint_kb_estimate); + load_duration, cpu_usage_estimate, private_footprint_kb_estimate); } } }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h index 4895a36..48336ada 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h +++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h
@@ -60,6 +60,7 @@ void OnLoadTimePerformanceEstimate( content::WebContents* web_contents, const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) override;
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc index dff8524..d5af72e 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc
@@ -39,8 +39,8 @@ MOCK_METHOD0(NotifyUpdatesTitleInBackground, void()); MOCK_METHOD0(NotifyUsesAudioInBackground, void()); MOCK_METHOD0(NotifyUsesNotificationsInBackground, void()); - MOCK_METHOD2(NotifyLoadTimePerformanceMeasurement, - void(base::TimeDelta, uint64_t)); + MOCK_METHOD3(NotifyLoadTimePerformanceMeasurement, + void(base::TimeDelta, base::TimeDelta, uint64_t)); const url::Origin& Origin() const { return origin_; } @@ -397,13 +397,17 @@ TabLoadTracker::Get()->TransitionStateForTesting(web_contents(), LoadingState::LOADED); + constexpr base::TimeDelta kExpectedLoadDuration = + base::TimeDelta::FromMicroseconds(501); constexpr base::TimeDelta kExpectedCPUTime = base::TimeDelta::FromMicroseconds(1003); constexpr uint64_t kExpectedMemory = 123u; auto nav_id = GetNavIdForWebContents(); - EXPECT_CALL(*mock_writer, NotifyLoadTimePerformanceMeasurement( - kExpectedCPUTime, kExpectedMemory)); + EXPECT_CALL(*mock_writer, + NotifyLoadTimePerformanceMeasurement( + kExpectedLoadDuration, kExpectedCPUTime, kExpectedMemory)); observer()->OnLoadTimePerformanceEstimate(web_contents(), nav_id, + kExpectedLoadDuration, kExpectedCPUTime, kExpectedMemory); ::testing::Mock::VerifyAndClear(mock_writer); @@ -412,6 +416,7 @@ // writer. nav_id.navigation_id++; observer()->OnLoadTimePerformanceEstimate(web_contents(), nav_id, + kExpectedLoadDuration, kExpectedCPUTime, kExpectedMemory); ::testing::Mock::VerifyAndClear(mock_writer);
diff --git a/chrome/browser/resource_coordinator/page_signal_receiver.cc b/chrome/browser/resource_coordinator/page_signal_receiver.cc index 78d9306..a537bef 100644 --- a/chrome/browser/resource_coordinator/page_signal_receiver.cc +++ b/chrome/browser/resource_coordinator/page_signal_receiver.cc
@@ -72,11 +72,12 @@ void PageSignalReceiver::OnLoadTimePerformanceEstimate( const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) { - NotifyObserversIfKnownCu(page_navigation_id, - &PageSignalObserver::OnLoadTimePerformanceEstimate, - cpu_usage_estimate, private_footprint_kb_estimate); + NotifyObserversIfKnownCu( + page_navigation_id, &PageSignalObserver::OnLoadTimePerformanceEstimate, + load_duration, cpu_usage_estimate, private_footprint_kb_estimate); } void PageSignalReceiver::AddObserver(PageSignalObserver* observer) {
diff --git a/chrome/browser/resource_coordinator/page_signal_receiver.h b/chrome/browser/resource_coordinator/page_signal_receiver.h index 7edd223..d20430c 100644 --- a/chrome/browser/resource_coordinator/page_signal_receiver.h +++ b/chrome/browser/resource_coordinator/page_signal_receiver.h
@@ -52,6 +52,7 @@ virtual void OnLoadTimePerformanceEstimate( content::WebContents* web_contents, const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) {} }; @@ -86,6 +87,7 @@ const PageNavigationIdentity& page_navigation_id) override; void OnLoadTimePerformanceEstimate( const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) override;
diff --git a/chrome/browser/resource_coordinator/site_characteristics.proto b/chrome/browser/resource_coordinator/site_characteristics.proto index 4ca1ab3..27b8f2e 100644 --- a/chrome/browser/resource_coordinator/site_characteristics.proto +++ b/chrome/browser/resource_coordinator/site_characteristics.proto
@@ -18,12 +18,15 @@ } // Contains decaying average performance measurement estimates. -// Next Id: 3 +// Next Id: 4 message SiteCharacteristicsPerformanceMeasurement { // A decaying average of the CPU usage measurements. Units: microseconds. optional float avg_cpu_usage_us = 1; // A decaying average of the process footprint measurements. Units: kilobytes. optional float avg_footprint_kb = 2; + // A decaying average of the duration from navigation commit to "loaded". + // Units: microseconds. + optional float avg_load_duration_us = 3; }; // Defines the characteristics that we want to track about a given site.
diff --git a/chrome/browser/resource_coordinator/site_characteristics_data_writer.h b/chrome/browser/resource_coordinator/site_characteristics_data_writer.h index d536344..a974e04 100644 --- a/chrome/browser/resource_coordinator/site_characteristics_data_writer.h +++ b/chrome/browser/resource_coordinator/site_characteristics_data_writer.h
@@ -31,6 +31,7 @@ // Records performance measurements. virtual void NotifyLoadTimePerformanceMeasurement( + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate) = 0; };
diff --git a/chrome/browser/resource_coordinator/tab_helper.cc b/chrome/browser/resource_coordinator/tab_helper.cc index 3f0742d..487657a 100644 --- a/chrome/browser/resource_coordinator/tab_helper.cc +++ b/chrome/browser/resource_coordinator/tab_helper.cc
@@ -134,6 +134,10 @@ } if (page_resource_coordinator_) { + // Grab the current time up front, as this is as close as we'll get to the + // original commit time. + base::TimeTicks navigation_committed_time = base::TimeTicks::Now(); + content::RenderFrameHost* render_frame_host = navigation_handle->GetRenderFrameHost(); // Make sure the hierarchical structure is constructed before sending signal @@ -157,7 +161,7 @@ UpdateUkmRecorder(navigation_handle->GetNavigationId()); ResetFlag(); page_resource_coordinator_->OnMainFrameNavigationCommitted( - navigation_handle->GetNavigationId(), + navigation_committed_time, navigation_handle->GetNavigationId(), navigation_handle->GetURL().spec()); } }
diff --git a/chrome/browser/resources/accessibility/accessibility.css b/chrome/browser/resources/accessibility/accessibility.css index 63359c2..f141534 100644 --- a/chrome/browser/resources/accessibility/accessibility.css +++ b/chrome/browser/resources/accessibility/accessibility.css
@@ -25,7 +25,7 @@ } .url { - color: #A0A0A0; + color: #696969; } p {
diff --git a/chrome/browser/resources/accessibility/accessibility.html b/chrome/browser/resources/accessibility/accessibility.html index 1b7543d..57e6405a 100644 --- a/chrome/browser/resources/accessibility/accessibility.html +++ b/chrome/browser/resources/accessibility/accessibility.html
@@ -141,7 +141,7 @@ <h2>Chrome Native UI:</h2> <div id="native_ui"> <a is="action-link" tabindex="0" role="button" id="showNativeUI"> - show accessibility tree + Show accessibility tree </a> after <input type="number" value="0" id="native_ui_delay"> ms </div>
diff --git a/chrome/browser/resources/accessibility/accessibility.js b/chrome/browser/resources/accessibility/accessibility.js index 617f9b8..95cfcc9 100644 --- a/chrome/browser/resources/accessibility/accessibility.js +++ b/chrome/browser/resources/accessibility/accessibility.js
@@ -128,6 +128,9 @@ if ('tree' in data) { row.appendChild(createShowAccessibilityTreeElement(data, row, true)); + if (navigator.clipboard) { + row.appendChild(createCopyAccessibilityTreeElement(row.id)); + } row.appendChild(createHideAccessibilityTreeElement(row.id)); row.appendChild(createAccessibilityTreeElement(data)); } else { @@ -173,15 +176,15 @@ function getNameForAccessibilityMode(mode) { switch (mode) { case AXMode.kNativeAPIs: - return 'native'; + return 'Native'; case AXMode.kWebContents: - return 'web'; + return 'Web'; case AXMode.kInlineTextBoxes: - return 'inline text'; + return 'Inline text'; case AXMode.kScreenReader: - return 'screen reader'; + return 'Screen reader'; case AXMode.kHTML: - return 'html'; + return 'HTML'; } return 'unknown'; } @@ -200,32 +203,55 @@ } function createShowAccessibilityTreeElement(data, row, opt_refresh) { - var link = document.createElement('a', 'action-link'); - link.setAttribute('role', 'button'); - if (opt_refresh) - link.textContent = 'refresh accessibility tree'; - else - link.textContent = 'show accessibility tree'; - link.id = row.id + ':showTree'; - link.addEventListener( - 'click', requestWebContentsTree.bind(this, data, link)); - return link; + let show = document.createElement('button'); + if (opt_refresh) { + show.textContent = 'Refresh accessibility tree'; + } else { + show.textContent = 'Show accessibility tree'; + } + show.id = row.id + ':showTree'; + show.addEventListener( + 'click', requestWebContentsTree.bind(this, data, show)); + return show; } function createHideAccessibilityTreeElement(id) { - var link = document.createElement('a', 'action-link'); - link.setAttribute('role', 'button'); - link.textContent = 'hide accessibility tree'; - link.addEventListener('click', function() { - $(id + ':showTree').textContent = 'show accessibility tree'; + let hide = document.createElement('button'); + hide.textContent = 'Hide accessibility tree'; + hide.addEventListener('click', function() { + $(id + ':showTree').textContent = 'Show accessibility tree'; var existingTreeElements = $(id).getElementsByTagName('pre'); - for (var i = 0; i < existingTreeElements.length; i++) + for (var i = 0; i < existingTreeElements.length; i++) { $(id).removeChild(existingTreeElements[i]); + } var row = $(id); - while (row.lastChild != $(id + ':showTree')) + while (row.lastChild != $(id + ':showTree')) { row.removeChild(row.lastChild); + } }); - return link; + return hide; + } + + function createCopyAccessibilityTreeElement(id) { + let copy = document.createElement('button'); + copy.textContent = 'Copy accessibility tree'; + copy.addEventListener('click', () => { + // |id| refers to the div containing accessibility information for a + // single page, so there should only be one <pre> child containing the + // accessibility tree as a string. + let tree = $(id).getElementsByTagName('pre')[0]; + navigator.clipboard.writeText(tree.textContent) + .then(() => { + copy.textContent = 'Copied to clipboard!'; + setTimeout(() => { + copy.textContent = 'Copy accessibility tree'; + }, 5000); + }) + .catch(err => { + console.err('Unable to copy accessibility tree.', err); + }); + }); + return copy; } function createErrorMessageElement(data) {
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.js index 688ffd1..0b6d87d5 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.js
@@ -58,7 +58,7 @@ var emailOptedIn = toggle2 != null && toggle2.hasAttribute('checked'); // TODO(updowndota): Wrap chrome.send() calls with a proxy object. - chrome.send('hotwordResult', [hotword]); + chrome.send('assistantOptInFlow.hotwordResult', [hotword]); chrome.send( 'assistant.GetMoreScreen.userActed', [screenContext, emailOptedIn]); },
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.js index 4ef86fb..d51b6b4 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.js
@@ -60,7 +60,7 @@ * @private */ onSkipTap_: function() { - chrome.send('dialogClose'); + chrome.send('assistantOptInFlow.flowFinished'); }, /**
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.html index 8c5063d..ff02afc 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.html
@@ -17,16 +17,10 @@ <link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> -<include src="../login/hd-iron-icon.html"> <include src="../login/oobe_buttons.html"> <include src="../login/oobe_change_picture.html"> <include src="../login/oobe_dialog.html"> -<include src="assistant_get_more.html"> -<include src="assistant_loading.html"> -<include src="assistant_ready.html"> -<include src="assistant_third_party.html"> -<include src="assistant_value_prop.html"> -<include src="setting_zippy.html"> +<include src="assistant_optin_flow.html"> <link rel="stylesheet" href="chrome://resources/css/chrome_shared.css"> <link rel="stylesheet" href="../login/oobe_flex_layout.css"> @@ -42,20 +36,7 @@ </head> <body> -<div id="consent-dialog" role="group"> - <assistant-loading id="loading"> - </assistant-loading> - <assistant-value-prop id="value-prop"> - </assistant-value-prop> - <assistant-confirm-reject id="confirm-reject" hidden> - </assistant-confirm-reject> - <assistant-third-party id="third-party" hidden> - </assistant-third-party> - <assistant-get-more id="get-more" hidden> - </assistant-get-more> - <assistant-ready id="ready" hidden> - </assistant-ready> -</div> +<assistant-optin-flow id="assistant-optin-flow-card"></assistant-optin-flow> <script src="chrome://resources/js/i18n_template.js"></script>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.js index 55b68ad..c18df874 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin.js
@@ -8,30 +8,16 @@ // <include src="../login/oobe_change_picture.js"> // <include src="../login/oobe_dialog_host_behavior.js"> // <include src="../login/oobe_dialog.js"> -// <include src="utils.js"> -// <include src="setting_zippy.js"> -// <include src="assistant_get_more.js"> -// <include src="assistant_loading.js"> -// <include src="assistant_ready.js"> -// <include src="assistant_third_party.js"> -// <include src="assistant_value_prop.js"> +// <include src="assistant_optin_flow.js"> -cr.define('assistantOptin', function() { +cr.define('assistantOptInFlow', function() { return { /** * Starts the assistant opt-in flow. */ show: function() { - this.boundShowLoadingScreen = assistantOptin.showLoadingScreen.bind(this); - this.boundOnScreenLoadingError = - assistantOptin.onScreenLoadingError.bind(this); - this.boundOnScreenLoaded = assistantOptin.onScreenLoaded.bind(this); - - $('loading').addEventListener( - 'reload', assistantOptin.onReload.bind(this)); - this.showScreen($('value-prop')); - chrome.send('initialized'); + $('assistant-optin-flow-card').onShow(); }, /** @@ -39,12 +25,7 @@ * @param {!Object} data New dictionary with i18n values. */ reloadContent: function(data) { - // Reload global local strings, process DOM tree again. - loadTimeData.overrideValues(data); - i18nTemplate.process(document, loadTimeData); - $('value-prop').reloadContent(data); - $('third-party').reloadContent(data); - $('get-more').reloadContent(data); + $('assistant-optin-flow-card').reloadContent(data); }, /** @@ -53,108 +34,22 @@ * @param {!Object} data String and url for the setting zippy. */ addSettingZippy: function(type, data) { - switch (type) { - case 'settings': - $('value-prop').addSettingZippy(data); - break; - case 'disclosure': - $('third-party').addSettingZippy(data); - break; - case 'get-more': - $('get-more').addSettingZippy(data); - break; - default: - console.error('Undefined zippy data type: ' + type); - } + $('assistant-optin-flow-card').addSettingZippy(type, data); }, /** * Show the next screen in the flow. */ showNextScreen: function() { - switch (this.currentScreen) { - case $('value-prop'): - this.showScreen($('third-party')); - break; - case $('third-party'): - this.showScreen($('get-more')); - break; - case $('get-more'): - this.showScreen($('ready')); - break; - default: - console.error('Undefined'); - chrome.send('dialogClose'); - } + $('assistant-optin-flow-card').showNextScreen(); }, closeDialog: function() { chrome.send('dialogClose'); }, - - /** - * Show the given screen. - * - * @param {Element} screen The screen to be shown. - */ - showScreen: function(screen) { - if (this.currentScreen == screen) { - return; - } - - screen.hidden = false; - screen.addEventListener('loading', this.boundShowLoadingScreen); - screen.addEventListener('error', this.boundOnScreenLoadingError); - screen.addEventListener('loaded', this.boundOnScreenLoaded); - if (this.currentScreen) { - this.currentScreen.hidden = true; - this.currentScreen.removeEventListener( - 'loading', this.boundShowLoadingScreen); - this.currentScreen.removeEventListener( - 'error', this.boundOnScreenLoadingError); - this.currentScreen.removeEventListener( - 'loaded', this.boundOnScreenLoaded); - } - this.currentScreen = screen; - this.currentScreen.onShow(); - }, - - /** - * Show the loading screen. - */ - showLoadingScreen: function() { - $('loading').hidden = false; - this.currentScreen.hidden = true; - $('loading').onShow(); - }, - - /** - * Called when the screen failed to load. - */ - onScreenLoadingError: function() { - $('loading').hidden = false; - this.currentScreen.hidden = true; - $('loading').onErrorOccurred(); - }, - - /** - * Called when all the content of current screen has been loaded. - */ - onScreenLoaded: function() { - this.currentScreen.hidden = false; - $('loading').hidden = true; - $('loading').onPageLoaded(); - }, - - /** - * Called when user request the screen to be reloaded. - */ - onReload: function() { - this.currentScreen.reloadPage(); - }, }; }); document.addEventListener('DOMContentLoaded', function() { - assistantOptin.show(); + assistantOptInFlow.show(); });
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html new file mode 100644 index 0000000..94f959e4 --- /dev/null +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html
@@ -0,0 +1,33 @@ +<!-- 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 src="assistant_get_more.html"> +<include src="assistant_loading.html"> +<include src="assistant_ready.html"> +<include src="assistant_third_party.html"> +<include src="assistant_value_prop.html"> +<include src="setting_zippy.html"> + +<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html"> +<dom-module id="assistant-optin-flow"> + <template> + <link rel="stylesheet" href="../login/oobe_flex_layout.css"> + <link rel="stylesheet" href="../login/oobe_popup_overlay.css"> + <link rel="stylesheet" href="assistant_shared_styles.css"> + <link rel="stylesheet" href="assistant_value_prop.css"> + <assistant-loading id="loading"> + </assistant-loading> + <assistant-value-prop id="value-prop"> + </assistant-value-prop> + <assistant-confirm-reject id="confirm-reject" hidden> + </assistant-confirm-reject> + <assistant-third-party id="third-party" hidden> + </assistant-third-party> + <assistant-get-more id="get-more" hidden> + </assistant-get-more> + <assistant-ready id="ready" hidden> + </assistant-ready> + </template> +</dom-module>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js new file mode 100644 index 0000000..30e24b6 --- /dev/null +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js
@@ -0,0 +1,153 @@ +// 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 src="utils.js"> +// <include src="setting_zippy.js"> +// <include src="assistant_get_more.js"> +// <include src="assistant_loading.js"> +// <include src="assistant_ready.js"> +// <include src="assistant_third_party.js"> +// <include src="assistant_value_prop.js"> + +/** + * @fileoverview Polymer element for displaying material design assistant + * ready screen. + * + */ + +Polymer({ + is: 'assistant-optin-flow', + + behaviors: [OobeDialogHostBehavior], + + /** + * Signal from host to show the screen. + */ + onShow: function() { + this.boundShowLoadingScreen = this.showLoadingScreen.bind(this); + this.boundOnScreenLoadingError = this.onScreenLoadingError.bind(this); + this.boundOnScreenLoaded = this.onScreenLoaded.bind(this); + + this.$['loading'].onBeforeShow(); + this.$['loading'].addEventListener('reload', this.onReload.bind(this)); + this.showScreen(this.$['value-prop']); + chrome.send('assistantOptInFlow.initialized'); + }, + + /** + * Reloads localized strings. + * @param {!Object} data New dictionary with i18n values. + */ + reloadContent: function(data) { + // Reload global local strings, process DOM tree again. + loadTimeData.overrideValues(data); + i18nTemplate.process(document, loadTimeData); + this.$['value-prop'].reloadContent(data); + this.$['third-party'].reloadContent(data); + this.$['get-more'].reloadContent(data); + }, + + /** + * Add a setting zippy object in the corresponding screen. + * @param {string} type type of the setting zippy. + * @param {!Object} data String and url for the setting zippy. + */ + addSettingZippy: function(type, data) { + switch (type) { + case 'settings': + this.$['value-prop'].addSettingZippy(data); + break; + case 'disclosure': + this.$['third-party'].addSettingZippy(data); + break; + case 'get-more': + this.$['get-more'].addSettingZippy(data); + break; + default: + console.error('Undefined zippy data type: ' + type); + } + }, + + /** + * Show the next screen in the flow. + */ + showNextScreen: function() { + switch (this.currentScreen) { + case this.$['value-prop']: + this.showScreen(this.$['third-party']); + break; + case this.$['third-party']: + this.showScreen(this.$['get-more']); + break; + case this.$['get-more']: + this.showScreen(this.$['ready']); + break; + default: + console.error('Undefined'); + chrome.send('dialogClose'); + } + }, + + /** + * Show the given screen. + * + * @param {Element} screen The screen to be shown. + */ + showScreen: function(screen) { + if (this.currentScreen == screen) { + return; + } + + screen.hidden = false; + screen.addEventListener('loading', this.boundShowLoadingScreen); + screen.addEventListener('error', this.boundOnScreenLoadingError); + screen.addEventListener('loaded', this.boundOnScreenLoaded); + if (this.currentScreen) { + this.currentScreen.hidden = true; + this.currentScreen.removeEventListener( + 'loading', this.boundShowLoadingScreen); + this.currentScreen.removeEventListener( + 'error', this.boundOnScreenLoadingError); + this.currentScreen.removeEventListener( + 'loaded', this.boundOnScreenLoaded); + } + this.currentScreen = screen; + this.currentScreen.onBeforeShow(); + this.currentScreen.onShow(); + }, + + /** + * Show the loading screen. + */ + showLoadingScreen: function() { + this.$['loading'].hidden = false; + this.currentScreen.hidden = true; + this.$['loading'].onShow(); + }, + + /** + * Called when the screen failed to load. + */ + onScreenLoadingError: function() { + this.$['loading'].hidden = false; + this.currentScreen.hidden = true; + this.$['loading'].onErrorOccurred(); + }, + + /** + * Called when all the content of current screen has been loaded. + */ + onScreenLoaded: function() { + this.currentScreen.hidden = false; + this.$['loading'].hidden = true; + this.$['loading'].onPageLoaded(); + }, + + /** + * Called when user request the screen to be reloaded. + */ + onReload: function() { + this.currentScreen.reloadPage(); + }, +});
diff --git a/chrome/browser/resources/chromeos/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/chromevox/BUILD.gn index 33abaf3..03e687f2 100644 --- a/chrome/browser/resources/chromeos/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/chromevox/BUILD.gn
@@ -151,6 +151,7 @@ "cvox2/background/panel_menu.js", "cvox2/background/panel_menu_item.js", "cvox2/background/recovery_strategy.js", + "cvox2/background/tree_dumper.js", "cvox2/background/tree_walker.js", "cvox2/background/tutorial.js", "cvox2/injected/keyboard_handler.js",
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js index faeb07f1..cd7e0b6 100644 --- a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js +++ b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
@@ -321,13 +321,13 @@ window.clearInterval(this.blinkerId_); } - this.refreshInternal_(true); - // If there's no cursor, don't schedule blinking. var cursor = this.panStrategy_.getCursor(); - if (cursor.start == -1 || cursor.end == -1) { + var hideCursor = cursor.start == -1 || cursor.end == -1; + + this.refreshInternal_(!hideCursor); + if (hideCursor) return; - } var showCursor = false; this.blinkerId_ = window.setInterval(function() {
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js b/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js index 054ac30..9069c05 100644 --- a/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js +++ b/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js
@@ -12,6 +12,7 @@ goog.provide('cvox.NavBraille'); goog.require('LogStore'); +goog.require('TextLog'); goog.require('Spannable'); /** @@ -119,6 +120,6 @@ return; var logStr = 'Braille "' + this.text.toString() + '"'; - LogStore.getInstance().writeLog(logStr, LogStore.LogType.BRAILLE); + LogStore.getInstance().writeTextLog(logStr, TextLog.LogType.BRAILLE); console.log(logStr); };
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json index d9f77a8..c6ee78a 100644 --- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
@@ -595,6 +595,33 @@ } }, { + "command": "enableLogging", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [79, 69] + } + } + }, + { + "command": "disableLogging", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [79, 68] + } + } + }, + { + "command": "dumpTree", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [68, 84] + } + } + }, + { "command": "help", "sequence": { "cvoxModifier": true,
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html index ce6a923..85d85ae 100644 --- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
@@ -14,8 +14,6 @@ </script> </head> -<html> - <body> <!-- The "with dev msgs" in the title helps when debugging problems @@ -135,8 +133,8 @@ </h2> <div class="option" id="developerSpeechLogging"> <label> - <input id="enableSpeechLogging" type="checkbox" class="checkbox pref" - name="enableSpeechLogging"> + <input id="enableSpeechLogging" type="checkbox" + class="checkbox pref logging" name="enableSpeechLogging"> <span class="i18n" msgid="options_developer_speech_logging"> Enable speech logging </span> @@ -144,8 +142,8 @@ </div> <div class="option" id="developerEarconLogging"> <label> - <input id="enableEarconLogging" type="checkbox" class="checkbox pref" - name="enableEarconLogging"> + <input id="enableEarconLogging" type="checkbox" + class="checkbox pref logging" name="enableEarconLogging"> <span class="i18n" msgid="options_developer_earcon_logging"> Enable earcon logging </span> @@ -153,8 +151,8 @@ </div> <div class="option" id="developerBrailleLogging"> <label> - <input id="enableBrailleLogging" type="checkbox" class="checkbox pref" - name="enableBrailleLogging"> + <input id="enableBrailleLogging" type="checkbox" + class="checkbox pref logging" name="enableBrailleLogging"> <span class="i18n" msgid="options_developer_braille_logging"> Enable braille logging </span> @@ -162,8 +160,8 @@ </div> <div class="option" id="developerEventStream"> <label> - <input id="enableEventStreamLogging" type="checkbox" class="checkbox pref" - name="enableEventStreamLogging"> + <input id="enableEventStreamLogging" type="checkbox" + class="checkbox pref logging" name="enableEventStreamLogging"> <span class="i18n" msgid="options_event_stream_logging"> Enable event stream logging </span>
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js index 6b1b3d4f..25680de 100644 --- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
@@ -194,6 +194,7 @@ } } }; + /** * Adds event listeners to input boxes to update local storage values and * make sure that the input is a positive nonempty number between 1 and 99. @@ -393,15 +394,10 @@ var target = event.target; if (target.id == 'brailleWordWrap') { chrome.storage.local.set({brailleWordWrap: target.checked}); - } else if (target.name == 'enableSpeechLogging') { - cvox.OptionsPage.consoleTts.setEnabled(target.checked); - cvox.OptionsPage.prefs.setPref(target.name, target.checked); - } else if (target.id == 'enableEventStreamLogging') { - cvox.OptionsPage.prefs.setPref(target.name, target.checked); - chrome.extension.getBackgroundPage() - .EventStreamLogger.instance.notifyEventStreamFilterChangedAll( - target.checked); - cvox.OptionsPage.disableEventStreamFilterCheckBoxes(!target.checked); + } else if (target.className.indexOf('logging') != -1) { + cvox.OptionsPage.prefs.setLoggingPrefs(target.name, target.checked); + if (target.name == 'enableEventStreamLogging') + cvox.OptionsPage.disableEventStreamFilterCheckBoxes(!target.checked); } else if (target.className.indexOf('eventstream') != -1) { cvox.OptionsPage.prefs.setPref(target.name, target.checked); chrome.extension.getBackgroundPage()
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js index 5be6dc3..bcf78ef1 100644 --- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
@@ -10,7 +10,9 @@ goog.provide('cvox.ChromeVoxPrefs'); +goog.require('EventStreamLogger'); goog.require('cvox.ChromeVox'); +goog.require('cvox.ConsoleTts'); goog.require('cvox.ExtensionBridge'); goog.require('cvox.KeyMap'); @@ -285,6 +287,27 @@ } }; +/** @enum {string} */ +cvox.ChromeVoxPrefs.loggingPrefs = { + SPEECH: 'enableSpeechLogging', + BRAILLE: 'enableBrailleLogging', + EARCON: 'enableEarconLogging', + EVENT: 'enableEventStreamLogging', +}; + +/** + * Set the value of a pref of logging options. + * @param {cvox.ChromeVoxPrefs.loggingPrefs} key The pref key. + * @param {boolean} value The new value of the pref. + */ +cvox.ChromeVoxPrefs.prototype.setLoggingPrefs = function(key, value) { + localStorage[key] = value; + if (key == 'enableSpeechLogging') + cvox.ConsoleTts.getInstance().setEnabled(value); + else if (key == 'enableEventStreamLogging') + EventStreamLogger.instance.notifyEventStreamFilterChangedAll(value); +}; + /** * Delegates to cvox.KeyMap. * @param {string} command The command to set.
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/injected/console_tts.js b/chrome/browser/resources/chromeos/chromevox/chromevox/injected/console_tts.js index 966788a..2fa0916d 100644 --- a/chrome/browser/resources/chromeos/chromevox/chromevox/injected/console_tts.js +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/injected/console_tts.js
@@ -9,6 +9,7 @@ goog.provide('cvox.ConsoleTts'); goog.require('LogStore'); +goog.require('TextLog'); goog.require('cvox.AbstractTts'); goog.require('cvox.TtsInterface'); @@ -42,7 +43,7 @@ logStr += ' category=' + properties.category; } logStr += ' "' + textString + '"'; - LogStore.getInstance().writeLog(logStr, LogStore.LogType.SPEECH); + LogStore.getInstance().writeTextLog(logStr, TextLog.LogType.SPEECH); console.log(logStr); } return this;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js index c1c10701..1f774565 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
@@ -10,8 +10,11 @@ goog.require('ChromeVoxState'); goog.require('CustomAutomationEvent'); +goog.require('LogStore'); goog.require('Output'); +goog.require('TreeDumper'); goog.require('cvox.ChromeVoxBackground'); +goog.require('cvox.ChromeVoxPrefs'); goog.require('cvox.ChromeVoxKbHandler'); goog.scope(function() { @@ -114,6 +117,40 @@ } }); break; + case 'enableLogging': + chrome.commandLinePrivate.hasSwitch( + 'enable-chromevox-developer-option', function(enable) { + if (enable) { + var prefs = new cvox.ChromeVoxPrefs(); + for (var type in cvox.ChromeVoxPrefs.loggingPrefs) { + prefs.setLoggingPrefs( + cvox.ChromeVoxPrefs.loggingPrefs[type], true); + } + } + }); + break; + case 'disableLogging': + chrome.commandLinePrivate.hasSwitch( + 'enable-chromevox-developer-option', function(enable) { + if (enable) { + var prefs = new cvox.ChromeVoxPrefs(); + for (var type in cvox.ChromeVoxPrefs.loggingPrefs) { + prefs.setLoggingPrefs( + cvox.ChromeVoxPrefs.loggingPrefs[type], false); + } + } + }); + break; + case 'dumpTree': + chrome.commandLinePrivate.hasSwitch( + 'enable-chromevox-developer-option', function(enable) { + if (enable) { + chrome.automation.getDesktop(function(root) { + LogStore.getInstance().writeTreeLog(new TreeDumper(root)); + }); + } + }); + break; case 'decreaseTtsRate': CommandHandler.increaseOrDecreaseSpeechProperty_( cvox.AbstractTts.RATE, false);
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/event_stream_logger.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/event_stream_logger.js index f283342..4e1305ba 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/event_stream_logger.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/event_stream_logger.js
@@ -9,6 +9,7 @@ goog.provide('EventStreamLogger'); goog.require('LogStore'); +goog.require('TextLog'); goog.scope(function() { var AutomationEvent = chrome.automation.AutomationEvent; @@ -84,7 +85,7 @@ logStr += ', RootName = ' + evt.target.root.name; logStr += ', DocumentURL = ' + evt.target.docUrl; - LogStore.getInstance().writeLog(logStr, LogStore.LogType.EVENT); + LogStore.getInstance().writeTextLog(logStr, TextLog.LogType.EVENT); console.log(logStr); },
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.css b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.css index 9c09661f..710c34f8 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.css +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.css
@@ -9,6 +9,17 @@ margin: 0; } +h1 { + background: rgb(247, 152, 58); + color: white; + display: block; + font-size: 16px; + height: 56px; + line-height: 56px; + text-align: center; + width: 100%; +} + /* Log Filters */ #logFilters { margin: 5px;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.html b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.html index 8cadf84..c763c0f2 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.html +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.html
@@ -34,9 +34,13 @@ name="eventFilter"> <span>event</span> </label> + <label> + <input id="treeFilter" type="checkbox" class="log-filter" + name="treeFilter"> + <span>tree</span> + </label> <button id="saveLog">Save Log</button> </div> - <div id="logList"></div> </body> </html>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.js index b910039..6c01755 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log.js
@@ -10,6 +10,7 @@ goog.provide('LogPage'); goog.require('LogStore'); +goog.require('TreeLog'); goog.require('Msgs'); /** @@ -88,8 +89,9 @@ * update logs. */ LogPage.update = function() { - for (var type in LogStore.LogType) { - var typeFilter = LogStore.LogType[type] + 'Filter'; + var logTypes = LogStore.logTypeStr(); + for (var i = 0; i < logTypes.length; i++) { + var typeFilter = logTypes[i] + 'Filter'; var element = document.getElementById(typeFilter); /** If sessionStorage is null, set true. */ if (!sessionStorage.getItem(typeFilter)) @@ -103,7 +105,7 @@ /** * Updates the log section. - * @param {!Array<Log>} log Array of speech. + * @param {Array<BaseLog>} log Array of speech. * @param {Element} div */ LogPage.updateLog = function(log, div) { @@ -118,12 +120,30 @@ var timeStamp = document.createElement('span'); timeStamp.textContent = LogPage.formatTimeStamp(log[i].date); timeStamp.className = 'log-time-tag'; - var textWrapper = document.createElement('span'); - textWrapper.textContent = log[i].logStr; + /** textWrapper should be in block scope, not function scope. */ + let textWrapper = document.createElement('pre'); + textWrapper.textContent = log[i].toString(); textWrapper.className = 'log-text'; p.appendChild(typeName); p.appendChild(timeStamp); + + /** Add hide tree button when logType is tree. */ + if (log[i].logType == TreeLog.LogType.TREE) { + var toggle = document.createElement('label'); + var toggleCheckbox = document.createElement('input'); + toggleCheckbox.type = 'checkbox'; + toggleCheckbox.checked = true; + toggleCheckbox.onclick = function(event) { + textWrapper.hidden = !event.target.checked; + }; + var toggleText = document.createElement('span'); + toggleText.textContent = 'show tree'; + toggle.appendChild(toggleCheckbox); + toggle.appendChild(toggleText); + p.appendChild(toggle); + } + p.appendChild(textWrapper); div.appendChild(p); }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store.js index 269fcc0..9b3fcab 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store.js
@@ -7,21 +7,16 @@ */ goog.provide('LogStore'); -goog.provide('Log'); +goog.provide('BaseLog'); +goog.provide('TextLog'); +goog.provide('TreeLog'); -/** - * @param {!string} logStr - * @param {!string} logType - * @constructor - */ -Log = function(logStr, logType) { - /** - * @type {!string} - */ - this.logStr = logStr; +goog.require('TreeDumper'); +/** @constructor */ +BaseLog = function(logType) { /** - * @type {!string} + * @type {!TextLog.LogType | !TreeLog.LogType} */ this.logType = logType; @@ -31,13 +26,78 @@ this.date = new Date(); }; +/** @return {string} */ +BaseLog.prototype.toString = function() { + return ''; +}; + /** + * @param {string} logStr + * @param {!TextLog.LogType} logType * @constructor + * @extends {BaseLog} */ +TextLog = function(logStr, logType) { + BaseLog.call(this, logType); + + /** + * @type {string} + * @private + */ + this.logStr_ = logStr; +}; + +TextLog.prototype = { + __proto__: BaseLog.prototype, + + /** @override */ + toString: function() { + return this.logStr_; + }, +}; + +/** @enum {string} */ +TextLog.LogType = { + SPEECH: 'speech', + EARCON: 'earcon', + BRAILLE: 'braille', + EVENT: 'event', +}; + +/** + * @param {!TreeDumper} logTree + * @constructor + * @extends {BaseLog} + */ +TreeLog = function(logTree) { + BaseLog.call(this, TreeLog.LogType.TREE); + + /** + * @type {!TreeDumper} + * @private + */ + this.logTree_ = logTree; +}; + +TreeLog.prototype = { + __proto__: BaseLog.prototype, + + /** @override */ + toString: function() { + return this.logTree_.treeToString(); + }, +}; + +/** @enum {string} */ +TreeLog.LogType = { + TREE: 'tree', +}; + +/** @constructor */ LogStore = function() { /** * Ring buffer of size this.LOG_LIMIT - * @type {!Array<Log>} + * @type {!Array<BaseLog>} * @private */ this.logs_ = Array(LogStore.LOG_LIMIT); @@ -53,26 +113,29 @@ }; /** - * @enum {string} - */ -LogStore.LogType = { - SPEECH: 'speech', - EARCON: 'earcon', - BRAILLE: 'braille', - EVENT: 'event', -}; - -/** * @const * @private */ LogStore.LOG_LIMIT = 3000; /** + * List of all LogTypes. + * @return {!Array<!TextLog.LogType | !TreeLog.LogType>} + */ +LogStore.logTypeStr = function() { + var types = []; + for (var type in TextLog.LogType) + types.push(TextLog.LogType[type]); + for (var type in TreeLog.LogType) + types.push(TreeLog.LogType[type]); + return types; +}; + +/** * Create logs in order. * This is not the best way to create logs fast but * getLogs() is not called often. - * @return {!Array<Log>} + * @return {!Array<BaseLog>} */ LogStore.prototype.getLogs = function() { var returnLogs = []; @@ -86,13 +149,26 @@ }; /** - * Write a log to this.logs_. + * Write a text log to this.logs_. * To add a message to logs, this function shuold be called. - * @param {!string} logStr - * @param {!LogStore.LogType} logType + * @param {string} logContent + * @param {!TextLog.LogType} logType */ -LogStore.prototype.writeLog = function(logStr, logType) { - var log = new Log(logStr, logType); +LogStore.prototype.writeTextLog = function(logContent, logType) { + var log = new TextLog(logContent, logType); + this.logs_[this.startIndex_] = log; + this.startIndex_ += 1; + if (this.startIndex_ == LogStore.LOG_LIMIT) + this.startIndex_ = 0; +}; + +/** + * Write a tree log to this.logs_. + * To add a message to logs, this function shuold be called. + * @param {!TreeDumper} logContent + */ +LogStore.prototype.writeTreeLog = function(logContent) { + var log = new TreeLog(logContent); this.logs_[this.startIndex_] = log; this.startIndex_ += 1; if (this.startIndex_ == LogStore.LOG_LIMIT)
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store_test.extjs index b8b0516..af7a2ec 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/log_store_test.extjs
@@ -21,21 +21,21 @@ SYNC_TEST_F('LogStoreTest', 'ShortLogs', function() { var logStore = new LogStore(); for (var i = 0; i < 100; i++) - logStore.writeLog('test' + i, 'speech'); + logStore.writeTextLog('test' + i, 'speech'); var logs = logStore.getLogs(); assertEquals(logs.length, 100); for (var i = 0; i < logs.length; i++) - assertEquals(logs[i].logStr, 'test' + i); + assertEquals(logs[i].toString(), 'test' + i); }); SYNC_TEST_F('LogStoreTest', 'LongLogs', function() { var logStore = new LogStore(); for (var i = 0; i < LogStore.LOG_LIMIT + 500; i++) - logStore.writeLog('test' + i, 'speech'); + logStore.writeTextLog('test' + i, 'speech'); var logs = logStore.getLogs(); assertEquals(logs.length, LogStore.LOG_LIMIT); for (var i = 0; i < logs.length; i++) - assertEquals(logs[i].logStr, 'test' + (i + 500)); + assertEquals(logs[i].toString(), 'test' + (i + 500)); });
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/next_earcons.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/next_earcons.js index d57504f..50e61154 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/next_earcons.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/next_earcons.js
@@ -12,6 +12,7 @@ goog.require('EarconEngine'); goog.require('LogStore'); +goog.require('TextLog'); goog.require('cvox.AbstractEarcons'); @@ -58,7 +59,7 @@ return; } if (localStorage['enableEarconLogging'] == 'true') { - LogStore.getInstance().writeLog(earcon, LogStore.LogType.EARCON); + LogStore.getInstance().writeTextLog(earcon, TextLog.LogType.EARCON); console.log('Earcon ' + earcon); } if (ChromeVoxState.instance.currentRange &&
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.html b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.html index 4d4fbc9..0aa6800 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.html +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.html
@@ -17,8 +17,6 @@ </head> -<html> - <body> <div id="main"> <div hidden id="menus_title" class="i18n" msgid="menus_title"></div>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_dumper.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_dumper.js new file mode 100644 index 0000000..6b004d1 --- /dev/null +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_dumper.js
@@ -0,0 +1,108 @@ +// 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 Dumps a log of the accessibility tree. + */ + +goog.provide('SimpleAutomationNode'); +goog.provide('TreeDumper'); + +var AutomationNode = chrome.automation.AutomationNode; + +/** + * @param {!AutomationNode} node + * @constructor + */ +SimpleAutomationNode = function(node) { + this.name = node.name; + this.role = node.role; + this.value = node.value; + this.url = node.url; + /** Object Rect must be copied in the different pointer. */ + this.location = Object.assign({}, node.location); + this.children = []; + for (var i = 0; i < node.children.length; i++) + this.children.push(new SimpleAutomationNode(node.children[i])); + + /** @type {string} */ + this.logStr = ''; + + /** @return {string} */ + this.toString = function() { + if (this.logStr.length) + return this.logStr; + + if (node.name) + this.logStr += 'name=' + node.name + ' '; + if (node.role) + this.logStr += 'role=' + node.role + ' '; + if (node.value) + this.logStr += 'value=' + node.value + ' '; + if (node.location) { + this.logStr += + 'location=(' + node.location.left + ', ' + node.location.top + ') '; + this.logStr += + 'size=(' + node.location.width + ', ' + node.location.height + ') '; + } + if (node.url) + this.logStr += 'url=' + node.url + ' '; + return this.logStr; + }; +}; + +/** + * Structure of accessibility tree. + * This constructor will traverse whole tree to save the tree structure. + * This should only be called when the user intended to do so. + * @param {!AutomationNode} root + * @constructor + */ +TreeDumper = function(root) { + /** + * @type {!SimpleAutomationNode} + */ + this.rootNode = new SimpleAutomationNode(root); + + /** + * @type {string} + * @private + */ + this.treeStr_; +}; + +/** @return {string} */ +TreeDumper.prototype.treeToString = function() { + if (!this.treeStr_) + this.treeStr_ = this.formatTree_(); + + return this.treeStr_; +}; + +/** + * @param {!SimpleAutomationNode} node + * @param {number} rank + * @private + */ +TreeDumper.prototype.createTreeRecursive_ = function(node, rank) { + var nodeStr = ''; + nodeStr += '++'.repeat(rank); + nodeStr += node.toString(); + nodeStr += '\n'; + + for (var i = 0; i < node.children.length; i++) { + var nextNode = node.children[i]; + nodeStr += this.createTreeRecursive_(nextNode, rank + 1); + } + return nodeStr; +}; + +/** + * @return {string} + * @private + * */ +TreeDumper.prototype.formatTree_ = function() { + var treeStr = this.createTreeRecursive_(this.rootNode, 0); + return treeStr; +};
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb index 323705ff..7ee2705a 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">ቀጣዩ ቁምፊ</translation> <translation id="2281234842553884450">ቀዳሚ ተንሸራታች</translation> <translation id="2294136146931447363">ሰያፍ መጀመሪያ</translation> +<translation id="2311237334957139798">በጥራት ደረጃ ላይ ወደ ቀዳሚው ውሰድ</translation> <translation id="2318372665160196757">ዋና</translation> <translation id="2329324941084714723">የትር ፓነል</translation> <translation id="2344193891939537199">የቀን ሰዓት መቆጣጠሪያ</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">በዚህ ልቀት ላይ አንዳንድ አጓጊ ለውጦች አሉ፤ ምን አዲስ ነገር እንዳለ እነሆ፦</translation> <translation id="5110983769041734144">ምንም ቀዳሚ የቅጽ መስክ የለም።</translation> <translation id="5111640677200759579">የአምድ ራስጌ</translation> +<translation id="5115892389597951922">የChromeVox ምዝግብ ማስታወሻ</translation> <translation id="5136967254288895616">ምንም ቀዳሚ አገናኝ የለም።</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">ሽፋን</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">በChromeVox ውስጥ የፍለጋ ቁልፉ የመቀየሪያ ቁልፍ ነው። አብዛኛዎቹ የChromeVox አቋራጮች በፍለጋ ቁልፉ ነው የሚጀምሩት። እንዲሁም ለአሰሳ የቀስት ቁልፎቹን ነው የሚጠቀሙት።</translation> <translation id="6550720799683018100">ከታች ካለው ዝርዝር አንድ አማራጭ በመምረጥ የአሁኑ የቁልፍ አደራደር ይቀይሩት።</translation> <translation id="6561818612645211875">ወደ የአሁኑ ረድፍ መጀመሪያ ሂድ</translation> +<translation id="6583174818554398774">በጥራት ደረጃ ላይ ወደ ቀጣዩ ውሰድ</translation> <translation id="6587021927234520429">ምንም ቀጣይ የደረጃ 4 ርዕስ የለም።</translation> <translation id="6601344353291556895">ብዙ ቃላት ያላቸው ማብራሪያዎችን አንቃ።</translation> <translation id="6615602925644411249">በዚህ ገጽ ውስጥ ያግኙ።</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb index 53ec1be8..44b4eff 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">الحرف التالي</translation> <translation id="2281234842553884450">شريط التمرير السابق</translation> <translation id="2294136146931447363">بداية النص المائل</translation> +<translation id="2311237334957139798">الانتقال إلى السابق بدقة</translation> <translation id="2318372665160196757">رئيسي</translation> <translation id="2329324941084714723">لوحة علامة التبويب</translation> <translation id="2344193891939537199">التحكم في الوقت والتاريخ</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">لقد أجرينا بعض التغييرات المثيرة في الإصدار الجديد، فيما يلي الميزات الجديدة:</translation> <translation id="5110983769041734144">ليس هناك حقل نموذج سابق.</translation> <translation id="5111640677200759579">عنوان العمود</translation> +<translation id="5115892389597951922">سجلّ ChromeVox</translation> <translation id="5136967254288895616">ليس هناك رابط سابق.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">غلاف</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">في ChromeVox، يكون مفتاح البحث (Search) هو مفتاح التعديل. وتبدأ معظم اختصارات ChromeVox بمفتاح البحث. وستستخدم أيضًا مفاتيح الأسهم للتنقل.</translation> <translation id="6550720799683018100">يمكن تغيير مخطط المفاتيح الحالي عبر تحديد خيار من القائمة أدناه.</translation> <translation id="6561818612645211875">الانتقال إلى بداية الصف الحالي</translation> +<translation id="6583174818554398774">الانتقال إلى التالي بدقة</translation> <translation id="6587021927234520429">ليس هناك عنوان تالٍ من المستوى الرابع.</translation> <translation id="6601344353291556895">تفعيل الأوصاف المطوَّلة.</translation> <translation id="6615602925644411249">بحث في الصفحة.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb index eb421684..319dd4a 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Следващият знак</translation> <translation id="2281234842553884450">Предишният плъзгач</translation> <translation id="2294136146931447363">Начало на текста с курсив</translation> +<translation id="2311237334957139798">Преминаване към предишното ниво на детайлност</translation> <translation id="2318372665160196757">Основен елемент</translation> <translation id="2329324941084714723">Панел на раздел</translation> <translation id="2344193891939537199">Контрола за периода от време</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Направихме някои вълнуващи промени в тази версия. Ето и новите неща:</translation> <translation id="5110983769041734144">Няма предишно поле във формуляра.</translation> <translation id="5111640677200759579">Заглавка на графа</translation> +<translation id="5115892389597951922">Регистрационен файл на ChromeVox</translation> <translation id="5136967254288895616">Няма предишна връзка.</translation> <translation id="513774504516943387">връзка</translation> <translation id="5158275234811857234">Корица</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">В ChromeVox клавишът „търсене“ изпълнява функцията на модифициращ клавиш. Повечето клавишни комбинации в ChromeVox започват с него. Също така клавишите със стрелки служат за навигация.</translation> <translation id="6550720799683018100">Променете текущата клавиатурна подредба, като изберете опция от списъка по-долу.</translation> <translation id="6561818612645211875">Към началото на текущия ред</translation> +<translation id="6583174818554398774">Преминаване към следващото ниво на детайлност</translation> <translation id="6587021927234520429">Няма следващо заглавие от четвърто ниво.</translation> <translation id="6601344353291556895">Активиране на подробните описания.</translation> <translation id="6615602925644411249">Търсене в страницата.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb index 9c10802c..3a32c6dd 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Caràcter següent</translation> <translation id="2281234842553884450">Control lliscant anterior</translation> <translation id="2294136146931447363">Inici de la cursiva</translation> +<translation id="2311237334957139798">Ves al gest anterior en granularitat</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Tauler de pestanya</translation> <translation id="2344193891939537199">Control de data i hora</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Aquesta versió nova inclou alguns canvis molt interessants. Dona-hi una ullada a continuació:</translation> <translation id="5110983769041734144">No hi ha cap camp de formulari anterior.</translation> <translation id="5111640677200759579">Capçalera de la columna</translation> +<translation id="5115892389597951922">Registre de ChromeVox</translation> <translation id="5136967254288895616">No hi ha cap enllaç anterior.</translation> <translation id="513774504516943387">enllaç</translation> <translation id="5158275234811857234">Portada</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">A ChromeVox, Cerca és la tecla modificadora amb què comencen la majoria de dreceres. També faràs servir les tecles de fletxa per desplaçar-te.</translation> <translation id="6550720799683018100">Per canviar el mapa de teclat actual, seleccioneu una opció de la llista següent.</translation> <translation id="6561818612645211875">Ves al principi de la fila actual</translation> +<translation id="6583174818554398774">Ves al gest següent en granularitat</translation> <translation id="6587021927234520429">No hi ha cap capçalera més del nivell 4.</translation> <translation id="6601344353291556895">Activa les descripcions detallades</translation> <translation id="6615602925644411249">Cerca a la pàgina.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb index f2c4690..d74307193 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Další znak</translation> <translation id="2281234842553884450">Předchozí posuvník</translation> <translation id="2294136146931447363">Začátek kurzívy</translation> +<translation id="2311237334957139798">Přejít na předchozí na úrovni podrobnosti</translation> <translation id="2318372665160196757">Hlavní</translation> <translation id="2329324941084714723">Panel karty</translation> <translation id="2344193891939537199">Ovládací prvek času a data</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">V tomto novém vydání pro vás máme několik zajímavých nových funkcí:</translation> <translation id="5110983769041734144">Žádné předchozí pole formuláře.</translation> <translation id="5111640677200759579">Záhlaví sloupce</translation> +<translation id="5115892389597951922">Protokol ChromeVox</translation> <translation id="5136967254288895616">Žádný předchozí odkaz.</translation> <translation id="513774504516943387">odk.</translation> <translation id="5158275234811857234">Titulní strana</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">Jako modifikační klávesa funguje v nástroji ChromeVox vyhledávací tlačítko. Většina klávesových zkratek nástroje ChromeVox začíná vyhledávacím tlačítkem. K navigaci se používají také klávesy se šipkami.</translation> <translation id="6550720799683018100">Aktuální mapu kláves můžete změnit výběrem některé z položek v následujícím seznamu.</translation> <translation id="6561818612645211875">Přejít na začátek aktuálního řádku</translation> +<translation id="6583174818554398774">Přejít na další na úrovni podrobnosti</translation> <translation id="6587021927234520429">Žádný další nadpis 4. úrovně.</translation> <translation id="6601344353291556895">Aktivovat podrobné popisy.</translation> <translation id="6615602925644411249">Vyhledávání na stránce</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb index 343be93..c3012ab 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Næste tegn</translation> <translation id="2281234842553884450">Forrige skyder</translation> <translation id="2294136146931447363">Start kursiv</translation> +<translation id="2311237334957139798">Gå til forrige ved granularitet</translation> <translation id="2318372665160196757">Hoved</translation> <translation id="2329324941084714723">Fanepanel</translation> <translation id="2344193891939537199">Kontrol af dato og tid</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Vi har nogle spændende ændringer i denne nye udgivelse. Her er nyhederne:</translation> <translation id="5110983769041734144">Ingen tidligere formularfelter.</translation> <translation id="5111640677200759579">Kolonneoverskrift</translation> +<translation id="5115892389597951922">ChromeVox-logfil</translation> <translation id="5136967254288895616">Ingen tidligere links.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Forside</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">I ChromeVox bruges søgetasten som ændringstast. De fleste genveje i ChromeVox begynder med søgetasten. Du bruger også piletasterne til at navigere med.</translation> <translation id="6550720799683018100">Skift den nuværende tastaturoversigt ved at vælge en mulighed på listen nedenfor.</translation> <translation id="6561818612645211875">Gå til starten af den aktuelle række</translation> +<translation id="6583174818554398774">Gå til næste ved granularitet</translation> <translation id="6587021927234520429">Ikke flere niveau 4-overskrifter.</translation> <translation id="6601344353291556895">Aktivér detaljerede beskrivelser.</translation> <translation id="6615602925644411249">Find på siden.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb index c87b892..29b0e24 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Nächstes Zeichen</translation> <translation id="2281234842553884450">Vorheriger Schieberegler</translation> <translation id="2294136146931447363">Anfang kursiver Text</translation> +<translation id="2311237334957139798">Zum vorherigen Detaillierungsgrad wechseln</translation> <translation id="2318372665160196757">Hauptinhalt</translation> <translation id="2329324941084714723">Tabsteuerfeld</translation> <translation id="2344193891939537199">Steuerung für Uhrzeit/Datum</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">In dieser neuen Version haben wir einige spannende Änderungen vorgenommen:</translation> <translation id="5110983769041734144">Kein vorheriges Formularfeld</translation> <translation id="5111640677200759579">Spaltenüberschrift</translation> +<translation id="5115892389597951922">ChromeVox-Protokoll</translation> <translation id="5136967254288895616">Kein vorheriger Link</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Titelseite</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">In ChromeVox ist die Suchtaste die Modifikatortaste. Die meisten Tastenkombinationen in ChromeVox beginnen mit der Suchtaste. Außerdem werden auch die Pfeiltasten für die Navigation verwendet.</translation> <translation id="6550720799683018100">Ändern Sie die aktuelle Tastaturbelegung, indem Sie eine Option aus der Liste unten auswählen.</translation> <translation id="6561818612645211875">Zum Anfang der aktuellen Zeile gehen</translation> +<translation id="6583174818554398774">Zum nächsten Detaillierungsgrad wechseln</translation> <translation id="6587021927234520429">Keine nächste Überschrift der Ebene 4</translation> <translation id="6601344353291556895">Ausführliche Beschreibungen aktivieren</translation> <translation id="6615602925644411249">Auf Seite suchen</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb index 77170a30..91e4c5af 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Επόμενος χαρακτήρας</translation> <translation id="2281234842553884450">Προηγούμενο ρυθμιστικό</translation> <translation id="2294136146931447363">Αρχή πλάγιας γραφής</translation> +<translation id="2311237334957139798">Μετακίνηση στο προηγούμενο σε επίπεδο ευαισθησίας</translation> <translation id="2318372665160196757">Κύριο</translation> <translation id="2329324941084714723">Παράθυρο καρτέλας</translation> <translation id="2344193891939537199">Έλεγχος ημερομηνίας και ώρας</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Κάναμε μερικές συναρπαστικές αλλαγές σε αυτήν τη νέα κυκλοφορία. Δείτε τι νέο υπάρχει:</translation> <translation id="5110983769041734144">Δεν υπάρχει προηγούμενο πεδίο φόρμας.</translation> <translation id="5111640677200759579">Κεφαλίδα στήλης</translation> +<translation id="5115892389597951922">Αρχείο καταγραφής ChromeVox</translation> <translation id="5136967254288895616">Δεν υπάρχει προηγούμενος σύνδεσμος.</translation> <translation id="513774504516943387">σύνδεσμος</translation> <translation id="5158275234811857234">Εξώφυλλο</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Στο ChromeVox, το πλήκτρο αναζήτησης είναι το πλήκτρο τροποποίησης. Οι περισσότερες συντομεύσεις του ChromeVox ξεκινούν με το πλήκτρο αναζήτησης. Μπορείτε επίσης να χρησιμοποιήστε τα πλήκτρα βέλους για πλοήγηση.</translation> <translation id="6550720799683018100">Αλλάξτε την τρέχουσα αντιστοίχιση πλήκτρων ορίζοντας μια επιλογή από την παρακάτω λίστα.</translation> <translation id="6561818612645211875">Μετάβαση στην αρχή της τρέχουσας σειράς</translation> +<translation id="6583174818554398774">Μετακίνηση στο επόμενο σε επίπεδο ευαισθησίας</translation> <translation id="6587021927234520429">Δεν υπάρχει επόμενη επικεφαλίδα επιπέδου 4.</translation> <translation id="6601344353291556895">Ενεργοποίηση περιγραφών verbose.</translation> <translation id="6615602925644411249">Εύρεση στη σελίδα.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb index 53ba5711..6ad3454 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Carácter siguiente</translation> <translation id="2281234842553884450">Control deslizante anterior</translation> <translation id="2294136146931447363">Inicio de la cursiva</translation> +<translation id="2311237334957139798">Cambiar a granularidad anterior</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Panel de pestaña</translation> <translation id="2344193891939537199">Control de fecha y hora</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Hemos realizado algunos cambios interesantes en esta nueva versión. Estas son las novedades:</translation> <translation id="5110983769041734144">No hay ningún campo de formulario anterior.</translation> <translation id="5111640677200759579">Encabezado de columna</translation> +<translation id="5115892389597951922">Registro de ChromeVox</translation> <translation id="5136967254288895616">No hay ningún enlace anterior.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Portada</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">En ChromeVox, la tecla de búsqueda es la tecla modificadora. La mayoría de las combinaciones de teclas de ChromeVox empiezan por esta tecla. También se utilizan las teclas de flecha para desplazarse.</translation> <translation id="6550720799683018100">Cambia el mapa de teclado actual seleccionando una de las opciones de la lista que aparece a continuación.</translation> <translation id="6561818612645211875">Accede al principio de la fila actual</translation> +<translation id="6583174818554398774">Cambiar a granularidad siguiente</translation> <translation id="6587021927234520429">No hay ningún título de nivel 4 posterior.</translation> <translation id="6601344353291556895">Habilitar descripciones detalladas.</translation> <translation id="6615602925644411249">Buscar en la página</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb index 68d3ac8..9e09226 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Järgmine tärk</translation> <translation id="2281234842553884450">Eelmine liugur</translation> <translation id="2294136146931447363">Kursiivi algus</translation> +<translation id="2311237334957139798">Detailsustasemel eelmise üksuse juurde liikumine</translation> <translation id="2318372665160196757">Peamine</translation> <translation id="2329324941084714723">Vahelehepaneel</translation> <translation id="2344193891939537199">Kuupäeva ja kellaaja valimine</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">See uus väljalase hõlmab põnevaid muudatusi. Uuendused on järgmised.</translation> <translation id="5110983769041734144">Eelmist vormivälja ei ole.</translation> <translation id="5111640677200759579">Veeru päis</translation> +<translation id="5115892389597951922">ChromeVoxi logi</translation> <translation id="5136967254288895616">Eelmist linki ei ole.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Kaas</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVoxis kasutatakse muuteklahvina otsinguklahvi. Enamik ChromeVoxi otseteid põhinevad otsinguklahvil. Navigeerimiseks kasutatakse ka nooleklahve.</translation> <translation id="6550720799683018100">Muutke praegust klahvitabelit, tehes valiku allolevas loendis.</translation> <translation id="6561818612645211875">Mine praeguse rea algusesse</translation> +<translation id="6583174818554398774">Detailsustasemel järgmise üksuse juurde liikumine</translation> <translation id="6587021927234520429">Järgmist 4. taseme pealkirja ei ole.</translation> <translation id="6601344353291556895">Paljusõnaliste kirjelduste lubamine.</translation> <translation id="6615602925644411249">Lehelt otsimine.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb index 1f680a5..e466fbb 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">نویسه بعدی</translation> <translation id="2281234842553884450">اسلایدر قبلی</translation> <translation id="2294136146931447363">شروع ایتالیک</translation> +<translation id="2311237334957139798">حرکت به قبلی با جزئیات</translation> <translation id="2318372665160196757">اصلی</translation> <translation id="2329324941084714723">پانل برگه</translation> <translation id="2344193891939537199">کنترل تاریخ زمان</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">چند تغییر جالب در این نسخه جدید ارائه دادهایم. موارد جدید در اینجا آمدهاند:</translation> <translation id="5110983769041734144">فیلد فرم قبلی وجود ندارد.</translation> <translation id="5111640677200759579">عنوان ستون</translation> +<translation id="5115892389597951922">گزارش ChromeVox</translation> <translation id="5136967254288895616">پیوند قبلی موجود نیست.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">جلد</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">در ChromeVox، کلید «جستجو» (Search) کلید تغییردهنده است. اکثر میانبرهای ChromeVox با کلید «جستجو» شروع میشوند. از کلیدهای پیکان نیز برای پیمایش استفاده میکنید.</translation> <translation id="6550720799683018100">نقشه کلید کنونی را با انتخاب یک گزینه از فهرست زیر تغییر دهید.</translation> <translation id="6561818612645211875">رفتن به شروع ردیف کنونی</translation> +<translation id="6583174818554398774">حرکت به بعدی با جزئیات</translation> <translation id="6587021927234520429">عنوان سطح ۴ بعدی وجود ندارد.</translation> <translation id="6601344353291556895">توضیحات طولانی را فعال کنید.</translation> <translation id="6615602925644411249">یافتن در صفحه.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb index e885893..f4db98f4 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Susunod na Character</translation> <translation id="2281234842553884450">Nakaraang slider</translation> <translation id="2294136146931447363">Simula ng italic</translation> +<translation id="2311237334957139798">Lumipat sa nakaraang granularity</translation> <translation id="2318372665160196757">Pangunahin</translation> <translation id="2329324941084714723">Panel ng tab</translation> <translation id="2344193891939537199">Kontrol sa petsa at oras</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">May ilan kaming kapana-panabik na pagbabago sa bagong release na ito; narito ang bago:</translation> <translation id="5110983769041734144">Walang nakaraang field ng form.</translation> <translation id="5111640677200759579">Header ng column</translation> +<translation id="5115892389597951922">Log ng ChromeVox</translation> <translation id="5136967254288895616">Walang nakaraang link.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Cover</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Sa ChromeVox, ang Key sa paghahanap ay ang modifier key. Nagsisimula ang karamihan sa mga shortcut ng ChromeVox sa Key sa paghahanap. Gagamitin mo rin ang mga arrow key sa pag-navigate.</translation> <translation id="6550720799683018100">Palitan ang kasalukuyang keymap sa pamamagitan ng pagpili ng opsyon sa listahan sa ibaba.</translation> <translation id="6561818612645211875">Pumunta sa umpisa ng kasalukuyang row</translation> +<translation id="6583174818554398774">Lumipat sa susunod na granularity</translation> <translation id="6587021927234520429">Walang susunod na heading sa antas 4.</translation> <translation id="6601344353291556895">I-enable ang mga masalitang paglalarawan.</translation> <translation id="6615602925644411249">Hanapin sa page.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb index 0d938853..ae80794 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Caractère suivant</translation> <translation id="2281234842553884450">Curseur précédent</translation> <translation id="2294136146931447363">Début du texte en italique</translation> +<translation id="2311237334957139798">Reculer avec précision</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Panneau tab</translation> <translation id="2344193891939537199">Commande relative à la date et à l'heure</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Dans cette nouvelle version, nous avons apporté quelques modifications intéressantes :</translation> <translation id="5110983769041734144">Aucun champ de formulaire précédent</translation> <translation id="5111640677200759579">En-tête de colonne</translation> +<translation id="5115892389597951922">Journal ChromeVox</translation> <translation id="5136967254288895616">Aucun lien précédent</translation> <translation id="513774504516943387">lien</translation> <translation id="5158275234811857234">Couverture</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Dans ChromeVox, la touche de recherche correspond à la touche de modification. La plupart des raccourcis ChromeVox commencent par la touche de recherche. Les touches fléchées sont utilisées pour la navigation.</translation> <translation id="6550720799683018100">Modifiez le mappage actuel du clavier en sélectionnant une option dans la liste ci-dessous.</translation> <translation id="6561818612645211875">Accéder au début de la ligne actuelle</translation> +<translation id="6583174818554398774">Avancer avec précision</translation> <translation id="6587021927234520429">Aucun titre de niveau 4 suivant</translation> <translation id="6601344353291556895">Activer les descriptions détaillées</translation> <translation id="6615602925644411249">Rechercher sur la page</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb index a1eefb1..4dc70dd 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -16,6 +16,7 @@ <translation id="1065552602950927991">અમાન્ય ઇનપુટ</translation> <translation id="1080471004309605942">ઇટાલિક સમાપ્ત</translation> <translation id="1082209053475788238">પહેલાંનુ સ્તર 6 મથાળું નથી.</translation> +<translation id="1087788677726983142">ઇવેન્ટ સ્ટ્રીમ ફિલ્ટર છુપાવો</translation> <translation id="1088219014394087294">કોઇ મથાળું નથી.</translation> <translation id="1106741348836243114">સાઉન્ડ પ્રતિસાદ (ઇઅરકોન્સ) ચાલુ અથવા બંધ કરો.</translation> <translation id="1108651818222110612">સબટાઇટલ</translation> @@ -78,6 +79,7 @@ <translation id="1618597272655350600">વર્તમાન સ્થિતિનું સંપૂર્ણ વર્ણન જાહેર કરે છે</translation> <translation id="1639634871799530612">{COUNT,plural, =1{આના કરતાં મોટું}one{# આના કરતાં મોટાની નિશાની}other{# આના કરતાં મોટાની નિશાની}}</translation> <translation id="1653266918374749391">પહેલાનાં સ્તર 3 નું મથાળું</translation> +<translation id="1657616855184033958">ઇવેન્ટ સ્ટ્રીમ ફિલ્ટર બતાવો</translation> <translation id="1659072772017912254">તપાસેલું નથી</translation> <translation id="1669290819662866522">અઠવાડિયું</translation> <translation id="1674262202423278359">ChromeVox નેવિગેશન્</translation> @@ -137,6 +139,7 @@ <translation id="2267945578749931355">આગલો અક્ષર</translation> <translation id="2281234842553884450">પહેલાનું સ્લાઇડર</translation> <translation id="2294136146931447363">ઇટાલિક શરૂ</translation> +<translation id="2311237334957139798">ગ્રેન્યુલારિટિ પર પાછળ ખસેડો</translation> <translation id="2318372665160196757">મુખ્ય</translation> <translation id="2329324941084714723">ટેબ પેનલ</translation> <translation id="2344193891939537199">તારીખ સમયનું નિયંત્રણ</translation> @@ -412,6 +415,7 @@ <translation id="4255943572433203166">ChromeVox ને કસ્ટમાઇઝ કરવા માટે નીચેના વિકલ્પોનો ઉપયોગ કરો. ફેરફારો તરતજ પ્રભાવી થાય છે.</translation> <translation id="4271220233568730077">આગલું ગણિત</translation> <translation id="4271521365602459209">વધુ પરિણામો નથી.</translation> +<translation id="4275397969489577657">ઇવેન્ટ સ્ટ્રીમ લૉગિંગ ચાલુ કરો</translation> <translation id="4287520460805643128">કોઈ આગલો લેખ નથી.</translation> <translation id="4289540628985791613">વિહંગાવલોકન</translation> <translation id="4300318234632215983">લિંકની પાછળનાં URL ની ઘોષણા કરો</translation> @@ -515,6 +519,7 @@ <translation id="5106547198195128110">આ નવા રિલીઝમાં અમે કેટલાક આકર્ષક ફેરફારો લાવ્યા છીએ; નવું અહીં પ્રસ્તુત છે:</translation> <translation id="5110983769041734144">પહેલાની ફોર્મ ફીલ્ડ નથી.</translation> <translation id="5111640677200759579">કૉલમ હેડર</translation> +<translation id="5115892389597951922">ChromeVox લૉગ</translation> <translation id="5136967254288895616">પહેલાની લિંક નથી.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">કવર</translation> @@ -548,6 +553,7 @@ <translation id="5407530583102765689">{COUNT,plural, =1{અર્ધવિરામ}one{# અર્ધવિરામ}other{# અર્ધવિરામ}}</translation> <translation id="5411891038905756502">પહેલાનું જમ્પ બિંદુ નથી.</translation> <translation id="5417034931411865818">રૂટિંગ કી $1 હેઠળની આઇટમને ક્લિક કરો</translation> +<translation id="5435274640623994081">ઇઅરકોન લૉગિંગ ચાલુ કરો</translation> <translation id="5436105723448703439">{COUNT,plural, =1{આના કરતાં ઓછું}one{# આના કરતાં ઓછાની નિશાની}other{# આના કરતાં ઓછાની નિશાની}}</translation> <translation id="5444587279251314700">(સક્રિય)</translation> <translation id="5446809554778706307">કોઈ ફોકસ નથી. એક નવું ટૅબ ખોલવા માટે Ctrl+T દબાવો.</translation> @@ -681,6 +687,7 @@ <translation id="6540201937398578274">ChromeVoxમાં, શોધ કી એ પરિવર્તનકારી કી છે. મોટાભાગના ChromeVox શૉર્ટકટ શોધ કી વડે શરૂ થાય છે. તમે નૅવિગેશન માટે તીર કીનો ઉપયોગ પણ કરશો.</translation> <translation id="6550720799683018100">નીચેની સૂચિમાંથી એક વિકલ્પ પસંદ કરીને વર્તમાન કીમૅપ બદલો.</translation> <translation id="6561818612645211875">ચાલુ પંક્તિની શરૂઆત પર જાઓ</translation> +<translation id="6583174818554398774">ગ્રેન્યુલારિટિ પર આગળ ખસેડો</translation> <translation id="6587021927234520429">આગલું સ્તર 4 મથાળું નથી.</translation> <translation id="6601344353291556895">વર્બોઝ વર્ણનો સક્ષમ કરો.</translation> <translation id="6615602925644411249">પૃષ્ઠમાં શોધો.</translation> @@ -897,6 +904,7 @@ <translation id="8650576015643545550">પહેલાની સૂચિ નથી.</translation> <translation id="8651481478098336970">વૉલ્યૂમ મ્યૂટ કરો</translation> <translation id="8653646212587894517">લિંક્સની સૂચિ બતાવો</translation> +<translation id="8656888282555543604">બ્રેઇલ લૉગિંગ ચાલુ કરો</translation> <translation id="8664519043722036194">સેકંડ</translation> <translation id="867187640362843212">મથાળું 5</translation> <translation id="8697111817566059991">{COUNT,plural, =1{પાઇપ}one{# વર્ટિકલ પાઇપ}other{# વર્ટિકલ પાઇપ}}</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb index a6aca24..48ce54b 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">अगला वर्ण</translation> <translation id="2281234842553884450">पिछला स्लाइडर</translation> <translation id="2294136146931447363">इटैलिक शुरू</translation> +<translation id="2311237334957139798">पिछले विवरण ले जाएं</translation> <translation id="2318372665160196757">मुख्य</translation> <translation id="2329324941084714723">टैब फलक</translation> <translation id="2344193891939537199">दिनांक समय नियंत्रण</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">हमने इस नई रिलीज़ में कुछ रोचक बदलाव किए हैं; यहां बताया गया है कि नया क्या है:</translation> <translation id="5110983769041734144">कोई पिछला फ़ॉर्म फ़ील्ड नहीं.</translation> <translation id="5111640677200759579">स्तंभ शीर्षलेख</translation> +<translation id="5115892389597951922">ChromeVox लॉग</translation> <translation id="5136967254288895616">कोई पिछला लिंक नहीं.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">कवर</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox में, खोज की, बदलने वाली की होती है. ज़्यादातर ChromeVox शॉर्टकट खोज की से शुरू होते हैं. आप नेविगेशन के लिए तीर की का इस्तेमाल भी कर सकेंगे.</translation> <translation id="6550720799683018100">नीचे दी गई सूची से विकल्प चुनकर वर्तमान कीमैप बदलें.</translation> <translation id="6561818612645211875">वर्तमान पंक्ति के प्रारंभ पर जाएं</translation> +<translation id="6583174818554398774">अगले विवरण ले जाएं</translation> <translation id="6587021927234520429">कोई अगला स्तर 4 शीर्षक नहीं.</translation> <translation id="6601344353291556895">शब्दाडंबरपूर्ण वर्णन सक्षम करें.</translation> <translation id="6615602925644411249">पेज में ढूंढें.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb index 1c6c771..7220abe75 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Sljedeći znak</translation> <translation id="2281234842553884450">Prethodni klizač</translation> <translation id="2294136146931447363">Početak kurziva</translation> +<translation id="2311237334957139798">Pomicanje na prethodno s razinom preciznosti</translation> <translation id="2318372665160196757">Glavno</translation> <translation id="2329324941084714723">Ploča kartice</translation> <translation id="2344193891939537199">Upravljanje datumom i vremenom</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">U novom smo izdanju uveli neke uzbudljive promjene. Evo što je novo:</translation> <translation id="5110983769041734144">Nema prethodnog polja obrasca.</translation> <translation id="5111640677200759579">Zaglavlje stupca</translation> +<translation id="5115892389597951922">ChromeVox zapisnik</translation> <translation id="5136967254288895616">Nema prethodne veze.</translation> <translation id="513774504516943387">veza</translation> <translation id="5158275234811857234">Naslovnica</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">U ChromeVoxu tipka za pretraživanje ujedno služi kao modifikatorska tipka. Za većinu prečaca ChromeVoxa prvo trebate pritisnuti tipku za pretraživanje, a za kretanje koristite tipke strelica.</translation> <translation id="6550720799683018100">Promijenite trenutačnu kartu tipkovnice odabirom opcije na donjem popisu.</translation> <translation id="6561818612645211875">Prelazak na početak trenutačnog retka</translation> +<translation id="6583174818554398774">Pomicanje na sljedeće s razinom preciznosti</translation> <translation id="6587021927234520429">Nema sljedećeg naslova razine 4.</translation> <translation id="6601344353291556895">Omogući opširne opise.</translation> <translation id="6615602925644411249">Traženje na stranici.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb index 1acded4f..c467b9fa 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Következő karakter</translation> <translation id="2281234842553884450">Előző dia</translation> <translation id="2294136146931447363">Dőlt betű kezdődik</translation> +<translation id="2311237334957139798">Ugrás az előző részletességi szintre</translation> <translation id="2318372665160196757">Fő</translation> <translation id="2329324941084714723">Lappanel</translation> <translation id="2344193891939537199">Dátum és idő beállítása</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Érdekes módosításokat hajtottunk végre ebben az új kiadásban; íme az újdonságok:</translation> <translation id="5110983769041734144">Nincs előző űrlap mező.</translation> <translation id="5111640677200759579">Oszlopfejléc</translation> +<translation id="5115892389597951922">ChromeVox-napló</translation> <translation id="5136967254288895616">Nincs előző link.</translation> <translation id="513774504516943387">link</translation> <translation id="5158275234811857234">Borító</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">A ChromeVox szolgáltatásban a keresőgomb a módosító billentyű. A legtöbb ChromeVox-billentyűparancs a keresőgombbal kezdődik. A navigációhoz a nyílbillentyűket is használnia kell.</translation> <translation id="6550720799683018100">A jelenlegi billentyűzetkiosztást az alábbi listáról választva változtathatja meg.</translation> <translation id="6561818612645211875">Ugrás az aktuális sor elejére</translation> +<translation id="6583174818554398774">Ugrás a következő részletességi szintre</translation> <translation id="6587021927234520429">Nincs következő 4-es szintű címsor.</translation> <translation id="6601344353291556895">Terjedelmesebb leírások engedélyezése.</translation> <translation id="6615602925644411249">Keresés az oldalon.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb index bc212ce..2415dce 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Karakter Berikutnya</translation> <translation id="2281234842553884450">Penggeser sebelumnya</translation> <translation id="2294136146931447363">Awal teks berformat miring</translation> +<translation id="2311237334957139798">Pindah ke sebelumnya dengan perincian</translation> <translation id="2318372665160196757">Utama</translation> <translation id="2329324941084714723">Panel tab</translation> <translation id="2344193891939537199">Kontrol tanggal dan waktu</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Kami memiliki beberapa perubahan menarik dalam rilis baru ini; berikut apa saja yang baru:</translation> <translation id="5110983769041734144">Tidak ada bidang formulir sebelumnya.</translation> <translation id="5111640677200759579">Judul kolom</translation> +<translation id="5115892389597951922">Log ChromeVox</translation> <translation id="5136967254288895616">Tidak ada link sebelumnya.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Sampul</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Di ChromeVox, tombol Penelusuran adalah kunci pengubah. Sebagian besar pintasan ChromeVox dimulai dengan tombol Penelusuran. Anda juga dapat menggunakan tombol panah untuk navigasi.</translation> <translation id="6550720799683018100">Ubah peta tombol saat ini dengan memilih opsi dari daftar di bawah.</translation> <translation id="6561818612645211875">Berpindah ke awal baris saat ini</translation> +<translation id="6583174818554398774">Pindah ke berikutnya dengan perincian</translation> <translation id="6587021927234520429">Tidak ada judul tingkat 4 berikutnya.</translation> <translation id="6601344353291556895">Aktifkan deskripsi panjang.</translation> <translation id="6615602925644411249">Cari di halaman.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb index 44c1488..26a1b0c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Carattere successivo</translation> <translation id="2281234842553884450">Dispositivo di scorrimento precedente</translation> <translation id="2294136146931447363">Inizio del testo corsivo</translation> +<translation id="2311237334957139798">Vai al gesto di granularità precedente</translation> <translation id="2318372665160196757">Principale</translation> <translation id="2329324941084714723">Riquadro a schede</translation> <translation id="2344193891939537199">Controllo data/ora</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Grandi cambiamenti in questa nuova uscita, ecco tutte le novità:</translation> <translation id="5110983769041734144">Nessun campo modulo precedente.</translation> <translation id="5111640677200759579">Intestazione di colonna</translation> +<translation id="5115892389597951922">Log di ChromeVox</translation> <translation id="5136967254288895616">Nessun link precedente.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Copertina</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">In ChromeVox il tasto per la ricerca è il tasto di modifica. La maggior parte delle scorciatoie di ChromeVox inizia premendo il tasto per la ricerca. I tasti freccia vengono utilizzati per gli spostamenti.</translation> <translation id="6550720799683018100">Modifica la voce mappa di chiavi corrente scegliendo una delle opzioni riportate di seguito.</translation> <translation id="6561818612645211875">Vai all'inizio della riga corrente</translation> +<translation id="6583174818554398774">Vai al gesto di granularità successivo</translation> <translation id="6587021927234520429">Nessuna intestazione livello 4 successiva.</translation> <translation id="6601344353291556895">Attiva descrizioni dettagliate.</translation> <translation id="6615602925644411249">Trova nella pagina.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb index 58bb4fa..60b3a11 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">התו הבא</translation> <translation id="2281234842553884450">המחוון הקודם</translation> <translation id="2294136146931447363">תחילת טקסט נטוי</translation> +<translation id="2311237334957139798">חזרה אל הקודם ברמת הפירוט</translation> <translation id="2318372665160196757">ראשי</translation> <translation id="2329324941084714723">חלונית כרטיסיות</translation> <translation id="2344193891939537199">בקרת תאריך ושעה</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">יש שינויים מעניינים בגירסה החדשה. הנה העדכונים:</translation> <translation id="5110983769041734144">אין שדה קודם בטופס.</translation> <translation id="5111640677200759579">כותרת עמודה</translation> +<translation id="5115892389597951922">יומן ChromeVox</translation> <translation id="5136967254288895616">אין קישור קודם.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">שער</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ב-ChromeVox, מקש החיפוש הוא מקש הצירוף. רוב הרצפים של מקשי הקיצור ב-ChromeVox מתחילים עם מקש החיפוש. כמו כן, מקשי החיצים משמשים לניווט.</translation> <translation id="6550720799683018100">שנה את מפת המקשים הנוכחית על ידי בחירה באפשרות מתוך הרשימה בהמשך.</translation> <translation id="6561818612645211875">עבור לתחילת השורה הנוכחית</translation> +<translation id="6583174818554398774">מעבר אל הבא ברמת הפירוט</translation> <translation id="6587021927234520429">אין עוד כותרת ברמה 4.</translation> <translation id="6601344353291556895">הפעל תיאורים מרובי-מלל.</translation> <translation id="6615602925644411249">חפש בדף.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb index 3e1e329..3d70a17f 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">次の文字</translation> <translation id="2281234842553884450">前のスライダ</translation> <translation id="2294136146931447363">斜体の先頭</translation> +<translation id="2311237334957139798">前の詳細レベルに移動します</translation> <translation id="2318372665160196757">本文</translation> <translation id="2329324941084714723">タブ パネル</translation> <translation id="2344193891939537199">日時の設定</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">この新しいリリースでの変更内容は以下のとおりです。</translation> <translation id="5110983769041734144">前のフォーム フィールドはありません。</translation> <translation id="5111640677200759579">列見出し</translation> +<translation id="5115892389597951922">ChromeVox ログ</translation> <translation id="5136967254288895616">前のリンクはありません。</translation> <translation id="513774504516943387">リンク</translation> <translation id="5158275234811857234">表紙</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox では、検索キーは修飾キーとなります。ChromeVox のショートカットのほとんどは検索キーで始まります。また、移動には矢印キーを使用します。</translation> <translation id="6550720799683018100">下のリストからオプションを選択して、現在のキーマップを変更できます。</translation> <translation id="6561818612645211875">現在の行の先頭に移動</translation> +<translation id="6583174818554398774">次の詳細レベルに移動します</translation> <translation id="6587021927234520429">次のレベル 4 見出しはありません。</translation> <translation id="6601344353291556895">詳細な説明を有効にする。</translation> <translation id="6615602925644411249">ページ内検索です。</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb index 93b91ca..002d2e7 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">ಮುಂದಿನ ಅಕ್ಷರ</translation> <translation id="2281234842553884450">ಹಿಂದಿನ ಸ್ಲೈಡರ್</translation> <translation id="2294136146931447363">ಇಟಾಲಿಕ್ ಆರಂಭ</translation> +<translation id="2311237334957139798">ರಚನೆಯಲ್ಲಿ ಹಿಂದಿನದಕ್ಕೆ ಹೋಗಿ</translation> <translation id="2318372665160196757">ಮುಖ್ಯ</translation> <translation id="2329324941084714723">ಟ್ಯಾಬ್ ಫಲಕ</translation> <translation id="2344193891939537199">ದಿನಾಂಕ ಸಮಯ ನಿಯಂತ್ರಣ</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">ಈ ಹೊಸ ಬಿಡುಗಡೆಯಲ್ಲಿ ನಾವು ಕೆಲವೊಂದು ಉತ್ತೇಜಕ ಬದಲಾವಣೆಗಳನ್ನು ಹೊಂದಿದ್ದೇವೆ; ಹೊಸದೇನಿದೆ ಎಂಬುದು ಇಲ್ಲಿದೆ:</translation> <translation id="5110983769041734144">ಯಾವುದೇ ಹಿಂದಿನ ಫಾರ್ಮ್ ಕ್ಷೇತ್ರವಿಲ್ಲ.</translation> <translation id="5111640677200759579">ಕಾಲಮ್ ಶಿರೋನಾಮೆ</translation> +<translation id="5115892389597951922">ChromeVox ಲಾಗ್</translation> <translation id="5136967254288895616">ಯಾವುದೇ ಹಿಂದಿನ ಲಿಂಕ್ ಇಲ್ಲ.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">ಕವರ್</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox ನಲ್ಲಿ, ಹುಡುಕಾಟ ಕೀ ಎನ್ನುವುದು ಮಾರ್ಪಡಿಸುವ ಕೀ ಆಗಿದೆ. ಹೆಚ್ಚಿನ ChromeVox ಶಾರ್ಟ್ಕಟ್ಗಳು ಹುಡುಕಾಟ ಕೀ ಜೊತೆಗೆ ಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತವೆ. ನೀವು ನ್ಯಾವಿಗೇಶನ್ಗೆ ಬಾಣದ ಕೀಲಿಗಳನ್ನು ಸಹ ಬಳಸುತ್ತೀರಿ.</translation> <translation id="6550720799683018100">ಕೆಳಗಿನ ಪಟ್ಟಿಯಿಂದ ಆಯ್ಕೆವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡುವುದರ ಮೂಲಕ ಪ್ರಸ್ತುತ ಕೀಮ್ಯಾಪ್ ಅನ್ನು ಬದಲಾಯಿಸಿ.</translation> <translation id="6561818612645211875">ಪ್ರಸ್ತುತ ಸಾಲಿನ ಆರಂಭಕ್ಕೆ ಹೋಗಿ</translation> +<translation id="6583174818554398774">ರಚನೆಯಲ್ಲಿ ಮುಂದಿನಕ್ಕೆ ಹೋಗಿ</translation> <translation id="6587021927234520429">ಯಾವುದೇ ಮುಂದಿನ ಮಟ್ಟದ 4 ಶಿರೋನಾಮೆಯಿಲ್ಲ.</translation> <translation id="6601344353291556895">ಅತಿಮಾತಿನ ವಿವರಣೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="6615602925644411249">ಪುಟದಲ್ಲಿ ಹುಡುಕಿ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb index e44f8000..bc8a40c1 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">다음 문자</translation> <translation id="2281234842553884450">이전 슬라이더</translation> <translation id="2294136146931447363">기울임꼴 시작 부분</translation> +<translation id="2311237334957139798">이전 세부사항으로 이동</translation> <translation id="2318372665160196757">기본</translation> <translation id="2329324941084714723">탭 패널</translation> <translation id="2344193891939537199">날짜 시간 컨트롤</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">새 버전에 몇 가지 흥미로운 변경사항이 추가되었습니다. 새로운 기능은 다음과 같습니다.</translation> <translation id="5110983769041734144">이전 양식 입력란이 없습니다.</translation> <translation id="5111640677200759579">열 헤더</translation> +<translation id="5115892389597951922">ChromeVox 로그</translation> <translation id="5136967254288895616">이전 링크가 없습니다.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">표지</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox에서 검색 키는 특수키입니다. 대부분의 ChromeVox 단축키는 검색 키로 시작합니다. 탐색하려면 화살표 키를 사용합니다.</translation> <translation id="6550720799683018100">아래 목록에서 옵션을 선택하여 현재 키맵을 변경합니다.</translation> <translation id="6561818612645211875">현재 행의 처음으로 이동</translation> +<translation id="6583174818554398774">다음 세부사항으로 이동</translation> <translation id="6587021927234520429">다음 수준 4 제목이 없습니다.</translation> <translation id="6601344353291556895">상세한 설명을 사용합니다.</translation> <translation id="6615602925644411249">페이지에서 찾습니다.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb index cca8f499..6225f7148 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Kitas simbolis</translation> <translation id="2281234842553884450">Ankstesnis šliaužiklis</translation> <translation id="2294136146931447363">Kursyvo pradžia</translation> +<translation id="2311237334957139798">Pereiti į ankstesnį detalumą</translation> <translation id="2318372665160196757">Pagrindinis</translation> <translation id="2329324941084714723">Skirtuko skydelis</translation> <translation id="2344193891939537199">Datos ir laiko valdiklis</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Šiame naujame leidime pristatėme puikių pakeitimų; toliau nurodyta, kas nauja.</translation> <translation id="5110983769041734144">Nėra ankstesnio formos lauko.</translation> <translation id="5111640677200759579">Stulpelio antraštė</translation> +<translation id="5115892389597951922">„ChromeVox“ žurnalas</translation> <translation id="5136967254288895616">Nėra ankstesnės nuorodos.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Viršelis</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">„ChromeVox“ klavišas „Search“ yra modifikavimo klavišas. Dauguma „ChromeVox“ sparčiųjų klavišų prasideda klavišu „Search“. Be to, naršydami galite naudoti rodyklių klavišus.</translation> <translation id="6550720799683018100">Pakeiskite dabartinį klavišų žemėlapį pasirinkę parinktį iš toliau pateikto sąrašo.</translation> <translation id="6561818612645211875">Eiti į dabartinės eilutės pradžią</translation> +<translation id="6583174818554398774">Pereiti į kitą detalumą</translation> <translation id="6587021927234520429">Nėra kitos 4 lygio antraštės.</translation> <translation id="6601344353291556895">Įgalinti daugiakalbius aprašus.</translation> <translation id="6615602925644411249">Rasti puslapyje.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb index 1b3e213..7f15714 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Nākamā rakstzīme</translation> <translation id="2281234842553884450">Iepriekšējais slīdnis</translation> <translation id="2294136146931447363">Sākas teksts slīprakstā</translation> +<translation id="2311237334957139798">Pāriet pie iepriekšējās precizitātes</translation> <translation id="2318372665160196757">Galvenais</translation> <translation id="2329324941084714723">Ciļņu panelis</translation> <translation id="2344193891939537199">Datuma/laika vadīkla</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Šajā jaunajā laidienā ir patīkamas izmaiņas.</translation> <translation id="5110983769041734144">Iepriekš nav neviena veidlapas lauka.</translation> <translation id="5111640677200759579">Slejas virsraksts</translation> +<translation id="5115892389597951922">ChromeVox žurnāls</translation> <translation id="5136967254288895616">Iepriekš nav nevienas saites.</translation> <translation id="513774504516943387">saite</translation> <translation id="5158275234811857234">Vāks</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox meklēšanas taustiņš ir modificētājtaustiņš. Lielākā daļa ChromeVox īsinājumtaustiņu sākas ar meklēšanas taustiņu. Navigācijai izmantojiet arī bulttaustiņus.</translation> <translation id="6550720799683018100">Mainiet pašreizējo taustiņu piesaisti, tālāk esošajā sarakstā atlasot vēlamo opciju.</translation> <translation id="6561818612645211875">Pāriet uz pašreizējās rindas sākumu</translation> +<translation id="6583174818554398774">Pāriet pie nākamās precizitātes</translation> <translation id="6587021927234520429">Tālāk nav neviena 4. līmeņa virsraksta.</translation> <translation id="6601344353291556895">Iespējot izvērstus aprakstus</translation> <translation id="6615602925644411249">Meklēšana lapā.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb index 96daf6f..3cb82344 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">അടുത്ത പ്രതീകം</translation> <translation id="2281234842553884450">മുൻ സ്ലൈഡർ</translation> <translation id="2294136146931447363">ഇറ്റാലിക്ക് തുടങ്ങുന്നു</translation> +<translation id="2311237334957139798">ഗ്രാനുലാരിറ്റിയിൽ മുൻപത്തേതിലേക്ക് നീക്കുക</translation> <translation id="2318372665160196757">പ്രധാനപ്പെട്ടത്</translation> <translation id="2329324941084714723">ടാബ് പാനൽ</translation> <translation id="2344193891939537199">തീയതി, സമയ നിയന്ത്രണം</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">ഈ പുതിയ റിലീസിൽ ആവേശകരമായ ചില മാറ്റങ്ങൾ ഞങ്ങൾ ഉൾപ്പെടുത്തിയിരിക്കുന്നു; പുതിയത് എന്തൊക്കെയെന്ന് കാണുക:</translation> <translation id="5110983769041734144">മുൻ ഫോം ഫീൽഡ് ഒന്നുമില്ല.</translation> <translation id="5111640677200759579">നിര ശീർഷകം</translation> +<translation id="5115892389597951922">ChromeVox ലോഗ്</translation> <translation id="5136967254288895616">മുൻ ലിങ്ക് ഒന്നുമില്ല.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">കവർ</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">ChromeVox-ൽ, 'മോഡിഫയർ കീ' എന്നത് തിരയൽ കീയാണ്. മിക്ക ChromeVox കുറുക്കുവഴികളും ആരംഭിക്കുന്നത് തിരയൽ കീ ഉപയോഗിച്ചാണ്. നാവിഗേഷണ് വേണ്ടി നിങ്ങൾക്ക് അമ്പടയാള കീകളും ഉപയോഗിക്കാം.</translation> <translation id="6550720799683018100">ചുവടെയുള്ള ലിസ്റ്റിൽ നിന്നും ഒരു ഓപ്ഷൻ തിരഞ്ഞെടുക്കുന്നതിലൂടെ നിലവിലെ കീമാപ്പ് മാറ്റുക.</translation> <translation id="6561818612645211875">നിലവിലെ വരിയുടെ തുടക്കത്തിലേക്ക് പോകുക</translation> +<translation id="6583174818554398774">ഗ്രാനുലാരിറ്റിയിൽ അടുത്തതിലേക്ക് നീക്കുക</translation> <translation id="6587021927234520429">അടുത്ത നില 4 ശീർഷകം ഒന്നുമില്ല.</translation> <translation id="6601344353291556895">സംഭാഷണ വിവരണങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="6615602925644411249">പേജിൽ കണ്ടെത്തുക.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb index d2e5667..d8aff0c 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">पुढील वर्ण</translation> <translation id="2281234842553884450">मागील स्लायडर</translation> <translation id="2294136146931447363">इटालिक सुरू झाले</translation> +<translation id="2311237334957139798">ग्रॅन्युलॅरिटीवर मागीलवर हलवा</translation> <translation id="2318372665160196757">मुख्य</translation> <translation id="2329324941084714723">टॅब पॅनेल</translation> <translation id="2344193891939537199">तारीख वेळ नियंत्रण</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">नवीन रिलीजमध्ये आम्ही काही आकर्षक बदल केले आहेत; नवीन काय आहे ते पाहा:</translation> <translation id="5110983769041734144">मागील फॉर्म फील्ड नाही.</translation> <translation id="5111640677200759579">स्तंभ शीर्षलेख</translation> +<translation id="5115892389597951922">ChromeVox लॉग</translation> <translation id="5136967254288895616">मागील दुवा नाही.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">कव्हर</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">ChromeVox मध्ये, शोध की ही मॉडिफायर की असते. बहुतांश ChromeVox शॉर्टकटची सुरुवात शोध की ने होते. तुम्ही नेव्हिगेशनसाठी बाण की देखील वापरू शकाल.</translation> <translation id="6550720799683018100">खाली असलेल्या सूचीमधील पर्याय निवडून वर्तमान मुख्य नकाशा बदला.</translation> <translation id="6561818612645211875">वर्तमान पंक्तीच्या सुरुवातीस जा</translation> +<translation id="6583174818554398774">ग्रॅन्युलॅरिटीवर पुढीलवर हलवा</translation> <translation id="6587021927234520429">पुढील स्तर 4 मथळा नाही.</translation> <translation id="6601344353291556895">पाल्हाळीक वर्णने सक्षम करा.</translation> <translation id="6615602925644411249">पृष्ठामध्ये शोधा.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb index c6b7af8..08489d0 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Volgend teken</translation> <translation id="2281234842553884450">Vorige scrollbar</translation> <translation id="2294136146931447363">Begin van cursieve tekst</translation> +<translation id="2311237334957139798">Naar het vorige detailniveau</translation> <translation id="2318372665160196757">Hoofd</translation> <translation id="2329324941084714723">Deelvenster met tabblad</translation> <translation id="2344193891939537199">Bedieningselement voor datum/tijd</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Er zijn enkele interessante wijzigingen in deze nieuwe release. Dit is wat er nieuw is:</translation> <translation id="5110983769041734144">Geen vorig formulierveld.</translation> <translation id="5111640677200759579">Kolomkop</translation> +<translation id="5115892389597951922">ChromeVox-logboek</translation> <translation id="5136967254288895616">Geen vorige link.</translation> <translation id="513774504516943387">link</translation> <translation id="5158275234811857234">Omslag</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">In ChromeVox fungeert de zoektoets als functietoets. De meeste ChromeVox-snelkoppelingen starten met de zoektoets. De pijltoetsen gebruik je om te navigeren.</translation> <translation id="6550720799683018100">Wijzig de huidige toetsenbordindeling door een optie in de onderstaande lijst te selecteren.</translation> <translation id="6561818612645211875">Naar het begin van de huidige rij gaan</translation> +<translation id="6583174818554398774">Naar het volgende detailniveau</translation> <translation id="6587021927234520429">Geen volgende kop voor niveau 4.</translation> <translation id="6601344353291556895">Uitgebreide beschrijvingen inschakelen.</translation> <translation id="6615602925644411249">Zoeken op pagina.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb index d7a5d76b..f9c29be1 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Neste tegn</translation> <translation id="2281234842553884450">Forrige glidebryter</translation> <translation id="2294136146931447363">Begynnelse på kursiv</translation> +<translation id="2311237334957139798">Gå til forrige detaljnivå</translation> <translation id="2318372665160196757">Hovedelement</translation> <translation id="2329324941084714723">Fanepanel</translation> <translation id="2344193891939537199">Kontroll av dato/tidspunkt</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Vi har gjort noen spennende endringer i denne nye utgaven – dette er nytt:</translation> <translation id="5110983769041734144">Det fins ikke noe foregående skjemafelt.</translation> <translation id="5111640677200759579">Kolonneoverskrift</translation> +<translation id="5115892389597951922">ChromeVox-logg</translation> <translation id="5136967254288895616">Det finnes ingen tidligere linker.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Omslag</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Søketasten er modifikatortasten i ChromeVox. De fleste tastesnarveiene i ChromeVox starter med søketasten. Du bruker også piltastene for å navigere.</translation> <translation id="6550720799683018100">Endre det gjeldende tastaturoppsettet ved å velge et alternativ fra listen nedenfor.</translation> <translation id="6561818612645211875">Gå til begynnelsen av nåværende rad</translation> +<translation id="6583174818554398774">Gå til neste detaljnivå</translation> <translation id="6587021927234520429">Det finnes ikke flere overskrifter på nivå 4.</translation> <translation id="6601344353291556895">Slå på omfattende beskrivelser.</translation> <translation id="6615602925644411249">Finn på siden.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb index 50a6b05..bea630b3 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Następny znak</translation> <translation id="2281234842553884450">Poprzedni suwak</translation> <translation id="2294136146931447363">Początek kursywy</translation> +<translation id="2311237334957139798">Przejdź do poprzedniego elementu na tym poziomie szczegółowości</translation> <translation id="2318372665160196757">Główny</translation> <translation id="2329324941084714723">Panel karty</translation> <translation id="2344193891939537199">Element wyboru daty i godziny</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">W tej wersji wprowadziliśmy wiele zmian. Poznaj nowe funkcje:</translation> <translation id="5110983769041734144">Brak poprzedniego pola formularza.</translation> <translation id="5111640677200759579">Nagłówek kolumny</translation> +<translation id="5115892389597951922">Dziennik ChromeVoxa</translation> <translation id="5136967254288895616">Brak poprzedniego linku.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Okładka</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">W czytniku ChromeVox klawisz wyszukiwania jest klawiszem modyfikującym. Większość skrótów klawiszowych ChromeVoxa zaczyna się właśnie od niego. Do nawigacji używa się klawiszy strzałek.</translation> <translation id="6550720799683018100">Zmień bieżący układ klawiatury, wybierając opcję z listy poniżej.</translation> <translation id="6561818612645211875">Przejdź na początek bieżącego wiersza</translation> +<translation id="6583174818554398774">Przejdź do następnego elementu na tym poziomie szczegółowości</translation> <translation id="6587021927234520429">Brak następnego nagłówka poziomu 4.</translation> <translation id="6601344353291556895">Włącz szczegółowe opisy.</translation> <translation id="6615602925644411249">Znajdź na stronie.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb index 1b0cc15..70fedca0 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Próximo caractere</translation> <translation id="2281234842553884450">Controle deslizante anterior</translation> <translation id="2294136146931447363">Início do itálico</translation> +<translation id="2311237334957139798">Mover para o anterior na granularidade</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Painel da guia</translation> <translation id="2344193891939537199">Controle de data e hora</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Trouxemos algumas mudanças incríveis nesta nova versão. Veja as novidades:</translation> <translation id="5110983769041734144">Nenhum campo de formulário anterior.</translation> <translation id="5111640677200759579">Cabeçalho da coluna</translation> +<translation id="5115892389597951922">Registro do ChromeVox</translation> <translation id="5136967254288895616">Não há link anterior.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Capa</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">No ChromeVox, a tecla de pesquisa é a tecla modificadora. A maioria dos atalhos do ChromeVox começa com ela. As teclas de seta também são usadas para navegação.</translation> <translation id="6550720799683018100">Alterar o mapa de teclado atual, selecionando uma opção na lista abaixo.</translation> <translation id="6561818612645211875">Ir para o início da linha atual</translation> +<translation id="6583174818554398774">Mover para o próximo na granularidade</translation> <translation id="6587021927234520429">Nenhum cabeçalho de nível 4 a seguir.</translation> <translation id="6601344353291556895">Ativar descrições detalhadas.</translation> <translation id="6615602925644411249">Localizar na página.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb index da2074509..9a26447 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Caráter seguinte</translation> <translation id="2281234842553884450">Controlo de deslize anterior</translation> <translation id="2294136146931447363">Início de itálico</translation> +<translation id="2311237334957139798">Mover para anterior por nível de detalhe</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Painel de separadores</translation> <translation id="2344193891939537199">Controlo de hora e data</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Introduzimos algumas alterações fantásticas nesta nova versão. Conheça as novidades:</translation> <translation id="5110983769041734144">Não existe nenhum campo de formulário anterior.</translation> <translation id="5111640677200759579">Cabeçalho da coluna</translation> +<translation id="5115892389597951922">Registo do ChromeVox</translation> <translation id="5136967254288895616">Não existe nenhum link anterior.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Capa</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">No ChromeVox, a tecla Pesquisa é a tecla de modificação. A maioria dos atalhos do ChromeVox começa com a tecla Pesquisar. Também pode utilizar as teclas de seta para a navegação.</translation> <translation id="6550720799683018100">Alterar o mapa de teclas atual ao selecionar uma opção da lista abaixo.</translation> <translation id="6561818612645211875">Ir para o início da linha atual</translation> +<translation id="6583174818554398774">Mover para seguinte por nível de detalhe</translation> <translation id="6587021927234520429">Não existe nenhum título de nível 4 seguinte.</translation> <translation id="6601344353291556895">Ativar descrições detalhadas.</translation> <translation id="6615602925644411249">Localizar na página.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb index fedab1d..6eacba99 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Caracterul următor</translation> <translation id="2281234842553884450">Glisorul anterior</translation> <translation id="2294136146931447363">Începutul textului cursiv</translation> +<translation id="2311237334957139798">Treci la nivelul anterior de detaliere</translation> <translation id="2318372665160196757">Principal</translation> <translation id="2329324941084714723">Panou file</translation> <translation id="2344193891939537199">Comandă pentru dată/oră</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Avem câteva modificări interesante în noua versiune, iată noutățile:</translation> <translation id="5110983769041734144">Nu există un câmp de formular anterior.</translation> <translation id="5111640677200759579">Antet de coloană</translation> +<translation id="5115892389597951922">Jurnal ChromeVox</translation> <translation id="5136967254288895616">Nu există un link anterior.</translation> <translation id="513774504516943387">link</translation> <translation id="5158275234811857234">Copertă</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">În ChromeVox, tasta de căutare este tasta de modificare. Majoritatea comenzilor rapide ChromeVox încep cu tasta de căutare. Vei folosi și tastele săgeată pentru navigare.</translation> <translation id="6550720799683018100">Schimbați harta tastelor actuală selectând o opțiune din lista de mai jos.</translation> <translation id="6561818612645211875">Accesați începutul rândului curent</translation> +<translation id="6583174818554398774">Treci la nivelul următor de detaliere</translation> <translation id="6587021927234520429">Nu există un titlu de nivel 4 următor.</translation> <translation id="6601344353291556895">Activați descrierile detaliate.</translation> <translation id="6615602925644411249">Găsește în pagină</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb index dcd4eb0..060ea39 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Перейти к следующему символу</translation> <translation id="2281234842553884450">Перейти к предыдущему ползунку</translation> <translation id="2294136146931447363">Начало курсива</translation> +<translation id="2311237334957139798">Перейти к предыдущему уровню детализации</translation> <translation id="2318372665160196757">Основное</translation> <translation id="2329324941084714723">Панель вкладок</translation> <translation id="2344193891939537199">Выбор даты и времени</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">В новой версии вас ждут интересные изменения:</translation> <translation id="5110983769041734144">Предыдущего поля формы нет.</translation> <translation id="5111640677200759579">Заголовок столбца</translation> +<translation id="5115892389597951922">Журнал ChromeVox</translation> <translation id="5136967254288895616">Предыдущей ссылки нет.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Обложка</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Поиск – это клавиша-модификатор в ChromeVox. С нее начинаются многие сочетания клавиш. Для навигации используются клавиши со стрелками.</translation> <translation id="6550720799683018100">Выберите комбинацию клавиш из списка ниже</translation> <translation id="6561818612645211875">Перейти к началу текущей строки</translation> +<translation id="6583174818554398774">Перейти к следующему уровню детализации</translation> <translation id="6587021927234520429">Следующего заголовка четвертого уровня нет.</translation> <translation id="6601344353291556895">Озвучивать подробно</translation> <translation id="6615602925644411249">Поиск на странице.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb index f271614..107a501e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Ďalší znak</translation> <translation id="2281234842553884450">Predchádzajúci posúvač</translation> <translation id="2294136146931447363">Začiatok kurzívy</translation> +<translation id="2311237334957139798">Prejsť na predchádzajúcu položku na úrovni podrobnosti</translation> <translation id="2318372665160196757">Hlavné</translation> <translation id="2329324941084714723">Panel karty</translation> <translation id="2344193891939537199">Ovládanie dátumu a času</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">V tomto novom vydaní máme pre vás niekoľko zaujímavých zmien. Novinky:</translation> <translation id="5110983769041734144">Žiadne predchádzajúce pole formulára</translation> <translation id="5111640677200759579">Hlavička stĺpca</translation> +<translation id="5115892389597951922">Denník ChromeVox</translation> <translation id="5136967254288895616">Žiadny predchádzajúci odkaz</translation> <translation id="513774504516943387">odkaz</translation> <translation id="5158275234811857234">Titulná strana</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">V čítačke ChromeVox slúži kláves Hľadať ako kláves modifikátora. Väčšina skratiek čítačky ChromeVox sa začína klávesom Hľadať. Na navigáciu budete tiež používať klávesy so šípkami.</translation> <translation id="6550720799683018100">Ak chcete zmeniť aktuálnu klávesovú mapu, vyberte možnosť zo zoznamu nižšie.</translation> <translation id="6561818612645211875">Prejsť na začiatok aktuálneho riadka</translation> +<translation id="6583174818554398774">Prejsť na nasledujúcu položku na úrovni podrobnosti</translation> <translation id="6587021927234520429">Žiadny ďalší nadpis 4. úrovne</translation> <translation id="6601344353291556895">Povoliť podrobné popisy.</translation> <translation id="6615602925644411249">Nájsť na stránke</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb index 09dc78d5..30a62f9 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Следећи знак</translation> <translation id="2281234842553884450">Претходни клизач</translation> <translation id="2294136146931447363">Почетак курзива</translation> +<translation id="2311237334957139798">Пређите на претходни елемент грануларности</translation> <translation id="2318372665160196757">Главно</translation> <translation id="2329324941084714723">Табла са картицама</translation> <translation id="2344193891939537199">Контрола датума и времена</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Имамо узбудљиве промене у овој новој верзији. Eво шта је ново:</translation> <translation id="5110983769041734144">Нема претходног поља обрасца.</translation> <translation id="5111640677200759579">Заглавље колоне</translation> +<translation id="5115892389597951922">Евиденција за ChromeVox</translation> <translation id="5136967254288895616">Нема претходног линка.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Корице</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">У услузи ChromeVox тастер за претрагу је модификујући тастер. Већина ChromeVox пречица почиње тастером за претрагу. За кретање можете да користите и тастере са стрелицама.</translation> <translation id="6550720799683018100">Промените актуелну мапу тастера тако што ћете изабрати неку од опција са листе у наставку.</translation> <translation id="6561818612645211875">Прелазак на почетак актуелног реда</translation> +<translation id="6583174818554398774">Пређите на следећи елемент грануларности</translation> <translation id="6587021927234520429">Нема следећег заглавља 4. нивоа.</translation> <translation id="6601344353291556895">Омогући детаљне описе.</translation> <translation id="6615602925644411249">Пронађи на страници.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb index 2a87ed14..f860816 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Nästa tecken</translation> <translation id="2281234842553884450">Föregående skjutreglage</translation> <translation id="2294136146931447363">Kursiv börjar</translation> +<translation id="2311237334957139798">Flytta till föregående på detaljnivå</translation> <translation id="2318372665160196757">Huvud</translation> <translation id="2329324941084714723">Flikpanel</translation> <translation id="2344193891939537199">Inmatning av datum och tid</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Den nya versionen innehåller spännande ändringar. Detta är nytt:</translation> <translation id="5110983769041734144">Det finns inget föregående formulärfält.</translation> <translation id="5111640677200759579">Kolumnrubrik</translation> +<translation id="5115892389597951922">Logg för ChromeVox</translation> <translation id="5136967254288895616">Det finns ingen föregående länk.</translation> <translation id="513774504516943387">länk</translation> <translation id="5158275234811857234">Omslag</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">I ChromeVox är söktangenten specialtangenten. De flesta ChromeVox-kortkommandon börjar med söktangenten. Du använder även piltangenterna för att navigera.</translation> <translation id="6550720799683018100">Ändra den nuvarande tangentuppsättningen genom att välja ett alternativ i listan nedan.</translation> <translation id="6561818612645211875">Flytta till början av den aktuella raden</translation> +<translation id="6583174818554398774">Flytta till nästa på detaljnivå</translation> <translation id="6587021927234520429">Det finns inga fler rubriker på nivå 4.</translation> <translation id="6601344353291556895">Aktivera utförliga beskrivningar.</translation> <translation id="6615602925644411249">Hitta på sidan.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb index dc75d4a..e9ff8164 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Herufi Inayofuata</translation> <translation id="2281234842553884450">Kitelezi kilichotangulia</translation> <translation id="2294136146931447363">Mwanzo wa maandishi ya italiki</translation> +<translation id="2311237334957139798">Nenda kwenye kiwango cha maelezo kilichotangulia</translation> <translation id="2318372665160196757">Kuu</translation> <translation id="2329324941084714723">Kidirisha cha kichupo</translation> <translation id="2344193891939537199">Kidhibiti cha tarehe na saa</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Tuna mabadiliko ya kusisimua katika toleo hili jipya; yafuatayo ni mambo mapya:</translation> <translation id="5110983769041734144">Hakuna sehemu ya fomu iliyotangulia.</translation> <translation id="5111640677200759579">Kichwa cha safu wima</translation> +<translation id="5115892389597951922">ChromeVox Log</translation> <translation id="5136967254288895616">Hakuna kiungo kilichotangulia.</translation> <translation id="513774504516943387">kiungo</translation> <translation id="5158275234811857234">Jalada</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">Katika ChromeVox, kitufe cha Utafutaji ndicho kitufe cha kurekebisha. Njia nyingi za mkato za ChromeVox huanzia kwenye kitufe cha Utafutaji. Pia utatumia vitufe vya vishale ili kusogeza.</translation> <translation id="6550720799683018100">Badilisha ramani msingi ya sasa kwa kuchagua chaguo kutoka kwenye orodha hapa chini.</translation> <translation id="6561818612645211875">Nenda hadi mwanzo wa safu mlalo ya sasa</translation> +<translation id="6583174818554398774">Nenda kwenye kiwango cha maelezo kinachofuata</translation> <translation id="6587021927234520429">Hakuna kichwa cha ngazi ya 4 kinachofuata.</translation> <translation id="6601344353291556895">Washa maelezo yenye maneno mengi.</translation> <translation id="6615602925644411249">Tafuta katika ukurasa.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb index 6063bc6..3951969e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">அடுத்த எழுத்து</translation> <translation id="2281234842553884450">முந்தைய ஸ்லைடர்</translation> <translation id="2294136146931447363">சாய்வு உரையின் தொடக்கம்</translation> +<translation id="2311237334957139798">விவர நிலையில் முந்தையதற்கு நகரும்</translation> <translation id="2318372665160196757">முதன்மை</translation> <translation id="2329324941084714723">தாவல் பலகம்</translation> <translation id="2344193891939537199">நாள் நேரக் கட்டுப்பாடு</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">இந்தப் புதிய வெளியீட்டில் சில அற்புதமான மாற்றங்களைச் செய்துள்ளோம்; அந்தப் புதிய அம்சங்களை இங்கே பார்க்கவும்:</translation> <translation id="5110983769041734144">முந்தைய படிவப் புலம் இல்லை.</translation> <translation id="5111640677200759579">நெடுவரிசை மேற்தலைப்பு</translation> +<translation id="5115892389597951922">ChromeVox பதிவு</translation> <translation id="5136967254288895616">முந்தைய இணைப்பு இல்லை.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">அட்டை</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVox இல், தேடல் விசை என்பது மாற்றி விசையாகும். பெரும்பாலான ChromeVox குறுக்குவழிகள் தேடல் விசையுடன் தொடங்கும். வழிசெலுத்த, அம்புக்குறி விசைகளையும் பயன்படுத்தலாம்.</translation> <translation id="6550720799683018100">கீழேயுள்ள பட்டியலிலிருந்து விருப்பத்தைத் தேர்ந்தெடுப்பதன் மூலம் தற்போதைய விசைவரைபடத்தை மாற்றலாம்.</translation> <translation id="6561818612645211875">நடப்பு வரிசையின் தொடக்கத்திற்குச் செல்</translation> +<translation id="6583174818554398774">விவர நிலையில் அடுத்ததற்கு நகரும்</translation> <translation id="6587021927234520429">அடுத்த 4 ஆம் நிலை தலைப்பு இல்லை.</translation> <translation id="6601344353291556895">சொற்களஞ்சிய விளக்கங்களை இயக்கு.</translation> <translation id="6615602925644411249">பக்கத்தில் கண்டறி.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb index 75b15ab..121040f 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">తదుపరి అక్షరం</translation> <translation id="2281234842553884450">మునుపటి స్లయిడర్</translation> <translation id="2294136146931447363">ఇటాలిక్ ప్రారంభం</translation> +<translation id="2311237334957139798">ఆకృతి వద్ద మునుపటి దానికి తరలించండి</translation> <translation id="2318372665160196757">ప్రధానం</translation> <translation id="2329324941084714723">ట్యాబ్ ప్యానెల్</translation> <translation id="2344193891939537199">తేదీ సమయ నియంత్రణ</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">మీకు ఈ సరికొత్త విడుదలలో అద్భుతమైన మార్పులను అందిస్తున్నాము; ఇవి కొత్తవి:</translation> <translation id="5110983769041734144">మునుపటి ఫారమ్ ఫీల్డ్ లేదు.</translation> <translation id="5111640677200759579">నిలువు వరుస ముఖ్య శీర్షిక</translation> +<translation id="5115892389597951922">ChromeVox లాగ్</translation> <translation id="5136967254288895616">మునుపటి లింక్ లేదు.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">ముఖచిత్రం</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">ChromeVoxలో, శోధన కీ అనేది మాడిఫైయర్ కీ. చాలా వరకు ChromeVox సత్వరమార్గాలు శోధన కీతో ప్రారంభమవుతాయి. అలాగే మీరు నావిగేషన్ కోసం ఎక్కువగా బాణం కీలను ఉపయోగిస్తారు.</translation> <translation id="6550720799683018100">దిగువ జాబితా నుండి ఎంపికను ఎంచుకోవడం ద్వారా ప్రస్తుత కీమ్యాప్ను మార్చండి.</translation> <translation id="6561818612645211875">ప్రస్తుత అడ్డు వరుస ప్రారంభానికి వెళ్లండి</translation> +<translation id="6583174818554398774">ఆకృతి వద్ద తదుపరి దానికి తరలించండి</translation> <translation id="6587021927234520429">తదుపరి స్థాయి 4 శీర్షిక లేదు.</translation> <translation id="6601344353291556895">విశదీకృత వివరణలను ప్రారంభించండి.</translation> <translation id="6615602925644411249">పేజీలో కనుగొనండి.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb index f8be27b..0e2e933 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">อักขระถัดไป</translation> <translation id="2281234842553884450">แถบเลื่อนก่อนหน้า</translation> <translation id="2294136146931447363">เริ่มส่วนที่เป็นตัวเอียง</translation> +<translation id="2311237334957139798">เลื่อนไปที่รายละเอียดก่อนหน้า</translation> <translation id="2318372665160196757">หลัก</translation> <translation id="2329324941084714723">แผงแท็บ</translation> <translation id="2344193891939537199">การควบคุมวันที่และเวลา</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">เรามีการเปลี่ยนแปลงที่น่าตื่นเต้นบางอย่างในเวอร์ชันใหม่ สิ่งที่อัปเดตมีดังต่อไปนี้</translation> <translation id="5110983769041734144">ไม่มีช่องฟอร์มก่อนหน้า</translation> <translation id="5111640677200759579">ส่วนหัวของคอลัมน์</translation> +<translation id="5115892389597951922">บันทึก ChromeVox</translation> <translation id="5136967254288895616">ไม่มีลิงก์ก่อนหน้า</translation> <translation id="513774504516943387">ลิงก์</translation> <translation id="5158275234811857234">หน้าปก</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">ใน ChromeVox แป้นค้นหาคือคีย์ตัวปรับแต่ง แป้นพิมพ์ลัดของ ChromeVox ส่วนใหญ่จะเริ่มต้นด้วยแป้นนี้ และใช้ปุ่มลูกศรสำหรับการนำทาง</translation> <translation id="6550720799683018100">เปลี่ยนรูปแบบแป้นปัจจุบันด้วยการเลือกจากรายการตัวเลือกด้านล่างนี้</translation> <translation id="6561818612645211875">ไปที่ด้านบนของแถวปัจจุบัน</translation> +<translation id="6583174818554398774">เลื่อนไปที่รายละเอียดถัดไป</translation> <translation id="6587021927234520429">ไม่มีส่วนหัวระดับ 4 ถัดไป</translation> <translation id="6601344353291556895">เปิดใช้งานคำอธิบายขนาดยาว</translation> <translation id="6615602925644411249">ค้นหาในหน้าเว็บ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb index 4bdabe5..1c8fa7a 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Sonraki Karakter</translation> <translation id="2281234842553884450">Önceki kaydırma çubuğu</translation> <translation id="2294136146931447363">İtalik metin başlangıcı</translation> +<translation id="2311237334957139798">Ayrıntı düzeyinde önceki öğeye gidin</translation> <translation id="2318372665160196757">Ana</translation> <translation id="2329324941084714723">Sekme paneli</translation> <translation id="2344193891939537199">Tarih/saat denetimi</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Bu yeni sürümde heyecan verici bazı değişiklikler yaptık. Değişiklikleri burada bulabilirsiniz:</translation> <translation id="5110983769041734144">Önceki form alanı yok.</translation> <translation id="5111640677200759579">Sütun üst bilgisi</translation> +<translation id="5115892389597951922">ChromeVox Günlüğü</translation> <translation id="5136967254288895616">Önceki bağlantı yok.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Kapak</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">ChromeVox'ta, değiştirici tuş Arama tuşudur. Çoğu ChromeVox kısayolu Arama tuşu ile başlar. Gezinme için ok tuşlarını da kullanırsınız.</translation> <translation id="6550720799683018100">Aşağıdaki listeden bir seçeneği belirleyerek mevcut tuş eşleşmesini değiştirin.</translation> <translation id="6561818612645211875">Mevcut satırın başına git</translation> +<translation id="6583174818554398774">Ayrıntı düzeyinde sonraki öğeye gidin</translation> <translation id="6587021927234520429">Sonraki 4. düzey başlık yok.</translation> <translation id="6601344353291556895">Ayrıntılı açıklamaları etkinleştir.</translation> <translation id="6615602925644411249">Sayfada bul.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb index 1a35e7af..7380714 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">Наступний символ</translation> <translation id="2281234842553884450">Попередній повзунок</translation> <translation id="2294136146931447363">Початок тексту курсивом</translation> +<translation id="2311237334957139798">Перейти до попереднього рівня деталізації</translation> <translation id="2318372665160196757">Головний</translation> <translation id="2329324941084714723">Панель вкладок</translation> <translation id="2344193891939537199">Елемент керування для вибору дати та часу</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">Нижче зазначено, що змінилося в новому випуску.</translation> <translation id="5110983769041734144">Немає попереднього поля форми.</translation> <translation id="5111640677200759579">Заголовок стовпця</translation> +<translation id="5115892389597951922">Журнал ChromeVox</translation> <translation id="5136967254288895616">Немає попереднього посилання.</translation> <translation id="513774504516943387">посилання</translation> <translation id="5158275234811857234">Обкладинка</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">У ChromeVox клавіша пошуку – це клавіша-модифікатор. Більшість комбінацій клавіш ChromeVox починаються з неї. Для навігації використовуються клавіші зі стрілками.</translation> <translation id="6550720799683018100">Змініть поточну розкладку клавіатури, вибравши один із варіантів зі списку нижче.</translation> <translation id="6561818612645211875">Перейти на початок поточного рядка</translation> +<translation id="6583174818554398774">Перейти до наступного рівня деталізації</translation> <translation id="6587021927234520429">Немає наступного заголовка рівня 4.</translation> <translation id="6601344353291556895">Увімкнути докладні описи.</translation> <translation id="6615602925644411249">Знайти на сторінці.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb index d7237d6..1e3e95e0 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">Ký tự tiếp theo</translation> <translation id="2281234842553884450">Thanh trượt trước</translation> <translation id="2294136146931447363">Đầu chữ in nghiêng</translation> +<translation id="2311237334957139798">Chuyển về mức độ chi tiết trước đó</translation> <translation id="2318372665160196757">Chính</translation> <translation id="2329324941084714723">Bảng điều khiển tab</translation> <translation id="2344193891939537199">Kiểm soát ngày giờ</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">Chúng tôi có một số thay đổi thú vị trong bản phát hành mới này. Dưới đây là những tính năng mới:</translation> <translation id="5110983769041734144">Không có trường biểu mẫu trước nào.</translation> <translation id="5111640677200759579">Tiêu đề cột</translation> +<translation id="5115892389597951922">Nhật ký ChromeVox</translation> <translation id="5136967254288895616">Không có liên kết trước nào.</translation> <translation id="513774504516943387">lnk</translation> <translation id="5158275234811857234">Trang bìa</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">Trong ChromeVox, phím Tìm kiếm là phím bổ trợ. Hầu hết các phím tắt trên ChromeVox đều bắt đầu bằng phím Tìm kiếm. Ngoài ra, bạn có thể sử dụng các phím mũi tên để di chuyển.</translation> <translation id="6550720799683018100">Thay đổi sơ đồ bàn phím hiện tại bằng cách chọn một tùy chọn từ danh sách bên dưới.</translation> <translation id="6561818612645211875">Đi tới đầu hàng hiện tại</translation> +<translation id="6583174818554398774">Chuyển tới mức độ chi tiết kế tiếp</translation> <translation id="6587021927234520429">Không có tiêu đề cấp 4 tiếp theo nào.</translation> <translation id="6601344353291556895">Bật mô tả chi tiết.</translation> <translation id="6615602925644411249">Tìm trong trang.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb index 3639fef..f5dc7d8 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -138,6 +138,7 @@ <translation id="2267945578749931355">下一个字符</translation> <translation id="2281234842553884450">上一个滑块</translation> <translation id="2294136146931447363">斜体文字的开头</translation> +<translation id="2311237334957139798">前移一个朗读单位</translation> <translation id="2318372665160196757">主体内容</translation> <translation id="2329324941084714723">标签面板</translation> <translation id="2344193891939537199">日期时间控件</translation> @@ -519,6 +520,7 @@ <translation id="5106547198195128110">这一新版本中有一些重大变更,具体如下:</translation> <translation id="5110983769041734144">不存在上一个表单字段。</translation> <translation id="5111640677200759579">列标题</translation> +<translation id="5115892389597951922">ChromeVox 日志</translation> <translation id="5136967254288895616">不存在上一个链接。</translation> <translation id="513774504516943387">链接</translation> <translation id="5158275234811857234">封面</translation> @@ -686,6 +688,7 @@ <translation id="6540201937398578274">在 ChromeVox 中,搜索键是辅助键。大多数 ChromeVox 快捷键都是用搜索键搭配其他按键。若要进行导航,您也会用到箭头键。</translation> <translation id="6550720799683018100">从下面的列表中选择一个选项,以更改当前键映射。</translation> <translation id="6561818612645211875">转到当前行的开头</translation> +<translation id="6583174818554398774">后移一个朗读单位</translation> <translation id="6587021927234520429">不存在下一个4级标题。</translation> <translation id="6601344353291556895">启用详细说明。</translation> <translation id="6615602925644411249">在网页中查找。</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb index 04433c4f..d370ecf 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -139,6 +139,7 @@ <translation id="2267945578749931355">下一個字元</translation> <translation id="2281234842553884450">上一個滑桿</translation> <translation id="2294136146931447363">斜體開頭</translation> +<translation id="2311237334957139798">移至較低的精細度等級</translation> <translation id="2318372665160196757">主要元素</translation> <translation id="2329324941084714723">分頁面板</translation> <translation id="2344193891939537199">日期時間控制項</translation> @@ -520,6 +521,7 @@ <translation id="5106547198195128110">這個新版本有一些很棒的變更,說明如下:</translation> <translation id="5110983769041734144">沒有上一個表單欄位。</translation> <translation id="5111640677200759579">欄標題</translation> +<translation id="5115892389597951922">ChromeVox 記錄</translation> <translation id="5136967254288895616">沒有上一個連結。</translation> <translation id="513774504516943387">連結</translation> <translation id="5158275234811857234">封面</translation> @@ -687,6 +689,7 @@ <translation id="6540201937398578274">使用 ChromeVox 時,搜尋鍵的功用是輔助鍵。大多數 ChromeVox 快速鍵都是使用搜尋鍵搭配其他按鍵。此外,瀏覽時也會用到方向鍵。</translation> <translation id="6550720799683018100">選取下方清單中的選項,即可變更目前的按鍵對應配置。</translation> <translation id="6561818612645211875">前往目前列的開頭</translation> +<translation id="6583174818554398774">移至較高的精細度等級</translation> <translation id="6587021927234520429">沒有下一個第 4 階標題。</translation> <translation id="6601344353291556895">啟用詳細說明。</translation> <translation id="6615602925644411249">在網頁中尋找。</translation>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.html b/chrome/browser/resources/chromeos/login/custom_elements_login.html index a8398a2..97121b27 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_login.html +++ b/chrome/browser/resources/chromeos/login/custom_elements_login.html
@@ -35,5 +35,6 @@ <include src="app_downloading.html"> <include src="discover/discover_components.html"> <include src="marketing_opt_in.html"> +<include src="../assistant_optin/assistant_optin_flow.html"> <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.js b/chrome/browser/resources/chromeos/login/custom_elements_login.js index 2b23df4..a8ca617 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_login.js +++ b/chrome/browser/resources/chromeos/login/custom_elements_login.js
@@ -40,3 +40,4 @@ // <include src="app_downloading.js"> // <include src="discover/discover_components.js"> // <include src="marketing_opt_in.js"> +// <include src="../assistant_optin/assistant_optin_flow.js">
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html index fa5897e..59419af 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
@@ -46,5 +46,6 @@ <include src="app_downloading.html"> <include src="discover/discover_components.html"> <include src="marketing_opt_in.html"> +<include src="../assistant_optin/assistant_optin_flow.html"> <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js index abdd613..20e88e50 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
@@ -56,3 +56,4 @@ // <include src="app_downloading.js"> // <include src="discover/discover_components.js"> // <include src="marketing_opt_in.js"> +// <include src="../assistant_optin/assistant_optin_flow.js">
diff --git a/chrome/browser/resources/chromeos/login/login.js b/chrome/browser/resources/chromeos/login/login.js index c601ace..1b830d5 100644 --- a/chrome/browser/resources/chromeos/login/login.js +++ b/chrome/browser/resources/chromeos/login/login.js
@@ -62,6 +62,7 @@ login.DemoSetupScreen.register(); login.DiscoverScreen.register(); login.MarketingOptInScreen.register(); + login.AssistantOptInFlowScreen.register(); cr.ui.Bubble.decorate($('bubble')); login.HeaderBar.decorate($('login-header-bar'));
diff --git a/chrome/browser/resources/chromeos/login/login_non_lock_shared.js b/chrome/browser/resources/chromeos/login/login_non_lock_shared.js index fdc66c6..b0c129a5 100644 --- a/chrome/browser/resources/chromeos/login/login_non_lock_shared.js +++ b/chrome/browser/resources/chromeos/login/login_non_lock_shared.js
@@ -15,6 +15,7 @@ // <include src="oobe_screen_user_image.js"> // <include src="oobe_screen_voice_interaction_value_prop.js"> // <include src="oobe_screen_wait_for_container_ready.js"> +// <include src="oobe_screen_assistant_optin_flow.js"> // <include src="oobe_select.js"> // <include src="screen_app_launch_splash.js">
diff --git a/chrome/browser/resources/chromeos/login/login_screens.html b/chrome/browser/resources/chromeos/login/login_screens.html index 89e943d..6d3f83a 100644 --- a/chrome/browser/resources/chromeos/login/login_screens.html +++ b/chrome/browser/resources/chromeos/login/login_screens.html
@@ -5,6 +5,7 @@ <include src="oobe_screen_user_image.html"> <include src="oobe_screen_voice_interaction_value_prop.html"> <include src="oobe_screen_wait_for_container_ready.html"> +<include src="oobe_screen_assistant_optin_flow.html"> <include src="../../../../../ui/login/account_picker/screen_account_picker.html"> <include src="screen_arc_terms_of_service.html"> <include src="screen_error_message.html">
diff --git a/chrome/browser/resources/chromeos/login/md_login.js b/chrome/browser/resources/chromeos/login/md_login.js index b878a7f..782cdd2 100644 --- a/chrome/browser/resources/chromeos/login/md_login.js +++ b/chrome/browser/resources/chromeos/login/md_login.js
@@ -61,6 +61,7 @@ login.UpdateRequiredScreen.register(); login.DiscoverScreen.register(); login.MarketingOptInScreen.register(); + login.AssistantOptInFlowScreen.register(); cr.ui.Bubble.decorate($('bubble-persistent')); $('bubble-persistent').persistent = true;
diff --git a/chrome/browser/resources/chromeos/login/md_login_screens.html b/chrome/browser/resources/chromeos/login/md_login_screens.html index 66e6f37..6ccba07 100644 --- a/chrome/browser/resources/chromeos/login/md_login_screens.html +++ b/chrome/browser/resources/chromeos/login/md_login_screens.html
@@ -5,6 +5,7 @@ <include src="oobe_screen_user_image.html"> <include src="oobe_screen_voice_interaction_value_prop.html"> <include src="oobe_screen_wait_for_container_ready.html"> +<include src="oobe_screen_assistant_optin_flow.html"> <include src="../../../../../ui/login/account_picker/md_screen_account_picker.html"> <include src="screen_arc_terms_of_service.html"> <include src="screen_error_message.html">
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js index e3714902..2d81953 100644 --- a/chrome/browser/resources/chromeos/login/oobe.js +++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -68,6 +68,7 @@ login.DemoPreferencesScreen.register(); login.DiscoverScreen.register(); login.MarketingOptInScreen.register(); + login.AssistantOptInFlowScreen.register(); cr.ui.Bubble.decorate($('bubble-persistent')); $('bubble-persistent').persistent = true;
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.html b/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.html new file mode 100644 index 0000000..7ab218d5 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.html
@@ -0,0 +1,8 @@ +<!-- 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. --> + +<div class="step faded hidden no-logo" id="assistant-optin-flow" + role="group" hidden> + <assistant-optin-flow id="assistant-optin-flow-card"></assistant-optin-flow> +</div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.js b/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.js new file mode 100644 index 0000000..1a7ab17 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_screen_assistant_optin_flow.js
@@ -0,0 +1,44 @@ +// 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 Oobe Assistant OptIn Flow screen implementation. + */ + +login.createScreen( + 'AssistantOptInFlowScreen', 'assistant-optin-flow', function() { + return { + EXTERNAL_API: ['reloadContent', 'addSettingZippy', 'showNextScreen'], + + /** @Override */ + onBeforeShow: function(data) { + Oobe.getInstance().headerHidden = true; + $('assistant-optin-flow-card').onShow(); + }, + + /** + * Reloads localized strings. + * @param {!Object} data New dictionary with i18n values. + */ + reloadContent: function(data) { + $('assistant-optin-flow-card').reloadContent(data); + }, + + /** + * Add a setting zippy object in the corresponding screen. + * @param {string} type type of the setting zippy. + * @param {!Object} data String and url for the setting zippy. + */ + addSettingZippy: function(type, data) { + $('assistant-optin-flow-card').addSettingZippy(type, data); + }, + + /** + * Show the next screen in the flow. + */ + showNextScreen: function() { + $('assistant-optin-flow-card').showNextScreen(); + }, + }; + });
diff --git a/chrome/browser/resources/chromeos/login/oobe_screens.html b/chrome/browser/resources/chromeos/login/oobe_screens.html index 8e5a0a63..c41cd6a 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screens.html +++ b/chrome/browser/resources/chromeos/login/oobe_screens.html
@@ -16,6 +16,7 @@ <include src="oobe_screen_wait_for_container_ready.html"> <include src="oobe_screen_demo_setup.html"> <include src="oobe_screen_demo_preferences.html"> +<include src="oobe_screen_assistant_optin_flow.html"> <include src="../../../../../ui/login/account_picker/md_screen_account_picker.html"> <include src="screen_error_message.html"> <include src="screen_arc_terms_of_service.html">
diff --git a/chrome/browser/resources/chromeos/login/oobe_types.js b/chrome/browser/resources/chromeos/login/oobe_types.js index 84d1fc5..cb331b4 100644 --- a/chrome/browser/resources/chromeos/login/oobe_types.js +++ b/chrome/browser/resources/chromeos/login/oobe_types.js
@@ -71,8 +71,6 @@ * @typedef {{ * welcomeNext: boolean|undefined, * networkSelectGuid: string|undefined, - * eulaAutoAccept: boolean|undefined, - * eulaSendStatistics: boolean|undefined, * }} */ OobeTypes.OobeConfiguration;
diff --git a/chrome/browser/resources/chromeos/select_to_speak/node_utils.js b/chrome/browser/resources/chromeos/select_to_speak/node_utils.js index 64b1230e..641aa35f13 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/node_utils.js +++ b/chrome/browser/resources/chromeos/select_to_speak/node_utils.js
@@ -64,15 +64,7 @@ if (NodeUtils.isNodeInvisible(node, includeOffscreen)) { return true; } - if (!node.name || ParagraphUtils.isWhitespace(node.name)) { - if (NodeUtils.isTextField(node)) { - // Text fields may also be marked by value. - return !node.value || ParagraphUtils.isWhitespace(node.value); - } - return true; - } - // The node should not be ignored. - return false; + return ParagraphUtils.isWhitespace(ParagraphUtils.getNodeName(node)); }; /**
diff --git a/chrome/browser/resources/chromeos/select_to_speak/node_utils_unittest.gtestjs b/chrome/browser/resources/chromeos/select_to_speak/node_utils_unittest.gtestjs index 4deadfc..919f0c90 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/node_utils_unittest.gtestjs +++ b/chrome/browser/resources/chromeos/select_to_speak/node_utils_unittest.gtestjs
@@ -193,6 +193,22 @@ assertEquals(container2, result[0]); }); +TEST_F('SelectToSpeakNodeUtilsUnitTest', 'findAllMatchingWithInputs', + function() { + let rect = {left: 0, top: 0, width: 100, height: 100}; + let rootNode = {root: {}, state: {}, role: 'rootWebArea', + location: {left: 0, top: 0, width: 600, height: 600}}; + let checkbox = {root: rootNode, parent: rootNode, role: 'checkBox', state: {}, + location: {left: 0, top: 0, width: 200, height: 200}, checked: 'true'}; + rootNode.children = [checkbox]; + rootNode.firstChild = checkbox; + + let result = []; + assertTrue(NodeUtils.findAllMatching(rootNode, rect, result)); + assertEquals(1, result.length); + assertEquals(checkbox, result[0]); +}); + TEST_F('SelectToSpeakNodeUtilsUnitTest', 'getDeepEquivalentForSelectionNoChildren', function() { let node = {name: 'Hello, world', children: []};
diff --git a/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils.js b/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils.js index 8282604..2d39ee0 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils.js +++ b/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils.js
@@ -64,11 +64,11 @@ /** * Determines whether a string is only whitespace. - * @param { string } name A string to test - * @return { boolean } whether the string is only whitespace + * @param {string|undefined} name A string to test + * @return {boolean} whether the string is only whitespace */ ParagraphUtils.isWhitespace = function(name) { - if (name.length == 0) { + if (name === undefined || name.length == 0) { return true; } // Search for one or more whitespace characters @@ -77,6 +77,45 @@ }; /** + * Gets the text to be read aloud for a particular node. + * @param {!AutomationNode} node + * @return {string} The text to read for this node. + */ +ParagraphUtils.getNodeName = function(node) { + if (node.role === RoleType.TEXT_FIELD && + (node.children === undefined || node.children.length === 0) && + node.value) { + // A text field with no children should use its value instead of + // the name element, this is the contents of the text field. + // This occurs in native UI such as the omnibox. + return node.value; + } else if ( + node.role === RoleType.CHECK_BOX || + node.role === RoleType.MENU_ITEM_CHECK_BOX) { + let stateString = chrome.i18n.getMessage( + 'select_to_speak_checkbox_' + + (node.checked === 'true' ? + 'checked' : + (node.checked === 'mixed' ? 'mixed' : 'unchecked'))); + return !ParagraphUtils.isWhitespace(node.name) ? + node.name + ' ' + stateString : + stateString; + } else if ( + node.role === RoleType.RADIO_BUTTON || + node.role === RoleType.MENU_ITEM_RADIO) { + let stateString = chrome.i18n.getMessage( + 'select_to_speak_radiobutton_' + + (node.checked === 'true' ? + 'selected' : + (node.checked === 'mixed' ? 'mixed' : 'unselected'))); + return !ParagraphUtils.isWhitespace(node.name) ? + node.name + ' ' + stateString : + stateString; + } + return node.name ? node.name : ''; +}; + +/** * Determines the index into the parent name at which the inlineTextBox * node name begins. * @param {AutomationNode} inlineTextNode An inlineTextBox type node. @@ -125,7 +164,7 @@ * Builds information about nodes in a group until it reaches the end of the * group. It may return a NodeGroup with a single node, or a large group * representing a paragraph of inline nodes. - * @param {Array<AutomationNode>} nodes List of automation nodes to use. + * @param {Array<!AutomationNode>} nodes List of automation nodes to use. * @param {number} index The index into nodes at which to start. * @return {ParagraphUtils.NodeGroup} info about the node group */ @@ -143,8 +182,8 @@ // While next node is in the same paragraph as this node AND is // a text type node, continue building the paragraph. while (index < nodes.length) { - if ((node.name !== undefined && !ParagraphUtils.isWhitespace(node.name)) || - (node.role == RoleType.TEXT_FIELD && node.value !== undefined)) { + let name = ParagraphUtils.getNodeName(node); + if (!ParagraphUtils.isWhitespace(name)) { let newNode; if (node.role == RoleType.INLINE_TEXT_BOX && node.parent !== undefined) { if (node.parent.role == RoleType.STATIC_TEXT) { @@ -166,20 +205,13 @@ new ParagraphUtils.NodeGroupItem(node, result.text.length, false); } } else { - // Not an inlineTextBox node. Add it directly. + // Not an inlineTextBox node. Add it directly, as each node in this list + // is relevant. newNode = new ParagraphUtils.NodeGroupItem(node, result.text.length, false); } if (newNode) { - if (newNode.node.role == RoleType.TEXT_FIELD && - newNode.node.children.length == 0 && newNode.node.value) { - // A text field with no children should use its value instead of - // the name element, this is the contents of the text field. - // This occurs in native UI such as the omnibox. - result.text += newNode.node.value + ' '; - } else { - result.text += newNode.node.name + ' '; - } + result.text += ParagraphUtils.getNodeName(newNode.node) + ' '; result.nodes.push(newNode); } } @@ -238,7 +270,7 @@ * total text, as well as the original AutomationNode it was associated * with. * - * @param {AutomationNode} node The AutomationNode associated with this item + * @param {!AutomationNode} node The AutomationNode associated with this item * @param {number} startChar The index into the NodeGroup's text string where * this item begins. * @param {boolean=} opt_hasInlineText If this NodeGroupItem has inlineText @@ -247,7 +279,7 @@ */ ParagraphUtils.NodeGroupItem = function(node, startChar, opt_hasInlineText) { /** - * @type {AutomationNode} + * @type {!AutomationNode} */ this.node = node;
diff --git a/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils_unittest.gtestjs b/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils_unittest.gtestjs index fad98702..ccbf96c 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils_unittest.gtestjs +++ b/chrome/browser/resources/chromeos/select_to_speak/paragraph_utils_unittest.gtestjs
@@ -68,10 +68,39 @@ assertTrue(ParagraphUtils.isWhitespace('')); assertTrue(ParagraphUtils.isWhitespace(' ')); assertTrue(ParagraphUtils.isWhitespace(' \n \t ')); + assertTrue(ParagraphUtils.isWhitespace()); assertFalse(ParagraphUtils.isWhitespace('cats')); assertFalse(ParagraphUtils.isWhitespace(' cats ')); }); +TEST_F('SelectToSpeakParagraphUnitTest', 'GetNodeName', function() { + assertEquals(ParagraphUtils.getNodeName( + {role: 'staticText', name: 'cat'}), 'cat'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'inlineTextBox', name: 'cat'}), 'cat'); + assertEquals(ParagraphUtils.getNodeName({name: 'cat'}), 'cat'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'radioButton', name: 'cat'}), 'cat unselected'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'checkBox', name: 'cat'}), 'cat unchecked'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'checkBox', checked: 'true', name: 'cat'}), 'cat checked'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'radioButton'}), 'unselected'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'checkBox'}), 'unchecked'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'radioButton', checked: 'true'}), 'selected'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'checkBox', checked: 'true'}), 'checked'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'radioButton', checked: 'true', name: 'cat'}), 'cat selected'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'checkBox', checked: 'mixed'}), 'partially checked'); + assertEquals(ParagraphUtils.getNodeName( + {role: 'radioButton', checked: 'mixed'}), 'partially selected'); +}); + TEST_F('SelectToSpeakParagraphUnitTest', 'GetStartCharIndexInParent', function() { let staticText = {role: 'staticText', name: 'My name is Bond, James Bond'};
diff --git a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js index 57c90c8e..bba5ed4 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js +++ b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js
@@ -238,9 +238,8 @@ } if (lastPosition.node.role != RoleType.STATIC_TEXT && lastPosition.node.role != RoleType.INLINE_TEXT_BOX) { - lastPosition.offset = lastPosition.node.name ? - lastPosition.node.name.length : - lastPosition.node.value ? lastPosition.node.value.length : 0; + lastPosition.offset = + ParagraphUtils.getNodeName(lastPosition.node).length; } this.readNodesInSelection_(firstPosition, lastPosition, focusedNode); }, @@ -303,12 +302,17 @@ this.startSpeechQueue_( nodes, firstPosition.offset, lastPosition.offset); } + this.initializeScrollingToOffscreenNodes_(focusedNode.root); + MetricsUtils.recordStartEvent( + MetricsUtils.StartSpeechMethod.KEYSTROKE, this.prefsManager_); } else { let driveAppRootNode = getDriveAppRoot(focusedNode); if (!driveAppRootNode) return; chrome.tabs.query({active: true}, (tabs) => { - if (tabs.length == 0) { + // Closure doesn't realize that we did a !driveAppRootNode earlier + // so we check again here. + if (tabs.length == 0 || !driveAppRootNode) { return; } let tab = tabs[0]; @@ -320,12 +324,10 @@ matchAboutBlank: true, code: 'document.execCommand("copy");' }); + MetricsUtils.recordStartEvent( + MetricsUtils.StartSpeechMethod.KEYSTROKE, this.prefsManager_); }); - return; } - this.initializeScrollingToOffscreenNodes_(focusedNode.root); - MetricsUtils.recordStartEvent( - MetricsUtils.StartSpeechMethod.KEYSTROKE, this.prefsManager_); }, /** @@ -516,7 +518,6 @@ startSpeechQueue_: function(nodes, opt_startIndex, opt_endIndex) { this.prepareForSpeech_(); for (var i = 0; i < nodes.length; i++) { - let node = nodes[i]; let nodeGroup = ParagraphUtils.buildNodeGroup(nodes, i); if (i == 0) { // We need to start in the middle of a node. Remove all text before
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd index cc90b3e..39ee1f2 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd +++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd
@@ -171,6 +171,24 @@ <message desc="Voice name for the system default Text-to-Speech voice" name="IDS_SELECT_TO_SPEAK_SYSTEM_VOICE"> System Text-to-Speech voice </message> + <message desc="Description of a checkbox that is not checked" name="IDS_SELECT_TO_SPEAK_CHECKBOX_UNCHECKED"> + unchecked + </message> + <message desc="Description of a checkbox that is checked" name="IDS_SELECT_TO_SPEAK_CHECKBOX_CHECKED"> + checked + </message> + <message desc="Description of a checkbox that is a mixed selection" name="IDS_SELECT_TO_SPEAK_CHECKBOX_MIXED"> + partially checked + </message> + <message desc="Description of a radio button that is not selected" name="IDS_SELECT_TO_SPEAK_RADIOBUTTON_UNSELECTED"> + unselected + </message> + <message desc="Description of a radio button that is selected" name="IDS_SELECT_TO_SPEAK_RADIOBUTTON_SELECTED"> + selected + </message> + <message desc="Description of a radio button that is selected" name="IDS_SELECT_TO_SPEAK_RADIOBUTTON_MIXED"> + partially selected + </message> </messages> </release> </grit>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/test_support.js b/chrome/browser/resources/chromeos/select_to_speak/test_support.js index 365a62aa..911b931e 100644 --- a/chrome/browser/resources/chromeos/select_to_speak/test_support.js +++ b/chrome/browser/resources/chromeos/select_to_speak/test_support.js
@@ -18,12 +18,16 @@ * Set necessary constants. */ chrome.automation.RoleType = { - WINDOW: 'window', + CHECK_BOX: 'checkBox', + INLINE_TEXT_BOX: 'inlineTextBox', + MENU_ITEM_CHECK_BOX: 'menuItemCheckBox', + MENU_ITEM_RADIO: 'menuItemRadio', + PARAGRAPH: 'paragraph', + RADIO_BUTTON: 'radioButton', ROOT_WEB_AREA: 'rootWebArea', STATIC_TEXT: 'staticText', - INLINE_TEXT_BOX: 'inlineTextBox', - PARAGRAPH: 'paragraph', TEXT_FIELD: 'textField', + WINDOW: 'window' }; chrome.automation.StateType = { @@ -47,3 +51,21 @@ SELECTING: 'selecting', SPEAKING: 'speaking' }; + +chrome.i18n = { + getMessage: function(key) { + if (key == 'select_to_speak_checkbox_checked') + return 'checked'; + if (key == 'select_to_speak_checkbox_unchecked') + return 'unchecked'; + if (key == 'select_to_speak_checkbox_mixed') + return 'partially checked'; + if (key == 'select_to_speak_radiobutton_selected') + return 'selected'; + if (key == 'select_to_speak_radiobutton_unselected') + return 'unselected'; + if (key == 'select_to_speak_radiobutton_mixed') + return 'partially selected'; + return ''; + } +};
diff --git a/chrome/browser/resources/hangout_services/manifest.json b/chrome/browser/resources/hangout_services/manifest.json index 94e8e65..9a8ec04e 100644 --- a/chrome/browser/resources/hangout_services/manifest.json +++ b/chrome/browser/resources/hangout_services/manifest.json
@@ -5,7 +5,7 @@ "name": "Google Hangouts", // Note: Always update the version number when this file is updated. Chrome // triggers extension preferences update on the version increase. - "version": "1.3.9", + "version": "1.3.10", "manifest_version": 2, "externally_connectable": { "matches": [
diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js index 953d6cc..55d3e530 100644 --- a/chrome/browser/resources/hangout_services/thunk.js +++ b/chrome/browser/resources/hangout_services/thunk.js
@@ -182,8 +182,9 @@ } else if (method == 'logging.startEventLogging') { var peerConnectionId = message['peerConnectionId'] || ''; var maxLogSizeBytes = message['maxLogSizeBytes'] || 0; + var webAppId = message['webAppId'] || 0; chrome.webrtcLoggingPrivate.startEventLogging( - requestInfo, origin, peerConnectionId, maxLogSizeBytes, + requestInfo, origin, peerConnectionId, maxLogSizeBytes, webAppId, doSendResponse); return true; } else if (method == 'setAudioExperiments') {
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css index cf48503..3c3f782 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.css +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -421,7 +421,6 @@ #bg-sel-footer-done:not(:disabled) { background-color: rgb(26, 115, 232); color: white; - outline: initial; } #bg-sel-footer-done:hover:not(:disabled) {
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js index f9d7a71e..03161f7 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.js +++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -43,6 +43,7 @@ const KEYCODES = { ENTER: 13, ESC: 27, + SPACE: 32, TAB: 9, }; @@ -209,6 +210,24 @@ /** + * Send a message to refocus the edited tile's three dot menu or the add + * shortcut tile after the cancel button is clicked. + * @param {Event} event The keydown event + */ +function focusBackOnCancel(event) { + if (event.keyCode === KEYCODES.ENTER || event.keyCode === KEYCODES.SPACE) { + let message = { + cmd: 'focusMenu', + tid: prepopulatedLink.rid + }; + window.parent.postMessage(message, DOMAIN_ORIGIN); + event.preventDefault(); + closeDialog(); + } +} + + +/** * Event handler for messages from the host page. * @param {Event} event Event received. */ @@ -302,6 +321,7 @@ }; $(IDS.DELETE).addEventListener('click', deleteLink); $(IDS.CANCEL).addEventListener('click', closeDialog); + $(IDS.CANCEL).addEventListener('keydown', focusBackOnCancel); $(IDS.FORM).addEventListener('submit', (event) => { // Prevent the form from submitting and modifying the URL. event.preventDefault();
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css index 383e99b..5ad2e20e 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.css +++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -681,7 +681,7 @@ border: none; height: 100%; padding: 0; - position: absolute; + position: fixed; top: 0; width: 100%; }
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js index eebae85..322d6c1 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.js +++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -649,6 +649,8 @@ notification.scrollTop; notification.classList.add(CLASSES.DELAYED_HIDE_NOTIFICATION); } + + $(IDS.UNDO_LINK).focus(); } @@ -742,6 +744,8 @@ notification.classList.remove(CLASSES.HAS_LINK); notificationContainer.removeEventListener('transitionend', afterHide); } + // Focus on the omnibox after the notification is hidden. + window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes(); }; notificationContainer.addEventListener('transitionend', afterHide); } @@ -908,6 +912,11 @@ }, 10); } else if (cmd === 'closeDialog') { $(IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG).close(); + } else if (cmd === 'focusMenu') { + // Focus the edited tile's menu or the add shortcut tile after closing the + // custom link edit dialog without saving. + $(IDS.TILES_IFRAME) + .contentWindow.postMessage({cmd: 'focusMenu', tid: args.tid}, '*'); } }
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css index b36f9e6..ab4cdde 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.css +++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -496,6 +496,12 @@ word-wrap: break-word; } +/* Font weight on Mac and ChromeOS looks heavier on default background and + * needs to be reduced. */ +body.mac-chromeos .md-title { + font-weight: 400; +} + /* Apply when a custom background is set */ body.dark-theme .md-title { color: rgb(248, 249, 250);
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js index 9132c12..28e72355 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.js +++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -276,6 +276,8 @@ showTiles(data); } else if (cmd == 'updateTheme') { updateTheme(data); + } else if (cmd === 'focusMenu') { + focusTileMenu(data); } else { console.error('Unknown command: ' + JSON.stringify(data)); } @@ -300,6 +302,27 @@ document.body.style.setProperty('--tile-title-color', info.tileTitleColor); document.body.classList.toggle('dark-theme', info.isThemeDark); document.body.classList.toggle('using-theme', info.isUsingTheme); + + // Reduce font weight on the default(white) background for Mac and CrOS. + document.body.classList.toggle('mac-chromeos', + !info.isThemeDark && !info.isUsingTheme && + (navigator.userAgent.indexOf('Mac') > -1 || + navigator.userAgent.indexOf('CrOS') > -1)); +}; + + +/** + * Handler for 'focusMenu' message from the host page. Focuses the edited tile's + * menu or the add shortcut tile after closing the custom link edit dialog + * without saving. + * @param {object} info Data received in the message. + */ +var focusTileMenu = function(info) { + let tile = document.querySelector(`a.md-tile[data-tid="${info.tid}"]`); + if (info.tid === -1 /* Add shortcut tile */) + tile.focus(); + else + tile.parentNode.childNodes[1].focus(); }; @@ -707,7 +730,7 @@ data.dataGenerationTime); } }); - mdTile.addEventListener('keyup', function(event) { + mdTile.addEventListener('keydown', function(event) { if ((event.keyCode === KEYCODES.DELETE || event.keyCode === KEYCODES.BACKSPACE) && !data.isAddButton) { @@ -803,11 +826,6 @@ mdTitle.className = CLASSES.MD_TITLE; mdTitle.innerText = data.title; mdTitle.style.direction = data.direction || 'ltr'; - // Font weight on Mac and ChromeOS is heavier and needs to be reduced. - if (navigator.userAgent.indexOf('Mac') > -1 || - navigator.userAgent.indexOf('CrOS') > -1) { - mdTitle.style.fontWeight = 400; - } // Windows font family fallback to Segoe if (navigator.userAgent.indexOf('Windows') > -1) { mdTitle.style.fontFamily = 'Segoe UI';
diff --git a/chrome/browser/resources/management.css b/chrome/browser/resources/management.css new file mode 100644 index 0000000..c110f1b7 --- /dev/null +++ b/chrome/browser/resources/management.css
@@ -0,0 +1,29 @@ +/* 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. */ + +body { + margin-inline-start: 23px; +} + +body > .page { + margin-inline-end: 0; + padding-inline-end: 24px; +} + +body header { + left: 23px; + max-width: none; +} + +html[dir='rtl'] body header { + right: 23px; +} + +body section { + max-width: none; +} + +#main-section { + padding-inline-start: 0; +}
diff --git a/chrome/browser/resources/management.html b/chrome/browser/resources/management.html new file mode 100644 index 0000000..f05db4b --- /dev/null +++ b/chrome/browser/resources/management.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html dir="$i18n{textdirection}" lang="$i18n{language}"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, user-scalable=no"> +<title>$i18n{title}</title> + +<link rel="stylesheet" href="chrome://resources/css/chrome_shared.css"> +<link rel="stylesheet" href="management.css"> + +<script src="chrome://resources/js/action_link.js"></script> +<script src="chrome://resources/js/cr.js"></script> +<script src="chrome://resources/js/cr/ui.js"></script> +<script src="chrome://resources/js/cr/ui/focus_outline_manager.js"></script> +<script src="chrome://resources/js/load_time_data.js"></script> +<script src="chrome://resources/js/util.js"></script> +<script src="strings.js"></script> +<script src="management.js"></script> +</head> + +<body> + <div class="page"> + <header> + <h1>$i18n{title}</h1> + </header> + <section id="main-section"> + <!-- This is where page content gets dynamically added. --> + </section> + </div> +</body> +</html>
diff --git a/chrome/browser/resources/management.js b/chrome/browser/resources/management.js new file mode 100644 index 0000000..a04df06 --- /dev/null +++ b/chrome/browser/resources/management.js
@@ -0,0 +1,46 @@ +// 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. + +cr.define('management', function() { + /** + * A singleton object that handles communication between browser and WebUI. + * @constructor + */ + function Page() {} + + // Make Page a singleton. + cr.addSingletonGetter(Page); + + Page.prototype = { + /** + * Main initialization function. Called by the browser on page load. + */ + initialize: function() { + cr.ui.FocusOutlineManager.forDocument(document); + + this.mainSection_ = $('main-section'); + + // Notify the browser that the page has loaded, causing it to send the + // management data. + chrome.send('initialized'); + }, + + }; + + Page.showDeviceManagedStatus = function(managedString) { + var page = this.getInstance(); + + var string = document.createElement('p'); + string.textContent = managedString; + page.mainSection_.appendChild(string); + }; + + return {Page: Page}; +}); + +// Have the main initialization function be called when the page finishes +// loading. +document.addEventListener( + 'DOMContentLoaded', + management.Page.prototype.initialize.bind(management.Page.getInstance()));
diff --git a/chrome/browser/resources/print_preview/new/advanced_settings_dialog.js b/chrome/browser/resources/print_preview/new/advanced_settings_dialog.js index cfd36e3..af92c9a7 100644 --- a/chrome/browser/resources/print_preview/new/advanced_settings_dialog.js +++ b/chrome/browser/resources/print_preview/new/advanced_settings_dialog.js
@@ -44,7 +44,7 @@ .ADVANCED_SETTINGS_DIALOG_SHOWN); // This async() call is a workaround to prevent a DCHECK - see // https://crbug.com/804047. - // TODO (rbpotter): Remove after Polymer2 migration is complete. + // TODO(rbpotter): Remove after Polymer2 migration is complete. this.async(() => { this.$.dialog.showModal(); }, 1);
diff --git a/chrome/browser/resources/print_preview/new/app.js b/chrome/browser/resources/print_preview/new/app.js index ff8dd54f..07db69b7c 100644 --- a/chrome/browser/resources/print_preview/new/app.js +++ b/chrome/browser/resources/print_preview/new/app.js
@@ -268,7 +268,7 @@ // Don't try to print with system dialog on Windows if the document is // not ready, because we send the preview document to the printer on // Windows. - if (!cr.isWin || this.state == print_preview_new.State.READY) + if (!cr.isWindows || this.state == print_preview_new.State.READY) this.onPrintWithSystemDialog_(); e.preventDefault(); return; @@ -305,7 +305,7 @@ onCrDialogClose_: function(e) { // Note: due to event re-firing in cr_dialog.js, this event will always // appear to be coming from the outermost child dialog. - // TODO (rbpotter): Fix event re-firing so that the event comes from the + // TODO(rbpotter): Fix event re-firing so that the event comes from the // dialog that has been closed, and add an assertion that the removed // dialog matches e.composedPath()[0]. if (e.composedPath()[0].nodeName == 'CR-DIALOG')
diff --git a/chrome/browser/resources/print_preview/new/destination_settings.js b/chrome/browser/resources/print_preview/new/destination_settings.js index 18e7083fe..dfc3ff8 100644 --- a/chrome/browser/resources/print_preview/new/destination_settings.js +++ b/chrome/browser/resources/print_preview/new/destination_settings.js
@@ -89,7 +89,7 @@ const dialog = this.$.destinationDialog.get(); // This async() call is a workaround to prevent a DCHECK - see // https://crbug.com/804047. - // TODO (rbpotter): Remove after Polymer2 migration is complete. + // TODO(rbpotter): Remove after Polymer2 migration is complete. this.async(() => { dialog.show(); }, 1);
diff --git a/chrome/browser/resources/print_preview/new/header.html b/chrome/browser/resources/print_preview/new/header.html index 939d7c8..e5c1de8 100644 --- a/chrome/browser/resources/print_preview/new/header.html +++ b/chrome/browser/resources/print_preview/new/header.html
@@ -74,11 +74,16 @@ inner-h-t-m-l="[[summary_]]"> </span> <div id="button-strip"> +<if expr="not chromeos and not is_win"> <button class="cancel" on-click="onCancelClick_">$i18n{cancel}</button> +</if> <button class="print default" on-click="onPrintClick_" disabled$="[[!printButtonEnabled_]]"> [[getPrintButton_(destination.id)]] </button> +<if expr="chromeos or is_win"> + <button class="cancel" on-click="onCancelClick_">$i18n{cancel}</button> +</if> </div> </template> <script src="header.js"></script>
diff --git a/chrome/browser/resources/print_preview/new/model.js b/chrome/browser/resources/print_preview/new/model.js index f1d4b05..c4a473f0 100644 --- a/chrome/browser/resources/print_preview/new/model.js +++ b/chrome/browser/resources/print_preview/new/model.js
@@ -755,7 +755,7 @@ } if (destination.isPrivet || destination.isExtension) { - // TODO (rbpotter): Get local and PDF printers to use the same ticket and + // TODO(rbpotter): Get local and PDF printers to use the same ticket and // send only this ticket instead of nesting it in a larger ticket. ticket.ticket = this.createCloudJobTicket(destination); ticket.capabilities = JSON.stringify(destination.capabilities);
diff --git a/chrome/browser/resources/print_preview/new/settings_section.html b/chrome/browser/resources/print_preview/new/settings_section.html index 2a85bb1..063638c 100644 --- a/chrome/browser/resources/print_preview/new/settings_section.html +++ b/chrome/browser/resources/print_preview/new/settings_section.html
@@ -42,7 +42,8 @@ </style> <slot name="title"></slot> <img src="../../../../../ui/webui/resources/images/business.svg" - hidden$="[[!managed]]" class="policy-icon"> + hidden$="[[!managed]]" class="policy-icon" + aria-label="$i18n{managedOption}"> <slot name="controls"></slot> </template> <script src="settings_section.js"></script>
diff --git a/chrome/browser/resources/print_preview/print_preview_resources.grd b/chrome/browser/resources/print_preview/print_preview_resources.grd index 6bea739f..d23b52d 100644 --- a/chrome/browser/resources/print_preview/print_preview_resources.grd +++ b/chrome/browser/resources/print_preview/print_preview_resources.grd
@@ -165,7 +165,8 @@ type="chrome_html" /> <structure name="IDR_PRINT_PREVIEW_NEW_HEADER_HTML" file="new/header.html" - type="chrome_html" /> + type="chrome_html" + preprocess="true" /> <structure name="IDR_PRINT_PREVIEW_NEW_HEADER_JS" file="new/header.js" type="chrome_html" />
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_behavior.js b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_behavior.js index 746febc5..9140d4d2 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_behavior.js +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_behavior.js
@@ -23,15 +23,6 @@ type: Object, value: settings.MultiDeviceFeature, }, - - /** - * Whether a host phone has been set by the user (not necessarily verified). - * @type {boolean} - */ - isHostSet: { - type: Boolean, - computed: 'computeIsHostSet(pageContentData)', - }, }, /** @@ -150,8 +141,11 @@ } }, - /** @private */ - computeIsHostSet: function() { + /** + * Whether a host phone has been set by the user (not necessarily verified). + * @return {boolean} + */ + isHostSet: function() { return [ settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION,
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_page.html b/chrome/browser/resources/settings/multidevice_page/multidevice_page.html index 57e4926e..06bd0d8 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_page.html +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_page.html
@@ -29,8 +29,8 @@ <div id="multidevice-item" class="settings-box two-line" on-click="handleItemClick_" - actionable$="[[isHostSet]]"> - <template is="dom-if" if="[[isHostSet]]" restamp> + actionable$="[[doesClickOpenSubpage_(pageContentData)]]"> + <template is="dom-if" if="[[isHostSet(pageContentData)]]" restamp> <iron-icon icon= "[[getIconName(MultiDeviceFeature.BETTER_TOGETHER_SUITE)]]"> </iron-icon> @@ -42,13 +42,19 @@ inner-h-t-m-l="[[getSubLabelInnerHtml_(pageContentData)]]"> </div> </div> - <template is="dom-if" if="[[isHostSet]]" restamp> - <paper-icon-button-light class="subpage-arrow"> - <button aria-label="[[getLabelText_(pageContentData)]]" - aria-describedby="mutltideviceSubLabel"></button> - </paper-icon-button-light> + <template is="dom-if" + if="[[shouldShowSeparatorAndSubpageArrow_(pageContentData)]]" + restamp> + <template is="dom-if" + if="[[doesClickOpenSubpage_(pageContentData)]]" + restamp> + <paper-icon-button-light class="subpage-arrow"> + <button aria-label="[[getLabelText_(pageContentData)]]" + aria-describedby="mutltideviceSubLabel"></button> + </paper-icon-button-light> + </template> + <div class="separator"></div> </template> - <div class="separator"></div> <template is="dom-if" if="[[shouldShowButton_(pageContentData)]]" restamp>
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_page.js b/chrome/browser/resources/settings/multidevice_page/multidevice_page.js index 44b83fd..c881eb5 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_page.js +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_page.js
@@ -39,7 +39,6 @@ authToken_: { type: String, value: '', - observer: 'authTokenChanged_', }, /** @@ -57,7 +56,10 @@ }, /** @private {boolean} */ - showPasswordPromptDialog_: {type: Boolean, value: false}, + showPasswordPromptDialog_: { + type: Boolean, + value: false, + }, }, listeners: { @@ -81,7 +83,7 @@ * @private */ getMultiDeviceItemLabelBlockCssClass_: function() { - return this.isHostSet ? 'middle' : 'start'; + return this.isHostSet() ? 'middle' : 'start'; }, /** @@ -99,6 +101,8 @@ */ getSubLabelInnerHtml_: function() { switch (this.pageContentData.mode) { + case settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS: + return this.i18nAdvanced('multideviceNoHostText'); case settings.MultiDeviceSettingsMode.NO_HOST_SET: return this.i18nAdvanced('multideviceSetupSummary'); case settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER: @@ -133,8 +137,11 @@ * @private */ shouldShowButton_: function() { - return this.pageContentData.mode !== - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED; + return [ + settings.MultiDeviceSettingsMode.NO_HOST_SET, + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION, + ].includes(this.pageContentData.mode); }, /** @@ -146,10 +153,27 @@ settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED; }, + /** + * Whether to show the separator bar and, if the state calls for a chevron + * (a.k.a. subpage arrow) routing to the subpage, the chevron. + * @return {boolean} + * @private + */ + shouldShowSeparatorAndSubpageArrow_: function() { + return this.pageContentData.mode !== + settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS; + }, + + /** + * @return {boolean} + * @private + */ + doesClickOpenSubpage_: function() { + return this.isHostSet(); + }, + /** @private */ handleItemClick_: function() { - if (!this.isHostSet) - return; settings.navigateTo(settings.routes.MULTIDEVICE_FEATURES); },
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_page_container.js b/chrome/browser/resources/settings/multidevice_page/multidevice_page_container.js index 2b00c4d..dd74a92 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_page_container.js +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_page_container.js
@@ -75,8 +75,6 @@ return !newData.hostDeviceName === noHostModes.includes(newData.mode); }, - // TODO(jordynass): Delete the check for an eligible host when the no host - // mode is added in accordance with the mocks. /** * @return {boolean} * @private @@ -84,8 +82,6 @@ computeDoesChromebookSupportMultiDeviceFeatures: function() { return !!this.pageContentData && this.isFeatureSupported( - settings.MultiDeviceFeature.BETTER_TOGETHER_SUITE) && - this.pageContentData.mode != - settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS; + settings.MultiDeviceFeature.BETTER_TOGETHER_SUITE); }, });
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.js b/chrome/browser/resources/settings/people_page/sync_account_control.js index 294ad84..e160544f 100644 --- a/chrome/browser/resources/settings/people_page/sync_account_control.js +++ b/chrome/browser/resources/settings/people_page/sync_account_control.js
@@ -162,25 +162,6 @@ }, /** - * @param {string} syncErrorLabel - * @param {string} authErrorLabel - * @return {string} - * @private - */ - getErrorLabel_: function(syncErrorLabel, authErrorLabel) { - if (this.syncStatus.hasError) { - // Most of the time re-authenticate states are caused by intentional user - // action, so they will be displayed differently as other errors. - return this.syncStatus.statusAction == - settings.StatusAction.REAUTHENTICATE ? - authErrorLabel : - syncErrorLabel; - } - - return ''; - }, - - /** * @param {string} label * @param {string} account * @return {string} @@ -209,7 +190,9 @@ * @private */ getSyncIconStyle_: function() { - if (this.syncStatus.hasError) { + if (!!this.syncStatus.hasUnrecoverableError) + return 'sync-problem'; + if (!!this.syncStatus.hasError) { return this.syncStatus.statusAction == settings.StatusAction.REAUTHENTICATE ? 'sync-paused' : @@ -242,13 +225,16 @@ */ getAvatarRowTitle_: function( accountName, syncErrorLabel, authErrorLabel, disabledLabel) { - if (!!this.syncStatus.disabled) - return disabledLabel; - - if (this.syncStatus.hasError) - return this.getErrorLabel_(syncErrorLabel, authErrorLabel); - - return accountName; + switch (this.getSyncIconStyle_()) { + case 'sync-problem': + return syncErrorLabel; + case 'sync-paused': + return authErrorLabel; + case 'sync-disabled': + return disabledLabel; + default: + return accountName; + } }, /**
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html index fa54bcd..4165896 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.html +++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -27,6 +27,10 @@ <dom-module id="settings-sync-page"> <template> <style include="settings-shared iron-flex"> + #sync-section-toggle:not([actionable]) { + opacity: var(--cr-disabled-opacity); + } + #create-password-box, #reset-sync-message-box-encryption, #reset-sync-message-box-user-events { @@ -83,7 +87,7 @@ </if> </style> <if expr="not chromeos"> - <template is="dom-if" if="[[shouldShowSyncAccountControl_(diceEnabled, + <template is="dom-if" if="[[shouldShowSyncAccountControl_( unifiedConsentEnabled, syncStatus.syncSystemEnabled, syncStatus.signinAllowed)]]"> <settings-sync-account-control embedded-in-subpage @@ -138,7 +142,8 @@ label="$i18n{syncUnifiedConsentToggleTitle}" on-settings-boolean-control-change="onUnifiedConsentToggleChange_" hidden="[[!shouldShowUnifiedConsentToggle_(unifiedConsentEnabled, - syncStatus.disabled, syncStatus.signedIn)]]"> + syncStatus.disabled, syncStatus.signedIn)]]" + disabled="[[syncPrefs.encryptAllData]]"> </settings-toggle-button> <div class="settings-box two-line" id="sync-section-toggle" actionable$="[[!syncSectionDisabled_]]"
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js index a6c532b36..46b51344 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.js +++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -663,7 +663,7 @@ * @private */ shouldShowSyncAccountControl_: function() { - return !!this.diceEnabled && !!this.unifiedConsentEnabled && + return !!this.unifiedConsentEnabled && !!this.syncStatus.syncSystemEnabled && !!this.syncStatus.signinAllowed; }, // </if>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index f8efec9..cafea93 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -66,10 +66,12 @@ <settings-animated-pages id="pages" section="privacy" focus-config="[[focusConfig_]]"> <neon-animatable route-path="default"> - <div class="settings-box first"> - <p class="privacy-explanation">$i18nRaw{improveBrowsingExperience}</p> - </div> <template is="dom-if" if="[[!unifiedConsentEnabled_]]"> + <div class="settings-box first"> + <p class="privacy-explanation"> + $i18nRaw{improveBrowsingExperience} + </p> + </div> <settings-personalization-options prefs="{{prefs}}" page-visibility="[[pageVisibility]]" unified-consent-enabled="[[unifiedConsentEnabled_]]">
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc index 7f74a7c..9b596e3 100644 --- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc +++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc
@@ -20,7 +20,6 @@ #include "base/metrics/histogram_macros.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" -#include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/sw_reporter_installer_win.h" @@ -89,8 +88,6 @@ base::FilePath VerifyAndRenameDownloadedCleaner( base::FilePath downloaded_path, ChromeCleanerFetchStatus fetch_status) { - base::AssertBlockingAllowed(); - if (downloaded_path.empty() || !base::PathExists(downloaded_path)) return base::FilePath();
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc index e38d498..133145ef 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
@@ -1192,11 +1192,21 @@ // Test that extended reporting option is not shown if Unified Consent is // enabled. #if BUILDFLAG(ENABLE_DICE_SUPPORT) -TEST_F(SafeBrowsingBlockingPageTestDiceEnabled, - ExtendedReportingNotShownUnifiedConsent) { +#define TEST_CLASS_ExtendedReportingNotShownUnifiedConsent \ + SafeBrowsingBlockingPageTestDiceEnabled #else -TEST_F(SafeBrowsingBlockingPageTest, ExtendedReportingNotShownUnifiedConsent) { +#define TEST_CLASS_ExtendedReportingNotShownUnifiedConsent \ + SafeBrowsingBlockingPageTest #endif +#if defined(ADDRESS_SANITIZER) +#define MAYBE_ExtendedReportingNotShownUnifiedConsent \ + DISABLED_ExtendedReportingNotShownUnifiedConsent +#else +#define MAYBE_ExtendedReportingNotShownUnifiedConsent \ + ExtendedReportingNotShownUnifiedConsent +#endif +TEST_F(TEST_CLASS_ExtendedReportingNotShownUnifiedConsent, + MAYBE_ExtendedReportingNotShownUnifiedConsent) { // Enable unified consent. unified_consent::ScopedUnifiedConsent scoped_unified_consent( unified_consent::UnifiedConsentFeatureState::kEnabledWithBump);
diff --git a/chrome/browser/service_process/service_process_control_browsertest.cc b/chrome/browser/service_process/service_process_control_browsertest.cc index 0a04df0..7daefb2 100644 --- a/chrome/browser/service_process/service_process_control_browsertest.cc +++ b/chrome/browser/service_process/service_process_control_browsertest.cc
@@ -16,6 +16,7 @@ #include "base/process/process_iterator.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/scoped_path_override.h" #include "base/test/test_timeouts.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" @@ -69,6 +70,22 @@ } void SetUp() override { +#if defined(OS_MACOSX) + // browser_tests and the child processes run as standalone executables, + // rather than bundled apps. For this test, set up the CHILD_PROCESS_EXE to + // point to a bundle so that the service process has an Info.plist. + base::FilePath exe_path; + ASSERT_TRUE(base::PathService::Get(base::DIR_EXE, &exe_path)); + exe_path = exe_path.DirName() + .DirName() + .Append("Contents") + .Append("Versions") + .Append(chrome::kChromeVersion) + .Append(chrome::kHelperProcessExecutablePath); + child_process_exe_override_ = std::make_unique<base::ScopedPathOverride>( + content::CHILD_PROCESS_EXE, exe_path); +#endif + InProcessBrowserTest::SetUp(); // This should not be needed because TearDown() ends with a closed @@ -80,10 +97,14 @@ void TearDown() override { if (ServiceProcessControl::GetInstance()->IsConnected()) EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown()); + #if defined(OS_MACOSX) // ForceServiceProcessShutdown removes the process from launched on Mac. ForceServiceProcessShutdown("", 0); + + child_process_exe_override_.reset(); #endif // OS_MACOSX + if (service_process_.IsValid()) { int exit_code; EXPECT_TRUE(service_process_.WaitForExitWithTimeout( @@ -117,6 +138,9 @@ } private: +#if defined(OS_MACOSX) + std::unique_ptr<base::ScopedPathOverride> child_process_exe_override_; +#endif base::Process service_process_; };
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc index 036f578..656edd5 100644 --- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc +++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -13,7 +13,6 @@ #include "base/files/scoped_temp_dir.h" #include "base/macros.h" #include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" @@ -1040,9 +1039,9 @@ AccountTrackerService::kAccountInfoPref); update->Clear(); auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email)); - dict->SetString("email", base::UTF8ToUTF16(email)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id)); + dict->SetString("account_id", email); + dict->SetString("email", email); + dict->SetString("gaia", gaia_id); update->Append(std::move(dict)); account_tracker_service_.Shutdown(); account_tracker_service_.Initialize(&pref_service_, base::FilePath()); @@ -1098,14 +1097,14 @@ AccountTrackerService::kAccountInfoPref); update->Clear(); auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email1)); - dict->SetString("email", base::UTF8ToUTF16(email1)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id1)); + dict->SetString("account_id", email1); + dict->SetString("email", email1); + dict->SetString("gaia", gaia_id1); update->Append(std::move(dict)); dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email2)); - dict->SetString("email", base::UTF8ToUTF16(email2)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id2)); + dict->SetString("account_id", email2); + dict->SetString("email", email2); + dict->SetString("gaia", gaia_id2); update->Append(std::move(dict)); account_tracker_service_.Shutdown(); account_tracker_service_.Initialize(&pref_service_, base::FilePath());
diff --git a/chrome/browser/signin/profile_oauth2_token_service_factory.cc b/chrome/browser/signin/profile_oauth2_token_service_factory.cc index 0aa274c..60745f93 100644 --- a/chrome/browser/signin/profile_oauth2_token_service_factory.cc +++ b/chrome/browser/signin/profile_oauth2_token_service_factory.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include <memory> +#include <string> #include <utility> #include "base/logging.h" @@ -31,7 +32,6 @@ #endif #if defined(OS_CHROMEOS) -#include "base/logging.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/oauth2_token_service_delegate.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -65,7 +65,8 @@ return std::make_unique<chromeos::ChromeOSOAuth2TokenServiceDelegate>( AccountTrackerServiceFactory::GetInstance()->GetForProfile(profile), - account_manager); + account_manager, + SigninErrorControllerFactory::GetInstance()->GetForProfile(profile)); } #endif // defined(OS_CHROMEOS)
diff --git a/chrome/browser/signin/unified_consent_helper.cc b/chrome/browser/signin/unified_consent_helper.cc deleted file mode 100644 index 0aed192..0000000 --- a/chrome/browser/signin/unified_consent_helper.cc +++ /dev/null
@@ -1,43 +0,0 @@ -// 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/signin/unified_consent_helper.h" - -#include "base/feature_list.h" -#include "build/buildflag.h" -#include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "components/signin/core/browser/signin_buildflags.h" -#include "components/unified_consent/feature.h" - -namespace { - -unified_consent::UnifiedConsentFeatureState GetUnifiedConsentFeatureState( - Profile* profile) { - DCHECK(profile); -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - // On Dice platforms, unified consent requires Dice to be enabled first. - if (!AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) - return unified_consent::UnifiedConsentFeatureState::kDisabled; -#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) - - return unified_consent::internal::GetUnifiedConsentFeatureState(); -} - -} // namespace - -bool IsUnifiedConsentFeatureEnabled(Profile* profile) { - DCHECK(profile); - unified_consent::UnifiedConsentFeatureState feature_state = - GetUnifiedConsentFeatureState(profile); - return feature_state != - unified_consent::UnifiedConsentFeatureState::kDisabled; -} - -bool IsUnifiedConsentFeatureWithBumpEnabled(Profile* profile) { - DCHECK(profile); - unified_consent::UnifiedConsentFeatureState feature_state = - GetUnifiedConsentFeatureState(profile); - return feature_state == - unified_consent::UnifiedConsentFeatureState::kEnabledWithBump; -}
diff --git a/chrome/browser/signin/unified_consent_helper.h b/chrome/browser/signin/unified_consent_helper.h deleted file mode 100644 index d165dfc5..0000000 --- a/chrome/browser/signin/unified_consent_helper.h +++ /dev/null
@@ -1,21 +0,0 @@ -// 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_SIGNIN_UNIFIED_CONSENT_HELPER_H_ -#define CHROME_BROWSER_SIGNIN_UNIFIED_CONSENT_HELPER_H_ - -// TODO(msarda): Move this file in chrome/browser/unified_consent/feature.h - -class Profile; - -// Returns true if the unified consent feature state is kEnabledNoBump or -// kEnabledWithBump. Note that the bump may not be enabled, even if this returns -// true. To check if the bump is enabled, use -// IsUnifiedConsentFeatureWithBumpEnabled(). -bool IsUnifiedConsentFeatureEnabled(Profile* profile); - -// Returns true if the unified consent feature state is kEnabledWithBump. -bool IsUnifiedConsentFeatureWithBumpEnabled(Profile* profile); - -#endif // CHROME_BROWSER_SIGNIN_UNIFIED_CONSENT_HELPER_H_
diff --git a/chrome/browser/signin/unified_consent_helper_unittest.cc b/chrome/browser/signin/unified_consent_helper_unittest.cc deleted file mode 100644 index 0eb8f25..0000000 --- a/chrome/browser/signin/unified_consent_helper_unittest.cc +++ /dev/null
@@ -1,75 +0,0 @@ -// 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/signin/unified_consent_helper.h" - -#include "build/buildflag.h" -#include "chrome/browser/signin/scoped_account_consistency.h" -#include "chrome/test/base/testing_profile.h" -#include "components/signin/core/browser/signin_buildflags.h" -#include "components/sync/driver/sync_driver_switches.h" -#include "components/unified_consent/feature.h" -#include "components/unified_consent/scoped_unified_consent.h" -#include "content/public/test/test_browser_thread_bundle.h" -#include "testing/gtest/include/gtest/gtest.h" - -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - -// On Dice platforms, unified consent can only be enabled for Dice profiles. -TEST(UnifiedConsentHelperTest, DiceDisabled) { - // Disable Dice. - ScopedAccountConsistencyDiceFixAuthErrors dice_fix_auth_errors; - - content::TestBrowserThreadBundle thread_bundle; - TestingProfile profile; - - for (unified_consent::UnifiedConsentFeatureState state : - {unified_consent::UnifiedConsentFeatureState::kDisabled, - unified_consent::UnifiedConsentFeatureState::kEnabledNoBump, - unified_consent::UnifiedConsentFeatureState::kEnabledWithBump}) { - unified_consent::ScopedUnifiedConsent scoped_state(state); - EXPECT_FALSE(IsUnifiedConsentFeatureEnabled(&profile)); - EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled(&profile)); - } -} - -#endif - -// Checks that the feature state for the profile is the same as the global -// feature state. -TEST(UnifiedConsentHelperTest, FeatureState) { -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - // Enable Dice. - ScopedAccountConsistencyDice dice; -#endif - - content::TestBrowserThreadBundle thread_bundle; - TestingProfile profile; - - // Unified consent is disabled by default. - EXPECT_FALSE(IsUnifiedConsentFeatureEnabled(&profile)); - EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled(&profile)); - - // The feature state for the profile is the same as the global feature state. - { - unified_consent::ScopedUnifiedConsent scoped_disabled( - unified_consent::UnifiedConsentFeatureState::kDisabled); - EXPECT_FALSE(IsUnifiedConsentFeatureEnabled(&profile)); - EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled(&profile)); - } - - { - unified_consent::ScopedUnifiedConsent scoped_no_bump( - unified_consent::UnifiedConsentFeatureState::kEnabledNoBump); - EXPECT_TRUE(IsUnifiedConsentFeatureEnabled(&profile)); - EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled(&profile)); - } - - { - unified_consent::ScopedUnifiedConsent scoped_bump( - unified_consent::UnifiedConsentFeatureState::kEnabledWithBump); - EXPECT_TRUE(IsUnifiedConsentFeatureEnabled(&profile)); - EXPECT_TRUE(IsUnifiedConsentFeatureWithBumpEnabled(&profile)); - } -}
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc index 8fd19fb..0c275b9 100644 --- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
@@ -125,12 +125,6 @@ result_voice.lang = voice.lang; result_voice.remote = voice.remote; result_voice.extension_id = extension->id(); - if (voice.gender == constants::kGenderMale) - result_voice.gender = TTS_GENDER_MALE; - else if (voice.gender == constants::kGenderFemale) - result_voice.gender = TTS_GENDER_FEMALE; - else - result_voice.gender = TTS_GENDER_NONE; for (std::set<std::string>::const_iterator iter = voice.event_types.begin(); @@ -294,8 +288,6 @@ continue; } } - if (voice_data->HasKey(constants::kGenderKey)) - voice_data->GetString(constants::kGenderKey, &voice.gender); if (voice_data->HasKey(constants::kRemoteKey)) voice_data->GetBoolean(constants::kRemoteKey, &voice.remote); if (voice_data->HasKey(constants::kExtensionIdKey)) {
diff --git a/chrome/browser/speech/extension_api/tts_extension_api.cc b/chrome/browser/speech/extension_api/tts_extension_api.cc index abb14630..5545ba0 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_extension_api.cc
@@ -11,6 +11,8 @@ #include <utility> #include "base/lazy_instance.h" +#include "base/metrics/histogram_macros.h" +#include "base/metrics/user_metrics.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/speech/extension_api/tts_engine_extension_api.h" @@ -180,21 +182,14 @@ return false; } + // TODO(katie): Remove this after M73. This is just used to track how the + // gender deprecation is progressing. std::string gender_str; - TtsGenderType gender; if (options->HasKey(constants::kGenderKey)) EXTENSION_FUNCTION_VALIDATE( options->GetString(constants::kGenderKey, &gender_str)); - if (gender_str == constants::kGenderMale) { - gender = TTS_GENDER_MALE; - } else if (gender_str == constants::kGenderFemale) { - gender = TTS_GENDER_FEMALE; - } else if (gender_str.empty()) { - gender = TTS_GENDER_NONE; - } else { - error_ = constants::kErrorInvalidGender; - return false; - } + UMA_HISTOGRAM_BOOLEAN("TextToSpeech.Utterance.HasGender", + !gender_str.empty()); double rate = blink::SpeechSynthesisConstants::kDoublePrefNotSet; if (options->HasKey(constants::kRateKey)) { @@ -280,7 +275,6 @@ utterance->set_src_id(src_id); utterance->set_src_url(source_url()); utterance->set_lang(lang); - utterance->set_gender(gender); utterance->set_continuous_parameters(rate, pitch, volume); utterance->set_can_enqueue(can_enqueue); utterance->set_required_event_types(required_event_types); @@ -327,10 +321,6 @@ result_voice->SetBoolean(constants::kRemoteKey, voice.remote); if (!voice.lang.empty()) result_voice->SetString(constants::kLangKey, voice.lang); - if (voice.gender == TTS_GENDER_MALE) - result_voice->SetString(constants::kGenderKey, constants::kGenderMale); - else if (voice.gender == TTS_GENDER_FEMALE) - result_voice->SetString(constants::kGenderKey, constants::kGenderFemale); if (!voice.extension_id.empty()) result_voice->SetString(constants::kExtensionIdKey, voice.extension_id);
diff --git a/chrome/browser/speech/extension_api/tts_extension_api_constants.cc b/chrome/browser/speech/extension_api/tts_extension_api_constants.cc index 43bc556..8002759 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api_constants.cc +++ b/chrome/browser/speech/extension_api/tts_extension_api_constants.cc
@@ -25,9 +25,6 @@ const char kVoiceNameKey[] = "voiceName"; const char kVolumeKey[] = "volume"; -const char kGenderFemale[] = "female"; -const char kGenderMale[] = "male"; - const char kEventTypeCancelled[] = "cancelled"; const char kEventTypeEnd[] = "end"; const char kEventTypeError[] = "error"; @@ -40,7 +37,6 @@ const char kEventTypeWord[] = "word"; const char kErrorExtensionIdMismatch[] = "Extension id mismatch."; -const char kErrorInvalidGender[] = "Invalid gender."; const char kErrorInvalidLang[] = "Invalid lang."; const char kErrorInvalidPitch[] = "Invalid pitch."; const char kErrorInvalidRate[] = "Invalid rate.";
diff --git a/chrome/browser/speech/extension_api/tts_extension_api_constants.h b/chrome/browser/speech/extension_api/tts_extension_api_constants.h index 32075d9..9a0b25e 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api_constants.h +++ b/chrome/browser/speech/extension_api/tts_extension_api_constants.h
@@ -30,9 +30,6 @@ extern const char kVoiceNameKey[]; extern const char kVolumeKey[]; -extern const char kGenderFemale[]; -extern const char kGenderMale[]; - extern const char kEventTypeCancelled[]; extern const char kEventTypeEnd[]; extern const char kEventTypeError[]; @@ -45,7 +42,6 @@ extern const char kEventTypeWord[]; extern const char kErrorExtensionIdMismatch[]; -extern const char kErrorInvalidGender[]; extern const char kErrorInvalidLang[]; extern const char kErrorInvalidPitch[]; extern const char kErrorInvalidRate[];
diff --git a/chrome/browser/speech/tts_android.cc b/chrome/browser/speech/tts_android.cc index d2e2dc8..437ad898 100644 --- a/chrome/browser/speech/tts_android.cc +++ b/chrome/browser/speech/tts_android.cc
@@ -91,7 +91,6 @@ Java_TtsPlatformImpl_getVoiceName(env, java_ref_, i)); data.lang = base::android::ConvertJavaStringToUTF8( Java_TtsPlatformImpl_getVoiceLanguage(env, java_ref_, i)); - data.gender = TTS_GENDER_NONE; data.events.insert(TTS_EVENT_START); data.events.insert(TTS_EVENT_END); data.events.insert(TTS_EVENT_ERROR);
diff --git a/chrome/browser/speech/tts_controller.h b/chrome/browser/speech/tts_controller.h index 9ae2f32..6aba287 100644 --- a/chrome/browser/speech/tts_controller.h +++ b/chrome/browser/speech/tts_controller.h
@@ -40,12 +40,6 @@ TTS_EVENT_RESUME }; -enum TtsGenderType { - TTS_GENDER_NONE, - TTS_GENDER_MALE, - TTS_GENDER_FEMALE -}; - // Returns true if this event type is one that indicates an utterance // is finished and can be destroyed. bool IsFinalTtsEventType(TtsEventType event_type); @@ -67,7 +61,6 @@ std::string name; std::string lang; - TtsGenderType gender; std::string extension_id; std::set<TtsEventType> events; @@ -168,11 +161,6 @@ } const std::string& lang() const { return lang_; } - void set_gender(TtsGenderType gender) { - gender_ = gender; - } - TtsGenderType gender() const { return gender_; } - void set_continuous_parameters(const double rate, const double pitch, const double volume) { @@ -254,7 +242,6 @@ // The parsed options. std::string voice_name_; std::string lang_; - TtsGenderType gender_; UtteranceContinuousParameters continuous_parameters_; bool can_enqueue_; std::set<TtsEventType> required_event_types_;
diff --git a/chrome/browser/speech/tts_controller_impl.cc b/chrome/browser/speech/tts_controller_impl.cc index 2ca56c3..e47690e 100644 --- a/chrome/browser/speech/tts_controller_impl.cc +++ b/chrome/browser/speech/tts_controller_impl.cc
@@ -87,11 +87,7 @@ // VoiceData // - -VoiceData::VoiceData() - : gender(TTS_GENDER_NONE), - remote(false), - native(false) {} +VoiceData::VoiceData() : remote(false), native(false) {} VoiceData::VoiceData(const VoiceData& other) = default; @@ -109,7 +105,6 @@ : browser_context_(browser_context), id_(next_utterance_id_++), src_id_(-1), - gender_(TTS_GENDER_NONE), can_enqueue_(false), char_index_(0), finished_(false) { @@ -223,8 +218,6 @@ !utterance->voice_name().empty()); UMA_HISTOGRAM_BOOLEAN("TextToSpeech.Utterance.HasLang", !utterance->lang().empty()); - UMA_HISTOGRAM_BOOLEAN("TextToSpeech.Utterance.HasGender", - utterance->gender() != TTS_GENDER_NONE); UMA_HISTOGRAM_BOOLEAN("TextToSpeech.Utterance.HasRate", utterance->continuous_parameters().rate != 1.0); UMA_HISTOGRAM_BOOLEAN("TextToSpeech.Utterance.HasPitch", @@ -470,7 +463,6 @@ // Utterange language (exact region preferred, then general language code) // App/system language (exact region preferred, then general language code) // Required event types - // Gender // User-selected preference of voice given the general language code. // TODO(gaochun): Replace the global variable g_browser_process with @@ -509,10 +501,10 @@ if (!voice.lang.empty() && !utterance->lang().empty()) { // An exact language match is worth more than a partial match. if (voice.lang == utterance->lang()) { - score += 128; + score += 64; } else if (l10n_util::GetLanguage(voice.lang) == l10n_util::GetLanguage(utterance->lang())) { - score += 64; + score += 32; } } @@ -520,7 +512,7 @@ if (!voice.lang.empty()) { if (l10n_util::GetLanguage(voice.lang) == l10n_util::GetLanguage(app_lang)) - score += 32; + score += 16; } // Next, prefer required event types. @@ -536,14 +528,7 @@ } } if (has_all_required_event_types) - score += 16; - } - - // Prefer the requested gender. - if (voice.gender != TTS_GENDER_NONE && - utterance->gender() != TTS_GENDER_NONE && - voice.gender == utterance->gender()) { - score += 8; + score += 8; } #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/speech/tts_controller_unittest.cc b/chrome/browser/speech/tts_controller_unittest.cc index b6ecd01f..22f22bc 100644 --- a/chrome/browser/speech/tts_controller_unittest.cc +++ b/chrome/browser/speech/tts_controller_unittest.cc
@@ -84,7 +84,7 @@ std::unique_ptr<base::DictionaryValue> lang_to_voices = std::make_unique<base::DictionaryValue>(); lang_to_voices->SetKey( - "es", base::Value("{\"name\":\"Voice8\",\"extension\":\"id8\"}")); + "es", base::Value("{\"name\":\"Voice7\",\"extension\":\"id7\"}")); lang_to_voices->SetKey( "noLanguage", base::Value("{\"name\":\"Android\",\"extension\":\"\"}")); pref_service_.registry()->RegisterDictionaryPref( @@ -132,82 +132,76 @@ VoiceData voice0; voices.push_back(voice0); VoiceData voice1; - voice1.gender = TTS_GENDER_FEMALE; + voice1.events.insert(TTS_EVENT_WORD); voices.push_back(voice1); VoiceData voice2; - voice2.events.insert(TTS_EVENT_WORD); + voice2.lang = "de-DE"; voices.push_back(voice2); VoiceData voice3; - voice3.lang = "de-DE"; + voice3.lang = "fr-CA"; voices.push_back(voice3); VoiceData voice4; - voice4.lang = "fr-CA"; + voice4.name = "Voice4"; voices.push_back(voice4); VoiceData voice5; - voice5.name = "Voice5"; + voice5.extension_id = "id5"; voices.push_back(voice5); VoiceData voice6; - voice6.extension_id = "id6"; + voice6.extension_id = "id7"; + voice6.name = "Voice6"; + voice6.lang = "es-es"; voices.push_back(voice6); VoiceData voice7; voice7.extension_id = "id7"; voice7.name = "Voice7"; - voice7.lang = "es-es"; + voice7.lang = "es-mx"; voices.push_back(voice7); VoiceData voice8; - voice8.extension_id = "id8"; - voice8.name = "Voice8"; - voice8.lang = "es-mx"; + voice8.extension_id = ""; + voice8.name = "Android"; + voice8.lang = ""; + voice8.native = true; voices.push_back(voice8); - VoiceData voice9; - voice9.extension_id = ""; - voice9.name = "Android"; - voice9.lang = ""; - voice9.native = true; - voices.push_back(voice9); Utterance utterance(nullptr); EXPECT_EQ(0, tts_controller->GetMatchingVoice(&utterance, voices)); - utterance.set_gender(TTS_GENDER_FEMALE); - EXPECT_EQ(1, tts_controller->GetMatchingVoice(&utterance, voices)); - std::set<TtsEventType> types; types.insert(TTS_EVENT_WORD); utterance.set_required_event_types(types); - EXPECT_EQ(2, tts_controller->GetMatchingVoice(&utterance, voices)); + EXPECT_EQ(1, tts_controller->GetMatchingVoice(&utterance, voices)); utterance.set_lang("de-DE"); - EXPECT_EQ(3, tts_controller->GetMatchingVoice(&utterance, voices)); + EXPECT_EQ(2, tts_controller->GetMatchingVoice(&utterance, voices)); utterance.set_lang("fr-FR"); + EXPECT_EQ(3, tts_controller->GetMatchingVoice(&utterance, voices)); + + utterance.set_voice_name("Voice4"); EXPECT_EQ(4, tts_controller->GetMatchingVoice(&utterance, voices)); - utterance.set_voice_name("Voice5"); + utterance.set_voice_name(""); + utterance.set_extension_id("id5"); EXPECT_EQ(5, tts_controller->GetMatchingVoice(&utterance, voices)); - utterance.set_voice_name(""); - utterance.set_extension_id("id6"); - EXPECT_EQ(6, tts_controller->GetMatchingVoice(&utterance, voices)); - #if defined(OS_CHROMEOS) - // Voice7 is matched when the utterance locale exactly matches its locale. + // Voice6 is matched when the utterance locale exactly matches its locale. utterance.set_extension_id(""); utterance.set_lang("es-es"); - EXPECT_EQ(7, tts_controller->GetMatchingVoice(&utterance, voices)); + EXPECT_EQ(6, tts_controller->GetMatchingVoice(&utterance, voices)); - // The 8th voice is the default for "es", even though the utterance is - // "es-ar". |voice7| is not matched because it is not the default. + // The 7th voice is the default for "es", even though the utterance is + // "es-ar". |voice6| is not matched because it is not the default. utterance.set_extension_id(""); utterance.set_lang("es-ar"); - EXPECT_EQ(8, tts_controller->GetMatchingVoice(&utterance, voices)); + EXPECT_EQ(7, tts_controller->GetMatchingVoice(&utterance, voices)); - // The 9th voice is like the built-in "Android" voice, it has no lang + // The 8th voice is like the built-in "Android" voice, it has no lang // and no extension ID. Make sure it can still be matched. utterance.set_voice_name("Android"); utterance.set_extension_id(""); utterance.set_lang(""); - EXPECT_EQ(9, tts_controller->GetMatchingVoice(&utterance, voices)); + EXPECT_EQ(8, tts_controller->GetMatchingVoice(&utterance, voices)); #endif // defined(OS_CHROMEOS) } }
diff --git a/chrome/browser/speech/tts_mac.mm b/chrome/browser/speech/tts_mac.mm index 74996d8..3bee149 100644 --- a/chrome/browser/speech/tts_mac.mm +++ b/chrome/browser/speech/tts_mac.mm
@@ -224,7 +224,6 @@ NSDictionary* attributes = [NSSpeechSynthesizer attributesForVoice:voiceIdentifier]; NSString* name = [attributes objectForKey:NSVoiceName]; - NSString* gender = [attributes objectForKey:NSVoiceGender]; NSString* localeIdentifier = [attributes objectForKey:NSVoiceLocaleIdentifier]; @@ -242,12 +241,6 @@ } else { data.lang = base::SysNSStringToUTF8(language); } - if ([gender isEqualToString:NSVoiceGenderMale]) - data.gender = TTS_GENDER_MALE; - else if ([gender isEqualToString:NSVoiceGenderFemale]) - data.gender = TTS_GENDER_FEMALE; - else - data.gender = TTS_GENDER_NONE; data.events.insert(TTS_EVENT_START); data.events.insert(TTS_EVENT_END); data.events.insert(TTS_EVENT_WORD);
diff --git a/chrome/browser/speech/tts_win.cc b/chrome/browser/speech/tts_win.cc index d9a97418..19b711c3 100644 --- a/chrome/browser/speech/tts_win.cc +++ b/chrome/browser/speech/tts_win.cc
@@ -23,7 +23,6 @@ // ISpObjectToken key and value names. const wchar_t kAttributesKey[] = L"Attributes"; -const wchar_t kGenderValue[] = L"Gender"; const wchar_t kLanguageValue[] = L"Language"; } // anonymous namespace. @@ -214,14 +213,6 @@ if (S_OK != voice_token->OpenKey(kAttributesKey, attributes.GetAddressOf())) continue; - base::win::ScopedCoMem<WCHAR> gender; - if (S_OK == attributes->GetStringValue(kGenderValue, &gender)) { - if (0 == _wcsicmp(gender.get(), L"male")) - voice.gender = TTS_GENDER_MALE; - else if (0 == _wcsicmp(gender.get(), L"female")) - voice.gender = TTS_GENDER_FEMALE; - } - base::win::ScopedCoMem<WCHAR> language; if (S_OK == attributes->GetStringValue(kLanguageValue, &language)) { int lcid_value;
diff --git a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc index 80b4829..794269f4 100644 --- a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc +++ b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc
@@ -222,8 +222,7 @@ AdsPageLoadMetricsObserver::AdOriginStatus::kSame, 1); } -IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest, - DISABLED_VerifyCrossOriginWithoutNavigate) { +IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest, VerifyCrossOriginWithoutNavigate) { base::HistogramTester histogram_tester; // Main frame.
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc index 22c24e2..256bd83 100644 --- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc +++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
@@ -94,8 +94,13 @@ void SubresourceFilterContentSettingsManager:: ResetSiteMetadataBasedOnActivation(const GURL& url, bool is_activated) { - SetSiteMetadata( - url, is_activated ? std::make_unique<base::DictionaryValue>() : nullptr); + // Do not reset the metadata if it exists already, it could clobber an + // existing timestamp. + if (!is_activated) { + SetSiteMetadata(url, nullptr); + } else if (!GetSiteMetadata(url)) { + SetSiteMetadata(url, std::make_unique<base::DictionaryValue>()); + } } std::unique_ptr<base::DictionaryValue>
diff --git a/chrome/browser/subresource_filter/subresource_filter_settings_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_settings_browsertest.cc index e0cd1aa..b25826e 100644 --- a/chrome/browser/subresource_filter/subresource_filter_settings_browsertest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_settings_browsertest.cc
@@ -231,6 +231,7 @@ // android-only feature. IN_PROC_BROWSER_TEST_F(SubresourceFilterSettingsBrowserTest, DoNotShowUIUntilThresholdReached) { + settings_manager()->set_should_use_smart_ui_for_testing(true); ASSERT_NO_FATAL_FAILURE( SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); GURL a_url(embedded_test_server()->GetURL( @@ -261,12 +262,10 @@ ui_test_utils::NavigateToURL(browser(), a_url); EXPECT_FALSE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); - bool use_smart_ui = settings_manager()->should_use_smart_ui(); - EXPECT_EQ(client->did_show_ui_for_navigation(), !use_smart_ui); + EXPECT_EQ(client->did_show_ui_for_navigation(), false); histogram_tester.ExpectBucketCount(kSubresourceFilterActionsHistogram, - SubresourceFilterAction::kUISuppressed, - use_smart_ui ? 1 : 0); + SubresourceFilterAction::kUISuppressed, 1); ConfigureAsPhishingURL(b_url); @@ -285,8 +284,7 @@ EXPECT_TRUE(client->did_show_ui_for_navigation()); histogram_tester.ExpectBucketCount(kSubresourceFilterActionsHistogram, - SubresourceFilterAction::kUISuppressed, - use_smart_ui ? 1 : 0); + SubresourceFilterAction::kUISuppressed, 1); } } // namespace subresource_filter
diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc index de8da35f..223fdcc0 100644 --- a/chrome/browser/sync/profile_sync_service_android.cc +++ b/chrome/browser/sync/profile_sync_service_android.cc
@@ -20,7 +20,6 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/common/channel_info.h" @@ -366,18 +365,15 @@ const base::android::JavaParamRef<jobject>& obj, jboolean personalized) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - bool is_unified_consent_enabled = IsUnifiedConsentFeatureEnabled(profile_); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> unified_consent_url_helper; if (personalized) { unified_consent_url_helper = UrlKeyedDataCollectionConsentHelper:: - NewPersonalizedDataCollectionConsentHelper(is_unified_consent_enabled, - sync_service_); + NewPersonalizedDataCollectionConsentHelper(sync_service_); } else { PrefService* pref_service = profile_->GetPrefs(); unified_consent_url_helper = UrlKeyedDataCollectionConsentHelper:: - NewAnonymizedDataCollectionConsentHelper(is_unified_consent_enabled, - pref_service, sync_service_); + NewAnonymizedDataCollectionConsentHelper(pref_service, sync_service_); } return unified_consent_url_helper->IsEnabled();
diff --git a/chrome/browser/sync/profile_sync_service_factory.cc b/chrome/browser/sync/profile_sync_service_factory.cc index d6ab1f4..1ccf87b 100644 --- a/chrome/browser/sync/profile_sync_service_factory.cc +++ b/chrome/browser/sync/profile_sync_service_factory.cc
@@ -30,7 +30,6 @@ #include "chrome/browser/signin/chrome_device_id_helper.h" #include "chrome/browser/signin/gaia_cookie_manager_service_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/spellchecker/spellcheck_factory.h" #include "chrome/browser/sync/bookmark_sync_service_factory.h" #include "chrome/browser/sync/chrome_sync_client.h" @@ -42,12 +41,14 @@ #include "chrome/common/channel_info.h" #include "components/browser_sync/profile_sync_components_factory_impl.h" #include "components/browser_sync/profile_sync_service.h" +#include "components/invalidation/impl/invalidation_switches.h" #include "components/invalidation/impl/profile_identity_provider.h" #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/network_time/network_time_tracker.h" #include "components/sync/driver/startup_controller.h" #include "components/sync/driver/sync_util.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" @@ -187,7 +188,7 @@ init_params.debug_identifier = profile->GetDebugName(); init_params.channel = chrome::GetChannel(); init_params.user_events_separate_pref_group = - IsUnifiedConsentFeatureEnabled(profile); + unified_consent::IsUnifiedConsentFeatureEnabled(); if (!client_factory_) { init_params.sync_client = @@ -238,8 +239,14 @@ base::BindRepeating(&GetSigninScopedDeviceIdForProfile, profile); init_params.gaia_cookie_manager_service = GaiaCookieManagerServiceFactory::GetForProfile(profile); - auto* invalidation_provider = invalidation:: - DeprecatedProfileInvalidationProviderFactory::GetForProfile(profile); + bool use_fcm_invalidations = + base::FeatureList::IsEnabled(invalidation::switches::kFCMInvalidations); + auto* invalidation_provider = + use_fcm_invalidations + ? invalidation::ProfileInvalidationProviderFactory::GetForProfile( + profile) + : invalidation::DeprecatedProfileInvalidationProviderFactory:: + GetForProfile(profile); if (invalidation_provider) { init_params.invalidations_identity_provider = invalidation_provider->GetIdentityProvider();
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc index 6f7321f..c66db09 100644 --- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc +++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/test/integration/quiesce_status_change_checker.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" @@ -36,6 +35,7 @@ #include "components/sync/base/progress_marker_map.h" #include "components/sync/driver/about_sync_util.h" #include "components/sync/engine/sync_string_conversions.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #include "google_apis/gaia/gaia_constants.h" #include "services/identity/public/cpp/identity_manager.h" @@ -231,7 +231,7 @@ // Choose the datatypes to be synced. If all datatypes are to be synced, // set sync_everything to true; otherwise, set it to false. bool sync_everything = (synced_datatypes == syncer::UserSelectableTypes()); - if (IsUnifiedConsentFeatureEnabled(profile_)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { // When unified consent given is set to |true|, the unified consent service // enables syncing all datatypes. UnifiedConsentServiceFactory::GetForProfile(profile_) @@ -531,7 +531,7 @@ } // Disable unified consent first as otherwise disabling sync is not possible. - if (IsUnifiedConsentFeatureEnabled(profile_)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { UnifiedConsentServiceFactory::GetForProfile(profile_) ->SetUnifiedConsentGiven(false); }
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc index 8a2aca8..ab0eaee 100644 --- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -1392,7 +1392,7 @@ } // Merge moderately complex bookmark models. -IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, +IN_PROC_BROWSER_TEST_P(TwoClientBookmarksSyncTestIncludingUssTests, MC_MergeDifferentBMModelsModeratelyComplex) { ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; DisableVerifier(); @@ -1610,7 +1610,8 @@ ASSERT_TRUE(BookmarksMatchChecker().Wait()); } -IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, DisableSync) { +IN_PROC_BROWSER_TEST_P(TwoClientBookmarksSyncTestIncludingUssTests, + DisableSync) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllModelsMatchVerifier()); @@ -2002,7 +2003,7 @@ ASSERT_TRUE(BookmarksMatchChecker().Wait()); } -IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, +IN_PROC_BROWSER_TEST_P(TwoClientBookmarksSyncTestIncludingUssTests, BookmarkAllNodesRemovedEvent) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllModelsMatchVerifier());
diff --git a/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.cc b/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.cc new file mode 100644 index 0000000..b2f2d400 --- /dev/null +++ b/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.cc
@@ -0,0 +1,18 @@ +// 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/tracing/chrome_browser_main_extra_parts_tracing.h" + +ChromeBrowserMainExtraPartsTracing::ChromeBrowserMainExtraPartsTracing() = + default; +ChromeBrowserMainExtraPartsTracing::~ChromeBrowserMainExtraPartsTracing() = + default; + +void ChromeBrowserMainExtraPartsTracing::PreMainMessageLoopRun() { + sampler_profiler_ = std::make_unique<tracing::TracingSamplerProfiler>(); +} + +void ChromeBrowserMainExtraPartsTracing::PostMainMessageLoopRun() { + sampler_profiler_.reset(); +}
diff --git a/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.h b/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.h new file mode 100644 index 0000000..a281f14 --- /dev/null +++ b/chrome/browser/tracing/chrome_browser_main_extra_parts_tracing.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_TRACING_CHROME_BROWSER_MAIN_EXTRA_PARTS_TRACING_H_ +#define CHROME_BROWSER_TRACING_CHROME_BROWSER_MAIN_EXTRA_PARTS_TRACING_H_ + +#include <memory> + +#include "base/macros.h" +#include "chrome/browser/chrome_browser_main_extra_parts.h" +#include "components/tracing/common/tracing_sampler_profiler.h" + +class ChromeBrowserMainExtraPartsTracing : public ChromeBrowserMainExtraParts { + public: + ChromeBrowserMainExtraPartsTracing(); + ~ChromeBrowserMainExtraPartsTracing() override; + + // MainMessageLoopRun methods. + void PreMainMessageLoopRun() override; + void PostMainMessageLoopRun() override; + + private: + std::unique_ptr<tracing::TracingSamplerProfiler> sampler_profiler_; + DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainExtraPartsTracing); +}; + +#endif // CHROME_BROWSER_TRACING_CHROME_BROWSER_MAIN_EXTRA_PARTS_TRACING_H_
diff --git a/chrome/browser/translate/chrome_translate_client.cc b/chrome/browser/translate/chrome_translate_client.cc index 94ea040..0b7f5a3a 100644 --- a/chrome/browser/translate/chrome_translate_client.cc +++ b/chrome/browser/translate/chrome_translate_client.cc
@@ -192,10 +192,8 @@ Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); - Profile* original_profile = profile->GetOriginalProfile(); - PrefService* prefs = original_profile->GetPrefs(); std::unique_ptr<translate::TranslatePrefs> translate_prefs = - CreateTranslatePrefs(prefs); + CreateTranslatePrefs(profile->GetPrefs()); if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { std::string auto_translate_language = translate::TranslateManager::GetAutoTargetLanguage( @@ -271,15 +269,12 @@ DCHECK(web_contents()); Profile* profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - return profile->GetOriginalProfile()->GetPrefs(); + return profile->GetPrefs(); } std::unique_ptr<translate::TranslatePrefs> ChromeTranslateClient::GetTranslatePrefs() { - DCHECK(web_contents()); - Profile* profile = - Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - return CreateTranslatePrefs(profile->GetPrefs()); + return CreateTranslatePrefs(GetPrefs()); } translate::TranslateAcceptLanguages*
diff --git a/chrome/browser/translate/translate_accept_languages_factory.cc b/chrome/browser/translate/translate_accept_languages_factory.cc index 4e63d04..9e42bbf 100644 --- a/chrome/browser/translate/translate_accept_languages_factory.cc +++ b/chrome/browser/translate/translate_accept_languages_factory.cc
@@ -9,37 +9,9 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_service.h" #include "components/translate/core/browser/translate_accept_languages.h" -namespace { - -// TranslateAcceptLanguagesService is a thin container for -// TranslateAcceptLanguages to enable associating it with a BrowserContext. -class TranslateAcceptLanguagesService : public KeyedService { - public: - explicit TranslateAcceptLanguagesService(PrefService* prefs); - ~TranslateAcceptLanguagesService() override; - - // Returns the associated TranslateAcceptLanguages. - translate::TranslateAcceptLanguages& accept_languages() { - return accept_languages_; - } - - private: - translate::TranslateAcceptLanguages accept_languages_; - DISALLOW_COPY_AND_ASSIGN(TranslateAcceptLanguagesService); -}; - -TranslateAcceptLanguagesService::TranslateAcceptLanguagesService( - PrefService* prefs) - : accept_languages_(prefs, prefs::kAcceptLanguages) {} - -TranslateAcceptLanguagesService::~TranslateAcceptLanguagesService() {} - -} // namespace - // static TranslateAcceptLanguagesFactory* TranslateAcceptLanguagesFactory::GetInstance() { @@ -50,15 +22,13 @@ translate::TranslateAcceptLanguages* TranslateAcceptLanguagesFactory::GetForBrowserContext( content::BrowserContext* context) { - TranslateAcceptLanguagesService* service = - static_cast<TranslateAcceptLanguagesService*>( - GetInstance()->GetServiceForBrowserContext(context, true)); - return &service->accept_languages(); + return static_cast<translate::TranslateAcceptLanguages*>( + GetInstance()->GetServiceForBrowserContext(context, true)); } TranslateAcceptLanguagesFactory::TranslateAcceptLanguagesFactory() : BrowserContextKeyedServiceFactory( - "TranslateAcceptLanguagesService", + "TranslateAcceptLanguages", BrowserContextDependencyManager::GetInstance()) {} TranslateAcceptLanguagesFactory::~TranslateAcceptLanguagesFactory() {} @@ -66,11 +36,12 @@ KeyedService* TranslateAcceptLanguagesFactory::BuildServiceInstanceFor( content::BrowserContext* browser_context) const { Profile* profile = Profile::FromBrowserContext(browser_context); - return new TranslateAcceptLanguagesService(profile->GetPrefs()); + return new translate::TranslateAcceptLanguages(profile->GetPrefs(), + prefs::kAcceptLanguages); } content::BrowserContext* TranslateAcceptLanguagesFactory::GetBrowserContextToUse( content::BrowserContext* context) const { - return chrome::GetBrowserContextRedirectedInIncognito(context); + return chrome::GetBrowserContextOwnInstanceInIncognito(context); }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index fb21959d..4d667f1 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -721,6 +721,10 @@ "webui/local_state/local_state_ui.h", "webui/log_web_ui_url.cc", "webui/log_web_ui_url.h", + "webui/management_ui.cc", + "webui/management_ui.h", + "webui/management_ui_handler.cc", + "webui/management_ui_handler.h", "webui/media/media_engagement_ui.cc", "webui/media/media_engagement_ui.h", "webui/media/webrtc_logs_ui.cc", @@ -1162,6 +1166,8 @@ "android/view_android_helper.cc", "android/view_android_helper.h", "browser_otr_state_android.cc", + "omnibox/query_in_omnibox_factory.cc", + "omnibox/query_in_omnibox_factory.h", "screen_capture_notification_ui_stub.cc", "webui/eoc_internals/eoc_internals_page_handler.cc", "webui/eoc_internals/eoc_internals_page_handler.h", @@ -1891,6 +1897,8 @@ "views/frame/immersive_mode_controller_ash.cc", "views/frame/immersive_mode_controller_ash.h", "views/frame/native_browser_frame_factory_chromeos.cc", + "views/frame/top_controls_slide_controller_chromeos.cc", + "views/frame/top_controls_slide_controller_chromeos.h", "views/ime_driver/input_method_bridge_chromeos.cc", "views/ime_driver/input_method_bridge_chromeos.h", "views/intent_picker_bubble_view.cc", @@ -1955,6 +1963,8 @@ "webui/chromeos/login/arc_kiosk_splash_screen_handler.h", "webui/chromeos/login/arc_terms_of_service_screen_handler.cc", "webui/chromeos/login/arc_terms_of_service_screen_handler.h", + "webui/chromeos/login/assistant_optin_flow_screen_handler.cc", + "webui/chromeos/login/assistant_optin_flow_screen_handler.h", "webui/chromeos/login/auto_enrollment_check_screen_handler.cc", "webui/chromeos/login/auto_enrollment_check_screen_handler.h", "webui/chromeos/login/base_screen_handler.cc", @@ -3156,6 +3166,8 @@ "views/frame/toolbar_button_provider.h", "views/frame/top_container_view.cc", "views/frame/top_container_view.h", + "views/frame/top_controls_slide_controller.cc", + "views/frame/top_controls_slide_controller.h", "views/frame/web_contents_close_handler.cc", "views/frame/web_contents_close_handler.h", "views/frame/web_contents_close_handler_delegate.h", @@ -3673,6 +3685,8 @@ "app_list/arc/arc_app_list_prefs_factory.h", "app_list/arc/arc_app_model_builder.cc", "app_list/arc/arc_app_model_builder.h", + "app_list/arc/arc_app_scoped_pref_update.cc", + "app_list/arc/arc_app_scoped_pref_update.h", "app_list/arc/arc_app_utils.cc", "app_list/arc/arc_app_utils.h", "app_list/arc/arc_data_removal_dialog.h", @@ -3893,6 +3907,7 @@ "//components/nux:constants", "//components/nux:email_feature", "//components/nux:google_apps_feature", + "//components/nux:set_as_default_feature", ] }
diff --git a/chrome/browser/ui/android/android_about_app_info.cc b/chrome/browser/ui/android/android_about_app_info.cc index ba3808ce..cc96cba 100644 --- a/chrome/browser/ui/android/android_about_app_info.cc +++ b/chrome/browser/ui/android/android_about_app_info.cc
@@ -5,14 +5,11 @@ #include "chrome/browser/ui/android/android_about_app_info.h" #include <jni.h> -#include <stdint.h> - -#include <string> #include "base/android/jni_android.h" #include "base/android/jni_string.h" -#include "base/strings/stringprintf.h" #include "base/sys_info.h" +#include "content/public/common/user_agent.h" #include "jni/ChromeVersionInfo_jni.h" std::string AndroidAboutAppInfo::GetGmsInfo() { @@ -23,35 +20,6 @@ } std::string AndroidAboutAppInfo::GetOsInfo() { - std::string android_info_str; - - // Append information about the OS version. - int32_t os_major_version = 0; - int32_t os_minor_version = 0; - int32_t os_bugfix_version = 0; - base::SysInfo::OperatingSystemVersionNumbers(&os_major_version, - &os_minor_version, - &os_bugfix_version); - base::StringAppendF(&android_info_str, "%d.%d.%d", os_major_version, - os_minor_version, os_bugfix_version); - - // Append information about the device. - bool semicolon_inserted = false; - std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename(); - std::string android_device_name = base::SysInfo::HardwareModelName(); - if ("REL" == android_build_codename && android_device_name.size() > 0) { - android_info_str += "; " + android_device_name; - semicolon_inserted = true; - } - - // Append the build ID. - std::string android_build_id = base::SysInfo::GetAndroidBuildID(); - if (android_build_id.size() > 0) { - if (!semicolon_inserted) { - android_info_str += ";"; - } - android_info_str += " Build/" + android_build_id; - } - - return android_info_str; + return base::SysInfo::OperatingSystemVersion() + + content::GetAndroidOSInfo(/*include_android_build_number=*/true); }
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc index 4ca755e..ed643e0 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
@@ -22,7 +22,9 @@ #include "chrome/browser/image_decoder.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h" +#include "chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include "chrome/browser/ui/app_list/arc/arc_default_app_list.h" #include "chrome/browser/ui/app_list/arc/arc_package_syncable_service.h" #include "chrome/browser/ui/app_list/arc/arc_pai_starter.h" #include "chrome/grit/generated_resources.h" @@ -64,33 +66,6 @@ constexpr base::TimeDelta kDetectDefaultAppAvailabilityTimeout = base::TimeDelta::FromMinutes(1); -// Provider of write access to a dictionary storing ARC prefs. -class ScopedArcPrefUpdate : public DictionaryPrefUpdate { - public: - ScopedArcPrefUpdate(PrefService* service, - const std::string& id, - const std::string& path) - : DictionaryPrefUpdate(service, path), id_(id) {} - - ~ScopedArcPrefUpdate() override {} - - // DictionaryPrefUpdate overrides: - base::DictionaryValue* Get() override { - base::DictionaryValue* dict = DictionaryPrefUpdate::Get(); - base::Value* dict_item = - dict->FindKeyOfType(id_, base::Value::Type::DICTIONARY); - if (!dict_item) { - dict_item = dict->SetKey(id_, base::Value(base::Value::Type::DICTIONARY)); - } - return static_cast<base::DictionaryValue*>(dict_item); - } - - private: - const std::string id_; - - DISALLOW_COPY_AND_ASSIGN(ScopedArcPrefUpdate); -}; - // Accessor for deferred set notifications enabled requests in prefs. class SetNotificationsEnabledDeferred { public: @@ -218,6 +193,7 @@ registry->RegisterDictionaryPref(arc::prefs::kArcPackages); registry->RegisterDictionaryPref( arc::prefs::kArcSetNotificationsEnabledDeferred); + ArcDefaultAppList::RegisterProfilePrefs(registry); } // static @@ -329,7 +305,6 @@ : profile_(profile), prefs_(profile->GetPrefs()), app_connection_holder_(app_connection_holder), - default_apps_(this, profile), weak_ptr_factory_(this) { DCHECK(profile); DCHECK(app_connection_holder); @@ -337,6 +312,11 @@ const base::FilePath& base_path = profile->GetPath(); base_path_ = base_path.AppendASCII(arc::prefs::kArcApps); + // Once default apps are ready OnDefaultAppsReady is called. + default_apps_ = std::make_unique<ArcDefaultAppList>( + profile, base::BindOnce(&ArcAppListPrefs::OnDefaultAppsReady, + base::Unretained(this))); + arc::ArcSessionManager* arc_session_manager = arc::ArcSessionManager::Get(); if (!arc_session_manager) return; @@ -345,7 +325,6 @@ const std::vector<std::string> existing_app_ids = GetAppIds(); tracked_apps_.insert(existing_app_ids.begin(), existing_app_ids.end()); - // Once default apps are ready OnDefaultAppsReady is called. // Not always set in unit_tests arc::ArcPolicyBridge* policy_bridge = @@ -395,7 +374,7 @@ base::FilePath ArcAppListPrefs::MaybeGetIconPathForDefaultApp( const std::string& app_id, const ArcAppIconDescriptor& descriptor) const { - const ArcDefaultAppList::AppInfo* default_app = default_apps_.GetApp(app_id); + const ArcDefaultAppList::AppInfo* default_app = default_apps_->GetApp(app_id); if (!default_app || default_app->app_path.empty()) return base::FilePath(); @@ -628,10 +607,8 @@ if (!IsArcAlive() || !IsArcAndroidEnabledForProfile(profile_)) { // Default ARC apps available before OptIn. std::vector<std::string> ids; - for (const auto& default_app : default_apps_.app_map()) { - if (default_apps_.HasApp(default_app.first)) - ids.push_back(default_app.first); - } + for (const auto& default_app : default_apps_->GetActiveApps()) + ids.push_back(default_app.first); return ids; } return GetAppIdsNoArcEnabledCheck(); @@ -659,7 +636,7 @@ const std::string& app_id) const { // Information for default app is available before ARC enabled. if ((!IsArcAlive() || !IsArcAndroidEnabledForProfile(profile_)) && - !default_apps_.HasApp(app_id)) + !default_apps_->HasApp(app_id)) return std::unique_ptr<AppInfo>(); return GetAppFromPrefs(app_id); @@ -717,7 +694,7 @@ bool ArcAppListPrefs::IsRegistered(const std::string& app_id) const { if ((!IsArcAlive() || !IsArcAndroidEnabledForProfile(profile_)) && - !default_apps_.HasApp(app_id)) + !default_apps_->HasApp(app_id)) return false; const base::DictionaryValue* app = nullptr; @@ -727,11 +704,11 @@ } bool ArcAppListPrefs::IsDefault(const std::string& app_id) const { - return default_apps_.HasApp(app_id); + return default_apps_->HasApp(app_id); } bool ArcAppListPrefs::IsOem(const std::string& app_id) const { - const ArcDefaultAppList::AppInfo* app_info = default_apps_.GetApp(app_id); + const ArcDefaultAppList::AppInfo* app_info = default_apps_->GetApp(app_id); return app_info && app_info->oem; } @@ -756,7 +733,7 @@ return; const base::Time time = base::Time::Now(); - ScopedArcPrefUpdate update(prefs_, app_id, arc::prefs::kArcApps); + arc::ArcAppScopedPrefUpdate update(prefs_, app_id, arc::prefs::kArcApps); base::DictionaryValue* app_dict = update.Get(); const std::string string_value = base::Int64ToString(time.ToInternalValue()); app_dict->SetString(kLastLaunchTime, string_value); @@ -816,7 +793,7 @@ void ArcAppListPrefs::RemoveAllAppsAndPackages() { std::vector<std::string> app_ids = GetAppIdsNoArcEnabledCheck(); for (const auto& app_id : app_ids) { - if (!default_apps_.HasApp(app_id)) { + if (!default_apps_->HasApp(app_id)) { RemoveApp(app_id); } else { if (ready_apps_.count(app_id)) { @@ -830,8 +807,7 @@ const std::vector<std::string> package_names_to_remove = GetPackagesFromPrefs(false /* check_arc_alive */, true /* installed */); for (const auto& package_name : package_names_to_remove) { - if (!default_apps_.HasPackage(package_name)) - RemovePackageFromPrefs(prefs_, package_name); + RemovePackageFromPrefs(package_name); for (auto& observer : observer_list_) observer.OnPackageRemoved(package_name, false); } @@ -856,12 +832,12 @@ // Match this requirement and don't show pre-installed apps for managed users // in app list. if (arc::policy_util::IsAccountManaged(profile_)) { - default_apps_.set_filter_level( + default_apps_->set_filter_level( arc::IsArcPlayStoreEnabledForProfile(profile_) ? ArcDefaultAppList::FilterLevel::OPTIONAL_APPS : ArcDefaultAppList::FilterLevel::ALL); } else { - default_apps_.set_filter_level(ArcDefaultAppList::FilterLevel::NOTHING); + default_apps_->set_filter_level(ArcDefaultAppList::FilterLevel::NOTHING); } // Register default apps if it was not registered before. @@ -869,17 +845,21 @@ } void ArcAppListPrefs::OnDefaultAppsReady() { - // Apply uninstalled packages now. + // Deprecated. Convert uninstalled packages info to hidden default apps and + // erase pending perf entry afterward. + // TODO (khmel): Remove in M73 const std::vector<std::string> uninstalled_package_names = GetPackagesFromPrefs(false /* check_arc_alive */, false /* installed */); - for (const auto& uninstalled_package_name : uninstalled_package_names) - default_apps_.MaybeMarkPackageUninstalled(uninstalled_package_name, true); + for (const auto& uninstalled_package_name : uninstalled_package_names) { + default_apps_->SetAppsHiddenForPackage(uninstalled_package_name); + RemovePackageFromPrefs(uninstalled_package_name); + } SetDefaultAppsFilterLevel(); default_apps_ready_ = true; if (!default_apps_ready_callback_.is_null()) - default_apps_ready_callback_.Run(); + std::move(default_apps_ready_callback_).Run(); StartPrefs(); } @@ -900,10 +880,9 @@ void ArcAppListPrefs::RegisterDefaultApps() { // Report default apps first, note, app_map includes uninstalled and filtered // out apps as well. - for (const auto& default_app : default_apps_.app_map()) { + for (const auto& default_app : default_apps_->GetActiveApps()) { const std::string& app_id = default_app.first; - if (!default_apps_.HasApp(app_id)) - continue; + DCHECK(default_apps_->HasApp(app_id)); // Skip already tracked app. if (tracked_apps_.count(app_id)) { // Notify that icon is ready for default app. @@ -914,7 +893,7 @@ continue; } - const ArcDefaultAppList::AppInfo& app_info = *default_app.second.get(); + const ArcDefaultAppList::AppInfo& app_info = *default_app.second; AddAppAndShortcut(app_info.name, app_info.package_name, app_info.activity, std::string() /* intent_uri */, std::string() /* icon_resource_id */, false /* sticky */, @@ -930,7 +909,8 @@ LOG(ERROR) << package_name << " can not be found."; return nullptr; } - ScopedArcPrefUpdate update(prefs_, package_name, arc::prefs::kArcPackages); + arc::ArcAppScopedPrefUpdate update(prefs_, package_name, + arc::prefs::kArcPackages); return update.Get()->FindKey(key); } @@ -941,16 +921,17 @@ LOG(ERROR) << package_name << " can not be found."; return; } - ScopedArcPrefUpdate update(prefs_, package_name, arc::prefs::kArcPackages); + arc::ArcAppScopedPrefUpdate update(prefs_, package_name, + arc::prefs::kArcPackages); update.Get()->SetKey(key, std::move(value)); } -void ArcAppListPrefs::SetDefaltAppsReadyCallback(base::Closure callback) { +void ArcAppListPrefs::SetDefaltAppsReadyCallback(base::OnceClosure callback) { DCHECK(!callback.is_null()); DCHECK(default_apps_ready_callback_.is_null()); - default_apps_ready_callback_ = callback; + default_apps_ready_callback_ = std::move(callback); if (default_apps_ready_) - default_apps_ready_callback_.Run(); + std::move(default_apps_ready_callback_).Run(); } void ArcAppListPrefs::SimulateDefaultAppAvailabilityTimeoutForTesting() { @@ -1019,7 +1000,6 @@ const bool launchable) { const std::string app_id = shortcut ? GetAppId(package_name, intent_uri) : GetAppId(package_name, activity); - // Do not add Play Store app for Public Session and Kiosk modes. if (app_id == arc::kPlayStoreAppId && arc::IsRobotOrOfflineDemoAccountMode()) return; @@ -1041,7 +1021,7 @@ } } - ScopedArcPrefUpdate update(prefs_, app_id, arc::prefs::kArcApps); + arc::ArcAppScopedPrefUpdate update(prefs_, app_id, arc::prefs::kArcApps); base::DictionaryValue* app_dict = update.Get(); app_dict->SetString(kName, updated_name); app_dict->SetString(kPackageName, package_name); @@ -1081,6 +1061,7 @@ } else { for (auto& observer : observer_list_) observer.OnAppRegistered(app_id, app_info); + default_apps_->SetAppHidden(app_id, false); tracked_apps_.insert(app_id); } @@ -1102,9 +1083,8 @@ void ArcAppListPrefs::RemoveApp(const std::string& app_id) { // Delete cached icon if there is any. std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = GetApp(app_id); - if (app_info && !app_info->icon_resource_id.empty()) { + if (app_info && !app_info->icon_resource_id.empty()) arc::RemoveCachedIcon(app_info->icon_resource_id); - } MaybeRemoveIconRequestRecord(app_id); @@ -1112,6 +1092,9 @@ ready_apps_.erase(app_id); active_icons_.erase(app_id); + // In case default app, mark it as hidden. + default_apps_->SetAppHidden(app_id, true); + // Remove asyncronously local data on file system. ScheduleAppFolderDeletion(app_id); @@ -1128,17 +1111,17 @@ } void ArcAppListPrefs::AddOrUpdatePackagePrefs( - PrefService* prefs, const arc::mojom::ArcPackageInfo& package) { + const arc::mojom::ArcPackageInfo& package) { DCHECK(IsArcAndroidEnabledForProfile(profile_)); const std::string& package_name = package.package_name; - default_apps_.MaybeMarkPackageUninstalled(package_name, false); if (package_name.empty()) { VLOG(2) << "Package name cannot be empty."; return; } - ScopedArcPrefUpdate update(prefs, package_name, arc::prefs::kArcPackages); + arc::ArcAppScopedPrefUpdate update(prefs_, package_name, + arc::prefs::kArcPackages); base::DictionaryValue* package_dict = update.Get(); const std::string id_str = base::Int64ToString(package.last_backup_android_id); @@ -1163,20 +1146,10 @@ InvalidatePackageIcons(package_name); } -void ArcAppListPrefs::RemovePackageFromPrefs(PrefService* prefs, - const std::string& package_name) { - default_apps_.MaybeMarkPackageUninstalled(package_name, true); - if (!default_apps_.HasPackage(package_name)) { - DictionaryPrefUpdate update(prefs, arc::prefs::kArcPackages); - base::DictionaryValue* packages = update.Get(); - const bool removed = packages->RemoveWithoutPathExpansion(package_name, - nullptr); - DCHECK(removed); - } else { - ScopedArcPrefUpdate update(prefs, package_name, arc::prefs::kArcPackages); - base::DictionaryValue* package_dict = update.Get(); - package_dict->SetBoolean(kUninstalled, true); - } +void ArcAppListPrefs::RemovePackageFromPrefs(const std::string& package_name) { + DictionaryPrefUpdate(prefs_, arc::prefs::kArcPackages) + .Get() + ->RemoveKey(package_name); } void ArcAppListPrefs::OnAppListRefreshed( @@ -1214,7 +1187,7 @@ NotifyAppStatesChanged(app_id); } else { // Default apps may not be installed yet at this moment. - if (!default_apps_.HasApp(app_id)) + if (!default_apps_->HasApp(app_id)) RemoveApp(app_id); } } @@ -1238,7 +1211,7 @@ } void ArcAppListPrefs::DetectDefaultAppAvailability() { - for (const auto& package : default_apps_.GetActivePackages()) { + for (const auto& package : default_apps_->GetActivePackages()) { // Check if already installed or installation in progress. if (!GetPackage(package) && !default_apps_installations_.count(package)) HandlePackageRemoved(package); @@ -1247,7 +1220,7 @@ void ArcAppListPrefs::MaybeSetDefaultAppLoadingTimeout() { // Find at least one not installed default app package. - for (const auto& package : default_apps_.GetActivePackages()) { + for (const auto& package : default_apps_->GetActivePackages()) { if (!GetPackage(package)) { detect_default_app_availability_timeout_.Start(FROM_HERE, kDetectDefaultAppAvailabilityTimeout, this, @@ -1313,7 +1286,6 @@ std::unordered_set<std::string> apps_to_remove = GetAppsForPackage(package_name); - default_apps_.MaybeMarkPackageUninstalled(package_name, false); for (const auto& app : apps) { const std::string app_id = GetAppId(app->package_name, app->activity); @@ -1420,7 +1392,7 @@ for (const auto& app_id : apps_to_remove) RemoveApp(app_id); - RemovePackageFromPrefs(prefs_, package_name); + RemovePackageFromPrefs(package_name); } void ArcAppListPrefs::OnPackageRemoved(const std::string& package_name) { @@ -1553,7 +1525,7 @@ if (app_package_name != package_name) { continue; } - ScopedArcPrefUpdate update(prefs_, app.key(), arc::prefs::kArcApps); + arc::ArcAppScopedPrefUpdate update(prefs_, app.key(), arc::prefs::kArcApps); base::DictionaryValue* updateing_app_dict = update.Get(); updateing_app_dict->SetBoolean(kNotificationsEnabled, enabled); } @@ -1570,7 +1542,7 @@ arc::mojom::ArcPackageInfoPtr package_info) { DCHECK(IsArcAndroidEnabledForProfile(profile_)); - AddOrUpdatePackagePrefs(prefs_, *package_info); + AddOrUpdatePackagePrefs(*package_info); for (auto& observer : observer_list_) observer.OnPackageInstalled(*package_info); } @@ -1578,7 +1550,7 @@ void ArcAppListPrefs::OnPackageModified( arc::mojom::ArcPackageInfoPtr package_info) { DCHECK(IsArcAndroidEnabledForProfile(profile_)); - AddOrUpdatePackagePrefs(prefs_, *package_info); + AddOrUpdatePackagePrefs(*package_info); for (auto& observer : observer_list_) observer.OnPackageModified(*package_info); } @@ -1591,13 +1563,13 @@ std::unordered_set<std::string> current_packages; for (const auto& package : packages) { - AddOrUpdatePackagePrefs(prefs_, *package); + AddOrUpdatePackagePrefs(*package); current_packages.insert((*package).package_name); } for (const auto& package_name : old_packages) { if (!current_packages.count(package_name)) - RemovePackageFromPrefs(prefs_, package_name); + RemovePackageFromPrefs(package_name); } package_list_initial_refreshed_ = true; @@ -1685,7 +1657,7 @@ if (!package_name.has_value()) return; - if (default_apps_.HasPackage(*package_name)) + if (default_apps_->HasPackage(*package_name)) default_apps_installations_.insert(*package_name); for (auto& observer : observer_list_) @@ -1694,7 +1666,7 @@ void ArcAppListPrefs::OnInstallationFinished( arc::mojom::InstallationResultPtr result) { - if (result && default_apps_.HasPackage(result->package_name)) { + if (result && default_apps_->HasPackage(result->package_name)) { default_apps_installations_.erase(result->package_name); if (!result->success && !GetPackage(result->package_name))
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h index e2f65da..f52a4b3 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h +++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h
@@ -24,12 +24,12 @@ #include "chrome/browser/chromeos/arc/arc_session_manager.h" #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h" #include "chrome/browser/ui/app_list/arc/arc_app_icon_descriptor.h" -#include "chrome/browser/ui/app_list/arc/arc_default_app_list.h" #include "components/arc/common/app.mojom.h" #include "components/arc/connection_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "ui/base/layout.h" +class ArcDefaultAppList; class PrefService; class Profile; @@ -56,7 +56,6 @@ public arc::mojom::AppHost, public arc::ConnectionObserver<arc::mojom::AppInstance>, public arc::ArcSessionManager::Observer, - public ArcDefaultAppList::Delegate, public arc::ArcPolicyBridge::Observer { public: struct AppInfo { @@ -273,9 +272,6 @@ // arc::ArcSessionManager::Observer: void OnArcPlayStoreEnabledChanged(bool enabled) override; - // ArcDefaultAppList::Delegate: - void OnDefaultAppsReady() override; - // arc::ArcPolicyBridge::Observer: void OnPolicySent(const std::string& policy) override; @@ -307,7 +303,7 @@ const std::string& key, base::Value value); - void SetDefaltAppsReadyCallback(base::Closure callback); + void SetDefaltAppsReadyCallback(base::OnceClosure callback); void SimulateDefaultAppAvailabilityTimeoutForTesting(); private: @@ -391,11 +387,9 @@ const bool shortcut, const bool launchable); // Adds or updates local pref for given package. - void AddOrUpdatePackagePrefs(PrefService* prefs, - const arc::mojom::ArcPackageInfo& package); + void AddOrUpdatePackagePrefs(const arc::mojom::ArcPackageInfo& package); // Removes given package from local pref. - void RemovePackageFromPrefs(PrefService* prefs, - const std::string& package_name); + void RemovePackageFromPrefs(const std::string& package_name); void DisableAllApps(); void RemoveAllAppsAndPackages(); @@ -492,6 +486,9 @@ const std::vector<uint8_t>& icon_png_data); void DiscardResizeRequest(ResizeRequest* request); + // Callback called once default apps are ready. + void OnDefaultAppsReady(); + Profile* const profile_; // Owned by the BrowserContext. @@ -543,8 +540,8 @@ arc::ArcPackageSyncableService* sync_service_ = nullptr; bool default_apps_ready_ = false; - ArcDefaultAppList default_apps_; - base::Closure default_apps_ready_callback_; + std::unique_ptr<ArcDefaultAppList> default_apps_; + base::OnceClosure default_apps_ready_callback_; // Set of packages installed by policy in case of managed user. std::set<std::string> packages_by_policy_;
diff --git a/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.cc b/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.cc new file mode 100644 index 0000000..502e9dd --- /dev/null +++ b/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.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 "chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h" + +#include "base/values.h" + +namespace arc { + +ArcAppScopedPrefUpdate::ArcAppScopedPrefUpdate(PrefService* service, + const std::string& id, + const std::string& path) + : DictionaryPrefUpdate(service, path), id_(id) {} + +ArcAppScopedPrefUpdate::~ArcAppScopedPrefUpdate() = default; + +base::DictionaryValue* ArcAppScopedPrefUpdate::Get() { + base::DictionaryValue* dict = DictionaryPrefUpdate::Get(); + base::Value* dict_item = + dict->FindKeyOfType(id_, base::Value::Type::DICTIONARY); + if (!dict_item) + dict_item = dict->SetKey(id_, base::Value(base::Value::Type::DICTIONARY)); + return static_cast<base::DictionaryValue*>(dict_item); +} + +} // namespace arc
diff --git a/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h b/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h new file mode 100644 index 0000000..b1e85de --- /dev/null +++ b/chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h
@@ -0,0 +1,43 @@ +// 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_UI_APP_LIST_ARC_ARC_APP_SCOPED_PREF_UPDATE_H_ +#define CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_SCOPED_PREF_UPDATE_H_ + +#include <string> + +#include "base/macros.h" +#include "components/prefs/scoped_user_pref_update.h" + +class PrefService; + +namespace arc { + +// Pref updater for ARC apps. Used in deferent pref sections. +class ArcAppScopedPrefUpdate : public DictionaryPrefUpdate { + public: + // This is used in following cases: + // |path| is "arc.apps" - To update ARC apps preferences. In this case |id| + // defines app id. + // |path| is "arc.apps.default" - To update ARC default apps preferences. In + // this case |id| defines app id. + // |path| is "arc.packages" - To update ARC packages preferences. In this case + // |id| is package name. + ArcAppScopedPrefUpdate(PrefService* service, + const std::string& id, + const std::string& path); + ~ArcAppScopedPrefUpdate() override; + + // DictionaryPrefUpdate: + base::DictionaryValue* Get() override; + + private: + const std::string id_; + + DISALLOW_COPY_AND_ASSIGN(ArcAppScopedPrefUpdate); +}; + +} // namespace arc + +#endif // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_SCOPED_PREF_UPDATE_H_
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc index 27b2529..691b026 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -2226,10 +2226,45 @@ // Validate that OEM state is preserved. for (const auto& default_app : fake_default_apps()) { const std::string app_id = ArcAppTest::GetAppId(default_app); + EXPECT_TRUE(prefs->IsDefault(app_id)); EXPECT_EQ(oem_states[app_id], prefs->IsOem(app_id)); } } +// Test that validates disabling default app removes app from the list and this +// is persistent in next sessions. +TEST_P(ArcDefaulAppTest, DisableDefaultApps) { + ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); + ASSERT_TRUE(prefs); + + ValidateHaveApps(fake_default_apps()); + + // Install default app. + const arc::mojom::AppInfo default_app = fake_default_apps()[0]; + const std::string app_id = ArcAppTest::GetAppId(default_app); + std::vector<arc::mojom::AppInfo> package_apps; + package_apps.push_back(default_app); + app_instance()->SendPackageAppListRefreshed(default_app.package_name, + package_apps); + std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = prefs->GetApp(app_id); + ASSERT_TRUE(app_info); + EXPECT_TRUE(app_info->ready); + EXPECT_TRUE(prefs->IsDefault(app_id)); + + // Disable default app. In this case list of apps for package is empty. + package_apps.clear(); + app_instance()->SendPackageAppListRefreshed(default_app.package_name, + package_apps); + EXPECT_FALSE(prefs->GetApp(app_id)); + + // Sign-out and sign-in again. Disabled default app should not appear. + RestartArc(); + + prefs = ArcAppListPrefs::Get(profile_.get()); + ASSERT_TRUE(prefs); + EXPECT_FALSE(prefs->GetApp(app_id)); +} + TEST_P(ArcAppLauncherForDefaulAppTest, AppIconUpdated) { ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); ASSERT_NE(nullptr, prefs);
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc index e2ec208..2f630c8 100644 --- a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc +++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
@@ -9,20 +9,26 @@ #include "base/path_service.h" #include "base/task/post_task.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/browser/ui/app_list/arc/arc_app_scoped_pref_update.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" #include "chrome/common/chrome_paths.h" #include "components/arc/arc_util.h" +#include "components/pref_registry/pref_registry_syncable.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/extension_system.h" namespace { -const char kActivity[] = "activity"; -const char kAppPath[] = "app_path"; -const char kName[] = "name"; -const char kOem[] = "oem"; -const char kPackageName[] = "package_name"; +constexpr char kActivity[] = "activity"; +constexpr char kAppPath[] = "app_path"; +constexpr char kName[] = "name"; +constexpr char kOem[] = "oem"; +constexpr char kPackageName[] = "package_name"; + +constexpr char kDefaultApps[] = "arc.apps.default"; +constexpr char kHidden[] = "hidden"; // Sub-directory wher ARC apps forward declarations are stored. const base::FilePath::CharType kArcDirectory[] = FILE_PATH_LITERAL("arc"); @@ -114,6 +120,16 @@ return apps; } +// Returns true if default app |app_id| is marked as hidden in the prefs. +bool IsAppHidden(const PrefService* prefs, const std::string& app_id) { + const base::DictionaryValue* apps_dict = prefs->GetDictionary(kDefaultApps); + const base::DictionaryValue* app_dict; + if (!apps_dict || !apps_dict->GetDictionary(app_id, &app_dict)) + return false; + bool hidden = false; + return app_dict->GetBoolean(kHidden, &hidden) && hidden; +} + } // namespace // static @@ -121,10 +137,17 @@ use_test_apps_directory = true; } -ArcDefaultAppList::ArcDefaultAppList(Delegate* delegate, - content::BrowserContext* context) - : delegate_(delegate), context_(context), weak_ptr_factory_(this) { - CHECK(delegate_); +// static +void ArcDefaultAppList::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + registry->RegisterDictionaryPref(kDefaultApps); +} + +ArcDefaultAppList::ArcDefaultAppList(Profile* profile, + base::OnceClosure ready_callback) + : profile_(profile), + ready_callback_(std::move(ready_callback)), + weak_ptr_factory_(this) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); // Once ready OnAppsReady is called. @@ -135,17 +158,22 @@ weak_ptr_factory_.GetWeakPtr())); } -ArcDefaultAppList::~ArcDefaultAppList() {} +ArcDefaultAppList::~ArcDefaultAppList() = default; void ArcDefaultAppList::OnAppsReady(std::unique_ptr<AppInfoMap> apps) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - apps_.swap(*apps.get()); + const PrefService* const prefs = profile_->GetPrefs(); + for (auto& entry : *apps.get()) { + AppInfoMap& app_map = + IsAppHidden(prefs, entry.first) ? hidden_apps_ : visible_apps_; + app_map[entry.first] = std::move(entry.second); + } // Register Play Store as default app. Some services and ArcSupportHost may // not be available in tests. extensions::ExtensionService* service = - extensions::ExtensionSystem::Get(context_)->extension_service(); + extensions::ExtensionSystem::Get(profile_)->extension_service(); const extensions::Extension* arc_host = service ? service->GetInstalledExtension(arc::kPlayStoreAppId) : nullptr; if (arc_host && arc::IsPlayStoreAvailable()) { @@ -155,17 +183,14 @@ arc::kPlayStoreActivity, false /* oem */, base::FilePath() /* app_path */); - apps_.insert( - std::pair<std::string, - std::unique_ptr<ArcDefaultAppList::AppInfo>>( - arc::kPlayStoreAppId, std::move(play_store_app))); + AppInfoMap& app_map = + IsAppHidden(prefs, arc::kPlayStoreAppId) ? hidden_apps_ : visible_apps_; + app_map.insert( + std::pair<std::string, std::unique_ptr<ArcDefaultAppList::AppInfo>>( + arc::kPlayStoreAppId, std::move(play_store_app))); } - // Initially consider packages are installed. - for (const auto& app : apps_) - packages_[app.second->package_name] = false; - - delegate_->OnDefaultAppsReady(); + std::move(ready_callback_).Run(); } const ArcDefaultAppList::AppInfo* ArcDefaultAppList::GetApp( @@ -175,13 +200,8 @@ app_id != arc::kPlayStoreAppId)) { return nullptr; } - const auto it = apps_.find(app_id); - if (it == apps_.end()) - return nullptr; - // Check if its package was uninstalled. - const auto it_package = packages_.find(it->second->package_name); - DCHECK(it_package != packages_.end()); - if (it_package->second) + const auto it = visible_apps_.find(app_id); + if (it == visible_apps_.end()) return nullptr; return it->second.get(); } @@ -191,23 +211,54 @@ } bool ArcDefaultAppList::HasPackage(const std::string& package_name) const { - return packages_.count(package_name); + for (const auto& it : visible_apps_) { + if (it.second->package_name == package_name) + return true; + } + return false; } -void ArcDefaultAppList::MaybeMarkPackageUninstalled( - const std::string& package_name, bool uninstalled) { - auto it = packages_.find(package_name); - if (it == packages_.end()) +void ArcDefaultAppList::SetAppHidden(const std::string& app_id, bool hidden) { + AppInfoMap& active_map = hidden ? visible_apps_ : hidden_apps_; + AppInfoMap& inactive_map = hidden ? hidden_apps_ : visible_apps_; + + auto it = active_map.find(app_id); + if (it == active_map.end()) return; - it->second = uninstalled; + inactive_map[app_id] = std::move(it->second); + active_map.erase(it); + + // Store hidden flag. + arc::ArcAppScopedPrefUpdate(profile_->GetPrefs(), app_id, kDefaultApps) + .Get() + ->SetBoolean(kHidden, hidden); +} + +void ArcDefaultAppList::SetAppsHiddenForPackage( + const std::string& package_name) { + std::unordered_set<std::string> apps_to_hide; + for (const auto& app : visible_apps_) { + if (app.second->package_name == package_name) + apps_to_hide.insert(app.first); + } + for (const auto& app : apps_to_hide) + SetAppHidden(app, true); +} + +std::map<std::string, const ArcDefaultAppList::AppInfo*> +ArcDefaultAppList::GetActiveApps() const { + std::map<std::string, const AppInfo*> result; + for (const auto& it : visible_apps_) { + if (HasApp(it.first)) + result[it.first] = it.second.get(); + } + return result; } std::unordered_set<std::string> ArcDefaultAppList::GetActivePackages() const { std::unordered_set<std::string> result; - for (const auto& package_info : packages_) { - if (!package_info.second) - result.insert(package_info.first); - } + for (const auto& it : GetActiveApps()) + result.insert(it.second->package_name); return result; }
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.h b/chrome/browser/ui/app_list/arc/arc_default_app_list.h index fd34180..c1d8929 100644 --- a/chrome/browser/ui/app_list/arc/arc_default_app_list.h +++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.h
@@ -13,25 +13,20 @@ #include <string> #include <unordered_set> +#include "base/callback.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -namespace content { -class BrowserContext; -} +class Profile; + +namespace user_prefs { +class PrefRegistrySyncable; +} // namespace user_prefs // Contains map of default pre-installed apps and packages. class ArcDefaultAppList { public: - class Delegate { - public: - virtual void OnDefaultAppsReady() = 0; - - protected: - virtual ~Delegate() {} - }; - struct AppInfo { AppInfo(const std::string& name, const std::string& package_name, @@ -61,9 +56,10 @@ // Defines App id to default AppInfo mapping. using AppInfoMap = std::map<std::string, std::unique_ptr<AppInfo>>; - ArcDefaultAppList(Delegate* delegate, content::BrowserContext* context); + ArcDefaultAppList(Profile* profile, base::OnceClosure ready_callback); ~ArcDefaultAppList(); + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); static void UseTestAppsDirectory(); // Returns default app info if it is found in defaults and its package is not @@ -75,34 +71,35 @@ // Returns true if package exists in default packages list. Note it may be // marked as uninstalled. bool HasPackage(const std::string& package_name) const; - // Sets uninstalled flag for default package if it exists in default packages - // list. - void MaybeMarkPackageUninstalled(const std::string& package_name, - bool uninstalled); + // Marks default app |app_id| as hidden in case |hidden| is true. + void SetAppHidden(const std::string& app_id, bool hidden); + // Marks all default apps from the package |package_name| as hidden. + void SetAppsHiddenForPackage(const std::string& package_name); - // Returns set of packages which are marked not as uninstalled. + // Returns map of apps that are visible and not filtered. + std::map<std::string, const AppInfo*> GetActiveApps() const; + // Returns set of packages that covers active apps. std::unordered_set<std::string> GetActivePackages() const; - const AppInfoMap& app_map() const { return apps_; } - void set_filter_level(FilterLevel filter_level) { filter_level_ = filter_level; } private: - // Defines mapping package name to uninstalled state. - using PackageMap = std::map<std::string, bool>; - - // Called when default apps are read. + // Called when default apps are ready. void OnAppsReady(std::unique_ptr<AppInfoMap> apps); // Unowned pointer. - Delegate* const delegate_; - content::BrowserContext* const context_; + Profile* profile_; + + base::OnceClosure ready_callback_; + FilterLevel filter_level_ = FilterLevel::ALL; - AppInfoMap apps_; - PackageMap packages_; + // Keeps visible apps. + AppInfoMap visible_apps_; + // Keeps hidden apps. + AppInfoMap hidden_apps_; base::WeakPtrFactory<ArcDefaultAppList> weak_ptr_factory_;
diff --git a/chrome/browser/ui/app_list/search/tests/app_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/tests/app_search_provider_unittest.cc index 7dbbef5..7e973fe 100644 --- a/chrome/browser/ui/app_list/search/tests/app_search_provider_unittest.cc +++ b/chrome/browser/ui/app_list/search/tests/app_search_provider_unittest.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/ui/app_list/arc/arc_app_item.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/app_list/arc/arc_app_test.h" +#include "chrome/browser/ui/app_list/arc/arc_default_app_list.h" #include "chrome/browser/ui/app_list/extension_app_model_builder.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" #include "chrome/browser/ui/app_list/search/search_result_ranker/app_search_result_ranker.h"
diff --git a/chrome/browser/ui/ash/ash_util.cc b/chrome/browser/ui/ash/ash_util.cc index 377185b..8cbda3f 100644 --- a/chrome/browser/ui/ash/ash_util.cc +++ b/chrome/browser/ui/ash/ash_util.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ui/ash/ash_util.h" #include "ash/accelerators/accelerator_controller.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/interfaces/event_properties.mojom.h" #include "ash/shell.h"
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/chrome_keyboard_ui.cc index aff15ce..ca17d37 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_ui.cc +++ b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
@@ -33,6 +33,7 @@ #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tree_host.h" #include "ui/base/ime/chromeos/input_method_manager.h" +#include "ui/base/ime/ime_bridge.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/text_input_client.h" #include "ui/compositor/scoped_layer_animation_settings.h" @@ -234,9 +235,15 @@ } ui::InputMethod* ChromeKeyboardUI::GetInputMethod() { - aura::Window* root_window = ash::Shell::GetRootWindowForNewWindows(); - DCHECK(root_window); - return root_window->GetHost()->GetInputMethod(); + ui::IMEBridge* bridge = ui::IMEBridge::Get(); + if (!bridge || !bridge->GetInputContextHandler()) { + // Needed by a handful of browser tests that use MockInputMethod. + return ash::Shell::GetRootWindowForNewWindows() + ->GetHost() + ->GetInputMethod(); + } + + return bridge->GetInputContextHandler()->GetInputMethod(); } void ChromeKeyboardUI::SetController(keyboard::KeyboardController* controller) {
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc index c0056e4f..01736610 100644 --- a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc +++ b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
@@ -24,7 +24,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/syslog_logging.h" #include "base/task/post_task.h" -#include "base/threading/thread_restrictions.h" +#include "base/threading/scoped_blocking_call.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/drive/file_system_util.h" @@ -113,7 +113,7 @@ } void ReadFileAndCopyToClipboardLocal(const base::FilePath& screenshot_path) { - base::AssertBlockingAllowed(); + base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::WILL_BLOCK); scoped_refptr<base::RefCountedString> png_data(new base::RefCountedString()); if (!base::ReadFileToString(screenshot_path, &(png_data->data()))) { LOG(ERROR) << "Failed to read the screenshot file: "
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc index a82f426..02a7700b 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -24,8 +24,6 @@ #include "ash/public/cpp/window_properties.h" #include "ash/shelf/shelf_application_menu_model.h" #include "ash/shelf/shelf_controller.h" -#include "ash/shell.h" -#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/command_line.h" #include "base/compiler_specific.h" #include "base/files/file_path.h" @@ -119,6 +117,7 @@ #include "ui/aura/client/window_parenting_client.h" #include "ui/aura/window.h" #include "ui/base/models/menu_model.h" +#include "ui/base/resource/resource_bundle.h" #include "ui/display/display.h" #include "ui/display/display_switches.h" #include "ui/display/screen.h"
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc index 7dbaba1..f4e9dfd6 100644 --- a/chrome/browser/ui/ash/login_screen_client.cc +++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -124,6 +124,11 @@ login_screen_->HandleFocusLeavingLockScreenApps(reverse); } +void LoginScreenClient::FocusOobeDialog() { + if (delegate_) + delegate_->HandleFocusOobeDialog(); +} + void LoginScreenClient::ShowGaiaSignin( bool can_close, const base::Optional<AccountId>& prefilled_account) {
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h index 75c3e322..f693c31 100644 --- a/chrome/browser/ui/ash/login_screen_client.h +++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -40,6 +40,7 @@ // focus has been handed over to a lock screen app. For example, this might // fail if a hander for lock screen apps focus has not been set. virtual bool HandleFocusLockScreenApps(bool reverse) = 0; + virtual void HandleFocusOobeDialog() = 0; virtual void HandleLoginAsGuest() = 0; virtual void HandleLaunchPublicSession(const AccountId& account_id, const std::string& locale, @@ -78,6 +79,7 @@ void LoginAsGuest() override; void OnMaxIncorrectPasswordAttempted(const AccountId& account_id) override; void FocusLockScreenApps(bool reverse) override; + void FocusOobeDialog() override; void ShowGaiaSignin( bool can_close, const base::Optional<AccountId>& prefilled_account) override;
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 8bdc956..9775dca 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1212,6 +1212,19 @@ instant_controller_.reset(); } +void Browser::SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) { + window_->SetTopControlsShownRatio(web_contents, ratio); +} + +int Browser::GetTopControlsHeight() const { + return window_->GetTopControlsHeight(); +} + +void Browser::SetTopControlsGestureScrollInProgress(bool in_progress) { + window_->SetTopControlsGestureScrollInProgress(in_progress); +} + bool Browser::CanOverscrollContent() const { #if defined(OS_WIN) // Don't enable overscroll on Windows machines unless they have a touch
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 48bc28d..2371095 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -470,6 +470,10 @@ void TabStripEmpty() override; // Overridden from content::WebContentsDelegate: + void SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) override; + int GetTopControlsHeight() const override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; bool CanOverscrollContent() const override; bool ShouldPreserveAbortedURLs(content::WebContents* source) override; void SetFocusToLocationBar(bool select_all) override;
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 4d9d014c..5e014bb 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -552,6 +552,7 @@ // opener. params.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX | TabStripModel::ADD_INHERIT_OPENER; + params.input_start = location_bar->GetMatchSelectionTimestamp(); Navigate(¶ms); #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc index 4d79f256..52c7f3e1 100644 --- a/chrome/browser/ui/browser_focus_uitest.cc +++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -657,7 +657,8 @@ // Simulate an alt-enter. controller->OnAutocompleteAccept( url2, WindowOpenDisposition::NEW_FOREGROUND_TAB, - ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::URL_WHAT_YOU_TYPED); + ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::URL_WHAT_YOU_TYPED, + base::TimeTicks()); // Make sure the second tab is selected. EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc index 7d3ebdaa..dc104b41 100644 --- a/chrome/browser/ui/browser_navigator.cc +++ b/chrome/browser/ui/browser_navigator.cc
@@ -325,6 +325,7 @@ load_url_params.started_from_context_menu = params->started_from_context_menu; load_url_params.has_user_gesture = params->user_gesture; load_url_params.blob_url_loader_factory = params->blob_url_loader_factory; + load_url_params.input_start = params->input_start; // |frame_tree_node_id| is kNoFrameTreeNodeId for main frame navigations. if (params->frame_tree_node_id ==
diff --git a/chrome/browser/ui/browser_navigator_params.h b/chrome/browser/ui/browser_navigator_params.h index f67a79e5..0287a567 100644 --- a/chrome/browser/ui/browser_navigator_params.h +++ b/chrome/browser/ui/browser_navigator_params.h
@@ -253,6 +253,11 @@ // possible, i.e. if the is a PWA installed for the target URL. bool open_pwa_window_if_possible = false; + // The time when the input which led to the navigation occurred. Currently + // only set when a link is clicked or the navigation takes place from the + // desktop omnibox. + base::TimeTicks input_start; + private: NavigateParams(); DISALLOW_COPY_AND_ASSIGN(NavigateParams);
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 3957f27..1e94c1c 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h
@@ -114,6 +114,24 @@ ////////////////////////////////////////////////////////////////////////////// // Browser specific methods: + // Sets the shown |ratio| of the browser's top controls (a.k.a. top-chrome) as + // a result of gesture scrolling in |web_contents|. + virtual void SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) = 0; + + // Returns the height of the browser's top controls. This height doesn't + // change with the current shown ratio above. Renderers will call this to + // calculate the top-chrome shown ratio from the gesture scroll offset. + // + // Note: This should always return 0 if hiding top-chrome with page gesture + // scrolls is disabled. This is needed so the renderer scrolls the page + // immediately rather than changing the shown ratio, thinking that top-chrome + // and the page's top edge are moving. + virtual int GetTopControlsHeight() const = 0; + + // Propagates to the browser that gesture scrolling has changed state. + virtual void SetTopControlsGestureScrollInProgress(bool in_progress) = 0; + // Return the status bubble associated with the frame virtual StatusBubble* GetStatusBubble() = 0;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm index a4cfef1..2321db30 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
@@ -34,7 +34,7 @@ NSArray* types = @[ NSStringPboardType, NSHTMLPboardType, NSURLPboardType, ui::ClipboardUtil::UTIForPasteboardType(kBookmarkButtonDragType), - ui::ClipboardUtil::UTIForPasteboardType(kBookmarkDictionaryListPboardType) + kUTTypeChromiumBookmarkDictionaryList ]; [self registerForDraggedTypes:types]; }
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.mm index 1bc5bbe9..f029be2 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.mm
@@ -130,7 +130,7 @@ NSArray* types = @[ NSStringPboardType, NSHTMLPboardType, NSURLPboardType, ui::ClipboardUtil::UTIForPasteboardType(kBookmarkButtonDragType), - ui::ClipboardUtil::UTIForPasteboardType(kBookmarkDictionaryListPboardType) + kUTTypeChromiumBookmarkDictionaryList ]; [self registerForDraggedTypes:types]; }
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_button.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_button.h index 8ebdffd0..4de015b 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_button.h +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_button.h
@@ -114,7 +114,7 @@ - (BOOL)dragBookmarkData:(id<NSDraggingInfo>)info; // Determine if the drag pasteboard has any drag data of type -// kBookmarkDictionaryListPboardType and, if so, return those elements +// kUTTypeChromiumBookmarkDictionaryList and, if so, return those elements // otherwise return an empty vector. - (std::vector<const bookmarks::BookmarkNode*>)retrieveBookmarkNodeData;
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.h b/chrome/browser/ui/cocoa/browser_window_cocoa.h index db17a16..2eacdad2 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.h +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.h
@@ -54,6 +54,10 @@ bool IsAlwaysOnTop() const override; void SetAlwaysOnTop(bool always_on_top) override; gfx::NativeWindow GetNativeWindow() const override; + void SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) override; + int GetTopControlsHeight() const override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; StatusBubble* GetStatusBubble() override; void UpdateTitleBar() override; void BookmarkBarStateChanged(
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm index c1f2ec89..105f9802 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
@@ -251,6 +251,22 @@ return window(); } +void BrowserWindowCocoa::SetTopControlsShownRatio( + content::WebContents* web_contents, + float ratio) { + NOTIMPLEMENTED(); +} + +int BrowserWindowCocoa::GetTopControlsHeight() const { + NOTIMPLEMENTED(); + return 0; +} + +void BrowserWindowCocoa::SetTopControlsGestureScrollInProgress( + bool in_progress) { + NOTIMPLEMENTED(); +} + StatusBubble* BrowserWindowCocoa::GetStatusBubble() { return [controller_ statusBubble]; }
diff --git a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm index 0167848..824117d 100644 --- a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm +++ b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm
@@ -27,8 +27,8 @@ } - (BOOL)isFullscreenTransitionInProgress { - views::BridgedNativeWidget* bridge_widget = - views::NativeWidgetMac::GetBridgeForNativeWindow([self window]); + views::BridgedNativeWidgetImpl* bridge_widget = + views::NativeWidgetMac::GetBridgeImplForNativeWindow([self window]); return bridge_widget->in_fullscreen_transition(); } @@ -36,8 +36,8 @@ NSWindow* ns_window = browserView_->GetNativeWindow(); if (!ns_view_) { ns_view_.reset( - [views::NativeWidgetMac::GetBridgeForNativeWindow(ns_window)->ns_view() - retain]); + [views::NativeWidgetMac::GetBridgeImplForNativeWindow(ns_window) + ->ns_view() retain]); } return ns_window; }
diff --git a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h index 014c0fa..953483b 100644 --- a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h +++ b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h
@@ -71,7 +71,9 @@ GURL GetDestinationURL() const override; WindowOpenDisposition GetWindowOpenDisposition() const override; ui::PageTransition GetPageTransition() const override; + base::TimeTicks GetMatchSelectionTimestamp() const override; void AcceptInput() override; + void AcceptInput(base::TimeTicks match_selection_timestamp) override; void FocusLocation(bool select_all) override; void FocusSearch() override; void UpdateContentSettingsIcons() override;
diff --git a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm index f0b708f..27df49c 100644 --- a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm +++ b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm
@@ -153,10 +153,20 @@ return transition(); } +base::TimeTicks LocationBarViewMac::GetMatchSelectionTimestamp() const { + return match_selection_timestamp(); +} + void LocationBarViewMac::AcceptInput() { + AcceptInput(base::TimeTicks()); +} + +void LocationBarViewMac::AcceptInput( + base::TimeTicks match_selection_timestamp) { WindowOpenDisposition disposition = ui::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); - omnibox_view_->model()->AcceptInput(disposition, false); + omnibox_view_->model()->AcceptInput(disposition, false, + match_selection_timestamp); } void LocationBarViewMac::FocusLocation(bool select_all) {
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm index 1b0f424..8a19238d0 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm
@@ -331,5 +331,5 @@ WindowOpenDisposition disposition) { DCHECK_LT(row, GetResult().size()); omnibox_view_->OpenMatch(GetResult().match_at(row), disposition, GURL(), - base::string16(), row); + base::string16(), row, base::TimeTicks()); }
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h index b8f86d7..222d8dd 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h
@@ -60,7 +60,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) override; + size_t selected_line, + base::TimeTicks match_selection_timestamp) override; base::string16 GetText() const override; void SetWindowTextAndCaretPos(const base::string16& text, size_t caret_pos,
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm index b460c52..beb982f 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
@@ -259,12 +259,13 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) { + size_t selected_line, + base::TimeTicks match_selection_timestamp) { // Coalesce text and selection updates from the following function. If we // don't do this, the user may see intermediate states as brief flickers. in_coalesced_update_block_ = true; - OmniboxView::OpenMatch( - match, disposition, alternate_nav_url, pasted_text, selected_line); + OmniboxView::OpenMatch(match, disposition, alternate_nav_url, pasted_text, + selected_line, match_selection_timestamp); in_coalesced_update_block_ = false; if (do_coalesced_text_update_) { SetText(coalesced_text_update_);
diff --git a/chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.mm b/chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.mm index 753e4c8..87dbb0f 100644 --- a/chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.mm +++ b/chrome/browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.mm
@@ -10,7 +10,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/signin_promo.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/ui/browser.h" #import "chrome/browser/ui/cocoa/browser_window_utils.h" #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.h" @@ -19,6 +18,7 @@ #include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" #include "chrome/common/url_constants.h" #include "components/signin/core/browser/profile_management_switches.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" @@ -29,8 +29,8 @@ // Width of the different dialogs that make up the signin flow. const int kModalDialogWidth = 448; -// Width of the confirmation dialog with DICE. -const int kModalDialogWidthForDice = 512; +// Width of the confirmation dialog with Unified Consent is enabled. +const int kModalDialogWidthForUnifiedConsent = 512; // Height of the tab-modal dialog displaying the password-separated signin // flow. It matches the dimensions of the server content the dialog displays. @@ -50,10 +50,11 @@ } int GetSyncConfirmationDialogPreferredWidth(Profile* profile) { - // If unified-consent enabled, we show a different sync confirmation dialog + // If unified consent is enabled, we show a different sync confirmation dialog // which uses a different width. - return IsUnifiedConsentFeatureEnabled(profile) && profile->IsSyncAllowed() - ? kModalDialogWidthForDice + return unified_consent::IsUnifiedConsentFeatureEnabled() && + profile->IsSyncAllowed() + ? kModalDialogWidthForUnifiedConsent : kModalDialogWidth; }
diff --git a/chrome/browser/ui/extensions/blocked_action_bubble_browsertest.cc b/chrome/browser/ui/extensions/blocked_action_bubble_browsertest.cc index 5654f87..e97a8803 100644 --- a/chrome/browser/ui/extensions/blocked_action_bubble_browsertest.cc +++ b/chrome/browser/ui/extensions/blocked_action_bubble_browsertest.cc
@@ -48,7 +48,7 @@ base::CommandLine* command_line) { extensions::ExtensionBrowserTest::SetUpCommandLine(command_line); scoped_feature_list_.InitAndEnableFeature( - extensions::features::kRuntimeHostPermissions); + extensions_features::kRuntimeHostPermissions); } void ExtensionBlockedActionsBubbleTest::SetUpOnMainThread() {
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc index a124977..f0f05292 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -120,7 +120,7 @@ // With runtime host permissions, include a "host access" portion of the // tooltip if the extension has or wants access to the site. if (base::FeatureList::IsEnabled( - extensions::features::kRuntimeHostPermissions)) { + extensions_features::kRuntimeHostPermissions)) { PageInteractionStatus interaction_status = GetPageInteractionStatus(web_contents); int interaction_status_description_id = -1; @@ -456,7 +456,7 @@ bool was_blocked = false; bool action_is_visible = extension_action_->GetIsVisible(tab_id); if (base::FeatureList::IsEnabled( - extensions::features::kRuntimeHostPermissions)) { + extensions_features::kRuntimeHostPermissions)) { PageInteractionStatus interaction_status = GetPageInteractionStatus(web_contents); // With the runtime host permissions feature, we only grayscale the icon if
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc index 91ebe31d..cf970ca 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
@@ -81,12 +81,23 @@ // Blocked actions are only present with the runtime host permissions feature. base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( - extensions::features::kRuntimeHostPermissions); + extensions_features::kRuntimeHostPermissions); scoped_refptr<const extensions::Extension> browser_action_ext = - CreateAndAddExtension( - "browser action", - extensions::ExtensionBuilder::ActionType::BROWSER_ACTION); + extensions::ExtensionBuilder("browser action") + .SetAction(extensions::ExtensionBuilder::ActionType::BROWSER_ACTION) + .SetLocation(extensions::Manifest::INTERNAL) + .AddPermission("https://www.google.com/*") + .Build(); + + extensions::ExtensionService* service = + extensions::ExtensionSystem::Get(profile())->extension_service(); + service->GrantPermissions(browser_action_ext.get()); + service->AddExtension(browser_action_ext.get()); + extensions::ScriptingPermissionsModifier permissions_modifier_browser_ext( + profile(), browser_action_ext); + permissions_modifier_browser_ext.SetWithholdHostPermissions(true); + ASSERT_EQ(1u, toolbar_actions_bar()->GetIconCount()); AddTab(browser(), GURL("https://www.google.com/")); @@ -117,7 +128,7 @@ EXPECT_FALSE(image_source->paint_page_action_decoration()); EXPECT_TRUE(image_source->paint_blocked_actions_decoration()); - action_runner->RunBlockedActions(browser_action_ext.get()); + action_runner->RunForTesting(browser_action_ext.get()); image_source = browser_action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); @@ -125,8 +136,17 @@ EXPECT_FALSE(image_source->paint_blocked_actions_decoration()); scoped_refptr<const extensions::Extension> page_action_ext = - CreateAndAddExtension( - "page action", extensions::ExtensionBuilder::ActionType::PAGE_ACTION); + extensions::ExtensionBuilder("page action") + .SetAction(extensions::ExtensionBuilder::ActionType::PAGE_ACTION) + .SetLocation(extensions::Manifest::INTERNAL) + .AddPermission("https://www.google.com/*") + .Build(); + service->GrantPermissions(page_action_ext.get()); + service->AddExtension(page_action_ext.get()); + extensions::ScriptingPermissionsModifier permissions_modifier_page_action( + profile(), page_action_ext); + permissions_modifier_page_action.SetWithholdHostPermissions(true); + ASSERT_EQ(2u, toolbar_actions_bar()->GetIconCount()); ExtensionActionViewController* page_action = static_cast<ExtensionActionViewController*>( @@ -167,9 +187,9 @@ web_contents, false); toolbar_model()->SetVisibleIconCount(2u); - action_runner->RunBlockedActions(page_action_ext.get()); + action_runner->RunForTesting(page_action_ext.get()); image_source = page_action->GetIconImageSourceForTesting(web_contents, size); - EXPECT_TRUE(image_source->grayscale()); + EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_page_action_decoration()); EXPECT_FALSE(image_source->paint_blocked_actions_decoration()); } @@ -233,7 +253,7 @@ PermissionType permission_type) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( - extensions::features::kRuntimeHostPermissions); + extensions_features::kRuntimeHostPermissions); scoped_refptr<const extensions::Extension> extension = CreateExtension(permission_type); @@ -399,7 +419,7 @@ TEST_P(ToolbarActionsBarUnitTest, RuntimeHostsTooltip) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( - extensions::features::kRuntimeHostPermissions); + extensions_features::kRuntimeHostPermissions); scoped_refptr<const extensions::Extension> extension = extensions::ExtensionBuilder("extension name")
diff --git a/chrome/browser/ui/libgtkui/BUILD.gn b/chrome/browser/ui/libgtkui/BUILD.gn index 3932e0c..ffe7eb80 100644 --- a/chrome/browser/ui/libgtkui/BUILD.gn +++ b/chrome/browser/ui/libgtkui/BUILD.gn
@@ -22,7 +22,6 @@ "gtk_event_loop.h", "gtk_key_bindings_handler.cc", "gtk_key_bindings_handler.h", - "gtk_signal.h", "gtk_ui.cc", "gtk_ui.h", "gtk_util.cc",
diff --git a/chrome/browser/ui/libgtkui/app_indicator_icon.h b/chrome/browser/ui/libgtkui/app_indicator_icon.h index 7815fbb..db66890 100644 --- a/chrome/browser/ui/libgtkui/app_indicator_icon.h +++ b/chrome/browser/ui/libgtkui/app_indicator_icon.h
@@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/nix/xdg_util.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" +#include "ui/base/glib/glib_signal.h" #include "ui/views/linux_ui/status_icon_linux.h" typedef struct _AppIndicator AppIndicator;
diff --git a/chrome/browser/ui/libgtkui/app_indicator_icon_menu.h b/chrome/browser/ui/libgtkui/app_indicator_icon_menu.h index 577365a..aecee69 100644 --- a/chrome/browser/ui/libgtkui/app_indicator_icon_menu.h +++ b/chrome/browser/ui/libgtkui/app_indicator_icon_menu.h
@@ -7,7 +7,7 @@ #include "base/callback.h" #include "base/macros.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" +#include "ui/base/glib/glib_signal.h" typedef struct _GtkMenu GtkMenu; typedef struct _GtkWidget GtkWidget; @@ -37,12 +37,16 @@ private: // Callback for when the "click action replacement" menu item is activated. - CHROMEGTK_CALLBACK_0(AppIndicatorIconMenu, - void, - OnClickActionReplacementMenuItemActivated); + CHROMEG_CALLBACK_0(AppIndicatorIconMenu, + void, + OnClickActionReplacementMenuItemActivated, + GtkWidget*); // Callback for when a menu item is activated. - CHROMEGTK_CALLBACK_0(AppIndicatorIconMenu, void, OnMenuItemActivated); + CHROMEG_CALLBACK_0(AppIndicatorIconMenu, + void, + OnMenuItemActivated, + GtkWidget*); // Not owned. ui::MenuModel* menu_model_;
diff --git a/chrome/browser/ui/libgtkui/gtk_signal.h b/chrome/browser/ui/libgtkui/gtk_signal.h deleted file mode 100644 index 36f63b28..0000000 --- a/chrome/browser/ui/libgtkui/gtk_signal.h +++ /dev/null
@@ -1,67 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_LIBGTKUI_GTK_SIGNAL_H_ -#define CHROME_BROWSER_UI_LIBGTKUI_GTK_SIGNAL_H_ - -#include "ui/base/glib/glib_signal.h" - -typedef struct _GtkWidget GtkWidget; - -// These macros handle the common case where the sender object will be a -// GtkWidget*. -#define CHROMEGTK_CALLBACK_0(CLASS, RETURN, METHOD) \ - CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*); - -#define CHROMEGTK_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \ - CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1); - -#define CHROMEGTK_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \ - CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2); - -#define CHROMEGTK_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \ - CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3); - -#define CHROMEGTK_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4) \ - CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, ARG4); - -#define CHROMEGTK_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ - ARG5) \ - CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ - ARG4, ARG5); - -#define CHROMEGTK_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ - ARG5, ARG6) \ - CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ - ARG4, ARG5, ARG6); - -#define CHROMEGTK_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD) \ - CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*); - -#define CHROMEGTK_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \ - CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1); - -#define CHROMEGTK_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \ - CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2); - -#define CHROMEGTK_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \ - CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3); - -#define CHROMEGTK_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4) \ - CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4); - -#define CHROMEGTK_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4, ARG5) \ - CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4, ARG5); - -#define CHROMEGTK_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4, ARG5, ARG6) \ - CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4, ARG5, ARG6); - -#endif // CHROME_BROWSER_UI_LIBGTKUI_GTK_SIGNAL_H_
diff --git a/chrome/browser/ui/libgtkui/gtk_status_icon.h b/chrome/browser/ui/libgtkui/gtk_status_icon.h index f0412024..305bad35 100644 --- a/chrome/browser/ui/libgtkui/gtk_status_icon.h +++ b/chrome/browser/ui/libgtkui/gtk_status_icon.h
@@ -9,7 +9,6 @@ #include "base/macros.h" #include "base/strings/string16.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" #include "ui/base/glib/glib_integers.h" #include "ui/base/glib/glib_signal.h" #include "ui/views/linux_ui/status_icon_linux.h"
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc index 89b62285..841083f 100644 --- a/chrome/browser/ui/libgtkui/gtk_ui.cc +++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -490,18 +490,6 @@ return focus_ring_color_; } -SkColor GtkUi::GetThumbActiveColor() const { - return thumb_active_color_; -} - -SkColor GtkUi::GetThumbInactiveColor() const { - return thumb_inactive_color_; -} - -SkColor GtkUi::GetTrackColor() const { - return track_color_; -} - SkColor GtkUi::GetActiveSelectionBgColor() const { return active_selection_bg_color_; } @@ -880,14 +868,6 @@ UpdateDeviceScaleFactor(); } -void GtkUi::SetScrollbarColors() { - // TODO(thomasanderson): Do not hardcode these values. Get them from the - // theme. - thumb_active_color_ = SkColorSetRGB(244, 244, 244); - thumb_inactive_color_ = SkColorSetRGB(234, 234, 234); - track_color_ = SkColorSetRGB(211, 211, 211); -} - void GtkUi::LoadGtkValues() { // TODO(erg): GtkThemeService had a comment here about having to muck with // the raw Prefs object to remove prefs::kCurrentThemeImages or else we'd @@ -1070,7 +1050,6 @@ ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused); // Generate the colors that we pass to WebKit. - SetScrollbarColors(); focus_ring_color_ = native_theme_->GetSystemColor( ui::NativeTheme::kColorId_FocusedBorderColor);
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.h b/chrome/browser/ui/libgtkui/gtk_ui.h index 6f48994..2aafe24 100644 --- a/chrome/browser/ui/libgtkui/gtk_ui.h +++ b/chrome/browser/ui/libgtkui/gtk_ui.h
@@ -13,8 +13,8 @@ #include "base/macros.h" #include "base/observer_list.h" #include "build/buildflag.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" #include "chrome/browser/ui/libgtkui/libgtkui_export.h" +#include "ui/base/glib/glib_signal.h" #include "ui/gfx/color_utils.h" #include "ui/views/linux_ui/linux_ui.h" #include "ui/views/window/frame_buttons.h" @@ -76,9 +76,6 @@ SkColor* color, PrefService* pref_service) const override; SkColor GetFocusRingColor() const override; - SkColor GetThumbActiveColor() const override; - SkColor GetThumbInactiveColor() const override; - SkColor GetTrackColor() const override; SkColor GetActiveSelectionBgColor() const override; SkColor GetActiveSelectionFgColor() const override; SkColor GetInactiveSelectionBgColor() const override; @@ -130,11 +127,6 @@ void*, GParamSpec*); - // This method returns the colors webkit will use for the scrollbars. When no - // colors are specified by the GTK+ theme, this function averages of the - // thumb part and of the track colors. - void SetScrollbarColors(); - // Extracts colors and tints from the GTK theme, both for the // ThemeService interface and the colors we send to webkit. void LoadGtkValues(); @@ -167,9 +159,6 @@ // Colors that we pass to WebKit. These are generated each time the theme // changes. SkColor focus_ring_color_; - SkColor thumb_active_color_; - SkColor thumb_inactive_color_; - SkColor track_color_; SkColor active_selection_bg_color_; SkColor active_selection_fg_color_; SkColor inactive_selection_bg_color_;
diff --git a/chrome/browser/ui/libgtkui/print_dialog_gtk.h b/chrome/browser/ui/libgtkui/print_dialog_gtk.h index 2fcd59e7..c1c7a2ff 100644 --- a/chrome/browser/ui/libgtkui/print_dialog_gtk.h +++ b/chrome/browser/ui/libgtkui/print_dialog_gtk.h
@@ -13,11 +13,11 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/sequenced_task_runner_helpers.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" #include "content/public/browser/browser_thread.h" #include "printing/print_dialog_gtk_interface.h" #include "printing/printing_context_linux.h" #include "ui/aura/window_observer.h" +#include "ui/base/glib/glib_signal.h" namespace printing { class MetafilePlayer; @@ -61,7 +61,7 @@ ~PrintDialogGtk() override; // Handles dialog response. - CHROMEGTK_CALLBACK_1(PrintDialogGtk, void, OnResponse, int); + CHROMEG_CALLBACK_1(PrintDialogGtk, void, OnResponse, GtkWidget*, int); // Prints document named |document_name|. void SendDocumentToPrinter(const base::string16& document_name);
diff --git a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.cc b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.cc index 19ccd44..e232a7c 100644 --- a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.cc +++ b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.cc
@@ -22,7 +22,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" #include "chrome/browser/ui/libgtkui/gtk_util.h" #include "chrome/browser/ui/libgtkui/select_file_dialog_impl.h" #include "ui/aura/window_observer.h"
diff --git a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h index 524f403..6074bc75 100644 --- a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h +++ b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h
@@ -7,9 +7,9 @@ #include "base/containers/flat_map.h" #include "base/macros.h" -#include "chrome/browser/ui/libgtkui/gtk_signal.h" #include "chrome/browser/ui/libgtkui/gtk_util.h" #include "chrome/browser/ui/libgtkui/select_file_dialog_impl.h" +#include "ui/base/glib/glib_signal.h" namespace libgtkui { @@ -110,28 +110,37 @@ gfx::NativeWindow parent); // Callback for when the user responds to a Save As or Open File dialog. - CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, - void, - OnSelectSingleFileDialogResponse, - int); + CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, + void, + OnSelectSingleFileDialogResponse, + GtkWidget*, + int); // Callback for when the user responds to a Select Folder dialog. - CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, - void, - OnSelectSingleFolderDialogResponse, - int); + CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, + void, + OnSelectSingleFolderDialogResponse, + GtkWidget*, + int); // Callback for when the user responds to a Open Multiple Files dialog. - CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, - void, - OnSelectMultiFileDialogResponse, - int); + CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, + void, + OnSelectMultiFileDialogResponse, + GtkWidget*, + int); // Callback for when the file chooser gets destroyed. - CHROMEGTK_CALLBACK_0(SelectFileDialogImplGTK, void, OnFileChooserDestroy); + CHROMEG_CALLBACK_0(SelectFileDialogImplGTK, + void, + OnFileChooserDestroy, + GtkWidget*); // Callback for when we update the preview for the selection. - CHROMEGTK_CALLBACK_0(SelectFileDialogImplGTK, void, OnUpdatePreview); + CHROMEG_CALLBACK_0(SelectFileDialogImplGTK, + void, + OnUpdatePreview, + GtkWidget*); // The GtkImage widget for showing previews of selected images. GtkWidget* preview_;
diff --git a/chrome/browser/ui/location_bar/location_bar.h b/chrome/browser/ui/location_bar/location_bar.h index 411ed06..7858e11f 100644 --- a/chrome/browser/ui/location_bar/location_bar.h +++ b/chrome/browser/ui/location_bar/location_bar.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include "base/macros.h" +#include "base/time/time.h" #include "ui/base/page_transition_types.h" #include "ui/base/window_open_disposition.h" #include "url/gurl.h" @@ -33,10 +34,16 @@ virtual GURL GetDestinationURL() const = 0; virtual WindowOpenDisposition GetWindowOpenDisposition() const = 0; virtual ui::PageTransition GetPageTransition() const = 0; + virtual base::TimeTicks GetMatchSelectionTimestamp() const = 0; // Accepts the current string of text entered in the location bar. virtual void AcceptInput() = 0; + // Accepts the current string of text entered in the location bar. If + // |match_selection_timestamp| is not null, uses this value to track + // latency of page loads starting at user input. + virtual void AcceptInput(base::TimeTicks match_selection_timestamp) = 0; + // Focuses the location bar. Optionally also selects its contents. virtual void FocusLocation(bool select_all) = 0;
diff --git a/chrome/browser/ui/media_router/media_router_ui_base.cc b/chrome/browser/ui/media_router/media_router_ui_base.cc index 38a6895..a656e0612 100644 --- a/chrome/browser/ui/media_router/media_router_ui_base.cc +++ b/chrome/browser/ui/media_router/media_router_ui_base.cc
@@ -543,6 +543,13 @@ : url::Origin::Create(GURL()); DVLOG(1) << "DoCreateRoute: origin: " << params.origin; + // This callback must be invoked before + // HandleCreateSessionRequestRouteResponse(), which closes the dialog and + // destroys |this|. + params.route_result_callbacks.push_back( + base::BindOnce(&MediaRouterUIBase::MaybeReportCastingSource, + weak_factory_.GetWeakPtr(), cast_mode)); + // There are 3 cases. In cases (1) and (3) the MediaRouterUIBase will need to // be notified via OnRouteResponseReceived(). In case (2) the dialog will be // closed via HandleCreateSessionRequestRouteResponse(). @@ -576,10 +583,6 @@ } } - params.route_result_callbacks.push_back( - base::BindOnce(&MediaRouterUIBase::MaybeReportCastingSource, - weak_factory_.GetWeakPtr(), cast_mode)); - params.timeout = GetRouteRequestTimeout(cast_mode); CHECK(initiator_); params.incognito = initiator_->GetBrowserContext()->IsOffTheRecord();
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc b/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc index f57076e6e..22636219 100644 --- a/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc +++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc
@@ -87,21 +87,17 @@ class FakeControllerConnection final : public blink::mojom::PresentationConnection { public: - using OnMessageCallback = base::OnceCallback<void(bool)>; - FakeControllerConnection() : binding_(this) {} void SendTextMessage(const std::string& message) { ASSERT_TRUE(receiver_connection_.is_bound()); receiver_connection_->OnMessage( - blink::mojom::PresentationConnectionMessage::NewMessage(message), - base::BindOnce([](bool success) { ASSERT_TRUE(success); })); + blink::mojom::PresentationConnectionMessage::NewMessage(message)); } // blink::mojom::PresentationConnection implementation - MOCK_METHOD2(OnMessage, - void(blink::mojom::PresentationConnectionMessagePtr message, - OnMessageCallback callback)); + MOCK_METHOD1(OnMessage, + void(blink::mojom::PresentationConnectionMessagePtr message)); void DidChangeState( blink::mojom::PresentationConnectionState state) override {} void RequestClose() override {} @@ -239,8 +235,9 @@ destroyer.AwaitTerminate(std::move(receiver_window)); } +// Flaky. See https://crbug.com/880045. IN_PROC_BROWSER_TEST_F(PresentationReceiverWindowControllerBrowserTest, - NavigationClosesWindow) { + DISABLED_NavigationClosesWindow) { // Start receiver window. auto file_path = GetResourceFile(FILE_PATH_LITERAL("presentation_receiver.html")); @@ -299,25 +296,21 @@ "sink", "desc", true, true)); base::RunLoop connection_loop; - EXPECT_CALL(controller_connection, OnMessage(_, _)) - .WillOnce([&](auto response, auto callback) { - ASSERT_TRUE(response->is_message()); - EXPECT_EQ("ready", response->get_message()); - std::move(callback).Run(true); - connection_loop.Quit(); - }); + EXPECT_CALL(controller_connection, OnMessage(_)).WillOnce([&](auto response) { + ASSERT_TRUE(response->is_message()); + EXPECT_EQ("ready", response->get_message()); + connection_loop.Quit(); + }); connection_loop.Run(); // Test ping-pong message. const std::string message("turtles"); base::RunLoop run_loop; - EXPECT_CALL(controller_connection, OnMessage(_, _)) - .WillOnce([&](auto response, auto callback) { - ASSERT_TRUE(response->is_message()); - EXPECT_EQ("Pong: " + message, response->get_message()); - std::move(callback).Run(true); - run_loop.Quit(); - }); + EXPECT_CALL(controller_connection, OnMessage(_)).WillOnce([&](auto response) { + ASSERT_TRUE(response->is_message()); + EXPECT_EQ("Pong: " + message, response->get_message()); + run_loop.Quit(); + }); controller_connection.SendTextMessage(message); run_loop.Run();
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.cc b/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.cc index 76bf37e..c9671ca 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.cc +++ b/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.cc
@@ -22,9 +22,11 @@ const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type match_type) { + AutocompleteMatchType::Type match_type, + base::TimeTicks match_selection_timestamp) { OmniboxEditController::OnAutocompleteAccept(destination_url, disposition, - transition, match_type); + transition, match_type, + match_selection_timestamp); if (command_updater_) command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL);
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h b/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h index 049c310..d0b84d9 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h +++ b/chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h
@@ -21,7 +21,8 @@ void OnAutocompleteAccept(const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type type) override; + AutocompleteMatchType::Type type, + base::TimeTicks match_selection_timestamp) override; void OnInputInProgress(bool in_progress) override; // Returns the WebContents of the currently active tab.
diff --git a/chrome/browser/ui/omnibox/query_in_omnibox_factory.cc b/chrome/browser/ui/omnibox/query_in_omnibox_factory.cc new file mode 100644 index 0000000..d0516ef --- /dev/null +++ b/chrome/browser/ui/omnibox/query_in_omnibox_factory.cc
@@ -0,0 +1,56 @@ +// 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/ui/omnibox/query_in_omnibox_factory.h" + +#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" +#include "chrome/browser/profiles/incognito_helpers.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engines/template_url_service_factory.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "components/omnibox/browser/query_in_omnibox.h" + +// static +QueryInOmnibox* QueryInOmniboxFactory::GetForProfile(Profile* profile) { + return static_cast<QueryInOmnibox*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +// static +QueryInOmniboxFactory* QueryInOmniboxFactory::GetInstance() { + return base::Singleton<QueryInOmniboxFactory>::get(); +} + +// static +std::unique_ptr<KeyedService> QueryInOmniboxFactory::BuildInstanceFor( + content::BrowserContext* context) { + Profile* profile = static_cast<Profile*>(context); + return std::make_unique<QueryInOmnibox>( + AutocompleteClassifierFactory::GetForProfile(profile), + TemplateURLServiceFactory::GetForProfile(profile)); +} + +QueryInOmniboxFactory::QueryInOmniboxFactory() + : BrowserContextKeyedServiceFactory( + "QueryInOmnibox", + BrowserContextDependencyManager::GetInstance()) { + DependsOn(AutocompleteClassifierFactory::GetInstance()); + DependsOn(TemplateURLServiceFactory::GetInstance()); +} + +QueryInOmniboxFactory::~QueryInOmniboxFactory() {} + +content::BrowserContext* QueryInOmniboxFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return chrome::GetBrowserContextRedirectedInIncognito(context); +} + +bool QueryInOmniboxFactory::ServiceIsNULLWhileTesting() const { + return true; +} + +KeyedService* QueryInOmniboxFactory::BuildServiceInstanceFor( + content::BrowserContext* profile) const { + return BuildInstanceFor(static_cast<Profile*>(profile)).release(); +}
diff --git a/chrome/browser/ui/omnibox/query_in_omnibox_factory.h b/chrome/browser/ui/omnibox/query_in_omnibox_factory.h new file mode 100644 index 0000000..9bc67e3 --- /dev/null +++ b/chrome/browser/ui/omnibox/query_in_omnibox_factory.h
@@ -0,0 +1,45 @@ +// 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_UI_OMNIBOX_QUERY_IN_OMNIBOX_FACTORY_H_ +#define CHROME_BROWSER_UI_OMNIBOX_QUERY_IN_OMNIBOX_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "base/memory/singleton.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class QueryInOmnibox; +class Profile; + +// Singleton that owns all QueryInOmnibox instances and associates them with +// Profiles. +class QueryInOmniboxFactory : public BrowserContextKeyedServiceFactory { + public: + // Returns the QueryInOmnibox for |profile|. + static QueryInOmnibox* GetForProfile(Profile* profile); + + static QueryInOmniboxFactory* GetInstance(); + + static std::unique_ptr<KeyedService> BuildInstanceFor( + content::BrowserContext* context); + + private: + friend struct base::DefaultSingletonTraits<QueryInOmniboxFactory>; + + QueryInOmniboxFactory(); + ~QueryInOmniboxFactory() override; + + // BrowserContextKeyedServiceFactory: + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + bool ServiceIsNULLWhileTesting() const override; + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* profile) const override; + + DISALLOW_COPY_AND_ASSIGN(QueryInOmniboxFactory); +}; + +#endif // CHROME_BROWSER_UI_OMNIBOX_QUERY_IN_OMNIBOX_FACTORY_H_
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.cc b/chrome/browser/ui/passwords/manage_passwords_state.cc index 299d195..3f466a0 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state.cc +++ b/chrome/browser/ui/passwords/manage_passwords_state.cc
@@ -130,23 +130,11 @@ ClearData(); form_manager_ = std::move(form_manager); local_credentials_forms_.reserve(form_manager_->GetBestMatches().size()); - bool updated = false; for (const auto& form : form_manager_->GetBestMatches()) { if (form.second->is_public_suffix_match) continue; - if (form_manager_->GetPendingCredentials().username_value == form.first) { - local_credentials_forms_.push_back( - std::make_unique<autofill::PasswordForm>( - form_manager_->GetPendingCredentials())); - updated = true; - } else { - local_credentials_forms_.push_back( - std::make_unique<autofill::PasswordForm>(*form.second)); - } - } - if (!updated) { - local_credentials_forms_.push_back(std::make_unique<autofill::PasswordForm>( - form_manager_->GetPendingCredentials())); + local_credentials_forms_.push_back( + std::make_unique<autofill::PasswordForm>(*form.second)); } AppendDeepCopyVector(form_manager_->GetFormFetcher()->GetFederatedMatches(), &local_credentials_forms_);
diff --git a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc index 76d2c30..cb45d490 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc
@@ -385,34 +385,33 @@ TEST_F(ManagePasswordsStateTest, AutomaticPasswordSave) { test_stored_forms().push_back(&test_psl_form()); + test_stored_forms().push_back(&test_local_form()); std::unique_ptr<password_manager::PasswordFormManager> test_form_manager( CreateFormManager()); - test_form_manager->ProvisionallySave(test_submitted_form()); passwords_data().OnAutomaticPasswordSave(std::move(test_form_manager)); EXPECT_EQ(password_manager::ui::CONFIRMATION_STATE, passwords_data().state()); EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); ASSERT_TRUE(passwords_data().form_manager()); - EXPECT_EQ(test_submitted_form(), - passwords_data().form_manager()->GetPendingCredentials()); TestAllUpdates(); passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); EXPECT_THAT(passwords_data().GetCurrentForms(), - ElementsAre(Pointee(test_submitted_form()))); + ElementsAre(Pointee(test_local_form()))); EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); TestAllUpdates(); } TEST_F(ManagePasswordsStateTest, AutomaticPasswordSaveWithFederations) { + test_stored_forms().push_back(&test_local_form()); std::unique_ptr<password_manager::PasswordFormManager> test_form_manager( CreateFormManagerWithFederation()); test_form_manager->ProvisionallySave(test_submitted_form()); passwords_data().OnAutomaticPasswordSave(std::move(test_form_manager)); EXPECT_THAT(passwords_data().GetCurrentForms(), - UnorderedElementsAre(Pointee(test_submitted_form()), + UnorderedElementsAre(Pointee(test_local_form()), Pointee(test_local_federated_form()))); }
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc index a3e65b4..0a74950 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -1180,7 +1180,8 @@ SCOPED_TRACE(testing::Message("user_closed_bubble = ") << user_closed_bubble); std::unique_ptr<password_manager::PasswordFormManager> test_form_manager( - CreateFormManager()); + CreateFormManagerWithBestMatches(test_local_form(), + {&test_local_form()}, nullptr)); test_form_manager->ProvisionallySave(test_local_form()); EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility()); controller()->OnShowManualFallbackForSaving(
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc index 9929737b..1cb8021 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_tracker_factory.h" #include "chrome/browser/signin/signin_util.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -45,6 +44,7 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_metrics.h" #include "components/sync/base/sync_prefs.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #include "content/public/browser/storage_partition.h" #include "net/base/url_util.h" @@ -469,7 +469,7 @@ } void OneClickSigninSyncStarter::EnableUnifiedConsentIfNeeded() { - if (IsUnifiedConsentFeatureEnabled(profile_)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { UnifiedConsentServiceFactory::GetForProfile(profile_) ->SetUnifiedConsentGiven(true); }
diff --git a/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc b/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc index 5fceed84..659b5a4 100644 --- a/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc +++ b/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/toolbar/browser_actions_bar_browsertest.h" #include <stddef.h> +#include <memory> #include "base/bind.h" #include "base/bind_helpers.h" @@ -49,6 +50,8 @@ namespace { +const char* kInjectionSucceededMessage = "injection succeeded"; + scoped_refptr<const extensions::Extension> CreateExtension( const std::string& name, bool has_browser_action) { @@ -65,6 +68,30 @@ .Build(); } +class BlockedActionWaiter + : public extensions::ExtensionActionRunner::TestObserver { + public: + explicit BlockedActionWaiter(extensions::ExtensionActionRunner* runner) + : runner_(runner), run_loop_(std::make_unique<base::RunLoop>()) { + runner_->set_observer_for_testing(this); + } + ~BlockedActionWaiter() { runner_->set_observer_for_testing(nullptr); } + + void WaitAndReset() { + run_loop_->Run(); + run_loop_ = std::make_unique<base::RunLoop>(); + } + + private: + // ExtensionActionRunner::TestObserver: + void OnBlockedActionAdded() override { run_loop_->Quit(); } + + extensions::ExtensionActionRunner* runner_; + std::unique_ptr<base::RunLoop> run_loop_; + + DISALLOW_COPY_AND_ASSIGN(BlockedActionWaiter); +}; + } // namespace // BrowserActionsBarBrowserTest: @@ -659,13 +686,18 @@ class BrowserActionsBarRuntimeHostPermissionsBrowserTest : public BrowserActionsBarBrowserTest { public: + enum class ContentScriptRunLocation { + DOCUMENT_START, + DOCUMENT_IDLE, + }; + BrowserActionsBarRuntimeHostPermissionsBrowserTest() = default; ~BrowserActionsBarRuntimeHostPermissionsBrowserTest() override = default; void SetUpCommandLine(base::CommandLine* command_line) override { BrowserActionsBarBrowserTest::SetUpCommandLine(command_line); scoped_feature_list_.InitAndEnableFeature( - extensions::features::kRuntimeHostPermissions); + extensions_features::kRuntimeHostPermissions); } void SetUpOnMainThread() override { @@ -674,9 +706,17 @@ ASSERT_TRUE(embedded_test_server()->Start()); } - void LoadAllUrlsExtension() { - extension_dir_.WriteManifest( - R"({ + void LoadAllUrlsExtension(ContentScriptRunLocation run_location) { + std::string run_location_str; + switch (run_location) { + case ContentScriptRunLocation::DOCUMENT_START: + run_location_str = "document_start"; + break; + case ContentScriptRunLocation::DOCUMENT_IDLE: + run_location_str = "document_idle"; + break; + } + extension_dir_.WriteManifest(base::StringPrintf(R"({ "name": "All Urls Extension", "description": "Runs a content script everywhere", "manifest_version": 2, @@ -684,11 +724,14 @@ "content_scripts": [{ "matches": ["<all_urls>"], "js": ["script.js"], - "run_at": "document_start" + "run_at": "%s" }] - })"); - extension_dir_.WriteFile(FILE_PATH_LITERAL("script.js"), - "console.warn('Hello, world!')"); + })", + run_location_str.c_str())); + extension_dir_.WriteFile( + FILE_PATH_LITERAL("script.js"), + base::StringPrintf("chrome.test.sendMessage('%s');", + kInjectionSucceededMessage)); extension_ = LoadExtension(extension_dir_.UnpackedPath()); ASSERT_TRUE(extension_); extensions::ScriptingPermissionsModifier(profile(), extension_) @@ -697,6 +740,18 @@ const extensions::Extension* extension() const { return extension_.get(); } + extensions::ExtensionContextMenuModel* GetExtensionContextMenu() { + ToolbarActionsBar* toolbar_actions_bar = + browser_actions_bar()->GetToolbarActionsBar(); + const std::vector<ToolbarActionViewController*>& toolbar_actions = + toolbar_actions_bar->GetActions(); + if (toolbar_actions.size() != 1) + return nullptr; + EXPECT_EQ(extension()->id(), toolbar_actions[0]->GetId()); + return static_cast<extensions::ExtensionContextMenuModel*>( + toolbar_actions[0]->GetContextMenu()); + } + private: base::test::ScopedFeatureList scoped_feature_list_; extensions::TestExtensionDir extension_dir_; @@ -707,21 +762,28 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsBarRuntimeHostPermissionsBrowserTest, RuntimeHostPermissionsDecoration) { - LoadAllUrlsExtension(); + LoadAllUrlsExtension(ContentScriptRunLocation::DOCUMENT_START); + + ExtensionTestMessageListener injection_listener(kInjectionSucceededMessage, + false /* will_reply */); + injection_listener.set_extension_id(extension()->id()); const GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); + extensions::ExtensionActionRunner* action_runner = + extensions::ExtensionActionRunner::GetForWebContents(web_contents); + BlockedActionWaiter blocked_action_waiter(action_runner); { content::TestNavigationObserver observer(web_contents); ui_test_utils::NavigateToURL(browser(), url); EXPECT_TRUE(observer.last_navigation_succeeded()); } - extensions::ExtensionActionRunner* action_runner = - extensions::ExtensionActionRunner::GetForWebContents(web_contents); + blocked_action_waiter.WaitAndReset(); EXPECT_TRUE(action_runner->WantsToRun(extension())); + EXPECT_FALSE(injection_listener.was_satisfied()); ToolbarActionsBar* actions_bar = browser()->window()->GetToolbarActionsBar(); std::vector<ToolbarActionViewController*> actions = actions_bar->GetActions(); @@ -741,11 +803,140 @@ EXPECT_TRUE(observer.last_navigation_succeeded()); } - // The extension should have already run on page reload, so the button - // shouldn't indicate the extension wants to run. + // The extension should have run on page reload, so the button shouldn't + // indicate the extension wants to run. + ASSERT_TRUE(injection_listener.WaitUntilSatisfied()); EXPECT_FALSE(browser_actions_bar()->ActionButtonWantsToRun(0)); } +// Tests page access modifications through the context menu which require a page +// refresh. +IN_PROC_BROWSER_TEST_F(BrowserActionsBarRuntimeHostPermissionsBrowserTest, + ContextMenuPageAccess_RefreshRequired) { + LoadAllUrlsExtension(ContentScriptRunLocation::DOCUMENT_START); + + ExtensionTestMessageListener injection_listener(kInjectionSucceededMessage, + false /* will_reply */); + injection_listener.set_extension_id(extension()->id()); + + GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + extensions::ExtensionActionRunner* runner = + extensions::ExtensionActionRunner::GetForWebContents(web_contents); + BlockedActionWaiter blocked_action_waiter(runner); + { + content::TestNavigationObserver observer(web_contents); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_TRUE(observer.last_navigation_succeeded()); + } + + // Access to |url| should have been withheld. + blocked_action_waiter.WaitAndReset(); + EXPECT_TRUE(runner->WantsToRun(extension())); + extensions::ScriptingPermissionsModifier permissions_modifier(profile(), + extension()); + EXPECT_FALSE(permissions_modifier.HasGrantedHostPermission(url)); + EXPECT_FALSE(injection_listener.was_satisfied()); + + extensions::ExtensionContextMenuModel* extension_menu = + GetExtensionContextMenu(); + ASSERT_TRUE(extension_menu); + + // Allow the extension to run on this site. This should show a refresh page + // bubble. Accept the bubble. + { + content::TestNavigationObserver observer(web_contents); + runner->set_default_bubble_close_action_for_testing( + std::make_unique<ToolbarActionsBarBubbleDelegate::CloseAction>( + ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE)); + extension_menu->ExecuteCommand( + extensions::ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_SITE, + 0 /* event_flags */); + observer.WaitForNavigationFinished(); + EXPECT_TRUE(observer.last_navigation_succeeded()); + } + + // The extension should have injected and the extension should no longer want + // to run. + ASSERT_TRUE(injection_listener.WaitUntilSatisfied()); + injection_listener.Reset(); + EXPECT_TRUE(permissions_modifier.HasGrantedHostPermission(url)); + EXPECT_FALSE(runner->WantsToRun(extension())); + + // Now navigate to a different host. The extension should have blocked + // actions. + { + url = embedded_test_server()->GetURL("abc.com", "/title1.html"); + content::TestNavigationObserver observer(web_contents); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_TRUE(observer.last_navigation_succeeded()); + } + blocked_action_waiter.WaitAndReset(); + EXPECT_TRUE(runner->WantsToRun(extension())); + EXPECT_FALSE(permissions_modifier.HasGrantedHostPermission(url)); + EXPECT_FALSE(injection_listener.was_satisfied()); + + // Allow the extension to run on all sites this time. This should again show a + // refresh bubble. Dismiss it. + runner->set_default_bubble_close_action_for_testing( + std::make_unique<ToolbarActionsBarBubbleDelegate::CloseAction>( + ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION)); + extension_menu->ExecuteCommand( + extensions::ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_ALL_SITES, + 0 /* event_flags */); + + // Permissions to the extension shouldn't have been granted, and the extension + // should still be in wants-to-run state. + EXPECT_TRUE(runner->WantsToRun(extension())); + EXPECT_FALSE(permissions_modifier.HasGrantedHostPermission(url)); + EXPECT_FALSE(injection_listener.was_satisfied()); +} + +// Tests page access modifications through the context menu which don't require +// a page refresh. +IN_PROC_BROWSER_TEST_F(BrowserActionsBarRuntimeHostPermissionsBrowserTest, + ContextMenuPageAccess_RefreshNotRequired) { + LoadAllUrlsExtension(ContentScriptRunLocation::DOCUMENT_IDLE); + ExtensionTestMessageListener injection_listener(kInjectionSucceededMessage, + false /* will_reply */); + injection_listener.set_extension_id(extension()->id()); + + GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + extensions::ExtensionActionRunner* runner = + extensions::ExtensionActionRunner::GetForWebContents(web_contents); + BlockedActionWaiter blocked_action_waiter(runner); + { + content::TestNavigationObserver observer(web_contents); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_TRUE(observer.last_navigation_succeeded()); + } + + // Access to |url| should have been withheld. + blocked_action_waiter.WaitAndReset(); + EXPECT_TRUE(runner->WantsToRun(extension())); + extensions::ScriptingPermissionsModifier permissions_modifier(profile(), + extension()); + EXPECT_FALSE(permissions_modifier.HasGrantedHostPermission(url)); + EXPECT_FALSE(injection_listener.was_satisfied()); + + extensions::ExtensionContextMenuModel* extension_menu = + GetExtensionContextMenu(); + ASSERT_TRUE(extension_menu); + + // Allow the extension to run on this site. Since the blocked actions don't + // require a refresh, the permission should be granted and the page actions + // should run. + extension_menu->ExecuteCommand( + extensions::ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_SITE, + 0 /* event_flags */); + ASSERT_TRUE(injection_listener.WaitUntilSatisfied()); + EXPECT_FALSE(runner->WantsToRun(extension())); + EXPECT_TRUE(permissions_modifier.HasGrantedHostPermission(url)); +} + class BrowserActionsBarUiBrowserTest : public SupportsTestUi<BrowserActionsBarRuntimeHostPermissionsBrowserTest, TestBrowserUi> { @@ -756,7 +947,7 @@ void ShowUi(const std::string& name) override { ASSERT_EQ("blocked_actions", name); - LoadAllUrlsExtension(); + LoadAllUrlsExtension(ContentScriptRunLocation::DOCUMENT_START); const GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); content::WebContents* web_contents =
diff --git a/chrome/browser/ui/views/apps/DEPS b/chrome/browser/ui/views/apps/DEPS index 418d2ef2..c7f3b27 100644 --- a/chrome/browser/ui/views/apps/DEPS +++ b/chrome/browser/ui/views/apps/DEPS
@@ -3,10 +3,9 @@ ] specific_include_rules = { - # TODO(mash): Fix. https://crbug.com/855096 + # These are only used in non-Mash configs. "chrome_native_app_window_views_aura_ash\.*": [ "+ash/frame/non_client_frame_view_ash.h", - "+ash/wm/window_properties.h", "+ash/wm/window_state.h", "+ash/wm/window_state_observer.h", ],
diff --git a/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.cc b/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.cc index 3e6a974a..53e8f44 100644 --- a/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.cc +++ b/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.cc
@@ -8,12 +8,10 @@ #include "ui/base/base_window.h" AppWindowEasyResizeWindowTargeter::AppWindowEasyResizeWindowTargeter( - aura::Window* aura_window, const gfx::Insets& insets, ui::BaseWindow* native_app_window) - : wm::EasyResizeWindowTargeter(aura_window, insets, insets), - native_app_window_(native_app_window) { -} + : wm::EasyResizeWindowTargeter(insets, insets), + native_app_window_(native_app_window) {} AppWindowEasyResizeWindowTargeter::~AppWindowEasyResizeWindowTargeter() {}
diff --git a/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.h b/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.h index 0025cf78..dd7f7d1 100644 --- a/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.h +++ b/chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.h
@@ -16,9 +16,7 @@ // window. class AppWindowEasyResizeWindowTargeter : public wm::EasyResizeWindowTargeter { public: - // |aura_window| is the owner of this targeter. - AppWindowEasyResizeWindowTargeter(aura::Window* aura_window, - const gfx::Insets& insets, + AppWindowEasyResizeWindowTargeter(const gfx::Insets& insets, ui::BaseWindow* native_app_window); ~AppWindowEasyResizeWindowTargeter() override;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc index 6c6cb7c..d97a1dfa 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -86,7 +86,7 @@ // window. The root window does not have a delegate, which is needed to // handle the event in Linux. window->SetEventTargeter(std::make_unique<AppWindowEasyResizeWindowTargeter>( - window, gfx::Insets(frame->resize_inside_bounds_size()), this)); + gfx::Insets(frame->resize_inside_bounds_size()), this)); return frame; }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc index 7a3c4396..ce93337 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
@@ -7,7 +7,7 @@ #include <utility> #include "apps/ui/views/app_window_frame_view.h" -#include "ash/frame/non_client_frame_view_ash.h" +#include "ash/frame/non_client_frame_view_ash.h" // mash-ok #include "ash/public/cpp/app_types.h" #include "ash/public/cpp/ash_constants.h" #include "ash/public/cpp/ash_switches.h" @@ -16,8 +16,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" #include "ash/public/cpp/window_state_type.h" -#include "ash/wm/window_properties.h" -#include "ash/wm/window_state.h" +#include "ash/wm/window_state.h" // mash-ok #include "base/logging.h" #include "chrome/browser/chromeos/note_taking_helper.h" #include "chrome/browser/profiles/profile.h" @@ -36,6 +35,7 @@ #include "ui/base/hit_test.h" #include "ui/base/models/simple_menu_model.h" #include "ui/base/ui_base_features.h" +#include "ui/base/ui_base_types.h" #include "ui/display/screen.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -72,6 +72,9 @@ // Fullscreen doesn't always imply immersive mode (see // ShouldEnableImmersive()). window->SetProperty(ash::kImmersiveImpliedByFullscreen, false); + + observed_window_.Add( + features::IsUsingWindowService() ? window->GetRootWindow() : window); } /////////////////////////////////////////////////////////////////////////////// @@ -215,17 +218,12 @@ views::NonClientFrameView* ChromeNativeAppWindowViewsAuraAsh::CreateNonClientFrameView( views::Widget* widget) { - observed_window_.Add(GetNativeWindow()); - if (IsFrameless()) return CreateNonStandardAppFrame(); if (features::IsUsingWindowService()) return nullptr; - // TODO(estade): WindowState is not available in OopAsh, so observe changes to - // the window's kWindowStateTypeKey instead. This isn't possible in classic - // Ash; see comment in OnPostWindowStateTypeChange(). observed_window_state_.Add(ash::wm::GetWindowState(GetNativeWindow())); ash::NonClientFrameViewAsh* custom_frame_view = @@ -461,6 +459,7 @@ void ChromeNativeAppWindowViewsAuraAsh::OnPostWindowStateTypeChange( ash::wm::WindowState* window_state, ash::mojom::WindowStateType old_type) { + DCHECK(!features::IsUsingWindowService()); DCHECK_EQ(GetNativeWindow(), window_state->window()); if (window_state->IsFullscreen() != app_window()->IsFullscreen()) { // Report OS-initiated state changes to |app_window()|. This is done in @@ -479,22 +478,26 @@ aura::Window* window, const void* key, intptr_t old) { - if (key == ash::kWindowStateTypeKey) { - ash::mojom::WindowStateType new_state = - window->GetProperty(ash::kWindowStateTypeKey); + if (key != aura::client::kShowStateKey) + return; - if (new_state != ash::mojom::WindowStateType::FULLSCREEN && - new_state != ash::mojom::WindowStateType::MINIMIZED && - app_window()->GetBaseWindow() && - app_window()->GetBaseWindow()->IsFullscreenOrPending()) { - app_window()->Restore(); - // Usually OnNativeWindowChanged() is called when the window bounds are - // changed as a result of a state type change. Because the change in - // state type has already occurred, we need to call - // OnNativeWindowChanged() explicitly. - app_window()->OnNativeWindowChanged(); - } + auto new_state = window->GetProperty(aura::client::kShowStateKey); + + if (new_state != ui::SHOW_STATE_FULLSCREEN && + new_state != ui::SHOW_STATE_MINIMIZED && app_window()->IsFullscreen()) { + app_window()->Restore(); + } else if (features::IsUsingWindowService() && + new_state == ui::SHOW_STATE_FULLSCREEN && + !app_window()->IsFullscreen()) { + app_window()->OSFullscreen(); } + + // Usually OnNativeWindowChanged() is called when the window bounds are + // changed as a result of a state type change. Because the change in + // state type has already occurred, we need to call + // OnNativeWindowChanged() explicitly. + app_window()->OnNativeWindowChanged(); + UpdateImmersiveMode(); } void ChromeNativeAppWindowViewsAuraAsh::OnWindowDestroying(
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h index 7f99174..749ca7d 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
@@ -8,7 +8,7 @@ #include <memory> #include <vector> -#include "ash/wm/window_state_observer.h" +#include "ash/wm/window_state_observer.h" // mash-ok #include "base/gtest_prod_util.h" #include "base/scoped_observer.h" #include "chrome/browser/ui/ash/tablet_mode_client_observer.h"
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc index 224b8e15..efbb80ac 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
@@ -88,7 +88,7 @@ EXPECT_FALSE(IsImmersiveActive()); ASSERT_NO_FATAL_FAILURE(test::SetAndWaitForTabletMode(true)); EXPECT_FALSE(IsImmersiveActive()); - window()->Show(); + window()->Restore(); EXPECT_TRUE(IsImmersiveActive()); app_window_->Minimize(); EXPECT_FALSE(IsImmersiveActive());
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc index 948ec75..d9e9b405 100644 --- a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc +++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
@@ -141,8 +141,7 @@ // active unless the window has a custom shape. gfx::Insets inset(-30); root_window()->SetEventTargeter( - std::make_unique<wm::EasyResizeWindowTargeter>(root_window(), inset, - inset)); + std::make_unique<wm::EasyResizeWindowTargeter>(inset, inset)); aura::Window* window = widget()->GetNativeWindow(); {
diff --git a/chrome/browser/ui/views/frame/DEPS b/chrome/browser/ui/views/frame/DEPS index cd47f85..39901e3f 100644 --- a/chrome/browser/ui/views/frame/DEPS +++ b/chrome/browser/ui/views/frame/DEPS
@@ -6,4 +6,7 @@ "browser_frame_ash\.*": [ "+ash", ], + "top_controls_slide_controller_chromeos_browsertest.cc": [ + "+cc/base/math_util.h", + ], }
diff --git a/chrome/browser/ui/views/frame/browser_frame_mash.cc b/chrome/browser/ui/views/frame/browser_frame_mash.cc index 60536da..d7000b4 100644 --- a/chrome/browser/ui/views/frame/browser_frame_mash.cc +++ b/chrome/browser/ui/views/frame/browser_frame_mash.cc
@@ -27,7 +27,6 @@ #include "ui/base/ui_base_features.h" #include "ui/views/mus/desktop_window_tree_host_mus.h" #include "ui/views/mus/mus_client.h" -#include "ui/views/mus/window_manager_frame_values.h" BrowserFrameMash::BrowserFrameMash(BrowserFrame* browser_frame, BrowserView* browser_view)
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc index 609e079..7ed89c0a 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -162,6 +162,11 @@ SkColor BrowserNonClientFrameView::GetFrameColor( ActiveState active_state) const { + extensions::HostedAppBrowserController* hosted_app_controller = + browser_view_->browser()->hosted_app_controller(); + if (hosted_app_controller && hosted_app_controller->GetThemeColor()) + return *hosted_app_controller->GetThemeColor(); + ThemeProperties::OverwritableByUserThemeProperty color_id; if (ShouldPaintAsSingleTabMode()) { color_id = ThemeProperties::COLOR_TOOLBAR; @@ -170,26 +175,10 @@ ? ThemeProperties::COLOR_FRAME : ThemeProperties::COLOR_FRAME_INACTIVE; } - - // For hosted app windows, if "painting as themed" (which is only true when on - // Linux and using the system theme), prefer the system theme color over the - // hosted app theme color. The title bar will be painted in the system theme - // color (regardless of what we do here), so by returning the system title bar - // background color here, we ensure that: - // a) The side and bottom borders are painted in the same color as the title - // bar background, and - // b) The title text is painted in a color that contrasts with the title bar - // background. - if (ShouldPaintAsThemed()) - return GetThemeProviderForProfile()->GetColor(color_id); - - extensions::HostedAppBrowserController* hosted_app_controller = - browser_view_->browser()->hosted_app_controller(); - if (hosted_app_controller && hosted_app_controller->GetThemeColor()) - return *hosted_app_controller->GetThemeColor(); - - return ThemeProperties::GetDefaultColor(color_id, - browser_view_->IsIncognito()); + return ShouldPaintAsThemed() + ? GetThemeProviderForProfile()->GetColor(color_id) + : ThemeProperties::GetDefaultColor(color_id, + browser_view_->IsIncognito()); } SkColor BrowserNonClientFrameView::GetToolbarTopSeparatorColor() const {
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index 612970c..cb9e7258 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -20,7 +20,7 @@ #include "ash/shell.h" #include "ash/wm/overview/window_selector_controller.h" #include "ash/wm/splitview/split_view_controller.h" -#include "ash/wm/tablet_mode/tablet_mode_controller.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" // mash-ok #include "base/command_line.h" #include "base/run_loop.h" #include "base/scoped_observer.h" @@ -39,6 +39,7 @@ #include "chrome/browser/ssl/cert_verifier_browser_test.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" #include "chrome/browser/ui/ash/multi_user/test_multi_user_window_manager.h" +#include "chrome/browser/ui/ash/tablet_mode_client_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_command_controller.h" #include "chrome/browser/ui/browser_commands.h" @@ -1171,7 +1172,7 @@ // Test that when one browser window is snapped, the header is visible for the // snapped browser window, but invisible for the browser window still in // overview mode. - shell->tablet_mode_controller()->EnableTabletModeWindowManager(true); + ASSERT_NO_FATAL_FAILURE(test::SetAndWaitForTabletMode(true)); ash::SplitViewController* split_view_controller = shell->split_view_controller(); split_view_controller->BindRequest( @@ -1407,7 +1408,7 @@ frame_view->CreateInterfacePtrForTesting()); frame_view->split_view_controller_.FlushForTesting(); - shell->tablet_mode_controller()->EnableTabletModeWindowManager(true); + ASSERT_NO_FATAL_FAILURE(test::SetAndWaitForTabletMode(true)); shell->window_selector_controller()->ToggleOverview(); split_view_controller->SnapWindow(widget->GetNativeWindow(), ash::SplitViewController::LEFT);
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc index c7b0df9..40baf83 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
@@ -5,65 +5,13 @@ #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" #include "build/build_config.h" -#include "chrome/browser/extensions/browsertest_util.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/themes/theme_properties.h" -#include "chrome/browser/themes/theme_service.h" -#include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/common/chrome_features.h" -#include "chrome/common/web_application_info.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "content/public/test/test_navigation_observer.h" #include "ui/base/material_design/material_design_controller.h" #include "ui/base/theme_provider.h" -class BrowserNonClientFrameViewBrowserTest - : public extensions::ExtensionBrowserTest { - public: - BrowserNonClientFrameViewBrowserTest() = default; - ~BrowserNonClientFrameViewBrowserTest() override = default; - - void SetUpOnMainThread() override { - ExtensionBrowserTest::SetUpOnMainThread(); - scoped_feature_list_.InitAndEnableFeature(features::kDesktopPWAWindowing); - } - - // Note: A "bookmark app" is a type of hosted app. All of these tests apply - // equally to hosted and bookmark apps, but it's easier to install a bookmark - // app in a test. - void InstallAndLaunchBookmarkApp() { - WebApplicationInfo web_app_info; - web_app_info.app_url = GetAppURL(); - web_app_info.scope = GetAppURL().GetWithoutFilename(); - if (app_theme_color_) - web_app_info.theme_color = *app_theme_color_; - - const extensions::Extension* app = - extensions::browsertest_util::InstallBookmarkApp(browser()->profile(), - web_app_info); - content::TestNavigationObserver navigation_observer(GetAppURL()); - navigation_observer.StartWatchingNewWebContents(); - Browser* app_browser = extensions::browsertest_util::LaunchAppBrowser( - browser()->profile(), app); - navigation_observer.WaitForNavigationFinished(); - - BrowserView* browser_view = - BrowserView::GetBrowserViewForBrowser(app_browser); - app_frame_view_ = browser_view->frame()->GetFrameView(); - } - - protected: - base::Optional<SkColor> app_theme_color_ = SK_ColorBLUE; - BrowserNonClientFrameView* app_frame_view_ = nullptr; - - private: - GURL GetAppURL() { return GURL("https://test.org"); } - - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(BrowserNonClientFrameViewBrowserTest); -}; +using BrowserNonClientFrameViewBrowserTest = extensions::ExtensionBrowserTest; // Test is Flaky on Windows see crbug.com/600201. #if defined(OS_WIN) @@ -77,7 +25,7 @@ // Tests that the color returned by // BrowserNonClientFrameView::GetToolbarTopSeparatorColor() tracks the window -// activation state. +// actiavtion state. IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, MAYBE_InactiveSeparatorColor) { // Refresh does not draw the toolbar top separator. @@ -91,98 +39,25 @@ const BrowserNonClientFrameView* frame_view = browser_view->frame()->GetFrameView(); const ui::ThemeProvider* theme_provider = frame_view->GetThemeProvider(); - const SkColor expected_active_color = + const SkColor theme_active_color = theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR); - const SkColor expected_inactive_color = theme_provider->GetColor( - ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE); - EXPECT_NE(expected_active_color, expected_inactive_color); + const SkColor theme_inactive_color = + theme_provider->GetColor( + ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE); + EXPECT_NE(theme_active_color, theme_inactive_color); + // Check that the separator color is the active color when the window is + // active. browser_view->Activate(); EXPECT_TRUE(browser_view->IsActive()); - EXPECT_EQ(expected_active_color, frame_view->GetToolbarTopSeparatorColor()); + const SkColor frame_active_color = frame_view->GetToolbarTopSeparatorColor(); + EXPECT_EQ(theme_active_color, frame_active_color); + // Check that the separator color is the inactive color when the window is + // inactive. browser_view->Deactivate(); EXPECT_FALSE(browser_view->IsActive()); - EXPECT_EQ(expected_inactive_color, frame_view->GetToolbarTopSeparatorColor()); -} - -// Tests the frame color for a normal browser window. -IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, - BrowserFrameColorThemed) { - InstallExtension(test_data_dir_.AppendASCII("theme"), 1); - - BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); - const BrowserNonClientFrameView* frame_view = - browser_view->frame()->GetFrameView(); - const ui::ThemeProvider* theme_provider = frame_view->GetThemeProvider(); - const SkColor expected_active_color = - theme_provider->GetColor(ThemeProperties::COLOR_FRAME); - const SkColor expected_inactive_color = - theme_provider->GetColor(ThemeProperties::COLOR_FRAME_INACTIVE); - - EXPECT_EQ(expected_active_color, - frame_view->GetFrameColor(BrowserNonClientFrameView::kActive)); - EXPECT_EQ(expected_inactive_color, - frame_view->GetFrameColor(BrowserNonClientFrameView::kInactive)); -} - -// Tests the frame color for a bookmark app when a theme is applied. -// -// Disabled because it hits a DCHECK in BrowserView. -// TODO(mgiuca): Remove this DCHECK, since it seems legitimate. -// https://crbug.com/879030. -IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, - DISABLED_BookmarkAppFrameColorCustomTheme) { - // The theme color should not affect the window, but the theme must not be the - // default GTK theme for Linux so we install one anyway. - InstallExtension(test_data_dir_.AppendASCII("theme"), 1); - InstallAndLaunchBookmarkApp(); - // Note: This is checking for the bookmark app's theme color, not the user's - // theme color. - EXPECT_EQ(*app_theme_color_, - app_frame_view_->GetFrameColor(BrowserNonClientFrameView::kActive)); -} - -// Tests the frame color for a bookmark app when a theme is applied, with the -// app itself having no theme color. -// -// Disabled because it hits a DCHECK in BrowserView. -// TODO(mgiuca): Remove this DCHECK, since it seems legitimate. -// https://crbug.com/879030. -IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, - DISABLED_BookmarkAppFrameColorCustomThemeNoThemeColor) { - InstallExtension(test_data_dir_.AppendASCII("theme"), 1); - app_theme_color_.reset(); - InstallAndLaunchBookmarkApp(); - // Bookmark apps are not affected by browser themes. - EXPECT_EQ( - ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_FRAME, false), - app_frame_view_->GetFrameColor(BrowserNonClientFrameView::kActive)); -} - -// Tests the frame color for a bookmark app when the system theme is applied. -IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, - BookmarkAppFrameColorSystemTheme) { - ThemeService* theme_service = - ThemeServiceFactory::GetForProfile(browser()->profile()); - // Should be using the system theme by default, but this assert was not true - // on the bots. Explicitly set. - theme_service->UseSystemTheme(); - ASSERT_TRUE(theme_service->UsingSystemTheme()); - - InstallAndLaunchBookmarkApp(); -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) - // On Linux, the system theme is the GTK theme and should change the frame - // color to the system color (not the app theme color); otherwise the title - // and border would clash horribly with the GTK title bar. - // (https://crbug.com/878636) - const ui::ThemeProvider* theme_provider = app_frame_view_->GetThemeProvider(); - const SkColor frame_color = - theme_provider->GetColor(ThemeProperties::COLOR_FRAME); - EXPECT_EQ(frame_color, - app_frame_view_->GetFrameColor(BrowserNonClientFrameView::kActive)); -#else - EXPECT_EQ(*app_theme_color_, - app_frame_view_->GetFrameColor(BrowserNonClientFrameView::kActive)); -#endif + const SkColor frame_inactive_color = + frame_view->GetToolbarTopSeparatorColor(); + EXPECT_EQ(theme_inactive_color, frame_inactive_color); }
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 3e049809..8fc3a87 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -146,6 +146,7 @@ #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/scoped_canvas.h" #include "ui/native_theme/native_theme_dark_aura.h" +#include "ui/views/accessibility/view_accessibility_utils.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/webview/webview.h" @@ -376,6 +377,14 @@ return browser_view_->exclusive_access_bubble(); } + bool IsTopControlsSlideBehaviorEnabled() const override { + return browser_view_->IsTopControlsSlideBehaviorEnabled(); + } + + float GetTopControlsSlideBehaviorShownRatio() const override { + return browser_view_->GetTopControlsSlideBehaviorShownRatio(); + } + private: BrowserView* browser_view_; @@ -435,6 +444,10 @@ BrowserView::BrowserView() : views::ClientView(nullptr, nullptr) {} BrowserView::~BrowserView() { + // Destroy the top controls slide controller first as it depends on the + // tabstrip model and the browser frame. + top_controls_slide_controller_.reset(); + // All the tabs should have been destroyed already. If we were closed by the // OS with some tabs than the NativeBrowserFrame should have destroyed them. DCHECK_EQ(0, browser_->tab_strip_model()->count()); @@ -643,6 +656,18 @@ return browser_->tab_strip_model()->GetActiveWebContents(); } +bool BrowserView::IsTopControlsSlideBehaviorEnabled() const { + return top_controls_slide_controller_ && + top_controls_slide_controller_->IsEnabled(); +} + +float BrowserView::GetTopControlsSlideBehaviorShownRatio() const { + if (top_controls_slide_controller_) + return top_controls_slide_controller_->GetShownRatio(); + + return 1.f; +} + /////////////////////////////////////////////////////////////////////////////// // BrowserView, BrowserWindow implementation: @@ -744,6 +769,31 @@ return GetWidget() ? GetWidget()->GetNativeWindow() : nullptr; } +void BrowserView::SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) { + if (top_controls_slide_controller_) + top_controls_slide_controller_->SetShownRatio(web_contents, ratio); +} + +int BrowserView::GetTopControlsHeight() const { + if (top_controls_slide_controller_ && + top_controls_slide_controller_->IsEnabled()) { + return top_container_->bounds().height(); + } + + // If the top controls slide feature is disabled, we must give the renderers + // a value of 0, so as they don't get confused thinking that they need to move + // the top controls first before the pages start scrolling. + return 0.f; +} + +void BrowserView::SetTopControlsGestureScrollInProgress(bool in_progress) { + if (top_controls_slide_controller_) { + top_controls_slide_controller_->SetTopControlsGestureScrollInProgress( + in_progress); + } +} + StatusBubble* BrowserView::GetStatusBubble() { return status_bubble_.get(); } @@ -1703,27 +1753,11 @@ base::string16 BrowserView::GetAccessibleWindowTitle() const { // If there is a focused and visible tab-modal dialog, report the dialog's // title instead of the page title. - const views::FocusManager* focus_manager = GetFocusManager(); - const views::View* focused_view = - focus_manager ? focus_manager->GetFocusedView() : nullptr; - - if (focused_view) { - std::set<views::Widget*> child_widgets; - views::Widget::GetAllOwnedWidgets(GetWidget()->GetNativeView(), - &child_widgets); - - for (auto iter = child_widgets.begin(); iter != child_widgets.end(); - ++iter) { - views::Widget* child_widget = *iter; - DCHECK_NE(GetWidget(), child_widget); - - WidgetDelegate* child_delegate = child_widget->widget_delegate(); - if (child_delegate->GetModalType() == ui::MODAL_TYPE_CHILD && - child_widget->IsVisible() && - child_widget->GetContentsView()->Contains(focused_view)) - return child_delegate->GetAccessibleWindowTitle(); - } - } + views::Widget* tab_modal = + views::ViewAccessibilityUtils::GetFocusedChildWidgetForAccessibility( + this); + if (tab_modal) + return tab_modal->widget_delegate()->GetAccessibleWindowTitle(); return GetAccessibleWindowTitleForChannelAndProfile(chrome::GetChannel(), browser_->profile()); @@ -2313,6 +2347,13 @@ } void BrowserView::InitViews() { + // TopControlsSlideController must be initialized here in InitViews() rather + // than Init() as it depends on the browser frame being ready. + if (IsBrowserTypeNormal()) { + DCHECK(frame_); + top_controls_slide_controller_ = CreateTopControlsSlideController(this); + } + GetWidget()->AddObserver(this); // Stow a pointer to this object onto the window handle so that we can get at @@ -2615,6 +2656,10 @@ return; in_process_fullscreen_ = true; + if (top_controls_slide_controller_) + top_controls_slide_controller_->OnBrowserFullscreenStateWillChange( + fullscreen); + // Reduce jankiness during the following position changes by: // * Hiding the window until it's in the final position // * Ignoring all intervening Layout() calls, which resize the webpage and
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index b2eb6e2..199e520 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -29,6 +29,7 @@ #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/contents_web_view.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" +#include "chrome/browser/ui/views/frame/top_controls_slide_controller.h" #include "chrome/browser/ui/views/frame/web_contents_close_handler.h" #include "chrome/browser/ui/views/load_complete_listener.h" #include "chrome/browser/ui/views/tabs/tab.h" @@ -149,6 +150,10 @@ Browser* browser() { return browser_.get(); } const Browser* browser() const { return browser_.get(); } + const TopControlsSlideController* top_controls_slide_controller() const { + return top_controls_slide_controller_.get(); + } + // Initializes (or re-initializes) the status bubble. We try to only create // the bubble once and re-use it for the life of the browser, but certain // events (such as changing enabling/disabling Aero on Win) can force a need @@ -181,6 +186,9 @@ // Container for the tabstrip, toolbar, etc. TopContainerView* top_container() { return top_container_; } + // Container for the web contents. + views::View* contents_container() { return contents_container_; } + // Accessor for the TabStrip. TabStrip* tabstrip() { return tabstrip_; } @@ -252,6 +260,14 @@ return browser_->is_type_tabbed(); } + // Returns true if the top browser controls (a.k.a. top-chrome UIs) are + // allowed to slide up and down with the gesture scrolls on the current tab's + // page. + bool IsTopControlsSlideBehaviorEnabled() const; + + // Returns the current shown ratio of the top browser controls. + float GetTopControlsSlideBehaviorShownRatio() const; + // See ImmersiveModeController for description. ImmersiveModeController* immersive_mode_controller() const { return immersive_mode_controller_.get(); @@ -289,6 +305,10 @@ bool IsAlwaysOnTop() const override; void SetAlwaysOnTop(bool always_on_top) override; gfx::NativeWindow GetNativeWindow() const override; + void SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) override; + int GetTopControlsHeight() const override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; StatusBubble* GetStatusBubble() override; void UpdateTitleBar() override; void BookmarkBarStateChanged( @@ -775,6 +795,9 @@ // location bar even if the browser window is not active. bool force_location_bar_focus_ = false; + // This is non-null on Chrome OS only. + std::unique_ptr<TopControlsSlideController> top_controls_slide_controller_; + std::unique_ptr<ImmersiveModeController> immersive_mode_controller_; std::unique_ptr<WebContentsCloseHandler> web_contents_close_handler_;
diff --git a/chrome/browser/ui/views/frame/browser_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_view_browsertest.cc index 2fc590c4..b6e7fbb3 100644 --- a/chrome/browser/ui/views/frame/browser_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
@@ -385,9 +385,17 @@ window_title, base::CompareCase::SENSITIVE)); } +#if defined(OS_MACOSX) +// Voiceover treats tab modal dialogs as native windows, so this approach is not +// necessary. +#define MAYBE_GetAccessibleTabModalDialogTree \ + DISABLED_GetAccessibleTabModalDialogTree +#else +#define MAYBE_GetAccessibleTabModalDialogTree GetAccessibleTabModalDialogTree +#endif // Open a tab-modal dialog and check that the accessibility tree only contains // the dialog. -IN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) { +IN_PROC_BROWSER_TEST_F(BrowserViewTest, MAYBE_GetAccessibleTabModalDialogTree) { ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible( browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible()); // We expect this conversion to be safe on Windows, but can't guarantee that it
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index a6c05c6..f6a9048 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -442,10 +442,15 @@ } int BrowserViewLayout::LayoutInfoBar(int top) { - // In immersive fullscreen, the infobar always starts near the top of the - // screen. - if (immersive_mode_controller_->IsEnabled()) - top = browser_view_->y(); + // In immersive fullscreen or when top-chrome is fully hidden due to the page + // gesture scroll slide behavior, the infobar always starts near the top of + // the screen. + if (immersive_mode_controller_->IsEnabled() || + (delegate_->IsTopControlsSlideBehaviorEnabled() && + delegate_->GetTopControlsSlideBehaviorShownRatio() == 0.f)) { + // Can be null in tests. + top = browser_view_ ? browser_view_->y() : 0; + } infobar_container_->SetVisible(IsInfobarVisible()); infobar_container_->SetBounds( @@ -489,11 +494,18 @@ gfx::Rect top_container_bounds(vertical_layout_rect_.width(), height); - // If the immersive mode controller is animating the top container, it may be - // partly offscreen. - top_container_bounds.set_y( - immersive_mode_controller_->GetTopContainerVerticalOffset( - top_container_bounds.size())); + if (delegate_->IsTopControlsSlideBehaviorEnabled()) { + // If the top controls are fully hidden, then it's positioned outside the + // views' bounds. + const float ratio = delegate_->GetTopControlsSlideBehaviorShownRatio(); + top_container_bounds.set_y(ratio == 0 ? -height : 0); + } else { + // If the immersive mode controller is animating the top container, it may + // be partly offscreen. + top_container_bounds.set_y( + immersive_mode_controller_->GetTopContainerVerticalOffset( + top_container_bounds.size())); + } top_container_->SetBoundsRect(top_container_bounds); }
diff --git a/chrome/browser/ui/views/frame/browser_view_layout_delegate.h b/chrome/browser/ui/views/frame/browser_view_layout_delegate.h index 5c01a53..82e8b970 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout_delegate.h +++ b/chrome/browser/ui/views/frame/browser_view_layout_delegate.h
@@ -29,6 +29,8 @@ virtual bool IsBookmarkBarVisible() const = 0; virtual bool DownloadShelfNeedsLayout() const = 0; virtual ExclusiveAccessBubbleViews* GetExclusiveAccessBubble() const = 0; + virtual bool IsTopControlsSlideBehaviorEnabled() const = 0; + virtual float GetTopControlsSlideBehaviorShownRatio() const = 0; }; #endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_DELEGATE_H_
diff --git a/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc b/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc index 5790c87..2097b2c 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc
@@ -33,6 +33,12 @@ void set_bookmark_bar_visible(bool visible) { bookmark_bar_visible_ = visible; } + void set_top_controls_slide_enabled(bool enabled) { + top_controls_slide_enabled_ = enabled; + } + void set_top_controls_shown_ratio(float ratio) { + top_controls_shown_ratio_ = ratio; + } // BrowserViewLayout::Delegate overrides: views::View* GetContentsWebView() const override { @@ -53,6 +59,12 @@ ExclusiveAccessBubbleViews* GetExclusiveAccessBubble() const override { return nullptr; } + bool IsTopControlsSlideBehaviorEnabled() const override { + return top_controls_slide_enabled_; + } + float GetTopControlsSlideBehaviorShownRatio() const override { + return top_controls_shown_ratio_; + } private: views::View* contents_web_view_; @@ -60,6 +72,8 @@ bool toolbar_visible_ = true; bool bookmark_bar_visible_ = true; bool download_shelf_needs_layout_ = false; + bool top_controls_slide_enabled_ = false; + float top_controls_shown_ratio_ = 1.f; DISALLOW_COPY_AND_ASSIGN(MockBrowserViewLayoutDelegate); }; @@ -246,3 +260,30 @@ EXPECT_TRUE(download_shelf->visible()); EXPECT_EQ("0,450 0x50", download_shelf->bounds().ToString()); } + +TEST_F(BrowserViewLayoutTest, LayoutContentsWithTopControlsSlideBehavior) { + // Top controls are fully shown. + delegate()->set_tab_strip_visible(false); + delegate()->set_toolbar_visible(true); + delegate()->set_top_controls_slide_enabled(true); + delegate()->set_top_controls_shown_ratio(1.f); + layout()->Layout(root_view()); + EXPECT_EQ("0,0 800x30", top_container()->bounds().ToString()); + EXPECT_EQ("0,0 800x30", toolbar()->bounds().ToString()); + EXPECT_EQ("0,30 800x570", contents_container()->bounds().ToString()); + + // Top controls are half shown, half hidden. + delegate()->set_top_controls_shown_ratio(0.5f); + layout()->Layout(root_view()); + EXPECT_EQ("0,0 800x30", top_container()->bounds().ToString()); + EXPECT_EQ("0,0 800x30", toolbar()->bounds().ToString()); + EXPECT_EQ("0,30 800x570", contents_container()->bounds().ToString()); + + // Top controls are fully hidden. the contents are expanded in height by an + // amount equal to the top controls height. + delegate()->set_top_controls_shown_ratio(0.f); + layout()->Layout(root_view()); + EXPECT_EQ("0,-30 800x30", top_container()->bounds().ToString()); + EXPECT_EQ("0,0 800x30", toolbar()->bounds().ToString()); + EXPECT_EQ("0,0 800x600", contents_container()->bounds().ToString()); +}
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc index 55a0414..df7b030 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
@@ -4,14 +4,11 @@ #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" -#include "ash/frame/caption_buttons/frame_caption_button.h" -#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" -#include "ash/public/cpp/config.h" +#include "ash/frame/caption_buttons/frame_caption_button.h" // mash-ok +#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" // mash-ok #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h" #include "ash/public/interfaces/constants.mojom.h" #include "ash/public/interfaces/shell_test_api.mojom.h" -#include "ash/shell.h" -#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/macros.h" #include "base/test/test_mock_time_task_runner.h" #include "chrome/browser/extensions/extension_browsertest.h"
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.cc index 05b10c0..3d7b8d4 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.cc
@@ -31,6 +31,8 @@ } bool OpaqueBrowserFrameViewLinux::IsUsingSystemTheme() { + // On X11, this does the correct thing. On Windows, UsingSystemTheme() will + // return true when using the default blue theme too. return theme_service_->UsingSystemTheme(); }
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller.cc new file mode 100644 index 0000000..565774b --- /dev/null +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller.cc
@@ -0,0 +1,21 @@ +// 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/ui/views/frame/top_controls_slide_controller.h" + +#if defined(OS_CHROMEOS) +#include "base/feature_list.h" +#include "chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h" +#include "chrome/common/chrome_features.h" +#endif // defined(OS_CHROMEOS) + +std::unique_ptr<TopControlsSlideController> CreateTopControlsSlideController( + BrowserView* browser_view) { +#if defined(OS_CHROMEOS) + if (base::FeatureList::IsEnabled(features::kSlideTopChromeWithPageScrolls)) + return std::make_unique<TopControlsSlideControllerChromeOS>(browser_view); +#endif // defined(OS_CHROMEOS) + + return nullptr; +}
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller.h b/chrome/browser/ui/views/frame/top_controls_slide_controller.h new file mode 100644 index 0000000..19ea3312aa --- /dev/null +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller.h
@@ -0,0 +1,58 @@ +// 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_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_H_ +#define CHROME_BROWSER_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_H_ + +#include <memory> + +#include "base/macros.h" + +class BrowserView; + +namespace content { +class WebContents; +} // namespace content + +// Defines an interface for a controller that implements the Android-like +// browser top controls (a.k.a. top-chrome) sliding behavior when the current +// tab's page is scrolled by touch gestures. +// https://crbug.com/856222. +class TopControlsSlideController { + public: + TopControlsSlideController() = default; + virtual ~TopControlsSlideController() = default; + + // Returns true when the browser top controls slide behavior with page scrolls + // is enabled, i.e. when in tablet mode and browser window is non-immersive. + virtual bool IsEnabled() const = 0; + + // Returns the current shown ratio of the browser controls. + virtual float GetShownRatio() const = 0; + + // Sets the top controls UIs shown ratio as a result of page scrolling in + // |contents|. The shown ratio is a value in the range [0.f, 1.f], where 0 is + // fully hidden, and 1 is fully shown. + virtual void SetShownRatio(content::WebContents* contents, float ratio) = 0; + + // Inform the controller that the browser is about to change its fullscreen + // state, potentially enabling immersive fullscreen mode which should disable + // the top controls slide behavior with page scrolls. + virtual void OnBrowserFullscreenStateWillChange( + bool new_fullscreen_state) = 0; + + // Called from the renderer to inform the controller that gesture scrolling + // changed state. + virtual void SetTopControlsGestureScrollInProgress(bool in_progress) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(TopControlsSlideController); +}; + +// If the feature is enabled, returns an instance of the controller, otherwise +// returns nullptr. +std::unique_ptr<TopControlsSlideController> CreateTopControlsSlideController( + BrowserView* browser_view); + +#endif // CHROME_BROWSER_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc new file mode 100644 index 0000000..d4e5f6d --- /dev/null +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc
@@ -0,0 +1,555 @@ +// 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/ui/views/frame/top_controls_slide_controller_chromeos.h" + +#include "chrome/browser/search/search.h" +#include "chrome/browser/ssl/security_state_tab_helper.h" +#include "chrome/browser/ui/ash/tablet_mode_client.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/top_container_view.h" +#include "chrome/common/chrome_render_frame.mojom.h" +#include "chrome/common/url_constants.h" +#include "content/public/browser/focused_node_details.h" +#include "content/public/browser/navigation_controller.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/notification_details.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_source.h" +#include "content/public/browser/notification_types.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_widget_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/common/browser_controls_state.h" +#include "extensions/common/constants.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "ui/aura/window.h" +#include "ui/compositor/scoped_layer_animation_settings.h" +#include "ui/views/controls/native/native_view_host.h" + +namespace { + +// Based on the current status of |contents|, returns the browser top controls +// shown state constraints, which specifies if the top controls are allowed to +// be only shown, or either shown or hidden. +// This function is mostly similar to its corresponding Android one in Java code +// (See TabStateBrowserControlsVisibilityDelegate#canAutoHideBrowserControls() +// in TabStateBrowserControlsVisibilityDelegate.java). +content::BrowserControlsState GetBrowserControlsStateConstraints( + content::WebContents* contents) { + DCHECK(contents); + + if (contents->IsFullscreen() || contents->IsFocusedElementEditable() || + contents->ShowingInterstitialPage() || contents->IsBeingDestroyed() || + contents->IsCrashed()) { + return content::BROWSER_CONTROLS_STATE_SHOWN; + } + + content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); + if (!entry || entry->GetPageType() != content::PAGE_TYPE_NORMAL) + return content::BROWSER_CONTROLS_STATE_SHOWN; + + const GURL& url = entry->GetURL(); + if (url.SchemeIs(content::kChromeUIScheme) || + url.SchemeIs(chrome::kChromeNativeScheme) || + url.SchemeIs(extensions::kExtensionScheme)) { + return content::BROWSER_CONTROLS_STATE_SHOWN; + } + + Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); + if (profile && search::IsNTPURL(url, profile)) + return content::BROWSER_CONTROLS_STATE_SHOWN; + + auto* helper = SecurityStateTabHelper::FromWebContents(contents); + security_state::SecurityInfo security_info; + helper->GetSecurityInfo(&security_info); + + switch (security_info.security_level) { + case security_state::HTTP_SHOW_WARNING: + case security_state::DANGEROUS: + return content::BROWSER_CONTROLS_STATE_SHOWN; + + // Force compiler failure if new security level types were added without + // this being updated. + case security_state::NONE: + case security_state::EV_SECURE: + case security_state::SECURE: + case security_state::SECURE_WITH_POLICY_INSTALLED_CERT: + case security_state::SECURITY_LEVEL_COUNT: + break; + } + + return content::BROWSER_CONTROLS_STATE_BOTH; +} + +// Instructs the renderer of |web_contents| to show the top controls, and also +// updates its shown state constraints based on the current status of +// |web_contents| (see GetBrowserControlsStateConstraints() above). +void UpdateBrowserControlsStateShown(content::WebContents* web_contents, + bool animate) { + DCHECK(web_contents); + + content::RenderFrameHost* main_frame = web_contents->GetMainFrame(); + if (!main_frame) + return; + + chrome::mojom::ChromeRenderFrameAssociatedPtr renderer; + main_frame->GetRemoteAssociatedInterfaces()->GetInterface(&renderer); + + if (!renderer) + return; + + const content::BrowserControlsState constraints_state = + GetBrowserControlsStateConstraints(web_contents); + + const content::BrowserControlsState current_state = + content::BROWSER_CONTROLS_STATE_SHOWN; + renderer->UpdateBrowserControlsState(constraints_state, current_state, + animate); +} + +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// TopControlsSlideTabObserver: + +// Pushes updates of the browser top controls state constraints to the renderer +// when certain events happen on the webcontents. It also keeps track of the +// current top controls shown ratio for this tab so that it stays in sync with +// the corresponding value that the tab's renderer has. +class TopControlsSlideTabObserver : public content::WebContentsObserver { + public: + TopControlsSlideTabObserver(content::WebContents* web_contents, + TopControlsSlideControllerChromeOS* owner) + : content::WebContentsObserver(web_contents), owner_(owner) { + // This object is constructed when |web_contents| is attached to the + // browser's tabstrip, meaning that Browser is now the delegate of + // |web_contents|. Updating the visual properties will now sync the correct + // top chrome height in the renderer. + content::RenderFrameHost* main_frame = web_contents->GetMainFrame(); + if (!main_frame) + return; + + auto* rvh = main_frame->GetRenderViewHost(); + if (!rvh) + return; + + auto* widget = rvh->GetWidget(); + if (!widget) + return; + + widget->SynchronizeVisualProperties(); + } + + ~TopControlsSlideTabObserver() override = default; + + float shown_ratio() const { return shown_ratio_; } + void set_shown_ratio(float ratio) { shown_ratio_ = ratio; } + + // content::WebContentsObserver: + void RenderProcessGone(base::TerminationStatus status) override { + // There is no renderer to communicate with, so just ensure top-chrome + // is shown. Also the render may have crashed before resetting the gesture + // in progress bit. + owner_->SetTopControlsGestureScrollInProgress(false); + owner_->SetShownRatio(web_contents(), 1.f); + } + + void OnRendererUnresponsive( + content::RenderProcessHost* render_process_host) override { + // The render process might respond shortly, so instruct the renderer to + // show top-chrome, and show it manually immediately. + UpdateBrowserControlsStateShown(false /* animate */); + owner_->SetShownRatio(web_contents(), 1.f); + } + + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override { + if (navigation_handle->IsInMainFrame() && navigation_handle->HasCommitted()) + UpdateBrowserControlsStateShown(true /* animate */); + } + + void DidFailLoad(content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + int error_code, + const base::string16& error_description) override { + if (render_frame_host->IsCurrent() && + (render_frame_host == web_contents()->GetMainFrame())) { + UpdateBrowserControlsStateShown(true /* animate */); + } + } + + void DidChangeVisibleSecurityState() override { + UpdateBrowserControlsStateShown(true /* animate */); + } + + void DidAttachInterstitialPage() override { + UpdateBrowserControlsStateShown(true /* animate */); + } + + void DidDetachInterstitialPage() override { + UpdateBrowserControlsStateShown(true /* animate */); + } + + private: + void UpdateBrowserControlsStateShown(bool animate) { + ::UpdateBrowserControlsStateShown(web_contents(), animate); + } + + TopControlsSlideControllerChromeOS* const owner_; + + // Tracks the current shown ratio of this tab as synchronized with its + // renderer. This is needed because when switching tabs, we must restore the + // shown ratio of the newly-activated tab manually, not just ask the renderer + // to animate it to shown. The renderer may never animate anything to fully + // shown. Here's an example: + // + // Assume we have two tabs: + // + // +-------+-------+ + // | Tab 1 | Tab 2 | + // +-------+-------+ + // + // - User scrolls and hides top-chrome for tab 1. + // - User presses Ctrl + Tab to switch to tab 2. + // - We *just* ask the renderer to show top-chrome for tab 2. + // - Tab 2's renderer thinks that shown ratio is already 1 and top-chrome is + // already shown. + // - Renderer doesn't call us, and top-chrome remains hidden even though it + // should be shown. + float shown_ratio_ = 1.f; + + DISALLOW_COPY_AND_ASSIGN(TopControlsSlideTabObserver); +}; + +//////////////////////////////////////////////////////////////////////////////// +// TopControlsSlideControllerChromeOS: + +TopControlsSlideControllerChromeOS::TopControlsSlideControllerChromeOS( + BrowserView* browser_view) + : browser_view_(browser_view), + tablet_mode_enabled_(TabletModeClient::Get() && + TabletModeClient::Get()->tablet_mode_enabled()), + browser_frame_is_fullscreen_(browser_view->IsFullscreen()) { + DCHECK(browser_view); + DCHECK(browser_view->frame()); + DCHECK(browser_view->browser()); + DCHECK(browser_view->IsBrowserTypeNormal()); + DCHECK(browser_view->browser()->tab_strip_model()); + + registrar_.Add(this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE, + content::NotificationService::AllSources()); + + if (TabletModeClient::Get()) + TabletModeClient::Get()->AddObserver(this); + browser_view->browser()->tab_strip_model()->AddObserver(this); +} + +TopControlsSlideControllerChromeOS::~TopControlsSlideControllerChromeOS() { + browser_view_->browser()->tab_strip_model()->RemoveObserver(this); + if (TabletModeClient::Get()) + TabletModeClient::Get()->RemoveObserver(this); +} + +bool TopControlsSlideControllerChromeOS::IsEnabled() const { + return tablet_mode_enabled_ && !browser_frame_is_fullscreen_; +} + +float TopControlsSlideControllerChromeOS::GetShownRatio() const { + return shown_ratio_; +} + +void TopControlsSlideControllerChromeOS::SetShownRatio( + content::WebContents* contents, + float ratio) { + DCHECK(contents); + + if (!IsEnabled()) + return; + + if (shown_ratio_ == ratio) + return; + + shown_ratio_ = ratio; + DCHECK(observed_tabs_.count(contents)); + observed_tabs_[contents]->set_shown_ratio(ratio); + + Refresh(); +} + +void TopControlsSlideControllerChromeOS::OnBrowserFullscreenStateWillChange( + bool new_fullscreen_state) { + if (new_fullscreen_state && !browser_frame_is_fullscreen_ && + shown_ratio_ < 1.f) { + // Immersive fullscreen mode could be about to start for this browser's + // window. Therefore show the top-chrome immediately without animation. + ShowTopChrome(browser_view_->GetActiveWebContents(), false /* animate */); + } + + browser_frame_is_fullscreen_ = new_fullscreen_state; +} + +void TopControlsSlideControllerChromeOS::SetTopControlsGestureScrollInProgress( + bool in_progress) { + is_gesture_scrolling_in_progress_ = in_progress; + + // Gesture scrolling may end before we reach a terminal value (1.f or 0.f) for + // the |shown_ratio_|. In this case the render should continue by animating + // the top controls towards one side. Therefore we wait for that to happen. + if (is_gesture_scrolling_in_progress_ || !is_sliding_in_progress_) + return; + + // Also, it may end when we are already at a terminal value of the + // |shown_ratio_| (for example user scrolls top-chrome up until it's fully + // hidden, keeps their finger down without movement for a bit, and then + // releases finger). Calling refresh in this case will take care of ending the + // sliding state (if we are in it). + Refresh(); +} + +void TopControlsSlideControllerChromeOS::OnTabletModeToggled(bool enabled) { + if (!enabled) + ShowTopChrome(browser_view_->GetActiveWebContents(), false /* animate */); + + tablet_mode_enabled_ = enabled; +} + +void TopControlsSlideControllerChromeOS::TabInsertedAt( + TabStripModel* tab_strip_model, + content::WebContents* contents, + int index, + bool foreground) { + DCHECK(contents); + observed_tabs_.emplace( + contents, std::make_unique<TopControlsSlideTabObserver>(contents, this)); +} + +void TopControlsSlideControllerChromeOS::TabDetachedAt( + content::WebContents* contents, + int previous_index, + bool was_active) { + DCHECK(contents); + observed_tabs_.erase(contents); +} + +void TopControlsSlideControllerChromeOS::ActiveTabChanged( + content::WebContents* old_contents, + content::WebContents* new_contents, + int index, + int reason) { + DCHECK(new_contents); + DCHECK(observed_tabs_.count(new_contents)); + DCHECK(!is_gesture_scrolling_in_progress_); + + // Restore the newly-activated tab's shown ratio. If this is a newly inserted + // tab, its |shown_ratio_| is 1.0f. + SetShownRatio(new_contents, observed_tabs_[new_contents]->shown_ratio()); + UpdateBrowserControlsStateShown(new_contents, true /* animate */); +} + +void TopControlsSlideControllerChromeOS::TabReplacedAt( + TabStripModel* tab_strip_model, + content::WebContents* old_contents, + content::WebContents* new_contents, + int index) { + DCHECK(old_contents); + DCHECK(new_contents); + observed_tabs_.erase(old_contents); + + DCHECK(!observed_tabs_.count(new_contents)); + + observed_tabs_.emplace( + new_contents, + std::make_unique<TopControlsSlideTabObserver>(new_contents, this)); +} + +void TopControlsSlideControllerChromeOS::SetTabNeedsAttentionAt( + int index, + bool attention) { + ShowTopChrome(browser_view_->GetActiveWebContents(), true /* animate */); +} + +void TopControlsSlideControllerChromeOS::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + // TODO(afakhry): It would be nice to add a WebContentsObserver method that + // broadcasts this event. + if (type != content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE) + return; + + content::FocusedNodeDetails* node_details = + content::Details<content::FocusedNodeDetails>(details).ptr(); + // If a non-editable node gets focused and top-chrome is fully shown, we + // should also update the browser controls state constraints so that + // top-chrome is able to be hidden again. + if (node_details->is_editable_node || shown_ratio_ == 1.f) + ShowTopChrome(browser_view_->GetActiveWebContents(), true /* animate */); +} + +void TopControlsSlideControllerChromeOS::Refresh() { + if (!is_gesture_scrolling_in_progress_ && + (shown_ratio_ == 1.f || shown_ratio_ == 0.f)) { + // Reached a terminal value and gesture scrolling is not in progress. + OnEndSliding(); + return; + } + + if (!is_sliding_in_progress_) + OnBeginSliding(); + + // Using |shown_ratio_|, translate the browser top controls (using the root + // view layer), as well as the layer of page contents native view's container + // (which is the clipping window in the case of a NativeViewHostAura). + // The translation is done in the Y-coordinate by an amount equal to the + // height of the hidden part of the browser top controls. + const int top_container_height = browser_view_->top_container()->height(); + const float y_translation = top_container_height * (shown_ratio_ - 1.f); + gfx::Transform trans; + trans.Translate(0, y_translation); + + // We need to transform webcontents native view's container rather than the + // webcontents native view itself. That's because the container in the case + // of aura is the clipping window. If we translate the webcontents native view + // the page will appear to scroll, but clipping window will act as a static + // view port that doesn't move with the top controls. + DCHECK(browser_view_->contents_web_view()->holder()->GetNativeViewContainer()) + << "The web contents' native view didn't attach yet!"; + ui::Layer* contents_container_layer = browser_view_->contents_web_view() + ->holder() + ->GetNativeViewContainer() + ->layer(); + ui::Layer* root_layer = browser_view_->frame()->GetRootView()->layer(); + std::vector<ui::Layer*> layers = {root_layer, contents_container_layer}; + + for (auto* layer : layers) { + ui::ScopedLayerAnimationSettings settings(layer->GetAnimator()); + settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(0)); + settings.SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); + layer->SetTransform(trans); + } +} + +void TopControlsSlideControllerChromeOS::OnBeginSliding() { + DCHECK(IsEnabled()); + + // It should never be called again. + DCHECK(!is_sliding_in_progress_); + + is_sliding_in_progress_ = true; + + BrowserFrame* browser_frame = browser_view_->frame(); + views::View* root_view = browser_frame->GetRootView(); + // We paint to layer to be able to efficiently translate the browser + // top-controls without having to adjust the bounds of the views which trigger + // re-layouts and re-paints, which makes scrolling feel laggy. + root_view->SetPaintToLayer(); + // We need to make the layer non-opaque as the tabstrip has transparent areas + // (where there are no tabs) which shows the frame header from underneath it. + // Making the root view paint to a layer will always produce garbage and + // artifacts while the layer is being scrolled if it's left to be opaque. + // Making it non-opaque fixes this issue. + root_view->layer()->SetFillsBoundsOpaquely(false); + + // We need to fix the order of the layers after making the root view paint to + // layer. Otherwise, the root view's layer will show on top of the contents' + // native view's layer and cover it. + browser_frame->ReorderNativeViews(); + + ui::Layer* widget_layer = browser_frame->GetLayer(); + + // OnBeginSliding() means we are in a transient state (i.e. the top controls + // didn't reach its final state of either fully shown or fully hidden). During + // this state, we resize the widget's root view to be bigger in height so the + // contents can take up more space, and slidding top-chrome doesn't result in + // showing clipped web contents. + // This resize will trigger a relayout on the BrowserView which will take care + // of positioning everything correctly (See BrowserViewLayout). + // Note: It's ok to trigger a layout at the beginning and ending of the slide + // but not in-between. Layers transforms handles the in-between. + gfx::Rect root_bounds = root_view->bounds(); + const int top_container_height = browser_view_->top_container()->height(); + const int new_height = widget_layer->bounds().height() + top_container_height; + root_bounds.set_height(new_height); + root_view->SetBoundsRect(root_bounds); + + // We don't want anything to show outside the browser window's bounds. + widget_layer->SetMasksToBounds(true); +} + +void TopControlsSlideControllerChromeOS::OnEndSliding() { + DCHECK(IsEnabled()); + + // This should only be called at terminal values of the |shown_ratio_|. + DCHECK(shown_ratio_ == 1.f || shown_ratio_ == 0.f); + + // It should never be called while gesture scrolling is still in progress. + DCHECK(!is_gesture_scrolling_in_progress_); + + // It can, however, be called when sliding is not in progress as a result of + // Setting the value directly (for example due to renderer crash), or a direct + // call from the renderer to set the shown ratio to a terminal value. + is_sliding_in_progress_ = false; + + // At the end of sliding, we reset the webcontents NativeViewHostAura's + // clipping window's layer's transform to identity. From now on, the views + // layout takes care of where everything is. + DCHECK(browser_view_->contents_web_view()->holder()->GetNativeViewContainer()) + << "The web contents' native view didn't attach yet!"; + ui::Layer* contents_container_layer = browser_view_->contents_web_view() + ->holder() + ->GetNativeViewContainer() + ->layer(); + gfx::Transform transform; + contents_container_layer->SetTransform(transform); + + BrowserFrame* browser_frame = browser_view_->frame(); + views::View* root_view = browser_frame->GetRootView(); + root_view->DestroyLayer(); + + ui::Layer* widget_layer = browser_frame->GetLayer(); + + // Note the difference between the below root view resize, and the + // corresponding one in OnBeginSliding() above. Here we have reached a steady + // terminal (|shown_ratio_| is either 1.f or 0.f) state, which means the + // height of the root view should be restored to the height of the widget. + // Note: It's ok to trigger a layout at the beginning and ending of the slide + // but not in-between. Layers transforms handles the in-between. + auto root_bounds = root_view->bounds(); + const int original_height = root_bounds.height(); + const int new_height = widget_layer->bounds().height(); + + // We need to guarantee a browser view re-layout, but want to avoid doing that + // twice. + if (new_height != original_height) { + root_bounds.set_height(new_height); + root_view->SetBoundsRect(root_bounds); + } else { + // This can happen when setting the shown ratio directly from one terminal + // value to the opposite. The height of the root view doesn't change, but + // the browser view must be re-laid out. + browser_view_->Layout(); + } + + // If the top controls are fully hidden, then the top container is laid out + // such that its bounds are outside the window. The window should continue to + // mask anything outside its bounds. + widget_layer->SetMasksToBounds(shown_ratio_ < 1.f); +} + +void TopControlsSlideControllerChromeOS::ShowTopChrome( + content::WebContents* contents, + bool animate) { + // If |animate| is true, we will rely on the renderer's compositor animating + // the value of the shown ratio and updating us by calling SetShownRatio() + // repeatedly. Otherwise we will set the shown ratio to 1.f immediately. + if (!animate) + SetShownRatio(contents, 1.f); + + // We also must synchronize with the renderer. + UpdateBrowserControlsStateShown(contents, animate); +}
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h new file mode 100644 index 0000000..7fc887c --- /dev/null +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h
@@ -0,0 +1,143 @@ +// 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_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_CHROMEOS_H_ + +#include <memory> + +#include "base/containers/flat_map.h" +#include "base/macros.h" +#include "chrome/browser/ui/ash/tablet_mode_client_observer.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" +#include "chrome/browser/ui/views/frame/top_controls_slide_controller.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" + +class BrowserView; +class TopControlsSlideTabObserver; + +// Implements the Android-like slide behavior of the browser top controls for +// Chrome OS. This behavior is enabled only in tablet mode when the browser is +// not in immersive fullscreen mode. The browser top controls (a.k.a. +// top-chrome) shows and hides with page gesture scrolls. +// This controller tracks the current values of the top controls shown ratio for +// the entire browser, as well as for each tab. The values tracked per tabs +// mirror the values kept in each renderer of the corresponding tab. +// +// There are many conditions that should fully show the browser top controls if +// they're fully hidden. Examples are: +// - Switching, creating, or removing tabs. +// - Tab's renderer process crashing or hanging. +// - Focusing on an editable element within a web-page. +// - Exiting tablet mode. +// - Entering immersive fullscreen mode. +// - Page security level changes. +class TopControlsSlideControllerChromeOS + : public TopControlsSlideController, + public TabletModeClientObserver, + public TabStripModelObserver, + public content::NotificationObserver { + public: + explicit TopControlsSlideControllerChromeOS(BrowserView* browser_view); + ~TopControlsSlideControllerChromeOS() override; + + // TopControlsSlideController: + bool IsEnabled() const override; + float GetShownRatio() const override; + void SetShownRatio(content::WebContents* contents, float ratio) override; + void OnBrowserFullscreenStateWillChange(bool new_fullscreen_state) override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; + + // TabletModeClientObserver: + void OnTabletModeToggled(bool enabled) override; + + // TabStripModelObserver: + // TODO(afakhry): The below overrides are deprecated, but we have to keep + // using them until Browser and BrowserView are migrated to the new API. + void TabInsertedAt(TabStripModel* tab_strip_model, + content::WebContents* contents, + int index, + bool foreground) override; + void TabDetachedAt(content::WebContents* contents, + int previous_index, + bool was_active) override; + void ActiveTabChanged(content::WebContents* old_contents, + content::WebContents* new_contents, + int index, + int reason) override; + void TabReplacedAt(TabStripModel* tab_strip_model, + content::WebContents* old_contents, + content::WebContents* new_contents, + int index) override; + void SetTabNeedsAttentionAt(int index, bool attention) override; + + // content::NotificationObserver: + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override; + + private: + // Refreshes the status of the browser top controls. + void Refresh(); + + // Prepares for sliding the browser top controls by creating the necessary + // layers, adjusting bounds and laying out the BrowserView one last time + // before we enter the transient state, during which layer transforms are used + // to slide the top controls. + void OnBeginSliding(); + + // Prepares for entering the steady state where the top controls reach their + // final positions, and the |shown_ratio_| reaches either one of its terminal + // values (1.f or 0.f). Layer transforms are reset to identity, and the + // BrowserView is laid out into its final bounds. + void OnEndSliding(); + + // Shows the top-chrome completely and updates the renderer of |contents| so + // that the values of the |shown_ratio_| and the renderer's + // |LayerTreeImpl::top_controls_shown_ratio_| are synchronized. + void ShowTopChrome(content::WebContents* contents, bool animate); + + BrowserView* browser_view_; + + // Represents the per-browser (as opposed to per-tab) shown ratio of the top + // controls that is currently applied. + float shown_ratio_ = 1.f; + + // The following two values are cached here since they need to be queried + // whenever we get an update from the renderer to adjust the shown ratio. + // These updates result from touch gesture scrolls, so we need to minimize the + // work we do to get these values, so sliding the browser top controls feels + // smooth. + bool tablet_mode_enabled_; + bool browser_frame_is_fullscreen_; + + // Indicates whether a touch gesture scrolling is in progress. This value is + // updated by the renderer when it receives a GestureEventAck of type either + // kGestureScrollBegin or kGestureScrollEnd. + bool is_gesture_scrolling_in_progress_ = false; + + // Indicates that the browser top controls are sliding up or down. This is + // different from |is_gesture_scrolling_in_progress_| above. The top controls + // may be sliding due an in-progress gesture scrolls or due to a renderer- + // managed animation (such as in response to showing tabs or focusing on an + // editable element within the page). + // As long as this value is true, we are in a transient state, and layer + // transforms are used to slide the top controls for efficiency. Once it turns + // false, the layer transforms are reset to identity and the browser view is + // re-laid out. + bool is_sliding_in_progress_ = false; + + // We need to observe the tab's web contents to listen to events that affect + // the browser top controls shown state for each tab. + base::flat_map<content::WebContents*, + std::unique_ptr<TopControlsSlideTabObserver>> + observed_tabs_; + + content::NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(TopControlsSlideControllerChromeOS); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_FRAME_TOP_CONTROLS_SLIDE_CONTROLLER_CHROMEOS_H_
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc new file mode 100644 index 0000000..4c655df --- /dev/null +++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
@@ -0,0 +1,698 @@ +// 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/ui/views/frame/top_controls_slide_controller.h" + +#include <memory> +#include <numeric> +#include <vector> + +#include "ash/public/cpp/ash_switches.h" +#include "ash/public/interfaces/constants.mojom.h" +#include "ash/public/interfaces/cros_display_config.mojom.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/command_line.h" +#include "base/path_service.h" +#include "base/strings/safe_sprintf.h" +#include "base/test/scoped_feature_list.h" +#include "cc/base/math_util.h" +#include "chrome/browser/ui/ash/tablet_mode_client.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/top_container_view.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/url_constants.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/common/service_manager_connection.h" +#include "content/public/test/browser_test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "services/service_manager/public/cpp/connector.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tree_host.h" +#include "ui/display/display.h" +#include "ui/events/test/event_generator.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/views/controls/native/native_view_host.h" +#include "ui/views/view_observer.h" + +namespace { + +enum class TopChromeShownState { + kFullyShown, + kFullyHidden, +}; + +// Using the given |generator| and the start and end points, it generates a +// gesture scroll sequence with appropriate velocity so that fling gesture +// scrolls are generated. +void GenerateGestureFlingScrollSequence(ui::test::EventGenerator* generator, + const gfx::Point& start_point, + const gfx::Point& end_point) { + DCHECK(generator); + generator->GestureScrollSequence( + start_point, end_point, + generator->CalculateScrollDurationForFlingVelocity( + start_point, end_point, 100 /* velocity */, 2 /* steps */), + 2 /* steps */); +} + +// Waits for the first non-empty paint for a given WebContents. To be able to +// test gesture scroll events reliably, we must wait until the tab is fully +// painted. Otherwise, the events will be ignored. +class TabNonEmptyPaintWaiter : public content::WebContentsObserver { + public: + explicit TabNonEmptyPaintWaiter(content::WebContents* web_contents) + : content::WebContentsObserver(web_contents) {} + + ~TabNonEmptyPaintWaiter() override = default; + + void Wait() { + if (web_contents()->CompletedFirstVisuallyNonEmptyPaint()) + return; + + run_loop_.Run(); + } + + private: + // content::WebContentsObserver: + void DidFirstVisuallyNonEmptyPaint() override { run_loop_.Quit(); } + + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(TabNonEmptyPaintWaiter); +}; + +// Waits for a given browser top controls shown ratio on a given browser window. +class TopControlsShownRatioWaiter { + public: + explicit TopControlsShownRatioWaiter( + const TopControlsSlideController* controller) + : controller_(controller) {} + + void WaitForRatio(float ratio) { + waiting_for_shown_ratio_ = ratio; + if (CheckRatio()) + return; + + run_loop_ = std::make_unique<base::RunLoop>(); + run_loop_->Run(); + } + + private: + bool CheckRatio() { + if (cc::MathUtil::IsWithinEpsilon(controller_->GetShownRatio(), + waiting_for_shown_ratio_)) { + if (run_loop_) + run_loop_->Quit(); + + return true; + } + + ScheduleCheck(); + return false; + } + + void ScheduleCheck() { + base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce( + base::IgnoreResult(&TopControlsShownRatioWaiter::CheckRatio), + base::Unretained(this)), + base::TimeDelta::FromMilliseconds(100)); + } + + const TopControlsSlideController* controller_; + + std::unique_ptr<base::RunLoop> run_loop_; + + float waiting_for_shown_ratio_ = 0; + + DISALLOW_COPY_AND_ASSIGN(TopControlsShownRatioWaiter); +}; + +class TopControlsSlideControllerTest : public InProcessBrowserTest { + public: + TopControlsSlideControllerTest() = default; + ~TopControlsSlideControllerTest() override = default; + + BrowserView* browser_view() const { + return BrowserView::GetBrowserViewForBrowser(browser()); + } + + const TopControlsSlideController* top_controls_slide_controller() const { + return browser_view()->top_controls_slide_controller(); + } + + // InProcessBrowserTest: + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature( + features::kSlideTopChromeWithPageScrolls); + InProcessBrowserTest::SetUp(); + } + + void SetUpDefaultCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpDefaultCommandLine(command_line); + + command_line->AppendSwitch(ash::switches::kAshEnableTabletMode); + } + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + host_resolver()->AddRule("*", "127.0.0.1"); + + // Add content/test/data so we can use cross_site_iframe_factory.html + base::FilePath test_data_dir; + ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); + embedded_test_server()->ServeFilesFromDirectory( + test_data_dir.AppendASCII("chrome/test/data/top_controls_scroll")); + ASSERT_TRUE(embedded_test_server()->Start()); + } + + void OpenUrlAtIndex(const GURL& url, int index) { + AddTabAtIndex(0, url, ui::PAGE_TRANSITION_TYPED); + TabNonEmptyPaintWaiter waiter( + browser()->tab_strip_model()->GetActiveWebContents()); + waiter.Wait(); + } + + void ToggleTabletMode() { + auto* tablet_mode_client = TabletModeClient::Get(); + tablet_mode_client->OnTabletModeToggled( + !tablet_mode_client->tablet_mode_enabled()); + } + + bool GetTabletModeEnabled() const { + return TabletModeClient::Get()->tablet_mode_enabled(); + } + + void CheckBrowserLayout(BrowserView* browser_view, + TopChromeShownState shown_state) const { + const int top_controls_height = browser_view->GetTopControlsHeight(); + EXPECT_NE(top_controls_height, 0); + + ui::Layer* root_view_layer = browser_view->frame()->GetRootView()->layer(); + + // The fully-shown and fully-hidden states are terminal states. We check + // when we reach the steady state. The root view should not have a layer + // now. + ASSERT_FALSE(root_view_layer); + + // The contents layer transform should be restored to identity. + gfx::Transform expected_transform; + DCHECK( + browser_view->contents_web_view()->holder()->GetNativeViewContainer()); + ui::Layer* contents_container_layer = browser_view->contents_web_view() + ->holder() + ->GetNativeViewContainer() + ->layer(); + ASSERT_TRUE(contents_container_layer); + CompareTranslations(expected_transform, + contents_container_layer->transform()); + + // The BrowserView layout should be adjusted properly: + const gfx::Rect& top_container_bounds = + browser_view->top_container()->bounds(); + EXPECT_EQ(top_container_bounds.height(), top_controls_height); + + const int top_container_bottom = top_container_bounds.bottom(); + const gfx::Rect& contents_container_bounds = + browser_view->contents_container()->bounds(); + // The top of the contents depends on whether there is a detached bookmark + // bar as in the NTP page. + int detached_bookmark_bar_height = 0; + if (browser_view->bookmark_bar() && + browser_view->bookmark_bar()->IsDetached()) { + // The detached bookmark bar appears to be part of the contents. It starts + // right after the top container, and the contents container starts right + // after it. + const gfx::Rect& bookmark_bar_bounds = + browser_view->bookmark_bar()->bounds(); + detached_bookmark_bar_height = bookmark_bar_bounds.height(); + EXPECT_EQ(top_container_bottom, bookmark_bar_bounds.y()); + EXPECT_EQ(bookmark_bar_bounds.bottom(), contents_container_bounds.y()); + } else { + EXPECT_EQ(top_container_bottom, contents_container_bounds.y()); + } + + if (shown_state == TopChromeShownState::kFullyHidden) { + // Top container is shifted up. + EXPECT_EQ(top_container_bounds.y(), -top_controls_height); + + // Contents should occupy the entire height of the browser view, minus + // the height of a detached bookmark bar if any. + EXPECT_EQ(browser_view->height() - detached_bookmark_bar_height, + browser_view->contents_container()->height()); + + // Widget should not allow things to show outside its bounds. + EXPECT_TRUE(browser_view->frame()->GetLayer()->GetMasksToBounds()); + } else { + // Top container start at the top. + EXPECT_EQ(top_container_bounds.y(), 0); + + // Contents should occupy the remainder of the browser view after the top + // container and the detached bookmark bar if any. + EXPECT_EQ(browser_view->height() - top_controls_height - + detached_bookmark_bar_height, + browser_view->contents_container()->height()); + + EXPECT_FALSE(browser_view->frame()->GetLayer()->GetMasksToBounds()); + } + } + + private: + void CompareTranslations(const gfx::Transform& t1, + const gfx::Transform& t2) const { + const gfx::Vector2dF t1_translation = t1.To2dTranslation(); + const gfx::Vector2dF t2_translation = t2.To2dTranslation(); + EXPECT_FLOAT_EQ(t1_translation.x(), t2_translation.x()); + EXPECT_FLOAT_EQ(t1_translation.y(), t2_translation.y()); + } + + base::test::ScopedFeatureList scoped_feature_list_; + + DISALLOW_COPY_AND_ASSIGN(TopControlsSlideControllerTest); +}; + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, DisabledForHostedApps) { + browser()->window()->Close(); + + // Open a new app window. + Browser::CreateParams params = Browser::CreateParams::CreateForApp( + "test_browser_app", true /* trusted_source */, gfx::Rect(), + browser()->profile(), true); + params.initial_show_state = ui::SHOW_STATE_DEFAULT; + Browser* browser = new Browser(params); + AddBlankTabAndShow(browser); + + ASSERT_TRUE(browser->is_app()); + + // No slide controller gets created for hosted apps. + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); + EXPECT_FALSE(browser_view->top_controls_slide_controller()); + + // Renderer will get a zero-height top controls. + EXPECT_EQ(browser_view->GetTopControlsHeight(), 0); +} + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, + EnabledOnlyForTabletNonImmersiveModes) { + EXPECT_FALSE(GetTabletModeEnabled()); + AddBlankTabAndShow(browser()); + // For a normal browser, the controller is created. + ASSERT_TRUE(top_controls_slide_controller()); + // But the behavior is disabled since we didn't go to tablet mode yet. + EXPECT_FALSE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + // The browser reports a zero height for top-chrome UIs when the behavior is + // disabled, so the render doesn't think it needs to move the top controls. + EXPECT_EQ(browser_view()->GetTopControlsHeight(), 0); + + // Now enable tablet mode. + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + + // The behavior is enabled, but the shown ratio remains at 1.f since no page + // scrolls happened yet. + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + EXPECT_NE(browser_view()->GetTopControlsHeight(), 0); + + // Immersive fullscreen mode disables the behavior. + chrome::ToggleFullscreenMode(browser()); + EXPECT_TRUE(browser_view()->IsFullscreen()); + EXPECT_FALSE(top_controls_slide_controller()->IsEnabled()); + EXPECT_EQ(browser_view()->GetTopControlsHeight(), 0); + + // Exit immersive mode. + chrome::ToggleFullscreenMode(browser()); + EXPECT_FALSE(browser_view()->IsFullscreen()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_NE(browser_view()->GetTopControlsHeight(), 0); + + ToggleTabletMode(); + EXPECT_FALSE(GetTabletModeEnabled()); + EXPECT_FALSE(top_controls_slide_controller()->IsEnabled()); + EXPECT_EQ(browser_view()->GetTopControlsHeight(), 0); +} + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, TestScrollingPage) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + // Navigate to our test page that has a long vertical content which we can use + // to test page scrolling. + OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"), + 0); + + aura::Window* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + + // The above EventGenerator ctor initializes current_location() to the center + // point of |browser_window|. Let's start a fast gesture scroll from that + // point towards another point above it. + const gfx::Point start_point = event_generator.current_location(); + const gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Perform another gesture scroll in the opposite direction and expect top- + // chrome to be fully shown. + GenerateGestureFlingScrollSequence(&event_generator, end_point, start_point); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); +} + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, + TestScrollingPageAndSwitchingToNTP) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + // Add a tab containing a local NTP page. NTP pages are not permitted to hide + // top-chrome with scrolling. + ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)); + ASSERT_EQ(browser()->tab_strip_model()->count(), 1); + + // Navigate to our test page that has a long vertical content which we can use + // to test page scrolling. + OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"), + 0); + ASSERT_EQ(browser()->tab_strip_model()->count(), 2); + + auto* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + + // Scroll the `top_controls_scroll.html` page such that top-chrome is now + // fully hidden. + const gfx::Point start_point = event_generator.current_location(); + const gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Simulate (Ctrl + Tab) shortcut to select the next tab. Top-chrome should + // show automatically. + browser()->tab_strip_model()->SelectNextTab(); + EXPECT_EQ(browser()->tab_strip_model()->active_index(), 1); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Since this is the NTP page, gesture scrolling will not hide top-chrome. It + // will remain fully shown. + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Switch back to the scrollable page, it should be possible now to hide top- + // chrome. + browser()->tab_strip_model()->SelectNextTab(); + EXPECT_EQ(browser()->tab_strip_model()->active_index(), 0); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); +} + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, TestClosingATab) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + // Navigate to our test scrollable page. + ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/top_controls_scroll.html")); + TabNonEmptyPaintWaiter paint_waiter( + browser()->tab_strip_model()->GetActiveWebContents()); + paint_waiter.Wait(); + ASSERT_EQ(browser()->tab_strip_model()->count(), 1); + + // Scroll to fully hide top-chrome. + auto* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + const gfx::Point start_point = event_generator.current_location(); + const gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Simulate (Ctrl + T) by inserting a new tab. Expect top-chrome to be fully + // shown. + chrome::NewTab(browser()); + waiter.WaitForRatio(1.f); + EXPECT_EQ(browser()->tab_strip_model()->active_index(), 1); + EXPECT_EQ(browser()->tab_strip_model()->count(), 2); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Now simulate (Ctrl + W) by closing this newly created tab, expect to return + // to the scrollable page tab, which used to have a top-chrome shown ratio of + // 0. We should expect that it will animate back to a shown ratio of 1. + // This test is needed to make sure that the native view of the web contents + // of the newly selected tab after the current one is closed will attach to + // the browser's native view host *before* we attempt to make any changes to + // its top-chrome shown ratio. + chrome::CloseTab(browser()); + waiter.WaitForRatio(1.f); + EXPECT_EQ(browser()->tab_strip_model()->active_index(), 0); + EXPECT_EQ(browser()->tab_strip_model()->count(), 1); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // It is still possible to slide top-chrome up. + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); +} + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, + TestFocusEditableElements) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + // Navigate to our test page that has a long vertical content which we can use + // to test page scrolling. + OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"), + 0); + + auto* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + + // Scroll the `top_controls_scroll.html` page such that top-chrome is now + // fully hidden. + const gfx::Point start_point = event_generator.current_location(); + const gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Define an internal lambda that returns the javascript function body that + // can be executed on the focus on `top_controls_scroll.html` page to focus on + // an editable text input field in the page, or blur its focus depending on + // the |should_focus| parameter. + auto get_js_function_body = [](bool should_focus) -> std::string { + constexpr size_t kBufferSize = 1024; + char buffer[kBufferSize]; + base::strings::SafeSPrintf( + buffer, + "domAutomationController.send(" + " ((function() {" + " var editableElement =" + " document.getElementById('editable-element');" + " if (editableElement) {" + " editableElement.%s();" + " return true;" + " }" + " return false;" + " })()));", + should_focus ? "focus" : "blur"); + return std::string(buffer); + }; + + // Focus on the editable element in the page and expect that top-chrome will + // be shown. + content::WebContents* contents = browser_view()->GetActiveWebContents(); + bool bool_result = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + contents, get_js_function_body(true /* should_focus */), &bool_result)); + EXPECT_TRUE(bool_result); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Now try scrolling in a way that would normally hide top-chrome, and expect + // that top-chrome will be forced shown as long as the editable element is + // focused. + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Now blur the focused editable element. Expect that top-chrome can now be + // hidden with gesture scrolls. + bool_result = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + contents, get_js_function_body(false /* should_focus */), &bool_result)); + EXPECT_TRUE(bool_result); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); +} + +// Used to wait for the browser view to change its bounds as a result of display +// rotation. +class BrowserViewLayoutWaiter : public views::ViewObserver { + public: + explicit BrowserViewLayoutWaiter(BrowserView* browser_view) + : browser_view_(browser_view) { + browser_view->AddObserver(this); + } + ~BrowserViewLayoutWaiter() override { browser_view_->RemoveObserver(this); } + + void Wait() { + if (view_bounds_changed_) { + view_bounds_changed_ = false; + return; + } + + run_loop_ = std::make_unique<base::RunLoop>(); + run_loop_->Run(); + } + + // views::ViewObserver: + void OnViewBoundsChanged(views::View* observed_view) override { + view_bounds_changed_ = true; + if (run_loop_) + run_loop_->Quit(); + } + + private: + BrowserView* browser_view_; + + bool view_bounds_changed_ = false; + + std::unique_ptr<base::RunLoop> run_loop_; + + DISALLOW_COPY_AND_ASSIGN(BrowserViewLayoutWaiter); +}; + +IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, DisplayRotation) { + ToggleTabletMode(); + ASSERT_TRUE(GetTabletModeEnabled()); + EXPECT_TRUE(top_controls_slide_controller()->IsEnabled()); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + + // Maximizing the browser window makes the browser view layout more + // predictable with display rotation, as it's just resized to match the + // display bounds. + browser_view()->frame()->Maximize(); + + // Navigate to our scrollable test page, scroll with touch gestures so that + // top-chrome is fully hidden. + OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"), + 0); + aura::Window* browser_window = browser()->window()->GetNativeWindow(); + ui::test::EventGenerator event_generator(browser_window->GetRootWindow(), + browser_window); + gfx::Point start_point = event_generator.current_location(); + gfx::Point end_point = start_point + gfx::Vector2d(0, -100); + GenerateGestureFlingScrollSequence(&event_generator, start_point, end_point); + TopControlsShownRatioWaiter waiter(top_controls_slide_controller()); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Try all possible rotations. Changing display rotation should *not* unhide + // top chrome. + const std::vector<display::Display::Rotation> rotations_to_try = { + display::Display::ROTATE_90, display::Display::ROTATE_180, + display::Display::ROTATE_270, display::Display::ROTATE_0, + }; + + ash::mojom::CrosDisplayConfigControllerPtr cros_display_config; + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->BindInterface(ash::mojom::kServiceName, &cros_display_config); + ash::mojom::CrosDisplayConfigControllerAsyncWaiter waiter_for( + cros_display_config.get()); + std::vector<ash::mojom::DisplayUnitInfoPtr> info_list; + waiter_for.GetDisplayUnitInfoList(false /* single_unified */, &info_list); + for (const ash::mojom::DisplayUnitInfoPtr& display_unit_info : info_list) { + const std::string display_id = display_unit_info->id; + for (const auto& rotation : rotations_to_try) { + BrowserViewLayoutWaiter browser_view_layout_waiter(browser_view()); + auto config_properties = ash::mojom::DisplayConfigProperties::New(); + config_properties->rotation = ash::mojom::DisplayRotation::New(rotation); + ash::mojom::DisplayConfigResult result; + waiter_for.SetDisplayProperties(display_id, std::move(config_properties), + &result); + EXPECT_EQ(result, ash::mojom::DisplayConfigResult::kSuccess); + + // Wait for the browser view to change its bounds as a result of display + // rotation. + browser_view_layout_waiter.Wait(); + + // Make sure top-chrome is still hidden. + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + + // Now perform gesture scrolls to show top-chrome, make sure everything + // looks good in this rotation. + // Update the start and end points after rotation. + start_point = browser_window->GetBoundsInRootWindow().CenterPoint(); + end_point = start_point + gfx::Vector2d(0, -100); + + // Make sure to send them in screen coordinates to make sure rotation + // is taken into consideration. + browser_window->GetRootWindow()->GetHost()->ConvertDIPToScreenInPixels( + &start_point); + browser_window->GetRootWindow()->GetHost()->ConvertDIPToScreenInPixels( + &end_point); + GenerateGestureFlingScrollSequence(&event_generator, end_point, + start_point); + waiter.WaitForRatio(1.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 1.f); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyShown); + + // Scroll again to hide top-chrome in preparation for the next rotation + // iteration. + GenerateGestureFlingScrollSequence(&event_generator, start_point, + end_point); + waiter.WaitForRatio(0.f); + EXPECT_FLOAT_EQ(top_controls_slide_controller()->GetShownRatio(), 0); + CheckBrowserLayout(browser_view(), TopChromeShownState::kFullyHidden); + } + } +} + +} // namespace
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 f779bee2..2e0e368 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -1055,9 +1055,17 @@ return transition(); } +base::TimeTicks LocationBarView::GetMatchSelectionTimestamp() const { + return match_selection_timestamp(); +} + void LocationBarView::AcceptInput() { - omnibox_view_->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, - false); + AcceptInput(base::TimeTicks()); +} + +void LocationBarView::AcceptInput(base::TimeTicks match_selection_timestamp) { + omnibox_view_->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false, + match_selection_timestamp); } void LocationBarView::FocusSearch() {
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 99a8916..e29b2fe0 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -339,7 +339,9 @@ GURL GetDestinationURL() const override; WindowOpenDisposition GetWindowOpenDisposition() const override; ui::PageTransition GetPageTransition() const override; + base::TimeTicks GetMatchSelectionTimestamp() const override; void AcceptInput() override; + void AcceptInput(base::TimeTicks match_selection_timestamp) override; void FocusSearch() override; void UpdateContentSettingsIcons() override; void UpdateManagePasswordsIconAndBubble() override;
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view.cc b/chrome/browser/ui/views/location_bar/location_icon_view.cc index 199afec..86ffa0bd 100644 --- a/chrome/browser/ui/views/location_bar/location_icon_view.cc +++ b/chrome/browser/ui/views/location_bar/location_icon_view.cc
@@ -46,7 +46,7 @@ text = OmniboxView::SanitizeTextForPaste(text); OmniboxEditModel* model = location_bar_->GetOmniboxView()->model(); if (model->CanPasteAndGo(text)) - model->PasteAndGo(text); + model->PasteAndGo(text, event.time_stamp()); } IconLabelBubbleView::OnMousePressed(event);
diff --git a/chrome/browser/ui/views/media_router/cast_toolbar_button.cc b/chrome/browser/ui/views/media_router/cast_toolbar_button.cc index d04cee3..10d38ea 100644 --- a/chrome/browser/ui/views/media_router/cast_toolbar_button.cc +++ b/chrome/browser/ui/views/media_router/cast_toolbar_button.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/media/router/media_router.h" #include "chrome/browser/media/router/media_router_dialog_controller.h" #include "chrome/browser/media/router/media_router_factory.h" +#include "chrome/browser/media/router/media_router_metrics.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/media_router/media_router_ui_service.h" #include "chrome/grit/generated_resources.h" @@ -167,6 +168,8 @@ dialog_controller->HideMediaRouterDialog(); } else { dialog_controller->ShowMediaRouterDialog(); + MediaRouterMetrics::RecordMediaRouterDialogOrigin( + MediaRouterDialogOpenOrigin::TOOLBAR); } }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index bf0358a..25d5298 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -326,18 +326,24 @@ // which case there's nothing we need to do. } -void OmniboxPopupContentsView::OpenMatch(size_t index, - WindowOpenDisposition disposition) { +void OmniboxPopupContentsView::OpenMatch( + size_t index, + WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp) { DCHECK(HasMatchAt(index)); omnibox_view_->OpenMatch(model_->result().match_at(index), disposition, - GURL(), base::string16(), index); + GURL(), base::string16(), index, + match_selection_timestamp); } -void OmniboxPopupContentsView::OpenMatch(WindowOpenDisposition disposition) { +void OmniboxPopupContentsView::OpenMatch( + WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp) { size_t index = model_->selected_line(); omnibox_view_->OpenMatch(model_->result().match_at(index), disposition, - GURL(), base::string16(), index); + GURL(), base::string16(), index, + match_selection_timestamp); } gfx::Image OmniboxPopupContentsView::GetMatchIcon( @@ -523,7 +529,8 @@ break; case ui::ET_GESTURE_TAP: case ui::ET_GESTURE_SCROLL_END: - OpenMatch(event_location_index, WindowOpenDisposition::CURRENT_TAB); + OpenMatch(event_location_index, WindowOpenDisposition::CURRENT_TAB, + event->time_stamp()); break; default: return;
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h index 619eded..4224dfad 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h
@@ -33,8 +33,11 @@ // Opens a match from the list specified by |index| with the type of tab or // window specified by |disposition|. - void OpenMatch(WindowOpenDisposition disposition); - void OpenMatch(size_t index, WindowOpenDisposition disposition); + void OpenMatch(WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp); + void OpenMatch(size_t index, + WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp); // Returns the icon that should be displayed next to |match|. If the icon is // available as a vector icon, it will be |vector_icon_color|.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 9e3fe0c..fb01ca7 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -236,7 +236,7 @@ // |button| is the tab switch button. void OmniboxResultView::ButtonPressed(views::Button* button, const ui::Event& event) { - OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB); + OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB, event.time_stamp()); } //////////////////////////////////////////////////////////////////////////////// @@ -317,7 +317,8 @@ if (event.IsOnlyMiddleMouseButton() || event.IsOnlyLeftMouseButton()) { OpenMatch(event.IsOnlyLeftMouseButton() ? WindowOpenDisposition::CURRENT_TAB - : WindowOpenDisposition::NEW_BACKGROUND_TAB); + : WindowOpenDisposition::NEW_BACKGROUND_TAB, + event.time_stamp()); } } @@ -384,8 +385,9 @@ return model_->IsSelectedIndex(model_index_); } -void OmniboxResultView::OpenMatch(WindowOpenDisposition disposition) { - model_->OpenMatch(model_index_, disposition); +void OmniboxResultView::OpenMatch(WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp) { + model_->OpenMatch(model_index_, disposition, match_selection_timestamp); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h index e7529a6..83dfce9 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -96,8 +96,10 @@ // Whether |this| matches the model's selected index. bool IsSelected() const; - // Call model's OpenMatch() with the selected index and provided disposition. - void OpenMatch(WindowOpenDisposition disposition); + // Call model's OpenMatch() with the selected index and provided disposition + // and timestamp the match was selected (base::TimeTicks() if unknown). + void OpenMatch(WindowOpenDisposition disposition, + base::TimeTicks match_selection_timestamp); // views::View: const char* GetClassName() const override;
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc index ffec964..47eb60d 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -1238,18 +1238,21 @@ if (model()->popup_model()->SelectedLineHasTabMatch() && model()->popup_model()->selected_line_state() == OmniboxPopupModel::TAB_SWITCH) { - popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB); + popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB, + event.time_stamp()); } else { if (alt || (shift && command)) { - model()->AcceptInput(WindowOpenDisposition::NEW_FOREGROUND_TAB, - false); + model()->AcceptInput(WindowOpenDisposition::NEW_FOREGROUND_TAB, false, + event.time_stamp()); } else if (command) { - model()->AcceptInput(WindowOpenDisposition::NEW_BACKGROUND_TAB, - false); + model()->AcceptInput(WindowOpenDisposition::NEW_BACKGROUND_TAB, false, + event.time_stamp()); } else if (shift) { - model()->AcceptInput(WindowOpenDisposition::NEW_WINDOW, false); + model()->AcceptInput(WindowOpenDisposition::NEW_WINDOW, false, + event.time_stamp()); } else { - model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false); + model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false, + event.time_stamp()); } } return true; @@ -1377,7 +1380,8 @@ model()->popup_model()->SelectedLineHasTabMatch() && model()->popup_model()->selected_line_state() == OmniboxPopupModel::TAB_SWITCH) { - popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB); + popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB, + event.time_stamp()); return true; } }
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 2336309..1d006ce 100644 --- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc +++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -18,6 +18,7 @@ #if defined(USE_AURA) #include "ui/aura/window.h" #include "ui/aura/window_targeter.h" +#include "ui/base/ui_base_features.h" #endif #if defined(OS_WIN) @@ -230,7 +231,13 @@ // portion of the Widget to pass through to the omnibox beneath it. auto results_targeter = std::make_unique<aura::WindowTargeter>(); results_targeter->SetInsets(GetInsets() + GetContentInsets()); - GetWidget()->GetNativeWindow()->SetEventTargeter(std::move(results_targeter)); + aura::Window* window = GetWidget()->GetNativeWindow(); + if (features::IsUsingWindowService()) { + // The WindowService ends up creating an additional window (by way of + // DesktopNativeWidgetAura). The targeter needs to be installed on it. + window = window->GetRootWindow(); + } + window->SetEventTargeter(std::move(results_targeter)); #endif // USE_AURA }
diff --git a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc index ed3c0ae..1188e96 100644 --- a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc +++ b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc
@@ -19,6 +19,7 @@ #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/credit_card.h" #include "components/autofill/core/browser/payments/full_card_request.h" +#include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/validation.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/grit/components_scaled_resources.h" @@ -66,6 +67,7 @@ IdentityManagerFactory::GetForProfile( Profile::FromBrowserContext(web_contents_->GetBrowserContext()) ->GetOriginalProfile()), + state->GetPersonalDataManager(), Profile::FromBrowserContext(web_contents_->GetBrowserContext()) ->IsOffTheRecord()), full_card_request_(this,
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc index 4d614912..a053f001 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -293,15 +293,17 @@ AvatarToolbarButton::SyncState AvatarToolbarButton::GetSyncState() const { #if !defined(OS_CHROMEOS) - if (profile_->IsSyncAllowed() && error_controller_.HasAvatarError()) { + SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile_); + if (signin_manager && signin_manager->IsAuthenticated() && + profile_->IsSyncAllowed() && error_controller_.HasAvatarError()) { // When DICE is enabled and the error is an auth error, the sync-paused // icon is shown. int unused; const bool should_show_sync_paused_ui = AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_) && - sync_ui_util::GetMessagesForAvatarSyncError( - profile_, *SigninManagerFactory::GetForProfile(profile_), &unused, - &unused) == sync_ui_util::AUTH_ERROR; + sync_ui_util::GetMessagesForAvatarSyncError(profile_, *signin_manager, + &unused, &unused) == + sync_ui_util::AUTH_ERROR; return should_show_sync_paused_ui ? SyncState::kPaused : SyncState::kError; } #endif // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc index c5e14b9..aa107b1 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -10,7 +10,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/signin_promo.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/views/frame/browser_view.h" @@ -18,6 +17,7 @@ #include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" #include "chrome/common/url_constants.h" #include "components/constrained_window/constrained_window_views.h" +#include "components/unified_consent/feature.h" #include "components/web_modal/web_contents_modal_dialog_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" @@ -28,7 +28,7 @@ const int kFixedGaiaViewHeight = 612; const int kModalDialogWidth = 448; -const int kModalDialogWidthForDice = 512; +const int kModalDialogWidthForUnifiedConsent = 512; const int kSyncConfirmationDialogHeight = 487; const int kSigninErrorDialogHeight = 164; @@ -40,10 +40,11 @@ } int GetSyncConfirmationDialogPreferredWidth(Profile* profile) { - // With Unity-enabled profiles, we show a different sync confirmation dialog + // If unified consent is enabled, we show a different sync confirmation dialog // which uses a different width. - return IsUnifiedConsentFeatureEnabled(profile) && profile->IsSyncAllowed() - ? kModalDialogWidthForDice + return unified_consent::IsUnifiedConsentFeatureEnabled() && + profile->IsSyncAllowed() + ? kModalDialogWidthForUnifiedConsent : kModalDialogWidth; }
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc index 174db76..2343738 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -1591,10 +1591,14 @@ SetDeferredTargetTabstrip(nullptr); deferred_target_tabstrip_observer_.reset(); + // GetCursorScreenPoint() needs to be called before Detach() is called as + // GetCursorScreenPoint() may use the current attached tabstrip to get the + // touch event position but Detach() sets attached tabstrip to nullptr. + const gfx::Point current_screen_point = GetCursorScreenPoint(); Detach(DONT_RELEASE_CAPTURE); // If we're attaching the dragged tabs to an overview window's tabstrip, the // tabstrip should not have focus. - Attach(target_tabstrip, GetCursorScreenPoint(), /*set_capture=*/false); + Attach(target_tabstrip, current_screen_point, /*set_capture=*/false); #endif }
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc index bcad9028..f1a8dfd 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -2950,6 +2950,73 @@ EXPECT_EQ(3u, browser_list->size()); } +namespace { + +void SecondFingerPressTestStep3(DetachToBrowserTabDragControllerTest* test) { + ASSERT_TRUE(test->ReleaseInput()); +} + +void SecondFingerPressTestStep2(DetachToBrowserTabDragControllerTest* test, + TabStrip* not_attached_tab_strip, + TabStrip* target_tab_strip) { + ASSERT_TRUE(TabDragController::IsActive()); + + // And there should be three browser windows, including the newly created one + // for the dragged tab. + EXPECT_EQ(3u, test->browser_list->size()); + + // Put the window that accociated with |target_tab_strip| in overview. + target_tab_strip->GetWidget()->GetNativeWindow()->SetProperty( + ash::kIsShowingInOverviewKey, true); + + // Drag to |target_tab_strip|. + gfx::Point target_point(target_tab_strip->width() / 2, + target_tab_strip->height() / 2); + views::View::ConvertPointToScreen(target_tab_strip, &target_point); + ASSERT_TRUE(test->DragInputTo(target_point)); + + // Now add a second finger to tap on it. + not_attached_tab_strip->GetWidget()->GetNativeWindow()->env()->set_touch_down( + true); + ASSERT_TRUE(test->PressInput2()); + ASSERT_TRUE(test->ReleaseInput2()); + + ASSERT_TRUE(test->DragInputToNotifyWhenDone( + target_point.x(), target_point.y(), + base::BindOnce(&SecondFingerPressTestStep3, test))); +} + +} // namespace + +// Tests that when drgging a tab to a browser window that's currently in +// overview, press the second finger should not cause chrome crash. +IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTestTouch, + SecondFingerPressTest) { + TabStrip* tab_strip = GetTabStripForBrowser(browser()); + + // Add another tab to browser(). + AddTabAndResetBrowser(browser()); + + // Create another browser. + Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); + TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); + + // Move to the first tab and drag it enough so that it detaches, but not + // enough that it attaches to browser2. + gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); + ASSERT_TRUE(PressInput(tab_0_center)); + ASSERT_TRUE(DragInputToNotifyWhenDone( + tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), + base::BindOnce(&SecondFingerPressTestStep2, this, tab_strip, + tab_strip2))); + QuitWhenNotDragging(); + + // Test that after dragging there is no crash and the dragged tab should now + // be merged into the target tabstrip. + ASSERT_FALSE(TabDragController::IsActive()); + EXPECT_EQ(2u, browser_list->size()); +} + #endif // OS_CHROMEOS #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index f816117..151f6c5 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -41,6 +41,7 @@ #include "chrome/browser/ui/webui/invalidations_ui.h" #include "chrome/browser/ui/webui/local_state/local_state_ui.h" #include "chrome/browser/ui/webui/log_web_ui_url.h" +#include "chrome/browser/ui/webui/management_ui.h" #include "chrome/browser/ui/webui/media/media_engagement_ui.h" #include "chrome/browser/ui/webui/media/webrtc_logs_ui.h" #include "chrome/browser/ui/webui/memory_internals_ui.h" @@ -379,6 +380,8 @@ return &NewWebUI<InvalidationsUI>; if (url.host_piece() == chrome::kChromeUILocalStateHost) return &NewWebUI<LocalStateUI>; + if (url.host_piece() == chrome::kChromeUIManagementHost) + return &NewWebUI<ManagementUI>; if (url.host_piece() == chrome::kChromeUIMemoryInternalsHost) return &NewWebUI<MemoryInternalsUI>; if (url.host_piece() == chrome::kChromeUINetExportHost)
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.cc index c7be21e..c550b13 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.cc
@@ -4,233 +4,20 @@ #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/consent_auditor/consent_auditor_factory.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h" -#include "chrome/browser/ui/webui/chromeos/user_image_source.h" -#include "chrome/grit/browser_resources.h" -#include "chrome/grit/generated_resources.h" #include "chromeos/services/assistant/public/mojom/constants.mojom.h" #include "chromeos/services/assistant/public/proto/settings_ui.pb.h" #include "components/arc/arc_prefs.h" -#include "components/consent_auditor/consent_auditor.h" #include "components/login/localized_values_builder.h" #include "components/prefs/pref_service.h" -#include "components/signin/core/browser/signin_manager_base.h" -#include "components/user_manager/user_manager.h" #include "services/service_manager/public/cpp/connector.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/webui/web_ui_util.h" - -using sync_pb::UserConsentTypes; namespace chromeos { namespace { -constexpr char kJsScreenPath[] = "assistantOptin"; - -// Construct SettingsUiSelector for the ConsentFlow UI. -assistant::SettingsUiSelector GetSettingsUiSelector() { - assistant::SettingsUiSelector selector; - assistant::ConsentFlowUiSelector* consent_flow_ui = - selector.mutable_consent_flow_ui_selector(); - consent_flow_ui->set_flow_id(assistant::ActivityControlSettingsUiSelector:: - ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS); - selector.set_email_opt_in(true); - return selector; -} - -// Construct SettingsUiUpdate for user opt-in. -assistant::SettingsUiUpdate GetSettingsUiUpdate( - const std::string& consent_token) { - assistant::SettingsUiUpdate update; - assistant::ConsentFlowUiUpdate* consent_flow_update = - update.mutable_consent_flow_ui_update(); - consent_flow_update->set_flow_id( - assistant::ActivityControlSettingsUiSelector:: - ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS); - consent_flow_update->set_consent_token(consent_token); - - return update; -} - -// Construct SettingsUiUpdate for email opt-in. -assistant::SettingsUiUpdate GetEmailOptInUpdate(bool opted_in) { - assistant::SettingsUiUpdate update; - assistant::EmailOptInUpdate* email_optin_update = - update.mutable_email_opt_in_update(); - email_optin_update->set_email_opt_in_update_state( - opted_in ? assistant::EmailOptInUpdate::OPT_IN - : assistant::EmailOptInUpdate::OPT_OUT); - - return update; -} - -using SettingZippyList = google::protobuf::RepeatedPtrField< - assistant::ClassicActivityControlUiTexts::SettingZippy>; -// Helper method to create zippy data. -base::Value CreateZippyData(const SettingZippyList& zippy_list) { - base::Value zippy_data(base::Value::Type::LIST); - for (auto& setting_zippy : zippy_list) { - base::Value data(base::Value::Type::DICTIONARY); - data.SetKey("title", base::Value(setting_zippy.title())); - if (setting_zippy.description_paragraph_size()) { - data.SetKey("description", - base::Value(setting_zippy.description_paragraph(0))); - } - if (setting_zippy.additional_info_paragraph_size()) { - data.SetKey("additionalInfo", - base::Value(setting_zippy.additional_info_paragraph(0))); - } - data.SetKey("iconUri", base::Value(setting_zippy.icon_uri())); - data.SetKey("popupLink", base::Value(l10n_util::GetStringUTF16( - IDS_ASSISTANT_ACTIVITY_CONTROL_POPUP_LINK))); - zippy_data.GetList().push_back(std::move(data)); - } - return zippy_data; -} - -// Helper method to create disclosure data. -base::Value CreateDisclosureData(const SettingZippyList& disclosure_list) { - base::Value disclosure_data(base::Value::Type::LIST); - for (auto& disclosure : disclosure_list) { - base::Value data(base::Value::Type::DICTIONARY); - data.SetKey("title", base::Value(disclosure.title())); - if (disclosure.description_paragraph_size()) { - data.SetKey("description", - base::Value(disclosure.description_paragraph(0))); - } - if (disclosure.additional_info_paragraph_size()) { - data.SetKey("additionalInfo", - base::Value(disclosure.additional_info_paragraph(0))); - } - data.SetKey("iconUri", base::Value(disclosure.icon_uri())); - disclosure_data.GetList().push_back(std::move(data)); - } - return disclosure_data; -} - -// Helper method to create get more screen data. -base::Value CreateGetMoreData(bool email_optin_needed, - const assistant::EmailOptInUi& email_optin_ui) { - base::Value get_more_data(base::Value::Type::LIST); - - // Process hotword data. - base::Value hotword_data(base::Value::Type::DICTIONARY); - hotword_data.SetKey( - "title", - base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_HOTWORD_TITLE))); - hotword_data.SetKey( - "description", - base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_HOTWORD_DESC))); - hotword_data.SetKey("defaultEnabled", base::Value(true)); - hotword_data.SetKey( - "iconUri", - base::Value("https://www.gstatic.com/images/icons/material/system/" - "2x/mic_none_grey600_48dp.png")); - get_more_data.GetList().push_back(std::move(hotword_data)); - - // Process screen context data. - base::Value context_data(base::Value::Type::DICTIONARY); - context_data.SetKey("title", base::Value(l10n_util::GetStringUTF16( - IDS_ASSISTANT_SCREEN_CONTEXT_TITLE))); - context_data.SetKey("description", base::Value(l10n_util::GetStringUTF16( - IDS_ASSISTANT_SCREEN_CONTEXT_DESC))); - context_data.SetKey("defaultEnabled", base::Value(true)); - context_data.SetKey( - "iconUri", - base::Value("https://www.gstatic.com/images/icons/material/system/" - "2x/laptop_chromebook_grey600_24dp.png")); - get_more_data.GetList().push_back(std::move(context_data)); - - // Process email optin data. - if (email_optin_needed) { - base::Value data(base::Value::Type::DICTIONARY); - data.SetKey("title", base::Value(email_optin_ui.title())); - data.SetKey("description", base::Value(email_optin_ui.description())); - data.SetKey("defaultEnabled", - base::Value(email_optin_ui.default_enabled())); - data.SetKey("iconUri", base::Value(email_optin_ui.icon_uri())); - data.SetKey("legalText", base::Value(email_optin_ui.legal_text())); - get_more_data.GetList().push_back(std::move(data)); - } - - return get_more_data; -} - -// Get string constants for settings ui. -base::Value GetSettingsUiStrings(const assistant::SettingsUi& settings_ui, - bool activity_control_needed) { - auto consent_ui = settings_ui.consent_flow_ui().consent_ui(); - auto activity_control_ui = consent_ui.activity_control_ui(); - auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui(); - base::Value dictionary(base::Value::Type::DICTIONARY); - - // Add activity controll string constants. - if (activity_control_needed) { - scoped_refptr<base::RefCountedMemory> image = - chromeos::UserImageSource::GetUserImage( - user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); - std::string icon_url = webui::GetPngDataUrl(image->front(), image->size()); - dictionary.SetKey("valuePropUserImage", base::Value(icon_url)); - - dictionary.SetKey("valuePropIdentity", - base::Value(activity_control_ui.identity())); - dictionary.SetKey("valuePropTitle", - base::Value(activity_control_ui.title())); - if (activity_control_ui.intro_text_paragraph_size()) { - dictionary.SetKey( - "valuePropIntro", - base::Value(activity_control_ui.intro_text_paragraph(0))); - } - if (activity_control_ui.footer_paragraph_size()) { - dictionary.SetKey("valuePropFooter", - base::Value(activity_control_ui.footer_paragraph(0))); - } - dictionary.SetKey("valuePropNextButton", - base::Value(consent_ui.accept_button_text())); - dictionary.SetKey("valuePropSkipButton", - base::Value(consent_ui.reject_button_text())); - } - - // Add third party string constants. - dictionary.SetKey("thirdPartyTitle", - base::Value(third_party_disclosure_ui.title())); - dictionary.SetKey("thirdPartyContinueButton", - base::Value(third_party_disclosure_ui.button_continue())); - dictionary.SetKey("thirdPartyFooter", base::Value(consent_ui.tos_pp_links())); - - // Add get more screen string constants. - dictionary.SetKey("getMoreTitle", base::Value(l10n_util::GetStringUTF16( - IDS_ASSISTANT_GET_MORE_SCREEN_TITLE))); - dictionary.SetKey("getMoreIntro", base::Value(l10n_util::GetStringUTF16( - IDS_ASSISTANT_GET_MORE_SCREEN_INTRO))); - dictionary.SetKey( - "getMoreContinueButton", - base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON))); - - return dictionary; -} - -void RecordActivityControlConsent(Profile* profile, - std::string ui_audit_key, - bool opted_in) { - SigninManagerBase* signin_manager = - SigninManagerFactory::GetForProfile(profile); - DCHECK(signin_manager->IsAuthenticated()); - std::string account_id = signin_manager->GetAuthenticatedAccountId(); - - UserConsentTypes::AssistantActivityControlConsent consent; - consent.set_ui_audit_key(ui_audit_key); - consent.set_status(opted_in ? UserConsentTypes::GIVEN - : UserConsentTypes::NOT_GIVEN); - - ConsentAuditorFactory::GetForProfile(profile) - ->RecordAssistantActivityControlConsent(account_id, consent); -} +constexpr char kJsScreenPath[] = "assistantOptInFlow"; } // namespace @@ -242,15 +29,20 @@ } AssistantOptInHandler::~AssistantOptInHandler() { - arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this); + if (arc::VoiceInteractionControllerClient::Get()) { + arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this); + } } void AssistantOptInHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) {} void AssistantOptInHandler::RegisterMessages() { - AddCallback("initialized", &AssistantOptInHandler::HandleInitialized); - AddCallback("hotwordResult", &AssistantOptInHandler::HandleHotwordResult); + AddPrefixedCallback("initialized", &AssistantOptInHandler::HandleInitialized); + AddPrefixedCallback("hotwordResult", + &AssistantOptInHandler::HandleHotwordResult); + AddPrefixedCallback("flowFinished", + &AssistantOptInHandler::HandleFlowFinished); } void AssistantOptInHandler::Initialize() { @@ -428,4 +220,8 @@ } } +void AssistantOptInHandler::HandleFlowFinished() { + CallJSOrDefer("closeDialog"); +} + } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h index 0a4ffaf..833d94cc 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h
@@ -56,6 +56,7 @@ // Handler for JS WebUI message. void HandleInitialized(); void HandleHotwordResult(bool enable_hotword); + void HandleFlowFinished(); // Consent token used to complete the opt-in. std::string consent_token_;
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc index d1b1f2d1..fbce386 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -5,6 +5,17 @@ #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h" #include "base/metrics/histogram_macros.h" +#include "chrome/browser/consent_auditor/consent_auditor_factory.h" +#include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/browser/ui/webui/chromeos/user_image_source.h" +#include "chrome/grit/browser_resources.h" +#include "chrome/grit/generated_resources.h" +#include "components/arc/arc_prefs.h" +#include "components/consent_auditor/consent_auditor.h" +#include "components/signin/core/browser/signin_manager_base.h" +#include "components/user_manager/user_manager.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/webui/web_ui_util.h" namespace chromeos { @@ -12,4 +23,203 @@ UMA_HISTOGRAM_ENUMERATION("Assistant.OptInFlowStatus", status, kMaxValue + 1); } +// Construct SettingsUiSelector for the ConsentFlow UI. +assistant::SettingsUiSelector GetSettingsUiSelector() { + assistant::SettingsUiSelector selector; + assistant::ConsentFlowUiSelector* consent_flow_ui = + selector.mutable_consent_flow_ui_selector(); + consent_flow_ui->set_flow_id(assistant::ActivityControlSettingsUiSelector:: + ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS); + selector.set_email_opt_in(true); + return selector; +} + +// Construct SettingsUiUpdate for user opt-in. +assistant::SettingsUiUpdate GetSettingsUiUpdate( + const std::string& consent_token) { + assistant::SettingsUiUpdate update; + assistant::ConsentFlowUiUpdate* consent_flow_update = + update.mutable_consent_flow_ui_update(); + consent_flow_update->set_flow_id( + assistant::ActivityControlSettingsUiSelector:: + ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS); + consent_flow_update->set_consent_token(consent_token); + + return update; +} + +// Construct SettingsUiUpdate for email opt-in. +assistant::SettingsUiUpdate GetEmailOptInUpdate(bool opted_in) { + assistant::SettingsUiUpdate update; + assistant::EmailOptInUpdate* email_optin_update = + update.mutable_email_opt_in_update(); + email_optin_update->set_email_opt_in_update_state( + opted_in ? assistant::EmailOptInUpdate::OPT_IN + : assistant::EmailOptInUpdate::OPT_OUT); + + return update; +} + +// Helper method to create zippy data. +base::Value CreateZippyData(const SettingZippyList& zippy_list) { + base::Value zippy_data(base::Value::Type::LIST); + for (auto& setting_zippy : zippy_list) { + base::Value data(base::Value::Type::DICTIONARY); + data.SetKey("title", base::Value(setting_zippy.title())); + if (setting_zippy.description_paragraph_size()) { + data.SetKey("description", + base::Value(setting_zippy.description_paragraph(0))); + } + if (setting_zippy.additional_info_paragraph_size()) { + data.SetKey("additionalInfo", + base::Value(setting_zippy.additional_info_paragraph(0))); + } + data.SetKey("iconUri", base::Value(setting_zippy.icon_uri())); + data.SetKey("popupLink", base::Value(l10n_util::GetStringUTF16( + IDS_ASSISTANT_ACTIVITY_CONTROL_POPUP_LINK))); + zippy_data.GetList().push_back(std::move(data)); + } + return zippy_data; +} + +// Helper method to create disclosure data. +base::Value CreateDisclosureData(const SettingZippyList& disclosure_list) { + base::Value disclosure_data(base::Value::Type::LIST); + for (auto& disclosure : disclosure_list) { + base::Value data(base::Value::Type::DICTIONARY); + data.SetKey("title", base::Value(disclosure.title())); + if (disclosure.description_paragraph_size()) { + data.SetKey("description", + base::Value(disclosure.description_paragraph(0))); + } + if (disclosure.additional_info_paragraph_size()) { + data.SetKey("additionalInfo", + base::Value(disclosure.additional_info_paragraph(0))); + } + data.SetKey("iconUri", base::Value(disclosure.icon_uri())); + disclosure_data.GetList().push_back(std::move(data)); + } + return disclosure_data; +} + +// Helper method to create get more screen data. +base::Value CreateGetMoreData(bool email_optin_needed, + const assistant::EmailOptInUi& email_optin_ui) { + base::Value get_more_data(base::Value::Type::LIST); + + // Process hotword data. + base::Value hotword_data(base::Value::Type::DICTIONARY); + hotword_data.SetKey( + "title", + base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_HOTWORD_TITLE))); + hotword_data.SetKey( + "description", + base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_HOTWORD_DESC))); + hotword_data.SetKey("defaultEnabled", base::Value(true)); + hotword_data.SetKey( + "iconUri", + base::Value("https://www.gstatic.com/images/icons/material/system/" + "2x/mic_none_grey600_48dp.png")); + get_more_data.GetList().push_back(std::move(hotword_data)); + + // Process screen context data. + base::Value context_data(base::Value::Type::DICTIONARY); + context_data.SetKey("title", base::Value(l10n_util::GetStringUTF16( + IDS_ASSISTANT_SCREEN_CONTEXT_TITLE))); + context_data.SetKey("description", base::Value(l10n_util::GetStringUTF16( + IDS_ASSISTANT_SCREEN_CONTEXT_DESC))); + context_data.SetKey("defaultEnabled", base::Value(true)); + context_data.SetKey( + "iconUri", + base::Value("https://www.gstatic.com/images/icons/material/system/" + "2x/laptop_chromebook_grey600_24dp.png")); + get_more_data.GetList().push_back(std::move(context_data)); + + // Process email optin data. + if (email_optin_needed) { + base::Value data(base::Value::Type::DICTIONARY); + data.SetKey("title", base::Value(email_optin_ui.title())); + data.SetKey("description", base::Value(email_optin_ui.description())); + data.SetKey("defaultEnabled", + base::Value(email_optin_ui.default_enabled())); + data.SetKey("iconUri", base::Value(email_optin_ui.icon_uri())); + data.SetKey("legalText", base::Value(email_optin_ui.legal_text())); + get_more_data.GetList().push_back(std::move(data)); + } + + return get_more_data; +} + +// Get string constants for settings ui. +base::Value GetSettingsUiStrings(const assistant::SettingsUi& settings_ui, + bool activity_control_needed) { + auto consent_ui = settings_ui.consent_flow_ui().consent_ui(); + auto activity_control_ui = consent_ui.activity_control_ui(); + auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui(); + base::Value dictionary(base::Value::Type::DICTIONARY); + + // Add activity controll string constants. + if (activity_control_needed) { + scoped_refptr<base::RefCountedMemory> image = + chromeos::UserImageSource::GetUserImage( + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); + std::string icon_url = webui::GetPngDataUrl(image->front(), image->size()); + dictionary.SetKey("valuePropUserImage", base::Value(icon_url)); + + dictionary.SetKey("valuePropIdentity", + base::Value(activity_control_ui.identity())); + dictionary.SetKey("valuePropTitle", + base::Value(activity_control_ui.title())); + if (activity_control_ui.intro_text_paragraph_size()) { + dictionary.SetKey( + "valuePropIntro", + base::Value(activity_control_ui.intro_text_paragraph(0))); + } + if (activity_control_ui.footer_paragraph_size()) { + dictionary.SetKey("valuePropFooter", + base::Value(activity_control_ui.footer_paragraph(0))); + } + dictionary.SetKey("valuePropNextButton", + base::Value(consent_ui.accept_button_text())); + dictionary.SetKey("valuePropSkipButton", + base::Value(consent_ui.reject_button_text())); + } + + // Add third party string constants. + dictionary.SetKey("thirdPartyTitle", + base::Value(third_party_disclosure_ui.title())); + dictionary.SetKey("thirdPartyContinueButton", + base::Value(third_party_disclosure_ui.button_continue())); + dictionary.SetKey("thirdPartyFooter", base::Value(consent_ui.tos_pp_links())); + + // Add get more screen string constants. + dictionary.SetKey("getMoreTitle", base::Value(l10n_util::GetStringUTF16( + IDS_ASSISTANT_GET_MORE_SCREEN_TITLE))); + dictionary.SetKey("getMoreIntro", base::Value(l10n_util::GetStringUTF16( + IDS_ASSISTANT_GET_MORE_SCREEN_INTRO))); + dictionary.SetKey( + "getMoreContinueButton", + base::Value(l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON))); + + return dictionary; +} + +using sync_pb::UserConsentTypes; +void RecordActivityControlConsent(Profile* profile, + std::string ui_audit_key, + bool opted_in) { + SigninManagerBase* signin_manager = + SigninManagerFactory::GetForProfile(profile); + DCHECK(signin_manager->IsAuthenticated()); + std::string account_id = signin_manager->GetAuthenticatedAccountId(); + + UserConsentTypes::AssistantActivityControlConsent consent; + consent.set_ui_audit_key(ui_audit_key); + consent.set_status(opted_in ? UserConsentTypes::GIVEN + : UserConsentTypes::NOT_GIVEN); + + ConsentAuditorFactory::GetForProfile(profile) + ->RecordAssistantActivityControlConsent(account_id, consent); +} + } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h index 3411a55..b1d35c07 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h
@@ -8,6 +8,11 @@ #include <string> #include "base/callback.h" +#include "chrome/browser/profiles/profile.h" +#include "chromeos/services/assistant/public/mojom/constants.mojom.h" +#include "chromeos/services/assistant/public/proto/settings_ui.pb.h" +#include "components/prefs/pref_service.h" +#include "services/service_manager/public/cpp/connector.h" namespace chromeos { @@ -45,6 +50,36 @@ void RecordAssistantOptInStatus(AssistantOptInFlowStatus); +// Construct SettingsUiSelector for the ConsentFlow UI. +assistant::SettingsUiSelector GetSettingsUiSelector(); + +// Construct SettingsUiUpdate for user opt-in. +assistant::SettingsUiUpdate GetSettingsUiUpdate( + const std::string& consent_token); + +// Construct SettingsUiUpdate for email opt-in. +assistant::SettingsUiUpdate GetEmailOptInUpdate(bool opted_in); + +using SettingZippyList = google::protobuf::RepeatedPtrField< + assistant::ClassicActivityControlUiTexts::SettingZippy>; +// Helper method to create zippy data. +base::Value CreateZippyData(const SettingZippyList& zippy_list); + +// Helper method to create disclosure data. +base::Value CreateDisclosureData(const SettingZippyList& disclosure_list); + +// Helper method to create get more screen data. +base::Value CreateGetMoreData(bool email_optin_needed, + const assistant::EmailOptInUi& email_optin_ui); + +// Get string constants for settings ui. +base::Value GetSettingsUiStrings(const assistant::SettingsUi& settings_ui, + bool activity_control_needed); + +void RecordActivityControlConsent(Profile* profile, + std::string ui_audit_key, + bool opted_in); + } // namespace chromeos #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_ASSISTANT_OPTIN_ASSISTANT_OPTIN_UTILS_H_
diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc index dfcbfe8..1bd267b 100644 --- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc +++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -912,7 +912,7 @@ &paths, "Downloads", file_manager::util::GetDownloadsFolderForProfile(profile).AsUTF8Unsafe()); const auto* integration_service = GetIntegrationService(); - if (integration_service && integration_service->IsMounted()) { + if (integration_service) { AppendKeyValue(&paths, "Drive", integration_service->GetMountPointPath().AsUTF8Unsafe()); }
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc new file mode 100644 index 0000000..5020340 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -0,0 +1,363 @@ +// 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/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h" + +#include "chrome/browser/chromeos/login/oobe_screen.h" +#include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h" +#include "chrome/grit/browser_resources.h" +#include "chrome/grit/generated_resources.h" +#include "chromeos/services/assistant/public/mojom/constants.mojom.h" +#include "chromeos/services/assistant/public/proto/settings_ui.pb.h" +#include "components/arc/arc_prefs.h" +#include "components/login/localized_values_builder.h" +#include "components/prefs/pref_service.h" +#include "services/service_manager/public/cpp/connector.h" + +namespace chromeos { + +namespace { + +constexpr char kJsScreenPath[] = "login.AssistantOptInFlowScreen"; +constexpr char kSkipPressed[] = "skip-pressed"; +constexpr char kNextPressed[] = "next-pressed"; +constexpr char kFlowFinished[] = "flow-finished"; + +} // namespace + +AssistantOptInFlowScreenHandler::AssistantOptInFlowScreenHandler() + : BaseScreenHandler(kScreenId), weak_factory_(this) { + set_call_js_prefix(kJsScreenPath); +} + +AssistantOptInFlowScreenHandler::~AssistantOptInFlowScreenHandler() { + if (arc::VoiceInteractionControllerClient::Get()) { + arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this); + } + if (screen_) { + screen_->OnViewDestroyed(this); + } +} + +void AssistantOptInFlowScreenHandler::DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) { + builder->Add("assistantOptinLoading", + IDS_VOICE_INTERACTION_VALUE_PROP_LOADING); + builder->Add("assistantOptinLoadErrorTitle", + IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_TITLE); + builder->Add("assistantOptinLoadErrorMessage", + IDS_VOICE_INTERACTION_VALUE_PROP_LOAD_ERROR_MESSAGE); + builder->Add("assistantOptinSkipButton", + IDS_VOICE_INTERACTION_VALUE_PROP_SKIP_BUTTON); + builder->Add("assistantOptinRetryButton", + IDS_VOICE_INTERACTION_VALUE_PROP_RETRY_BUTTON); + builder->Add("assistantOptinOKButton", IDS_OOBE_OK_BUTTON_TEXT); + builder->Add("assistantReadyTitle", IDS_ASSISTANT_READY_SCREEN_TITLE); + builder->Add("assistantReadyMessage", IDS_ASSISTANT_READY_SCREEN_MESSAGE); + builder->Add("assistantReadyButton", IDS_ASSISTANT_DONE_BUTTON); +} + +void AssistantOptInFlowScreenHandler::RegisterMessages() { + AddCallback( + "assistant.ValuePropScreen.userActed", + &AssistantOptInFlowScreenHandler::HandleValuePropScreenUserAction); + AddCallback( + "assistant.ThirdPartyScreen.userActed", + &AssistantOptInFlowScreenHandler::HandleThirdPartyScreenUserAction); + AddCallback("assistant.GetMoreScreen.userActed", + &AssistantOptInFlowScreenHandler::HandleGetMoreScreenUserAction); + AddCallback("assistant.ReadyScreen.userActed", + &AssistantOptInFlowScreenHandler::HandleReadyScreenUserAction); + AddCallback("assistant.ValuePropScreen.screenShown", + &AssistantOptInFlowScreenHandler::HandleValuePropScreenShown); + AddCallback("assistant.ThirdPartyScreen.screenShown", + &AssistantOptInFlowScreenHandler::HandleThirdPartyScreenShown); + AddCallback("assistant.GetMoreScreen.screenShown", + &AssistantOptInFlowScreenHandler::HandleGetMoreScreenShown); + AddCallback("assistant.ReadyScreen.screenShown", + &AssistantOptInFlowScreenHandler::HandleReadyScreenShown); + AddCallback("assistantOptInFlow.hotwordResult", + &AssistantOptInFlowScreenHandler::HandleHotwordResult); + AddCallback("assistantOptInFlow.flowFinished", + &AssistantOptInFlowScreenHandler::HandleFlowFinished); + AddCallback("assistantOptInFlow.initialized", + &AssistantOptInFlowScreenHandler::HandleFlowInitialized); +} + +void AssistantOptInFlowScreenHandler::Bind(AssistantOptInFlowScreen* screen) { + BaseScreenHandler::SetBaseScreen(screen); + screen_ = screen; + if (page_is_ready()) + Initialize(); +} + +void AssistantOptInFlowScreenHandler::Unbind() { + screen_ = nullptr; + BaseScreenHandler::SetBaseScreen(nullptr); +} + +void AssistantOptInFlowScreenHandler::Show() { + // Make sure enable Assistant service since we need it during the flow. + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, true); + + if (arc::VoiceInteractionControllerClient::Get()->voice_interaction_state() == + ash::mojom::VoiceInteractionState::NOT_READY) { + arc::VoiceInteractionControllerClient::Get()->AddObserver(this); + } else { + BindAssistantSettingsManager(); + } + + if (!page_is_ready() || !screen_) { + show_on_init_ = true; + return; + } + + ShowScreen(kScreenId); +} + +void AssistantOptInFlowScreenHandler::Hide() {} + +void AssistantOptInFlowScreenHandler::Initialize() { + if (!screen_ || !show_on_init_) + return; + + Show(); + show_on_init_ = false; +} + +void AssistantOptInFlowScreenHandler::ShowNextScreen() { + CallJS("showNextScreen"); +} + +void AssistantOptInFlowScreenHandler::OnActivityControlOptInResult( + bool opted_in) { + Profile* profile = ProfileManager::GetActiveUserProfile(); + if (opted_in) { + RecordAssistantOptInStatus(ACTIVITY_CONTROL_ACCEPTED); + settings_manager_->UpdateSettings( + GetSettingsUiUpdate(consent_token_).SerializeAsString(), + base::BindOnce( + &AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse, + weak_factory_.GetWeakPtr())); + } else { + RecordAssistantOptInStatus(ACTIVITY_CONTROL_SKIPPED); + profile->GetPrefs()->SetBoolean( + arc::prefs::kVoiceInteractionActivityControlAccepted, false); + screen_->OnUserAction(kFlowFinished); + } + + RecordActivityControlConsent(profile, ui_audit_key_, opted_in); +} + +void AssistantOptInFlowScreenHandler::OnEmailOptInResult(bool opted_in) { + if (!email_optin_needed_) { + DCHECK(!opted_in); + ShowNextScreen(); + return; + } + + RecordAssistantOptInStatus(opted_in ? EMAIL_OPTED_IN : EMAIL_OPTED_OUT); + settings_manager_->UpdateSettings( + GetEmailOptInUpdate(opted_in).SerializeAsString(), + base::BindOnce(&AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse, + weak_factory_.GetWeakPtr())); +} + +void AssistantOptInFlowScreenHandler::OnStateChanged( + ash::mojom::VoiceInteractionState state) { + if (state != ash::mojom::VoiceInteractionState::NOT_READY) { + BindAssistantSettingsManager(); + arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this); + } +} + +void AssistantOptInFlowScreenHandler::BindAssistantSettingsManager() { + if (settings_manager_.is_bound()) + return; + + // Set up settings mojom. + service_manager::Connector* connector = + content::BrowserContext::GetConnectorFor( + ProfileManager::GetActiveUserProfile()); + connector->BindInterface(assistant::mojom::kServiceName, + mojo::MakeRequest(&settings_manager_)); + + SendGetSettingsRequest(); +} + +void AssistantOptInFlowScreenHandler::SendGetSettingsRequest() { + assistant::SettingsUiSelector selector = GetSettingsUiSelector(); + settings_manager_->GetSettings( + selector.SerializeAsString(), + base::BindOnce(&AssistantOptInFlowScreenHandler::OnGetSettingsResponse, + weak_factory_.GetWeakPtr())); +} + +void AssistantOptInFlowScreenHandler::ReloadContent(const base::Value& dict) { + CallJS("reloadContent", dict); +} + +void AssistantOptInFlowScreenHandler::AddSettingZippy(const std::string& type, + const base::Value& data) { + CallJS("addSettingZippy", type, data); +} + +void AssistantOptInFlowScreenHandler::OnGetSettingsResponse( + const std::string& settings) { + assistant::SettingsUi settings_ui; + settings_ui.ParseFromString(settings); + + DCHECK(settings_ui.has_consent_flow_ui()); + + RecordAssistantOptInStatus(FLOW_STARTED); + auto consent_ui = settings_ui.consent_flow_ui().consent_ui(); + auto activity_control_ui = consent_ui.activity_control_ui(); + auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui(); + + consent_token_ = activity_control_ui.consent_token(); + ui_audit_key_ = activity_control_ui.ui_audit_key(); + + // Process activity control data. + if (!activity_control_ui.setting_zippy().size()) { + // No need to consent. Move to the next screen. + activity_control_needed_ = false; + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionActivityControlAccepted, + true); + ShowNextScreen(); + } else { + AddSettingZippy("settings", + CreateZippyData(activity_control_ui.setting_zippy())); + } + + // Process third party disclosure data. + AddSettingZippy("disclosure", CreateDisclosureData( + third_party_disclosure_ui.disclosures())); + + // Process get more data. + email_optin_needed_ = settings_ui.has_email_opt_in_ui() && + settings_ui.email_opt_in_ui().has_title(); + AddSettingZippy("get-more", CreateGetMoreData(email_optin_needed_, + settings_ui.email_opt_in_ui())); + + // Pass string constants dictionary. + ReloadContent(GetSettingsUiStrings(settings_ui, activity_control_needed_)); +} + +void AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse( + const std::string& result) { + assistant::SettingsUiUpdateResult ui_result; + ui_result.ParseFromString(result); + + if (ui_result.has_consent_flow_update_result()) { + if (ui_result.consent_flow_update_result().update_status() != + assistant::ConsentFlowUiUpdateResult::SUCCESS) { + // TODO(updowndta): Handle consent update failure. + LOG(ERROR) << "Consent udpate error."; + } else if (activity_control_needed_) { + activity_control_needed_ = false; + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionActivityControlAccepted, + true); + } + } + + if (ui_result.has_email_opt_in_update_result()) { + if (ui_result.email_opt_in_update_result().update_status() != + assistant::EmailOptInUpdateResult::SUCCESS) { + // TODO(updowndta): Handle email optin update failure. + LOG(ERROR) << "Email OptIn udpate error."; + } + // Update hotword will cause Assistant restart. In order to make sure email + // optin request is successfully sent to server, update the hotword after + // email optin result has been received. + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionHotwordEnabled, + enable_hotword_); + } + + ShowNextScreen(); +} + +void AssistantOptInFlowScreenHandler::HandleHotwordResult(bool enable_hotword) { + enable_hotword_ = enable_hotword; + + if (!email_optin_needed_) { + // No need to send email optin result. Safe to update hotword pref and + // restart Assistant here. + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionHotwordEnabled, + enable_hotword); + } +} + +void AssistantOptInFlowScreenHandler::HandleLoadingScreenUserAction( + const std::string& action) { + if (action == kSkipPressed) { + screen_->OnUserAction(kFlowFinished); + } +} + +void AssistantOptInFlowScreenHandler::HandleValuePropScreenUserAction( + const std::string& action) { + if (action == kSkipPressed) { + OnActivityControlOptInResult(false); + } else if (action == kNextPressed) { + OnActivityControlOptInResult(true); + } +} + +void AssistantOptInFlowScreenHandler::HandleThirdPartyScreenUserAction( + const std::string& action) { + if (action == kNextPressed) { + RecordAssistantOptInStatus(THIRD_PARTY_CONTINUED); + ShowNextScreen(); + } +} + +void AssistantOptInFlowScreenHandler::HandleGetMoreScreenUserAction( + const bool screen_context, + const bool email_opted_in) { + RecordAssistantOptInStatus(GET_MORE_CONTINUED); + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(arc::prefs::kVoiceInteractionContextEnabled, + screen_context); + OnEmailOptInResult(email_opted_in); +} + +void AssistantOptInFlowScreenHandler::HandleReadyScreenUserAction( + const std::string& action) { + if (action == kNextPressed) { + RecordAssistantOptInStatus(READY_SCREEN_CONTINUED); + screen_->OnUserAction(kFlowFinished); + } +} + +void AssistantOptInFlowScreenHandler::HandleValuePropScreenShown() { + RecordAssistantOptInStatus(ACTIVITY_CONTROL_SHOWN); +} + +void AssistantOptInFlowScreenHandler::HandleThirdPartyScreenShown() { + RecordAssistantOptInStatus(THIRD_PARTY_SHOWN); +} + +void AssistantOptInFlowScreenHandler::HandleGetMoreScreenShown() { + RecordAssistantOptInStatus(GET_MORE_SHOWN); +} + +void AssistantOptInFlowScreenHandler::HandleReadyScreenShown() { + RecordAssistantOptInStatus(READY_SCREEN_SHOWN); +} + +void AssistantOptInFlowScreenHandler::HandleFlowFinished() { + screen_->OnUserAction(kFlowFinished); +} + +void AssistantOptInFlowScreenHandler::HandleFlowInitialized() {} + +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h new file mode 100644 index 0000000..bcd0ff69 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
@@ -0,0 +1,110 @@ +// 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_UI_WEBUI_CHROMEOS_LOGIN_ASSISTANT_OPTIN_FLOW_SCREEN_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_ASSISTANT_OPTIN_FLOW_SCREEN_HANDLER_H_ + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h" +#include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_view.h" +#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" +#include "chromeos/services/assistant/public/mojom/settings.mojom.h" + +namespace chromeos { + +// TODO(updowndota): Refactor to reuse AssistantOptInHandler methods. +class AssistantOptInFlowScreenHandler + : public BaseScreenHandler, + public AssistantOptInFlowScreenView, + public arc::VoiceInteractionControllerClient::Observer { + public: + AssistantOptInFlowScreenHandler(); + ~AssistantOptInFlowScreenHandler() override; + + // BaseScreenHandler: + void DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) override; + void RegisterMessages() override; + + // AssistantOptInFlowScreenView: + void Bind(AssistantOptInFlowScreen* screen) override; + void Unbind() override; + void Show() override; + void Hide() override; + + // Send messages to the page. + void ShowNextScreen(); + + // Handle user opt-in result. + void OnActivityControlOptInResult(bool opted_in); + void OnEmailOptInResult(bool opted_in); + + private: + // BaseScreenHandler: + void Initialize() override; + + // arc::VoiceInteractionControllerClient::Observer overrides + void OnStateChanged(ash::mojom::VoiceInteractionState state) override; + + // Connect to assistant settings manager. + void BindAssistantSettingsManager(); + + // Send GetSettings request for the opt-in UI. + void SendGetSettingsRequest(); + + // Send message and consent data to the page. + void ReloadContent(const base::Value& dict); + void AddSettingZippy(const std::string& type, const base::Value& data); + + // Handle response from the settings manager. + void OnGetSettingsResponse(const std::string& settings); + void OnUpdateSettingsResponse(const std::string& settings); + + // Handler for JS WebUI message. + void HandleLoadingScreenUserAction(const std::string& action); + void HandleValuePropScreenUserAction(const std::string& action); + void HandleThirdPartyScreenUserAction(const std::string& action); + void HandleGetMoreScreenUserAction(const bool screen_context, + const bool email_opted_in); + void HandleReadyScreenUserAction(const std::string& action); + void HandleValuePropScreenShown(); + void HandleThirdPartyScreenShown(); + void HandleGetMoreScreenShown(); + void HandleReadyScreenShown(); + void HandleHotwordResult(bool enable_hotword); + void HandleFlowFinished(); + void HandleFlowInitialized(); + + AssistantOptInFlowScreen* screen_ = nullptr; + + // Whether the screen should be shown right after initialization. + bool show_on_init_ = false; + + // Consent token used to complete the opt-in. + std::string consent_token_; + + // An opaque token for audit record. + std::string ui_audit_key_; + + // Whether activity control is needed for user. + bool activity_control_needed_ = true; + + // Whether email optin is needed for user. + bool email_optin_needed_ = false; + + // Whether user chose to enable hotword. + bool enable_hotword_ = true; + + assistant::mojom::AssistantSettingsManagerPtr settings_manager_; + base::WeakPtrFactory<AssistantOptInFlowScreenHandler> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(AssistantOptInFlowScreenHandler); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_ASSISTANT_OPTIN_FLOW_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc index 6137e9a..33535cf 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/chromeos/accessibility/magnification_manager.h" +#include "chrome/browser/chromeos/login/configuration_keys.h" #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h" #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h" #include "chrome/browser/chromeos/login/helper.h" @@ -607,8 +608,12 @@ void CoreOobeHandler::UpdateOobeConfiguration() { if (OobeConfiguration::Get()) { - CallJSOrDefer("updateOobeConfiguration", - OobeConfiguration::Get()->GetConfiguration()); + base::Value configuration(base::Value::Type::DICTIONARY); + chromeos::configuration::FilterConfiguration( + OobeConfiguration::Get()->GetConfiguration(), + chromeos::configuration::ConfigurationHandlerSide::HANDLER_JS, + configuration); + CallJSOrDefer("updateOobeConfiguration", configuration); } }
diff --git a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc index 4a688e9..23a270c 100644 --- a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
@@ -60,10 +60,7 @@ fp_service_->AddFingerprintObserver(std::move(observer)); } -FingerprintSetupScreenHandler::~FingerprintSetupScreenHandler() { - ProfileManager::GetActiveUserProfile()->GetPrefs()->SetInteger( - prefs::kQuickUnlockFingerprintRecord, enrolled_finger_count_); -} +FingerprintSetupScreenHandler::~FingerprintSetupScreenHandler() = default; void FingerprintSetupScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { @@ -137,6 +134,11 @@ ++enrolled_finger_count_; CallJS("enableAddAnotherFinger", enrolled_finger_count_ < kMaxAllowedFingerprints); + + // Update the number of registered fingers, it's fine to override because + // this is the first time user log in and have no finger registered. + ProfileManager::GetActiveUserProfile()->GetPrefs()->SetInteger( + prefs::kQuickUnlockFingerprintRecord, enrolled_finger_count_); } }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 5855c90..8481de8 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -38,6 +38,7 @@ #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h" +#include "chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/controller_pairing_screen_handler.h" @@ -424,6 +425,8 @@ AddScreenHandler(std::make_unique<UpdateRequiredScreenHandler>()); + AddScreenHandler(std::make_unique<AssistantOptInFlowScreenHandler>()); + // Initialize KioskAppMenuHandler. Note that it is NOT a screen handler. auto kiosk_app_menu_handler = std::make_unique<KioskAppMenuHandler>(network_state_informer_); @@ -599,6 +602,10 @@ return GetView<UpdateRequiredScreenHandler>(); } +AssistantOptInFlowScreenView* OobeUI::GetAssistantOptInFlowScreenView() { + return GetView<AssistantOptInFlowScreenHandler>(); +} + UserImageView* OobeUI::GetUserImageView() { return GetView<UserImageScreenHandler>(); }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index 68dfa230..d40fbf1 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -29,6 +29,7 @@ class AppLaunchSplashScreenView; class ArcKioskSplashScreenView; class ArcTermsOfServiceScreenView; +class AssistantOptInFlowScreenView; class AutoEnrollmentCheckScreenView; class BaseScreenHandler; class ControllerPairingScreenView; @@ -137,6 +138,7 @@ VoiceInteractionValuePropScreenView* GetVoiceInteractionValuePropScreenView(); WaitForContainerReadyScreenView* GetWaitForContainerReadyScreenView(); UpdateRequiredView* GetUpdateRequiredScreenView(); + AssistantOptInFlowScreenView* GetAssistantOptInFlowScreenView(); GaiaView* GetGaiaScreenView(); UserBoardView* GetUserBoardView(); DiscoverScreenView* GetDiscoverScreenView();
diff --git a/chrome/browser/ui/webui/flags_ui.cc b/chrome/browser/ui/webui/flags_ui.cc index e79e5fc..571f79f 100644 --- a/chrome/browser/ui/webui/flags_ui.cc +++ b/chrome/browser/ui/webui/flags_ui.cc
@@ -284,6 +284,7 @@ Profile* profile, FlagsDOMHandler* dom_handler, bool current_user_is_owner) { + DCHECK(!profile->IsOffTheRecord()); // If the flags_ui has gone away, there's nothing to do. if (!flags_ui) return; @@ -325,16 +326,19 @@ web_ui->AddMessageHandler(std::move(handler_owner)); #if defined(OS_CHROMEOS) + // Bypass possible incognito profile. + Profile* original_profile = profile->GetOriginalProfile(); if (base::SysInfo::IsRunningOnChromeOS() && chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext( - profile)) { + original_profile)) { chromeos::OwnerSettingsServiceChromeOS* service = chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext( - profile); - service->IsOwnerAsync(base::Bind( - &FinishInitialization, weak_factory_.GetWeakPtr(), profile, handler)); + original_profile); + service->IsOwnerAsync(base::Bind(&FinishInitialization, + weak_factory_.GetWeakPtr(), + original_profile, handler)); } else { - FinishInitialization(weak_factory_.GetWeakPtr(), profile, handler, + FinishInitialization(weak_factory_.GetWeakPtr(), original_profile, handler, false /* current_user_is_owner */); } #else
diff --git a/chrome/browser/ui/webui/management_ui.cc b/chrome/browser/ui/webui/management_ui.cc new file mode 100644 index 0000000..6eb5f8e --- /dev/null +++ b/chrome/browser/ui/webui/management_ui.cc
@@ -0,0 +1,39 @@ +// 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/ui/webui/management_ui.h" + +#include <memory> + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/management_ui_handler.h" +#include "chrome/common/url_constants.h" +#include "chrome/grit/browser_resources.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/browser/web_ui.h" + +namespace { + +content::WebUIDataSource* CreateManagementUIHtmlSource() { + content::WebUIDataSource* source = + content::WebUIDataSource::Create(chrome::kChromeUIManagementHost); + source->AddLocalizedString("title", IDS_MANAGEMENT_TITLE); + source->SetJsonPath("strings.js"); + // Add required resources. + source->AddResourcePath("management.css", IDR_MANAGEMENT_CSS); + source->AddResourcePath("management.js", IDR_MANAGEMENT_JS); + source->SetDefaultResource(IDR_MANAGEMENT_HTML); + source->UseGzip(); + return source; +} + +} // namespace + +ManagementUI::ManagementUI(content::WebUI* web_ui) : WebUIController(web_ui) { + web_ui->AddMessageHandler(std::make_unique<ManagementUIHandler>()); + content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), + CreateManagementUIHtmlSource()); +} + +ManagementUI::~ManagementUI() {}
diff --git a/chrome/browser/ui/webui/management_ui.h b/chrome/browser/ui/webui/management_ui.h new file mode 100644 index 0000000..4d30b78e --- /dev/null +++ b/chrome/browser/ui/webui/management_ui.h
@@ -0,0 +1,25 @@ +// 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_UI_WEBUI_MANAGEMENT_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_H_ + +#include "base/macros.h" +#include "content/public/browser/web_ui_controller.h" + +namespace content { +class WebUI; +} + +// The Web UI controller for the chrome://management page. +class ManagementUI : public content::WebUIController { + public: + explicit ManagementUI(content::WebUI* web_ui); + ~ManagementUI() override; + + private: + DISALLOW_COPY_AND_ASSIGN(ManagementUI); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_H_
diff --git a/chrome/browser/ui/webui/management_ui_handler.cc b/chrome/browser/ui/webui/management_ui_handler.cc new file mode 100644 index 0000000..88da6fca --- /dev/null +++ b/chrome/browser/ui/webui/management_ui_handler.cc
@@ -0,0 +1,75 @@ +// 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/ui/webui/management_ui_handler.h" + +#include <string> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/policy/profile_policy_connector.h" +#include "chrome/browser/policy/profile_policy_connector_factory.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/browser/web_contents.h" +#include "ui/base/l10n/l10n_util.h" + +#if defined(OS_CHROMEOS) +#include "chrome/browser/browser_process_platform_part.h" +#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" +#endif // defined(OS_CHROMEOS) + +namespace { + +#if defined(OS_CHROMEOS) +base::string16 GetEnterpriseDisplayDomain( + policy::BrowserPolicyConnectorChromeOS* connector) { + if (!connector->IsEnterpriseManaged()) + return l10n_util::GetStringUTF16(IDS_MANAGEMENT_DEVICE_NOT_MANAGED); + + std::string display_domain = connector->GetEnterpriseDisplayDomain(); + + if (display_domain.empty()) { + if (!connector->IsActiveDirectoryManaged()) + return l10n_util::GetStringUTF16(IDS_MANAGEMENT_DEVICE_MANAGED); + + display_domain = connector->GetRealm(); + } + + return l10n_util::GetStringFUTF16(IDS_MANAGEMENT_DEVICE_MANAGED_BY, + base::UTF8ToUTF16(display_domain)); +} +#endif // defined(OS_CHROMEOS) + +} // namespace + +ManagementUIHandler::ManagementUIHandler() {} + +ManagementUIHandler::~ManagementUIHandler() {} + +void ManagementUIHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "initialized", + base::BindRepeating(&ManagementUIHandler::HandleInitialized, + base::Unretained(this))); +} + +void ManagementUIHandler::HandleInitialized(const base::ListValue* /* args */) { + AllowJavascript(); + + ShowDeviceManagementStatus(); +} + +void ManagementUIHandler::ShowDeviceManagementStatus() { +#if defined(OS_CHROMEOS) + policy::BrowserPolicyConnectorChromeOS* connector = + g_browser_process->platform_part()->browser_policy_connector_chromeos(); + + CallJavascriptFunction("management.Page.showDeviceManagedStatus", + base::Value(GetEnterpriseDisplayDomain(connector))); +#endif // defined(OS_CHROMEOS) +}
diff --git a/chrome/browser/ui/webui/management_ui_handler.h b/chrome/browser/ui/webui/management_ui_handler.h new file mode 100644 index 0000000..61d02525 --- /dev/null +++ b/chrome/browser/ui/webui/management_ui_handler.h
@@ -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. + +#ifndef CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_ + +#include "base/strings/string16.h" +#include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" +#include "content/public/browser/web_ui_message_handler.h" + +namespace base { +class ListValue; +} // namespace base + +// The JavaScript message handler for the chrome://management page. +class ManagementUIHandler : public content::WebUIMessageHandler { + public: + ManagementUIHandler(); + ~ManagementUIHandler() override; + + // content::WebUIMessageHandler implementation. + void RegisterMessages() override; + + private: + void HandleInitialized(const base::ListValue* args); + + void ShowDeviceManagementStatus(); + + DISALLOW_COPY_AND_ASSIGN(ManagementUIHandler); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index e619775e..12e83ef 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -360,6 +360,8 @@ IDS_CLOUD_PRINT_REGISTER_PRINTER_INFORMATION); source->AddLocalizedString("moreOptionsLabel", IDS_MORE_OPTIONS_LABEL); source->AddLocalizedString("lessOptionsLabel", IDS_LESS_OPTIONS_LABEL); + source->AddLocalizedString("managedOption", + IDS_PRINT_PREVIEW_MANAGED_OPTION_TEXT); #if defined(OS_CHROMEOS) source->AddLocalizedString("configuringInProgressText", IDS_PRINT_CONFIGURING_IN_PROGRESS_TEXT);
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 96239d3..59bc047 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
@@ -20,7 +20,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_shortcut_manager.h" #include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" @@ -40,6 +39,7 @@ #include "components/signin/core/browser/signin_buildflags.h" #include "components/strings/grit/components_strings.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/common/content_features.h" #include "media/base/media_switches.h" @@ -1671,10 +1671,10 @@ {"deleteProfileWarningWithoutCounts", IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITHOUT_COUNTS}, {"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM}, - {"sync", IsUnifiedConsentFeatureEnabled(profile) + {"sync", unified_consent::IsUnifiedConsentFeatureEnabled() ? IDS_SETTINGS_SYNC_UNIFIED_CONSENT : IDS_SETTINGS_SYNC}, - {"syncDescription", IsUnifiedConsentFeatureEnabled(profile) + {"syncDescription", unified_consent::IsUnifiedConsentFeatureEnabled() ? IDS_SETTINGS_SYNC_DESCRIPTION_UNIFIED_CONSENT : IDS_SETTINGS_SYNC_DESCRIPTION}, {"nonPersonalizedServicesSectionLabel", @@ -1686,7 +1686,7 @@ {"syncExpandA11yLabel", IDS_SETTINGS_SYNC_SECTION_ACCESSIBILITY_LABEL}, {"syncAndNonPersonalizedServices", IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, - {"syncPageTitle", IsUnifiedConsentFeatureEnabled(profile) + {"syncPageTitle", unified_consent::IsUnifiedConsentFeatureEnabled() ? IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES : IDS_SETTINGS_SYNC_PAGE_TITLE}, {"syncLoading", IDS_SETTINGS_SYNC_LOADING}, @@ -1779,7 +1779,7 @@ html_source->AddString( "passphraseResetHint", l10n_util::GetStringFUTF8( - IsUnifiedConsentFeatureEnabled(profile) + unified_consent::IsUnifiedConsentFeatureEnabled() ? IDS_SETTINGS_PASSPHRASE_RESET_HINT_UNIFIED_CONSENT : IDS_SETTINGS_PASSPHRASE_RESET_HINT, base::ASCIIToUTF16(sync_dashboard_url))); @@ -1804,7 +1804,7 @@ LocalizedString sync_disconnect_strings[] = { {"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, {"syncDisconnectTitle", - IsUnifiedConsentFeatureEnabled(profile) + unified_consent::IsUnifiedConsentFeatureEnabled() ? IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE_UNIFIED_CONSENT : IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE}, {"syncDisconnectDeleteProfile", @@ -1815,7 +1815,7 @@ AddLocalizedStringsBulk(html_source, sync_disconnect_strings, arraysize(sync_disconnect_strings)); - if (IsUnifiedConsentFeatureEnabled(profile)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { html_source->AddLocalizedString( "syncDisconnectExplanation", IDS_SETTINGS_SYNC_DISCONNECT_AND_SIGN_OUT_EXPLANATION_UNIFIED_CONSENT); @@ -1997,7 +1997,8 @@ arraysize(localized_strings)); // Select strings depending on unified-consent enabledness. - bool is_unified_consent_enabled = IsUnifiedConsentFeatureEnabled(profile); + bool is_unified_consent_enabled = + unified_consent::IsUnifiedConsentFeatureEnabled(); if (is_unified_consent_enabled) { LocalizedString conditional_localized_strings[] = { {"searchSuggestPref", IDS_SETTINGS_SUGGEST_PREF_UNIFIED_CONSENT}, @@ -2044,7 +2045,7 @@ } html_source->AddString("syncAndGoogleServicesLearnMoreURL", - IsUnifiedConsentFeatureEnabled(profile) + unified_consent::IsUnifiedConsentFeatureEnabled() ? chrome::kSyncAndGoogleServicesLearnMoreURL : ""); html_source->AddString( @@ -2659,6 +2660,11 @@ IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY, GetHelpUrlWithBoard(chrome::kMultiDeviceLearnMoreURL))); html_source->AddString( + "multideviceNoHostText", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MULTIDEVICE_NO_ELIGIBLE_HOSTS, + GetHelpUrlWithBoard(chrome::kMultiDeviceLearnMoreURL))); + html_source->AddString( "multideviceSmartLockItemSummary", l10n_util::GetStringFUTF16( IDS_SETTINGS_MULTIDEVICE_SMART_LOCK_SUMMARY,
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc index e2219ba..368ba57 100644 --- a/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -16,7 +16,6 @@ #include "base/metrics/histogram_macros.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/ui/webui/metrics_handler.h" #include "chrome/browser/ui/webui/settings/about_handler.h" #include "chrome/browser/ui/webui/settings/appearance_handler.h" @@ -46,6 +45,7 @@ #include "chrome/grit/settings_resources_map.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/pref_registry/pref_registry_syncable.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -352,7 +352,7 @@ #endif // defined(OS_CHROMEOS) html_source->AddBoolean("unifiedConsentEnabled", - IsUnifiedConsentFeatureEnabled(profile)); + unified_consent::IsUnifiedConsentFeatureEnabled()); // TODO(jdoerrie): https://crbug.com/854562. // Remove once Autofill Home is launched.
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index f3bd2ef..f1ea308 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_promo.h" #include "chrome/browser/signin/signin_ui_util.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/ui/browser_finder.h" @@ -51,6 +50,7 @@ #include "components/strings/grit/components_strings.h" #include "components/sync/base/passphrase_enums.h" #include "components/sync/base/sync_prefs.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" @@ -70,6 +70,7 @@ #endif #if BUILDFLAG(ENABLE_DICE_SUPPORT) #include "chrome/browser/profiles/profile_avatar_icon_util.h" +#include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/signin/account_tracker_service_factory.h" #include "components/signin/core/browser/account_tracker_service.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -486,6 +487,12 @@ } std::unique_ptr<base::ListValue> PeopleHandler::GetStoredAccountsList() { + if (!AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_)) { + // During the DICE migration, the settings code should not have access to + // the list of accounts as they should not be visible to the user. + return std::make_unique<base::ListValue>(); + } + std::vector<AccountInfo> accounts = signin_ui_util::GetAccountsForDicePromos(profile_); @@ -514,6 +521,7 @@ } void PeopleHandler::HandleStartSyncingWithEmail(const base::ListValue* args) { + DCHECK(AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_)); const base::Value* email; const base::Value* is_default_promo_account; CHECK(args->Get(0, &email)); @@ -618,8 +626,7 @@ // is disabled. // TODO(scottchen): finish the UI for signed-out users // (https://crbug.com/800972). - if (IsUnifiedConsentFeatureEnabled(profile_) && - (IsProfileAuthNeededOrHasErrors() || !service)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { if (service && !sync_blocker_) sync_blocker_ = service->GetSetupInProgressHandle(); @@ -703,9 +710,11 @@ void PeopleHandler::HandleStartSignin(const base::ListValue* args) { AllowJavascript(); - // Should only be called if the user is not already signed in or has an auth - // error. - DCHECK(IsProfileAuthNeededOrHasErrors()); + // Should only be called if the user is not already signed in, has a auth + // error, or a unrecoverable sync error requiring re-auth. + ProfileSyncService* service = GetSyncService(); + DCHECK(IsProfileAuthNeededOrHasErrors() || + (service && service->HasUnrecoverableError())); DisplayGaiaLogin(signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); }
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc index 4342b33..6f8e2de4 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_util.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h" #include "chrome/browser/ui/webui/signin/signin_utils_desktop.h" @@ -37,6 +36,7 @@ #include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/browser/signin_pref_names.h" #include "components/sync/base/sync_prefs.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #include "content/public/browser/storage_partition.h" @@ -407,7 +407,7 @@ } void DiceTurnSyncOnHelper::EnableUnifiedConsentIfNeeded() { - if (IsUnifiedConsentFeatureEnabled(profile_)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { UnifiedConsentServiceFactory::GetForProfile(profile_) ->SetUnifiedConsentGiven(true); }
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc index 1f8429e..d962685 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/signin/scoped_account_consistency.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/test_signin_client_builder.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/browser/unified_consent/unified_consent_service_factory.h" @@ -39,6 +38,7 @@ #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/browser/signin_pref_names.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/scoped_unified_consent.h" #include "components/unified_consent/unified_consent_service.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -702,7 +702,7 @@ // Tests that the user enabled unified consent, TEST_F(DiceTurnSyncOnHelperTestWithUnifiedConsent, ShowSyncDialogForEndConsumerAccount_UnifiedConsentEnabled) { - ASSERT_TRUE(IsUnifiedConsentFeatureEnabled(profile())); + ASSERT_TRUE(unified_consent::IsUnifiedConsentFeatureEnabled()); // Set expectations. expected_sync_confirmation_shown_ = true; sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
diff --git a/chrome/browser/ui/webui/signin/login_ui_service.cc b/chrome/browser/ui/webui/signin/login_ui_service.cc index 2e2cd99b..f5ca3a7 100644 --- a/chrome/browser/ui/webui/signin/login_ui_service.cc +++ b/chrome/browser/ui/webui/signin/login_ui_service.cc
@@ -24,7 +24,6 @@ #include "base/scoped_observer.h" #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/ui/browser_finder.h" @@ -34,6 +33,7 @@ #include "chrome/browser/unified_consent/unified_consent_service_factory.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/sync/base/sync_prefs.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/pref_names.h" #include "components/unified_consent/unified_consent_service.h" @@ -142,7 +142,7 @@ // this might crash because the profile has not been fully initialized yet. static bool ShouldShowConsentBumpFor(Profile* profile) { if (!profile->IsSyncAllowed() || - !IsUnifiedConsentFeatureWithBumpEnabled(profile) || + !unified_consent::IsUnifiedConsentFeatureWithBumpEnabled() || !ProfileSyncServiceFactory::HasProfileSyncService(profile)) return false; @@ -184,7 +184,7 @@ #endif { #if !defined(OS_CHROMEOS) - if (IsUnifiedConsentFeatureWithBumpEnabled(profile)) { + if (unified_consent::IsUnifiedConsentFeatureWithBumpEnabled()) { consent_bump_activator_ = std::make_unique<ConsentBumpActivator>(this, profile); }
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc index 3ca714c7..06d478d 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/account_tracker_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/signin_view_controller_delegate.h" @@ -26,6 +25,7 @@ #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/avatar_icon_util.h" #include "components/signin/core/browser/signin_manager.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "url/gurl.h" @@ -201,7 +201,7 @@ web_ui()->CallJavascriptFunctionUnsafe("sync.confirmation.setUserImageURL", picture_url_value); - if (IsUnifiedConsentFeatureEnabled(profile_)) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { AllowJavascript(); FireWebUIListener("account-image-changed", picture_url_value); }
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc index c8f7e1d..38f324c 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/webui/signin/sync_confirmation_handler.h" #include "chrome/common/url_constants.h" @@ -19,6 +18,7 @@ #include "chrome/grit/generated_resources.h" #include "components/signin/core/browser/avatar_icon_util.h" #include "components/strings/grit/components_strings.h" +#include "components/unified_consent/feature.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" #include "services/identity/public/cpp/identity_manager.h" @@ -30,7 +30,8 @@ consent_feature_(consent_auditor::Feature::CHROME_SYNC) { Profile* profile = Profile::FromWebUI(web_ui); bool is_sync_allowed = profile->IsSyncAllowed(); - bool is_unified_consent_enabled = IsUnifiedConsentFeatureEnabled(profile); + bool is_unified_consent_enabled = + unified_consent::IsUnifiedConsentFeatureEnabled(); content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISyncConfirmationHost);
diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc index d6285df2e..2892d4b3 100644 --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
@@ -722,36 +722,25 @@ // Strings needed for the user_pod_template public account div, but not ever // actually displayed for desktop users. - localized_strings->SetString("publicAccountReminder", base::string16()); - localized_strings->SetString("publicSessionLanguageAndInput", - base::string16()); - localized_strings->SetString("publicAccountEnter", base::string16()); - localized_strings->SetString("publicAccountEnterAccessibleName", - base::string16()); - localized_strings->SetString("publicAccountMonitoringWarning", - base::string16()); - localized_strings->SetString("publicAccountLearnMore", base::string16()); - localized_strings->SetString("publicAccountMonitoringInfo", base::string16()); - localized_strings->SetString("publicAccountMonitoringInfoItem1", - base::string16()); - localized_strings->SetString("publicAccountMonitoringInfoItem2", - base::string16()); - localized_strings->SetString("publicAccountMonitoringInfoItem3", - base::string16()); - localized_strings->SetString("publicAccountMonitoringInfoItem4", - base::string16()); - localized_strings->SetString("publicSessionSelectLanguage", base::string16()); - localized_strings->SetString("publicSessionSelectKeyboard", base::string16()); - localized_strings->SetString("signinBannerText", base::string16()); - localized_strings->SetString("launchAppButton", base::string16()); - localized_strings->SetString("multiProfilesRestrictedPolicyTitle", - base::string16()); - localized_strings->SetString("multiProfilesNotAllowedPolicyMsg", - base::string16()); - localized_strings->SetString("multiProfilesPrimaryOnlyPolicyMsg", - base::string16()); - localized_strings->SetString("multiProfilesOwnerPrimaryOnlyMsg", - base::string16()); + localized_strings->SetString("publicAccountReminder", ""); + localized_strings->SetString("publicSessionLanguageAndInput", ""); + localized_strings->SetString("publicAccountEnter", ""); + localized_strings->SetString("publicAccountEnterAccessibleName", ""); + localized_strings->SetString("publicAccountMonitoringWarning", ""); + localized_strings->SetString("publicAccountLearnMore", ""); + localized_strings->SetString("publicAccountMonitoringInfo", ""); + localized_strings->SetString("publicAccountMonitoringInfoItem1", ""); + localized_strings->SetString("publicAccountMonitoringInfoItem2", ""); + localized_strings->SetString("publicAccountMonitoringInfoItem3", ""); + localized_strings->SetString("publicAccountMonitoringInfoItem4", ""); + localized_strings->SetString("publicSessionSelectLanguage", ""); + localized_strings->SetString("publicSessionSelectKeyboard", ""); + localized_strings->SetString("signinBannerText", ""); + localized_strings->SetString("launchAppButton", ""); + localized_strings->SetString("multiProfilesRestrictedPolicyTitle", ""); + localized_strings->SetString("multiProfilesNotAllowedPolicyMsg", ""); + localized_strings->SetString("multiProfilesPrimaryOnlyPolicyMsg", ""); + localized_strings->SetString("multiProfilesOwnerPrimaryOnlyMsg", ""); // Error message when trying to add a profile while all profiles are locked. localized_strings->SetString("addProfileAllProfilesLockedError",
diff --git a/chrome/browser/ui/webui/welcome_ui.cc b/chrome/browser/ui/webui/welcome_ui.cc index ebb5941..1a7152b 100644 --- a/chrome/browser/ui/webui/welcome_ui.cc +++ b/chrome/browser/ui/webui/welcome_ui.cc
@@ -28,6 +28,7 @@ #include "components/nux/constants.h" #include "components/nux/email/email_handler.h" #include "components/nux/google_apps/google_apps_handler.h" +#include "components/nux/set_as_default/set_as_default_handler.h" #include "components/nux/show_promo_delegate.h" #include "content/public/browser/web_contents.h" #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) @@ -112,6 +113,14 @@ } #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) + if (base::FeatureList::IsEnabled(nux::kNuxOnboardingFeature)) { + web_ui->AddMessageHandler(std::make_unique<nux::SetAsDefaultHandler>()); + nux::SetAsDefaultHandler::AddSources(html_source); + + // TODO(scottchen): move all NUX features under this flag once individual + // experiments launch. + } + if (base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) { content::BrowserContext* browser_context = web_ui->GetWebContents()->GetBrowserContext();
diff --git a/chrome/browser/unified_consent/unified_consent_service_factory.cc b/chrome/browser/unified_consent/unified_consent_service_factory.cc index e977024..616e87b 100644 --- a/chrome/browser/unified_consent/unified_consent_service_factory.cc +++ b/chrome/browser/unified_consent/unified_consent_service_factory.cc
@@ -7,13 +7,13 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/unified_consent/chrome_unified_consent_service_client.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" UnifiedConsentServiceFactory::UnifiedConsentServiceFactory() @@ -51,7 +51,7 @@ if (!sync_service) return nullptr; - if (!IsUnifiedConsentFeatureEnabled(profile)) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { unified_consent::UnifiedConsentService::RollbackIfNeeded( profile->GetPrefs(), sync_service); return nullptr;
diff --git a/chrome/browser/unified_consent/unified_consent_test_util.cc b/chrome/browser/unified_consent/unified_consent_test_util.cc index 88d7abd..54973e1e 100644 --- a/chrome/browser/unified_consent/unified_consent_test_util.cc +++ b/chrome/browser/unified_consent/unified_consent_test_util.cc
@@ -6,9 +6,9 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/unified_consent/unified_consent_service_factory.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #include "components/unified_consent/unified_consent_service_client.h" @@ -36,7 +36,7 @@ content::BrowserContext* context) { Profile* profile = Profile::FromBrowserContext(context); - if (!IsUnifiedConsentFeatureEnabled(profile)) + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) return nullptr; return std::make_unique<unified_consent::UnifiedConsentService>(
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index 977d6808..7a904e3 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -76,6 +76,7 @@ #include "components/toolbar/vector_icons.h" #include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/transform_util.h" namespace vr { @@ -2153,7 +2154,7 @@ kUrlBarSecurityButton, kPhaseForeground, base::BindRepeating(&UiBrowserInterface::ShowPageInfo, base::Unretained(browser_)), - toolbar::kHttpsInvalidIcon, audio_delegate_); + gfx::kNoneIcon, audio_delegate_); security_button->SetIconScaleFactor(kUrlBarButtonIconScaleFactor); security_button->SetSize(kUrlBarButtonSizeDMM, kUrlBarButtonSizeDMM); security_button->set_corner_radius(kUrlBarItemCornerRadiusDMM);
diff --git a/chrome/browser/vr/vector_icons/BUILD.gn b/chrome/browser/vr/vector_icons/BUILD.gn index 7383f85..f47bb19 100644 --- a/chrome/browser/vr/vector_icons/BUILD.gn +++ b/chrome/browser/vr/vector_icons/BUILD.gn
@@ -22,6 +22,8 @@ source_set("vector_icons") { sources = get_target_outputs(":vr_vector_icons") + defines = [ "VR_VECTOR_ICONS_IMPL" ] + deps = [ ":vr_vector_icons", "//base",
diff --git a/chrome/browser/vr/vector_icons/vector_icons.cc.template b/chrome/browser/vr/vector_icons/vector_icons.cc.template index d3e6381..34e279f 100644 --- a/chrome/browser/vr/vector_icons/vector_icons.cc.template +++ b/chrome/browser/vr/vector_icons/vector_icons.cc.template
@@ -8,7 +8,6 @@ #include "chrome/browser/vr/vector_icons/vector_icons.h" #include "base/logging.h" -#include "ui/gfx/animation/tween.h" #include "ui/gfx/vector_icon_types.h" #include "components/vector_icons/cc_macros.h"
diff --git a/chrome/browser/vr/vector_icons/vector_icons.h.template b/chrome/browser/vr/vector_icons/vector_icons.h.template index fca397f..9c0b0e1 100644 --- a/chrome/browser/vr/vector_icons/vector_icons.h.template +++ b/chrome/browser/vr/vector_icons/vector_icons.h.template
@@ -17,6 +17,10 @@ #define VECTOR_ICON_TEMPLATE_H(icon_name) \ extern const gfx::VectorIcon icon_name; +#if defined(FEATURE_MODULES) && defined(VR_VECTOR_ICONS_IMPL) +#define VECTOR_ICON_EXPORT __attribute__((visibility("default"))) +#endif + TEMPLATE_PLACEHOLDER #undef VECTOR_ICON_TEMPLATE_H
diff --git a/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc b/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc index d9dce950..247aa6d 100644 --- a/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc +++ b/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc
@@ -84,10 +84,10 @@ continue; } - app_infos.push_back( - web_app::PendingAppManager::AppInfo::CreateForDefaultApp( - std::move(start_url), - web_app::PendingAppManager::LaunchContainer::kWindow)); + app_infos.emplace_back( + std::move(start_url), + web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled); } return app_infos;
diff --git a/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc b/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc index 75cfedf..204b6d2 100644 --- a/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc +++ b/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc
@@ -49,8 +49,9 @@ for (const char* url : urls) { EXPECT_TRUE(base::ContainsValue( app_infos, - web_app::PendingAppManager::AppInfo::CreateForDefaultApp( - GURL(url), web_app::PendingAppManager::LaunchContainer::kWindow))); + web_app::PendingAppManager::AppInfo( + GURL(url), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled))); } }
diff --git a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.cc b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.cc index 0cc1c688..eb83a27 100644 --- a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.cc +++ b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.cc
@@ -104,8 +104,10 @@ container = PendingAppManager::LaunchContainer::kTab; // There is a separate policy to create shortcuts/pin apps to shelf. - apps_to_install.push_back(PendingAppManager::AppInfo::CreateForPolicy( - GURL(url.GetString()), container, false /* create_shortcuts */)); + apps_to_install.emplace_back( + GURL(url.GetString()), container, + web_app::PendingAppManager::InstallSource::kPolicyInstalled, + false /* create_shortcuts */); app_urls.emplace_back(url.GetString()); }
diff --git a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc index 0d7c22f..0f6c2a75 100644 --- a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc +++ b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc
@@ -45,8 +45,9 @@ } PendingAppManager::AppInfo GetWindowedAppInfo() { - return PendingAppManager::AppInfo::CreateForPolicy( + return PendingAppManager::AppInfo( GURL(kWindowedUrl), PendingAppManager::LaunchContainer::kWindow, + PendingAppManager::InstallSource::kPolicyInstalled, false /* create_shortcuts */); } @@ -58,8 +59,9 @@ } PendingAppManager::AppInfo GetTabbedAppInfo() { - return PendingAppManager::AppInfo::CreateForPolicy( + return PendingAppManager::AppInfo( GURL(kTabbedUrl), PendingAppManager::LaunchContainer::kTab, + PendingAppManager::InstallSource::kPolicyInstalled, false /* create_shortcuts */); } @@ -70,8 +72,9 @@ } PendingAppManager::AppInfo GetDefaultContainerAppInfo() { - return PendingAppManager::AppInfo::CreateForPolicy( + return PendingAppManager::AppInfo( GURL(kDefaultContainerUrl), PendingAppManager::LaunchContainer::kDefault, + PendingAppManager::InstallSource::kPolicyInstalled, false /* create_shortcuts */); } @@ -89,6 +92,8 @@ web_app::WebAppProvider::Get(profile())->Reset(); } + // TODO(nigeltao): replace the N SimulateEtc methods with 1 method, that + // derives the extensions::Manifest::Location from app_info.install_source. void SimulatePreviouslyInstalledApp(PendingAppManager::AppInfo app_info, extensions::Manifest::Location location = extensions::Manifest::INTERNAL) { @@ -108,15 +113,14 @@ void SimulatePreviouslyInstalledPolicyApp( PendingAppManager::AppInfo app_info) { - SimulatePreviouslyInstalledApp(std::move(app_info), - extensions::Manifest::EXTERNAL_POLICY); + SimulatePreviouslyInstalledApp( + std::move(app_info), extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD); } private: DISALLOW_COPY_AND_ASSIGN(WebAppPolicyManagerTest); }; - TEST_F(WebAppPolicyManagerTest, NoForceInstalledAppsPrefValue) { auto pending_app_manager = std::make_unique<TestPendingAppManager>(); WebAppPolicyManager web_app_policy_manager(profile(),
diff --git a/chrome/browser/web_applications/components/pending_app_manager.cc b/chrome/browser/web_applications/components/pending_app_manager.cc index cb6224ad..8f3c3a9 100644 --- a/chrome/browser/web_applications/components/pending_app_manager.cc +++ b/chrome/browser/web_applications/components/pending_app_manager.cc
@@ -9,32 +9,14 @@ namespace web_app { -// static -PendingAppManager::AppInfo PendingAppManager::AppInfo::Create( - GURL url, - LaunchContainer launch_container, - bool create_shortcuts) { - return AppInfo(url, launch_container, create_shortcuts, - InstallationFlag::kNone); -} - -// static -PendingAppManager::AppInfo PendingAppManager::AppInfo::CreateForDefaultApp( - GURL url, - LaunchContainer launch_container, - bool create_shortcuts) { - return AppInfo(url, launch_container, create_shortcuts, - InstallationFlag::kDefaultApp); -} - -// static -PendingAppManager::AppInfo PendingAppManager::AppInfo::CreateForPolicy( - GURL url, - LaunchContainer launch_container, - bool create_shortcuts) { - return AppInfo(url, launch_container, create_shortcuts, - InstallationFlag::kFromPolicy); -} +PendingAppManager::AppInfo::AppInfo(GURL url, + LaunchContainer launch_container, + InstallSource install_source, + bool create_shortcuts) + : url(std::move(url)), + launch_container(launch_container), + install_source(install_source), + create_shortcuts(create_shortcuts) {} PendingAppManager::AppInfo::AppInfo(PendingAppManager::AppInfo&& other) = default; @@ -44,27 +26,18 @@ std::unique_ptr<PendingAppManager::AppInfo> PendingAppManager::AppInfo::Clone() const { std::unique_ptr<AppInfo> other( - new AppInfo(url, launch_container, create_shortcuts, installation_flag)); + new AppInfo(url, launch_container, install_source, create_shortcuts)); DCHECK_EQ(*this, *other); return other; } bool PendingAppManager::AppInfo::operator==( const PendingAppManager::AppInfo& other) const { - return std::tie(url, launch_container, create_shortcuts, installation_flag) == - std::tie(other.url, other.launch_container, other.create_shortcuts, - other.installation_flag); + return std::tie(url, launch_container, install_source, create_shortcuts) == + std::tie(other.url, other.launch_container, other.install_source, + other.create_shortcuts); } -PendingAppManager::AppInfo::AppInfo(GURL url, - LaunchContainer launch_container, - bool create_shortcuts, - InstallationFlag installation_flag) - : url(std::move(url)), - launch_container(launch_container), - create_shortcuts(create_shortcuts), - installation_flag(installation_flag) {} - PendingAppManager::PendingAppManager() = default; PendingAppManager::~PendingAppManager() = default; @@ -73,9 +46,9 @@ const PendingAppManager::AppInfo& app_info) { return out << "url: " << app_info.url << "\n launch_container: " << static_cast<int32_t>(app_info.launch_container) - << "\n create_shortcuts: " << app_info.create_shortcuts - << "\n installation_flag: " - << static_cast<int64_t>(app_info.installation_flag); + << "\n install_source: " + << static_cast<int32_t>(app_info.install_source) + << "\n create_shortcuts: " << app_info.create_shortcuts; } } // namespace web_app
diff --git a/chrome/browser/web_applications/components/pending_app_manager.h b/chrome/browser/web_applications/components/pending_app_manager.h index de1f842..52569e0 100644 --- a/chrome/browser/web_applications/components/pending_app_manager.h +++ b/chrome/browser/web_applications/components/pending_app_manager.h
@@ -44,25 +44,22 @@ kWindow, }; - // What flags will be used when installing the app. - enum class InstallationFlag { - kNone, - kDefaultApp, - kFromPolicy, + // Where an app was installed from. This affects what flags will be used when + // installing the app. + enum class InstallSource { + // Installed by default on the system, such as "all such-and-such make and + // model Chromebooks should have this app installed". + kDefaultInstalled, + // Installed by sys-admin policy, such as "all example.com employees should + // have this app installed". + kPolicyInstalled, }; struct AppInfo { - static AppInfo Create(GURL url, - LaunchContainer launch_container, - bool create_shortcuts = true); - static AppInfo CreateForDefaultApp(GURL url, - LaunchContainer launch_container, - bool create_shortcuts = true); - static AppInfo CreateForPolicy(GURL url, - LaunchContainer launch_container, - bool create_shortcuts = true); - - // Prefer static methods above. + AppInfo(GURL url, + LaunchContainer launch_container, + InstallSource install_source, + bool create_shortcuts = true); AppInfo(AppInfo&& other); ~AppInfo(); @@ -72,15 +69,10 @@ const GURL url; const LaunchContainer launch_container; + const InstallSource install_source; const bool create_shortcuts; - const InstallationFlag installation_flag; private: - AppInfo(GURL url, - LaunchContainer launch_container, - bool create_shortcuts, - InstallationFlag installation_flag); - DISALLOW_COPY_AND_ASSIGN(AppInfo); };
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc index c216f66..f842c53c 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
@@ -117,13 +117,11 @@ break; } - switch (app_info_.installation_flag) { - case web_app::PendingAppManager::InstallationFlag::kNone: - break; - case web_app::PendingAppManager::InstallationFlag::kDefaultApp: + switch (app_info_.install_source) { + case web_app::PendingAppManager::InstallSource::kDefaultInstalled: helper_->set_is_default_app(); break; - case web_app::PendingAppManager::InstallationFlag::kFromPolicy: + case web_app::PendingAppManager::InstallSource::kPolicyInstalled: helper_->set_is_policy_installed_app(); break; }
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc index e3c3c7b..38fc133 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -300,8 +300,9 @@ auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), - web_app::PendingAppManager::AppInfo::Create( - app_url, web_app::PendingAppManager::LaunchContainer::kDefault)); + web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kDefault, + web_app::PendingAppManager::InstallSource::kDefaultInstalled)); SetTestingFactories(task.get(), app_url); @@ -320,7 +321,7 @@ EXPECT_TRUE(app_installed()); EXPECT_TRUE(test_helper().create_shortcuts()); EXPECT_FALSE(test_helper().forced_launch_type().has_value()); - EXPECT_FALSE(test_helper().is_default_app()); + EXPECT_TRUE(test_helper().is_default_app()); EXPECT_FALSE(test_helper().is_policy_installed_app()); } @@ -330,8 +331,9 @@ auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), - web_app::PendingAppManager::AppInfo::Create( - app_url, web_app::PendingAppManager::LaunchContainer::kWindow)); + web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled)); SetTestingFactories(task.get(), app_url); @@ -354,8 +356,9 @@ WebAppOrShortcutFromContents_NoShortcuts) { const GURL app_url(kWebAppUrl); - auto app_info = web_app::PendingAppManager::AppInfo::Create( + auto app_info = web_app::PendingAppManager::AppInfo( app_url, web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled, false /* create_shortcuts */); auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), std::move(app_info)); @@ -379,8 +382,9 @@ WebAppOrShortcutFromContents_ForcedContainerWindow) { const GURL app_url(kWebAppUrl); - auto app_info = web_app::PendingAppManager::AppInfo::Create( - app_url, web_app::PendingAppManager::LaunchContainer::kWindow); + auto app_info = web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled); auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), std::move(app_info)); SetTestingFactories(task.get(), app_url); @@ -401,8 +405,9 @@ WebAppOrShortcutFromContents_ForcedContainerTab) { const GURL app_url(kWebAppUrl); - auto app_info = web_app::PendingAppManager::AppInfo::Create( - app_url, web_app::PendingAppManager::LaunchContainer::kTab); + auto app_info = web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kTab, + web_app::PendingAppManager::InstallSource::kDefaultInstalled); auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), std::move(app_info)); SetTestingFactories(task.get(), app_url); @@ -423,8 +428,9 @@ WebAppOrShortcutFromContents_DefaultApp) { const GURL app_url(kWebAppUrl); - auto app_info = web_app::PendingAppManager::AppInfo::CreateForDefaultApp( - app_url, web_app::PendingAppManager::LaunchContainer::kDefault); + auto app_info = web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kDefault, + web_app::PendingAppManager::InstallSource::kDefaultInstalled); auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), std::move(app_info)); SetTestingFactories(task.get(), app_url); @@ -445,8 +451,9 @@ WebAppOrShortcutFromContents_AppFromPolicy) { const GURL app_url(kWebAppUrl); - auto app_info = web_app::PendingAppManager::AppInfo::CreateForPolicy( - app_url, web_app::PendingAppManager::LaunchContainer::kDefault); + auto app_info = web_app::PendingAppManager::AppInfo( + app_url, web_app::PendingAppManager::LaunchContainer::kDefault, + web_app::PendingAppManager::InstallSource::kPolicyInstalled); auto task = std::make_unique<BookmarkAppInstallationTask>( profile(), std::move(app_info)); SetTestingFactories(task.get(), app_url);
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc index 2200293a..2f5cc062 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc
@@ -26,9 +26,10 @@ // right now. // TODO(crbug.com/864904): Take an AppInfo object once the installer // can use the information. - web_app::PendingAppManager::AppInfo::Create( + web_app::PendingAppManager::AppInfo( GURL(), - web_app::PendingAppManager::LaunchContainer::kTab)) {} + web_app::PendingAppManager::LaunchContainer::kTab, + web_app::PendingAppManager::InstallSource::kDefaultInstalled)) {} BookmarkAppShortcutInstallationTask::~BookmarkAppShortcutInstallationTask() = default;
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_browsertest.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_browsertest.cc index 5b2c8fc..f6e9900 100644 --- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_browsertest.cc
@@ -29,10 +29,11 @@ std::string app_id; web_app::WebAppProvider::Get(browser()->profile()) ->pending_app_manager() - .Install(web_app::PendingAppManager::AppInfo::Create( + .Install(web_app::PendingAppManager::AppInfo( embedded_test_server()->GetURL( "/banners/manifest_test_page.html"), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled, false /* create_shortcuts */), // Avoid creating real // shortcuts in tests. base::BindLambdaForTesting( @@ -59,10 +60,11 @@ // Start an installation but don't wait for it to finish. web_app::WebAppProvider::Get(browser()->profile()) ->pending_app_manager() - .Install(web_app::PendingAppManager::AppInfo::Create( + .Install(web_app::PendingAppManager::AppInfo( embedded_test_server()->GetURL( "/banners/manifest_test_page.html"), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kDefaultInstalled, false /* create_shortcuts */), // Avoid creating real // shortcuts in tests. base::DoNothing());
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc index 08ff4da..dc52d43 100644 --- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc +++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
@@ -41,31 +41,32 @@ const char kWrongUrl[] = "https://foobar.example"; web_app::PendingAppManager::AppInfo GetFooAppInfo() { - return web_app::PendingAppManager::AppInfo::Create( - GURL(kFooWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab); + return web_app::PendingAppManager::AppInfo( + GURL(kFooWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab, + web_app::PendingAppManager::InstallSource::kPolicyInstalled); } web_app::PendingAppManager::AppInfo GetBarAppInfo() { - return web_app::PendingAppManager::AppInfo::Create( - GURL(kBarWebAppUrl), - web_app::PendingAppManager::LaunchContainer::kWindow); + return web_app::PendingAppManager::AppInfo( + GURL(kBarWebAppUrl), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kPolicyInstalled); } web_app::PendingAppManager::AppInfo GetQuxAppInfo() { - return web_app::PendingAppManager::AppInfo::Create( - GURL(kQuxWebAppUrl), - web_app::PendingAppManager::LaunchContainer::kWindow); + return web_app::PendingAppManager::AppInfo( + GURL(kQuxWebAppUrl), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kPolicyInstalled); } web_app::PendingAppManager::AppInfo GetXyzAppInfo() { - return web_app::PendingAppManager::AppInfo::Create( - GURL(kXyzWebAppUrl), - web_app::PendingAppManager::LaunchContainer::kWindow); + return web_app::PendingAppManager::AppInfo( + GURL(kXyzWebAppUrl), web_app::PendingAppManager::LaunchContainer::kWindow, + web_app::PendingAppManager::InstallSource::kPolicyInstalled); } scoped_refptr<Extension> CreateDummyExtension(const std::string& id) { return ExtensionBuilder("Dummy name") - .SetLocation(Manifest::INTERNAL) + .SetLocation(Manifest::EXTERNAL_POLICY) .SetID(id) .Build(); }
diff --git a/chrome/browser/web_applications/extensions/web_app_extension_ids_map.cc b/chrome/browser/web_applications/extensions/web_app_extension_ids_map.cc index 21f2039b..930c6b7 100644 --- a/chrome/browser/web_applications/extensions/web_app_extension_ids_map.cc +++ b/chrome/browser/web_applications/extensions/web_app_extension_ids_map.cc
@@ -63,7 +63,7 @@ extension_id, extensions::ExtensionRegistry::EVERYTHING); if (!extension) continue; - if (extension->location() != extensions::Manifest::EXTERNAL_POLICY) + if (!extensions::Manifest::IsPolicyLocation(extension->location())) continue; policy_installed_app_urls.emplace_back(url_to_id.first);
diff --git a/chrome/chrome_cleaner/interfaces/engine_requests.mojom b/chrome/chrome_cleaner/interfaces/engine_requests.mojom index a816495..6e351f17 100644 --- a/chrome/chrome_cleaner/interfaces/engine_requests.mojom +++ b/chrome/chrome_cleaner/interfaces/engine_requests.mojom
@@ -1,6 +1,7 @@ // 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. + module chrome_cleaner.mojom; import "chrome/chrome_cleaner/interfaces/string16_embedded_nulls.mojom";
diff --git a/chrome/chrome_cleaner/interfaces/engine_sandbox.mojom b/chrome/chrome_cleaner/interfaces/engine_sandbox.mojom index 78f33be..60ba6fb 100644 --- a/chrome/chrome_cleaner/interfaces/engine_sandbox.mojom +++ b/chrome/chrome_cleaner/interfaces/engine_sandbox.mojom
@@ -31,9 +31,8 @@ Done(uint32 result_code); }; -// This interface connects the sandbox broker process to the sandbox target -// process, which implements the interface using functions declared in -// third_party/eset_lib/src/api/eset_cleaner.h. +// This interface sends commands from the sandbox broker process to the sandbox +// target process. interface EngineCommands { // Runs the engine's initialization routine. Initialize(associated EngineFileRequests file_requests,
diff --git a/chrome/chrome_cleaner/interfaces/pup.mojom b/chrome/chrome_cleaner/interfaces/pup.mojom index 3b871c8..fa8ed33 100644 --- a/chrome/chrome_cleaner/interfaces/pup.mojom +++ b/chrome/chrome_cleaner/interfaces/pup.mojom
@@ -21,7 +21,7 @@ // Typemapped to chrome_cleaner::RegKeyPath. struct RegKeyPath { - WindowsHandle rootkey; + PredefinedHandle rootkey; // This is only sent by URZA, which currently doesn't support registry paths // with embedded nulls. mojo_base.mojom.String16 subkey;
diff --git a/chrome/chrome_cleaner/interfaces/typemaps/pup.typemap b/chrome/chrome_cleaner/interfaces/typemaps/pup.typemap index 6e0d88a..d4ddfb4 100644 --- a/chrome/chrome_cleaner/interfaces/typemaps/pup.typemap +++ b/chrome/chrome_cleaner/interfaces/typemaps/pup.typemap
@@ -1,4 +1,6 @@ -# Copyright 2018 Google Inc. 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. mojom = "//chrome/chrome_cleaner/interfaces/pup.mojom"
diff --git a/chrome/chrome_cleaner/interfaces/typemaps/string16_embedded_nulls.typemap b/chrome/chrome_cleaner/interfaces/typemaps/string16_embedded_nulls.typemap index 2e5fd13..be6ece3 100644 --- a/chrome/chrome_cleaner/interfaces/typemaps/string16_embedded_nulls.typemap +++ b/chrome/chrome_cleaner/interfaces/typemaps/string16_embedded_nulls.typemap
@@ -1,4 +1,6 @@ -# Copyright 2018 Google Inc. 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. mojom = "//chrome/chrome_cleaner/interfaces/string16_embedded_nulls.mojom" public_headers = [ "//chrome/chrome_cleaner/strings/string16_embedded_nulls.h" ]
diff --git a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle.typemap b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle.typemap index 4c5205b..2421c17d 100644 --- a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle.typemap +++ b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle.typemap
@@ -1,4 +1,6 @@ -# Copyright 2018 Google Inc. 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. mojom = "//chrome/chrome_cleaner/interfaces/windows_handle.mojom" public_headers = [] @@ -9,5 +11,7 @@ "//chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.cc", ] -type_mappings = - [ "chrome_cleaner.mojom.WindowsHandle=HANDLE[copyable_pass_by_value]" ] +type_mappings = [ + "chrome_cleaner.mojom.PredefinedHandle=HANDLE[copyable_pass_by_value]", + "chrome_cleaner.mojom.WindowsHandle=HANDLE[copyable_pass_by_value]", +]
diff --git a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.cc b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.cc index fa3d28c..057a662 100644 --- a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.cc +++ b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.cc
@@ -8,80 +8,81 @@ namespace mojo { -using chrome_cleaner::mojom::SpecialWindowsHandle; +using chrome_cleaner::mojom::PredefinedHandle; using chrome_cleaner::mojom::WindowsHandleDataView; namespace { -bool ToSpecialHandle(HANDLE handle, SpecialWindowsHandle* out_special_handle) { - DCHECK(out_special_handle); +bool ToPredefinedHandle(HANDLE handle, + PredefinedHandle* out_predefined_handle) { + DCHECK(out_predefined_handle); if (handle == nullptr) { - *out_special_handle = SpecialWindowsHandle::NULL_HANDLE; + *out_predefined_handle = PredefinedHandle::NULL_HANDLE; return true; } if (handle == INVALID_HANDLE_VALUE) { - *out_special_handle = SpecialWindowsHandle::INVALID_HANDLE; + *out_predefined_handle = PredefinedHandle::INVALID_HANDLE; return true; } if (handle == HKEY_CLASSES_ROOT) { - *out_special_handle = SpecialWindowsHandle::CLASSES_ROOT; + *out_predefined_handle = PredefinedHandle::CLASSES_ROOT; return true; } if (handle == HKEY_CURRENT_CONFIG) { - *out_special_handle = SpecialWindowsHandle::CURRENT_CONFIG; + *out_predefined_handle = PredefinedHandle::CURRENT_CONFIG; return true; } if (handle == HKEY_CURRENT_USER) { - *out_special_handle = SpecialWindowsHandle::CURRENT_USER; + *out_predefined_handle = PredefinedHandle::CURRENT_USER; return true; } if (handle == HKEY_LOCAL_MACHINE) { - *out_special_handle = SpecialWindowsHandle::LOCAL_MACHINE; + *out_predefined_handle = PredefinedHandle::LOCAL_MACHINE; return true; } if (handle == HKEY_USERS) { - *out_special_handle = SpecialWindowsHandle::USERS; + *out_predefined_handle = PredefinedHandle::USERS; return true; } return false; } -bool IsSpecialHandle(HANDLE handle) { - SpecialWindowsHandle unused; - return ToSpecialHandle(handle, &unused); +bool IsPredefinedHandle(HANDLE handle) { + PredefinedHandle unused; + return ToPredefinedHandle(handle, &unused); } -bool FromSpecialHandle(SpecialWindowsHandle special_handle, - HANDLE* out_handle) { +bool FromPredefinedHandle(PredefinedHandle predefined_handle, + HANDLE* out_handle) { DCHECK(out_handle); - switch (special_handle) { - case SpecialWindowsHandle::NULL_HANDLE: + switch (predefined_handle) { + case PredefinedHandle::NULL_HANDLE: *out_handle = nullptr; return true; - case SpecialWindowsHandle::INVALID_HANDLE: + case PredefinedHandle::INVALID_HANDLE: *out_handle = INVALID_HANDLE_VALUE; return true; - case SpecialWindowsHandle::CLASSES_ROOT: + case PredefinedHandle::CLASSES_ROOT: *out_handle = HKEY_CLASSES_ROOT; return true; - case SpecialWindowsHandle::CURRENT_CONFIG: + case PredefinedHandle::CURRENT_CONFIG: *out_handle = HKEY_CURRENT_CONFIG; return true; - case SpecialWindowsHandle::CURRENT_USER: + case PredefinedHandle::CURRENT_USER: *out_handle = HKEY_CURRENT_USER; return true; - case SpecialWindowsHandle::LOCAL_MACHINE: + case PredefinedHandle::LOCAL_MACHINE: *out_handle = HKEY_LOCAL_MACHINE; return true; - case SpecialWindowsHandle::USERS: + case PredefinedHandle::USERS: *out_handle = HKEY_USERS; return true; @@ -106,11 +107,24 @@ } // namespace // static +PredefinedHandle EnumTraits<PredefinedHandle, HANDLE>::ToMojom(HANDLE handle) { + PredefinedHandle result; + CHECK(ToPredefinedHandle(handle, &result)); + return result; +} + +// static +bool EnumTraits<PredefinedHandle, HANDLE>::FromMojom(PredefinedHandle input, + HANDLE* output) { + return FromPredefinedHandle(input, output); +} + +// static mojo::ScopedHandle UnionTraits<WindowsHandleDataView, HANDLE>::raw_handle( HANDLE handle) { DCHECK_EQ(WindowsHandleDataView::Tag::RAW_HANDLE, GetTag(handle)); - if (IsSpecialHandle(handle)) { + if (IsPredefinedHandle(handle)) { CHECK(false) << "Accessor raw_handle() should only be called when the " "union's tag is RAW_HANDLE."; return mojo::ScopedHandle(); @@ -121,24 +135,24 @@ } // static -SpecialWindowsHandle UnionTraits<WindowsHandleDataView, HANDLE>::special_handle( +PredefinedHandle UnionTraits<WindowsHandleDataView, HANDLE>::special_handle( HANDLE handle) { DCHECK_EQ(WindowsHandleDataView::Tag::SPECIAL_HANDLE, GetTag(handle)); - SpecialWindowsHandle special_handle; - if (ToSpecialHandle(handle, &special_handle)) - return special_handle; + PredefinedHandle predefined_handle; + if (ToPredefinedHandle(handle, &predefined_handle)) + return predefined_handle; CHECK(false) << "Accessor special_handle() should only be called when the " "union's tag is SPECIAL_HANDLE."; - return SpecialWindowsHandle::INVALID_HANDLE; + return PredefinedHandle::INVALID_HANDLE; } // static WindowsHandleDataView::Tag UnionTraits<WindowsHandleDataView, HANDLE>::GetTag( HANDLE handle) { - return IsSpecialHandle(handle) ? WindowsHandleDataView::Tag::SPECIAL_HANDLE - : WindowsHandleDataView::Tag::RAW_HANDLE; + return IsPredefinedHandle(handle) ? WindowsHandleDataView::Tag::SPECIAL_HANDLE + : WindowsHandleDataView::Tag::RAW_HANDLE; } // static @@ -157,14 +171,7 @@ return true; } - HANDLE special_handle; - if (FromSpecialHandle(windows_handle_view.special_handle(), - &special_handle)) { - *out = special_handle; - return true; - } - - return false; + return windows_handle_view.ReadSpecialHandle(out); } } // namespace mojo
diff --git a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.h b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.h index e0b27ad..0986b89 100644 --- a/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.h +++ b/chrome/chrome_cleaner/interfaces/typemaps/windows_handle_mojom_traits.h
@@ -11,10 +11,16 @@ namespace mojo { template <> +struct EnumTraits<chrome_cleaner::mojom::PredefinedHandle, HANDLE> { + static chrome_cleaner::mojom::PredefinedHandle ToMojom(HANDLE handle); + static bool FromMojom(chrome_cleaner::mojom::PredefinedHandle input, + HANDLE* result); +}; + +template <> struct UnionTraits<chrome_cleaner::mojom::WindowsHandleDataView, HANDLE> { static mojo::ScopedHandle raw_handle(HANDLE handle); - static chrome_cleaner::mojom::SpecialWindowsHandle special_handle( - HANDLE handle); + static chrome_cleaner::mojom::PredefinedHandle special_handle(HANDLE handle); static chrome_cleaner::mojom::WindowsHandleDataView::Tag GetTag( HANDLE handle); static bool Read(
diff --git a/chrome/chrome_cleaner/interfaces/windows_handle.mojom b/chrome/chrome_cleaner/interfaces/windows_handle.mojom index 5fb1f61..08bf809 100644 --- a/chrome/chrome_cleaner/interfaces/windows_handle.mojom +++ b/chrome/chrome_cleaner/interfaces/windows_handle.mojom
@@ -4,7 +4,7 @@ module chrome_cleaner.mojom; -enum SpecialWindowsHandle { +enum PredefinedHandle { NULL_HANDLE, INVALID_HANDLE, CLASSES_ROOT, @@ -14,13 +14,12 @@ USERS, }; -// Mojo's |handle| type passes handles with DUPLICATE_CLOSE_SOURCE. The special -// handles above can't be closed, so they can't be passed as |handle|. Use a +// Mojo can't pass predefined handles through its |handle| type, so use a // wrapper that puts these in |special_handle| and plain handles in // |raw_handle|. Typemapped to HANDLE. union WindowsHandle { handle raw_handle; - SpecialWindowsHandle special_handle; + PredefinedHandle special_handle; }; interface TestWindowsHandle {
diff --git a/chrome/chrome_watcher/DEPS b/chrome/chrome_watcher/DEPS index 2832776..2174042d 100644 --- a/chrome/chrome_watcher/DEPS +++ b/chrome/chrome_watcher/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+base", "+chrome/install_static", "+components/browser_watcher", "+components/crash",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 3b75dc4..282e17db8 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -581,6 +581,11 @@ "SupervisedUserCommittedInterstitials", base::FEATURE_ENABLED_BY_DEFAULT}; #if defined(OS_CHROMEOS) +// Enables or disables sliding (showing or hiding) the top-chrome UIs with page +// scrolls in tablet mode. +const base::Feature kSlideTopChromeWithPageScrolls{ + "SlideTopChromeWithPageScrolls", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables chrome://sys-internals. const base::Feature kSysInternals{"SysInternals", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 6f8b5891..a144f0c 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -374,7 +374,11 @@ extern const base::Feature kSupervisedUserCommittedInterstitials; #if defined(OS_CHROMEOS) -COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kSysInternals; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::Feature kSlideTopChromeWithPageScrolls; + +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::Feature kSysInternals; #endif #if !defined(OS_ANDROID)
diff --git a/chrome/common/chrome_render_frame.mojom b/chrome/common/chrome_render_frame.mojom index ceb2c7e..8a57c12a 100644 --- a/chrome/common/chrome_render_frame.mojom +++ b/chrome/common/chrome_render_frame.mojom
@@ -54,7 +54,6 @@ // Notifies the renderer whether hiding/showing the browser controls is // enabled, what the current state should be, and whether or not to // animate to the proper state. - [EnableIf=is_android] UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate);
diff --git a/chrome/common/extensions/api/BUILD.gn b/chrome/common/extensions/api/BUILD.gn index 6f90411..3d25c0a3 100644 --- a/chrome/common/extensions/api/BUILD.gn +++ b/chrome/common/extensions/api/BUILD.gn
@@ -12,7 +12,31 @@ assert(enable_extensions) -# TODO(devlin): Enforce visibility restrictions on more of these targets? +################################################################################ +# Public Targets + +group("api") { + public_deps = [ + ":generated_api_json_strings", + ":generated_api_types", + ] +} + +group("extensions_features") { + public_deps = [ + ":api_features", + ":manifest_features", + ":permission_features", + + # TODO(devlin): It would be nicer to have this dependency hoisted up to + # //extensions/common (since that's where it's consumed), but there's some + # cycles to be resolved first. + "//extensions/common/api:extensions_features", + ] +} + +################################################################################ +# Private Targets generated_json_strings("generated_api_json_strings") { sources = chrome_extensions_api_schema_sources + @@ -71,6 +95,7 @@ sources = [ "_api_features.json", ] + visibility = [ ":extensions_features" ] } json_features("permission_features") { @@ -79,6 +104,7 @@ sources = [ "_permission_features.json", ] + visibility = [ ":extensions_features" ] } json_features("manifest_features") { @@ -87,26 +113,5 @@ sources = [ "_manifest_features.json", ] -} - -# Public Targets - -group("api") { - public_deps = [ - ":generated_api_json_strings", - ":generated_api_types", - ] -} - -group("extensions_features") { - public_deps = [ - ":api_features", - ":manifest_features", - ":permission_features", - - # TODO(devlin): It would be nicer to have this dependency hoisted up to - # //extensions/common (since that's where it's consumed), but there's some - # cycles to be resolved first. - "//extensions/common/api:extensions_features", - ] + visibility = [ ":extensions_features" ] }
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl index f8fccdce1..ae3d2198 100644 --- a/chrome/common/extensions/api/autotest_private.idl +++ b/chrome/common/extensions/api/autotest_private.idl
@@ -174,5 +174,10 @@ // crostini is not already installed. // |callback|: Called when the operation has completed. static void runCrostiniInstaller(VoidCallback callback); + + // Enable/disable Crostini in preferences. + // |enabled|: Enable Crostini. + // |callback|: Called when the operation has completed. + static void setCrostiniEnabled(boolean enabled, VoidCallback callback); }; };
diff --git a/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc b/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc index 66d4ca8..6a1c71c 100644 --- a/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc +++ b/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc
@@ -214,7 +214,7 @@ // wildcards in URLPattern, so transform to what will match correctly. filter.replace(0, 11, "chrome-extension://*/"); URLPattern pattern(URLPattern::SCHEME_EXTENSION); - if (pattern.Parse(filter) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(filter) != URLPattern::ParseResult::kSuccess) { *error = extensions::ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidURLPatternError, filter); return nullptr;
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl index 1b0e015..629c68f 100644 --- a/chrome/common/extensions/api/file_manager_private.idl +++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -1111,6 +1111,13 @@ // |callback| static void mountCrostiniContainer(SimpleCallback callback); + // Shares directory with crostini container. + // |entry| Entry of the directory to share. + // |callback| + [nocompile] + static void sharePathWithCrostiniContainer( + [instanceof=DirectoryEntry] object entry, SimpleCallback callback); + // Starts installation of a Linux package. [nocompile] static void installLinuxPackage([instanceof=Entry] object entry,
diff --git a/chrome/common/extensions/api/file_manager_private_internal.idl b/chrome/common/extensions/api/file_manager_private_internal.idl index 5a53b45..9765c6e8 100644 --- a/chrome/common/extensions/api/file_manager_private_internal.idl +++ b/chrome/common/extensions/api/file_manager_private_internal.idl
@@ -100,6 +100,8 @@ GetDirectorySizeCallback callback); static void getRecentFiles(fileManagerPrivate.SourceRestriction restriction, GetRecentFilesCallback callback); + static void sharePathWithCrostiniContainer(DOMString url, + SimpleCallback callback); static void installLinuxPackage(DOMString url, InstallLinuxPackageCallback callback); };
diff --git a/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc b/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc index 029a5b2..f947c4c8 100644 --- a/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc +++ b/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc
@@ -60,20 +60,14 @@ return false; } } - if (one_tts_voice->HasKey(keys::kTtsVoicesGender)) { - if (!added_gender_warning) { - extension->AddInstallWarning( - InstallWarning(errors::kTtsGenderIsDeprecated)); - // No need to add a warning for each voice, that's noisy. - added_gender_warning = true; - } - if (!one_tts_voice->GetString( - keys::kTtsVoicesGender, &voice_data.gender) || - (voice_data.gender != keys::kTtsGenderMale && - voice_data.gender != keys::kTtsGenderFemale)) { - *error = base::ASCIIToUTF16(errors::kInvalidTtsVoicesGender); - return false; - } + // TODO(katie): After M73, consider deprecating this installation warning, + // since the warning landed in M70 and gender was deprecated in M71. + if (one_tts_voice->HasKey(keys::kTtsVoicesGender) && + !added_gender_warning) { + extension->AddInstallWarning( + InstallWarning(errors::kTtsGenderIsDeprecated)); + // No need to add a warning for each voice, that's noisy. + added_gender_warning = true; } if (one_tts_voice->HasKey(keys::kTtsVoicesRemote)) { if (!one_tts_voice->GetBoolean(
diff --git a/chrome/common/extensions/api/tts.json b/chrome/common/extensions/api/tts.json index 589dfcf..8928d14 100644 --- a/chrome/common/extensions/api/tts.json +++ b/chrome/common/extensions/api/tts.json
@@ -15,7 +15,7 @@ { "id": "VoiceGender", "type": "string", - "deprecated": "Gender is deprecated and will soon be ignored.", + "deprecated": "Gender is deprecated and is ignored.", "enum": ["male", "female"] }, { @@ -69,7 +69,7 @@ "gender": { "$ref": "VoiceGender", "optional": true, - "deprecated": "Gender is deprecated and will soon be ignored.", + "deprecated": "Gender is deprecated and will be ignored.", "description": "This voice's gender." }, "remote": { @@ -131,7 +131,7 @@ "gender": { "$ref": "VoiceGender", "optional": true, - "deprecated": "Gender is deprecated and will soon be ignored.", + "deprecated": "Gender is deprecated and will be ignored.", "description": "Gender of voice for synthesized speech." }, "rate": {
diff --git a/chrome/common/extensions/api/tts_engine.json b/chrome/common/extensions/api/tts_engine.json index e4ee45e..aa62c43 100644 --- a/chrome/common/extensions/api/tts_engine.json +++ b/chrome/common/extensions/api/tts_engine.json
@@ -10,7 +10,7 @@ { "id": "VoiceGender", "type": "string", - "deprecated": "Gender is deprecated and will soon be ignored.", + "deprecated": "Gender is deprecated and will be ignored.", "enum": ["male", "female"] } ], @@ -75,7 +75,7 @@ "gender": { "$ref": "VoiceGender", "optional": true, - "deprecated": "Gender is deprecated and will soon be ignored.", + "deprecated": "Gender is deprecated and will be ignored.", "description": "Gender of voice for synthesized speech." }, "rate": {
diff --git a/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc b/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc index a9ad5a3..d28fc9c9 100644 --- a/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc +++ b/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc
@@ -137,7 +137,7 @@ // URL patterns claimed here belong to the app's author verified sites. URLPattern pattern(URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS); - if (pattern.Parse(str_pattern) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(str_pattern) != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( merrors::kInvalidURLHandlerPatternElement, handler_id); return false;
diff --git a/chrome/common/extensions/api/webrtc_logging_private.idl b/chrome/common/extensions/api/webrtc_logging_private.idl index ed098e9..108460d 100644 --- a/chrome/common/extensions/api/webrtc_logging_private.idl +++ b/chrome/common/extensions/api/webrtc_logging_private.idl
@@ -162,10 +162,14 @@ // Start remote-bound event logging for a specific peer connection, // indicated by its ID, for which remote-bound event logging was not active. // If successful, the callback will carry the ID of the log. + // |webAppId| must be a number between 1 and 99 (inclusive), which will be + // incorporated into the uploaded log, so as to help distinugish logs + // captured by different web-apps. static void startEventLogging(RequestInfo request, DOMString securityOrigin, DOMString peerConnectionId, long maxLogSizeBytes, + long webAppId, StartEventLoggingCallback callback); // Returns the directory entry for the "WebRTC Logs" directory. If the
diff --git a/chrome/common/extensions/chrome_manifest_url_handlers.cc b/chrome/common/extensions/chrome_manifest_url_handlers.cc index b5eefc8..a7fd7795 100644 --- a/chrome/common/extensions/chrome_manifest_url_handlers.cc +++ b/chrome/common/extensions/chrome_manifest_url_handlers.cc
@@ -129,7 +129,7 @@ URLPattern pattern(URLPattern::SCHEME_CHROMEUI); std::string url = base::StringPrintf(kOverrideExtentUrlPatternFormat, page.c_str()); - if (pattern.Parse(url) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(url) != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidURLPatternError, url); return false;
diff --git a/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.html b/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.html index 62fd68d0..f142127 100644 --- a/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.html +++ b/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.html
@@ -29,7 +29,6 @@ <tr> <th>Voice Name</th> <th>Language</th> - <th>Gender</th> <th>Rate</th> <th>Pitch</th> <th>Volume</th> @@ -37,7 +36,6 @@ <tr> <td id="voiceName"></td> <td id="lang"></td> - <td id="gender"></td> <td id="rate"></td> <td id="pitch"></td> <td id="volume"></td>
diff --git a/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.js b/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.js index 3f69094f..0d607e43 100644 --- a/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.js +++ b/chrome/common/extensions/docs/examples/api/ttsEngine/console_tts_engine/console_tts_engine.js
@@ -9,7 +9,7 @@ var curOptions; function areNewOptions(options) { - var properties = ['voiceName', 'lang', 'gender', 'rate', 'pitch', 'volume']; + var properties = ['voiceName', 'lang', 'rate', 'pitch', 'volume']; for (var i = 0; i < properties.length; ++i) { if (options[properties[i]] != curOptions[properties[i]]) { @@ -31,7 +31,6 @@ function logOptions() { getTtsElement("voiceName").innerHTML = curOptions.voiceName; getTtsElement("lang").innerHTML = curOptions.lang; - getTtsElement("gender").innerHTML = curOptions.gender; getTtsElement("rate").innerHTML = curOptions.rate; getTtsElement("pitch").innerHTML = curOptions.pitch; getTtsElement("volume").innerHTML = curOptions.volume;
diff --git a/chrome/common/extensions/manifest_handlers/app_launch_info.cc b/chrome/common/extensions/manifest_handlers/app_launch_info.cc index 1babf59..72a719a 100644 --- a/chrome/common/extensions/manifest_handlers/app_launch_info.cc +++ b/chrome/common/extensions/manifest_handlers/app_launch_info.cc
@@ -289,7 +289,7 @@ URLPattern pattern(Extension::kValidWebExtentSchemes); URLPattern::ParseResult result = pattern.Parse(override_url.spec()); - DCHECK_EQ(result, URLPattern::PARSE_SUCCESS); + DCHECK_EQ(result, URLPattern::ParseResult::kSuccess); pattern.SetPath(pattern.path() + '*'); extension->AddWebExtentPattern(pattern); }
diff --git a/chrome/common/extensions/manifest_handlers/automation_unittest.cc b/chrome/common/extensions/manifest_handlers/automation_unittest.cc index a8a4460..9b45a321 100644 --- a/chrome/common/extensions/manifest_handlers/automation_unittest.cc +++ b/chrome/common/extensions/manifest_handlers/automation_unittest.cc
@@ -79,10 +79,9 @@ scoped_refptr<Extension> extension = LoadAndExpectWarning( "automation_matches.json", ErrorUtils::FormatErrorMessage( - automation_errors::kErrorInvalidMatch, - "www.badpattern.com", + automation_errors::kErrorInvalidMatch, "www.badpattern.com", URLPattern::GetParseResultString( - URLPattern::PARSE_ERROR_MISSING_SCHEME_SEPARATOR))); + URLPattern::ParseResult::kMissingSchemeSeparator))); ASSERT_TRUE(extension.get()); EXPECT_TRUE(VerifyOnePermissionMessage( @@ -150,10 +149,9 @@ EXPECT_EQ("", error); EXPECT_EQ(2u, extension->install_warnings().size()); EXPECT_EQ(ErrorUtils::FormatErrorMessage( - automation_errors::kErrorInvalidMatch, - "www.badpattern.com", + automation_errors::kErrorInvalidMatch, "www.badpattern.com", URLPattern::GetParseResultString( - URLPattern::PARSE_ERROR_MISSING_SCHEME_SEPARATOR)), + URLPattern::ParseResult::kMissingSchemeSeparator)), extension->install_warnings()[0].message); EXPECT_EQ(automation_errors::kErrorNoMatchesProvided, extension->install_warnings()[1].message);
diff --git a/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc b/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc index 58e33c3..7ad8af9 100644 --- a/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc +++ b/chrome/common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc
@@ -26,22 +26,19 @@ TEST_F(ContentScriptsManifestTest, MatchPattern) { Testcase testcases[] = { - // chrome:// urls are not allowed. - Testcase("content_script_chrome_url_invalid.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidMatch, - base::IntToString(0), - base::IntToString(0), - URLPattern::GetParseResultString( - URLPattern::PARSE_ERROR_INVALID_SCHEME))), + // chrome:// urls are not allowed. + Testcase( + "content_script_chrome_url_invalid.json", + ErrorUtils::FormatErrorMessage( + errors::kInvalidMatch, base::IntToString(0), base::IntToString(0), + URLPattern::GetParseResultString( + URLPattern::ParseResult::kInvalidScheme))), - // Match paterns must be strings. - Testcase("content_script_match_pattern_not_string.json", - ErrorUtils::FormatErrorMessage(errors::kInvalidMatch, - base::IntToString(0), - base::IntToString(0), - errors::kExpectString)) - }; + // Match paterns must be strings. + Testcase("content_script_match_pattern_not_string.json", + ErrorUtils::FormatErrorMessage( + errors::kInvalidMatch, base::IntToString(0), + base::IntToString(0), errors::kExpectString))}; RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
diff --git a/chrome/common/extensions/manifest_tests/extension_manifests_web_unittest.cc b/chrome/common/extensions/manifest_tests/extension_manifests_web_unittest.cc index dff2818c..248caa2 100644 --- a/chrome/common/extensions/manifest_tests/extension_manifests_web_unittest.cc +++ b/chrome/common/extensions/manifest_tests/extension_manifests_web_unittest.cc
@@ -18,34 +18,28 @@ TEST_F(ChromeManifestTest, AppWebUrls) { Testcase testcases[] = { - Testcase("web_urls_wrong_type.json", errors::kInvalidWebURLs), - Testcase("web_urls_invalid_1.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidWebURL, - base::IntToString(0), - errors::kExpectString)), - Testcase("web_urls_invalid_2.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidWebURL, - base::IntToString(0), - URLPattern::GetParseResultString( - URLPattern::PARSE_ERROR_MISSING_SCHEME_SEPARATOR))), - Testcase("web_urls_invalid_3.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidWebURL, - base::IntToString(0), - errors::kNoWildCardsInPaths)), - Testcase("web_urls_invalid_4.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidWebURL, - base::IntToString(0), - errors::kCannotClaimAllURLsInExtent)), - Testcase("web_urls_invalid_5.json", - ErrorUtils::FormatErrorMessage( - errors::kInvalidWebURL, - base::IntToString(1), - errors::kCannotClaimAllHostsInExtent)) - }; + Testcase("web_urls_wrong_type.json", errors::kInvalidWebURLs), + Testcase("web_urls_invalid_1.json", + ErrorUtils::FormatErrorMessage(errors::kInvalidWebURL, + base::IntToString(0), + errors::kExpectString)), + Testcase("web_urls_invalid_2.json", + ErrorUtils::FormatErrorMessage( + errors::kInvalidWebURL, base::IntToString(0), + URLPattern::GetParseResultString( + URLPattern::ParseResult::kMissingSchemeSeparator))), + Testcase("web_urls_invalid_3.json", + ErrorUtils::FormatErrorMessage(errors::kInvalidWebURL, + base::IntToString(0), + errors::kNoWildCardsInPaths)), + Testcase("web_urls_invalid_4.json", + ErrorUtils::FormatErrorMessage( + errors::kInvalidWebURL, base::IntToString(0), + errors::kCannotClaimAllURLsInExtent)), + Testcase("web_urls_invalid_5.json", + ErrorUtils::FormatErrorMessage( + errors::kInvalidWebURL, base::IntToString(1), + errors::kCannotClaimAllHostsInExtent))}; RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
diff --git a/chrome/common/media_router/mojo/media_router.mojom b/chrome/common/media_router/mojo/media_router.mojom index 20418ac..069d7cc 100644 --- a/chrome/common/media_router/mojo/media_router.mojom +++ b/chrome/common/media_router/mojo/media_router.mojom
@@ -389,12 +389,11 @@ // Sends |message| via the media route |media_route_id|. // If the operation was successful, |sent| is true; otherwise it is false. - SendRouteMessage(string media_route_id, string message) => (bool sent); + SendRouteMessage(string media_route_id, string message); // Sends |data| via the media route |media_route_id|. // If the operation was successful, |sent| is true; otherwise it is false. - SendRouteBinaryMessage(string media_route_id, array<uint8> data) - => (bool sent); + SendRouteBinaryMessage(string media_route_id, array<uint8> data); // Starts querying for sinks capable of displaying |media_source|. StartObservingMediaSinks(string media_source);
diff --git a/chrome/common/page_load_metrics/page_load_metrics.mojom b/chrome/common/page_load_metrics/page_load_metrics.mojom index 26c9dc0..a457eb1 100644 --- a/chrome/common/page_load_metrics/page_load_metrics.mojom +++ b/chrome/common/page_load_metrics/page_load_metrics.mojom
@@ -132,7 +132,7 @@ ParseTiming parse_timing; // Time between user input and navigation start. This is set for navigations // where the input start timing is known; currently when the navigation is - // initiated by a link click in the renderer. + // initiated by a link click in the renderer, or from the desktop omnibox. mojo_base.mojom.TimeDelta? input_to_navigation_start; // If you add additional members, also be sure to update page_load_timing.h.
diff --git a/chrome/common/ppapi_utils.cc b/chrome/common/ppapi_utils.cc index 4a6cd1a..968a768 100644 --- a/chrome/common/ppapi_utils.cc +++ b/chrome/common/ppapi_utils.cc
@@ -96,8 +96,6 @@ #include "ppapi/c/private/ppb_testing_private.h" #include "ppapi/c/private/ppb_udp_socket_private.h" #include "ppapi/c/private/ppb_uma_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" #include "ppapi/c/private/ppb_x509_certificate_private.h" #include "ppapi/c/trusted/ppb_broker_trusted.h" #include "ppapi/c/trusted/ppb_browser_font_trusted.h"
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index d6a4dbcb..d5b123b5 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -87,6 +87,8 @@ const char kChromeUIInvalidationsHost[] = "invalidations"; const char kChromeUIKillHost[] = "kill"; const char kChromeUILocalStateHost[] = "local-state"; +const char kChromeUIManagementHost[] = "management"; +const char kChromeUIManagementURL[] = "chrome://management"; const char kChromeUIMdUserManagerHost[] = "md-user-manager"; const char kChromeUIMdUserManagerUrl[] = "chrome://md-user-manager/"; const char kChromeUIMediaEngagementHost[] = "media-engagement";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index 60bcc27..f37f7d6 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -92,6 +92,8 @@ extern const char kChromeUIInvalidationsHost[]; extern const char kChromeUIKillHost[]; extern const char kChromeUILocalStateHost[]; +extern const char kChromeUIManagementHost[]; +extern const char kChromeUIManagementURL[]; extern const char kChromeUIMdUserManagerHost[]; extern const char kChromeUIMdUserManagerUrl[]; extern const char kChromeUIMediaEngagementHost[];
diff --git a/chrome/elevation_service/DEPS b/chrome/elevation_service/DEPS index 933a673..ffbe160 100644 --- a/chrome/elevation_service/DEPS +++ b/chrome/elevation_service/DEPS
@@ -1,4 +1,3 @@ include_rules = [ - "+base", "+chrome/install_static", ]
diff --git a/chrome/gpu/DEPS b/chrome/gpu/DEPS index 81c0aba..92fb433 100644 --- a/chrome/gpu/DEPS +++ b/chrome/gpu/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+chrome/common", "+components/arc/common", "+components/arc/video_accelerator", "+components/metrics",
diff --git a/chrome/install_static/test/DEPS b/chrome/install_static/test/DEPS index 933a673..5cd0867 100644 --- a/chrome/install_static/test/DEPS +++ b/chrome/install_static/test/DEPS
@@ -1,4 +1,3 @@ include_rules = [ "+base", - "+chrome/install_static", ]
diff --git a/chrome/installer/setup/BUILD.gn b/chrome/installer/setup/BUILD.gn index be77f74..11c2fe6 100644 --- a/chrome/installer/setup/BUILD.gn +++ b/chrome/installer/setup/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") +import("//build/config/chrome_build.gni") import("//chrome/installer/setup/buildflags.gni") import("//chrome/process_version_rc_template.gni") import("//testing/test.gni") @@ -33,12 +34,17 @@ ":buildflags", ":lib", ":setup_exe_version", + "//base", "//build/win:default_exe_manifest", + "//chrome/common:constants", "//chrome/install_static:install_static_util", + "//chrome/installer/util:with_rc_strings", + "//chrome_elf:constants", "//components/crash/content/app:app", "//components/crash/content/app:crash_export_thunks", "//components/crash/content/app:run_as_crashpad_handler", "//content/public/common:static_switches", + "//rlz:rlz_lib", ] libs = [ "netapi32.lib" ] @@ -46,8 +52,10 @@ static_library("lib") { sources = [ + "${branding_path_component}_behaviors.cc", "archive_patch_helper.cc", "archive_patch_helper.h", + "brand_behaviors.h", "install.cc", "install.h", "install_worker.cc", @@ -70,6 +78,8 @@ "setup_singleton.h", "setup_util.cc", "setup_util.h", + "uninstall_metrics.cc", + "uninstall_metrics.h", "update_active_setup_version_work_item.cc", "update_active_setup_version_work_item.h", "user_experiment.cc", @@ -81,20 +91,23 @@ public_deps = [ ":buildflags", "//base", + "//chrome/installer/util:with_rc_strings", + ] + + deps = [ "//chrome/common:constants", "//chrome/common:version_header", "//chrome/install_static:install_static_util", - "//chrome/installer/util:with_rc_strings", - "//chrome_elf:constants", "//components/base32", "//components/crash/content/app", "//components/crash/core/common", + "//components/metrics", "//components/zucchini:zucchini_io", "//components/zucchini:zucchini_lib", "//courgette:courgette_lib", - "//rlz:rlz_lib", "//third_party/bspatch", - "//third_party/zlib", + "//third_party/crashpad/crashpad/client", + "//third_party/crashpad/crashpad/util", "//ui/base:fullscreen_win", ] } @@ -118,6 +131,7 @@ "setup_singleton_unittest.cc", "setup_util_unittest.cc", "setup_util_unittest.h", + "uninstall_metrics_unittest.cc", "update_active_setup_version_work_item_unittest.cc", "user_experiment_unittest.cc", "user_hive_visitor_unittest.cc", @@ -129,6 +143,8 @@ "//base:i18n", "//base/allocator:buildflags", "//base/test:test_support", + "//chrome/common:constants", + "//chrome/common:version_header", "//chrome/install_static:install_static_util", "//chrome/install_static/test:test_support", "//chrome/installer/mini_installer:unit_tests",
diff --git a/chrome/installer/setup/DEPS b/chrome/installer/setup/DEPS index 79fa98ce51..8363363 100644 --- a/chrome/installer/setup/DEPS +++ b/chrome/installer/setup/DEPS
@@ -2,8 +2,10 @@ "+chrome_elf/chrome_elf_constants.h", "+chrome/install_static", "+components/base32", + "+components/metrics", "+components/zucchini", "+courgette", + "+third_party/crashpad", ] specific_include_rules = {
diff --git a/chrome/installer/setup/brand_behaviors.h b/chrome/installer/setup/brand_behaviors.h new file mode 100644 index 0000000..75de259 --- /dev/null +++ b/chrome/installer/setup/brand_behaviors.h
@@ -0,0 +1,45 @@ +// 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. + +// Declares functions that implement brand-specific behavior. The definitions +// reside in brand-specific files that are only compiled when their respective +// branding is in use at build time. + +#ifndef CHROME_INSTALLER_SETUP_BRAND_BEHAVIORS_H_ +#define CHROME_INSTALLER_SETUP_BRAND_BEHAVIORS_H_ + +#include "base/strings/string16.h" +#include "chrome/installer/util/util_constants.h" + +namespace base { +class FilePath; +class Version; +} // namespace base + +namespace installer { + +// Communicates a change in install status to the updater. |archive_type|, if +// not UNKNOWN_ARCHIVE_TYPE, indicates what type of install/update is being +// applied. |install_status|, if not UNKNOWN_STATUS, indicates the result of the +// install/update. +void UpdateInstallStatus(installer::ArchiveType archive_type, + installer::InstallStatus install_status); + +// Returns an opaque string holding data relating to the browser being +// uninstalled. This function is called before the product's Clients key is +// deleted. This blob is later passed to DoPostUninstallOperations. +base::string16 GetDistributionData(); + +// Performs brand-specific operations following unintsallation of the browser. +// |version| is the version of the browser being uninstalled. |local_data_path| +// |is a backup of the Local State file of the user performing the uninstall +// |operation. |distribution_data| is the string generated by +// |GetDistributionData(). +void DoPostUninstallOperations(const base::Version& version, + const base::FilePath& local_data_path, + const base::string16& distribution_data); + +} // namespace installer + +#endif // CHROME_INSTALLER_SETUP_BRAND_BEHAVIORS_H_
diff --git a/chrome/installer/setup/chromium_behaviors.cc b/chrome/installer/setup/chromium_behaviors.cc new file mode 100644 index 0000000..53fb1151 --- /dev/null +++ b/chrome/installer/setup/chromium_behaviors.cc
@@ -0,0 +1,20 @@ +// 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/installer/setup/brand_behaviors.h" + +namespace installer { + +void UpdateInstallStatus(installer::ArchiveType archive_type, + installer::InstallStatus install_status) {} + +base::string16 GetDistributionData() { + return base::string16(); +} + +void DoPostUninstallOperations(const base::Version& version, + const base::FilePath& local_data_path, + const base::string16& distribution_data) {} + +} // namespace installer
diff --git a/chrome/installer/setup/google_chrome_behaviors.cc b/chrome/installer/setup/google_chrome_behaviors.cc new file mode 100644 index 0000000..1380065 --- /dev/null +++ b/chrome/installer/setup/google_chrome_behaviors.cc
@@ -0,0 +1,213 @@ +// 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/installer/setup/brand_behaviors.h" + +#include <windows.h> + +#include <shellapi.h> +#include <memory> + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/version.h" +#include "base/win/registry.h" +#include "base/win/windows_version.h" +#include "base/win/wmi.h" +#include "chrome/common/chrome_paths_internal.h" +#include "chrome/install_static/install_util.h" +#include "chrome/installer/setup/uninstall_metrics.h" +#include "chrome/installer/util/google_update_constants.h" +#include "chrome/installer/util/google_update_settings.h" +#include "chrome/installer/util/install_util.h" +#include "third_party/crashpad/crashpad/client/crash_report_database.h" +#include "third_party/crashpad/crashpad/client/settings.h" +#include "third_party/crashpad/crashpad/util/misc/uuid.h" + +namespace installer { + +namespace { + +// Substitutes the locale parameter in |url| with whatever Google Update tells +// us is the locale. In case we fail to find the locale, we use US English. +base::string16 LocalizeUrl(const wchar_t* url) { + base::string16 language; + if (!GoogleUpdateSettings::GetLanguage(&language)) + language = L"en-US"; // Default to US English. + return base::ReplaceStringPlaceholders(url, language, nullptr); +} + +base::string16 GetUninstallSurveyUrl() { + static constexpr wchar_t kSurveyUrl[] = + L"https://support.google.com/chrome/contact/chromeuninstall3?hl=$1"; + return LocalizeUrl(kSurveyUrl); +} + +bool NavigateToUrlWithEdge(const base::string16& url) { + base::string16 protocol_url = L"microsoft-edge:" + url; + SHELLEXECUTEINFO info = {sizeof(info)}; + info.fMask = SEE_MASK_NOASYNC; + info.lpVerb = L"open"; + info.lpFile = protocol_url.c_str(); + info.nShow = SW_SHOWNORMAL; + if (::ShellExecuteEx(&info)) + return true; + PLOG(ERROR) << "Failed to launch Edge for uninstall survey"; + return false; +} + +void NavigateToUrlWithIExplore(const base::string16& url) { + base::FilePath iexplore; + if (!base::PathService::Get(base::DIR_PROGRAM_FILES, &iexplore)) + return; + + iexplore = iexplore.AppendASCII("Internet Explorer"); + iexplore = iexplore.AppendASCII("iexplore.exe"); + + base::string16 command = L"\"" + iexplore.value() + L"\" " + url; + + int pid = 0; + // The reason we use WMI to launch the process is because the uninstall + // process runs inside a Job object controlled by the shell. As long as there + // are processes running, the shell will not close the uninstall applet. WMI + // allows us to escape from the Job object so the applet will close. + base::win::WmiLaunchProcess(command, &pid); +} + +} // namespace + +// If |archive_type| is INCREMENTAL_ARCHIVE_TYPE and |install_status| does not +// indicate a successful update, "-full" is appended to Chrome's "ap" value in +// its ClientState key if it is not present, resulting in the full installer +// being returned from the next update check. If |archive_type| is +// FULL_ARCHIVE_TYPE or |install_status| indicates a successful update, "-full" +// is removed from the "ap" value. "-multifail" and "-stage:*" values are +// unconditionally removed from the "ap" value. +void UpdateInstallStatus(installer::ArchiveType archive_type, + installer::InstallStatus install_status) { + GoogleUpdateSettings::UpdateInstallStatus( + install_static::IsSystemInstall(), archive_type, + InstallUtil::GetInstallReturnCode(install_status), + install_static::GetAppGuid()); +} + +// Returns a string holding the following URL query parameters: +// - brand +// - client +// - ap +// - crash_client_id +base::string16 GetDistributionData() { + base::string16 result; + base::win::RegKey client_state_key( + install_static::IsSystemInstall() ? HKEY_LOCAL_MACHINE + : HKEY_CURRENT_USER, + install_static::GetClientStateKeyPath().c_str(), + KEY_QUERY_VALUE | KEY_WOW64_32KEY); + base::string16 brand_value; + if (client_state_key.ReadValue(google_update::kRegRLZBrandField, + &brand_value) == ERROR_SUCCESS) { + result.append(google_update::kRegRLZBrandField); + result.append(L"="); + result.append(brand_value); + result.append(L"&"); + } + + base::string16 client_value; + if (client_state_key.ReadValue(google_update::kRegClientField, + &client_value) == ERROR_SUCCESS) { + result.append(google_update::kRegClientField); + result.append(L"="); + result.append(client_value); + result.append(L"&"); + } + + base::string16 ap_value; + // If we fail to read the ap key, send up "&ap=" anyway to indicate + // that this was probably a stable channel release. + client_state_key.ReadValue(google_update::kRegApField, &ap_value); + result.append(google_update::kRegApField); + result.append(L"="); + result.append(ap_value); + + // Crash client id. + // While it would be convenient to use the path service to get + // chrome::DIR_CRASH_DUMPS, that points to the dump location for the installer + // rather than for the browser. For per-user installs they are the same, yet + // for system-level installs the installer uses the system temp directory (see + // setup/installer_crash_reporting.cc's ConfigureCrashReporting). + // TODO(grt): use install_static::GetDefaultCrashDumpLocation (with an option + // to suppress creating the directory) once setup.exe uses + // install_static::InstallDetails. + base::FilePath crash_dir; + if (chrome::GetDefaultUserDataDirectory(&crash_dir)) { + crash_dir = crash_dir.Append(FILE_PATH_LITERAL("Crashpad")); + crashpad::UUID client_id; + std::unique_ptr<crashpad::CrashReportDatabase> database( + crashpad::CrashReportDatabase::InitializeWithoutCreating(crash_dir)); + if (database && database->GetSettings()->GetClientID(&client_id)) + result.append(L"&crash_client_id=").append(client_id.ToString16()); + } + + return result; +} + +// Launches Edge or IE to show the uninstall survey. The following URL query +// params are included unconditionally in the survey URL: +// - crversion: the version of Chrome being uninstalled +// - os: Major.Minor.Build of the OS version +// If the user is sending crash reports and usage statistics to Google, the +// uninstall metrics read from |local_data_path| and the query params in +// |distribution_data| are included in the URL. +void DoPostUninstallOperations(const base::Version& version, + const base::FilePath& local_data_path, + const base::string16& distribution_data) { + // Send the Chrome version and OS version as params to the form. It would be + // nice to send the locale, too, but I don't see an easy way to get that in + // the existing code. It's something we can add later, if needed. We depend + // on installed_version.GetString() not having spaces or other characters that + // need escaping: 0.2.13.4. Should that change, we will need to escape the + // string before using it in a URL. + const base::win::OSInfo* os_info = base::win::OSInfo::GetInstance(); + base::win::OSInfo::VersionNumber version_number = os_info->version_number(); + base::string16 os_version = + base::StringPrintf(L"%d.%d.%d", version_number.major, + version_number.minor, version_number.build); + + const base::string16 survey_url = GetUninstallSurveyUrl(); +#if DCHECK_IS_ON() + // The URL is expected to have a query part and not end with '&'. + const size_t pos = survey_url.find(L'?'); + DCHECK_NE(pos, base::string16::npos); + DCHECK_EQ(survey_url.find(L'?', pos + 1), base::string16::npos); + DCHECK_NE(survey_url.back(), L'&'); +#endif + auto url = base::StringPrintf(L"%ls&crversion=%ls&os=%ls", survey_url.c_str(), + base::ASCIIToUTF16(version.GetString()).c_str(), + os_version.c_str()); + + base::string16 uninstall_metrics; + if (ExtractUninstallMetricsFromFile(local_data_path, &uninstall_metrics)) { + DCHECK_EQ(uninstall_metrics.front(), L'&'); + DCHECK_NE(uninstall_metrics.back(), L'&'); + DCHECK_EQ(uninstall_metrics.find(L'?'), base::string16::npos); + // The user has opted into anonymous usage data collection, so append + // metrics and distribution data. + url += uninstall_metrics; + if (!distribution_data.empty()) { + url += L"&"; + url += distribution_data; + } + } + + if (os_info->version() < base::win::VERSION_WIN10 || + !NavigateToUrlWithEdge(url)) { + NavigateToUrlWithIExplore(url); + } +} + +} // namespace installer
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc index c4488398..e12e73e1b 100644 --- a/chrome/installer/setup/install_worker.cc +++ b/chrome/installer/setup/install_worker.cc
@@ -550,12 +550,9 @@ static_cast<DWORD>(1), true); - install_list->AddSetRegValueWorkItem(reg_root, - uninstall_reg, - KEY_WOW64_32KEY, - L"Publisher", - browser_dist->GetPublisherName(), - true); + install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, + KEY_WOW64_32KEY, L"Publisher", + InstallUtil::GetPublisherName(), true); install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, KEY_WOW64_32KEY,
diff --git a/chrome/installer/setup/setup_constants.cc b/chrome/installer/setup/setup_constants.cc index 4be3d16b..68c1c32 100644 --- a/chrome/installer/setup/setup_constants.cc +++ b/chrome/installer/setup/setup_constants.cc
@@ -19,6 +19,9 @@ const wchar_t kMediaPlayerRegPath[] = L"Software\\Microsoft\\MediaPlayer\\ShimInclusionList"; +// Local State preference names. +const char kUninstallMetricsName[] = "uninstall_metrics"; + const char kCourgette[] = "courgette"; const char kBsdiff[] = "bsdiff"; #if BUILDFLAG(ZUCCHINI)
diff --git a/chrome/installer/setup/setup_constants.h b/chrome/installer/setup/setup_constants.h index 4c7993f7..ac1ddcb 100644 --- a/chrome/installer/setup/setup_constants.h +++ b/chrome/installer/setup/setup_constants.h
@@ -21,6 +21,8 @@ extern const wchar_t kMediaPlayerRegPath[]; +extern const char kUninstallMetricsName[]; + // The range of error values among the installer, Courgette, BSDiff and // Zucchini overlap. These offset values disambiguate between different sets // of errors by shifting the values up with the specified offset.
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc index 90bd4967..a20887b 100644 --- a/chrome/installer/setup/setup_main.cc +++ b/chrome/installer/setup/setup_main.cc
@@ -49,6 +49,7 @@ #include "chrome/install_static/install_details.h" #include "chrome/install_static/install_util.h" #include "chrome/installer/setup/archive_patch_helper.h" +#include "chrome/installer/setup/brand_behaviors.h" #include "chrome/installer/setup/buildflags.h" #include "chrome/installer/setup/install.h" #include "chrome/installer/setup/install_worker.h" @@ -647,14 +648,12 @@ InstallerState* installer_state, base::FilePath* installer_directory) { DCHECK(installer_state); - const bool system_install = installer_state->system_install(); installer::InstallStatus install_status = installer::UNKNOWN_STATUS; installer::ArchiveType archive_type = installer::UNKNOWN_ARCHIVE_TYPE; installer_state->SetStage(installer::PRECONDITIONS); // Remove any legacy "-multifail" or "-stage:*" values from the product's // "ap" value. - BrowserDistribution::GetDistribution()->UpdateInstallStatus( - system_install, archive_type, install_status); + installer::UpdateInstallStatus(archive_type, install_status); // Drop to background processing mode if the process was started below the // normal process priority class. This is done here because InstallProducts- @@ -689,8 +688,7 @@ } } - installer_state->product().distribution()->UpdateInstallStatus( - system_install, archive_type, install_status); + UpdateInstallStatus(archive_type, install_status); return install_status; }
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc index 956edc31..3d5eae2 100644 --- a/chrome/installer/setup/uninstall.cc +++ b/chrome/installer/setup/uninstall.cc
@@ -33,6 +33,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_result_codes.h" #include "chrome/install_static/install_util.h" +#include "chrome/installer/setup/brand_behaviors.h" #include "chrome/installer/setup/install.h" #include "chrome/installer/setup/install_worker.h" #include "chrome/installer/setup/installer_state.h" @@ -883,7 +884,7 @@ // Note that we must retrieve the distribution-specific data before deleting // product.GetVersionKey(). - base::string16 distribution_data(browser_dist->GetDistributionData(reg_root)); + base::string16 distribution_data(GetDistributionData()); // Remove Control Panel uninstall link. // Assert that this is only called with the one relevant distribution. @@ -1020,8 +1021,8 @@ if (!force_uninstall && product_state) { VLOG(1) << "Uninstallation complete. Launching post-uninstall operations."; - browser_dist->DoPostUninstallOperations(product_state->version(), - backup_state_file, distribution_data); + DoPostUninstallOperations(product_state->version(), backup_state_file, + distribution_data); } // Try and delete the preserved local state once the post-install
diff --git a/chrome/installer/setup/uninstall_metrics.cc b/chrome/installer/setup/uninstall_metrics.cc new file mode 100644 index 0000000..72ae96b --- /dev/null +++ b/chrome/installer/setup/uninstall_metrics.cc
@@ -0,0 +1,87 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/setup/uninstall_metrics.h" + +#include <memory> +#include <string> + +#include "base/files/file_path.h" +#include "base/json/json_file_value_serializer.h" +#include "base/logging.h" +#include "base/strings/string_split.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "chrome/common/pref_names.h" +#include "chrome/installer/setup/setup_constants.h" +#include "components/metrics/metrics_pref_names.h" + +namespace installer { + +namespace { + +// Appends an URL query parameter to |metrics| for each item in +// |uninstall_metrics_dict|. Returns true if |metrics| was modified; otherwise, +// false. +bool BuildUninstallMetricsString(const base::Value& uninstall_metrics_dict, + base::string16* metrics) { + DCHECK(uninstall_metrics_dict.is_dict()); + DCHECK(metrics); + bool has_values = false; + + for (const auto& item : uninstall_metrics_dict.DictItems()) { + has_values = true; + metrics->push_back(L'&'); + metrics->append(base::UTF8ToWide(item.first)); + metrics->push_back(L'='); + + if (item.second.is_string()) + metrics->append(base::UTF8ToWide(item.second.GetString())); + else + NOTREACHED() << item.second.type(); + } + + return has_values; +} + +} // namespace + +bool ExtractUninstallMetrics(const base::Value& root, + base::string16* uninstall_metrics_string) { + DCHECK(root.is_dict()); + // Make sure that the user wants us reporting metrics. If not, don't add our + // uninstall metrics. + auto path = + base::SplitStringPiece(metrics::prefs::kMetricsReportingEnabled, ".", + base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + const auto* value = root.FindPathOfType(path, base::Value::Type::BOOLEAN); + if (!value || !value->GetBool()) + return false; + + value = root.FindKeyOfType(installer::kUninstallMetricsName, + base::Value::Type::DICTIONARY); + if (!value) + return false; + + return BuildUninstallMetricsString(*value, uninstall_metrics_string); +} + +bool ExtractUninstallMetricsFromFile(const base::FilePath& file_path, + base::string16* uninstall_metrics_string) { + JSONFileValueDeserializer json_deserializer(file_path); + + std::string json_error_string; + std::unique_ptr<base::Value> root = + json_deserializer.Deserialize(nullptr, nullptr); + if (!root) + return false; + + // Preferences should always have a dictionary root. + if (!root->is_dict()) + return false; + + return ExtractUninstallMetrics(*root, uninstall_metrics_string); +} + +} // namespace installer
diff --git a/chrome/installer/util/uninstall_metrics.h b/chrome/installer/setup/uninstall_metrics.h similarity index 77% rename from chrome/installer/util/uninstall_metrics.h rename to chrome/installer/setup/uninstall_metrics.h index 344c2f25..e372b91 100644 --- a/chrome/installer/util/uninstall_metrics.h +++ b/chrome/installer/setup/uninstall_metrics.h
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_INSTALLER_UTIL_UNINSTALL_METRICS_H_ -#define CHROME_INSTALLER_UTIL_UNINSTALL_METRICS_H_ +#ifndef CHROME_INSTALLER_SETUP_UNINSTALL_METRICS_H_ +#define CHROME_INSTALLER_SETUP_UNINSTALL_METRICS_H_ #include "base/strings/string16.h" namespace base { -class DictionaryValue; class FilePath; -} +class Value; +} // namespace base namespace installer { // Extracts uninstall metrics from the given JSON value. -bool ExtractUninstallMetrics(const base::DictionaryValue& root, +bool ExtractUninstallMetrics(const base::Value& root, base::string16* uninstall_metrics); // Extracts uninstall metrics from the JSON file located at file_path. @@ -28,4 +28,4 @@ } // namespace installer -#endif // CHROME_INSTALLER_UTIL_UNINSTALL_METRICS_H_ +#endif // CHROME_INSTALLER_SETUP_UNINSTALL_METRICS_H_
diff --git a/chrome/installer/util/uninstall_metrics_unittest.cc b/chrome/installer/setup/uninstall_metrics_unittest.cc similarity index 89% rename from chrome/installer/util/uninstall_metrics_unittest.cc rename to chrome/installer/setup/uninstall_metrics_unittest.cc index 53359f9..5f30f4de 100644 --- a/chrome/installer/util/uninstall_metrics_unittest.cc +++ b/chrome/installer/setup/uninstall_metrics_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/installer/util/uninstall_metrics.h" +#include "chrome/installer/setup/uninstall_metrics.h" #include <memory> #include <string> @@ -51,9 +51,7 @@ ASSERT_TRUE(root.get()); base::string16 uninstall_metrics_string; - EXPECT_TRUE( - ExtractUninstallMetrics(*static_cast<base::DictionaryValue*>(root.get()), - &uninstall_metrics_string)); + EXPECT_TRUE(ExtractUninstallMetrics(*root, &uninstall_metrics_string)); EXPECT_EQ(expected_url_string, uninstall_metrics_string); }
diff --git a/chrome/installer/util/BUILD.gn b/chrome/installer/util/BUILD.gn index 235c02d7..f46dc8a 100644 --- a/chrome/installer/util/BUILD.gn +++ b/chrome/installer/util/BUILD.gn
@@ -87,8 +87,6 @@ "self_cleaning_temp_dir.h", "shell_util.cc", "shell_util.h", - "uninstall_metrics.cc", - "uninstall_metrics.h", ] deps += [ @@ -104,8 +102,6 @@ "//courgette:courgette_lib", "//crypto", "//rlz/buildflags", - "//third_party/bspatch", - "//third_party/crashpad/crashpad/client", "//third_party/icu", "//third_party/lzma_sdk", ] @@ -316,7 +312,6 @@ "shell_util_unittest.cc", "test_app_registration_data.cc", "test_app_registration_data.h", - "uninstall_metrics_unittest.cc", "work_item_list_unittest.cc", "work_item_mocks.cc", "work_item_mocks.h", @@ -330,6 +325,7 @@ "//base:i18n", "//base/test:test_support", "//chrome:other_version", + "//chrome/common:constants", "//chrome/install_static:install_static_util", "//chrome/install_static/test:test_support", "//chrome/installer/setup:lib",
diff --git a/chrome/installer/util/DEPS b/chrome/installer/util/DEPS index 6a5d974..348d9521 100644 --- a/chrome/installer/util/DEPS +++ b/chrome/installer/util/DEPS
@@ -7,5 +7,4 @@ "+components/base32", "+components/metrics", - "+third_party/crashpad", ]
diff --git a/chrome/installer/util/browser_distribution.cc b/chrome/installer/util/browser_distribution.cc index cf9adadf..8d60b8e 100644 --- a/chrome/installer/util/browser_distribution.cc +++ b/chrome/installer/util/browser_distribution.cc
@@ -81,11 +81,6 @@ return app_reg_data_->GetVersionKey(); } -void BrowserDistribution::DoPostUninstallOperations( - const base::Version& version, const base::FilePath& local_data_path, - const base::string16& distribution_data) { -} - base::string16 BrowserDistribution::GetDisplayName() { return GetShortcutName(); } @@ -107,21 +102,8 @@ } } -base::string16 BrowserDistribution::GetPublisherName() { - return L"Chromium"; -} - base::string16 BrowserDistribution::GetLongAppDescription() { const base::string16& app_description = installer::GetLocalizedString(IDS_PRODUCT_DESCRIPTION_BASE); return app_description; } - -base::string16 BrowserDistribution::GetDistributionData(HKEY root_key) { - return L""; -} - -void BrowserDistribution::UpdateInstallStatus(bool system_install, - installer::ArchiveType archive_type, - installer::InstallStatus install_status) { -}
diff --git a/chrome/installer/util/browser_distribution.h b/chrome/installer/util/browser_distribution.h index 777cc010..51cf082b 100644 --- a/chrome/installer/util/browser_distribution.h +++ b/chrome/installer/util/browser_distribution.h
@@ -8,24 +8,13 @@ #define CHROME_INSTALLER_UTIL_BROWSER_DISTRIBUTION_H_ #include <memory> -#include <string> #include "base/macros.h" #include "base/strings/string16.h" -#include "build/build_config.h" #include "chrome/installer/util/util_constants.h" -#if defined(OS_WIN) -#include <windows.h> // NOLINT -#endif - class AppRegistrationData; -namespace base { -class FilePath; -class Version; -} - class BrowserDistribution { public: enum Subfolder { @@ -43,11 +32,6 @@ base::string16 GetStateMediumKey() const; base::string16 GetVersionKey() const; - virtual void DoPostUninstallOperations( - const base::Version& version, - const base::FilePath& local_data_path, - const base::string16& distribution_data); - // Returns the localized display name of this distribution. virtual base::string16 GetDisplayName(); @@ -60,18 +44,8 @@ virtual base::string16 GetStartMenuShortcutSubfolder( Subfolder subfolder_type); - virtual base::string16 GetPublisherName(); - virtual base::string16 GetLongAppDescription(); -#if defined(OS_WIN) - virtual base::string16 GetDistributionData(HKEY root_key); -#endif - - virtual void UpdateInstallStatus(bool system_install, - installer::ArchiveType archive_type, - installer::InstallStatus install_status); - protected: explicit BrowserDistribution( std::unique_ptr<AppRegistrationData> app_reg_data);
diff --git a/chrome/installer/util/google_chrome_distribution.cc b/chrome/installer/util/google_chrome_distribution.cc index 82adddd..588d447a 100644 --- a/chrome/installer/util/google_chrome_distribution.cc +++ b/chrome/installer/util/google_chrome_distribution.cc
@@ -7,207 +7,12 @@ #include "chrome/installer/util/google_chrome_distribution.h" -#include <windows.h> -#include <msi.h> -#include <shellapi.h> - #include <memory> -#include <utility> -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "base/win/registry.h" -#include "base/win/windows_version.h" -#include "base/win/wmi.h" -#include "chrome/common/chrome_paths_internal.h" #include "chrome/install_static/install_util.h" #include "chrome/installer/util/app_registration_data.h" -#include "chrome/installer/util/google_update_constants.h" -#include "chrome/installer/util/google_update_settings.h" -#include "chrome/installer/util/install_util.h" -#include "chrome/installer/util/installer_util_strings.h" -#include "chrome/installer/util/l10n_string_util.h" -#include "chrome/installer/util/uninstall_metrics.h" #include "chrome/installer/util/updating_app_registration_data.h" -#include "third_party/crashpad/crashpad/client/crash_report_database.h" -#include "third_party/crashpad/crashpad/client/settings.h" - -namespace { - -// Substitute the locale parameter in uninstall URL with whatever -// Google Update tells us is the locale. In case we fail to find -// the locale, we use US English. -base::string16 LocalizeUrl(const wchar_t* url) { - base::string16 language; - if (!GoogleUpdateSettings::GetLanguage(&language)) - language = L"en-US"; // Default to US English. - return base::ReplaceStringPlaceholders(url, language, NULL); -} - -base::string16 GetUninstallSurveyUrl() { - const wchar_t kSurveyUrl[] = L"https://support.google.com/chrome/" - L"contact/chromeuninstall3?hl=$1"; - return LocalizeUrl(kSurveyUrl); -} - -bool NavigateToUrlWithEdge(const base::string16& url) { - base::string16 protocol_url = L"microsoft-edge:" + url; - SHELLEXECUTEINFO info = { sizeof(info) }; - info.fMask = SEE_MASK_NOASYNC; - info.lpVerb = L"open"; - info.lpFile = protocol_url.c_str(); - info.nShow = SW_SHOWNORMAL; - if (::ShellExecuteEx(&info)) - return true; - PLOG(ERROR) << "Failed to launch Edge for uninstall survey"; - return false; -} - -void NavigateToUrlWithIExplore(const base::string16& url) { - base::FilePath iexplore; - if (!base::PathService::Get(base::DIR_PROGRAM_FILES, &iexplore)) - return; - - iexplore = iexplore.AppendASCII("Internet Explorer"); - iexplore = iexplore.AppendASCII("iexplore.exe"); - - base::string16 command = L"\"" + iexplore.value() + L"\" " + url; - - int pid = 0; - // The reason we use WMI to launch the process is because the uninstall - // process runs inside a Job object controlled by the shell. As long as there - // are processes running, the shell will not close the uninstall applet. WMI - // allows us to escape from the Job object so the applet will close. - base::win::WmiLaunchProcess(command, &pid); -} - -} // namespace GoogleChromeDistribution::GoogleChromeDistribution() : BrowserDistribution(std::make_unique<UpdatingAppRegistrationData>( install_static::GetAppGuid())) {} - -void GoogleChromeDistribution::DoPostUninstallOperations( - const base::Version& version, - const base::FilePath& local_data_path, - const base::string16& distribution_data) { - // Send the Chrome version and OS version as params to the form. - // It would be nice to send the locale, too, but I don't see an - // easy way to get that in the existing code. It's something we - // can add later, if needed. - // We depend on installed_version.GetString() not having spaces or other - // characters that need escaping: 0.2.13.4. Should that change, we will - // need to escape the string before using it in a URL. - const base::string16 kVersionParam = L"crversion"; - const base::string16 kOSParam = L"os"; - - const base::win::OSInfo* os_info = base::win::OSInfo::GetInstance(); - base::win::OSInfo::VersionNumber version_number = os_info->version_number(); - base::string16 os_version = - base::StringPrintf(L"%d.%d.%d", version_number.major, - version_number.minor, version_number.build); - - base::string16 url = GetUninstallSurveyUrl() + L"&" + kVersionParam + L"=" + - base::ASCIIToUTF16(version.GetString()) + L"&" + - kOSParam + L"=" + os_version; - - base::string16 uninstall_metrics; - if (installer::ExtractUninstallMetricsFromFile(local_data_path, - &uninstall_metrics)) { - // The user has opted into anonymous usage data collection, so append - // metrics and distribution data. - url += uninstall_metrics; - if (!distribution_data.empty()) { - url += L"&"; - url += distribution_data; - } - } - - if (os_info->version() >= base::win::VERSION_WIN10 && - NavigateToUrlWithEdge(url)) { - return; - } - NavigateToUrlWithIExplore(url); -} - -base::string16 GoogleChromeDistribution::GetPublisherName() { - const base::string16& publisher_name = - installer::GetLocalizedString(IDS_ABOUT_VERSION_COMPANY_NAME_BASE); - return publisher_name; -} - -base::string16 GoogleChromeDistribution::GetDistributionData(HKEY root_key) { - base::string16 sub_key(google_update::kRegPathClientState); - sub_key.append(L"\\"); - sub_key.append(install_static::GetAppGuid()); - - base::win::RegKey client_state_key( - root_key, sub_key.c_str(), KEY_READ | KEY_WOW64_32KEY); - base::string16 result; - base::string16 brand_value; - if (client_state_key.ReadValue(google_update::kRegRLZBrandField, - &brand_value) == ERROR_SUCCESS) { - result = google_update::kRegRLZBrandField; - result.append(L"="); - result.append(brand_value); - result.append(L"&"); - } - - base::string16 client_value; - if (client_state_key.ReadValue(google_update::kRegClientField, - &client_value) == ERROR_SUCCESS) { - result.append(google_update::kRegClientField); - result.append(L"="); - result.append(client_value); - result.append(L"&"); - } - - base::string16 ap_value; - // If we fail to read the ap key, send up "&ap=" anyway to indicate - // that this was probably a stable channel release. - client_state_key.ReadValue(google_update::kRegApField, &ap_value); - result.append(google_update::kRegApField); - result.append(L"="); - result.append(ap_value); - - // Crash client id. - // While it would be convenient to use the path service to get - // chrome::DIR_CRASH_DUMPS, that points to the dump location for the installer - // rather than for the browser. For per-user installs they are the same, yet - // for system-level installs the installer uses the system temp directory (see - // setup/installer_crash_reporting.cc's ConfigureCrashReporting). - // TODO(grt): use install_static::GetDefaultCrashDumpLocation (with an option - // to suppress creating the directory) once setup.exe uses - // install_static::InstallDetails. - base::FilePath crash_dir; - if (chrome::GetDefaultUserDataDirectory(&crash_dir)) { - crash_dir = crash_dir.Append(FILE_PATH_LITERAL("Crashpad")); - crashpad::UUID client_id; - std::unique_ptr<crashpad::CrashReportDatabase> database( - crashpad::CrashReportDatabase::InitializeWithoutCreating(crash_dir)); - if (database && database->GetSettings()->GetClientID(&client_id)) - result.append(L"&crash_client_id=").append(client_id.ToString16()); - } - - return result; -} - -// This method checks if we need to change "ap" key in Google Update to try -// full installer as fall back method in case incremental installer fails. -// - If incremental installer fails we append a magic string ("-full"), if -// it is not present already, so that Google Update server next time will send -// full installer to update Chrome on the local machine -// - If we are currently running full installer, we remove this magic -// string (if it is present) regardless of whether installer failed or not. -// There is no fall-back for full installer :) -void GoogleChromeDistribution::UpdateInstallStatus(bool system_install, - installer::ArchiveType archive_type, - installer::InstallStatus install_status) { - GoogleUpdateSettings::UpdateInstallStatus( - system_install, archive_type, - InstallUtil::GetInstallReturnCode(install_status), - install_static::GetAppGuid()); -}
diff --git a/chrome/installer/util/google_chrome_distribution.h b/chrome/installer/util/google_chrome_distribution.h index 4ba3cb4c..5274e4f 100644 --- a/chrome/installer/util/google_chrome_distribution.h +++ b/chrome/installer/util/google_chrome_distribution.h
@@ -11,33 +11,6 @@ #include "chrome/installer/util/browser_distribution.h" class GoogleChromeDistribution : public BrowserDistribution { - public: - // Opens the Google Chrome uninstall survey window. - // version refers to the version of Chrome being uninstalled. - // local_data_path is the path of the file containing json metrics that - // will be parsed. If this file indicates that the user has opted in to - // providing anonymous usage data, then some additional statistics will - // be added to the survey url. - // distribution_data contains Google Update related data that will be - // concatenated to the survey url if the file in local_data_path indicates - // the user has opted in to providing anonymous usage data. - void DoPostUninstallOperations( - const base::Version& version, - const base::FilePath& local_data_path, - const base::string16& distribution_data) override; - - base::string16 GetPublisherName() override; - - // This method reads data from the Google Update ClientState key for - // potential use in the uninstall survey. It must be called before the - // key returned by GetVersionKey() is deleted. - base::string16 GetDistributionData(HKEY root_key) override; - - void UpdateInstallStatus( - bool system_install, - installer::ArchiveType archive_type, - installer::InstallStatus install_status) override; - protected: // Disallow construction from others. GoogleChromeDistribution();
diff --git a/chrome/installer/util/install_util.cc b/chrome/installer/util/install_util.cc index 3de0ebd..8ca954a4 100644 --- a/chrome/installer/util/install_util.cc +++ b/chrome/installer/util/install_util.cc
@@ -693,6 +693,11 @@ return installer::GetLocalizedString(IDS_SHORTCUT_TOOLTIP_BASE); } +// static +base::string16 InstallUtil::GetPublisherName() { + return installer::GetLocalizedString(IDS_ABOUT_VERSION_COMPANY_NAME_BASE); +} + InstallUtil::ProgramCompare::ProgramCompare(const base::FilePath& path_to_match) : path_to_match_(path_to_match), file_info_() {
diff --git a/chrome/installer/util/install_util.h b/chrome/installer/util/install_util.h index dd55942..f98c6735 100644 --- a/chrome/installer/util/install_util.h +++ b/chrome/installer/util/install_util.h
@@ -196,6 +196,9 @@ // Returns the app description for shortcuts. static base::string16 GetAppDescription(); + // Returns the name of the browser's publisher. + static base::string16 GetPublisherName(); + // A predicate that compares the program portion of a command line with a // given file path. First, the file paths are compared directly. If they do // not match, the filesystem is consulted to determine if the paths reference
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc index 44a40ea..c53a0bc 100644 --- a/chrome/installer/util/shell_util.cc +++ b/chrome/installer/util/shell_util.cc
@@ -388,7 +388,7 @@ app_info.application_icon_path = chrome_exe; app_info.application_icon_index = chrome_icon_index; app_info.application_description = InstallUtil::GetAppDescription(); - app_info.publisher_name = dist->GetPublisherName(); + app_info.publisher_name = InstallUtil::GetPublisherName(); app_info.delegate_clsid = install_static::GetLegacyCommandExecuteImplClsid(); GetProgIdEntries(app_info, entries);
diff --git a/chrome/installer/util/uninstall_metrics.cc b/chrome/installer/util/uninstall_metrics.cc deleted file mode 100644 index 88fe63d..0000000 --- a/chrome/installer/util/uninstall_metrics.cc +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/installer/util/uninstall_metrics.h" - -#include <memory> -#include <string> - -#include "base/files/file_path.h" -#include "base/json/json_file_value_serializer.h" -#include "base/logging.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/common/pref_names.h" -#include "chrome/installer/util/util_constants.h" -#include "components/metrics/metrics_pref_names.h" - -namespace installer { - -namespace { - -// Given a DictionaryValue containing a set of uninstall metrics, -// this builds a URL parameter list of all the contained metrics. -// Returns true if at least one uninstall metric was found in -// uninstall_metrics_dict, false otherwise. -bool BuildUninstallMetricsString( - const base::DictionaryValue* uninstall_metrics_dict, - base::string16* metrics) { - DCHECK(NULL != metrics); - bool has_values = false; - - for (base::DictionaryValue::Iterator iter(*uninstall_metrics_dict); - !iter.IsAtEnd(); - iter.Advance()) { - has_values = true; - metrics->append(L"&"); - metrics->append(base::UTF8ToWide(iter.key())); - metrics->append(L"="); - - std::string value; - iter.value().GetAsString(&value); - metrics->append(base::UTF8ToWide(value)); - } - - return has_values; -} - -} // namespace - -bool ExtractUninstallMetrics(const base::DictionaryValue& root, - base::string16* uninstall_metrics_string) { - // Make sure that the user wants us reporting metrics. If not, don't - // add our uninstall metrics. - bool metrics_reporting_enabled = false; - if (!root.GetBoolean(metrics::prefs::kMetricsReportingEnabled, - &metrics_reporting_enabled) || - !metrics_reporting_enabled) { - return false; - } - - const base::DictionaryValue* uninstall_metrics_dict = NULL; - if (!root.HasKey(installer::kUninstallMetricsName) || - !root.GetDictionary(installer::kUninstallMetricsName, - &uninstall_metrics_dict)) { - return false; - } - - if (!BuildUninstallMetricsString(uninstall_metrics_dict, - uninstall_metrics_string)) { - return false; - } - - return true; -} - -bool ExtractUninstallMetricsFromFile(const base::FilePath& file_path, - base::string16* uninstall_metrics_string) { - JSONFileValueDeserializer json_deserializer(file_path); - - std::string json_error_string; - std::unique_ptr<base::Value> root = json_deserializer.Deserialize(NULL, NULL); - if (!root.get()) - return false; - - // Preferences should always have a dictionary root. - if (!root->is_dict()) - return false; - - return ExtractUninstallMetrics( - *static_cast<base::DictionaryValue*>(root.get()), - uninstall_metrics_string); -} - -} // namespace installer
diff --git a/chrome/installer/util/util_constants.cc b/chrome/installer/util/util_constants.cc index 4ed3469f..cfc24d8 100644 --- a/chrome/installer/util/util_constants.cc +++ b/chrome/installer/util/util_constants.cc
@@ -203,7 +203,6 @@ const wchar_t kUninstallStringField[] = L"UninstallString"; const wchar_t kUninstallArgumentsField[] = L"UninstallArguments"; const wchar_t kUninstallDisplayNameField[] = L"DisplayName"; -const char kUninstallMetricsName[] = "uninstall_metrics"; const wchar_t kUninstallInstallationDate[] = L"installation_date"; // Google Update installer result API.
diff --git a/chrome/installer/util/util_constants.h b/chrome/installer/util/util_constants.h index 2608a4e3..3c79b233 100644 --- a/chrome/installer/util/util_constants.h +++ b/chrome/installer/util/util_constants.h
@@ -216,7 +216,6 @@ extern const wchar_t kUninstallArgumentsField[]; extern const wchar_t kUninstallDisplayNameField[]; extern const wchar_t kUninstallInstallationDate[]; -extern const char kUninstallMetricsName[]; extern const wchar_t kUninstallStringField[]; // Google Update installer result API.
diff --git a/chrome/notification_helper/DEPS b/chrome/notification_helper/DEPS index ae61178..0eef3f0 100644 --- a/chrome/notification_helper/DEPS +++ b/chrome/notification_helper/DEPS
@@ -1,8 +1,4 @@ include_rules = [ - "+base", - "+chrome/common/chrome_constants.h", - "+chrome/common/chrome_switches.h", - "+chrome/common/chrome_version.h", "+chrome/install_static", "+chrome/installer/util", "+components/crash/content/app/crashpad.h",
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc index 8832d25..a892428 100644 --- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -456,6 +456,8 @@ edited_password_ascii); EXPECT_EQ(edited_password, first_password_element.Value().Utf16()); EXPECT_EQ(edited_password, second_password_element.Value().Utf16()); + EXPECT_TRUE(first_password_element.IsAutofilled()); + EXPECT_TRUE(second_password_element.IsAutofilled()); // Verify that password mirroring works correctly even when the password // is deleted. @@ -463,6 +465,8 @@ SimulateUserInputChangeForElement(&first_password_element, std::string()); EXPECT_EQ(base::string16(), first_password_element.Value().Utf16()); EXPECT_EQ(base::string16(), second_password_element.Value().Utf16()); + EXPECT_FALSE(first_password_element.IsAutofilled()); + EXPECT_FALSE(second_password_element.IsAutofilled()); // Should have notified the browser that the password is no longer generated // and trigger generation again.
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 55e05ba..8fe63da 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1427,24 +1427,6 @@ return std::make_unique<TtsDispatcher>(client); } -bool ChromeContentRendererClient::AllowPepperMediaStreamAPI( - const GURL& url) { -#if defined(OS_ANDROID) - return false; -#else - // Allow access for tests. - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnablePepperTesting)) { - return true; - } - - // Allow only the Hangouts app to use the MediaStream APIs. It's OK to check - // the whitelist in the renderer, since we're only preventing access until - // these APIs are public and stable. - return (AppCategorizer::IsHangoutsUrl(url)); -#endif // !defined(OS_ANDROID) -} - void ChromeContentRendererClient::AddSupportedKeySystems( std::vector<std::unique_ptr<::media::KeySystemProperties>>* key_systems) { key_systems_provider_.AddSupportedKeySystems(key_systems);
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index 9cd2609..aa14b589 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -185,7 +185,6 @@ std::unique_ptr<blink::WebContentSettingsClient> CreateWorkerContentSettingsClient( content::RenderFrame* render_frame) override; - bool AllowPepperMediaStreamAPI(const GURL& url) override; void AddSupportedKeySystems( std::vector<std::unique_ptr<::media::KeySystemProperties>>* key_systems) override;
diff --git a/chrome/renderer/chrome_content_renderer_client_unittest.cc b/chrome/renderer/chrome_content_renderer_client_unittest.cc index 87dd744..0c29683c 100644 --- a/chrome/renderer/chrome_content_renderer_client_unittest.cc +++ b/chrome/renderer/chrome_content_renderer_client_unittest.cc
@@ -67,9 +67,9 @@ const char kExtensionUrl[] = "chrome-extension://extension_id/background.html"; const char kChatManifestFS[] = "filesystem:https://talkgadget.google.com/foo"; -#endif const char kChatAppURL[] = "https://talkgadget.google.com/hangouts/foo"; +#endif void AddContentTypeHandler(content::WebPluginInfo* info, const char* mime_type, @@ -304,15 +304,6 @@ #endif // BUILDFLAG(ENABLE_NACL) } -TEST_F(ChromeContentRendererClientTest, AllowPepperMediaStreamAPI) { - ChromeContentRendererClient test; -#if defined(OS_ANDROID) - EXPECT_FALSE(test.AllowPepperMediaStreamAPI(GURL(kChatAppURL))); -#else - EXPECT_TRUE(test.AllowPepperMediaStreamAPI(GURL(kChatAppURL))); -#endif -} - // SearchBouncer doesn't exist on Android. #if !defined(OS_ANDROID) TEST_F(ChromeContentRendererClientTest, ShouldSuppressErrorPage) {
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc index 950acac..c6575bf 100644 --- a/chrome/renderer/chrome_render_frame_observer.cc +++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -501,12 +501,12 @@ content::ConvertMojoWindowFeaturesToWebWindowFeatures(*window_features)); } -#if defined(OS_ANDROID) void ChromeRenderFrameObserver::UpdateBrowserControlsState( content::BrowserControlsState constraints, content::BrowserControlsState current, bool animate) { +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) render_frame()->GetRenderView()->UpdateBrowserControlsState(constraints, current, animate); -} #endif +}
diff --git a/chrome/renderer/chrome_render_frame_observer.h b/chrome/renderer/chrome_render_frame_observer.h index fbeef58..19dc723 100644 --- a/chrome/renderer/chrome_render_frame_observer.h +++ b/chrome/renderer/chrome_render_frame_observer.h
@@ -83,11 +83,9 @@ void RequestReloadImageForContextNode() override; void SetClientSidePhishingDetection(bool enable_phishing_detection) override; void GetWebApplicationInfo(GetWebApplicationInfoCallback callback) override; -#if defined(OS_ANDROID) void UpdateBrowserControlsState(content::BrowserControlsState constraints, content::BrowserControlsState current, bool animate) override; -#endif void OnRenderFrameObserverRequest( chrome::mojom::ChromeRenderFrameAssociatedRequest request);
diff --git a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc index 7a4ce0b..6d40d99 100644 --- a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc +++ b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
@@ -297,7 +297,7 @@ IDR_MIRRORING_SESSION_PARAMETERS_JS); // These bindings are unnecessary with native bindings enabled. - if (!base::FeatureList::IsEnabled(extensions::features::kNativeCrxBindings)) { + if (!base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) { source_map->RegisterSource("app", IDR_APP_CUSTOM_BINDINGS_JS); source_map->RegisterSource("tabs", IDR_TABS_CUSTOM_BINDINGS_JS); @@ -333,8 +333,7 @@ void ChromeExtensionsDispatcherDelegate::InitializeBindingsSystem( extensions::Dispatcher* dispatcher, extensions::NativeExtensionBindingsSystem* bindings_system) { - DCHECK( - base::FeatureList::IsEnabled(extensions::features::kNativeCrxBindings)); + DCHECK(base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)); extensions::APIBindingsSystem* bindings = bindings_system->api_system(); bindings->GetHooksForAPI("app")->SetDelegate( std::make_unique<extensions::AppHooksDelegate>(
diff --git a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js index 7335879..f25023d6 100644 --- a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js +++ b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
@@ -222,6 +222,13 @@ }); }); + apiFunctions.setHandleRequest( + 'sharePathWithCrostiniContainer', function(entry, callback) { + const url = fileManagerPrivateNatives.GetEntryURL(entry); + fileManagerPrivateInternal.sharePathWithCrostiniContainer( + url, callback); + }); + apiFunctions.setHandleRequest('installLinuxPackage', function( entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry);
diff --git a/chrome/renderer/resources/extensions/media_router_bindings.js b/chrome/renderer/resources/extensions/media_router_bindings.js index e85a25d..f6c05b8 100644 --- a/chrome/renderer/resources/extensions/media_router_bindings.js +++ b/chrome/renderer/resources/extensions/media_router_bindings.js
@@ -1310,36 +1310,22 @@ * Posts a message to the route designated by |routeId|. * @param {!string} routeId * @param {!string} message - * @return {!Promise.<boolean>} Resolved with true if the message was sent, - * or false on failure. */ MediaRouteProvider.prototype.sendRouteMessage = function( routeId, message) { this.handlers_.onBeforeInvokeHandler(); - return this.handlers_.sendRouteMessage(routeId, message) - .then(function() { - return {'sent': true}; - }, function() { - return {'sent': false}; - }); + this.handlers_.sendRouteMessage(routeId, message); }; /** * Sends a binary message to the route designated by |routeId|. * @param {!string} routeId * @param {!Array<number>} data - * @return {!Promise.<boolean>} Resolved with true if the data was sent, - * or false on failure. */ MediaRouteProvider.prototype.sendRouteBinaryMessage = function( routeId, data) { this.handlers_.onBeforeInvokeHandler(); - return this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data)) - .then(function() { - return {'sent': true}; - }, function() { - return {'sent': false}; - }); + this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data)); }; /**
diff --git a/chrome/services/media_gallery_util/BUILD.gn b/chrome/services/media_gallery_util/BUILD.gn index 6de5b4b..2d2043d 100644 --- a/chrome/services/media_gallery_util/BUILD.gn +++ b/chrome/services/media_gallery_util/BUILD.gn
@@ -26,6 +26,13 @@ "//mojo/public/cpp/bindings", ] + if (is_android) { + sources += [ + "media_parser_android.cc", + "media_parser_android.h", + ] + } + public_deps = [ "//chrome/services/media_gallery_util/public/mojom", "//services/service_manager/public/cpp", @@ -39,6 +46,25 @@ } } +if (is_android) { + source_set("unit_tests") { + testonly = true + sources = [ + "media_parser_android_unittest.cc", + ] + + data = [ + "//media/test/data/bear.mp4", + "//media/test/data/sfx.mp3", + ] + + deps = [ + ":lib", + "//testing/gtest", + ] + } +} + service_manifest("manifest") { name = "media_gallery_util" source = "manifest.json"
diff --git a/chrome/services/media_gallery_util/media_parser_android.cc b/chrome/services/media_gallery_util/media_parser_android.cc new file mode 100644 index 0000000..c65308ff --- /dev/null +++ b/chrome/services/media_gallery_util/media_parser_android.cc
@@ -0,0 +1,55 @@ +// 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/services/media_gallery_util/media_parser_android.h" + +#include "base/task/post_task.h" +#include "base/task/task_traits.h" +#include "chrome/services/media_gallery_util/ipc_data_source.h" +#include "media/base/bind_to_current_loop.h" +#include "media/filters/android/video_frame_extractor.h" + +namespace { + +void OnThumbnailGenerated( + std::unique_ptr<media::VideoFrameExtractor> video_frame_extractor, + MediaParser::ExtractVideoFrameCallback extract_frame_cb, + bool success, + const std::vector<uint8_t>& data, + const media::VideoDecoderConfig& config) { + std::move(extract_frame_cb).Run(success, data, config); +} + +void ExtractVideoFrameOnMediaThread( + media::DataSource* data_source, + MediaParser::ExtractVideoFrameCallback extract_frame_callback) { + auto extractor = std::make_unique<media::VideoFrameExtractor>(data_source); + extractor->Start(base::BindOnce(&OnThumbnailGenerated, std::move(extractor), + std::move(extract_frame_callback))); +} + +} // namespace + +MediaParserAndroid::MediaParserAndroid( + std::unique_ptr<service_manager::ServiceContextRef> service_ref) + : MediaParser(std::move(service_ref)), + media_task_runner_( + base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})) {} + +MediaParserAndroid::~MediaParserAndroid() = default; + +void MediaParserAndroid::ExtractVideoFrame( + const std::string& mime_type, + uint32_t total_size, + chrome::mojom::MediaDataSourcePtr media_data_source, + MediaParser::ExtractVideoFrameCallback extract_frame_callback) { + data_source_ = std::make_unique<IPCDataSource>( + std::move(media_data_source), static_cast<int64_t>(total_size)); + + media_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &ExtractVideoFrameOnMediaThread, data_source_.get(), + media::BindToCurrentLoop(std::move(extract_frame_callback)))); +}
diff --git a/chrome/services/media_gallery_util/media_parser_android.h b/chrome/services/media_gallery_util/media_parser_android.h new file mode 100644 index 0000000..702fd40 --- /dev/null +++ b/chrome/services/media_gallery_util/media_parser_android.h
@@ -0,0 +1,39 @@ +// 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_SERVICES_MEDIA_GALLERY_UTIL_MEDIA_PARSER_ANDROID_H_ +#define CHROME_SERVICES_MEDIA_GALLERY_UTIL_MEDIA_PARSER_ANDROID_H_ + +#include <memory> + +#include "base/macros.h" +#include "chrome/services/media_gallery_util/media_parser.h" + +namespace media { +class DataSource; +} // namespace media + +// The media parser on Android that provides video thumbnail generation utility. +class MediaParserAndroid : public MediaParser { + public: + MediaParserAndroid( + std::unique_ptr<service_manager::ServiceContextRef> service_ref); + ~MediaParserAndroid() override; + + // MediaParser implementation. + void ExtractVideoFrame(const std::string& mime_type, + uint32_t total_size, + chrome::mojom::MediaDataSourcePtr media_data_source, + ExtractVideoFrameCallback callback) override; + + private: + // The task runner to do blocking IO. The utility thread cannot be blocked. + scoped_refptr<base::SequencedTaskRunner> media_task_runner_; + + std::unique_ptr<media::DataSource> data_source_; + + DISALLOW_COPY_AND_ASSIGN(MediaParserAndroid); +}; + +#endif // CHROME_SERVICES_MEDIA_GALLERY_UTIL_MEDIA_PARSER_ANDROID_H_
diff --git a/chrome/services/media_gallery_util/media_parser_android_unittest.cc b/chrome/services/media_gallery_util/media_parser_android_unittest.cc new file mode 100644 index 0000000..e6e783a5 --- /dev/null +++ b/chrome/services/media_gallery_util/media_parser_android_unittest.cc
@@ -0,0 +1,99 @@ +// 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/services/media_gallery_util/media_parser_android.h" + +#include <memory> +#include <vector> + +#include "base/bind_helpers.h" +#include "base/files/file_util.h" +#include "base/macros.h" +#include "base/run_loop.h" +#include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" +#include "chrome/services/media_gallery_util/public/mojom/media_parser.mojom.h" +#include "media/base/test_data_util.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "services/service_manager/public/cpp/service_context_ref.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +// Used in test that do blocking reads from a local file. +class TestMediaDataSource : public chrome::mojom::MediaDataSource { + public: + TestMediaDataSource(chrome::mojom::MediaDataSourcePtr* interface, + const base::FilePath& file_path) + : file_path_(file_path), binding_(this, mojo::MakeRequest(interface)) {} + + ~TestMediaDataSource() override {} + + private: + // chrome::mojom::MediaDataSource implementation. + void Read(int64_t position, + int64_t length, + chrome::mojom::MediaDataSource::ReadCallback callback) override { + base::File file(file_path_, base::File::Flags::FLAG_OPEN | + base::File::Flags::FLAG_READ); + auto buffer = std::vector<uint8_t>(length); + int bytes_read = file.Read(position, (char*)(buffer.data()), length); + if (bytes_read < length) + buffer.resize(bytes_read); + + std::move(callback).Run(std::vector<uint8_t>(std::move(buffer))); + } + + base::FilePath file_path_; + mojo::Binding<chrome::mojom::MediaDataSource> binding_; + + DISALLOW_COPY_AND_ASSIGN(TestMediaDataSource); +}; + +class MediaParserAndroidTest : public testing::Test { + public: + MediaParserAndroidTest() : ref_factory_(base::DoNothing()) {} + ~MediaParserAndroidTest() override = default; + + void SetUp() override { + parser_ = std::make_unique<MediaParserAndroid>(ref_factory_.CreateRef()); + } + + void TearDown() override { parser_.reset(); } + + protected: + MediaParserAndroid* parser() { return parser_.get(); } + + private: + std::unique_ptr<MediaParserAndroid> parser_; + + service_manager::ServiceContextRefFactory ref_factory_; + base::test::ScopedTaskEnvironment scoped_task_environment_; + + DISALLOW_COPY_AND_ASSIGN(MediaParserAndroidTest); +}; + +// Test to verify encoded video frame can be extracted. +TEST_F(MediaParserAndroidTest, VideoFrameExtraction) { + auto file_path = media::GetTestDataFilePath("bear.mp4"); + int64_t size = 0; + ASSERT_TRUE(base::GetFileSize(file_path, &size)); + + chrome::mojom::MediaDataSourcePtr data_source_ptr; + TestMediaDataSource test_data_source(&data_source_ptr, file_path); + + bool result = false; + base::RunLoop run_loop; + parser()->ExtractVideoFrame( + "video/mp4", size, std::move(data_source_ptr), + base::BindLambdaForTesting([&](bool success, const std::vector<uint8_t>&, + const media::VideoDecoderConfig&) { + result = success; + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_TRUE(result); +} + +} // namespace
diff --git a/chrome/services/media_gallery_util/media_parser_factory.cc b/chrome/services/media_gallery_util/media_parser_factory.cc index b7f7b76..276a137 100644 --- a/chrome/services/media_gallery_util/media_parser_factory.cc +++ b/chrome/services/media_gallery_util/media_parser_factory.cc
@@ -5,12 +5,17 @@ #include "chrome/services/media_gallery_util/media_parser_factory.h" #include "base/allocator/buildflags.h" +#include "build/build_config.h" #include "chrome/services/media_gallery_util/media_parser.h" #include "media/base/media.h" #include "media/media_buildflags.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/strong_binding.h" +#if defined(OS_ANDROID) +#include "chrome/services/media_gallery_util/media_parser_android.h" +#endif + MediaParserFactory::MediaParserFactory( std::unique_ptr<service_manager::ServiceContextRef> service_ref) : service_ref_(std::move(service_ref)) {} @@ -23,7 +28,13 @@ media::InitializeMediaLibraryInSandbox(libyuv_cpu_flags, libavutil_cpu_flags); chrome::mojom::MediaParserPtr media_parser_ptr; - mojo::MakeStrongBinding(std::make_unique<MediaParser>(service_ref_->Clone()), + std::unique_ptr<MediaParser> media_parser; +#if defined(OS_ANDROID) + media_parser = std::make_unique<MediaParserAndroid>(service_ref_->Clone()); +#else + media_parser = std::make_unique<MediaParser>(service_ref_->Clone()); +#endif + mojo::MakeStrongBinding(std::move(media_parser), mojo::MakeRequest(&media_parser_ptr)); std::move(callback).Run(std::move(media_parser_ptr));
diff --git a/chrome/services/media_gallery_util/public/mojom/BUILD.gn b/chrome/services/media_gallery_util/public/mojom/BUILD.gn index bfe58641..71c403e4 100644 --- a/chrome/services/media_gallery_util/public/mojom/BUILD.gn +++ b/chrome/services/media_gallery_util/public/mojom/BUILD.gn
@@ -11,6 +11,7 @@ ] public_deps = [ + "//media/mojo/interfaces", "//mojo/public/mojom/base", ] }
diff --git a/chrome/services/media_gallery_util/public/mojom/media_parser.mojom b/chrome/services/media_gallery_util/public/mojom/media_parser.mojom index e893c9b..97e40c43 100644 --- a/chrome/services/media_gallery_util/public/mojom/media_parser.mojom +++ b/chrome/services/media_gallery_util/public/mojom/media_parser.mojom
@@ -4,6 +4,7 @@ module chrome.mojom; +import "media/mojo/interfaces/media_types.mojom"; import "mojo/public/mojom/base/file.mojom"; import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/values.mojom"; @@ -21,6 +22,16 @@ MediaMetadata metadata, array<AttachedImage> attached_images); + // Extracts one video key frame from |media_data_source|. The frame is still + // in encoded format. + [EnableIf=is_android] + ExtractVideoFrame(string mime_type, + uint32 total_size, + MediaDataSource media_data_source) + => (bool success, + array<uint8> data, + media.mojom.VideoDecoderConfig config); + // Validates the passed media file with sanity checks, and file decoding // for at most |decode_time| wall clock time. Returns |success| true if // |file| appears to be a well-formed media file, false otherwise. @@ -63,7 +74,6 @@ // All data are parsed from user-defined media data. The consumer of this API should filter special // characters if needed. The encoding of strings may be UTF-8 that ffmpeg library assumes strings to // be UTF-8 but does not validate the encoding. -// TODO(xingliu): Sanitize strings and AttachedImage in utility and browser processes. struct MediaMetadata { string mime_type;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index ffec641..a056ae6 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -628,6 +628,7 @@ "../browser/media/webrtc/webrtc_browsertest_perf.h", "../browser/media/webrtc/webrtc_desktop_capture_browsertest.cc", "../browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc", + "../browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc", "../browser/media/webrtc/webrtc_getmediadevices_browsertest.cc", "../browser/media/webrtc/webrtc_internals_integration_browsertest.cc", "../browser/media/webrtc/webrtc_internals_perf_browsertest.cc", @@ -1801,6 +1802,7 @@ "../browser/ui/views/frame/browser_frame_ash_browsertest.cc", "../browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc", "../browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc", + "../browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc", "../browser/ui/webui/chromeos/keyboard_overlay_ui_browsertest.cc", "../browser/ui/webui/chromeos/system_web_dialog_browsertest.cc", "../browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc", @@ -2657,7 +2659,6 @@ "../browser/signin/signin_tracker_unittest.cc", "../browser/signin/test_signin_client_builder.cc", "../browser/signin/test_signin_client_builder.h", - "../browser/signin/unified_consent_helper_unittest.cc", "../browser/ssl/certificate_error_report_unittest.cc", "../browser/ssl/certificate_error_reporter_unittest.cc", "../browser/ssl/insecure_sensitive_input_driver_unittest.cc", @@ -2983,6 +2984,7 @@ "//base:base_java", "//chrome/android:app_hooks_java", "//chrome/android:chrome_java", + "//chrome/services/media_gallery_util:unit_tests", "//components/favicon/core/test:test_support", "//components/gcm_driver/instance_id/android:instance_id_driver_java", "//components/gcm_driver/instance_id/android:instance_id_driver_test_support_java",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn index 6c2253f..9b0773b 100644 --- a/chrome/test/android/BUILD.gn +++ b/chrome/test/android/BUILD.gn
@@ -28,11 +28,12 @@ "javatests/src/org/chromium/chrome/test/util/browser/contextmenu/ContextMenuUtils.java", "javatests/src/org/chromium/chrome/test/util/browser/Features.java", "javatests/src/org/chromium/chrome/test/util/browser/LocationSettingsTestUtil.java", + "javatests/src/org/chromium/chrome/test/util/browser/modelutil/FakeViewProvider.java", "javatests/src/org/chromium/chrome/test/util/browser/notifications/MockNotificationManagerProxy.java", + "javatests/src/org/chromium/chrome/test/util/browser/offlinepages/FakeOfflinePageBridge.java", "javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java", "javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java", "javatests/src/org/chromium/chrome/test/util/browser/suggestions/ContentSuggestionsTestUtils.java", - "javatests/src/org/chromium/chrome/test/util/browser/offlinepages/FakeOfflinePageBridge.java", "javatests/src/org/chromium/chrome/test/util/browser/suggestions/DummySuggestionsEventReporter.java", "javatests/src/org/chromium/chrome/test/util/browser/suggestions/FakeMostVisitedSites.java", "javatests/src/org/chromium/chrome/test/util/browser/suggestions/FakeSuggestionsSource.java",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/modelutil/FakeViewProvider.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/modelutil/FakeViewProvider.java new file mode 100644 index 0000000..6f37e32 --- /dev/null +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/modelutil/FakeViewProvider.java
@@ -0,0 +1,68 @@ +// 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.test.util.browser.modelutil; + +import static org.junit.Assert.assertTrue; + +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.base.Promise; +import org.chromium.ui.ViewProvider; + +/** + * Fake view provider for tests. + * @param <T> The view type. + */ +public class FakeViewProvider<T extends View> implements ViewProvider<T> { + private final Promise<T> mViewPromise; + private final Promise<T> mViewInflatedPromise = new Promise<>(); + private boolean mInflationStarted; + + /** + * Creates a new instance without a view. The view should be passed in to + * {@link #finishInflation} later to signal that inflation has finished. + */ + public FakeViewProvider() { + mViewPromise = new Promise<>(); + } + + /** + * Creates a new instance with a view. Inflation will finish without requiring a call to + * {@link #finishInflation}. + * @param view The view to be provided. + */ + public FakeViewProvider(T view) { + mViewPromise = Promise.fulfilled(view); + } + + public boolean inflationHasStarted() { + return mInflationStarted; + } + + /** + * Finishes inflation with the given view. This method should only be called on instances + * without a view, and after inflation has started. Clients that want to provide a view before + * inflation has started should use the {@link #FakeViewProvider(T)} constructor. + * @param view The view to be provided. + * @see #inflationHasStarted + */ + public void finishInflation(T view) { + assertTrue(mInflationStarted); + mViewPromise.fulfill(view); + } + + @Override + public void inflate() { + mInflationStarted = true; + mViewPromise.then(mViewInflatedPromise::fulfill); + } + + @Override + public void whenLoaded(Callback<T> callback) { + mViewInflatedPromise.then(callback); + } +}
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc index 752a7e78..25c9c2e 100644 --- a/chrome/test/base/test_browser_window.cc +++ b/chrome/test/base/test_browser_window.cc
@@ -35,6 +35,11 @@ return ui::PAGE_TRANSITION_LINK; } +base::TimeTicks TestBrowserWindow::TestLocationBar::GetMatchSelectionTimestamp() + const { + return base::TimeTicks(); +} + const OmniboxView* TestBrowserWindow::TestLocationBar::GetOmniboxView() const { return NULL; } @@ -67,6 +72,17 @@ return NULL; } +void TestBrowserWindow::SetTopControlsShownRatio( + content::WebContents* web_contents, + float ratio) {} + +int TestBrowserWindow::GetTopControlsHeight() const { + return 0; +} + +void TestBrowserWindow::SetTopControlsGestureScrollInProgress( + bool in_progress) {} + StatusBubble* TestBrowserWindow::GetStatusBubble() { return NULL; }
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index d911e38..45e8111 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h
@@ -51,6 +51,10 @@ bool IsAlwaysOnTop() const override; void SetAlwaysOnTop(bool always_on_top) override {} gfx::NativeWindow GetNativeWindow() const override; + void SetTopControlsShownRatio(content::WebContents* web_contents, + float ratio) override; + int GetTopControlsHeight() const override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; StatusBubble* GetStatusBubble() override; void UpdateTitleBar() override {} void BookmarkBarStateChanged( @@ -167,7 +171,9 @@ GURL GetDestinationURL() const override; WindowOpenDisposition GetWindowOpenDisposition() const override; ui::PageTransition GetPageTransition() const override; + base::TimeTicks GetMatchSelectionTimestamp() const override; void AcceptInput() override {} + void AcceptInput(base::TimeTicks match_selection_timestamp) override {} void FocusLocation(bool select_all) override {} void FocusSearch() override {} void UpdateContentSettingsIcons() override {}
diff --git a/chrome/test/base/ui_test_utils.cc b/chrome/test/base/ui_test_utils.cc index 2c8cb20..85883038 100644 --- a/chrome/test/base/ui_test_utils.cc +++ b/chrome/test/base/ui_test_utils.cc
@@ -369,11 +369,12 @@ } void SendToOmniboxAndSubmit(LocationBar* location_bar, - const std::string& input) { + const std::string& input, + base::TimeTicks match_selection_timestamp) { OmniboxView* omnibox = location_bar->GetOmniboxView(); omnibox->model()->OnSetFocus(false); omnibox->SetUserText(base::ASCIIToUTF16(input)); - location_bar->AcceptInput(); + location_bar->AcceptInput(match_selection_timestamp); while (!omnibox->model()->autocomplete_controller()->done()) { content::WindowedNotificationObserver observer( chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY,
diff --git a/chrome/test/base/ui_test_utils.h b/chrome/test/base/ui_test_utils.h index 157be4f..8f153b5 100644 --- a/chrome/test/base/ui_test_utils.h +++ b/chrome/test/base/ui_test_utils.h
@@ -146,8 +146,10 @@ void DownloadURL(Browser* browser, const GURL& download_url); // Send the given text to the omnibox and wait until it's updated. -void SendToOmniboxAndSubmit(LocationBar* location_bar, - const std::string& input); +void SendToOmniboxAndSubmit( + LocationBar* location_bar, + const std::string& input, + base::TimeTicks match_selection_timestamp = base::TimeTicks()); // Gets the first browser that is not in the specified set. Browser* GetBrowserNotInSet(const std::set<Browser*>& excluded_browsers);
diff --git a/chrome/test/chromedriver/OWNERS b/chrome/test/chromedriver/OWNERS index cf039e3..e270f93 100644 --- a/chrome/test/chromedriver/OWNERS +++ b/chrome/test/chromedriver/OWNERS
@@ -1,6 +1,5 @@ # primary reviewer johnchen@chromium.org -kereliuk@chromium.org crouleau@chromium.org # backup reviewer
diff --git a/chrome/test/chromedriver/test/test_expectations b/chrome/test/chromedriver/test/test_expectations index 8c0e554..90d5d31 100644 --- a/chrome/test/chromedriver/test/test_expectations +++ b/chrome/test/chromedriver/test/test_expectations
@@ -49,6 +49,11 @@ 'TypingTest.testChordControlCutAndPaste', # https://bugs.chromium.org/p/chromedriver/issues/detail?id=2532 'SlowLoadingPageTest.testRefreshShouldBlockUntilPageLoads', + # https://bugs.chromium.org/p/chromedriver/issues/detail?id=2572 + 'ChromeOptionsFunctionalTest.canAddExtensionFromFile', + 'ChromeOptionsFunctionalTest.canAddExtensionFromStringEncodedInBase64', + 'ChromeOptionsFunctionalTest.canSetAcceptInsecureCerts', + 'ChromeOptionsFunctionalTest.canStartChromeWithCustomOptions', ] _OS_NEGATIVE_FILTER = {}
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js index d4410941..015513d 100644 --- a/chrome/test/data/extensions/api_test/autotest_private/test.js +++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -151,6 +151,10 @@ }); }); }, + function setCrostiniEnabled() { + chrome.autotestPrivate.setCrostiniEnabled(true, chrome.test.callbackFail( + 'Crostini is not available for the current user')); + }, function runCrostiniInstaller() { chrome.autotestPrivate.runCrostiniInstaller(chrome.test.callbackFail( 'Crostini is not available for the current user'));
diff --git a/chrome/test/data/extensions/api_test/file_browser/crostini_test/manifest.json b/chrome/test/data/extensions/api_test/file_browser/crostini_test/manifest.json index 3427b7f8..88a5fc0c 100644 --- a/chrome/test/data/extensions/api_test/file_browser/crostini_test/manifest.json +++ b/chrome/test/data/extensions/api_test/file_browser/crostini_test/manifest.json
@@ -4,13 +4,16 @@ "name": "chrome.fileManagerPrivate tests", "version": "0.1", "manifest_version": 2, - "description": "Tests of chrome.fileManagerPrivate.[isCrostiniEnabled|mountCrostiniContainer]", + "description": "Tests of chrome.fileManagerPrivate.[isCrostiniEnabled|mountCrostiniContainer|sharePathWithCrostiniContainer]", "app": { "background": { "scripts": ["test.js"] } }, "permissions": [ - "fileManagerPrivate" + "fileManagerPrivate", + { + "fileSystem": ["requestFileSystem"] + } ] }
diff --git a/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js b/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js index bdbc3694..d2402ed 100644 --- a/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js +++ b/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js
@@ -2,6 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +/** + * Get specified entry. + * @param {string} volumeType volume type for entry. + * @param {string} path path of entry. + * @return {!Entry} specified entry. + */ +function getEntry(volumeType, path) { + return new Promise(resolve => { + chrome.fileManagerPrivate.getVolumeMetadataList(list => { + const volume = list.find(v => v.volumeType === volumeType); + chrome.fileSystem.requestFileSystem({volumeId: volume.volumeId}, fs => { + fs.root.getDirectory(path, {}, entry => { + resolve(entry); + }); + }); + }); + }); +} + // Run the tests. chrome.test.runTests([ function testIsCrostiniEnabled() { @@ -12,6 +31,20 @@ }, function testMountCrostiniContainer() { chrome.fileManagerPrivate.mountCrostiniContainer( - chrome.test.callbackPass(() => {})); - } + chrome.test.callbackPass()); + }, + function testSharePathWithCrostiniContainerSuccess() { + getEntry('downloads', 'share_dir').then((entry) => { + chrome.fileManagerPrivate.sharePathWithCrostiniContainer( + entry, chrome.test.callbackPass()); + }); + }, + function testSharePathWithCrostiniContainerNotDownloads() { + getEntry('testing', 'test_dir').then((entry) => { + chrome.fileManagerPrivate.sharePathWithCrostiniContainer( + entry, + chrome.test.callbackFail( + 'Share with Linux only allowed for directories within Downloads.')); + }); + }, ]);
diff --git a/chrome/test/data/extensions/api_test/tts_engine/register_engine/manifest.json b/chrome/test/data/extensions/api_test/tts_engine/register_engine/manifest.json index cf335c5..31c0f344 100644 --- a/chrome/test/data/extensions/api_test/tts_engine/register_engine/manifest.json +++ b/chrome/test/data/extensions/api_test/tts_engine/register_engine/manifest.json
@@ -18,6 +18,12 @@ "voice_name": "Pat", "lang": "en-US", "event_types": [ "end" ] + }, + { + "voice_name": "Cat", + "lang": "en-US", + "gender": "feline", + "event_types": [ "end" ] } ] },
diff --git a/chrome/test/data/extensions/api_test/tts_engine/register_engine/test.js b/chrome/test/data/extensions/api_test/tts_engine/register_engine/test.js index acf9ce4..a565ff72 100644 --- a/chrome/test/data/extensions/api_test/tts_engine/register_engine/test.js +++ b/chrome/test/data/extensions/api_test/tts_engine/register_engine/test.js
@@ -119,7 +119,6 @@ 'extension speech 3', { 'voiceName': 'Pat', - 'gender': 'male', 'enqueue': true, 'onEvent': function(event) { if (event.type == 'end') { @@ -148,17 +147,23 @@ chrome.ttsEngine.onStop.addListener(stopListener); chrome.tts.getVoices(function(voices) { - chrome.test.assertEq(3, voices.length); + chrome.test.assertEq(4, voices.length); chrome.test.assertEq('TestNativeVoice', voices[0].voiceName); chrome.test.assertEq('en-GB', voices[0].lang); chrome.test.assertEq('Alice', voices[1].voiceName); chrome.test.assertEq('en-US', voices[1].lang); - chrome.test.assertEq('female', voices[1].gender); chrome.test.assertEq('Pat', voices[2].voiceName); chrome.test.assertEq('en-US', voices[2].lang); + + chrome.test.assertEq('Cat', voices[3].voiceName); + + chrome.test.assertEq(voices[0].gender, undefined); + chrome.test.assertEq(voices[1].gender, undefined); + chrome.test.assertEq(voices[2].gender, undefined); + chrome.test.succeed(); }); }
diff --git a/chrome/test/data/extensions/api_test/tts_engine/update_voices_api/test.js b/chrome/test/data/extensions/api_test/tts_engine/update_voices_api/test.js index 7578253bd..1197346 100644 --- a/chrome/test/data/extensions/api_test/tts_engine/update_voices_api/test.js +++ b/chrome/test/data/extensions/api_test/tts_engine/update_voices_api/test.js
@@ -2,24 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var testVoiceData = [ - { - eventTypes: ['start'], - extensionId: 'pkplfbidichfdicaijlchgnapepdginl', - lang: 'zh-TW', - remote: false, - voiceName: 'David' - }, - { - eventTypes: ['end', 'interrupted', 'cancelled'], - extensionId: 'pkplfbidichfdicaijlchgnapepdginl', - gender: 'female', - lang: 'en-GB', - remote: false, - voiceName: 'Laura' - } -]; - function setup() { var speakListener = function(utterance, options, sendTtsEvent) {}; var stopListener = function() {}; @@ -29,6 +11,23 @@ chrome.test.runTests([ function testGetVoices() { + var testVoiceData = [ + { + eventTypes: ['start'], + extensionId: 'pkplfbidichfdicaijlchgnapepdginl', + lang: 'zh-TW', + remote: false, + voiceName: 'David' + }, + { + eventTypes: ['end', 'interrupted', 'cancelled'], + extensionId: 'pkplfbidichfdicaijlchgnapepdginl', + gender: 'female', + lang: 'en-GB', + remote: false, + voiceName: 'Laura' + } + ]; setup(); chrome.tts.getVoices(function(voices) { chrome.test.assertEq(1, voices.length); @@ -43,6 +42,8 @@ chrome.tts.getVoices(function(runtimeVoices) { chrome.test.assertEq(testVoiceData.length, runtimeVoices.length); for (var i = 0; i < runtimeVoices.length; i++) { + // The result should not have 'gender'. + delete testVoiceData[i]['gender']; chrome.test.assertEq(testVoiceData[i], runtimeVoices[i]); chrome.test.assertEq(runtimeVoices[i], testVoiceData[i]); }
diff --git a/chrome/test/data/extensions/manifest_tests/tts_engine_invalid_7.json b/chrome/test/data/extensions/manifest_tests/tts_engine_invalid_7.json deleted file mode 100644 index 009cc452..0000000 --- a/chrome/test/data/extensions/manifest_tests/tts_engine_invalid_7.json +++ /dev/null
@@ -1,12 +0,0 @@ -{ - "name": "test", - "manifest_version": 2, - "version": "1", - "tts_engine": { - "voices": [ - { - "gender": "alien" - } - ] - } -}
diff --git a/chrome/test/data/extensions/manifest_tests/tts_engine_valid.json b/chrome/test/data/extensions/manifest_tests/tts_engine_valid.json index fc8892f..4ef90bd 100644 --- a/chrome/test/data/extensions/manifest_tests/tts_engine_valid.json +++ b/chrome/test/data/extensions/manifest_tests/tts_engine_valid.json
@@ -6,10 +6,16 @@ "voices": [ { "voice_name": "name", - "lang": "en-US", - "gender": "female", + "lang": "en-US", + "gender": "female", "event_types": ["start", "end", "marker"], - "other_key": "other_value" + "other_key": "other_value" + }, + { + "voice_name": "name 2", + "lang": "en-US", + "event_types": ["start", "end", "marker"], + "other_key": "other_value" } ] }
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index c318341..ffbc002e 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3832,6 +3832,24 @@ ] }, + "CrostiniAllowed": { + "os": ["chromeos"], + "test_policy": { "CrostiniAllowed": false }, + "pref_mappings": [ + { "pref": "crostini.user_allowed_by_policy" } + ] + }, + + "DeviceUnaffiliatedCrostiniAllowed": { + "os": ["chromeos"], + "test_policy": { + "device_unaffiliated_crostini_allowed": false + }, + "pref_mappings": [ + { "pref": "cros.device.unaffiliated_crostini_allowed"} + ] + }, + "DeviceSamlLoginAuthenticationType": { },
diff --git a/chrome/test/data/top_controls_scroll/top_controls_scroll.html b/chrome/test/data/top_controls_scroll/top_controls_scroll.html new file mode 100644 index 0000000..282b883 --- /dev/null +++ b/chrome/test/data/top_controls_scroll/top_controls_scroll.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<head> +<meta name="viewport" content="width=device-width"> +<title>Browser Top Controls Scrolls</title> +<style> + div { + position: absolute; + width: 100%; + height: 20000px; + background: linear-gradient(cyan, cyan 50%, blue 50%, blue); + background-size: 100% 200px; + } +</style> +</head> + <body> + <h1>Browser Top Controls Scrolls Test Page</h1> + <p> + This page is used to test the browser top controls scroll behavior with page + scrolls in Tablet Mode. + </p> + <input id="editable-element" type="text"> + <div></div> + </body> +</html>
diff --git a/chrome/test/data/webrtc/peerconnection_getstats.js b/chrome/test/data/webrtc/peerconnection_getstats.js index ac43e9a..b7454ee 100644 --- a/chrome/test/data/webrtc/peerconnection_getstats.js +++ b/chrome/test/data/webrtc/peerconnection_getstats.js
@@ -21,6 +21,7 @@ associateStatsId: 'string', isRemote: 'boolean', mediaType: 'string', + kind: 'string', trackId: 'string', transportId: 'string', codecId: 'string',
diff --git a/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html new file mode 100644 index 0000000..c124a82 --- /dev/null +++ b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html
@@ -0,0 +1,56 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> + <title>WebRTC Automated Test</title> + <script type="text/javascript" src="test_functions.js"></script> + <script type="text/javascript" src="video_detector.js"></script> + <script type="text/javascript" src="indexeddb.js"></script> + <script> + 'use strict'; + var settings; + + function handleSuccess(stream) { + var video = document.querySelector('video'); + settings = stream.getVideoTracks()[0].getSettings(); + video.srcObject = stream; + video.play(); + returnToTest("getdisplaymedia-success"); + } + + function handleError(error) { + console.log('getUserMedia error: ' + error.name, error); + returnToTest("getdisplaymedia-failure"); + } + + function runGetDisplayMedia(constraints) { + navigator.getDisplayMedia(constraints). + then(handleSuccess).catch(handleError); + } + + function getDisplaySurfaceSetting() { + returnToTest(settings.displaySurface); + } + + function getLogicalSurfaceSetting() { + returnToTest(settings.logicalSurface ? "true" : "false"); + } + + function getCursorSetting() { + returnToTest(settings.cursor); + } + </script> +</head> +<body> + <table border="0"> + <tr> + <td>getdisplayMedia() output</td> + </tr> + <tr> + <td> + <video id="local-view" autoplay="autoplay"></video> + </td> + </tr> + </table> +</body> +</html> +
diff --git a/chrome/test/data/webui/md_history/history_item_test.js b/chrome/test/data/webui/md_history/history_item_test.js index 6b5e8ab4..d5c322a2 100644 --- a/chrome/test/data/webui/md_history/history_item_test.js +++ b/chrome/test/data/webui/md_history/history_item_test.js
@@ -77,6 +77,7 @@ test('basic separator insertion', function() { element.addNewResults(TEST_HISTORY_RESULTS); return PolymerTest.flushTasks().then(function() { + Polymer.dom.flush(); // Check that the correct number of time gaps are inserted. const items = Polymer.dom(element.root).querySelectorAll('history-item'); @@ -94,6 +95,7 @@ element.searchedTerm = 'search'; return PolymerTest.flushTasks().then(function() { + Polymer.dom.flush(); const items = Polymer.dom(element.root).querySelectorAll('history-item'); assertTrue(items[0].hasTimeGap); @@ -105,6 +107,7 @@ test('separator insertion after deletion', function() { element.addNewResults(TEST_HISTORY_RESULTS); return PolymerTest.flushTasks().then(function() { + Polymer.dom.flush(); const items = Polymer.dom(element.root).querySelectorAll('history-item'); element.removeItemsByIndex_([3]);
diff --git a/chrome/test/data/webui/print_preview/base_settings_section_test.js b/chrome/test/data/webui/print_preview/base_settings_section_test.js new file mode 100644 index 0000000..90029e7 --- /dev/null +++ b/chrome/test/data/webui/print_preview/base_settings_section_test.js
@@ -0,0 +1,42 @@ +// 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. + +cr.define('base_settings_section_test', function() { + /** @enum {string} */ + const TestNames = { + ManagedShowsEnterpriseIcon: 'managed shows enterprise icon', + }; + + const suiteName = 'BaseSettingsSectionTest'; + suite(suiteName, function() { + let settingsSection = null; + + /** @override */ + setup(function() { + PolymerTest.clearBody(); + settingsSection = + document.createElement('print-preview-settings-section'); + document.body.appendChild(settingsSection); + }); + + // Test that key events that would result in invalid values are blocked. + test(assert(TestNames.ManagedShowsEnterpriseIcon), function() { + const icon = settingsSection.$$('img'); + + // Default initial state is that the section is not managed, so the icon + // is hidden. + assertTrue(icon.hidden); + assertFalse(settingsSection.managed); + + // Simulate setting the section to managed and verify icon appears. + settingsSection.managed = true; + assertFalse(icon.hidden); + }); + }); + + return { + suiteName: suiteName, + TestNames: TestNames, + }; +});
diff --git a/chrome/test/data/webui/print_preview/header_test.js b/chrome/test/data/webui/print_preview/header_test.js index 4eaaaf8..bdd65db 100644 --- a/chrome/test/data/webui/print_preview/header_test.js +++ b/chrome/test/data/webui/print_preview/header_test.js
@@ -10,6 +10,7 @@ HeaderWithCopies: 'header with copies', HeaderWithNup: 'header with nup', HeaderChangesForState: 'header changes for state', + ButtonOrder: 'button order', }; const suiteName = 'HeaderTest'; @@ -139,6 +140,27 @@ assertEquals(testError, summary.textContent); assertTrue(printButton.disabled); }); + + // Tests that the buttons are in the correct order for different platforms. + // See https://crbug.com/880562. + test(assert(TestNames.ButtonOrder), function() { + // Verify that there are only 2 buttons. + assertEquals(2, header.shadowRoot.querySelectorAll('button').length); + + const firstButton = header.$$('button:first-child'); + const lastButton = header.$$('button:last-child'); + const printButton = header.$$('button.print'); + const cancelButton = header.$$('button.cancel'); + + if (cr.isWindows || cr.isChromeOS) { + // On Windows and Chrome OS, the print button is on the left. + assertEquals(firstButton, printButton); + assertEquals(lastButton, cancelButton); + } else { + assertEquals(firstButton, cancelButton); + assertEquals(lastButton, printButton); + } + }); }); return {
diff --git a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js index 376c7607..6fafe6d 100644 --- a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js +++ b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
@@ -154,6 +154,18 @@ this.runMochaTest(settings_sections_tests.TestNames.PresetDuplex); }); +TEST_F('PrintPreviewSettingsSectionsTest', 'ColorManaged', function() { + this.runMochaTest(settings_sections_tests.TestNames.ColorManaged); +}); + +TEST_F( + 'PrintPreviewSettingsSectionsTest', 'DisableMarginsByPagesPerSheet', + function() { + loadTimeData.overrideValues({pagesPerSheetEnabled: true}); + this.runMochaTest( + settings_sections_tests.TestNames.DisableMarginsByPagesPerSheet); + }); + PrintPreviewPolicyTest = class extends NewPrintPreviewTest { /** @override */ get browsePreload() { @@ -194,14 +206,6 @@ this.runMochaTest(policy_tests.TestNames.DisableHeaderFooterByPolicy); }); -TEST_F( - 'PrintPreviewSettingsSectionsTest', 'DisableMarginsByPagesPerSheet', - function() { - loadTimeData.overrideValues({pagesPerSheetEnabled: true}); - this.runMochaTest( - settings_sections_tests.TestNames.DisableMarginsByPagesPerSheet); - }); - PrintPreviewSettingsSelectTest = class extends NewPrintPreviewTest { /** @override */ get browsePreload() { @@ -250,6 +254,32 @@ this.runMochaTest(select_behavior_test.TestNames.CallProcessSelectChange); }); +PrintPreviewBaseSettingsSectionTest = class extends NewPrintPreviewTest { + /** @override */ + get browsePreload() { + return 'chrome://print/new/settings_section.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'base_settings_section_test.js', + ]); + } + + /** @override */ + get suiteName() { + return base_settings_section_test.suiteName; + } +}; + +TEST_F( + 'PrintPreviewBaseSettingsSectionTest', 'ManagedShowsEnterpriseIcon', + function() { + this.runMochaTest( + base_settings_section_test.TestNames.ManagedShowsEnterpriseIcon); + }); + PrintPreviewNumberSettingsSectionTest = class extends NewPrintPreviewTest { /** @override */ get browsePreload() { @@ -888,6 +918,10 @@ this.runMochaTest(header_test.TestNames.HeaderChangesForState); }); +TEST_F('PrintPreviewHeaderTest', 'ButtonOrder', function() { + this.runMochaTest(header_test.TestNames.ButtonOrder); +}); + PrintPreviewDestinationItemTest = class extends NewPrintPreviewTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/print_preview/settings_section_test.js b/chrome/test/data/webui/print_preview/settings_section_test.js index 5143c07..5ede3fd 100644 --- a/chrome/test/data/webui/print_preview/settings_section_test.js +++ b/chrome/test/data/webui/print_preview/settings_section_test.js
@@ -28,6 +28,7 @@ PresetCopies: 'preset copies', PresetDuplex: 'preset duplex', DisableMarginsByPagesPerSheet: 'disable margins by pages per sheet', + ColorManaged: 'color selection disabled by policy', }; const suiteName = 'SettingsSectionsTests'; @@ -247,12 +248,16 @@ print_preview_test_utils.getCddTemplate('FooPrinter').capabilities; capabilities.printer.color = capabilityAndValue.colorCap; page.set('destination_.capabilities', capabilities); + const selectElement = colorElement.$$('select'); assertFalse(colorElement.hidden); assertEquals( capabilityAndValue.expectedValue ? 'color' : 'bw', - colorElement.$$('select').value); + selectElement.value); assertEquals( capabilityAndValue.expectedValue, page.getSettingValue('color')); + // Check that setting is not marked as managed. + assertFalse(colorElement.$$('print-preview-settings-section').managed); + assertFalse(selectElement.disabled); }); }); @@ -993,6 +998,66 @@ assertTrue(page.settings.duplex.value); assertTrue(checkbox.checked); }); + + test(assert(TestNames.ColorManaged), function() { + const colorElement = page.$$('print-preview-color-settings'); + assertFalse(colorElement.hidden); + + // Remove color capability. + let capabilities = + print_preview_test_utils.getCddTemplate('FooPrinter').capabilities; + delete capabilities.printer.color; + + [{ + // Policy has no effect. + colorCap: {option: [{type: 'STANDARD_COLOR', is_default: true}]}, + colorPolicy: print_preview.ColorMode.COLOR, + expectedValue: true, + expectedHidden: true, + }, + { + // Policy contradicts actual capabilities and should be ignored. + colorCap: {option: [{type: 'STANDARD_COLOR', is_default: true}]}, + colorPolicy: print_preview.ColorMode.GRAY, + expectedValue: true, + expectedHidden: true, + }, + { + // Policy overrides default. + colorCap: { + option: [ + {type: 'STANDARD_MONOCHROME', is_default: true}, + {type: 'STANDARD_COLOR'} + ] + }, + colorPolicy: print_preview.ColorMode.COLOR, + expectedValue: true, + expectedHidden: false, + expectedManaged: true, + }].forEach(subtestParams => { + capabilities = + print_preview_test_utils.getCddTemplate('FooPrinter').capabilities; + capabilities.printer.color = subtestParams.colorCap; + const policies = {allowedColorModes: subtestParams.colorPolicy}; + // In practice |capabilities| are always set after |policies| and + // observers only check for |capabilities|, so the order is important. + page.set('destination_.policies', policies); + page.set('destination_.capabilities', capabilities); + assertEquals( + subtestParams.expectedValue, page.getSettingValue('color')); + assertEquals(subtestParams.expectedHidden, colorElement.hidden); + if (!subtestParams.expectedHidden) { + const selectElement = colorElement.$$('select'); + assertEquals( + subtestParams.expectedValue ? 'color' : 'bw', + selectElement.value); + assertEquals( + subtestParams.expectedManaged, + colorElement.$$('print-preview-settings-section').managed); + assertEquals(subtestParams.expectedManaged, selectElement.disabled); + } + }); + }); }); return {
diff --git a/chrome/test/data/webui/settings/multidevice_page_container_tests.js b/chrome/test/data/webui/settings/multidevice_page_container_tests.js index 8569838..705885f 100644 --- a/chrome/test/data/webui/settings/multidevice_page_container_tests.js +++ b/chrome/test/data/webui/settings/multidevice_page_container_tests.js
@@ -27,7 +27,6 @@ let multidevicePageContainer = null; let browserProxy = null; let ALL_MODES; - let HOST_SET_MODES; /** * @param {!settings.MultiDeviceSettingsMode} mode @@ -37,7 +36,13 @@ function getFakePageContentData(mode, isSuiteSupported) { return { mode: mode, - hostDeviceName: HOST_SET_MODES.includes(mode) ? 'Pixel XL' : undefined, + hostDeviceName: [ + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION, + settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, + ].includes(mode) ? + 'Pixel XL' : + undefined, betterTogetherState: isSuiteSupported ? settings.MultiDeviceFeatureState.ENABLED_BY_USER : settings.MultiDeviceFeatureState.NOT_SUPPORTED_BY_CHROMEBOOK, @@ -57,11 +62,6 @@ suiteSetup(function() { ALL_MODES = Object.values(settings.MultiDeviceSettingsMode); - HOST_SET_MODES = [ - settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, - settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION, - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, - ]; }); /** @return {?HTMLElement} */ @@ -93,100 +93,33 @@ .then(Polymer.dom.flush()); } - test('WebUIListener toggles multidevice page based on mode', function() { - return setInitialPageContent( - settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS, - /* isSuiteSupported */ true) - .then(() => { - // Check that the settings-page is visible iff the mode is not - // NO_ELIGIBLE_HOSTS. - for (let mode of ALL_MODES) { - changePageContent(mode, /* isSuiteSupported */ true); - assertEquals( - !getMultidevicePage(), - mode === settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS); - } - // One more loop to ensure we transition in and out of - // NO_ELIGIBLE_HOSTS mode. - for (let mode of ALL_MODES) { - changePageContent(mode, /* isSuiteSupported */ true); - assertEquals( - !getMultidevicePage(), - mode === settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS); - } - }); - }); - test( - 'WebUIListener toggles multidevice page based suite support', function() { + 'WebUIListener toggles multidevice page based suite support in all modes', + function() { return setInitialPageContent( settings.MultiDeviceSettingsMode.NO_HOST_SET, /* isSuiteSupported */ true) .then(() => { - // Check that the settings-page is visible iff the suite is - // supported. - assertTrue(!!getMultidevicePage()); - changePageContent( - settings.MultiDeviceSettingsMode.NO_HOST_SET, - /* isSuiteSupported */ false); - assertFalse(!!getMultidevicePage()); - changePageContent( - settings.MultiDeviceSettingsMode.NO_HOST_SET, - /* isSuiteSupported */ true); - assertTrue(!!getMultidevicePage()); + for (const mode of ALL_MODES) { + // Check that the settings-page is visible iff the suite is + // supported. + changePageContent(mode, /* isSuiteSupported */ true); + assertTrue(!!getMultidevicePage()); + + changePageContent(mode, /* isSuiteSupported */ false); + assertFalse(!!getMultidevicePage()); + + changePageContent(mode, /* isSuiteSupported */ true); + assertTrue(!!getMultidevicePage()); + } }); }); - test('multidevice-page is not attached if no host is found', function() { - return setInitialPageContent( - settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS, - /* isSuiteSupported */ true) - .then(() => assertFalse(!!getMultidevicePage())); - }); - - test('multidevice-page is attached if a potential host is found', function() { - return setInitialPageContent( - settings.MultiDeviceSettingsMode.NO_HOST_SET, - /* isSuiteSupported */ true) - .then(() => assertTrue(!!getMultidevicePage())); - }); - test( 'multidevice-page is not attached if suite is not supported', function() { return setInitialPageContent( settings.MultiDeviceSettingsMode.NO_HOST_SET, - /* isSuiteSupported */ true) - .then(() => { - for (let mode of ALL_MODES) { - changePageContent(mode, /* isSuiteSupported */ false); - assertFalse(!!getMultidevicePage()); - } - }); - }); - - test('multidevice-page is attached if a set host is found', function() { - return setInitialPageContent( - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, - /* isSuiteSupported */ true) - .then(() => assertTrue(!!getMultidevicePage())); - }); - - test( - 'pageContentData property passes to multidevice page if present', - function() { - return setInitialPageContent( - settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS, - /* isSuiteSupported */ true) - .then(() => { - for (let mode of ALL_MODES) { - changePageContent(mode, /* isSuiteSupported */ true); - if (mode === settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS) - assertEquals(getMultidevicePage(), null); - else - assertDeepEquals( - multidevicePageContainer.pageContentData, - getMultidevicePage().pageContentData); - } - }); + /* isSuiteSupported */ false) + .then(() => assertFalse(!!getMultidevicePage())); }); });
diff --git a/chrome/test/data/webui/settings/multidevice_page_tests.js b/chrome/test/data/webui/settings/multidevice_page_tests.js index 4ebeabb..7629a71 100644 --- a/chrome/test/data/webui/settings/multidevice_page_tests.js +++ b/chrome/test/data/webui/settings/multidevice_page_tests.js
@@ -24,23 +24,32 @@ suite('Multidevice', function() { let multidevicePage = null; let browserProxy = null; - let HOST_SET_MODES; + let ALL_MODES; const HOST_DEVICE = 'Pixel XL'; + /** + * Sets pageContentData to the specified mode. If it is a mode corresponding + * to a set host, it will set the hostDeviceName to the provided name or else + * default to HOST_DEVICE. + * @param {settings.MultiDeviceSettingsMode} newMode + * @param {string|undefined} newHostDeviceName Overrides default if there + * newMode corresponds to a set host. + */ function setPageContentData(newMode, newHostDeviceName) { - multidevicePage.pageContentData = { - mode: newMode, - hostDeviceName: newHostDeviceName, - }; + let newPageContentData = {mode: newMode}; + if ([ + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, + settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION, + settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, + ].includes(newMode)) { + newPageContentData.hostDeviceName = newHostDeviceName || HOST_DEVICE; + } + multidevicePage.pageContentData = newPageContentData; Polymer.dom.flush(); } suiteSetup(function() { - HOST_SET_MODES = [ - settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_SERVER, - settings.MultiDeviceSettingsMode.HOST_SET_WAITING_FOR_VERIFICATION, - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, - ]; + ALL_MODES = Object.values(settings.MultiDeviceSettingsMode); }); setup(function() { @@ -64,7 +73,7 @@ const getSubpage = () => multidevicePage.$$('settings-multidevice-subpage'); test('clicking setup shows multidevice setup dialog', function() { - setPageContentData(settings.MultiDeviceSettingsMode.NO_HOST_SET, undefined); + setPageContentData(settings.MultiDeviceSettingsMode.NO_HOST_SET); const button = multidevicePage.$$('paper-button'); assertTrue(!!button); button.click(); @@ -72,17 +81,14 @@ }); test('headings render based on mode and host', function() { - for (let mode of HOST_SET_MODES) { - setPageContentData(mode, HOST_DEVICE); - assertEquals(getLabel(), HOST_DEVICE); + for (const mode of ALL_MODES) { + setPageContentData(mode); + assertEquals(multidevicePage.isHostSet(), getLabel() === HOST_DEVICE); } - setPageContentData(settings.MultiDeviceSettingsMode.NO_HOST_SET, undefined); - assertNotEquals(getLabel(), HOST_DEVICE); }); - test('changing host device and fixing mode changes header', function() { - setPageContentData( - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, HOST_DEVICE); + test('changing host device changes header', function() { + setPageContentData(settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED); assertEquals(getLabel(), HOST_DEVICE); const anotherHost = 'Super Duper ' + HOST_DEVICE; setPageContentData( @@ -91,21 +97,18 @@ }); test('item is actionable if and only if a host is set', function() { - setPageContentData(settings.MultiDeviceSettingsMode.NO_HOST_SET, undefined); - assertFalse( - multidevicePage.$$('#multidevice-item').hasAttribute('actionable')); - for (let mode of HOST_SET_MODES) { - setPageContentData(mode, HOST_DEVICE); - assertTrue( - multidevicePage.$$('#multidevice-item').hasAttribute('actionable')); + for (const mode of ALL_MODES) { + setPageContentData(mode); + assertEquals( + multidevicePage.isHostSet(), + !!multidevicePage.$$('#multidevice-item').hasAttribute('actionable')); } }); test( 'clicking item with verified host opens subpage with features', function() { - setPageContentData( - settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED, HOST_DEVICE); + setPageContentData(settings.MultiDeviceSettingsMode.HOST_SET_VERIFIED); assertFalse(!!getSubpage()); multidevicePage.$$('#multidevice-item').click(); assertTrue(!!getSubpage());
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js index 749436f..fa496728 100644 --- a/chrome/test/data/webui/settings/people_page_sync_page_test.js +++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -530,6 +530,11 @@ prefs.encryptAllData = true; openDatatypeConfigurationWithUnifiedConsent(prefs); + const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle'); + // The unified consent toggle is disabled when the data types are + // encrypted. + assertTrue(unifiedConsentToggle.disabled); + assertTrue(prefs.userEventsSynced); // History. historyToggle = syncPage.$$('#historyToggle'); @@ -547,6 +552,11 @@ const prefs = getSyncAllPrefs(); openDatatypeConfigurationWithUnifiedConsent(prefs); + const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle'); + // The unified consent toggle is enabled when the data types are not + // encrypted. + assertFalse(unifiedConsentToggle.disabled); + assertTrue(prefs.userEventsSynced); // Check history toggle. historyToggle = syncPage.$$('#historyToggle');
diff --git a/chrome/test/data/webui/settings/sync_account_control_test.js b/chrome/test/data/webui/settings/sync_account_control_test.js index 198069f..43675de 100644 --- a/chrome/test/data/webui/settings/sync_account_control_test.js +++ b/chrome/test/data/webui/settings/sync_account_control_test.js
@@ -202,6 +202,7 @@ signedInUsername: 'bar@bar.com', statusAction: settings.StatusAction.NO_ACTION, hasError: false, + hasUnrecoverableError: false, disabled: false, }; sync_test_util.simulateStoredAccounts([ @@ -243,6 +244,7 @@ signedIn: true, signedInUsername: 'bar@bar.com', hasError: true, + hasUnrecoverableError: false, statusAction: settings.StatusAction.CONFIRM_SYNC_SETTINGS, disabled: false, }; @@ -259,6 +261,7 @@ signedIn: true, signedInUsername: 'bar@bar.com', hasError: true, + hasUnrecoverableError: false, statusAction: settings.StatusAction.REAUTHENTICATE, disabled: false, }; @@ -277,6 +280,7 @@ signedInUsername: 'bar@bar.com', statusAction: settings.StatusAction.NO_ACTION, hasError: false, + hasUnrecoverableError: false, disabled: true, }; @@ -287,6 +291,22 @@ assertFalse(displayedText.includes('barName')); assertFalse(displayedText.includes('fooName')); assertTrue(displayedText.includes('Sync disabled')); + + testElement.syncStatus = { + signedIn: true, + signedInUsername: 'bar@bar.com', + statusAction: settings.StatusAction.REAUTHENTICATE, + hasError: false, + hasUnrecoverableError: true, + disabled: false, + }; + assertTrue(testElement.$$('#sync-icon-container') + .classList.contains('sync-problem')); + assertTrue(!!testElement.$$('[icon=\'settings:sync-problem\']')); + displayedText = userInfo.querySelector('span:not([hidden])').textContent; + assertFalse(displayedText.includes('barName')); + assertFalse(displayedText.includes('fooName')); + assertTrue(displayedText.includes('Sync isn\'t working')); }); test('embedded in another page', function() { @@ -300,6 +320,7 @@ signedInUsername: 'bar@bar.com', statusAction: settings.StatusAction.NO_ACTION, hasError: false, + hasUnrecoverableError: false, disabled: false, }; @@ -311,11 +332,36 @@ signedIn: true, signedInUsername: 'bar@bar.com', hasError: true, + hasUnrecoverableError: false, statusAction: settings.StatusAction.REAUTHENTICATE, disabled: false, }; assertVisible(testElement.$$('#turn-off'), false); assertVisible(testElement.$$('#sync-paused-button'), true); + + testElement.embeddedInSubpage = true; + testElement.syncStatus = { + signedIn: true, + signedInUsername: 'bar@bar.com', + hasError: true, + hasUnrecoverableError: true, + statusAction: settings.StatusAction.REAUTHENTICATE, + disabled: false, + }; + assertVisible(testElement.$$('#turn-off'), false); + assertVisible(testElement.$$('#sync-paused-button'), true); + + testElement.embeddedInSubpage = true; + testElement.syncStatus = { + signedIn: true, + signedInUsername: 'bar@bar.com', + hasError: true, + hasUnrecoverableError: true, + statusAction: settings.StatusAction.NO_ACTION, + disabled: false, + }; + assertVisible(testElement.$$('#turn-off'), false); + assertVisible(testElement.$$('#sync-paused-button'), false); }); }); });
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 4ae80bd..04d375fd9 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -298,30 +298,33 @@ TEST_PPAPI_NACL(ImageData) // TCPSocket and TCPSocketPrivate tests. -#define RUN_TCPSOCKET_SUBTESTS \ - RunTestViaHTTP( \ - LIST_TEST(TCPSocket_Connect) \ - LIST_TEST(TCPSocket_ReadWrite) \ - LIST_TEST(TCPSocket_SetOption) \ - LIST_TEST(TCPSocket_Listen) \ - LIST_TEST(TCPSocket_Backlog) \ - LIST_TEST(TCPSocket_Interface_1_0) \ - ) +#define PPAPI_SOCKET_TEST(_test) \ + IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, _test) { \ + RunTestViaHTTP(LIST_TEST(_test)); \ + } \ + IN_PROC_BROWSER_TEST_F(PPAPINaClNewlibTest, MAYBE_PPAPI_NACL(_test)) { \ + RunTestViaHTTP(LIST_TEST(_test)); \ + } \ + IN_PROC_BROWSER_TEST_F(PPAPINaClGLibcTest, MAYBE_GLIBC(_test)) { \ + RunTestViaHTTP(LIST_TEST(_test)); \ + } \ + IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClTest, MAYBE_PPAPI_PNACL(_test)) { \ + RunTestViaHTTP(LIST_TEST(_test)); \ + } \ + IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClNonSfiTest, \ + MAYBE_PNACL_NONSFI(_test)) { \ + RunTestViaHTTP(LIST_TEST(_test)); \ + } -IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, TCPSocket) { - RUN_TCPSOCKET_SUBTESTS; -} -IN_PROC_BROWSER_TEST_F(PPAPINaClNewlibTest, MAYBE_PPAPI_NACL(TCPSocket)) { - RUN_TCPSOCKET_SUBTESTS; -} -IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClTest, MAYBE_PPAPI_PNACL(TCPSocket)) { - RUN_TCPSOCKET_SUBTESTS; -} -IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClNonSfiTest, - MAYBE_PNACL_NONSFI(TCPSocket)) { - RUN_TCPSOCKET_SUBTESTS; -} - +// Split tests into multiple tests, making it easier to isolate which tests are +// failing, and reducing chance of timeout. +PPAPI_SOCKET_TEST(TCPSocket_Connect); +PPAPI_SOCKET_TEST(TCPSocket_ReadWrite); +PPAPI_SOCKET_TEST(TCPSocket_SetOption); +PPAPI_SOCKET_TEST(TCPSocket_Listen); +PPAPI_SOCKET_TEST(TCPSocket_Backlog); +PPAPI_SOCKET_TEST(TCPSocket_Interface_1_0); +PPAPI_SOCKET_TEST(TCPSocket_UnexpectedCalls); TEST_PPAPI_OUT_OF_PROCESS_VIA_HTTP(TCPServerSocketPrivate) TEST_PPAPI_NACL(TCPServerSocketPrivate) @@ -349,34 +352,15 @@ // UDPSocket tests. -#define UDPSOCKET_TEST(_test) \ - IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, _test) { \ - RunTestViaHTTP(LIST_TEST(_test)); \ - } \ - IN_PROC_BROWSER_TEST_F(PPAPINaClNewlibTest, MAYBE_PPAPI_NACL(_test)) { \ - RunTestViaHTTP(LIST_TEST(_test)); \ - } \ - IN_PROC_BROWSER_TEST_F(PPAPINaClGLibcTest, MAYBE_GLIBC(_test)) { \ - RunTestViaHTTP(LIST_TEST(_test)); \ - } \ - IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClTest, MAYBE_PPAPI_PNACL(_test)) { \ - RunTestViaHTTP(LIST_TEST(_test)); \ - } \ - IN_PROC_BROWSER_TEST_F(PPAPINaClPNaClNonSfiTest, \ - MAYBE_PNACL_NONSFI(_test)) { \ - RunTestViaHTTP(LIST_TEST(_test)); \ - } - -// Instead of one single test for all UDPSocket features (like it is done for -// TCPSocket), split them into multiple, making it easier to isolate which tests -// are failing. -UDPSOCKET_TEST(UDPSocket_ReadWrite) -UDPSOCKET_TEST(UDPSocket_SetOption) -UDPSOCKET_TEST(UDPSocket_SetOption_1_0) -UDPSOCKET_TEST(UDPSocket_SetOption_1_1) -UDPSOCKET_TEST(UDPSocket_Broadcast) -UDPSOCKET_TEST(UDPSocket_ParallelSend) -UDPSOCKET_TEST(UDPSocket_Multicast) +// Split tests into multiple tests, making it easier to isolate which tests are +// failing. +PPAPI_SOCKET_TEST(UDPSocket_ReadWrite) +PPAPI_SOCKET_TEST(UDPSocket_SetOption) +PPAPI_SOCKET_TEST(UDPSocket_SetOption_1_0) +PPAPI_SOCKET_TEST(UDPSocket_SetOption_1_1) +PPAPI_SOCKET_TEST(UDPSocket_Broadcast) +PPAPI_SOCKET_TEST(UDPSocket_ParallelSend) +PPAPI_SOCKET_TEST(UDPSocket_Multicast) // UDPSocketPrivate tests. TEST_PPAPI_OUT_OF_PROCESS_VIA_HTTP(UDPSocketPrivate_Connect) @@ -1481,14 +1465,6 @@ TEST_PPAPI_NACL(VideoEncoder) -// VideoDestination doesn't work in content_browsertests. -TEST_PPAPI_OUT_OF_PROCESS(VideoDestination) -TEST_PPAPI_NACL(VideoDestination) - -// VideoSource doesn't work in content_browsertests. -TEST_PPAPI_OUT_OF_PROCESS(VideoSource) -TEST_PPAPI_NACL(VideoSource) - // Printing doesn't work in content_browsertests. TEST_PPAPI_OUT_OF_PROCESS(Printing)
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastAudioManager.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastAudioManager.java index 9a4b50ac..42763b3 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastAudioManager.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastAudioManager.java
@@ -7,21 +7,21 @@ import android.content.Context; import android.media.AudioManager; import android.os.Build; +import android.support.annotation.Nullable; import org.chromium.base.Log; import org.chromium.base.VisibleForTesting; import org.chromium.chromecast.base.Controller; import org.chromium.chromecast.base.Observable; -import org.chromium.chromecast.base.Unit; /** * Wrapper for Cast code to use a single AudioManager instance. - * Muting and unmuting streams must be invoke on the same AudioManager instance. + * + * Encapsulates behavior that differs across SDK levels like muting and audio focus, and manages a + * singleton instance that ensures that all clients are using the same AudioManager. */ public class CastAudioManager { private static final String TAG = "CastAudioManager"; - // TODO(sanfin): This class should encapsulate SDK-dependent implementation details of - // android.media.AudioManager. private static CastAudioManager sInstance = null; public static CastAudioManager getAudioManager(Context context) { @@ -32,50 +32,55 @@ return sInstance; } - private final AudioManager mAudioManager; + private final AudioManager mInternal; @VisibleForTesting CastAudioManager(AudioManager audioManager) { - mAudioManager = audioManager; + mInternal = audioManager; } /** * Requests audio focus whenever the given Observable is activated. * - * Returns an Observable that is activated whenever the audio focus is granted. + * The audio focus request is abandoned when the given Observable is deactivated. * - * TODO(sanfin): Distinguish between transient, ducking, and full audio focus losses. + * Returns an Observable that is activated whenever the audio focus is lost. The activation data + * of this Observable indicates the type of audio focus loss. + * + * The resulting Observable will be activated with AudioFocus.NORMAL when the focus request is + * abandoned. + * + * Observable<AudioFocusLoss> focusLoss = castAudioManager.requestFocusWhen(focusRequest); + * // Get an Observable of when focus is taken: + * Observable<Unit> gotFocus = Observable.not(focusLoss); + * // Get an Observable of when a specific request got focus: + * Observable<Both<CastAudioFocusRequest, AudioFocusLoss>> requestLost = + * focusRequest.andThen(focusLoss); + * + * The given Observable<CastAudioFocusRequest> should deactivate before it is garbage-collected, + * or else the Observable and anything it references will leak. */ - public Observable<Unit> requestAudioFocusWhen( - Observable<?> event, CastAudioFocusRequest castAudioFocusRequest) { - Controller<Unit> audioFocusState = new Controller<>(); - event.subscribe(x -> { - AudioManager.OnAudioFocusChangeListener listener = (int focusChange) -> { - switch (focusChange) { - case AudioManager.AUDIOFOCUS_GAIN: - audioFocusState.set(Unit.unit()); - return; - default: - audioFocusState.reset(); - return; - } - }; - castAudioFocusRequest.setAudioFocusChangeListener(listener); + public Observable<AudioFocusLoss> requestAudioFocusWhen( + Observable<CastAudioFocusRequest> event) { + Controller<AudioFocusLoss> audioFocusLossState = new Controller<>(); + audioFocusLossState.set(AudioFocusLoss.NORMAL); + event.subscribe(focusRequest -> { + focusRequest.setAudioFocusChangeListener((int focusChange) -> { + audioFocusLossState.set(AudioFocusLoss.from(focusChange)); + }); // Request audio focus when the source event is activated. - if (requestAudioFocus(castAudioFocusRequest) - != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - Log.e(TAG, "Failed to get audio focus"); + if (focusRequest.request(mInternal) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + audioFocusLossState.reset(); } // Abandon audio focus when the source event is deactivated. return () -> { - if (abandonAudioFocus(castAudioFocusRequest) - != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + if (focusRequest.abandon(mInternal) != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { Log.e(TAG, "Failed to abandon audio focus"); } - audioFocusState.reset(); + audioFocusLossState.set(AudioFocusLoss.NORMAL); }; }); - return audioFocusState; + return audioFocusLossState; } // Only called on Lollipop and below, in an Activity's onPause() event. @@ -93,35 +98,50 @@ try { // isStreamMute() was only made public in M, but it can be accessed through // reflection in L. - isMuted = (Boolean) mAudioManager.getClass() + isMuted = (Boolean) mInternal.getClass() .getMethod("isStreamMute", int.class) - .invoke(mAudioManager, streamType); + .invoke(mInternal, streamType); } catch (Exception e) { Log.e(TAG, "Can not call AudioManager.isStreamMute().", e); } if (isMuted) { // Note: this is a no-op on fixed-volume devices. - mAudioManager.setStreamMute(streamType, false); + mInternal.setStreamMute(streamType, false); } } } - public int requestAudioFocus(CastAudioFocusRequest castAudioFocusRequest) { - return castAudioFocusRequest.request(mAudioManager); - } - - public int abandonAudioFocus(CastAudioFocusRequest castAudioFocusRequest) { - return castAudioFocusRequest.abandon(mAudioManager); - } - public int getStreamMaxVolume(int streamType) { - return mAudioManager.getStreamMaxVolume(streamType); + return mInternal.getStreamMaxVolume(streamType); } // TODO(sanfin): Do not expose this. All needed AudioManager methods can be adapted with // CastAudioManager. public AudioManager getInternal() { - return mAudioManager; + return mInternal; + } + + /** + * Disambiguates different audio focus loss types that can activate the result of + * requestAudioFocusWhen(). + */ + public enum AudioFocusLoss { + NORMAL, + TRANSIENT, + TRANSIENT_CAN_DUCK; + + private static @Nullable AudioFocusLoss from(int focusChange) { + switch (focusChange) { + case AudioManager.AUDIOFOCUS_LOSS: + return NORMAL; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + return TRANSIENT; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + return TRANSIENT_CAN_DUCK; + default: + return null; + } + } } }
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastAudioManagerTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastAudioManagerTest.java index 89f9bc43..9f934f5 100644 --- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastAudioManagerTest.java +++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastAudioManagerTest.java
@@ -4,10 +4,7 @@ package org.chromium.chromecast.shell; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.emptyIterable; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import android.media.AudioAttributes; @@ -24,169 +21,168 @@ import org.chromium.chromecast.base.Controller; import org.chromium.chromecast.base.Observable; -import org.chromium.chromecast.base.Unit; +import org.chromium.chromecast.base.ReactiveRecorder; import org.chromium.testing.local.LocalRobolectricTestRunner; -import java.util.ArrayList; -import java.util.List; - /** * Tests for CastAudioManager. */ @RunWith(LocalRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class CastAudioManagerTest { - @Test - @Config(sdk = Build.VERSION_CODES.N_MR1) - public void testAudioFocusScopeActivatedWhenRequestGranted() { - CastAudioManager audioManager = - CastAudioManager.getAudioManager(RuntimeEnvironment.application); - ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); - Controller<Unit> requestAudioFocusState = new Controller<>(); - List<String> result = new ArrayList<>(); - - AudioAttributes audioAttributes = - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build(); - CastAudioFocusRequest castAudioFocusRequest = - new CastAudioFocusRequest.Builder() - .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(audioAttributes) - .build(); - Observable<Unit> gotAudioFocusState = - audioManager.requestAudioFocusWhen(requestAudioFocusState, castAudioFocusRequest); - gotAudioFocusState.subscribe(x -> { - result.add("Got audio focus"); - return () -> result.add("Lost audio focus"); - }); - requestAudioFocusState.set(Unit.unit()); - shadowAudioManager.getLastAudioFocusRequest().listener.onAudioFocusChange( - AudioManager.AUDIOFOCUS_GAIN); - assertThat(result, contains("Got audio focus")); + // An example request that can be provided to requestAudioFocus(). + private static CastAudioFocusRequest buildFocusRequest() { + return new CastAudioFocusRequest.Builder() + .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) + .setAudioAttributes(new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build()) + .build(); } @Test @Config(sdk = Build.VERSION_CODES.N_MR1) - public void testAudioFocusScopeDeactivatedWhenFocusRequestStateIsReset() { + public void testAudioFocusScopeDeactivatesWhenRequestGranted() { CastAudioManager audioManager = CastAudioManager.getAudioManager(RuntimeEnvironment.application); ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); - Controller<Unit> requestAudioFocusState = new Controller<>(); - List<String> result = new ArrayList<>(); - AudioAttributes audioAttributes = - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build(); - CastAudioFocusRequest castAudioFocusRequest = - new CastAudioFocusRequest.Builder() - .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(audioAttributes) - .build(); - Observable<Unit> gotAudioFocusState = - audioManager.requestAudioFocusWhen(requestAudioFocusState, castAudioFocusRequest); - gotAudioFocusState.subscribe(x -> { - result.add("Got audio focus"); - return () -> result.add("Lost audio focus"); - }); - requestAudioFocusState.set(Unit.unit()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); + requestAudioFocusState.set(buildFocusRequest()); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.NORMAL).end(); + } + + @Test + @Config(sdk = Build.VERSION_CODES.N_MR1) + public void testAudioFocusLostWhenFocusRequestStateIsReset() { + CastAudioManager audioManager = + CastAudioManager.getAudioManager(RuntimeEnvironment.application); + ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); + requestAudioFocusState.set(buildFocusRequest()); shadowAudioManager.getLastAudioFocusRequest().listener.onAudioFocusChange( AudioManager.AUDIOFOCUS_GAIN); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.NORMAL).end(); requestAudioFocusState.reset(); - assertThat(result, contains("Got audio focus", "Lost audio focus")); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); } @Test @Config(sdk = Build.VERSION_CODES.N_MR1) - public void testAudioFocusScopeDeactivatedWhenAudioFocusIsLostButRequestStillActive() { + public void testAudioFocusScopeActivatedWhenAudioFocusIsLostButRequestStillActive() { CastAudioManager audioManager = CastAudioManager.getAudioManager(RuntimeEnvironment.application); ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); - Controller<Unit> requestAudioFocusState = new Controller<>(); - List<String> result = new ArrayList<>(); - AudioAttributes audioAttributes = - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build(); - CastAudioFocusRequest castAudioFocusRequest = - new CastAudioFocusRequest.Builder() - .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(audioAttributes) - .build(); - Observable<Unit> gotAudioFocusState = - audioManager.requestAudioFocusWhen(requestAudioFocusState, castAudioFocusRequest); - gotAudioFocusState.subscribe(x -> { - result.add("Got audio focus"); - return () -> result.add("Lost audio focus"); - }); - requestAudioFocusState.set(Unit.unit()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); + requestAudioFocusState.set(buildFocusRequest()); AudioManager.OnAudioFocusChangeListener listener = shadowAudioManager.getLastAudioFocusRequest().listener; listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.NORMAL).end(); listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS); - assertThat(result, contains("Got audio focus", "Lost audio focus")); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); } @Test @Config(sdk = Build.VERSION_CODES.N_MR1) - public void testAudioFocusScopeReactivatedWhenAudioFocusIsLostAndRegained() { + public void testAudioFocusScopeWhenAudioFocusIsLostAndRegained() { CastAudioManager audioManager = CastAudioManager.getAudioManager(RuntimeEnvironment.application); ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); - Controller<Unit> requestAudioFocusState = new Controller<>(); - List<String> result = new ArrayList<>(); - AudioAttributes audioAttributes = - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build(); - CastAudioFocusRequest castAudioFocusRequest = - new CastAudioFocusRequest.Builder() - .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(audioAttributes) - .build(); - Observable<Unit> gotAudioFocusState = - audioManager.requestAudioFocusWhen(requestAudioFocusState, castAudioFocusRequest); - gotAudioFocusState.subscribe(x -> { - result.add("Got audio focus"); - return () -> result.add("Lost audio focus"); - }); - requestAudioFocusState.set(Unit.unit()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); + requestAudioFocusState.set(buildFocusRequest()); AudioManager.OnAudioFocusChangeListener listener = shadowAudioManager.getLastAudioFocusRequest().listener; listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.NORMAL).end(); listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); - assertThat(result, contains("Got audio focus", "Lost audio focus", "Got audio focus")); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.NORMAL).end(); } @Test - public void testAudioFocusScopeNotActivatedIfRequestScopeNotActivated() { + public void testAudioFocusNotGainedIfRequestNotActivated() { CastAudioManager audioManager = CastAudioManager.getAudioManager(RuntimeEnvironment.application); ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); - Controller<Unit> requestAudioFocusState = new Controller<>(); - List<String> result = new ArrayList<>(); - AudioAttributes audioAttributes = - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build(); - CastAudioFocusRequest castAudioFocusRequest = - new CastAudioFocusRequest.Builder() - .setFocusGain(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(audioAttributes) - .build(); - Observable<Unit> gotAudioFocusState = - audioManager.requestAudioFocusWhen(requestAudioFocusState, castAudioFocusRequest); - gotAudioFocusState.subscribe(x -> { - result.add("Got audio focus"); - return () -> result.add("Lost audio focus"); - }); - assertThat(result, emptyIterable()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.NORMAL).end(); + } + + @Test + @Config(sdk = Build.VERSION_CODES.N_MR1) + public void testNoAudioFocusLossIfRequestGrantedImmediately() { + CastAudioManager audioManager = + CastAudioManager.getAudioManager(RuntimeEnvironment.application); + ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + requestAudioFocusState.set(buildFocusRequest()); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + lostAudioFocusRecorder.verify().end(); + } + + @Test + @Config(sdk = Build.VERSION_CODES.N_MR1) + public void testTransientAudioFocusLoss() { + CastAudioManager audioManager = + CastAudioManager.getAudioManager(RuntimeEnvironment.application); + ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + requestAudioFocusState.set(buildFocusRequest()); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + AudioManager.OnAudioFocusChangeListener listener = + shadowAudioManager.getLastAudioFocusRequest().listener; + listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); + lostAudioFocusRecorder.verify().opened(CastAudioManager.AudioFocusLoss.TRANSIENT).end(); + listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + lostAudioFocusRecorder.verify().closed(CastAudioManager.AudioFocusLoss.TRANSIENT).end(); + } + + @Test + @Config(sdk = Build.VERSION_CODES.N_MR1) + public void testTransientCanDuckAudioFocusLoss() { + CastAudioManager audioManager = + CastAudioManager.getAudioManager(RuntimeEnvironment.application); + ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager.getInternal()); + Controller<CastAudioFocusRequest> requestAudioFocusState = new Controller<>(); + requestAudioFocusState.set(buildFocusRequest()); + Observable<CastAudioManager.AudioFocusLoss> lostAudioFocusState = + audioManager.requestAudioFocusWhen(requestAudioFocusState); + ReactiveRecorder lostAudioFocusRecorder = ReactiveRecorder.record(lostAudioFocusState); + AudioManager.OnAudioFocusChangeListener listener = + shadowAudioManager.getLastAudioFocusRequest().listener; + listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); + lostAudioFocusRecorder.verify() + .opened(CastAudioManager.AudioFocusLoss.TRANSIENT_CAN_DUCK) + .end(); + listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + lostAudioFocusRecorder.verify() + .closed(CastAudioManager.AudioFocusLoss.TRANSIENT_CAN_DUCK) + .end(); } // Simulate the AudioManager mute behavior on Android L. The isStreamMute() method is present,
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc index f2417a4e..4bc5fa3 100644 --- a/chromecast/browser/cast_content_browser_client.cc +++ b/chromecast/browser/cast_content_browser_client.cc
@@ -346,8 +346,7 @@ return; scoped_refptr<content::BrowserMessageFilter> network_hints_message_filter( - new network_hints::NetworkHintsMessageFilter( - url_request_context_factory_->host_resolver())); + new network_hints::NetworkHintsMessageFilter(render_process_id)); host->AddFilter(network_hints_message_filter.get()); }
diff --git a/chromecast/graphics/gestures/cast_gesture_handler.h b/chromecast/graphics/gestures/cast_gesture_handler.h index 525d80b..0b61ffa 100644 --- a/chromecast/graphics/gestures/cast_gesture_handler.h +++ b/chromecast/graphics/gestures/cast_gesture_handler.h
@@ -5,8 +5,6 @@ #ifndef CHROMECAST_GRAPHICS_GESTURES_CAST_GESTURE_HANDLER_H_ #define CHROMECAST_GRAPHICS_GESTURES_CAST_GESTURE_HANDLER_H_ -// TODO(rdaum): Move into chromecast/graphics/gestures, which will require some -// cross-repo maneuvers. #include "base/macros.h" namespace gfx {
diff --git a/chromecast/media/cma/BUILD.gn b/chromecast/media/cma/BUILD.gn index d92c074..3a952b1 100644 --- a/chromecast/media/cma/BUILD.gn +++ b/chromecast/media/cma/BUILD.gn
@@ -74,6 +74,7 @@ if (enable_video_with_mixed_audio) { defines = [ "ENABLE_VIDEO_WITH_MIXED_AUDIO" ] + libs = ["videodecoderformixer"] } data = [
diff --git a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc index 8a50d24..179e362 100644 --- a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc +++ b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc
@@ -626,6 +626,10 @@ AudioVideoPipelineDeviceTest::~AudioVideoPipelineDeviceTest() {} void AudioVideoPipelineDeviceTest::Initialize() { +#if defined(ENABLE_VIDEO_WITH_MIXED_AUDIO) + VideoDecoderForMixer::InitializeGraphicsForTesting(); +#endif + // Create the media device. task_runner_.reset(new TaskRunnerImpl()); MediaPipelineDeviceParams params(
diff --git a/chromecast/media/cma/backend/mixer_input.cc b/chromecast/media/cma/backend/mixer_input.cc index 9c44f9a..bf83703d92 100644 --- a/chromecast/media/cma/backend/mixer_input.cc +++ b/chromecast/media/cma/backend/mixer_input.cc
@@ -81,6 +81,7 @@ input_samples_per_second_); } + slew_volume_.SetSampleRate(output_samples_per_second_); source_->InitializeAudioPlayback(source_read_size, initial_rendering_delay); SetFilterGroup(filter_group);
diff --git a/chromecast/media/cma/backend/mock_video_decoder_for_mixer.cc b/chromecast/media/cma/backend/mock_video_decoder_for_mixer.cc index 29d45b46..9fbc8d69 100644 --- a/chromecast/media/cma/backend/mock_video_decoder_for_mixer.cc +++ b/chromecast/media/cma/backend/mock_video_decoder_for_mixer.cc
@@ -181,6 +181,10 @@ return MockVideoDecoderForMixer<1, 1, 60>::Create(); } +void VideoDecoderForMixer::InitializeGraphicsForTesting() { + // No initialization required. +} + template <int64_t CRN, int64_t CRD, int64_t CF> std::unique_ptr<VideoDecoderForTest> MockVideoDecoderForMixer<CRN, CRD, CF>::Create() {
diff --git a/chromecast/media/cma/backend/video_decoder_for_mixer.h b/chromecast/media/cma/backend/video_decoder_for_mixer.h index fd9422a..3b0bac2 100644 --- a/chromecast/media/cma/backend/video_decoder_for_mixer.h +++ b/chromecast/media/cma/backend/video_decoder_for_mixer.h
@@ -38,6 +38,11 @@ static std::unique_ptr<VideoDecoderForMixer> Create( const MediaPipelineDeviceParams& params); + // On some platforms, graphics needs to be initialized before this component + // will function appropriately in tests. Add the initialization here if + // necessary. + static void InitializeGraphicsForTesting(); + ~VideoDecoderForMixer() override {} // Initializes the VideoDecoderForMixer. Called after allocation and before
diff --git a/chromecast/media/cma/backend/video_decoder_null.cc b/chromecast/media/cma/backend/video_decoder_null.cc index e7d1d6f2..dd36635 100644 --- a/chromecast/media/cma/backend/video_decoder_null.cc +++ b/chromecast/media/cma/backend/video_decoder_null.cc
@@ -20,6 +20,10 @@ return std::make_unique<VideoDecoderNull>(); } +void VideoDecoderForMixer::InitializeGraphicsForTesting() { + // No initialization required +} + VideoDecoderNull::VideoDecoderNull() : delegate_(nullptr), weak_factory_(this) {}
diff --git a/chromecast/media/cma/pipeline/av_pipeline_impl.cc b/chromecast/media/cma/pipeline/av_pipeline_impl.cc index 517dc3b..e104ca8 100644 --- a/chromecast/media/cma/pipeline/av_pipeline_impl.cc +++ b/chromecast/media/cma/pipeline/av_pipeline_impl.cc
@@ -256,6 +256,9 @@ } void AvPipelineImpl::PushAllReadyBuffers() { + if (state_ != kPlaying) + return; + DCHECK(!ready_buffers_.empty()); scoped_refptr<DecoderBufferBase> ready_buffer =
diff --git a/chromecast/renderer/cast_extensions_dispatcher_delegate.cc b/chromecast/renderer/cast_extensions_dispatcher_delegate.cc index 387103f..cea4434 100644 --- a/chromecast/renderer/cast_extensions_dispatcher_delegate.cc +++ b/chromecast/renderer/cast_extensions_dispatcher_delegate.cc
@@ -86,7 +86,6 @@ void CastExtensionsDispatcherDelegate::InitializeBindingsSystem( extensions::Dispatcher* dispatcher, extensions::NativeExtensionBindingsSystem* bindings_system) { - DCHECK( - base::FeatureList::IsEnabled(extensions::features::kNativeCrxBindings)); + DCHECK(base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)); // TODO(rmrossi): Stub }
diff --git a/chromecast/renderer/media/key_systems_cast.cc b/chromecast/renderer/media/key_systems_cast.cc index fd4f7d94..52e0919 100644 --- a/chromecast/renderer/media/key_systems_cast.cc +++ b/chromecast/renderer/media/key_systems_cast.cc
@@ -113,8 +113,8 @@ SupportedCodecs codecs = ::media::EME_CODEC_MP4_AAC | ::media::EME_CODEC_MP4_AVC1 | ::media::EME_CODEC_MP4_FLAC | ::media::EME_CODEC_COMMON_VP9 | - ::media::EME_CODEC_WEBM_OPUS | ::media::EME_CODEC_WEBM_VORBIS | - ::media::EME_CODEC_WEBM_VP8 | ::media::EME_CODEC_WEBM_VP9; + ::media::EME_CODEC_WEBM_OPUS | ::media::EME_CODEC_WEBM_VP8 | + ::media::EME_CODEC_WEBM_VP9; #if BUILDFLAG(ENABLE_HEVC_DEMUXING) codecs |= ::media::EME_CODEC_MP4_HEVC;
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 0aea7aa..29e905a 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -724,6 +724,7 @@ "dbus/shill_profile_client_unittest.cc", "dbus/shill_service_client_unittest.cc", "dbus/shill_third_party_vpn_driver_client_unittest.cc", + "dbus/update_engine_client_unittest.cc", "dbus/util/version_loader_unittest.cc", "disks/disk_mount_manager_unittest.cc", "disks/disk_unittest.cc",
diff --git a/chromeos/components/drivefs/drivefs_host.cc b/chromeos/components/drivefs/drivefs_host.cc index 980277e..7d27860 100644 --- a/chromeos/components/drivefs/drivefs_host.cc +++ b/chromeos/components/drivefs/drivefs_host.cc
@@ -367,9 +367,12 @@ return mount_state_ && mount_state_->mounted(); } -const base::FilePath& DriveFsHost::GetMountPath() const { - DCHECK(mount_state_); - return mount_state_->mount_path(); +base::FilePath DriveFsHost::GetMountPath() const { + return mount_state_ && mount_state_->mounted() + ? mount_state_->mount_path() + : base::FilePath("/media/fuse") + .Append(base::StrCat( + {"drivefs-", delegate_->GetObfuscatedAccountId()})); } base::FilePath DriveFsHost::GetDataPath() const {
diff --git a/chromeos/components/drivefs/drivefs_host.h b/chromeos/components/drivefs/drivefs_host.h index f530f48..e556933 100644 --- a/chromeos/components/drivefs/drivefs_host.h +++ b/chromeos/components/drivefs/drivefs_host.h
@@ -96,9 +96,8 @@ // Returns whether DriveFS is mounted. bool IsMounted() const; - // Returns the path where DriveFS is mounted. It is only valid to call when - // |IsMounted()| returns true. - const base::FilePath& GetMountPath() const; + // Returns the path where DriveFS is mounted. + base::FilePath GetMountPath() const; // Returns the path where DriveFS keeps its data and caches. base::FilePath GetDataPath() const;
diff --git a/chromeos/components/drivefs/drivefs_host_unittest.cc b/chromeos/components/drivefs/drivefs_host_unittest.cc index 2effc57..c9fabe7 100644 --- a/chromeos/components/drivefs/drivefs_host_unittest.cc +++ b/chromeos/components/drivefs/drivefs_host_unittest.cc
@@ -385,6 +385,11 @@ host_->GetMountPath()); } +TEST_F(DriveFsHostTest, GetMountPathWhileUnmounted) { + EXPECT_EQ(base::FilePath("/media/fuse/drivefs-salt-g-ID"), + host_->GetMountPath()); +} + TEST_F(DriveFsHostTest, OnMountedBeforeMountEvent) { auto token = StartMount(); ASSERT_TRUE(PendingConnectionManager::Get().OpenIpcChannel(token, {}));
diff --git a/chromeos/components/drivefs/fake_drivefs.cc b/chromeos/components/drivefs/fake_drivefs.cc index addc2da..fce9ae6 100644 --- a/chromeos/components/drivefs/fake_drivefs.cc +++ b/chromeos/components/drivefs/fake_drivefs.cc
@@ -126,7 +126,9 @@ stored_metadata.mime_type = mime_type; stored_metadata.original_name = original_name; stored_metadata.hosted = (original_name != path.BaseName().value()); - stored_metadata.pinned = pinned; + if (pinned) { + stored_metadata.pinned = true; + } } void FakeDriveFs::Init(drivefs::mojom::DriveFsConfigurationPtr config,
diff --git a/chromeos/dbus/update_engine_client.cc b/chromeos/dbus/update_engine_client.cc index 4510096..ca6a32a1 100644 --- a/chromeos/dbus/update_engine_client.cc +++ b/chromeos/dbus/update_engine_client.cc
@@ -31,12 +31,13 @@ namespace { +const char kReleaseChannelCanary[] = "canary-channel"; const char kReleaseChannelDev[] = "dev-channel"; const char kReleaseChannelBeta[] = "beta-channel"; const char kReleaseChannelStable[] = "stable-channel"; // List of release channels ordered by stability. -const char* kReleaseChannelsList[] = {kReleaseChannelDev, +const char* kReleaseChannelsList[] = {kReleaseChannelCanary, kReleaseChannelDev, kReleaseChannelBeta, kReleaseChannelStable};
diff --git a/chromeos/dbus/update_engine_client_unittest.cc b/chromeos/dbus/update_engine_client_unittest.cc new file mode 100644 index 0000000..a782c8c --- /dev/null +++ b/chromeos/dbus/update_engine_client_unittest.cc
@@ -0,0 +1,56 @@ +// Copyright (c) 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 "chromeos/dbus/update_engine_client.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +TEST(UpdateEngineClientTest, IsTargetChannelMoreStable) { + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("stable-channel", + "beta-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("beta-channel", + "dev-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("dev-channel", + "canary-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("beta-channel", + "stable-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("dev-channel", + "stable-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("canary-channel", + "stable-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("dev-channel", + "beta-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("canary-channel", + "dev-channel")); + // Staying on the same channel always returns false. + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("stable-channel", + "stable-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("beta-channel", + "beta-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("dev-channel", + "dev-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("canary-channel", + "canary-channel")); + // Invalid channel names are considered more stable than valid ones, to be + // consistent with the update_engine behavior. + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("invalid-channel", + "canary-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable("invalid-channel", + "stable-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("canary-channel", + "invalid-channel")); + EXPECT_TRUE(UpdateEngineClient::IsTargetChannelMoreStable("stable-channel", + "invalid-channel")); + // If both channels are invalid, we return false. + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable( + "invalid-channel", "invalid-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable( + "invalid-channel", "other-invalid-channel")); + EXPECT_FALSE(UpdateEngineClient::IsTargetChannelMoreStable( + "other-invalid-channel", "invalid-channel")); +} + +} // namespace chromeos
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.cc b/chromeos/services/assistant/platform/audio_output_provider_impl.cc index 9b9adb73..94b32ada 100644 --- a/chromeos/services/assistant/platform/audio_output_provider_impl.cc +++ b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
@@ -131,6 +131,7 @@ void Stop() override { if (IsEncodedFormat(format_)) { + device_owner_->SetDelegate(nullptr); main_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce(&AudioStreamHandler::OnStopped, @@ -306,9 +307,12 @@ void AudioDeviceOwner::StopOnBackgroundThread() { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); + base::AutoLock lock(lock_); output_device_.reset(); - delegate_->OnStopped(); - delegate_ = nullptr; + if (delegate_) { + delegate_->OnStopped(); + delegate_ = nullptr; + } } void AudioDeviceOwner::StartDeviceOnBackgroundThread( @@ -360,10 +364,17 @@ void AudioDeviceOwner::OnRenderError() { DVLOG(1) << "OnRenderError()"; + base::AutoLock lock(lock_); if (delegate_) delegate_->OnError(assistant_client::AudioOutput::Error::FATAL_ERROR); } +void AudioDeviceOwner::SetDelegate( + assistant_client::AudioOutput::Delegate* delegate) { + base::AutoLock lock(lock_); + delegate_ = delegate; +} + void AudioDeviceOwner::ScheduleFillLocked(const base::TimeTicks& time) { lock_.AssertAcquired(); if (is_filling_)
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.h b/chromeos/services/assistant/platform/audio_output_provider_impl.h index 208ce4e..504ac27 100644 --- a/chromeos/services/assistant/platform/audio_output_provider_impl.h +++ b/chromeos/services/assistant/platform/audio_output_provider_impl.h
@@ -106,6 +106,8 @@ void OnRenderError() override; + void SetDelegate(assistant_client::AudioOutput::Delegate* delegate); + private: void StartDeviceOnBackgroundThread( std::unique_ptr<service_manager::Connector> connector);
diff --git a/chromeos/services/assistant/platform/audio_stream_handler.cc b/chromeos/services/assistant/platform/audio_stream_handler.cc index 2d31e23..e51e7ee 100644 --- a/chromeos/services/assistant/platform/audio_stream_handler.cc +++ b/chromeos/services/assistant/platform/audio_stream_handler.cc
@@ -116,11 +116,9 @@ : assistant_client::OutputStreamEncoding::STREAM_PCM_S32, /*pcm_sample_rate=*/samples_per_second, /*pcm_num_channels=*/channels}; - if (!device_owner_started_) { - DCHECK(start_device_owner_on_main_thread_); + if (start_device_owner_on_main_thread_) { DCHECK(!on_filled_); std::move(start_device_owner_on_main_thread_).Run(format); - device_owner_started_ = true; } }
diff --git a/chromeos/services/assistant/platform/audio_stream_handler.h b/chromeos/services/assistant/platform/audio_stream_handler.h index b9dd4ff..a8c0fa72 100644 --- a/chromeos/services/assistant/platform/audio_stream_handler.h +++ b/chromeos/services/assistant/platform/audio_stream_handler.h
@@ -94,8 +94,6 @@ // Temporary storage of |on_filled| passed by |FillBuffer|. assistant_client::Callback1<int> on_filled_; - // True after |start_device_owner_on_main_thread_| is called. - bool device_owner_started_ = false; InitCB start_device_owner_on_main_thread_; base::circular_deque<std::vector<uint8_t>> decoded_data_;
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc index 9af241d..c507135 100644 --- a/chromeos/settings/cros_settings_names.cc +++ b/chromeos/settings/cros_settings_names.cc
@@ -321,4 +321,9 @@ const char kDeviceAutoUpdateTimeRestrictions[] = "cros.system.autoUpdateTimeRestrictions"; +// A boolean pref that indicates whether running Crostini on Chrome OS is +// allowed for unaffiliated user. +const char kDeviceUnaffiliatedCrostiniAllowed[] = + "cros.device.unaffiliated_crostini_allowed"; + } // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h index 8b565c8..11c815b 100644 --- a/chromeos/settings/cros_settings_names.h +++ b/chromeos/settings/cros_settings_names.h
@@ -145,6 +145,8 @@ CHROMEOS_EXPORT extern const char kDeviceAutoUpdateTimeRestrictions[]; +CHROMEOS_EXPORT extern const char kDeviceUnaffiliatedCrostiniAllowed[]; + } // namespace chromeos #endif // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 92406ec2..e399089 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="am"> +<translation id="6674412557034343536">ሰዓት ቆጣሪ አቁም</translation> +<translation id="8626219642120025691">የሰዓት ቆጣሪ ተጠናቅቋል</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index 198ea62..0f658f0 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ar"> +<translation id="6674412557034343536">إيقاف المؤقّت</translation> +<translation id="8626219642120025691">تم الانتهاء من المؤقّت</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index 6681995..005025e 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="6674412557034343536">спиране на таймера</translation> +<translation id="8626219642120025691">Таймерът завърши</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 71cdd772..754edeba 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="6674412557034343536">atura el temporitzador</translation> +<translation id="8626219642120025691">Temporitzador finalitzat</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index dc153a85..2fbae6d 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="6674412557034343536">zastavit časovač</translation> +<translation id="8626219642120025691">Dokončeno</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 1256832..1ae23b64 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="da"> +<translation id="6674412557034343536">stop timer</translation> +<translation id="8626219642120025691">Timeren er færdig</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 43dd909..c988e82 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> +<translation id="6674412557034343536">Timer stoppen</translation> +<translation id="8626219642120025691">Timer abgelaufen</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 1b096642..4197fcf 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="el"> +<translation id="6674412557034343536">διακοπή χρονομέτρου</translation> +<translation id="8626219642120025691">Ολοκλήρωση χρονομέτρου</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 4d4f400..1437747 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es"> +<translation id="6674412557034343536">detener temporizador</translation> +<translation id="8626219642120025691">El temporizador ha finalizado</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index ab777bc5..83da553 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="et"> +<translation id="6674412557034343536">peata taimer</translation> +<translation id="8626219642120025691">Taimer jõudis lõpule</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 4cff15d..52eead44 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> +<translation id="6674412557034343536">توقف تایمر</translation> +<translation id="8626219642120025691">تایمر تمام</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 8f6a880..8afa614 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> +<translation id="6674412557034343536">ihinto ang timer</translation> +<translation id="8626219642120025691">Tapos na ang timer</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index bf48975a..df578ff 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> +<translation id="6674412557034343536">arrête le minuteur</translation> +<translation id="8626219642120025691">Délai écoulé</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 7969d06..80a82f9 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="gu"> +<translation id="6674412557034343536">ટાઇમર રોકો</translation> +<translation id="8626219642120025691">ટાઇમર લગાવ્યું</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 279503cd..a2f54288 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> +<translation id="6674412557034343536">टाइमर बंद करें</translation> +<translation id="8626219642120025691">टाइमर पूरा हुआ</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 9ec62af..4e86073 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hr"> +<translation id="6674412557034343536">zaustavi odbrojavanje</translation> +<translation id="8626219642120025691">Odbrojavanje gotovo</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index bdc02eeac..e94f5d5 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="6674412557034343536">időzítés leállítása</translation> +<translation id="8626219642120025691">Időzítés kész</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index 5f2882d0..795ea888 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="id"> +<translation id="6674412557034343536">hentikan timer</translation> +<translation id="8626219642120025691">Timer selesai</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index e7df702..0423ec7 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="it"> +<translation id="6674412557034343536">interrompi timer</translation> +<translation id="8626219642120025691">Timer creato</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index a29d4ad..f8709b6 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="iw"> +<translation id="6674412557034343536">הפסקת הטיימר</translation> +<translation id="8626219642120025691">הטיימר סיים</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index d8a3543..c7109ca 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> +<translation id="6674412557034343536">タイマーを止めて</translation> +<translation id="8626219642120025691">タイマーが設定されました</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 4ecb12ba..11d252e1 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kn"> +<translation id="6674412557034343536">ಟೈಮರ್ ನಿಲ್ಲಿಸಿ</translation> +<translation id="8626219642120025691">ಟೈಮರ್ ಮುಗಿದಿದೆ</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 558b05b..bc73838 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="6674412557034343536">타이머 중지</translation> +<translation id="8626219642120025691">타이머 완료</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index f20c0fa2..fec677a 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="6674412557034343536">stabdyti laikmatį</translation> +<translation id="8626219642120025691">Laikmatis atliktas</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 6f3afbc..339e253 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> +<translation id="6674412557034343536">apturēt taimeri</translation> +<translation id="8626219642120025691">Taimeris gatavs</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index e01197e..987fd25 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ml"> +<translation id="6674412557034343536">ടൈമർ നിർത്തുക</translation> +<translation id="8626219642120025691">ടൈമർ സജ്ജമാക്കി</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index b137924e..c6bf7f16 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="mr"> +<translation id="6674412557034343536">टायमर थांबवा</translation> +<translation id="8626219642120025691">टायमर झाला</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index 05ab957..1d4b787 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="nl"> +<translation id="6674412557034343536">timer stoppen</translation> +<translation id="8626219642120025691">Timer gereed</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index ede4de30..ce916f4 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="6674412557034343536">stopp nedtellingen</translation> +<translation id="8626219642120025691">Nedtellingen er ferdig</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 1bf17bd5..6241d04 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="6674412557034343536">zatrzymaj minutnik</translation> +<translation id="8626219642120025691">Minutnik gotowy</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index de39dfa..dfcc23d 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-BR"> +<translation id="6674412557034343536">parar timer</translation> +<translation id="8626219642120025691">Timer concluído</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 0b98ee77..dfc9e02 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> +<translation id="6674412557034343536">parar temporizador</translation> +<translation id="8626219642120025691">Temporizador concluído</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 7129eb4..12abeef 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> +<translation id="6674412557034343536">oprește cronometrul</translation> +<translation id="8626219642120025691">Temporizator creat</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 6dfaa442..ab9a756 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> +<translation id="6674412557034343536">остановить таймер</translation> +<translation id="8626219642120025691">Таймер остановлен</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 202e515a..d55a04f 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> +<translation id="6674412557034343536">zastaviť časovač</translation> +<translation id="8626219642120025691">Časovač skončil</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 984d7192..a7a1379 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="6674412557034343536">заустави тајмер</translation> +<translation id="8626219642120025691">Тајмер је искључен</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index 9a787b8..29b7464 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sv"> +<translation id="6674412557034343536">stoppa timer</translation> +<translation id="8626219642120025691">Timer klar</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index 9aa61cb..c7f77f3bc 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sw"> +<translation id="6674412557034343536">simamisha kipima muda</translation> +<translation id="8626219642120025691">Kipima muda kimemaliza kuhesabu</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index c983c75f2..b4a932d 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> +<translation id="6674412557034343536">டைமரை நிறுத்து</translation> +<translation id="8626219642120025691">டைமர் முடிந்தது</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index 7affb9a..3710f5e8 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="te"> +<translation id="6674412557034343536">టైమర్ను ఆపివేయండి</translation> +<translation id="8626219642120025691">టైమర్ పూర్తయింది</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index dbe6a601..db00135 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> +<translation id="6674412557034343536">หยุดตัวจับเวลา</translation> +<translation id="8626219642120025691">ตัวจับเวลาสิ้นสุดแล้ว</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index d99480c0..1d06ea5 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> +<translation id="6674412557034343536">zamanlayıcıyı durdur</translation> +<translation id="8626219642120025691">Zamanlayıcı bitti</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 6e80099d..5d4f732 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> +<translation id="6674412557034343536">зупинити таймер</translation> +<translation id="8626219642120025691">Таймер вимкнено</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 8a42ab1..743043c9 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="vi"> +<translation id="6674412557034343536">dừng hẹn giờ</translation> +<translation id="8626219642120025691">Đã thiết lập xong bộ hẹn giờ</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index c7d76e8..3297d40 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> +<translation id="6674412557034343536">停止计时器</translation> +<translation id="8626219642120025691">计时完成</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 3e0c306..5de4b9a1 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -1,4 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> +<translation id="6674412557034343536">停止計時器</translation> +<translation id="8626219642120025691">計時完成</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/test/data/oobe_configuration/non_empty_configuration.json b/chromeos/test/data/oobe_configuration/non_empty_configuration.json index 6611511..25731fc 100644 --- a/chromeos/test/data/oobe_configuration/non_empty_configuration.json +++ b/chromeos/test/data/oobe_configuration/non_empty_configuration.json
@@ -1,3 +1,4 @@ { - "desc" : "Simple non-empty configuration file to test that configuration is loaded correctly" + "desc" : "Simple non-empty configuration file to test that configuration is loaded correctly", + "testValue" : "something" } \ No newline at end of file
diff --git a/components/OWNERS b/components/OWNERS index 994a18aa..683e6d0 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -12,7 +12,9 @@ per-file crash_strings.grdp=file://components/crash/OWNERS per-file dom_distiller_strings.grdp=file://components/dom_distiller/OWNERS per-file error_page_strings.grdp=file://components/error_page/OWNERS +per-file management_strings.grdp=file://components/policy/OWNERS per-file ntp_snippets_strings.grdp=file://components/ntp_snippets/OWNERS +per-file nux_email_strings.grdp=file://components/nux/OWNERS per-file nux_google_apps_strings.grdp=file://components/nux/OWNERS per-file omnibox_strings.grdp=file://components/omnibox/OWNERS per-file page_info_strings.grdp=file://chrome/browser/ui/page_info/OWNERS
diff --git a/components/arc/common/auth.mojom b/components/arc/common/auth.mojom index 9b64261..4498975 100644 --- a/components/arc/common/auth.mojom +++ b/components/arc/common/auth.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Next MinVersion: 17 +// Next MinVersion: 15 module arc.mojom; @@ -170,7 +170,6 @@ }; // The necessary information for Android to sign in and provision itself. -// Next ordinal value: 6. struct AccountInfo { // Name of account, used to map to existing Android account. [MinVersion=9] string? account_name@4; @@ -190,9 +189,6 @@ // Whether the account is managed from Chrome OS. bool is_managed@2; - - // Whether this account is a Chrome OS Secondary Account. - [MinVersion=16] bool is_secondary_account@5; }; // Next Method ID: 12. @@ -213,11 +209,7 @@ // Asynchronously requests an authorization code, as well as the account // information. If |initial_signin| is true then that means request is for // initial signin flow. Otherwise it is used for reauthorization flow. - // Optionally, an |account_name| can be provided to fetch |AccountInfo| for - // Secondary Accounts in Chrome OS Account Manager. Absence of |account_name| - // will default to the Device Account in Chrome OS. - [MinVersion=5] RequestAccountInfo@7([MinVersion=11] bool initial_signin, - [MinVersion=16] string? account_name); + [MinVersion=5] RequestAccountInfo@7([MinVersion=11] bool initial_signin); // Reports metrics to Chrome to be recorded in UMA. [MinVersion=7] ReportMetrics@8(MetricsType metrics_type, int32 value); @@ -233,7 +225,7 @@ SupervisionChangeStatus status); }; -// Next Method ID: 5 +// Next Method ID: 3 interface AuthInstance { // DEPRECATED: Please use Init@2 instead. InitDeprecated@0(AuthHost host_ptr); @@ -251,13 +243,4 @@ [MinVersion=5] OnAccountInfoReady@1( AccountInfo? account_info, [MinVersion=10] ArcSignInStatus status); - // A notification that a Secondary Account has been updated or inserted in - // Chrome OS Account Manager. This API is guaranteed to be idempotent. - // Note: This notification is guaranteed to be called at least once for every - // Secondary Account in Chrome OS Account Manager at startup. - [MinVersion=15] OnSecondaryAccountUpserted@3(string account_name); - - // A notification that a Secondary Account has been removed from Chrome OS - // Account Manager. This API is guaranteed to be idempotent. - [MinVersion=15] OnSecondaryAccountRemoved@4(string account_name); };
diff --git a/components/arc/rotation_lock/arc_rotation_lock_bridge.cc b/components/arc/rotation_lock/arc_rotation_lock_bridge.cc index b081630..c3909d0 100644 --- a/components/arc/rotation_lock/arc_rotation_lock_bridge.cc +++ b/components/arc/rotation_lock/arc_rotation_lock_bridge.cc
@@ -4,7 +4,6 @@ #include "components/arc/rotation_lock/arc_rotation_lock_bridge.h" -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/memory/singleton.h"
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc index 60d1b15..cfa4e23 100644 --- a/components/autofill/content/renderer/password_generation_agent.cc +++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -164,6 +164,7 @@ if (*element != it) { it.SetAutofillValue(element->Value()); } + it.SetAutofillState(WebAutofillState::kAutofilled); } } @@ -284,8 +285,11 @@ void PasswordGenerationAgent::OnFieldAutofilled( const WebInputElement& password_element) { - if (password_is_generated_ && generation_element_ == password_element) + if (password_is_generated_ && generation_element_ == password_element) { + password_generation::LogPasswordGenerationEvent( + password_generation::PASSWORD_DELETED_BY_AUTOFILLING); PasswordNoLongerGenerated(); + } } void PasswordGenerationAgent::FindPossibleGenerationForm() {
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 10ee077..ccb8465 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -8,6 +8,7 @@ jumbo_static_library("browser") { sources = [ + "account_info_getter.h", "address.cc", "address.h", "address_combobox_model.cc",
diff --git a/components/autofill/core/browser/DEPS b/components/autofill/core/browser/DEPS index 5bef9b8..f3199c0 100644 --- a/components/autofill/core/browser/DEPS +++ b/components/autofill/core/browser/DEPS
@@ -6,12 +6,7 @@ "+components/metrics", "+components/policy", "+components/security_state", - - # Autofill depends on //services/identity/public/cpp for its core Google - # identity dependencies, but depends on this isolated file for recording - # some browser-specific signin metrics. - "+components/signin/core/browser/signin_metrics.h", - + "+components/signin/core/browser", "+components/sync", "+components/variations", "+components/version_info",
diff --git a/components/autofill/core/browser/account_info_getter.h b/components/autofill/core/browser/account_info_getter.h new file mode 100644 index 0000000..fdab2e1 --- /dev/null +++ b/components/autofill/core/browser/account_info_getter.h
@@ -0,0 +1,30 @@ +// 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_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_ + +#include <string> + +namespace autofill { + +// Interface to get account information in Autofill. +class AccountInfoGetter { + public: + // Returns the account id of the active signed-in user irrespective of + // whether they enabled sync or not. + virtual std::string GetActiveSignedInAccountId() const = 0; + + // Returns true - When user is both signed-in and enabled sync. + // Returns false - When user is not signed-in or does not have sync the + // feature enabled. + virtual bool IsSyncFeatureEnabled() const = 0; + + protected: + virtual ~AccountInfoGetter() {} +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index e0a0f3f..a83084e 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -1121,6 +1121,7 @@ driver->GetURLLoaderFactory(), client->GetPrefs(), client->GetIdentityManager(), + client->GetPersonalDataManager(), driver->IsIncognito())), app_locale_(app_locale), personal_data_(personal_data),
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc index e7fef9c..68666be 100644 --- a/components/autofill/core/browser/autofill_metrics.cc +++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -848,6 +848,31 @@ } // static +void AutofillMetrics::LogLocalCardMigrationPromptMetric( + LocalCardMigrationOrigin local_card_migration_origin, + LocalCardMigrationPromptMetric metric) { + DCHECK_LT(metric, NUM_LOCAL_CARD_MIGRATION_PROMPT_METRICS); + std::string histogram_name = "Autofill.LocalCardMigrationOrigin."; + // Switch to different sub-histogram depending on local card migration origin. + switch (local_card_migration_origin) { + case LocalCardMigrationOrigin::UseOfLocalCard: + histogram_name += "UseOfLocalCard"; + break; + case LocalCardMigrationOrigin::UseOfServerCard: + histogram_name += "UseOfServerCard"; + break; + case LocalCardMigrationOrigin::SettingsPage: + histogram_name += "SettingsPage"; + break; + default: + NOTREACHED(); + return; + } + base::UmaHistogramEnumeration(histogram_name, metric, + NUM_LOCAL_CARD_MIGRATION_PROMPT_METRICS); +} + +// static void AutofillMetrics::LogSaveCardWithFirstAndLastNameOffered(bool is_local) { std::string histogram_name = "Autofill.SaveCardWithFirstAndLastNameOffered."; histogram_name += is_local ? "Local" : "Server";
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h index 47e40c4..f556888e 100644 --- a/components/autofill/core/browser/autofill_metrics.h +++ b/components/autofill/core/browser/autofill_metrics.h
@@ -436,6 +436,30 @@ NUM_LOCAL_CARD_MIGRATION_BUBBLE_USER_INTERACTION_METRICS, }; + // These metrics are logged for each local card migration origin. These are + // used to derive the conversion rate for each triggering source. + enum LocalCardMigrationPromptMetric { + // The intermediate bubble is shown to the user. + INTERMEDIATE_BUBBLE_SHOWN = 0, + // The intermediate bubble is accepted by the user. + INTERMEDIATE_BUBBLE_ACCEPTED = 1, + // The main dialog is shown to the user. + MAIN_DIALOG_SHOWN = 2, + // The main dialog is accepted by the user. + MAIN_DIALOG_ACCEPTED = 3, + NUM_LOCAL_CARD_MIGRATION_PROMPT_METRICS, + }; + + // Local card migration origin denotes from where the migration is triggered. + enum LocalCardMigrationOrigin { + // Trigger when user submitted a form using local card. + UseOfLocalCard, + // Trigger when user submitted a form using server card. + UseOfServerCard, + // Trigger from settings page. + SettingsPage, + }; + // Each of these metrics is logged only for potentially autofillable forms, // i.e. forms with at least three fields, etc. // These are used to derive certain "user happiness" metrics. For example, we @@ -856,6 +880,9 @@ static void LogLocalCardMigrationBubbleUserInteractionMetric( LocalCardMigrationBubbleUserInteractionMetric metric, bool is_reshow); + static void LogLocalCardMigrationPromptMetric( + LocalCardMigrationOrigin local_card_migration_origin, + LocalCardMigrationPromptMetric metric); // Should be called when credit card scan is finished. |duration| should be // the time elapsed between launching the credit card scanner and getting back
diff --git a/components/autofill/core/browser/credit_card_save_manager.cc b/components/autofill/core/browser/credit_card_save_manager.cc index dbcd4f0..485d5959 100644 --- a/components/autofill/core/browser/credit_card_save_manager.cc +++ b/components/autofill/core/browser/credit_card_save_manager.cc
@@ -167,6 +167,20 @@ should_request_name_from_user_ = true; } + // If the relevant feature is enabled, only send the country of the + // recently-used addresses. + if (base::FeatureList::IsEnabled( + features::kAutofillSendOnlyCountryInGetUploadDetails)) { + for (size_t i = 0; i < upload_request_.profiles.size(); i++) { + AutofillProfile country_only; + country_only.SetInfo(ADDRESS_HOME_COUNTRY, + upload_request_.profiles[i].GetInfo( + ADDRESS_HOME_COUNTRY, app_locale_), + app_locale_); + upload_request_.profiles[i] = std::move(country_only); + } + } + // All required data is available, start the upload process. if (observer_for_testing_) observer_for_testing_->OnDecideToRequestUploadSave(); @@ -381,20 +395,6 @@ if (verified_zip.empty() && !candidate_profiles.empty()) upload_decision_metrics_ |= AutofillMetrics::UPLOAD_NOT_OFFERED_NO_ZIP_CODE; - // If the relevant feature is enabled, only send the country of the - // recently-used addresses. - if (base::FeatureList::IsEnabled( - features::kAutofillSendOnlyCountryInGetUploadDetails)) { - for (size_t i = 0; i < candidate_profiles.size(); i++) { - AutofillProfile country_only; - country_only.SetInfo( - ADDRESS_HOME_COUNTRY, - candidate_profiles[i].GetInfo(ADDRESS_HOME_COUNTRY, app_locale_), - app_locale_); - candidate_profiles[i] = std::move(country_only); - } - } - // Set up |upload_request->profiles|. upload_request->profiles.assign(candidate_profiles.begin(), candidate_profiles.end());
diff --git a/components/autofill/core/browser/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/credit_card_save_manager_unittest.cc index 8fadd936..1906ace 100644 --- a/components/autofill/core/browser/credit_card_save_manager_unittest.cc +++ b/components/autofill/core/browser/credit_card_save_manager_unittest.cc
@@ -113,7 +113,7 @@ autofill_driver_->SetURLRequestContext(request_context_.get()); payments_client_ = new payments::TestPaymentsClient( autofill_driver_->GetURLLoaderFactory(), autofill_client_.GetPrefs(), - autofill_client_.GetIdentityManager()); + autofill_client_.GetIdentityManager(), &personal_data_); credit_card_save_manager_ = new TestCreditCardSaveManager(autofill_driver_.get(), &autofill_client_, payments_client_, &personal_data_); @@ -2342,7 +2342,28 @@ EXPECT_FALSE(credit_card_save_manager_->CreditCardWasUploaded()); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_NothingIfNothingFound) { +// This class is parametrized to allow running all the inheriting tests with and +// without a specific feature enabled. See INSTANTIATE_TEST_CASE_P. +class CreditCardSaveManagerGetDetectedValuesTest + : public CreditCardSaveManagerTest, + public ::testing::WithParamInterface< + /*enable_send_only_country_in_get_upload_details=*/bool> { + public: + CreditCardSaveManagerGetDetectedValuesTest() {} + ~CreditCardSaveManagerGetDetectedValuesTest() override {} + + void SetUp() override { + CreditCardSaveManagerTest::SetUp(); + scoped_feature_list_.InitWithFeatureState( + features::kAutofillSendOnlyCountryInGetUploadDetails, + /*enable_send_only_country_in_get_upload_details=*/GetParam()); + } + + private: + DISALLOW_COPY_AND_ASSIGN(CreditCardSaveManagerGetDetectedValuesTest); +}; + +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, NothingIfNothingFound) { // Set up our credit card form data. FormData credit_card_form; CreateTestCreditCardFormData(&credit_card_form, true, false); @@ -2360,7 +2381,7 @@ EXPECT_EQ(payments_client_->detected_values_in_upload_details(), 0); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectCvc) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectCvc) { // Set up our credit card form data. FormData credit_card_form; CreateTestCreditCardFormData(&credit_card_form, true, false); @@ -2382,7 +2403,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectCardholderName) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectCardholderName) { // Set up our credit card form data. FormData credit_card_form; CreateTestCreditCardFormData(&credit_card_form, true, false); @@ -2405,7 +2426,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectAddressName) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectAddressName) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2434,8 +2455,8 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectCardholderAndAddressNameIfMatching) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectCardholderAndAddressNameIfMatching) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2465,8 +2486,8 @@ expected_detected_values); } -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectNoUniqueNameIfNamesConflict) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectNoUniqueNameIfNamesConflict) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2490,7 +2511,7 @@ EXPECT_EQ(payments_client_->detected_values_in_upload_details(), 0); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectPostalCode) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectPostalCode) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2519,8 +2540,8 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectNoUniquePostalCodeIfZipsConflict) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectNoUniquePostalCodeIfZipsConflict) { // Set up two new address profiles with conflicting postal codes. AutofillProfile profile1; profile1.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2548,7 +2569,7 @@ EXPECT_EQ(payments_client_->detected_values_in_upload_details(), 0); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectAddressLine) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectAddressLine) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2577,7 +2598,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectLocality) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectLocality) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2605,7 +2626,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectAdministrativeArea) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectAdministrativeArea) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2634,7 +2655,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectCountryCode) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectCountryCode) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2663,8 +2684,8 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectHasGooglePaymentAccount) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectHasGooglePaymentAccount) { // Set the billing_customer_number Priority Preference to designate existence // of a Payments account. autofill_client_.GetPrefs()->SetDouble(prefs::kAutofillBillingCustomerNumber, @@ -2692,7 +2713,7 @@ expected_detected_value); } -TEST_F(CreditCardSaveManagerTest, GetDetectedValues_DetectEverythingAtOnce) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, DetectEverythingAtOnce) { // Set up a new address profile. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2733,8 +2754,8 @@ expected_detected_values); } -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectSubsetOfPossibleFields) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectSubsetOfPossibleFields) { // Set up a new address profile, taking out address line and state. AutofillProfile profile; profile.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2772,8 +2793,8 @@ // This test checks that ADDRESS_LINE, LOCALITY, ADMINISTRATIVE_AREA, and // COUNTRY_CODE don't care about possible conflicts or consistency and are // populated if even one address profile contains it. -TEST_F(CreditCardSaveManagerTest, - GetDetectedValues_DetectAddressComponentsAcrossProfiles) { +TEST_P(CreditCardSaveManagerGetDetectedValuesTest, + DetectAddressComponentsAcrossProfiles) { // Set up four new address profiles, each with a different address component. AutofillProfile profile1; profile1.set_guid("00000000-0000-0000-0000-000000000200"); @@ -2818,6 +2839,15 @@ expected_detected_values); } +// Every test will appear with suffix /0 (param false) and /1 (param true), e.g. +// CreditCardSaveManagerGetDetectedValuesTest.NothingIfNothingFound/0: +// Feature disabled +// CreditCardSaveManagerGetDetectedValuesTest.NothingIfNothingFound/1: +// Feature enabled. +INSTANTIATE_TEST_CASE_P(, // Empty instatiation name. + CreditCardSaveManagerGetDetectedValuesTest, + ::testing::Values(false, true)); + TEST_F(CreditCardSaveManagerTest, UploadCreditCard_LogAdditionalErrorsWithUploadDetailsFailure) { // Anything other than "en-US" will cause GetUploadDetails to return a failure
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 8495d1f..38efc0c 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -329,6 +329,7 @@ FormStructure::FormStructure(const FormData& form) : form_name_(form.name), + submission_event_(PasswordForm::SubmissionIndicatorEvent::NONE), source_url_(form.origin), target_url_(form.action), main_frame_origin_(form.main_frame_origin), @@ -439,6 +440,13 @@ upload->set_autofill_used(form_was_autofilled); upload->set_data_present(EncodeFieldTypes(available_field_types)); upload->set_passwords_revealed(passwords_were_revealed_); + if (submission_event_ != PasswordForm::SubmissionIndicatorEvent::NONE) { + DCHECK(submission_event_ != PasswordForm::SubmissionIndicatorEvent:: + SUBMISSION_INDICATOR_EVENT_COUNT); + upload->set_submission_event( + static_cast<AutofillUploadContents_SubmissionIndicatorEvent>( + submission_event_)); + } if (password_attributes_vote_) { EncodePasswordAttributesVote(*password_attributes_vote_, password_length_vote_, upload);
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index 129d32d..2111f0c 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -23,6 +23,7 @@ #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/form_types.h" #include "components/autofill/core/browser/proto/server.pb.h" +#include "components/autofill/core/common/password_form.h" #include "url/gurl.h" #include "url/origin.h" @@ -231,6 +232,11 @@ return has_author_specified_upi_vpa_hint_; } + void set_submission_event( + PasswordForm::SubmissionIndicatorEvent submission_event) { + submission_event_ = submission_event; + } + void set_upload_required(UploadRequired required) { upload_required_ = required; } @@ -284,6 +290,11 @@ "|password_attributes_vote_| has no value."; return password_length_vote_; } + + PasswordForm::SubmissionIndicatorEvent get_submission_event_for_testing() + const { + return submission_event_; + } #endif bool operator==(const FormData& form) const; @@ -444,6 +455,10 @@ // The name of the form. base::string16 form_name_; + // The type of the event that was taken as an indication that the form has + // been successfully submitted. + PasswordForm::SubmissionIndicatorEvent submission_event_; + // The source URL. GURL source_url_;
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index e14d837..c205ac6 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -20,6 +20,7 @@ #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/form_field_data.h" +#include "components/autofill/core/common/password_form.h" #include "components/autofill/core/common/signatures_util.h" #include "components/variations/entropy_provider.h" #include "testing/gtest/include/gtest/gtest.h" @@ -2831,6 +2832,8 @@ form_structure->set_password_attributes_vote( std::make_pair(PasswordAttribute::kHasNumeric, true)); form_structure->set_password_length_vote(10u); + form_structure->set_submission_event( + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION); ASSERT_EQ(form_structure->field_count(), possible_field_types.size()); ASSERT_EQ(form_structure->field_count(), @@ -2855,6 +2858,7 @@ // Prepare the expected proto string. AutofillUploadContents upload; upload.set_submission(true); + upload.set_submission_event(AutofillUploadContents::HTML_FORM_SUBMISSION); upload.set_client_version("6.1.1715.1442/en (GGLL)"); upload.set_form_signature(8736493185895608956U); upload.set_autofill_used(false); @@ -2913,7 +2917,8 @@ form_structure->set_password_attributes_vote( std::make_pair(PasswordAttribute::kHasNumeric, true)); form_structure->set_password_length_vote(10u); - + form_structure->set_submission_event( + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION); ASSERT_EQ(form_structure->field_count(), possible_field_types.size()); ASSERT_EQ(form_structure->field_count(), possible_field_types_validities.size());
diff --git a/components/autofill/core/browser/local_card_migration_manager.cc b/components/autofill/core/browser/local_card_migration_manager.cc index d5caa83..39db55b 100644 --- a/components/autofill/core/browser/local_card_migration_manager.cc +++ b/components/autofill/core/browser/local_card_migration_manager.cc
@@ -45,11 +45,17 @@ bool LocalCardMigrationManager::ShouldOfferLocalCardMigration( int imported_credit_card_record_type) { // Must be an existing card. New cards always get Upstream or local save. - if (imported_credit_card_record_type != - FormDataImporter::ImportedCreditCardRecordType::LOCAL_CARD && - imported_credit_card_record_type != - FormDataImporter::ImportedCreditCardRecordType::SERVER_CARD) { - return false; + switch (imported_credit_card_record_type) { + case FormDataImporter::ImportedCreditCardRecordType::LOCAL_CARD: + local_card_migration_origin_ = + AutofillMetrics::LocalCardMigrationOrigin::UseOfLocalCard; + break; + case FormDataImporter::ImportedCreditCardRecordType::SERVER_CARD: + local_card_migration_origin_ = + AutofillMetrics::LocalCardMigrationOrigin::UseOfServerCard; + break; + default: + return false; } if (!IsCreditCardMigrationEnabled()) @@ -89,12 +95,17 @@ // Call ShowMainMigrationDialog() to pop up a larger, modal dialog showing the // local cards to be uploaded. void LocalCardMigrationManager::OnUserAcceptedIntermediateMigrationDialog() { + AutofillMetrics::LogLocalCardMigrationPromptMetric( + local_card_migration_origin_, + AutofillMetrics::INTERMEDIATE_BUBBLE_ACCEPTED); ShowMainMigrationDialog(); } // Send the migration request once risk data is available. void LocalCardMigrationManager::OnUserAcceptedMainMigrationDialog() { user_accepted_main_migration_dialog_ = true; + AutofillMetrics::LogLocalCardMigrationPromptMetric( + local_card_migration_origin_, AutofillMetrics::MAIN_DIALOG_ACCEPTED); // Populating risk data and offering migration two-round pop-ups occur // asynchronously. If |migration_risk_data_| has already been loaded, send the // migrate local cards request. Otherwise, continue to wait and let @@ -132,12 +143,18 @@ // dialog. If triggered from settings page, we pop-up the main prompt // directly. If not, we pop up the intermediate bubble. if (is_from_settings_page) { + // Set the origin to SettingsPage. + local_card_migration_origin_ = + AutofillMetrics::LocalCardMigrationOrigin::SettingsPage; // Pops up a larger, modal dialog showing the local cards to be uploaded. ShowMainMigrationDialog(); } else { client_->ShowLocalCardMigrationDialog(base::BindOnce( &LocalCardMigrationManager::OnUserAcceptedIntermediateMigrationDialog, weak_ptr_factory_.GetWeakPtr())); + AutofillMetrics::LogLocalCardMigrationPromptMetric( + local_card_migration_origin_, + AutofillMetrics::INTERMEDIATE_BUBBLE_SHOWN); } // TODO(crbug.com/876895): Clean up the LoadRiskData Bind/BindRepeating // usages @@ -208,6 +225,8 @@ // migration on the intermediate dialog or directly from settings page. void LocalCardMigrationManager::ShowMainMigrationDialog() { user_accepted_main_migration_dialog_ = false; + AutofillMetrics::LogLocalCardMigrationPromptMetric( + local_card_migration_origin_, AutofillMetrics::MAIN_DIALOG_SHOWN); // Pops up a larger, modal dialog showing the local cards to be uploaded. client_->ConfirmMigrateLocalCardToCloud( std::move(legal_message_), migratable_credit_cards_,
diff --git a/components/autofill/core/browser/local_card_migration_manager.h b/components/autofill/core/browser/local_card_migration_manager.h index 619be88..7304f83a 100644 --- a/components/autofill/core/browser/local_card_migration_manager.h +++ b/components/autofill/core/browser/local_card_migration_manager.h
@@ -11,6 +11,7 @@ #include "base/strings/string16.h" #include "components/autofill/core/browser/autofill_client.h" +#include "components/autofill/core/browser/autofill_metrics.h" #include "components/autofill/core/browser/payments/payments_client.h" namespace autofill { @@ -178,6 +179,9 @@ // on the main dialog. bool user_accepted_main_migration_dialog_ = false; + // Record the triggering source of the local card migration. + AutofillMetrics::LocalCardMigrationOrigin local_card_migration_origin_; + base::WeakPtrFactory<LocalCardMigrationManager> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationManager);
diff --git a/components/autofill/core/browser/local_card_migration_manager_unittest.cc b/components/autofill/core/browser/local_card_migration_manager_unittest.cc index 1d1d3be..7ad864d 100644 --- a/components/autofill/core/browser/local_card_migration_manager_unittest.cc +++ b/components/autofill/core/browser/local_card_migration_manager_unittest.cc
@@ -69,7 +69,7 @@ autofill_driver_->SetURLRequestContext(request_context_.get()); payments_client_ = new payments::TestPaymentsClient( autofill_driver_->GetURLLoaderFactory(), autofill_client_.GetPrefs(), - autofill_client_.GetIdentityManager()); + autofill_client_.GetIdentityManager(), &personal_data_); credit_card_save_manager_ = new TestCreditCardSaveManager(autofill_driver_.get(), &autofill_client_, payments_client_, &personal_data_); @@ -190,11 +190,17 @@ test::CreateTestCreditCardFormData(&credit_card_form, true, false); FormsSeen(std::vector<FormData>(1, credit_card_form)); + base::HistogramTester histogram_tester; // Edit the data, and submit. EditCreditCardFrom(credit_card_form, "Flo Master", "4111111111111111", "11", test::NextYear().c_str(), "123"); FormSubmitted(credit_card_form); EXPECT_FALSE(local_card_migration_manager_->LocalCardMigrationWasTriggered()); + + // Verify that metrics are correctly logged to the UseOfLocalCard + // sub-histogram. + histogram_tester.ExpectTotalCount( + "Autofill.LocalCardMigrationOrigin.UseOfLocalCard", 0); } // Having any number of local cards on file and using a new card will not @@ -250,11 +256,27 @@ test::CreateTestCreditCardFormData(&credit_card_form, true, false); FormsSeen(std::vector<FormData>(1, credit_card_form)); + base::HistogramTester histogram_tester; // Edit the data, and submit. EditCreditCardFrom(credit_card_form, "Flo Master", "4111111111111111", "11", test::NextYear().c_str(), "123"); FormSubmitted(credit_card_form); EXPECT_TRUE(local_card_migration_manager_->LocalCardMigrationWasTriggered()); + + // Verify that metrics are correctly logged to the UseOfLocalCard + // sub-histogram. + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfLocalCard", + AutofillMetrics::INTERMEDIATE_BUBBLE_SHOWN, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfLocalCard", + AutofillMetrics::INTERMEDIATE_BUBBLE_ACCEPTED, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfLocalCard", + AutofillMetrics::MAIN_DIALOG_SHOWN, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfLocalCard", + AutofillMetrics::MAIN_DIALOG_ACCEPTED, 1); } // Using a local card will not trigger migration even if there are other local @@ -316,11 +338,27 @@ test::CreateTestCreditCardFormData(&credit_card_form, true, false); FormsSeen(std::vector<FormData>(1, credit_card_form)); + base::HistogramTester histogram_tester; // Edit the data, and submit. EditCreditCardFrom(credit_card_form, "Flo Master", "4111111111111111", "11", test::NextYear().c_str(), "123"); FormSubmitted(credit_card_form); EXPECT_TRUE(local_card_migration_manager_->LocalCardMigrationWasTriggered()); + + // Verify that metrics are correctly logged to the UseOfServerCard + // sub-histogram. + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfServerCard", + AutofillMetrics::INTERMEDIATE_BUBBLE_SHOWN, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfServerCard", + AutofillMetrics::INTERMEDIATE_BUBBLE_ACCEPTED, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfServerCard", + AutofillMetrics::MAIN_DIALOG_SHOWN, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.UseOfServerCard", + AutofillMetrics::MAIN_DIALOG_ACCEPTED, 1); } // Using a server card will not trigger migration even if there are other local @@ -352,11 +390,17 @@ test::CreateTestCreditCardFormData(&credit_card_form, true, false); FormsSeen(std::vector<FormData>(1, credit_card_form)); + base::HistogramTester histogram_tester; // Edit the data, and submit. EditCreditCardFrom(credit_card_form, "Flo Master", "4111111111111111", "11", test::NextYear().c_str(), "123"); FormSubmitted(credit_card_form); EXPECT_FALSE(local_card_migration_manager_->LocalCardMigrationWasTriggered()); + + // Verify that metrics are correctly logged to the UseOfServerCard + // sub-histogram. + histogram_tester.ExpectTotalCount( + "Autofill.LocalCardMigrationOrigin.UseOfServerCard", 0); } // Use one local card with more valid local cards available but experiment flag @@ -594,12 +638,28 @@ AddLocalCrediCard(personal_data_, "Flo Master", "4111111111111111", "11", test::NextYear().c_str(), "1"); + base::HistogramTester histogram_tester; // Do the same operation as we bridge back from the settings page. local_card_migration_manager_->GetMigratableCreditCards(); local_card_migration_manager_->AttemptToOfferLocalCardMigration(true); EXPECT_FALSE(local_card_migration_manager_->IntermediatePromptWasShown()); EXPECT_TRUE(local_card_migration_manager_->MainPromptWasShown()); + + // Verify that metrics are correctly logged to the SettingsPage sub-histogram. + // Triggering from settings page won't show intermediate bubble. + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.SettingsPage", + AutofillMetrics::INTERMEDIATE_BUBBLE_SHOWN, 0); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.SettingsPage", + AutofillMetrics::INTERMEDIATE_BUBBLE_ACCEPTED, 0); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.SettingsPage", + AutofillMetrics::MAIN_DIALOG_SHOWN, 1); + histogram_tester.ExpectBucketCount( + "Autofill.LocalCardMigrationOrigin.SettingsPage", + AutofillMetrics::MAIN_DIALOG_ACCEPTED, 1); } // Verify that when triggering from submitted form, intermediate prompt and main
diff --git a/components/autofill/core/browser/payments/full_card_request_unittest.cc b/components/autofill/core/browser/payments/full_card_request_unittest.cc index 5f6f5814..a846f471 100644 --- a/components/autofill/core/browser/payments/full_card_request_unittest.cc +++ b/components/autofill/core/browser/payments/full_card_request_unittest.cc
@@ -81,7 +81,7 @@ autofill_client_.SetPrefs(std::move(pref_service)); payments_client_ = std::make_unique<PaymentsClient>( test_shared_loader_factory_, autofill_client_.GetPrefs(), - autofill_client_.GetIdentityManager()); + autofill_client_.GetIdentityManager(), &personal_data_); request_ = std::make_unique<FullCardRequest>( &autofill_client_, payments_client_.get(), &personal_data_); // Silence the warning from PaymentsClient about matching sync and Payments
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc index b7f6425..d626c67 100644 --- a/components/autofill/core/browser/payments/payments_client.cc +++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -17,6 +17,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" +#include "components/autofill/core/browser/account_info_getter.h" #include "components/autofill/core/browser/autofill_data_model.h" #include "components/autofill/core/browser/autofill_type.h" #include "components/autofill/core/browser/credit_card.h" @@ -226,6 +227,13 @@ std::move(active_chrome_experiments)); } +bool ShouldUseActiveSignedInAccount() { + return base::FeatureList::IsEnabled( + features::kAutofillEnableAccountWalletStorage) || + base::FeatureList::IsEnabled( + features::kAutofillGetPaymentsIdentityFromSync); +} + class UnmaskCardRequest : public PaymentsRequest { public: UnmaskCardRequest(const PaymentsClient::UnmaskRequestDetails& request_details, @@ -618,10 +626,12 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, PrefService* pref_service, identity::IdentityManager* identity_manager, + AccountInfoGetter* account_info_getter, bool is_off_the_record) : url_loader_factory_(url_loader_factory), pref_service_(pref_service), identity_manager_(identity_manager), + account_info_getter_(account_info_getter), is_off_the_record_(is_off_the_record), has_retried_authorization_(false), weak_ptr_factory_(this) {} @@ -834,20 +844,25 @@ if (!invalidate_old && token_fetcher_) return; + DCHECK(account_info_getter_); + OAuth2TokenService::ScopeSet payments_scopes; payments_scopes.insert(kPaymentsOAuth2Scope); + std::string account_id = + ShouldUseActiveSignedInAccount() + ? account_info_getter_->GetActiveSignedInAccountId() + : identity_manager_->GetPrimaryAccountInfo().account_id; if (invalidate_old) { DCHECK(!access_token_.empty()); - identity_manager_->RemoveAccessTokenFromCache( - identity_manager_->GetPrimaryAccountInfo().account_id, payments_scopes, - access_token_); + identity_manager_->RemoveAccessTokenFromCache(account_id, payments_scopes, + access_token_); } access_token_.clear(); - token_fetcher_ = std::make_unique<identity::PrimaryAccountAccessTokenFetcher>( - kTokenFetchId, identity_manager_, payments_scopes, + token_fetcher_ = identity_manager_->CreateAccessTokenFetcherForAccount( + account_id, kTokenFetchId, payments_scopes, base::BindOnce(&PaymentsClient::AccessTokenFetchFinished, base::Unretained(this)), - identity::PrimaryAccountAccessTokenFetcher::Mode::kImmediate); + identity::AccessTokenFetcher::Mode::kImmediate); } void PaymentsClient::SetOAuth2TokenAndStartRequest() {
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h index c0efa42..02d6fca 100644 --- a/components/autofill/core/browser/payments/payments_client.h +++ b/components/autofill/core/browser/payments/payments_client.h
@@ -15,11 +15,11 @@ #include "components/autofill/core/browser/credit_card.h" #include "components/prefs/pref_service.h" #include "google_apis/gaia/google_service_auth_error.h" +#include "services/identity/public/cpp/access_token_fetcher.h" #include "services/identity/public/cpp/access_token_info.h" namespace identity { class IdentityManager; -class PrimaryAccountAccessTokenFetcher; } // namespace identity namespace network { @@ -30,6 +30,7 @@ namespace autofill { +class AccountInfoGetter; class MigratableCreditCard; namespace payments { @@ -110,13 +111,14 @@ // |url_loader_factory| is reference counted so it has no lifetime or // ownership requirements. |pref_service| is used to get the registered - // preference value, |identity_manager|, |unmask_delegate| and |save_delegate| + // preference value, |identity_manager| and |account_info_getter| // must all outlive |this|. Either delegate might be nullptr. // |is_off_the_record| denotes incognito mode. PaymentsClient( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - PrefService* pref_service, - identity::IdentityManager* identity_manager, + PrefService* const pref_service, + identity::IdentityManager* const identity_manager, + AccountInfoGetter* const account_info_getter, bool is_off_the_record = false); virtual ~PaymentsClient(); @@ -218,8 +220,12 @@ // The pref service for this client. PrefService* const pref_service_; + // Provided in constructor; not owned by PaymentsClient. identity::IdentityManager* const identity_manager_; + // Provided in constructor; not owned by PaymentsClient. + AccountInfoGetter* const account_info_getter_; + // The current request. std::unique_ptr<PaymentsRequest> request_; @@ -229,8 +235,8 @@ // The URL loader being used to issue the current request. std::unique_ptr<network::SimpleURLLoader> simple_url_loader_; - // The current OAuth2 token fetcher. - std::unique_ptr<identity::PrimaryAccountAccessTokenFetcher> token_fetcher_; + // The OAuth2 token fetcher for any account. + std::unique_ptr<identity::AccessTokenFetcher> token_fetcher_; // The OAuth2 token, or empty if not fetched. std::string access_token_;
diff --git a/components/autofill/core/browser/payments/payments_client_unittest.cc b/components/autofill/core/browser/payments/payments_client_unittest.cc index 9a926ac..4550d30 100644 --- a/components/autofill/core/browser/payments/payments_client_unittest.cc +++ b/components/autofill/core/browser/payments/payments_client_unittest.cc
@@ -19,6 +19,7 @@ #include "components/autofill/core/browser/credit_card_save_manager.h" #include "components/autofill/core/browser/local_card_migration_manager.h" #include "components/autofill/core/browser/payments/payments_client.h" +#include "components/autofill/core/browser/test_personal_data_manager.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_switches.h" #include "components/prefs/pref_registry_simple.h" @@ -73,9 +74,13 @@ base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_); TestingPrefServiceSimple pref_service_; - client_.reset(new PaymentsClient(test_shared_loader_factory_, - &pref_service_, - identity_test_env_.identity_manager())); + client_ = std::make_unique<PaymentsClient>( + test_shared_loader_factory_, &pref_service_, + identity_test_env_.identity_manager(), &test_personal_data_); + const std::string& account_id = + identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com") + .account_id; + test_personal_data_.SetActiveAccountId(account_id); } void TearDown() override { client_.reset(); } @@ -85,6 +90,11 @@ features::kAutofillSendExperimentIdsInPaymentsRPCs); } + void EnableAutofillGetPaymentsIdentityFromSync() { + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillGetPaymentsIdentityFromSync); + } + void DisableAutofillSendExperimentIdsInPaymentsRPCs() { scoped_feature_list_.InitAndDisableFeature( features::kAutofillSendExperimentIdsInPaymentsRPCs); @@ -136,9 +146,6 @@ // Issue an UnmaskCard request. This requires an OAuth token before starting // the request. void StartUnmasking() { - if (!identity_test_env_.identity_manager()->HasPrimaryAccount()) - identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com"); - PaymentsClient::UnmaskRequestDetails request_details; request_details.billing_customer_number = 111222333444; request_details.card = test::GetMaskedServerCard(); @@ -151,9 +158,6 @@ // Issue a GetUploadDetails request. void StartGettingUploadDetails() { - if (!identity_test_env_.identity_manager()->HasPrimaryAccount()) - identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com"); - client_->GetUploadDetails( BuildTestProfiles(), kAllDetectableValues, std::vector<const char*>(), "language-LOCALE", @@ -165,9 +169,6 @@ // Issue an UploadCard request. This requires an OAuth token before starting // the request. void StartUploading(bool include_cvc) { - if (!identity_test_env_.identity_manager()->HasPrimaryAccount()) - identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com"); - PaymentsClient::UploadRequestDetails request_details; request_details.billing_customer_number = 111222333444; request_details.card = test::GetCreditCard(); @@ -183,9 +184,6 @@ } void StartMigrating(bool uncheck_last_card, bool has_cardholder_name) { - if (!identity_test_env_.identity_manager()->HasPrimaryAccount()) - identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com"); - PaymentsClient::MigrationRequestDetails request_details; request_details.context_token = base::ASCIIToUTF16("context token"); request_details.risk_data = "some risk data"; @@ -245,6 +243,7 @@ base::test::ScopedTaskEnvironment scoped_task_environment_; network::TestURLLoaderFactory test_url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; + TestPersonalDataManager test_personal_data_; std::unique_ptr<PaymentsClient> client_; identity::IdentityTestEnvironment identity_test_env_; @@ -313,6 +312,15 @@ EXPECT_EQ("1234", real_pan_); } +TEST_F(PaymentsClientTest, UnmaskSuccessAccountFromSyncTest) { + EnableAutofillGetPaymentsIdentityFromSync(); + StartUnmasking(); + IssueOAuthToken(); + ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }"); + EXPECT_EQ(AutofillClient::SUCCESS, result_); + EXPECT_EQ("1234", real_pan_); +} + TEST_F(PaymentsClientTest, GetDetailsSuccess) { StartGettingUploadDetails(); ReturnResponse( @@ -355,6 +363,29 @@ std::string::npos); } +TEST_F(PaymentsClientTest, GetUploadAccountFromSyncTest) { + EnableAutofillGetPaymentsIdentityFromSync(); + // Set up a different account. + const std::string& secondary_account_id = + identity_test_env_.MakeAccountAvailable("secondary@gmail.com").account_id; + test_personal_data_.SetActiveAccountId(secondary_account_id); + + StartUploading(/*include_cvc=*/true); + ReturnResponse(net::HTTP_OK, "{}"); + + // Issue a token for the secondary account. + identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + secondary_account_id, "secondary_account_token", + base::Time::Now() + base::TimeDelta::FromDays(10)); + + // Verify the auth header. + std::string auth_header_value; + EXPECT_TRUE(intercepted_headers_.GetHeader( + net::HttpRequestHeaders::kAuthorization, &auth_header_value)) + << intercepted_headers_.ToString(); + EXPECT_EQ("Bearer secondary_account_token", auth_header_value); +} + TEST_F(PaymentsClientTest, GetUploadDetailsVariationsTest) { // Register a trial and variation id, so that there is data in variations // headers. Also, the variations header provider may have been registered to
diff --git a/components/autofill/core/browser/payments/payments_util.cc b/components/autofill/core/browser/payments/payments_util.cc index 96cd68cd..6f18141 100644 --- a/components/autofill/core/browser/payments/payments_util.cc +++ b/components/autofill/core/browser/payments/payments_util.cc
@@ -23,7 +23,9 @@ DCHECK(pref_service); if (base::FeatureList::IsEnabled( - features::kAutofillUsePaymentsCustomerData)) { + features::kAutofillUsePaymentsCustomerData) || + base::FeatureList::IsEnabled( + features::kAutofillEnableAccountWalletStorage)) { // Get billing customer ID from the synced PaymentsCustomerData. PaymentsCustomerData* customer_data = personal_data_manager->GetPaymentsCustomerData();
diff --git a/components/autofill/core/browser/payments/test_payments_client.cc b/components/autofill/core/browser/payments/test_payments_client.cc index 80ae9f5..dc17d426 100644 --- a/components/autofill/core/browser/payments/test_payments_client.cc +++ b/components/autofill/core/browser/payments/test_payments_client.cc
@@ -5,6 +5,7 @@ #include "components/autofill/core/browser/payments/test_payments_client.h" #include "base/strings/utf_string_conversions.h" +#include "components/autofill/core/browser/personal_data_manager.h" #include "services/network/public/cpp/shared_url_loader_factory.h" namespace autofill { @@ -13,8 +14,12 @@ TestPaymentsClient::TestPaymentsClient( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_, PrefService* pref_service, - identity::IdentityManager* identity_manager) - : PaymentsClient(url_loader_factory_, pref_service, identity_manager) {} + identity::IdentityManager* identity_manager, + PersonalDataManager* personal_data_manager) + : PaymentsClient(url_loader_factory_, + pref_service, + identity_manager, + personal_data_manager) {} TestPaymentsClient::~TestPaymentsClient() {}
diff --git a/components/autofill/core/browser/payments/test_payments_client.h b/components/autofill/core/browser/payments/test_payments_client.h index ce84095..f4d991a1 100644 --- a/components/autofill/core/browser/payments/test_payments_client.h +++ b/components/autofill/core/browser/payments/test_payments_client.h
@@ -22,7 +22,8 @@ TestPaymentsClient( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_, PrefService* pref_service, - identity::IdentityManager* identity_manager); + identity::IdentityManager* identity_manager, + PersonalDataManager* personal_data_manager); ~TestPaymentsClient() override;
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 32e3e19..d876068 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -405,6 +405,12 @@ return server_database_; } + // Whether we're currently using the ephemeral account storage for saving + // server cards. + bool IsUsingAccountStorageForServerCards() { + return server_database_ != profile_database_; + } + // Set whether this should use the passed in account storage for server // addresses. If false, this will use the profile_storage. // It's an error to call this if no account storage was passed in at @@ -698,6 +704,16 @@ sync_service_ = nullptr; } +std::string PersonalDataManager::GetActiveSignedInAccountId() const { + // Get the account that is used for Sync (whether it's full Sync or not). + return sync_service_->GetAuthenticatedAccountInfo().account_id; +} + +bool PersonalDataManager::IsSyncFeatureEnabled() const { + return !sync_service_->GetAuthenticatedAccountInfo().IsEmpty() && + !database_helper_->IsUsingAccountStorageForServerCards(); +} + void PersonalDataManager::AddObserver(PersonalDataManagerObserver* observer) { observers_.AddObserver(observer); }
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h index 03c9476eab..649f1767 100644 --- a/components/autofill/core/browser/personal_data_manager.h +++ b/components/autofill/core/browser/personal_data_manager.h
@@ -18,6 +18,7 @@ #include "base/observer_list.h" #include "base/strings/string16.h" #include "build/build_config.h" +#include "components/autofill/core/browser/account_info_getter.h" #include "components/autofill/core/browser/autofill_profile.h" #include "components/autofill/core/browser/credit_card.h" #include "components/autofill/core/browser/field_types.h" @@ -68,7 +69,8 @@ class PersonalDataManager : public KeyedService, public WebDataServiceConsumer, public AutofillWebDataServiceObserverOnUISequence, - public syncer::SyncServiceObserver { + public syncer::SyncServiceObserver, + public AccountInfoGetter { public: explicit PersonalDataManager(const std::string& app_locale); ~PersonalDataManager() override; @@ -108,6 +110,10 @@ void OnStateChanged(syncer::SyncService* sync) override; void OnSyncShutdown(syncer::SyncService* sync) override; + // AccountInfoGetter: + std::string GetActiveSignedInAccountId() const override; + bool IsSyncFeatureEnabled() const override; + // Adds a listener to be notified of PersonalDataManager events. virtual void AddObserver(PersonalDataManagerObserver* observer);
diff --git a/components/autofill/core/browser/proto/server.proto b/components/autofill/core/browser/proto/server.proto index c263df5..d187f4b 100644 --- a/components/autofill/core/browser/proto/server.proto +++ b/components/autofill/core/browser/proto/server.proto
@@ -52,7 +52,7 @@ // This message contains information about the field types in a single form. // It is sent by the toolbar to contribute to the field type statistics. -// Next available id: 30 +// Next available id: 31 message AutofillUploadContents { required string client_version = 1; required fixed64 form_signature = 2; @@ -187,6 +187,26 @@ // Noisifed password length. optional uint32 password_length = 29; // The end of the section of password attributes. + + // Event observed by the password manager which indicated that the form was + // successfully submitted. Corresponds to + // |PasswordForm::SubmissionIndicatorEvent|. + enum SubmissionIndicatorEvent { + NONE = 0; + HTML_FORM_SUBMISSION = 1; + SAME_DOCUMENT_NAVIGATION = 2; + XHR_SUCCEEDED = 3; + FRAME_DETACHED = 4; + DEPRECATED_MANUAL_SAVE = 5; // obsolete + DOM_MUTATION_AFTER_XHR = 6; + PROVISIONALLY_SAVED_FORM_ON_START_PROVISIONAL_LOAD = 7; + DEPRECATED_FILLED_FORM_ON_START_PROVISIONAL_LOAD = 8; // unused + DEPRECATED_FILLED_INPUT_ELEMENTS_ON_START_PROVISIONAL_LOAD = 9; // unused + } + + // The type of the event that was taken as an indication that the form has + // been successfully submitted. + optional SubmissionIndicatorEvent submission_event = 30; } // This proto contains information about the validity of each field in an
diff --git a/components/autofill/core/browser/test_autofill_manager.cc b/components/autofill/core/browser/test_autofill_manager.cc index 4a94e072..c8ac474 100644 --- a/components/autofill/core/browser/test_autofill_manager.cc +++ b/components/autofill/core/browser/test_autofill_manager.cc
@@ -25,7 +25,8 @@ url_loader_factory_(driver->GetURLLoaderFactory()), client_(client) { set_payments_client(new payments::PaymentsClient( - url_loader_factory_, client->GetPrefs(), client->GetIdentityManager())); + url_loader_factory_, client->GetPrefs(), client->GetIdentityManager(), + personal_data)); } TestAutofillManager::TestAutofillManager(
diff --git a/components/autofill/core/browser/test_personal_data_manager.cc b/components/autofill/core/browser/test_personal_data_manager.cc index 583ac99..bf045be 100644 --- a/components/autofill/core/browser/test_personal_data_manager.cc +++ b/components/autofill/core/browser/test_personal_data_manager.cc
@@ -218,6 +218,14 @@ return true; } +bool TestPersonalDataManager::IsSyncFeatureEnabled() const { + return sync_feature_enabled_; +} + +std::string TestPersonalDataManager::GetActiveSignedInAccountId() const { + return account_id_; +} + void TestPersonalDataManager::ClearProfiles() { web_profiles_.clear(); }
diff --git a/components/autofill/core/browser/test_personal_data_manager.h b/components/autofill/core/browser/test_personal_data_manager.h index a9c6974..657f12d 100644 --- a/components/autofill/core/browser/test_personal_data_manager.h +++ b/components/autofill/core/browser/test_personal_data_manager.h
@@ -51,6 +51,8 @@ std::string CountryCodeForCurrentTimezone() const override; void ClearAllLocalData() override; bool IsDataLoaded() const override; + bool IsSyncFeatureEnabled() const override; + std::string GetActiveSignedInAccountId() const override; // Unique to TestPersonalDataManager: @@ -106,6 +108,12 @@ payments_customer_data_ = std::move(customer_data); } + void SetSyncFeatureEnabled(bool enabled) { sync_feature_enabled_ = enabled; } + + void SetActiveAccountId(const std::string& account_id) { + account_id_ = account_id; + } + private: std::string timezone_country_code_; std::string default_country_code_; @@ -115,6 +123,8 @@ base::Optional<bool> autofill_profile_enabled_; base::Optional<bool> autofill_credit_card_enabled_; base::Optional<bool> autofill_wallet_import_enabled_; + bool sync_feature_enabled_; + std::string account_id_; DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); };
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 5c913d0..512bded 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -102,6 +102,11 @@ const base::Feature kAutofillExpandedPopupViews{ "AutofillExpandedPopupViews", base::FEATURE_DISABLED_BY_DEFAULT}; +// When enabled, gets payment identity from sync service instead of +// identity manager. +const base::Feature kAutofillGetPaymentsIdentityFromSync{ + "AutofillGetPaymentsIdentityFromSync", base::FEATURE_DISABLED_BY_DEFAULT}; + // Controls whether Autofill Local Card Migration will show result dialogs. const base::Feature kAutofillLocalCardMigrationShowFeedback{ "AutofillLocalCardMigrationShowFeedback", @@ -140,7 +145,7 @@ // a form if there are signals to suggest that this might a checkout page. const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout{ "AutofillRestrictUnownedFieldsToFormlessCheckout", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kAutofillSaveCardDialogUnlabeledExpirationDate{ "AutofillSaveCardDialogUnlabeledExpirationDate", @@ -273,6 +278,12 @@ const char kCreditCardSigninPromoImpressionLimitParamKey[] = "impression_limit"; +#if defined(OS_ANDROID) +// Controls whether to use modernized style for the Autofill dropdown. +const base::Feature kAutofillRefreshStyleAndroid{ + "AutofillRefreshStyleAndroid", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif // OS_ANDROID + #if defined(OS_MACOSX) const base::Feature kMacViewsAutofillPopup{"MacViewsAutofillPopup", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index e27bd0e5..dd7acd9f 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -39,6 +39,7 @@ extern const base::Feature kAutofillEnforceMinRequiredFieldsForQuery; extern const base::Feature kAutofillEnforceMinRequiredFieldsForUpload; extern const base::Feature kAutofillExpandedPopupViews; +extern const base::Feature kAutofillGetPaymentsIdentityFromSync; extern const base::Feature kAutofillLocalCardMigrationShowFeedback; extern const base::Feature kAutofillManualFallback; extern const base::Feature kAutofillPreferServerNamePredictions; @@ -84,6 +85,10 @@ extern const char kAutofillCreditCardLocalCardMigrationParameterWithoutSettingsPage[]; +#if defined(OS_ANDROID) +extern const base::Feature kAutofillRefreshStyleAndroid; +#endif // OS_ANDROID + #if defined(OS_MACOSX) extern const base::Feature kMacViewsAutofillPopup; #endif // defined(OS_MACOSX)
diff --git a/components/autofill/core/common/password_generation_util.h b/components/autofill/core/common/password_generation_util.h index 40cefd8..98ba6c8 100644 --- a/components/autofill/core/common/password_generation_util.h +++ b/components/autofill/core/common/password_generation_util.h
@@ -71,6 +71,10 @@ // Context menu with generation item was shown. PASSWORD_GENERATION_CONTEXT_MENU_SHOWN, + // The generated password was removed from the field because a credential + // was autofilled. + PASSWORD_DELETED_BY_AUTOFILLING, + // Number of enum entries, used for UMA histogram reporting macros. EVENT_ENUM_COUNT };
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index 8c5255c..80e7db5 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -583,7 +583,7 @@ #pragma mark FormActivityObserver - (void)webState:(web::WebState*)webState - registeredFormActivity:(const web::FormActivityParams&)params { + didRegisterFormActivity:(const web::FormActivityParams&)params { if (![self isAutofillEnabled]) return; @@ -644,7 +644,7 @@ } - (void)webState:(web::WebState*)webState - submittedDocumentWithFormNamed:(const std::string&)formName + didSubmitDocumentWithFormNamed:(const std::string&)formName hasUserGesture:(BOOL)hasUserGesture formInMainFrame:(BOOL)formInMainFrame { if (!formInMainFrame) {
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm index ca73dee..2a8016a 100644 --- a/components/autofill/ios/browser/autofill_agent_unittests.mm +++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -6,8 +6,10 @@ #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" +#include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/popup_item_ids.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_prefs.h" #include "components/autofill/core/common/form_data.h" #import "components/autofill/ios/browser/js_autofill_manager.h" @@ -158,7 +160,10 @@ // Tests that when a user initiated form activity is registered the script to // extract forms is executed. -TEST_F(AutofillAgentTests, CheckIfSuggestionsAvailable_UserInitiatedActivity) { +TEST_F(AutofillAgentTests, CheckIfSuggestionsAvailable_UserInitiatedActivity1) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + autofill::features::kAutofillRestrictUnownedFieldsToFormlessCheckout); [[mock_js_injection_receiver_ expect] executeJavaScript:@"__gCrWeb.autofill.extractForms(1, true);" completionHandler:[OCMArg any]]; @@ -177,6 +182,30 @@ EXPECT_OCMOCK_VERIFY(mock_js_injection_receiver_); } +// Tests that when a user initiated form activity is registered the script to +// extract forms is executed. +TEST_F(AutofillAgentTests, CheckIfSuggestionsAvailable_UserInitiatedActivity2) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + autofill::features::kAutofillRestrictUnownedFieldsToFormlessCheckout); + [[mock_js_injection_receiver_ expect] + executeJavaScript:@"__gCrWeb.autofill.extractForms(1, false);" + completionHandler:[OCMArg any]]; + [autofill_agent_ checkIfSuggestionsAvailableForForm:@"form" + fieldName:@"address" + fieldIdentifier:@"address" + fieldType:@"text" + type:@"focus" + typedValue:@"" + isMainFrame:YES + hasUserGesture:YES + webState:&test_web_state_ + completionHandler:nil]; + test_web_state_.WasShown(); + + EXPECT_OCMOCK_VERIFY(mock_js_injection_receiver_); +} + // Tests that when a non user initiated form activity is registered the // completion callback passed to the call to check if suggestions are available // is invoked with no suggestions.
diff --git a/components/autofill/ios/form_util/form_activity_observer.h b/components/autofill/ios/form_util/form_activity_observer.h index 538d616..a0c70101 100644 --- a/components/autofill/ios/form_util/form_activity_observer.h +++ b/components/autofill/ios/form_util/form_activity_observer.h
@@ -27,24 +27,14 @@ // Called when the user is typing on a form field in the main frame or in a // same-origin iframe. |params.input_missing| is indicating if there is any // error when parsing the form field information. - // TODO(crbug.com/823285): during the transition from WebStateObserver - // to FormActivityObserver, some class will inherit from both interface - // so the method need to use a different name. Once the transition is - // complete and the methods removed from WebStateObserver, this method - // will be renamed to FormActivityRegistered. - virtual void OnFormActivity(web::WebState* web_state, - const web::FormActivityParams& params) {} + virtual void FormActivityRegistered(web::WebState* web_state, + const web::FormActivityParams& params) {} // Called on form submission in the main frame or in a same-origin iframe. // |has_user_gesture| is true if the user interacted with the page. // |form_in_main_frame| is true if the submitted form is hosted in the main // frame. - // TODO(crbug.com/823285): during the transition from WebStateObserver - // to FormActivityObserver, some class will inherit from both interface - // so the method need to use a different name. Once the transition is - // complete and the methods removed from WebStateObserver, this method - // will be renamed to DocumentSubmitted. - virtual void DidSubmitDocument(web::WebState* web_state, + virtual void DocumentSubmitted(web::WebState* web_state, const std::string& form_name, bool has_user_gesture, bool form_in_main_frame) {}
diff --git a/components/autofill/ios/form_util/form_activity_observer_bridge.h b/components/autofill/ios/form_util/form_activity_observer_bridge.h index 382788f..a2689cfd 100644 --- a/components/autofill/ios/form_util/form_activity_observer_bridge.h +++ b/components/autofill/ios/form_util/form_activity_observer_bridge.h
@@ -13,22 +13,12 @@ @protocol FormActivityObserver<NSObject> @optional // Invoked by WebStateObserverBridge::FormActivity. -// TODO(crbug.com/823285): during the transition from CRWWebStateObserver -// to FormActivityObserver, some class will implement from both protocols -// so the method need to use a different name. Once the transition is -// complete and the methods removed from CRWWebStateObserver, this method -// will be renamed to didRegisterFormActivity. - (void)webState:(web::WebState*)webState - registeredFormActivity:(const web::FormActivityParams&)params; + didRegisterFormActivity:(const web::FormActivityParams&)params; // Invoked by WebStateObserverBridge::DidSubmitDocument. -// TODO(crbug.com/823285): during the transition from CRWWebStateObserver -// to FormActivityObserver, some class will implement from both protocols -// so the method need to use a different name. Once the transition is -// complete and the methods removed from CRWWebStateObserver, this method -// will be renamed to didSubmitDocumentWithFormNamed. - (void)webState:(web::WebState*)webState - submittedDocumentWithFormNamed:(const std::string&)formName + didSubmitDocumentWithFormNamed:(const std::string&)formName hasUserGesture:(BOOL)hasUserGesture formInMainFrame:(BOOL)formInMainFrame; @@ -51,10 +41,10 @@ ~FormActivityObserverBridge() override; // FormActivityObserver overrides: - void OnFormActivity(web::WebState* web_state, - const web::FormActivityParams& params) override; + void FormActivityRegistered(web::WebState* web_state, + const web::FormActivityParams& params) override; - void DidSubmitDocument(web::WebState* web_state, + void DocumentSubmitted(web::WebState* web_state, const std::string& form_name, bool has_user_gesture, bool form_in_main_frame) override;
diff --git a/components/autofill/ios/form_util/form_activity_observer_bridge.mm b/components/autofill/ios/form_util/form_activity_observer_bridge.mm index 0e8bb73..757ac11 100644 --- a/components/autofill/ios/form_util/form_activity_observer_bridge.mm +++ b/components/autofill/ios/form_util/form_activity_observer_bridge.mm
@@ -24,25 +24,26 @@ ->RemoveObserver(this); } -void FormActivityObserverBridge::OnFormActivity( +void FormActivityObserverBridge::FormActivityRegistered( web::WebState* web_state, const web::FormActivityParams& params) { DCHECK_EQ(web_state, web_state_); - if ([owner_ respondsToSelector:@selector(webState:registeredFormActivity:)]) { - [owner_ webState:web_state registeredFormActivity:params]; + if ([owner_ + respondsToSelector:@selector(webState:didRegisterFormActivity:)]) { + [owner_ webState:web_state didRegisterFormActivity:params]; } } -void FormActivityObserverBridge::DidSubmitDocument(web::WebState* web_state, +void FormActivityObserverBridge::DocumentSubmitted(web::WebState* web_state, const std::string& form_name, bool has_user_gesture, bool form_in_main_frame) { DCHECK_EQ(web_state, web_state_); if ([owner_ respondsToSelector:@selector - (webState:submittedDocumentWithFormNamed:hasUserGesture + (webState:didSubmitDocumentWithFormNamed:hasUserGesture :formInMainFrame:)]) { [owner_ webState:web_state - submittedDocumentWithFormNamed:form_name + didSubmitDocumentWithFormNamed:form_name hasUserGesture:has_user_gesture formInMainFrame:form_in_main_frame]; }
diff --git a/components/autofill/ios/form_util/form_activity_observer_bridge_unittest.mm b/components/autofill/ios/form_util/form_activity_observer_bridge_unittest.mm index 6ea9477..6793865 100644 --- a/components/autofill/ios/form_util/form_activity_observer_bridge_unittest.mm +++ b/components/autofill/ios/form_util/form_activity_observer_bridge_unittest.mm
@@ -23,10 +23,10 @@ @implementation FakeFormActivityObserver { // Arguments passed to - // |webState:submittedDocumentWithFormNamed:hasUserGesture:formInMainFrame:|. + // |webState:didSubmitDocumentWithFormNamed:hasUserGesture:formInMainFrame:|. std::unique_ptr<autofill::TestSubmitDocumentInfo> _submitDocumentInfo; // Arguments passed to - // |webState:registeredFormActivity:|. + // |webState:didRegisterFormActivity:|. std::unique_ptr<autofill::TestFormActivityInfo> _formActivityInfo; } @@ -39,7 +39,7 @@ } - (void)webState:(web::WebState*)webState - submittedDocumentWithFormNamed:(const std::string&)formName + didSubmitDocumentWithFormNamed:(const std::string&)formName hasUserGesture:(BOOL)hasUserGesture formInMainFrame:(BOOL)formInMainFrame { _submitDocumentInfo = std::make_unique<autofill::TestSubmitDocumentInfo>(); @@ -50,7 +50,7 @@ } - (void)webState:(web::WebState*)webState - registeredFormActivity:(const web::FormActivityParams&)params { + didRegisterFormActivity:(const web::FormActivityParams&)params { _formActivityInfo = std::make_unique<autofill::TestFormActivityInfo>(); _formActivityInfo->web_state = webState; _formActivityInfo->form_activity = params; @@ -77,7 +77,7 @@ std::string kTestFormName("form-name"); bool has_user_gesture = true; bool form_in_main_frame = true; - observer_bridge_.DidSubmitDocument(&test_web_state_, kTestFormName, + observer_bridge_.DocumentSubmitted(&test_web_state_, kTestFormName, has_user_gesture, form_in_main_frame); ASSERT_TRUE([observer_ submitDocumentInfo]); EXPECT_EQ(&test_web_state_, [observer_ submitDocumentInfo]->web_state); @@ -98,7 +98,7 @@ params.type = "type"; params.value = "value"; params.input_missing = true; - observer_bridge_.OnFormActivity(&test_web_state_, params); + observer_bridge_.FormActivityRegistered(&test_web_state_, params); ASSERT_TRUE([observer_ formActivityInfo]); EXPECT_EQ(&test_web_state_, [observer_ formActivityInfo]->web_state); EXPECT_EQ(params.form_name,
diff --git a/components/autofill/ios/form_util/form_activity_tab_helper.mm b/components/autofill/ios/form_util/form_activity_tab_helper.mm index 0a30ff6..7311c45 100644 --- a/components/autofill/ios/form_util/form_activity_tab_helper.mm +++ b/components/autofill/ios/form_util/form_activity_tab_helper.mm
@@ -96,7 +96,7 @@ params.is_main_frame = form_in_main_frame; for (auto& observer : observers_) - observer.OnFormActivity(web_state_, params); + observer.FormActivityRegistered(web_state_, params); return true; } @@ -118,7 +118,7 @@ has_user_gesture || [web_state_->GetWebViewProxy() keyboardAccessory]; for (auto& observer : observers_) - observer.DidSubmitDocument(web_state_, form_name, submitted_by_user, + observer.DocumentSubmitted(web_state_, form_name, submitted_by_user, form_in_main_frame); return true; }
diff --git a/components/autofill/ios/form_util/test_form_activity_observer.h b/components/autofill/ios/form_util/test_form_activity_observer.h index c22d9221..662c561 100644 --- a/components/autofill/ios/form_util/test_form_activity_observer.h +++ b/components/autofill/ios/form_util/test_form_activity_observer.h
@@ -38,13 +38,13 @@ // Arguments passed to |FormActivityRegistered|. TestFormActivityInfo* form_activity_info(); - void DidSubmitDocument(web::WebState* web_state, + void DocumentSubmitted(web::WebState* web_state, const std::string& form_name, bool has_user_gesture, bool form_in_main_frame) override; - void OnFormActivity(web::WebState* web_state, - const web::FormActivityParams& params) override; + void FormActivityRegistered(web::WebState* web_state, + const web::FormActivityParams& params) override; private: web::WebState* web_state_ = nullptr;
diff --git a/components/autofill/ios/form_util/test_form_activity_observer.mm b/components/autofill/ios/form_util/test_form_activity_observer.mm index 0af0e68..71fb2c61 100644 --- a/components/autofill/ios/form_util/test_form_activity_observer.mm +++ b/components/autofill/ios/form_util/test_form_activity_observer.mm
@@ -24,7 +24,7 @@ return form_activity_info_.get(); } -void TestFormActivityObserver::DidSubmitDocument(web::WebState* web_state, +void TestFormActivityObserver::DocumentSubmitted(web::WebState* web_state, const std::string& form_name, bool has_user_gesture, bool form_in_main_frame) { @@ -36,7 +36,7 @@ submit_document_info_->form_in_main_frame = form_in_main_frame; } -void TestFormActivityObserver::OnFormActivity( +void TestFormActivityObserver::FormActivityRegistered( web::WebState* web_state, const web::FormActivityParams& params) { ASSERT_EQ(web_state_, web_state);
diff --git a/components/autofill/ios/form_util/test_form_activity_tab_helper.h b/components/autofill/ios/form_util/test_form_activity_tab_helper.h index 010ad0a1e..efcce4f 100644 --- a/components/autofill/ios/form_util/test_form_activity_tab_helper.h +++ b/components/autofill/ios/form_util/test_form_activity_tab_helper.h
@@ -21,10 +21,10 @@ explicit TestFormActivityTabHelper(web::WebState* web_state); ~TestFormActivityTabHelper(); - void OnFormActivity(const web::FormActivityParams& params); - void OnDocumentSubmitted(const std::string& form_name, - bool has_user_gesture, - bool form_in_main_frame); + void FormActivityRegistered(const web::FormActivityParams& params); + void DocumentSubmitted(const std::string& form_name, + bool has_user_gesture, + bool form_in_main_frame); private: web::WebState* web_state_ = nullptr;
diff --git a/components/autofill/ios/form_util/test_form_activity_tab_helper.mm b/components/autofill/ios/form_util/test_form_activity_tab_helper.mm index 2aecd54..8de4c58 100644 --- a/components/autofill/ios/form_util/test_form_activity_tab_helper.mm +++ b/components/autofill/ios/form_util/test_form_activity_tab_helper.mm
@@ -20,23 +20,22 @@ TestFormActivityTabHelper::~TestFormActivityTabHelper() {} -void TestFormActivityTabHelper::OnFormActivity( +void TestFormActivityTabHelper::FormActivityRegistered( web::FormActivityParams const& params) { autofill::FormActivityTabHelper* form_activity_tab_helper = autofill::FormActivityTabHelper::GetOrCreateForWebState(web_state_); for (auto& observer : form_activity_tab_helper->observers_) { - observer.OnFormActivity(web_state_, params); + observer.FormActivityRegistered(web_state_, params); } } -void TestFormActivityTabHelper::OnDocumentSubmitted( - const std::string& form_name, - bool has_user_gesture, - bool form_in_main_frame) { +void TestFormActivityTabHelper::DocumentSubmitted(const std::string& form_name, + bool has_user_gesture, + bool form_in_main_frame) { autofill::FormActivityTabHelper* form_activity_tab_helper = autofill::FormActivityTabHelper::GetOrCreateForWebState(web_state_); for (auto& observer : form_activity_tab_helper->observers_) { - observer.DidSubmitDocument(web_state_, form_name, has_user_gesture, + observer.DocumentSubmitted(web_state_, form_name, has_user_gesture, form_in_main_frame); } }
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn index 0a71a5e..8fd4fd2 100644 --- a/components/autofill_assistant/browser/BUILD.gn +++ b/components/autofill_assistant/browser/BUILD.gn
@@ -26,6 +26,7 @@ "actions/use_card_action.h", "actions/wait_for_dom_action.cc", "actions/wait_for_dom_action.h", + "client.h", "client_memory.h", "controller.cc", "controller.h", @@ -38,6 +39,8 @@ "script_executor_delegate.h", "script_precondition.cc", "script_precondition.h", + "script_tracker.cc", + "script_tracker.h", "service.cc", "service.h", "ui_controller.h", @@ -68,6 +71,7 @@ "mock_web_controller.cc", "mock_web_controller.h", "script_executor_unittest.cc", + "script_tracker_unittest.cc", ] deps = [
diff --git a/components/autofill_assistant/browser/DEPS b/components/autofill_assistant/browser/DEPS index 5b9f67fe..a01dc886 100644 --- a/components/autofill_assistant/browser/DEPS +++ b/components/autofill_assistant/browser/DEPS
@@ -6,4 +6,4 @@ "+google_apis", "+net", "+services/network/public/cpp", -] \ No newline at end of file +]
diff --git a/components/autofill_assistant/browser/client.h b/components/autofill_assistant/browser/client.h new file mode 100644 index 0000000..3d68e14 --- /dev/null +++ b/components/autofill_assistant/browser/client.h
@@ -0,0 +1,29 @@ +// 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_AUTOFILL_ASSISTANT_BROWSER_CLIENT_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_H_ + +#include <string> + +namespace autofill_assistant { +class UiController; + +// A client interface that needs to be supplied to the controller by the +// embedder. +class Client { + public: + virtual ~Client() = default; + + // Returns the API key to be used for requests to the backend. + virtual std::string GetApiKey() = 0; + + // Returns a UiController. + virtual UiController* GetUiController() = 0; + + protected: + Client() = default; +}; +} // namespace autofill_assistant +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_H_
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc index 55781a0..cd7c2e3 100644 --- a/components/autofill_assistant/browser/controller.cc +++ b/components/autofill_assistant/browser/controller.cc
@@ -4,7 +4,11 @@ #include "components/autofill_assistant/browser/controller.h" +#include <utility> +#include <vector> + #include "components/autofill_assistant/browser/protocol_utils.h" +#include "components/autofill_assistant/browser/ui_controller.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -12,8 +16,8 @@ // static void Controller::CreateAndStartForWebContents( content::WebContents* web_contents, - std::unique_ptr<UiController> ui_controller) { - new Controller(web_contents, std::move(ui_controller)); + std::unique_ptr<Client> client) { + new Controller(web_contents, std::move(client)); } Service* Controller::GetService() { @@ -21,7 +25,7 @@ } UiController* Controller::GetUiController() { - return ui_controller_.get(); + return client_->GetUiController(); } WebController* Controller::GetWebController() { @@ -33,13 +37,15 @@ } Controller::Controller(content::WebContents* web_contents, - std::unique_ptr<UiController> ui_controller) + std::unique_ptr<Client> client) : content::WebContentsObserver(web_contents), - ui_controller_(std::move(ui_controller)), + client_(std::move(client)), web_controller_(WebController::CreateForWebContents(web_contents)), - service_(std::make_unique<Service>(web_contents->GetBrowserContext())) { - ui_controller_->SetUiDelegate(this); - ui_controller_->ShowOverlay(); + service_(std::make_unique<Service>(client_->GetApiKey(), + web_contents->GetBrowserContext())), + script_tracker_(std::make_unique<ScriptTracker>(this, this)) { + GetUiController()->SetUiDelegate(this); + GetUiController()->ShowOverlay(); if (!web_contents->IsLoading()) { GetScripts(); } @@ -60,14 +66,14 @@ // TODO(crbug.com/806868): Terminate Autofill Assistant. return; } - bool parse_result = ProtocolUtils::ParseScripts(response, &scripts_); + std::vector<std::unique_ptr<Script>> scripts; + bool parse_result = ProtocolUtils::ParseScripts(response, &scripts); DCHECK(parse_result); - // TODO(crbug.com/806868): Present assistant scripts if necessary or auto - // start a script. + script_tracker_->SetAndCheckScripts(std::move(scripts)); } void Controller::OnClickOverlay() { - ui_controller_->HideOverlay(); + GetUiController()->HideOverlay(); // TODO(crbug.com/806868): Stop executing scripts. } @@ -75,6 +81,11 @@ delete this; } +void Controller::OnRunnableScriptsChanged() { + // TODO(crbug.com/806868): Take the set of runnable script from the tracker + // and make them available for selection. Run the selected script. +} + void Controller::DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) { // TODO(crbug.com/806868): Find a better time to get and update assistant
diff --git a/components/autofill_assistant/browser/controller.h b/components/autofill_assistant/browser/controller.h index 10229543..e07de231 100644 --- a/components/autofill_assistant/browser/controller.h +++ b/components/autofill_assistant/browser/controller.h
@@ -5,11 +5,15 @@ #ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CONTROLLER_H_ #define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CONTROLLER_H_ +#include <memory> +#include <string> + +#include "components/autofill_assistant/browser/client.h" #include "components/autofill_assistant/browser/client_memory.h" #include "components/autofill_assistant/browser/script.h" #include "components/autofill_assistant/browser/script_executor_delegate.h" +#include "components/autofill_assistant/browser/script_tracker.h" #include "components/autofill_assistant/browser/service.h" -#include "components/autofill_assistant/browser/ui_controller.h" #include "components/autofill_assistant/browser/ui_delegate.h" #include "components/autofill_assistant/browser/web_controller.h" #include "content/public/browser/web_contents_observer.h" @@ -25,11 +29,11 @@ // the web contents is being destroyed. class Controller : public ScriptExecutorDelegate, public UiDelegate, + public ScriptTracker::Listener, private content::WebContentsObserver { public: - static void CreateAndStartForWebContents( - content::WebContents* web_contents, - std::unique_ptr<UiController> ui_controller); + static void CreateAndStartForWebContents(content::WebContents* web_contents, + std::unique_ptr<Client> client); // Overrides ScriptExecutorDelegate: Service* GetService() override; @@ -39,7 +43,7 @@ private: Controller(content::WebContents* web_contents, - std::unique_ptr<UiController> ui_controller); + std::unique_ptr<Client> client); ~Controller() override; void GetScripts(); @@ -49,15 +53,18 @@ void OnClickOverlay() override; void OnDestroy() override; + // Overrides ScriptTracker::Listener: + void OnRunnableScriptsChanged() override; + // Overrides content::WebContentsObserver: void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) override; void WebContentsDestroyed() override; - std::unique_ptr<UiController> ui_controller_; + std::unique_ptr<Client> client_; std::unique_ptr<WebController> web_controller_; std::unique_ptr<Service> service_; - std::map<Script*, std::unique_ptr<Script>> scripts_; + std::unique_ptr<ScriptTracker> script_tracker_; ClientMemory memory_; DISALLOW_COPY_AND_ASSIGN(Controller);
diff --git a/components/autofill_assistant/browser/mock_service.cc b/components/autofill_assistant/browser/mock_service.cc index 6359cb0..f5daf325 100644 --- a/components/autofill_assistant/browser/mock_service.cc +++ b/components/autofill_assistant/browser/mock_service.cc
@@ -6,7 +6,7 @@ namespace autofill_assistant { -MockService::MockService() : Service(nullptr) {} +MockService::MockService() : Service("api_key", nullptr) {} MockService::~MockService() {} } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc index 565cb9f..8822e62 100644 --- a/components/autofill_assistant/browser/protocol_utils.cc +++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -35,8 +35,7 @@ // static bool ProtocolUtils::ParseScripts( const std::string& response, - std::map<Script*, std::unique_ptr<Script>>* scripts) { - DCHECK(!response.empty()); + std::vector<std::unique_ptr<Script>>* scripts) { DCHECK(scripts); SupportsScriptResponseProto response_proto; @@ -45,14 +44,15 @@ return false; } + scripts->clear(); for (const auto& script_proto : response_proto.scripts()) { auto script = std::make_unique<Script>(); - script->path = script_proto.path(); + script->handle.path = script_proto.path(); if (script_proto.has_presentation()) { const auto& presentation = script_proto.presentation(); if (presentation.has_name()) - script->name = presentation.name(); + script->handle.name = presentation.name(); if (presentation.has_precondition()) { std::vector<std::vector<std::string>> elements_exist; @@ -71,8 +71,7 @@ } } } - - (*scripts)[script.get()] = std::move(script); + scripts->emplace_back(std::move(script)); } return true;
diff --git a/components/autofill_assistant/browser/protocol_utils.h b/components/autofill_assistant/browser/protocol_utils.h index bdc16ae..8c1eb759 100644 --- a/components/autofill_assistant/browser/protocol_utils.h +++ b/components/autofill_assistant/browser/protocol_utils.h
@@ -31,7 +31,7 @@ // Parsed assistant scripts are returned through |scripts|, which // should not be nullptr. Return false if parse failed, otherwise return true. static bool ParseScripts(const std::string& response, - std::map<Script*, std::unique_ptr<Script>>* scripts); + std::vector<std::unique_ptr<Script>>* scripts); // Create initial request to get script actions for the given |script_path|. static std::string CreateInitialScriptActionsRequest(
diff --git a/components/autofill_assistant/browser/script.cc b/components/autofill_assistant/browser/script.cc index beba33be..f8ef64e 100644 --- a/components/autofill_assistant/browser/script.cc +++ b/components/autofill_assistant/browser/script.cc
@@ -6,6 +6,10 @@ namespace autofill_assistant { +ScriptHandle::ScriptHandle() = default; + +ScriptHandle::~ScriptHandle() = default; + Script::Script() = default; Script::~Script() = default;
diff --git a/components/autofill_assistant/browser/script.h b/components/autofill_assistant/browser/script.h index 1ca9dbe..511d73e 100644 --- a/components/autofill_assistant/browser/script.h +++ b/components/autofill_assistant/browser/script.h
@@ -11,13 +11,21 @@ namespace autofill_assistant { +// Minimal information about a script necessary to display and run it. +struct ScriptHandle { + ScriptHandle(); + ~ScriptHandle(); + + std::string name; + std::string path; +}; + // Script represents a sequence of actions. struct Script { Script(); ~Script(); - std::string name; - std::string path; + ScriptHandle handle; std::unique_ptr<ScriptPrecondition> precondition; };
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc index e49b9e9..b8cb890c 100644 --- a/components/autofill_assistant/browser/script_executor.cc +++ b/components/autofill_assistant/browser/script_executor.cc
@@ -18,9 +18,9 @@ namespace autofill_assistant { -ScriptExecutor::ScriptExecutor(Script* script, ScriptExecutorDelegate* delegate) - : script_(script), delegate_(delegate), weak_ptr_factory_(this) { - DCHECK(script_); +ScriptExecutor::ScriptExecutor(const std::string& script_path, + ScriptExecutorDelegate* delegate) + : script_path_(script_path), delegate_(delegate), weak_ptr_factory_(this) { DCHECK(delegate_); } ScriptExecutor::~ScriptExecutor() {} @@ -30,8 +30,8 @@ DCHECK(delegate_->GetService()); delegate_->GetService()->GetActions( - script_->path, base::BindOnce(&ScriptExecutor::OnGetActions, - weak_ptr_factory_.GetWeakPtr())); + script_path_, base::BindOnce(&ScriptExecutor::OnGetActions, + weak_ptr_factory_.GetWeakPtr())); } void ScriptExecutor::ShowStatusMessage(const std::string& message) {
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h index d7a5bc80..19cf354 100644 --- a/components/autofill_assistant/browser/script_executor.h +++ b/components/autofill_assistant/browser/script_executor.h
@@ -22,9 +22,9 @@ // Class to execute an assistant script. class ScriptExecutor : public ActionDelegate { public: - // |script| and |delegate| should outlive this object and should not be - // nullptr. - ScriptExecutor(Script* script, ScriptExecutorDelegate* delegate); + // |delegate| should outlive this object and should not be nullptr. + ScriptExecutor(const std::string& script_path, + ScriptExecutorDelegate* delegate); ~ScriptExecutor() override; using RunScriptCallback = base::OnceCallback<void(bool)>; @@ -55,7 +55,7 @@ void GetNextActions(); void OnProcessedAction(std::unique_ptr<Action> action, bool status); - Script* script_; + std::string script_path_; ScriptExecutorDelegate* delegate_; RunScriptCallback callback_;
diff --git a/components/autofill_assistant/browser/script_executor_unittest.cc b/components/autofill_assistant/browser/script_executor_unittest.cc index f64ba11..6f603020 100644 --- a/components/autofill_assistant/browser/script_executor_unittest.cc +++ b/components/autofill_assistant/browser/script_executor_unittest.cc
@@ -28,10 +28,7 @@ class ScriptExecutorTest : public testing::Test, public ScriptExecutorDelegate { public: void SetUp() override { - script_.name = "script name"; - script_.path = "script path"; - - executor_ = std::make_unique<ScriptExecutor>(&script_, this); + executor_ = std::make_unique<ScriptExecutor>("script path", this); // In this test, "tell" actions always succeed and "click" actions always // fail.
diff --git a/components/autofill_assistant/browser/script_tracker.cc b/components/autofill_assistant/browser/script_tracker.cc new file mode 100644 index 0000000..39602ed --- /dev/null +++ b/components/autofill_assistant/browser/script_tracker.cc
@@ -0,0 +1,141 @@ +// 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/autofill_assistant/browser/script_tracker.h" + +#include <utility> + +#include "base/bind.h" +#include "components/autofill_assistant/browser/script.h" +#include "components/autofill_assistant/browser/script_executor.h" + +namespace autofill_assistant { + +ScriptTracker::ScriptTracker(ScriptExecutorDelegate* delegate, + ScriptTracker::Listener* listener) + : delegate_(delegate), listener_(listener), weak_ptr_factory_(this) { + DCHECK(delegate_); + DCHECK(listener_); +} + +ScriptTracker::~ScriptTracker() = default; + +void ScriptTracker::SetAndCheckScripts( + std::vector<std::unique_ptr<Script>> scripts) { + ClearAvailableScripts(); + for (auto& script : scripts) { + available_scripts_[script.get()] = std::move(script); + } + CheckScripts(); +} + +void ScriptTracker::CheckScripts() { + if (pending_precondition_check_count_ > 0) + return; + DCHECK_EQ(pending_precondition_check_count_, 0); + DCHECK(pending_runnable_scripts_.empty()); + + std::vector<Script*> scripts_to_check; + for (const auto& entry : available_scripts_) { + Script* script = entry.first; + if (executed_scripts_.find(script->handle.path) == + executed_scripts_.end() && + script->precondition) { + scripts_to_check.emplace_back(script); + } + } + + // pending_precondition_check_count_ lets OnPreconditionCheck know when to + // stop. It must be set before the callback can possibly be run. + pending_precondition_check_count_ = scripts_to_check.size(); + if (pending_precondition_check_count_ == 0) { + // Possibly report an empty set of runnable scripts. + UpdateRunnableScriptsIfNecessary(); + } else { + for (Script* script : scripts_to_check) { + script->precondition->Check( + delegate_->GetWebController(), + base::BindOnce(&ScriptTracker::OnPreconditionCheck, + weak_ptr_factory_.GetWeakPtr(), script)); + } + } +} + +void ScriptTracker::ExecuteScript(const std::string& script_path, + base::OnceCallback<void(bool)> callback) { + if (running()) { + std::move(callback).Run(false); + return; + } + + DCHECK(executed_scripts_.find(script_path) == executed_scripts_.end()); + executed_scripts_.insert(script_path); + executor_ = std::make_unique<ScriptExecutor>(script_path, delegate_); + executor_->Run(base::BindOnce(&ScriptTracker::OnScriptRun, + weak_ptr_factory_.GetWeakPtr(), + std::move(callback))); +} + +void ScriptTracker::OnScriptRun( + base::OnceCallback<void(bool)> original_callback, + bool success) { + executor_.reset(); + std::move(original_callback).Run(success); +} + +void ScriptTracker::UpdateRunnableScriptsIfNecessary() { + DCHECK_EQ(pending_precondition_check_count_, 0); + bool runnables_changed = RunnablesHaveChanged(); + if (runnables_changed) { + runnable_scripts_.clear(); + for (Script* script : pending_runnable_scripts_) { + runnable_scripts_.push_back(script->handle); + } + // TODO(crbug.com/806868): Sort runnable scripts by priority. + } + pending_runnable_scripts_.clear(); + + if (runnables_changed) + listener_->OnRunnableScriptsChanged(); +} + +bool ScriptTracker::RunnablesHaveChanged() { + if (runnable_scripts_.size() != pending_runnable_scripts_.size()) + return true; + + std::set<std::string> pending_paths; + for (Script* script : pending_runnable_scripts_) { + pending_paths.insert(script->handle.path); + } + std::set<std::string> current_paths; + for (const auto& handle : runnable_scripts_) { + current_paths.insert(handle.path); + } + return pending_paths != current_paths; +} + +void ScriptTracker::OnPreconditionCheck(Script* script, + bool met_preconditions) { + if (available_scripts_.find(script) == available_scripts_.end()) { + // Result is not relevant anymore. + return; + } + + if (met_preconditions) + pending_runnable_scripts_.push_back(script); + pending_precondition_check_count_--; + if (pending_precondition_check_count_ > 0) + return; + UpdateRunnableScriptsIfNecessary(); +} + +void ScriptTracker::ClearAvailableScripts() { + available_scripts_.clear(); + // Clearing available_scripts_ has cancelled any pending precondition checks, + // ending them. + pending_precondition_check_count_ = 0; + pending_runnable_scripts_.clear(); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/script_tracker.h b/components/autofill_assistant/browser/script_tracker.h new file mode 100644 index 0000000..e0dd1f8 --- /dev/null +++ b/components/autofill_assistant/browser/script_tracker.h
@@ -0,0 +1,121 @@ +// 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_AUTOFILL_ASSISTANT_BROWSER_SCRIPT_TRACKER_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_SCRIPT_TRACKER_H_ + +#include <map> +#include <memory> +#include <set> +#include <string> +#include <vector> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "components/autofill_assistant/browser/script.h" +#include "components/autofill_assistant/browser/script_executor.h" + +namespace autofill_assistant { +class ScriptExecutorDelegate; +class ScriptTrackerTest; + +// The script tracker keeps track of which scripts are available, which are +// running, which have run, which are runnable whose preconditions are met. +// +// User of this class is responsible for retrieving and passing scripts to the +// tracker and letting the tracker know about changes to the DOM. +class ScriptTracker { + public: + // Listens to changes on the ScriptTracker state. + class Listener { + public: + virtual ~Listener() = default; + + // Called when the set of runnable scripts have changed. + virtual void OnRunnableScriptsChanged() = 0; + }; + + // |delegate| and |listener| should outlive this object and should not be + // nullptr. + ScriptTracker(ScriptExecutorDelegate* delegate, + ScriptTracker::Listener* listener); + + ~ScriptTracker(); + + // Updates the set of available |scripts| and check them. + void SetAndCheckScripts(std::vector<std::unique_ptr<Script>> scripts); + + // Run the preconditions on the current set of scripts, and possibly update + // the set of runnable scripts. + void CheckScripts(); + + // Runs a script and reports, when the script has ended, whether the run was + // successful. Fails immediately if a script is already running. + // + // Scripts that are already executed won't be considered runnable anymore. + // Call CheckScripts to refresh the set of runnable script after script + // execution. + void ExecuteScript(const std::string& path, + base::OnceCallback<void(bool)> callback); + + // Checks whether a script is currently running. There can be at most one + // script running at a time. + bool running() const { return executor_ != nullptr; } + + private: + friend ScriptTrackerTest; + + // Returns a set of scripts that can be run, according to the last round of + // checks. + const std::vector<ScriptHandle>& runnable_scripts() const { + return runnable_scripts_; + } + + void OnScriptRun(base::OnceCallback<void(bool)> original_callback, + bool success); + void UpdateRunnableScriptsIfNecessary(); + + // Returns true if |runnable_| should be updated. + bool RunnablesHaveChanged(); + void OnPreconditionCheck(Script* script, bool met_preconditions); + void ClearAvailableScripts(); + + ScriptExecutorDelegate* const delegate_; + ScriptTracker::Listener* const listener_; + + // Paths and names of scripts known to be runnable. + // + // Note that the set of runnable scripts can survive a SetScripts; as + // long as the new set of runnable script has the same path, it won't be seen + // as a change to the set of runnable, even if the pointers have changed. + std::vector<ScriptHandle> runnable_scripts_; + + // Sets of available scripts. SetScripts resets this and interrupts + // any pending check. + std::map<Script*, std::unique_ptr<Script>> available_scripts_; + + // Set of scripts that have been executed. They'll be excluded from runnable. + // TODO(crbug.com/806868): Track script execution status and forward + // that information to the script precondition. + std::set<std::string> executed_scripts_; + + // Number of precondition checks run for CheckScripts that are still + // pending. + int pending_precondition_check_count_; + + // Scripts found to be runnable so far, in the current run of CheckScripts. + std::vector<Script*> pending_runnable_scripts_; + + // If a script is currently running, this is the script's executor. Otherwise, + // this is nullptr. + std::unique_ptr<ScriptExecutor> executor_; + + base::WeakPtrFactory<ScriptTracker> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(ScriptTracker); +}; + +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_SCRIPT_TRACKER_H_
diff --git a/components/autofill_assistant/browser/script_tracker_unittest.cc b/components/autofill_assistant/browser/script_tracker_unittest.cc new file mode 100644 index 0000000..f2923fe --- /dev/null +++ b/components/autofill_assistant/browser/script_tracker_unittest.cc
@@ -0,0 +1,206 @@ +// 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/autofill_assistant/browser/script_tracker.h" + +#include <utility> + +#include "base/test/mock_callback.h" +#include "components/autofill_assistant/browser/client_memory.h" +#include "components/autofill_assistant/browser/mock_run_once_callback.h" +#include "components/autofill_assistant/browser/mock_service.h" +#include "components/autofill_assistant/browser/mock_ui_controller.h" +#include "components/autofill_assistant/browser/mock_web_controller.h" +#include "components/autofill_assistant/browser/protocol_utils.h" +#include "components/autofill_assistant/browser/script_executor_delegate.h" +#include "components/autofill_assistant/browser/service.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace autofill_assistant { +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::SizeIs; +using ::testing::IsEmpty; +using ::testing::NiceMock; + +class ScriptTrackerTest : public testing::Test, + public ScriptTracker::Listener, + public ScriptExecutorDelegate { + public: + void SetUp() override { + ON_CALL(mock_web_controller_, OnElementExists(ElementsAre("exists"), _)) + .WillByDefault(RunOnceCallback<1>(true)); + ON_CALL(mock_web_controller_, + OnElementExists(ElementsAre("does_not_exist"), _)) + .WillByDefault(RunOnceCallback<1>(false)); + + // Scripts run, but have no actions. + ON_CALL(mock_service_, OnGetActions(_, _)) + .WillByDefault(RunOnceCallback<1>(true, "")); + } + + protected: + ScriptTrackerTest() : runnable_scripts_changed_(0), tracker_(this, this) {} + + // Overrides ScriptTrackerDelegate + Service* GetService() override { return &mock_service_; } + + UiController* GetUiController() override { return &mock_ui_controller_; } + + WebController* GetWebController() override { return &mock_web_controller_; } + + ClientMemory* GetClientMemory() override { return &client_memory_; } + + // Overrides ScriptTracker::Listener + void OnRunnableScriptsChanged() override { runnable_scripts_changed_++; } + + void SetAndCheckScripts(const SupportsScriptResponseProto& response) { + std::string response_str; + response.SerializeToString(&response_str); + std::vector<std::unique_ptr<Script>> scripts; + ProtocolUtils::ParseScripts(response_str, &scripts); + tracker_.SetAndCheckScripts(std::move(scripts)); + } + + static void AddScript(SupportsScriptResponseProto* response, + const std::string& name, + const std::string& path, + const std::string& selector) { + SupportedScriptProto* script = response->add_scripts(); + script->set_path(path); + script->mutable_presentation()->set_name(name); + script->mutable_presentation() + ->mutable_precondition() + ->add_elements_exist() + ->add_selectors(selector); + } + + const std::vector<ScriptHandle>& runnable_scripts() { + return tracker_.runnable_scripts(); + } + + NiceMock<MockService> mock_service_; + NiceMock<MockWebController> mock_web_controller_; + NiceMock<MockUiController> mock_ui_controller_; + ClientMemory client_memory_; + + // Number of times OnRunnableScriptsChanged was called. + int runnable_scripts_changed_; + ScriptTracker tracker_; +}; + +TEST_F(ScriptTrackerTest, NoScripts) { + tracker_.SetAndCheckScripts({}); + EXPECT_EQ(0, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), IsEmpty()); +} + +TEST_F(ScriptTrackerTest, SomeRunnableScripts) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "not runnable name", "not runnable path", + "does_not_exist"); + AddScript(&scripts, "runnable name", "runnable path", "exists"); + SetAndCheckScripts(scripts); + + EXPECT_EQ(1, runnable_scripts_changed_); + ASSERT_THAT(runnable_scripts(), SizeIs(1)); + EXPECT_EQ("runnable name", runnable_scripts()[0].name); + EXPECT_EQ("runnable path", runnable_scripts()[0].path); +} + +TEST_F(ScriptTrackerTest, NewScriptChangesNothing) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "runnable name", "runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(1, runnable_scripts_changed_); + SetAndCheckScripts(scripts); + EXPECT_EQ(1, runnable_scripts_changed_); +} + +TEST_F(ScriptTrackerTest, NewScriptClearsRunnable) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "runnable name", "runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(1, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), SizeIs(1)); + + SetAndCheckScripts(SupportsScriptResponseProto::default_instance()); + EXPECT_EQ(2, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), IsEmpty()); +} + +TEST_F(ScriptTrackerTest, NewScriptAddsRunnable) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "runnable name", "runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(1, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), SizeIs(1)); + + AddScript(&scripts, "new runnable name", "new runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(2, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), SizeIs(2)); +} + +TEST_F(ScriptTrackerTest, NewScriptChangesRunnable) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "runnable name", "runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(1, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), SizeIs(1)); + + scripts.clear_scripts(); + AddScript(&scripts, "new runnable name", "new runnable path", "exists"); + SetAndCheckScripts(scripts); + EXPECT_EQ(2, runnable_scripts_changed_); +} + +TEST_F(ScriptTrackerTest, CheckScriptsAgainAfterScriptEnd) { + SupportsScriptResponseProto scripts; + AddScript(&scripts, "script 1", "script1", "exists"); + AddScript(&scripts, "script 2", "script2", "exists"); + SetAndCheckScripts(scripts); + + // Both scripts are runnable + EXPECT_EQ(1, runnable_scripts_changed_); + EXPECT_THAT(runnable_scripts(), SizeIs(2)); + + // run 'script 1' + base::MockCallback<base::OnceCallback<void(bool)>> execute_callback; + EXPECT_CALL(execute_callback, Run(true)); + + tracker_.ExecuteScript("script1", execute_callback.Get()); + tracker_.CheckScripts(); + + // The 2nd time the scripts are checked, automatically after the script runs, + // 'script1' isn't runnable anymore, because it's already been run. + EXPECT_EQ(2, runnable_scripts_changed_); + ASSERT_THAT(runnable_scripts(), SizeIs(1)); + ASSERT_EQ("script2", runnable_scripts()[0].path); +} + +TEST_F(ScriptTrackerTest, CheckScriptsAfterDOMChange) { + EXPECT_CALL(mock_web_controller_, + OnElementExists(ElementsAre("maybe_exists"), _)) + .WillOnce(RunOnceCallback<1>(false)); + + SupportsScriptResponseProto scripts; + AddScript(&scripts, "script name", "script path", "maybe_exists"); + SetAndCheckScripts(scripts); + + // No scripts are runnable. + EXPECT_THAT(runnable_scripts(), IsEmpty()); + + // DOM has changed; OnElementExists now returns true. + EXPECT_CALL(mock_web_controller_, + OnElementExists(ElementsAre("maybe_exists"), _)) + .WillOnce(RunOnceCallback<1>(true)); + tracker_.CheckScripts(); + + // The script can now run + ASSERT_THAT(runnable_scripts(), SizeIs(1)); + EXPECT_EQ("script path", runnable_scripts()[0].path); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service.cc b/components/autofill_assistant/browser/service.cc index e7031a3..259bb21 100644 --- a/components/autofill_assistant/browser/service.cc +++ b/components/autofill_assistant/browser/service.cc
@@ -8,11 +8,11 @@ #include <utility> #include <vector> +#include "base/command_line.h" #include "base/strings/strcat.h" #include "components/autofill_assistant/browser/protocol_utils.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" -#include "google_apis/google_api_keys.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -21,8 +21,8 @@ namespace { // TODO(crbug.com/806868): Provide correct server and endpoint. const char* const kAutofillAssistantServer = ""; -const char* const kScriptEndpoint = ""; -const char* const kActionEndpoint = ""; +const char* const kScriptEndpoint = "/v1/supportsSite2"; +const char* const kActionEndpoint = "/v1/actions2"; net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("autofill_service", R"( @@ -46,20 +46,37 @@ namespace autofill_assistant { -Service::Service(content::BrowserContext* context) : context_(context) { - std::string api_key = google_apis::GetAPIKey(); +namespace switches { +const char* const kAutofillAssistantServerURL = "autofill-assistant-url"; +} // namespace switches +Service::Service(const std::string& api_key, content::BrowserContext* context) + : context_(context) { + const auto* command_line = base::CommandLine::ForCurrentProcess(); + GURL service_url(kAutofillAssistantServer); + if (command_line->HasSwitch(switches::kAutofillAssistantServerURL)) { + GURL custom_url(command_line->GetSwitchValueASCII( + switches::kAutofillAssistantServerURL)); + if (custom_url.is_valid()) { + service_url = custom_url; + } else { + LOG(WARNING) << "The following autofill assisstant URL specified in " + "the command line is invalid: " + << custom_url; + } + } + + std::string api_key_query = base::StrCat({"key=", api_key}); url::StringPieceReplacements<std::string> script_replacements; script_replacements.SetPathStr(kScriptEndpoint); - script_replacements.SetQueryStr(api_key); - script_server_url_ = - GURL(kAutofillAssistantServer).ReplaceComponents(script_replacements); + script_replacements.SetQueryStr(api_key_query); + script_server_url_ = service_url.ReplaceComponents(script_replacements); url::StringPieceReplacements<std::string> action_replacements; action_replacements.SetPathStr(kActionEndpoint); - action_replacements.SetQueryStr(api_key); + action_replacements.SetQueryStr(api_key_query); script_action_server_url_ = - GURL(kAutofillAssistantServer).ReplaceComponents(action_replacements); + service_url.ReplaceComponents(action_replacements); } Service::~Service() {} @@ -122,6 +139,9 @@ ::network::SimpleURLLoader::Create(std::move(resource_request), traffic_annotation); simple_loader->AttachStringForUpload(request, "application/x-protobuffer"); +#ifdef DEBUG + simple_loader->SetAllowHttpErrorResults(true); +#endif simple_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie( content::BrowserContext::GetDefaultStoragePartition(context_) ->GetURLLoaderFactoryForBrowserProcess() @@ -149,7 +169,8 @@ if (loader_instance->loader->NetError() != net::OK || response_code != 200) { LOG(ERROR) << "Communicating with autofill assistant server error NetError=" << loader_instance->loader->NetError() - << " response_code=" << response_code; + << " response_code=" << response_code << " message=" + << (response_body == nullptr ? "" : *response_body); std::move(loader_instance->callback).Run(false, response_body_str); return; }
diff --git a/components/autofill_assistant/browser/service.h b/components/autofill_assistant/browser/service.h index bcb6735..3bc7e44 100644 --- a/components/autofill_assistant/browser/service.h +++ b/components/autofill_assistant/browser/service.h
@@ -24,7 +24,8 @@ // client actions. class Service { public: - explicit Service(content::BrowserContext* context); + explicit Service(const std::string& api_key, + content::BrowserContext* context); virtual ~Service(); using ResponseCallback =
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index cebd687..63b34bd 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -16,7 +16,7 @@ // Get the list of scripts that can potentially be run on a url. message SupportsScriptRequestProto { required string url = 1; - required ClientContextProto client_context = 2; + required ClientContextProto client_context = 3; } // Response of the list of supported scripts.
diff --git a/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/TestBackgroundTask.java b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/TestBackgroundTask.java index 00b72b3be..7e314b3 100644 --- a/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/TestBackgroundTask.java +++ b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/TestBackgroundTask.java
@@ -8,7 +8,7 @@ /** Dummy implementation of a background task used for testing. */ class TestBackgroundTask implements BackgroundTask { - private static int sRescheduleCalls = 0; + private static int sRescheduleCalls; public TestBackgroundTask() {}
diff --git a/components/bookmarks/browser/bookmark_node_data_mac.cc b/components/bookmarks/browser/bookmark_node_data_mac.cc index 2dde55e..a529a63 100644 --- a/components/bookmarks/browser/bookmark_node_data_mac.cc +++ b/components/bookmarks/browser/bookmark_node_data_mac.cc
@@ -19,7 +19,7 @@ bool BookmarkNodeData::ReadFromClipboard(ui::ClipboardType type) { base::FilePath file_path; - if (ReadBookmarksFromPasteboard(type, elements, &file_path)) { + if (ReadBookmarksFromPasteboard(type, &elements, &file_path)) { profile_path_ = file_path; return true; }
diff --git a/components/bookmarks/browser/bookmark_pasteboard_helper_mac.h b/components/bookmarks/browser/bookmark_pasteboard_helper_mac.h index 839fd51..62e14ea 100644 --- a/components/bookmarks/browser/bookmark_pasteboard_helper_mac.h +++ b/components/bookmarks/browser/bookmark_pasteboard_helper_mac.h
@@ -22,7 +22,8 @@ // dragging methods. #if defined(__OBJC__) -// Creates a NSPasteboardItem that contains all the data for the bookmarks. +// Creates an autoreleased NSPasteboardItem that contains all the data for the +// bookmarks. NSPasteboardItem* PasteboardItemFromBookmarks( const std::vector<BookmarkNodeData::Element>& elements, const base::FilePath& profile_path); @@ -37,7 +38,7 @@ // Reads a set of bookmark elements from the specified pasteboard. bool ReadBookmarksFromPasteboard( ui::ClipboardType type, - std::vector<BookmarkNodeData::Element>& elements, + std::vector<BookmarkNodeData::Element>* elements, base::FilePath* profile_path); // Returns true if the specified pasteboard contains any sort of bookmark @@ -47,9 +48,9 @@ } // namespace bookmarks #if defined(__OBJC__) -// Pasteboard type for dictionary containing bookmark structure consisting -// of individual bookmark nodes and/or bookmark folders. -extern "C" NSString* const kBookmarkDictionaryListPboardType; +// UTI for dictionary containing bookmark structure consisting of individual +// bookmark nodes and/or bookmark folders. +extern NSString* const kUTTypeChromiumBookmarkDictionaryList; #endif // __OBJC__ #endif // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_PASTEBOARD_HELPER_MAC_H_
diff --git a/components/bookmarks/browser/bookmark_pasteboard_helper_mac.mm b/components/bookmarks/browser/bookmark_pasteboard_helper_mac.mm index 75a5e7f..15f39827 100644 --- a/components/bookmarks/browser/bookmark_pasteboard_helper_mac.mm +++ b/components/bookmarks/browser/bookmark_pasteboard_helper_mac.mm
@@ -8,184 +8,193 @@ #include <stddef.h> #include <stdint.h> +#include <memory> + #include "base/files/file_path.h" +#include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "components/bookmarks/browser/bookmark_node.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/clipboard_util_mac.h" -NSString* const kBookmarkDictionaryListPboardType = - @"com.google.chrome.BookmarkDictionaryListPboardType"; +NSString* const kUTTypeChromiumBookmarkDictionaryList = + @"org.chromium.bookmark-dictionary-list"; namespace bookmarks { namespace { -// Pasteboard type used to store profile path to determine which profile -// a set of bookmarks came from. -NSString* const kChromiumProfilePathPboardType = - @"com.google.chrome.ChromiumProfilePathPboardType"; +// UTI used to store profile path to determine which profile a set of bookmarks +// came from. +NSString* const kUTTypeChromiumProfilePath = @"org.chromium.profile-path"; -// Internal bookmark ID for a bookmark node. Used only when moving inside -// of one profile. -NSString* const kChromiumBookmarkId = @"ChromiumBookmarkId"; +// Internal bookmark ID for a bookmark node. Used only when moving inside of +// one profile. +NSString* const kChromiumBookmarkIdKey = @"ChromiumBookmarkId"; // Internal bookmark meta info dictionary for a bookmark node. -NSString* const kChromiumBookmarkMetaInfo = @"ChromiumBookmarkMetaInfo"; +NSString* const kChromiumBookmarkMetaInfoKey = @"ChromiumBookmarkMetaInfo"; -// Keys for the type of node in BookmarkDictionaryListPboardType. -NSString* const kWebBookmarkType = @"WebBookmarkType"; - +// Keys for the type of node in kUTTypeChromiumBookmarkDictionaryList. +NSString* const kWebBookmarkTypeKey = @"WebBookmarkType"; NSString* const kWebBookmarkTypeList = @"WebBookmarkTypeList"; - NSString* const kWebBookmarkTypeLeaf = @"WebBookmarkTypeLeaf"; -BookmarkNode::MetaInfoMap MetaInfoMapFromDictionary(NSDictionary* dictionary) { - BookmarkNode::MetaInfoMap meta_info_map; +// Property keys. +NSString* const kTitleKey = @"Title"; +NSString* const kURLStringKey = @"URLString"; +NSString* const kChildrenKey = @"Children"; - for (NSString* key in dictionary) { - meta_info_map[base::SysNSStringToUTF8(key)] = - base::SysNSStringToUTF8([dictionary objectForKey:key]); - } +BookmarkNode::MetaInfoMap MetaInfoMapFromDictionary(NSDictionary* dictionary) { + __block BookmarkNode::MetaInfoMap meta_info_map; + + [dictionary + enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) { + NSString* key_ns = base::mac::ObjCCast<NSString>(key); + NSString* value_ns = base::mac::ObjCCast<NSString>(value); + if (key_ns && value_ns) { + meta_info_map[base::SysNSStringToUTF8(key_ns)] = + base::SysNSStringToUTF8(value_ns); + } + }]; return meta_info_map; } -void ConvertPlistToElements(NSArray* input, - std::vector<BookmarkNodeData::Element>& elements) { - NSUInteger len = [input count]; - for (NSUInteger i = 0; i < len; ++i) { - NSDictionary* pboardBookmark = [input objectAtIndex:i]; - std::unique_ptr<BookmarkNode> new_node(new BookmarkNode(GURL())); - int64_t node_id = - [[pboardBookmark objectForKey:kChromiumBookmarkId] longLongValue]; - new_node->set_id(node_id); - - NSDictionary* metaInfoDictionary = - [pboardBookmark objectForKey:kChromiumBookmarkMetaInfo]; - if (metaInfoDictionary) - new_node->SetMetaInfoMap(MetaInfoMapFromDictionary(metaInfoDictionary)); - - BOOL is_folder = [[pboardBookmark objectForKey:kWebBookmarkType] - isEqualToString:kWebBookmarkTypeList]; - if (is_folder) { - new_node->set_type(BookmarkNode::FOLDER); - NSString* title = [pboardBookmark objectForKey:@"Title"]; - new_node->SetTitle(base::SysNSStringToUTF16(title)); - } else { - new_node->set_type(BookmarkNode::URL); - NSDictionary* uriDictionary = - [pboardBookmark objectForKey:@"URIDictionary"]; - NSString* title = [uriDictionary objectForKey:@"title"]; - NSString* urlString = [pboardBookmark objectForKey:@"URLString"]; - new_node->SetTitle(base::SysNSStringToUTF16(title)); - new_node->set_url(GURL(base::SysNSStringToUTF8(urlString))); - } - BookmarkNodeData::Element e = BookmarkNodeData::Element(new_node.get()); - if (is_folder) { - ConvertPlistToElements([pboardBookmark objectForKey:@"Children"], - e.children); - } - elements.push_back(e); - } -} - -bool ReadBookmarkDictionaryListPboardType( - NSPasteboard* pb, - std::vector<BookmarkNodeData::Element>& elements) { - NSString* uti = ui::ClipboardUtil::UTIForPasteboardType( - kBookmarkDictionaryListPboardType); - NSArray* bookmarks = [pb propertyListForType:uti]; - if (!bookmarks) - return false; - ConvertPlistToElements(bookmarks, elements); - return true; -} - -bool ReadWebURLsWithTitlesPboardType( - NSPasteboard* pb, - std::vector<BookmarkNodeData::Element>& elements) { - NSArray* urlsArr = nil; - NSArray* titlesArr = nil; - if (!ui::ClipboardUtil::URLsAndTitlesFromPasteboard(pb, &urlsArr, &titlesArr)) - return false; - - NSUInteger len = [titlesArr count]; - for (NSUInteger i = 0; i < len; ++i) { - base::string16 title = - base::SysNSStringToUTF16([titlesArr objectAtIndex:i]); - std::string url = base::SysNSStringToUTF8([urlsArr objectAtIndex:i]); - if (!url.empty()) { - BookmarkNodeData::Element element; - element.is_url = true; - element.url = GURL(url); - element.title = title; - elements.push_back(element); - } - } - return true; -} - NSDictionary* DictionaryFromBookmarkMetaInfo( const BookmarkNode::MetaInfoMap& meta_info_map) { NSMutableDictionary* dictionary = [NSMutableDictionary dictionary]; - for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map.begin(); - it != meta_info_map.end(); ++it) { - [dictionary setObject:base::SysUTF8ToNSString(it->second) - forKey:base::SysUTF8ToNSString(it->first)]; + for (const auto& item : meta_info_map) { + [dictionary setObject:base::SysUTF8ToNSString(item.second) + forKey:base::SysUTF8ToNSString(item.first)]; } return dictionary; } -NSArray* GetPlistForBookmarkList( - const std::vector<BookmarkNodeData::Element>& elements) { - NSMutableArray* plist = [NSMutableArray array]; - for (size_t i = 0; i < elements.size(); ++i) { - BookmarkNodeData::Element element = elements[i]; - NSDictionary* metaInfoDictionary = - DictionaryFromBookmarkMetaInfo(element.meta_info_map); - if (element.is_url) { - NSString* title = base::SysUTF16ToNSString(element.title); - NSString* url = base::SysUTF8ToNSString(element.url.spec()); - int64_t elementId = element.id(); - NSNumber* idNum = [NSNumber numberWithLongLong:elementId]; - NSDictionary* uriDictionary = [NSDictionary dictionaryWithObjectsAndKeys: - title, @"title", nil]; - NSDictionary* object = [NSDictionary dictionaryWithObjectsAndKeys: - uriDictionary, @"URIDictionary", - url, @"URLString", - kWebBookmarkTypeLeaf, kWebBookmarkType, - idNum, kChromiumBookmarkId, - metaInfoDictionary, kChromiumBookmarkMetaInfo, - nil]; - [plist addObject:object]; +void ConvertNSArrayToElements( + NSArray* input, + std::vector<BookmarkNodeData::Element>* elements) { + for (NSDictionary* bookmark_dict in input) { + auto new_node = std::make_unique<BookmarkNode>(GURL()); + + NSNumber* node_id = base::mac::ObjCCast<NSNumber>( + [bookmark_dict objectForKey:kChromiumBookmarkIdKey]); + if (node_id) + new_node->set_id([node_id longLongValue]); + + NSDictionary* meta_info = base::mac::ObjCCast<NSDictionary>( + [bookmark_dict objectForKey:kChromiumBookmarkMetaInfoKey]); + if (meta_info) + new_node->SetMetaInfoMap(MetaInfoMapFromDictionary(meta_info)); + + NSString* title = + base::mac::ObjCCast<NSString>([bookmark_dict objectForKey:kTitleKey]); + new_node->SetTitle(base::SysNSStringToUTF16(title)); + + NSString* type = base::mac::ObjCCast<NSString>( + [bookmark_dict objectForKey:kWebBookmarkTypeKey]); + if (!type) + continue; + + BOOL is_folder = [type isEqualToString:kWebBookmarkTypeList]; + if (is_folder) { + new_node->set_type(BookmarkNode::FOLDER); } else { - NSString* title = base::SysUTF16ToNSString(element.title); - NSArray* children = GetPlistForBookmarkList(element.children); - int64_t elementId = element.id(); - NSNumber* idNum = [NSNumber numberWithLongLong:elementId]; - NSDictionary* object = [NSDictionary dictionaryWithObjectsAndKeys: - title, @"Title", - children, @"Children", - kWebBookmarkTypeList, kWebBookmarkType, - idNum, kChromiumBookmarkId, - metaInfoDictionary, kChromiumBookmarkMetaInfo, - nil]; - [plist addObject:object]; + new_node->set_type(BookmarkNode::URL); + NSString* url_string = base::mac::ObjCCast<NSString>( + [bookmark_dict objectForKey:kURLStringKey]); + if (!url_string) + continue; + new_node->set_url(GURL(base::SysNSStringToUTF8(url_string))); } + + BookmarkNodeData::Element e = BookmarkNodeData::Element(new_node.get()); + if (is_folder) { + ConvertNSArrayToElements([bookmark_dict objectForKey:kChildrenKey], + &e.children); + } + elements->push_back(e); } - return plist; } -void WriteBookmarkDictionaryListPboardType( +bool ReadBookmarkDictionaryListType( + NSPasteboard* pb, + std::vector<BookmarkNodeData::Element>* elements) { + id bookmarks = [pb propertyListForType:kUTTypeChromiumBookmarkDictionaryList]; + if (!bookmarks) + return false; + NSArray* bookmarks_array = base::mac::ObjCCast<NSArray>(bookmarks); + if (!bookmarks_array) + return false; + + ConvertNSArrayToElements(bookmarks_array, elements); + return true; +} + +bool ReadWebURLsWithTitlesPboardType( + NSPasteboard* pb, + std::vector<BookmarkNodeData::Element>* elements) { + NSArray* urls = nil; + NSArray* titles = nil; + if (!ui::ClipboardUtil::URLsAndTitlesFromPasteboard(pb, &urls, &titles)) + return false; + + NSUInteger len = [titles count]; + for (NSUInteger i = 0; i < len; ++i) { + base::string16 title = base::SysNSStringToUTF16([titles objectAtIndex:i]); + std::string url = base::SysNSStringToUTF8([urls objectAtIndex:i]); + if (!url.empty()) { + BookmarkNodeData::Element element; + element.is_url = true; + element.url = GURL(url); + element.title = title; + elements->push_back(element); + } + } + return true; +} + +NSArray* GetNSArrayForBookmarkList( + const std::vector<BookmarkNodeData::Element>& elements) { + NSMutableArray* array = [NSMutableArray array]; + for (const auto& element : elements) { + NSDictionary* meta_info = + DictionaryFromBookmarkMetaInfo(element.meta_info_map); + NSString* title = base::SysUTF16ToNSString(element.title); + NSNumber* element_id = @(element.id()); + + NSDictionary* object; + if (element.is_url) { + NSString* url = base::SysUTF8ToNSString(element.url.spec()); + object = @{ + kTitleKey : title, + kURLStringKey : url, + kWebBookmarkTypeKey : kWebBookmarkTypeLeaf, + kChromiumBookmarkIdKey : element_id, + kChromiumBookmarkMetaInfoKey : meta_info + }; + } else { + NSArray* children = GetNSArrayForBookmarkList(element.children); + object = @{ + kTitleKey : title, + kChildrenKey : children, + kWebBookmarkTypeKey : kWebBookmarkTypeList, + kChromiumBookmarkIdKey : element_id, + kChromiumBookmarkMetaInfoKey : meta_info + }; + } + [array addObject:object]; + } + return array; +} + +void WriteBookmarkDictionaryListType( NSPasteboardItem* item, const std::vector<BookmarkNodeData::Element>& elements) { - NSArray* plist = GetPlistForBookmarkList(elements); - NSString* uti = ui::ClipboardUtil::UTIForPasteboardType( - kBookmarkDictionaryListPboardType); - [item setPropertyList:plist forType:uti]; + NSArray* array = GetNSArrayForBookmarkList(elements); + [item setPropertyList:array forType:kUTTypeChromiumBookmarkDictionaryList]; } void FillFlattenedArraysForBookmarks( @@ -193,7 +202,7 @@ NSMutableArray* url_titles, NSMutableArray* urls, NSMutableArray* toplevel_string_data) { - for (const BookmarkNodeData::Element& element : elements) { + for (const auto& element : elements) { NSString* title = base::SysUTF16ToNSString(element.title); if (element.is_url) { NSString* url = base::SysUTF8ToNSString(element.url.spec()); @@ -232,7 +241,7 @@ } [item setString:[toplevel_string_data componentsJoinedByString:@"\n"] - forType:NSPasteboardTypeString]; + forType:base::mac::CFToNSCast(kUTTypeUTF8PlainText)]; return item; } @@ -261,12 +270,11 @@ base::scoped_nsobject<NSPasteboardItem> item = WriteSimplifiedBookmarkTypes(elements); - WriteBookmarkDictionaryListPboardType(item, elements); + WriteBookmarkDictionaryListType(item, elements); - NSString* uti = - ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); - [item setString:base::SysUTF8ToNSString(profile_path.value()) forType:uti]; - return [[item retain] autorelease]; + [item setString:base::SysUTF8ToNSString(profile_path.value()) + forType:kUTTypeChromiumProfilePath]; + return item.autorelease(); } void WriteBookmarksToPasteboard( @@ -284,16 +292,14 @@ bool ReadBookmarksFromPasteboard( ui::ClipboardType type, - std::vector<BookmarkNodeData::Element>& elements, + std::vector<BookmarkNodeData::Element>* elements, base::FilePath* profile_path) { NSPasteboard* pb = PasteboardFromType(type); - elements.clear(); - NSString* uti = - ui::ClipboardUtil::UTIForPasteboardType(kChromiumProfilePathPboardType); - NSString* profile = [pb stringForType:uti]; + elements->clear(); + NSString* profile = [pb stringForType:kUTTypeChromiumProfilePath]; *profile_path = base::FilePath(base::SysNSStringToUTF8(profile)); - return ReadBookmarkDictionaryListPboardType(pb, elements) || + return ReadBookmarkDictionaryListType(pb, elements) || ReadWebURLsWithTitlesPboardType(pb, elements); } @@ -302,7 +308,7 @@ NSArray* availableTypes = @[ ui::ClipboardUtil::UTIForWebURLsAndTitles(), - ui::ClipboardUtil::UTIForPasteboardType(kBookmarkDictionaryListPboardType) + kUTTypeChromiumBookmarkDictionaryList ]; return [pb availableTypeFromArray:availableTypes] != nil; }
diff --git a/components/cast_channel/BUILD.gn b/components/cast_channel/BUILD.gn index d1ba03d..c0b0b24 100644 --- a/components/cast_channel/BUILD.gn +++ b/components/cast_channel/BUILD.gn
@@ -41,6 +41,7 @@ "//content/public/common", "//crypto", "//net", + "//services/data_decoder/public/cpp", ] public_deps = [ "//services/network/public/mojom", @@ -59,6 +60,7 @@ "//components/cast_channel/proto:cast_channel_proto", "//net", "//net:test_support", + "//services/service_manager/public/cpp", "//testing/gmock", "//testing/gtest", ] @@ -89,6 +91,7 @@ "//components/prefs:test_support", "//content/test:test_support", "//net:test_support", + "//services/data_decoder/public/cpp:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/cast_channel/DEPS b/components/cast_channel/DEPS index 0bc8308d..6bf2f94 100644 --- a/components/cast_channel/DEPS +++ b/components/cast_channel/DEPS
@@ -6,7 +6,9 @@ "+crypto", "+mojo/public/cpp", "+net", + "+services/data_decoder/public", "+services/network", + "+services/service_manager/public", ] specific_include_rules = {
diff --git a/components/cast_channel/cast_framer_unittest.cc b/components/cast_channel/cast_framer_unittest.cc index 58ae1061..92ce1bb5 100644 --- a/components/cast_channel/cast_framer_unittest.cc +++ b/components/cast_channel/cast_framer_unittest.cc
@@ -30,7 +30,7 @@ cast_message_.set_payload_utf8("payload"); ASSERT_TRUE(MessageFramer::Serialize(cast_message_, &cast_message_str_)); - buffer_ = new net::GrowableIOBuffer; + buffer_ = base::MakeRefCounted<net::GrowableIOBuffer>(); buffer_->SetCapacity(MessageFramer::MessageHeader::max_message_size()); framer_.reset(new MessageFramer(buffer_.get())); }
diff --git a/components/cast_channel/cast_message_handler.cc b/components/cast_channel/cast_message_handler.cc index 150ebc1..bf04681f 100644 --- a/components/cast_channel/cast_message_handler.cc +++ b/components/cast_channel/cast_message_handler.cc
@@ -10,6 +10,8 @@ #include "base/strings/stringprintf.h" #include "base/time/default_tick_clock.h" #include "components/cast_channel/cast_socket_service.h" +#include "services/data_decoder/public/cpp/safe_json_parser.h" +#include "services/service_manager/public/cpp/connector.h" namespace cast_channel { @@ -17,6 +19,10 @@ constexpr base::TimeDelta kRequestTimeout = base::TimeDelta::FromSeconds(5); +void ReportParseError(const std::string& error) { + DVLOG(2) << "Error parsing JSON message: " << error; +} + } // namespace GetAppAvailabilityRequest::GetAppAvailabilityRequest( @@ -45,11 +51,16 @@ : type(type), message(std::move(message)) {} InternalMessage::~InternalMessage() = default; -CastMessageHandler::CastMessageHandler(CastSocketService* socket_service, - const std::string& user_agent, - const std::string& browser_version, - const std::string& locale) +CastMessageHandler::CastMessageHandler( + CastSocketService* socket_service, + std::unique_ptr<service_manager::Connector> connector, + const std::string& data_decoder_batch_id, + const std::string& user_agent, + const std::string& browser_version, + const std::string& locale) : sender_id_(base::StringPrintf("sender-%d", base::RandInt(0, 1000000))), + connector_(std::move(connector)), + data_decoder_batch_id_(data_decoder_batch_id), user_agent_(user_agent), browser_version_(browser_version), locale_(locale), @@ -205,7 +216,18 @@ DVLOG(2) << __func__ << ", channel_id: " << socket.id() << ", message: " << CastMessageToString(message); if (IsCastInternalNamespace(message.namespace_())) { - HandleCastInternalMessage(socket, message); + if (message.payload_type() == + cast_channel::CastMessage_PayloadType_STRING) { + data_decoder::SafeJsonParser::ParseBatch( + connector_.get(), message.payload_utf8(), + base::BindRepeating(&CastMessageHandler::HandleCastInternalMessage, + weak_ptr_factory_.GetWeakPtr(), socket.id(), + message.source_id(), message.destination_id()), + base::BindRepeating(&ReportParseError), data_decoder_batch_id_); + } else { + DLOG(ERROR) << "Dropping internal message with binary payload: " + << message.namespace_(); + } } else { DVLOG(2) << "Got app message from cast channel with namespace: " << message.namespace_(); @@ -214,37 +236,46 @@ } } -void CastMessageHandler::HandleCastInternalMessage(const CastSocket& socket, - const CastMessage& message) { - // TODO(https://crbug.com/809249): Parse message with data_decoder service. - std::unique_ptr<base::DictionaryValue> payload = - GetDictionaryFromCastMessage(message); - if (!payload) +void CastMessageHandler::HandleCastInternalMessage( + int channel_id, + const std::string& source_id, + const std::string& destination_id, + std::unique_ptr<base::Value> payload) { + if (!payload->is_dict()) { + ReportParseError("Parsed message not a dictionary"); return; + } + + // Check if the socket still exists as it might have been removed during + // message parsing. + if (!socket_service_->GetSocket(channel_id)) { + DVLOG(2) << __func__ << ": socket not found: " << channel_id; + return; + } int request_id = 0; if (GetRequestIdFromResponse(*payload, &request_id) && request_id > 0) { - auto requests_it = pending_requests_.find(socket.id()); + auto requests_it = pending_requests_.find(channel_id); if (requests_it != pending_requests_.end()) requests_it->second->HandlePendingRequest(request_id, *payload); } CastMessageType type = ParseMessageTypeFromPayload(*payload); if (type == CastMessageType::kOther) { - DVLOG(2) << "Unknown message type: " << CastMessageToString(message); + DVLOG(2) << "Unknown message type: " << *payload; return; } if (type == CastMessageType::kCloseConnection) { // Source / destination is flipped. - virtual_connections_.erase(VirtualConnection( - socket.id(), message.destination_id(), message.source_id())); + virtual_connections_.erase( + VirtualConnection(channel_id, destination_id, source_id)); return; } InternalMessage internal_message(type, std::move(*payload)); for (auto& observer : observers_) - observer.OnInternalMessage(socket.id(), internal_message); + observer.OnInternalMessage(channel_id, internal_message); } void CastMessageHandler::SendCastMessage(CastSocket* socket, @@ -336,7 +367,7 @@ void CastMessageHandler::PendingRequests::HandlePendingRequest( int request_id, - const base::DictionaryValue& response) { + const base::Value& response) { auto app_availability_it = std::find_if(pending_app_availability_requests.begin(), pending_app_availability_requests.end(),
diff --git a/components/cast_channel/cast_message_handler.h b/components/cast_channel/cast_message_handler.h index 2cacf788..522373a 100644 --- a/components/cast_channel/cast_message_handler.h +++ b/components/cast_channel/cast_message_handler.h
@@ -17,6 +17,10 @@ #include "components/cast_channel/cast_message_util.h" #include "components/cast_channel/cast_socket.h" +namespace service_manager { +class Connector; +} + namespace cast_channel { class CastSocketService; @@ -108,10 +112,15 @@ const InternalMessage& message) = 0; }; - explicit CastMessageHandler(CastSocketService* socket_service, - const std::string& user_agent, - const std::string& browser_version, - const std::string& locale); + // |connector|: Connector to be used for data_decoder service. The connector + // must not be bound to any thread. + // |data_decoder_batch_id|: Batch ID used for data_decoder service. + CastMessageHandler(CastSocketService* socket_service, + std::unique_ptr<service_manager::Connector> connector, + const std::string& data_decoder_batch_id, + const std::string& user_agent, + const std::string& browser_version, + const std::string& locale); ~CastMessageHandler() override; // Ensures a virtual connection exists for (|source_id|, |destination_id|) on @@ -170,8 +179,7 @@ bool AddLaunchRequest(std::unique_ptr<LaunchSessionRequest> request, base::TimeDelta timeout); - void HandlePendingRequest(int request_id, - const base::DictionaryValue& response); + void HandlePendingRequest(int request_id, const base::Value& response); private: // Invokes the pending callback associated with |request_id| with a timed @@ -208,8 +216,10 @@ // Callback for CastTransport::SendMessage. void OnMessageSent(int result); - void HandleCastInternalMessage(const CastSocket& socket, - const CastMessage& message); + void HandleCastInternalMessage(int channel_id, + const std::string& source_id, + const std::string& destination_id, + std::unique_ptr<base::Value> payload); // Set of pending requests keyed by socket ID. base::flat_map<int, std::unique_ptr<PendingRequests>> pending_requests_; @@ -218,6 +228,10 @@ // distinguish it from other Cast senders on the same network. const std::string sender_id_; + // Used for parsing JSON payload from receivers. + std::unique_ptr<service_manager::Connector> connector_; + const std::string data_decoder_batch_id_; + // User agent and browser version strings included in virtual connection // messages. const std::string user_agent_;
diff --git a/components/cast_channel/cast_message_handler_unittest.cc b/components/cast_channel/cast_message_handler_unittest.cc index 744bb9c..44d6c3f 100644 --- a/components/cast_channel/cast_message_handler_unittest.cc +++ b/components/cast_channel/cast_message_handler_unittest.cc
@@ -10,6 +10,8 @@ #include "base/test/scoped_task_environment.h" #include "base/test/test_simple_task_runner.h" #include "components/cast_channel/cast_test_util.h" +#include "services/data_decoder/public/cpp/testing_json_parser.h" +#include "services/service_manager/public/cpp/connector.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -26,9 +28,16 @@ constexpr char kSourceId[] = "sourceId"; constexpr char kDestinationId[] = "destinationId"; +std::unique_ptr<base::Value> GetDictionaryFromCastMessage( + const CastMessage& message) { + if (!message.has_payload_utf8()) + return nullptr; + + return base::JSONReader::Read(message.payload_utf8()); +} + CastMessageType GetMessageType(const CastMessage& message) { - std::unique_ptr<base::Value> dict = - base::JSONReader::Read(message.payload_utf8()); + std::unique_ptr<base::Value> dict = GetDictionaryFromCastMessage(message); if (!dict) return CastMessageType::kOther; @@ -49,6 +58,8 @@ base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME), cast_socket_service_(new base::TestSimpleTaskRunner()), handler_(&cast_socket_service_, + /* connector */ nullptr, + "batchId", kTestUserAgentString, "66.0.3331.0", "en-US") { @@ -64,12 +75,21 @@ void OnError(ChannelError error) { handler_.OnError(cast_socket_, error); } - MOCK_METHOD2(OnAppAvailability, + void OnAppAvailability(const std::string& app_id, + GetAppAvailabilityResult result) { + if (run_loop_) + run_loop_->Quit(); + DoOnAppAvailability(app_id, result); + } + + MOCK_METHOD2(DoOnAppAvailability, void(const std::string& app_id, GetAppAvailabilityResult result)); void ExpectSessionLaunchResult(LaunchSessionResponse::Result expected_result, LaunchSessionResponse response) { + if (run_loop_) + run_loop_->Quit(); ++session_launch_response_count_; EXPECT_EQ(expected_result, response.result); if (response.result == LaunchSessionResponse::Result::kOk) @@ -78,7 +98,9 @@ protected: base::test::ScopedTaskEnvironment environment_; + std::unique_ptr<base::RunLoop> run_loop_; MockCastSocketService cast_socket_service_; + data_decoder::TestingJsonParser::ScopedFactoryOverride parser_override_; CastMessageHandler handler_; MockCastSocket cast_socket_; int session_launch_response_count_ = 0; @@ -129,8 +151,8 @@ EXPECT_EQ(CastMessageType::kGetAppAvailability, GetMessageType(app_availability_request)); - EXPECT_CALL( - *this, OnAppAvailability("AAAAAAAA", GetAppAvailabilityResult::kUnknown)); + EXPECT_CALL(*this, DoOnAppAvailability("AAAAAAAA", + GetAppAvailabilityResult::kUnknown)); OnError(ChannelError::TRANSPORT_ERROR); EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _)) @@ -148,8 +170,8 @@ GetMessageType(app_availability_request)); // The callback is invoked with kUnknown before the PendingRequests is // destroyed. - EXPECT_CALL( - *this, OnAppAvailability("BBBBBBBB", GetAppAvailabilityResult::kUnknown)); + EXPECT_CALL(*this, DoOnAppAvailability("BBBBBBBB", + GetAppAvailabilityResult::kUnknown)); } TEST_F(CastMessageHandlerTest, RequestAppAvailability) { @@ -189,9 +211,11 @@ "\"APP_AVAILABLE\"}}", request_id)); - EXPECT_CALL(*this, OnAppAvailability("ABCDEFAB", - GetAppAvailabilityResult::kAvailable)); + run_loop_ = std::make_unique<base::RunLoop>(); + EXPECT_CALL(*this, DoOnAppAvailability("ABCDEFAB", + GetAppAvailabilityResult::kAvailable)); OnMessage(response); + run_loop_->Run(); } TEST_F(CastMessageHandlerTest, RequestAppAvailabilityTimesOut) { @@ -200,8 +224,8 @@ &cast_socket_, "ABCDEFAB", base::BindOnce(&CastMessageHandlerTest::OnAppAvailability, base::Unretained(this))); - EXPECT_CALL( - *this, OnAppAvailability("ABCDEFAB", GetAppAvailabilityResult::kUnknown)); + EXPECT_CALL(*this, DoOnAppAvailability("ABCDEFAB", + GetAppAvailabilityResult::kUnknown)); environment_.FastForwardBy(base::TimeDelta::FromSeconds(5)); } @@ -248,6 +272,8 @@ "type": "CLOSE" })"); OnMessage(response); + // Wait for message to be parsed and handled. + environment_.RunUntilIdle(); // Re-open virtual connection should cause message to be sent. EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _)); @@ -293,7 +319,9 @@ "}", request_id)); + run_loop_ = std::make_unique<base::RunLoop>(); OnMessage(response); + run_loop_->Run(); EXPECT_EQ(1, session_launch_response_count_); }
diff --git a/components/cast_channel/cast_message_util.cc b/components/cast_channel/cast_message_util.cc index ebadeef..0165a98 100644 --- a/components/cast_channel/cast_message_util.cc +++ b/components/cast_channel/cast_message_util.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" @@ -94,16 +93,6 @@ message_proto.has_payload_binary()); } -std::unique_ptr<base::DictionaryValue> GetDictionaryFromCastMessage( - const CastMessage& message) { - if (!message.has_payload_utf8()) - return nullptr; - - // TODO(https://crbug.com/809249): Parse JSON using data_decoder service. - return base::DictionaryValue::From( - base::JSONReader::Read(message.payload_utf8())); -} - bool IsCastInternalNamespace(const std::string& message_namespace) { // Note: any namespace with the prefix is assumed to be reserved for internal // messages.
diff --git a/components/cast_channel/cast_message_util.h b/components/cast_channel/cast_message_util.h index d7be3d1..51d306e 100644 --- a/components/cast_channel/cast_message_util.h +++ b/components/cast_channel/cast_message_util.h
@@ -51,11 +51,6 @@ // Checks if the contents of |message_proto| are valid. bool IsCastMessageValid(const CastMessage& message_proto); -// Parses and returns the UTF-8 payload from |message|. Returns nullptr -// if the UTF-8 payload doesn't exist, or if it is not a dictionary. -std::unique_ptr<base::DictionaryValue> GetDictionaryFromCastMessage( - const CastMessage& message); - // Returns true if |message_namespace| is a namespace reserved for internal // messages. bool IsCastInternalNamespace(const std::string& message_namespace);
diff --git a/components/cast_channel/cast_socket_unittest.cc b/components/cast_channel/cast_socket_unittest.cc index eb50900..0132597 100644 --- a/components/cast_channel/cast_socket_unittest.cc +++ b/components/cast_channel/cast_socket_unittest.cc
@@ -548,8 +548,8 @@ int ReadExactLength(net::IOBuffer* buffer, int buffer_length, net::Socket* socket) { - scoped_refptr<net::DrainableIOBuffer> draining_buffer( - new net::DrainableIOBuffer(buffer, buffer_length)); + scoped_refptr<net::DrainableIOBuffer> draining_buffer = + base::MakeRefCounted<net::DrainableIOBuffer>(buffer, buffer_length); while (draining_buffer->BytesRemaining() > 0) { net::TestCompletionCallback read_callback; int read_result = read_callback.GetResult(server_socket_->Read( @@ -564,8 +564,8 @@ int WriteExactLength(net::IOBuffer* buffer, int buffer_length, net::Socket* socket) { - scoped_refptr<net::DrainableIOBuffer> draining_buffer( - new net::DrainableIOBuffer(buffer, buffer_length)); + scoped_refptr<net::DrainableIOBuffer> draining_buffer = + base::MakeRefCounted<net::DrainableIOBuffer>(buffer, buffer_length); while (draining_buffer->BytesRemaining() > 0) { net::TestCompletionCallback write_callback; int write_result = write_callback.GetResult(server_socket_->Write( @@ -1069,8 +1069,8 @@ EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); int challenge_buffer_length = challenge_str.size(); - scoped_refptr<net::IOBuffer> challenge_buffer( - new net::IOBuffer(challenge_buffer_length)); + scoped_refptr<net::IOBuffer> challenge_buffer = + base::MakeRefCounted<net::IOBuffer>(challenge_buffer_length); int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, server_socket_.get()); @@ -1083,8 +1083,8 @@ std::string reply_str; EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); - scoped_refptr<net::StringIOBuffer> reply_buffer( - new net::StringIOBuffer(reply_str)); + scoped_refptr<net::StringIOBuffer> reply_buffer = + base::MakeRefCounted<net::StringIOBuffer>(reply_str); int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), server_socket_.get()); @@ -1108,8 +1108,8 @@ EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); int challenge_buffer_length = challenge_str.size(); - scoped_refptr<net::IOBuffer> challenge_buffer( - new net::IOBuffer(challenge_buffer_length)); + scoped_refptr<net::IOBuffer> challenge_buffer = + base::MakeRefCounted<net::IOBuffer>(challenge_buffer_length); int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, server_socket_.get()); @@ -1123,8 +1123,8 @@ std::string reply_str; EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); - scoped_refptr<net::StringIOBuffer> reply_buffer( - new net::StringIOBuffer(reply_str)); + scoped_refptr<net::StringIOBuffer> reply_buffer = + base::MakeRefCounted<net::StringIOBuffer>(reply_str); int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), server_socket_.get()); @@ -1141,8 +1141,8 @@ EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str)); int test_message_length = test_message_str.size(); - scoped_refptr<net::IOBuffer> test_message_buffer( - new net::IOBuffer(test_message_length)); + scoped_refptr<net::IOBuffer> test_message_buffer = + base::MakeRefCounted<net::IOBuffer>(test_message_length); EXPECT_CALL(handler_, OnWriteComplete(net::OK)); socket_->transport()->SendMessage(
diff --git a/components/cast_channel/cast_test_util.cc b/components/cast_channel/cast_test_util.cc index 3dbbbeb..f8a6ff9e 100644 --- a/components/cast_channel/cast_test_util.cc +++ b/components/cast_channel/cast_test_util.cc
@@ -7,6 +7,7 @@ #include <utility> #include "net/base/ip_address.h" +#include "services/service_manager/public/cpp/connector.h" namespace cast_channel { @@ -49,7 +50,12 @@ MockCastMessageHandler::MockCastMessageHandler( MockCastSocketService* socket_service) - : CastMessageHandler(socket_service, "userAgent", "1.2.3.4", "en-US") {} + : CastMessageHandler(socket_service, + /* connector */ nullptr, + "batchId", + "userAgent", + "1.2.3.4", + "en-US") {} MockCastMessageHandler::~MockCastMessageHandler() = default;
diff --git a/components/cast_channel/cast_transport.cc b/components/cast_channel/cast_transport.cc index b3d1550..4679cf5 100644 --- a/components/cast_channel/cast_transport.cc +++ b/components/cast_channel/cast_transport.cc
@@ -44,7 +44,7 @@ // Buffer is reused across messages to minimize unnecessary buffer // [re]allocations. - read_buffer_ = new net::GrowableIOBuffer(); + read_buffer_ = base::MakeRefCounted<net::GrowableIOBuffer>(); read_buffer_->SetCapacity(MessageFramer::MessageHeader::max_message_size()); framer_.reset(new MessageFramer(read_buffer_)); }
diff --git a/components/components_strings.grd b/components/components_strings.grd index 2fbd4cc..b372d1b4 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -195,8 +195,10 @@ <part file="find_in_page_strings.grdp" /> <part file="history_strings.grdp" /> <part file="login_dialog_strings.grdp" /> + <part file="management_strings.grdp" /> <part file="new_or_sad_tab_strings.grdp" /> <part file="nux_google_apps_strings.grdp" /> + <part file="nux_email_strings.grdp" /> <part file="ntp_snippets_strings.grdp" /> <part file="omnibox_strings.grdp" /> <part file="page_info_strings.grdp" />
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc index 1b60d31e..4e71f35a 100644 --- a/components/content_settings/core/common/content_settings.cc +++ b/components/content_settings/core/common/content_settings.cc
@@ -139,6 +139,16 @@ return content_settings::ValueToContentSetting(&setting_value); } +// static +bool RendererContentSettingRules::IsRendererContentSetting( + ContentSettingsType content_type) { + return content_type == CONTENT_SETTINGS_TYPE_IMAGES || + content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || + content_type == CONTENT_SETTINGS_TYPE_AUTOPLAY || + content_type == CONTENT_SETTINGS_TYPE_CLIENT_HINTS || + content_type == CONTENT_SETTINGS_TYPE_POPUPS; +} + RendererContentSettingRules::RendererContentSettingRules() {} RendererContentSettingRules::~RendererContentSettingRules() {}
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h index d99ee45..8f12724 100644 --- a/components/content_settings/core/common/content_settings.h +++ b/components/content_settings/core/common/content_settings.h
@@ -65,6 +65,10 @@ typedef std::vector<ContentSettingPatternSource> ContentSettingsForOneType; struct RendererContentSettingRules { + // Returns true if |content_type| is a type that is contained in this class. + // Any new type added below must also update this method. + static bool IsRendererContentSetting(ContentSettingsType content_type); + RendererContentSettingRules(); ~RendererContentSettingRules(); ContentSettingsForOneType image_rules;
diff --git a/components/cronet/BUILD.gn b/components/cronet/BUILD.gn index e6d5ede..8cf7b62 100644 --- a/components/cronet/BUILD.gn +++ b/components/cronet/BUILD.gn
@@ -105,13 +105,16 @@ test("cronet_tests") { deps = [ - ":cronet", + ":cronet_common", "//base", "//base/test:test_support", + "//components/cronet/native:cronet_native_impl", "//components/cronet/native/test:cronet_native_tests", + "//net", ] sources = [ + "cronet_global_state_stubs.cc", "run_all_unittests.cc", ]
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc index 5f4ed78..0801a20 100644 --- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc +++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
@@ -234,8 +234,9 @@ env->GetIntArrayRegion(pending_write_data->jwrite_buffer_limit_list.obj(), i, 1, &limit); DCHECK_LE(pos, limit); - scoped_refptr<net::WrappedIOBuffer> write_buffer( - new net::WrappedIOBuffer(static_cast<char*>(data) + pos)); + scoped_refptr<net::WrappedIOBuffer> write_buffer = + base::MakeRefCounted<net::WrappedIOBuffer>(static_cast<char*>(data) + + pos); pending_write_data->write_buffer_list.push_back(write_buffer); pending_write_data->write_buffer_len_list.push_back(limit - pos); }
diff --git a/components/cronet/android/test/test_upload_data_stream_handler.cc b/components/cronet/android/test/test_upload_data_stream_handler.cc index 7c4a6bb..9e1545a9 100644 --- a/components/cronet/android/test/test_upload_data_stream_handler.cc +++ b/components/cronet/android/test/test_upload_data_stream_handler.cc
@@ -128,7 +128,7 @@ DCHECK(network_thread_->BelongsToCurrentThread()); read_callback_invoked_ = false; if (!read_buffer_.get()) - read_buffer_ = new net::IOBufferWithSize(kReadBufferSize); + read_buffer_ = base::MakeRefCounted<net::IOBufferWithSize>(kReadBufferSize); int bytes_read = upload_data_stream_->Read( read_buffer_.get(), kReadBufferSize,
diff --git a/components/cronet/cronet_global_state_stubs.cc b/components/cronet/cronet_global_state_stubs.cc index 0b4ea69..ef1428e 100644 --- a/components/cronet/cronet_global_state_stubs.cc +++ b/components/cronet/cronet_global_state_stubs.cc
@@ -21,12 +21,9 @@ namespace { scoped_refptr<base::SingleThreadTaskRunner> InitializeAndCreateTaskRunner() { -// TODO(https://crbug.com/816705): Component builds result in //base and other -// process-global state being shared between the library and the test suite. -// Since we only expect Cronet native library component build to be used to run -// cronet_tests, we can assume that suite will define some things, for now. -#if !defined(COMPONENT_BUILD) - // TODO(wez): Remove this once AtExitManager dependencies are gone. +// Cronet tests sets AtExitManager as part of TestSuite, so statically linked +// library is not allowed to set its own. +#if !defined(CRONET_TESTS_IMPLEMENTATION) ignore_result(new base::AtExitManager); #endif
diff --git a/components/cronet/cronet_url_request_context.cc b/components/cronet/cronet_url_request_context.cc index 0132f80..adce07a 100644 --- a/components/cronet/cronet_url_request_context.cc +++ b/components/cronet/cronet_url_request_context.cc
@@ -456,6 +456,40 @@ return context_.get(); } +// Request context getter for CronetURLRequestContext. +class CronetURLRequestContext::ContextGetter + : public net::URLRequestContextGetter { + public: + explicit ContextGetter(CronetURLRequestContext* cronet_context) + : cronet_context_(cronet_context) { + DCHECK(cronet_context_); + } + + net::URLRequestContext* GetURLRequestContext() override { + return cronet_context_->GetURLRequestContext(); + } + + scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() + const override { + return cronet_context_->GetNetworkTaskRunner(); + } + + private: + // Must be called on the network thread. + ~ContextGetter() override { DCHECK(cronet_context_->IsOnNetworkThread()); } + + // CronetURLRequestContext associated with this ContextGetter. + CronetURLRequestContext* const cronet_context_; + + DISALLOW_COPY_AND_ASSIGN(ContextGetter); +}; + +net::URLRequestContextGetter* +CronetURLRequestContext::CreateURLRequestContextGetter() { + DCHECK(IsOnNetworkThread()); + return new ContextGetter(this); +} + net::URLRequestContext* CronetURLRequestContext::GetURLRequestContext() { DCHECK(IsOnNetworkThread()); return network_tasks_->GetURLRequestContext();
diff --git a/components/cronet/cronet_url_request_context.h b/components/cronet/cronet_url_request_context.h index 8462d48..84ea2e53 100644 --- a/components/cronet/cronet_url_request_context.h +++ b/components/cronet/cronet_url_request_context.h
@@ -34,6 +34,7 @@ class NetLog; class ProxyConfigService; class URLRequestContext; +class URLRequestContextGetter; class FileNetLogObserver; } // namespace net @@ -113,8 +114,14 @@ // Returns true if running on network thread. bool IsOnNetworkThread() const; + // Returns net::URLRequestContext owned by |this|. net::URLRequestContext* GetURLRequestContext(); + // Returns a new instance of net::URLRequestContextGetter. + // The net::URLRequestContext and base::SingleThreadTaskRunner that + // net::URLRequestContextGetter returns are owned by |this|. + net::URLRequestContextGetter* CreateURLRequestContextGetter(); + // TODO(xunjieli): Keep only one version of StartNetLog(). // Starts NetLog logging to file. This can be called on any thread. @@ -150,6 +157,7 @@ private: friend class TestUtil; + class ContextGetter; // NetworkTasks performs tasks on the network thread and owns objects that // live on the network thread.
diff --git a/components/cronet/ios/BUILD.gn b/components/cronet/ios/BUILD.gn index 4a16a5a..8ef1dfe 100644 --- a/components/cronet/ios/BUILD.gn +++ b/components/cronet/ios/BUILD.gn
@@ -113,7 +113,7 @@ libs = [ "UIKit.Framework" ] public_deps = [ - "//components/grpc_support", + "//components/grpc_support:headers", ] public_headers = _cronet_public_headers
diff --git a/components/cronet/ios/test/BUILD.gn b/components/cronet/ios/test/BUILD.gn index 83471b4..2a2a30f 100644 --- a/components/cronet/ios/test/BUILD.gn +++ b/components/cronet/ios/test/BUILD.gn
@@ -19,7 +19,9 @@ "cronet_quic_test.mm", "cronet_test_base.h", "cronet_test_base.mm", - "get_stream_engine.mm", + + # Use native stream engine instead (https://crbug.com/874542) + # "get_stream_engine.mm", "start_cronet.h", "start_cronet.mm", ] @@ -30,7 +32,7 @@ "//components/cronet/ios:cronet_framework+link", "//components/cronet/native/test:cronet_native_tests", "//components/cronet/test:test_support", - "//components/grpc_support:bidirectional_stream_unittest", + "//components/grpc_support:bidirectional_stream_test", "//net", "//net:simple_quic_tools", "//net:test_support",
diff --git a/components/cronet/native/BUILD.gn b/components/cronet/native/BUILD.gn index a1990b5..a281e8c 100644 --- a/components/cronet/native/BUILD.gn +++ b/components/cronet/native/BUILD.gn
@@ -3,18 +3,21 @@ # found in the LICENSE file. import("//components/cronet/native/include/headers.gni") +import("//components/grpc_support/include/headers.gni") import("//testing/test.gni") config("cronet_native_include_config") { include_dirs = [ "//components/cronet/native/generated", "//components/cronet/native/include", + "//components/grpc_support/include", ] } source_set("cronet_native_headers") { deps = [ "//base", + "//components/grpc_support:headers", ] configs += [ ":cronet_native_include_config" ] @@ -38,6 +41,7 @@ "//base", "//components/cronet:cronet_common", "//components/cronet:cronet_version_header", + "//components/grpc_support:grpc_support", "//net", ]
diff --git a/components/cronet/native/engine.cc b/components/cronet/native/engine.cc index 5e246af..e4c3d10 100644 --- a/components/cronet/native/engine.cc +++ b/components/cronet/native/engine.cc
@@ -20,9 +20,11 @@ #include "components/cronet/native/include/cronet_c.h" #include "components/cronet/url_request_context_config.h" #include "components/cronet/version.h" +#include "components/grpc_support/include/bidirectional_stream_c.h" #include "net/base/hash_value.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_builder.h" +#include "net/url_request/url_request_context_getter.h" namespace { @@ -150,6 +152,8 @@ params->network_thread_priority; } + // MockCertVerifier to use for testing purposes. + context_config_builder.mock_cert_verifier = std::move(mock_cert_verifier_); std::unique_ptr<URLRequestContextConfig> config = context_config_builder.Build(); @@ -249,6 +253,7 @@ in_use_storage_path_); } + stream_engine_.reset(); context_.reset(); return CheckResult(Cronet_RESULT_SUCCESS); } @@ -259,6 +264,25 @@ return result; } +// The struct stream_engine for grpc support. +// Holds net::URLRequestContextGetter and app-specific annotation. +class Cronet_EngineImpl::StreamEngineImpl : public stream_engine { + public: + explicit StreamEngineImpl(net::URLRequestContextGetter* context_getter) { + context_getter_ = context_getter; + obj = context_getter_.get(); + annotation = nullptr; + } + + ~StreamEngineImpl() { + obj = nullptr; + annotation = nullptr; + } + + private: + scoped_refptr<net::URLRequestContextGetter> context_getter_; +}; + // Callback is owned by CronetURLRequestContext. It is invoked and deleted // on the network thread. class Cronet_EngineImpl::Callback : public CronetURLRequestContext::Callback { @@ -306,12 +330,16 @@ // being intialized on network thread. base::AutoLock lock(engine_->lock_); if (engine_->context_) { + // Initialize bidirectional stream engine for grpc. + engine_->stream_engine_ = std::make_unique<StreamEngineImpl>( + engine_->context_->CreateURLRequestContextGetter()); engine_->init_completed_.Signal(); } } void Cronet_EngineImpl::Callback::OnDestroyNetworkThread() { DCHECK_CALLED_ON_VALID_THREAD(network_thread_checker_); + DCHECK(!engine_->stream_engine_); } void Cronet_EngineImpl::Callback::OnEffectiveConnectionTypeChanged( @@ -349,8 +377,36 @@ engine_->stop_netlog_completed_.Signal(); } +void Cronet_EngineImpl::SetMockCertVerifierForTesting( + std::unique_ptr<net::CertVerifier> mock_cert_verifier) { + CHECK(!context_); + mock_cert_verifier_ = std::move(mock_cert_verifier); +} + +stream_engine* Cronet_EngineImpl::GetBidirectionalStreamEngine() { + init_completed_.Wait(); + return stream_engine_.get(); +} + }; // namespace cronet CRONET_EXPORT Cronet_EnginePtr Cronet_Engine_Create() { return new cronet::Cronet_EngineImpl(); } + +CRONET_EXPORT void Cronet_Engine_SetMockCertVerifierForTesting( + Cronet_EnginePtr engine, + void* raw_mock_cert_verifier) { + cronet::Cronet_EngineImpl* engine_impl = + static_cast<cronet::Cronet_EngineImpl*>(engine); + std::unique_ptr<net::CertVerifier> cert_verifier; + cert_verifier.reset(static_cast<net::CertVerifier*>(raw_mock_cert_verifier)); + engine_impl->SetMockCertVerifierForTesting(std::move(cert_verifier)); +} + +CRONET_EXPORT stream_engine* Cronet_Engine_GetStreamEngine( + Cronet_EnginePtr engine) { + cronet::Cronet_EngineImpl* engine_impl = + static_cast<cronet::Cronet_EngineImpl*>(engine); + return engine_impl->GetBidirectionalStreamEngine(); +}
diff --git a/components/cronet/native/engine.h b/components/cronet/native/engine.h index 6129aea..6e104402 100644 --- a/components/cronet/native/engine.h +++ b/components/cronet/native/engine.h
@@ -13,8 +13,13 @@ #include "base/synchronization/waitable_event.h" #include "components/cronet/native/generated/cronet.idl_impl_interface.h" -namespace cronet { +extern "C" typedef struct stream_engine stream_engine; +namespace net { +class CertVerifier; +} + +namespace cronet { class CronetURLRequestContext; // Implementation of Cronet_Engine that uses CronetURLRequestContext. @@ -35,11 +40,20 @@ // is true. Cronet_RESULT CheckResult(Cronet_RESULT result); + // Set Mock CertVerifier for testing. Must be called before StartWithParams. + void SetMockCertVerifierForTesting( + std::unique_ptr<net::CertVerifier> mock_cert_verifier); + + // Get stream engine for GRPC Bidirectional Stream support. The returned + // stream_engine is owned by |this| and is only valid until |this| shutdown. + stream_engine* GetBidirectionalStreamEngine(); + CronetURLRequestContext* cronet_url_request_context() const { return context_.get(); } private: + class StreamEngineImpl; class Callback; // Enable runtime CHECK of the result. @@ -60,6 +74,12 @@ // Storage path used by this engine. std::string in_use_storage_path_; + // Stream engine for GRPC Bidirectional Stream support. + std::unique_ptr<StreamEngineImpl> stream_engine_; + + // Mock CertVerifier for testing. Only valid until StartWithParams. + std::unique_ptr<net::CertVerifier> mock_cert_verifier_; + DISALLOW_COPY_AND_ASSIGN(Cronet_EngineImpl); };
diff --git a/components/cronet/native/include/cronet_c.h b/components/cronet/native/include/cronet_c.h index 792473d..d9cd111 100644 --- a/components/cronet/native/include/cronet_c.h +++ b/components/cronet/native/include/cronet_c.h
@@ -7,14 +7,29 @@ #include "cronet_export.h" -// Cronet public C API is generated from cronet.idl and +// Cronet public C API is generated from cronet.idl #include "cronet.idl_c.h" #ifdef __cplusplus extern "C" { #endif -// TODO(mef): Remove this file if it is not needed. +// Stream Engine used by Bidirectional Stream C API for GRPC. +typedef struct stream_engine stream_engine; + +// Additional Cronet C API not generated from cronet.idl. + +// Sets net::CertVerifier* raw_mock_cert_verifier for testing of Cronet_Engine. +// Must be called before Cronet_Engine_InitWithParams(). +CRONET_EXPORT void Cronet_Engine_SetMockCertVerifierForTesting( + Cronet_EnginePtr engine, + /* net::CertVerifier* */ void* raw_mock_cert_verifier); + +// Returns "stream_engine" interface for bidirectionsl stream support for GRPC. +// Returned stream engine is owned by Cronet Engine and is only valid until +// Cronet_Engine_Shutdown(). +CRONET_EXPORT stream_engine* Cronet_Engine_GetStreamEngine( + Cronet_EnginePtr engine); #ifdef __cplusplus }
diff --git a/components/cronet/native/test/BUILD.gn b/components/cronet/native/test/BUILD.gn index 5db8844..bcd4e08 100644 --- a/components/cronet/native/test/BUILD.gn +++ b/components/cronet/native/test/BUILD.gn
@@ -34,6 +34,8 @@ "//base/test:test_support", "//components/cronet/native:cronet_native_headers", "//components/cronet/test:test_support", + "//components/grpc_support:bidirectional_stream_test", + "//components/grpc_support/test:get_stream_engine_header", "//net:test_support", "//testing/gtest", ] @@ -44,6 +46,7 @@ "buffer_test.cc", "engine_test.cc", "executors_test.cc", + "test_stream_engine.cc", "test_upload_data_provider.cc", "test_upload_data_provider.h", "test_url_request_callback.cc",
diff --git a/components/cronet/native/test/engine_test.cc b/components/cronet/native/test/engine_test.cc index 57b3474..8fcee30e 100644 --- a/components/cronet/native/test/engine_test.cc +++ b/components/cronet/native/test/engine_test.cc
@@ -11,6 +11,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "components/cronet/native/test/test_util.h" +#include "net/cert/mock_cert_verifier.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -156,6 +157,18 @@ Cronet_PublicKeyPins_Destroy(public_key_pins); } +// Verify that Cronet_Engine_SetMockCertVerifierForTesting() doesn't crash or +// leak anything. +TEST_F(EngineTest, SetMockCertVerifierForTesting) { + auto cert_verifier(std::make_unique<net::MockCertVerifier>()); + Cronet_EnginePtr engine = Cronet_Engine_Create(); + Cronet_Engine_SetMockCertVerifierForTesting(engine, cert_verifier.release()); + Cronet_EngineParamsPtr engine_params = Cronet_EngineParams_Create(); + Cronet_Engine_StartWithParams(engine, engine_params); + Cronet_Engine_Destroy(engine); + Cronet_EngineParams_Destroy(engine_params); +} + TEST_F(EngineTest, StartNetLogToFile) { base::ScopedTempDir temp_dir; EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
diff --git a/components/cronet/native/test/test_stream_engine.cc b/components/cronet/native/test/test_stream_engine.cc new file mode 100644 index 0000000..28abfe7 --- /dev/null +++ b/components/cronet/native/test/test_stream_engine.cc
@@ -0,0 +1,49 @@ +// 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 "cronet_c.h" + +#include "base/logging.h" +#include "components/cronet/native/test/test_util.h" +#include "components/grpc_support/test/get_stream_engine.h" + +namespace grpc_support { + +// Provides stream_engine support for testing of bidirectional_stream C API for +// GRPC using native Cronet_Engine. + +Cronet_EnginePtr g_cronet_engine = nullptr; +int quic_server_port = 0; + +// Returns a stream_engine* for testing with the QuicTestServer. +// The engine returned resolve "test.example.com" as localhost:|port|, +// and should have "test.example.com" configured as a QUIC server. +stream_engine* GetTestStreamEngine(int port) { + CHECK(g_cronet_engine); + CHECK_EQ(port, quic_server_port); + return Cronet_Engine_GetStreamEngine(g_cronet_engine); +} + +// Starts the stream_engine* for testing with the QuicTestServer. +// Has the same properties as GetTestStreamEngine. This function is +// used when the stream_engine* needs to be shut down and restarted +// between test cases (including between all of the bidirectional +// stream test cases and all other tests for the engine; this is the +// situation for Cronet). +void StartTestStreamEngine(int port) { + CHECK(!g_cronet_engine); + quic_server_port = port; + g_cronet_engine = cronet::test::CreateTestEngine(port); +} + +// Shuts a stream_engine* started with |StartTestStreamEngine| down. +// See comment above. +void ShutdownTestStreamEngine() { + CHECK(g_cronet_engine); + Cronet_Engine_Destroy(g_cronet_engine); + g_cronet_engine = nullptr; + quic_server_port = 0; +} + +} // namespace grpc_support
diff --git a/components/cronet/native/test/test_util.cc b/components/cronet/native/test/test_util.cc index e2a1571..258f3bd 100644 --- a/components/cronet/native/test/test_util.cc +++ b/components/cronet/native/test/test_util.cc
@@ -53,6 +53,11 @@ Cronet_QuicHint_Destroy(quic_hint); // Create Cronet Engine. Cronet_EnginePtr cronet_engine = Cronet_Engine_Create(); + // Set Mock Cert Verifier. + auto cert_verifier = std::make_unique<net::MockCertVerifier>(); + cert_verifier->set_default_result(net::OK); + Cronet_Engine_SetMockCertVerifierForTesting(cronet_engine, + cert_verifier.release()); // Start Cronet Engine. Cronet_Engine_StartWithParams(cronet_engine, engine_params); Cronet_EngineParams_Destroy(engine_params);
diff --git a/components/domain_reliability/uploader_unittest.cc b/components/domain_reliability/uploader_unittest.cc index 708d997..8a1680c 100644 --- a/components/domain_reliability/uploader_unittest.cc +++ b/components/domain_reliability/uploader_unittest.cc
@@ -71,7 +71,7 @@ EXPECT_EQ(net::OK, rv); size_t upload_size = upload_stream_->size(); - upload_buffer_ = new net::IOBufferWithSize(upload_size); + upload_buffer_ = base::MakeRefCounted<net::IOBufferWithSize>(upload_size); rv = upload_stream_->Read( upload_buffer_.get(), upload_size, base::BindOnce(&UploadMockURLRequestJob::OnStreamRead,
diff --git a/components/download/internal/background_service/in_memory_download.cc b/components/download/internal/background_service/in_memory_download.cc index 9aea2b3..530ca38 100644 --- a/components/download/internal/background_service/in_memory_download.cc +++ b/components/download/internal/background_service/in_memory_download.cc
@@ -41,6 +41,7 @@ io_task_runner_(io_task_runner), delegate_(delegate), completion_notified_(false), + started_(false), weak_ptr_factory_(this) { DCHECK(!guid_.empty()); } @@ -125,11 +126,22 @@ // Release download data. data_.clear(); + + // OnComplete() called without OnResponseStarted(). This will happen when the + // request was aborted. + if (!started_) + OnResponseStarted(GURL(), network::ResourceResponseHead()); + NotifyDelegateDownloadComplete(); } void InMemoryDownloadImpl::OnRetry(base::OnceClosure start_retry) { Reset(); + + // The original URL is recorded in this class instead of |loader_|, so when + // running retry closure from SimpleUrlLoader, add back the original URL. + url_chain_.push_back(request_params_.url); + std::move(start_retry).Run(); } @@ -204,7 +216,11 @@ void InMemoryDownloadImpl::OnResponseStarted( const GURL& final_url, const network::ResourceResponseHead& response_head) { + started_ = true; response_headers_ = response_head.headers; + + if (delegate_) + delegate_->OnDownloadStarted(this); } void InMemoryDownloadImpl::Reset() { @@ -213,6 +229,7 @@ response_headers_.reset(); bytes_downloaded_ = 0u; completion_notified_ = false; + started_ = false; resume_callback_.Reset(); }
diff --git a/components/download/internal/background_service/in_memory_download.h b/components/download/internal/background_service/in_memory_download.h index df8298a..f4dd780 100644 --- a/components/download/internal/background_service/in_memory_download.h +++ b/components/download/internal/background_service/in_memory_download.h
@@ -44,6 +44,7 @@ // Report download progress with in-memory download backend. class Delegate { public: + virtual void OnDownloadStarted(InMemoryDownload* download) = 0; virtual void OnDownloadProgress(InMemoryDownload* download) = 0; virtual void OnDownloadComplete(InMemoryDownload* download) = 0; @@ -231,6 +232,9 @@ // Ensures Delegate::OnDownloadComplete is only called once. bool completion_notified_; + // If |OnResponseStarted| is called. + bool started_; + // Bounded to main thread task runner. base::WeakPtrFactory<InMemoryDownloadImpl> weak_ptr_factory_;
diff --git a/components/download/internal/background_service/in_memory_download_driver.cc b/components/download/internal/background_service/in_memory_download_driver.cc index d59aa4f..e737cce 100644 --- a/components/download/internal/background_service/in_memory_download_driver.cc +++ b/components/download/internal/background_service/in_memory_download_driver.cc
@@ -108,7 +108,6 @@ downloads_.emplace(guid, std::move(download)); download_ptr->Start(); - client_->OnDownloadCreated(CreateDriverEntry(*download_ptr)); } void InMemoryDownloadDriver::Remove(const std::string& guid) { @@ -155,6 +154,11 @@ return memory_usage; } +void InMemoryDownloadDriver::OnDownloadStarted(InMemoryDownload* download) { + DCHECK(client_); + client_->OnDownloadCreated(CreateDriverEntry(*download)); +} + void InMemoryDownloadDriver::OnDownloadProgress(InMemoryDownload* download) { DCHECK(client_); client_->OnDownloadUpdated(CreateDriverEntry(*download));
diff --git a/components/download/internal/background_service/in_memory_download_driver.h b/components/download/internal/background_service/in_memory_download_driver.h index c28df4c3..f7e112b5 100644 --- a/components/download/internal/background_service/in_memory_download_driver.h +++ b/components/download/internal/background_service/in_memory_download_driver.h
@@ -72,6 +72,7 @@ size_t EstimateMemoryUsage() const override; // InMemoryDownload::Delegate implementation. + void OnDownloadStarted(InMemoryDownload* download) override; void OnDownloadProgress(InMemoryDownload* download) override; void OnDownloadComplete(InMemoryDownload* download) override;
diff --git a/components/download/internal/background_service/in_memory_download_driver_unittest.cc b/components/download/internal/background_service/in_memory_download_driver_unittest.cc index cc7af9b..6eccc97 100644 --- a/components/download/internal/background_service/in_memory_download_driver_unittest.cc +++ b/components/download/internal/background_service/in_memory_download_driver_unittest.cc
@@ -32,6 +32,11 @@ DCHECK(delegate_) << "Delegate can't be nullptr."; } + void SimulateDownloadStarted() { + state_ = InMemoryDownload::State::IN_PROGRESS; + delegate_->OnDownloadStarted(this); + } + void SimulateDownloadProgress() { state_ = InMemoryDownload::State::IN_PROGRESS; delegate_->OnDownloadProgress(this); @@ -130,6 +135,7 @@ const std::string guid = "1234"; EXPECT_CALL(*driver_client(), OnDownloadCreated(_)).Times(1); Start(guid); + factory()->last_created_download()->SimulateDownloadStarted(); // After starting a download, we should be able to find a record in the // driver. @@ -172,6 +178,7 @@ const std::string guid = "1234"; Start(guid); + factory()->last_created_download()->SimulateDownloadStarted(); DriverEntry match_entry; match_entry.state = DriverEntry::State::INTERRUPTED;
diff --git a/components/download/internal/background_service/in_memory_download_unittest.cc b/components/download/internal/background_service/in_memory_download_unittest.cc index bd2b4cc..ddc667d 100644 --- a/components/download/internal/background_service/in_memory_download_unittest.cc +++ b/components/download/internal/background_service/in_memory_download_unittest.cc
@@ -18,6 +18,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using testing::_; using testing::NiceMock; namespace download { @@ -27,6 +28,14 @@ "In earlier tellings, the dog had a better reputation than the cat, " "however the president veto it."; +MATCHER_P2(InMemoryDownloadMatcher, + response_headers, + url_chain, + "Verify in memory download.") { + return arg->response_headers()->raw_headers() == response_headers && + arg->url_chain() == url_chain; +} + // Dummy callback used for IO_PENDING state in blob operations, this is not // called when the blob operation is done, but called when chained with other // IO operations that might return IO_PENDING. @@ -46,6 +55,7 @@ // InMemoryDownload::Delegate implementation. MOCK_METHOD1(OnDownloadProgress, void(InMemoryDownload*)); + MOCK_METHOD1(OnDownloadStarted, void(InMemoryDownload*)); void OnDownloadComplete(InMemoryDownload* download) override { if (run_loop_.running()) run_loop_.Quit(); @@ -126,7 +136,8 @@ DCHECK(blob); int bytes_read = 0; int async_bytes_read = 0; - scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(expected.size())); + scoped_refptr<net::IOBuffer> buffer = + base::MakeRefCounted<net::IOBuffer>(expected.size()); auto blob_reader = blob->CreateReader(); @@ -169,6 +180,8 @@ CreateDownload(request_params); url_loader_factory()->AddResponse(request_params.url.spec(), kTestDownloadData); + + EXPECT_CALL(*delegate(), OnDownloadStarted(_)); // TODO(xingliu): More tests on pause/resume. download()->Start(); delegate()->WaitForCompletion(); @@ -201,14 +214,19 @@ url_loader_factory()->AddResponse(request_params.url, response_head, kTestDownloadData, status, redirects); + std::vector<GURL> expected_url_chain = {request_params.url, + redirect_info.new_url}; + + EXPECT_CALL(*delegate(), + OnDownloadStarted(InMemoryDownloadMatcher( + response_head.headers->raw_headers(), expected_url_chain))); + download()->Start(); delegate()->WaitForCompletion(); EXPECT_EQ(InMemoryDownload::State::COMPLETE, download()->state()); // Verify the response headers and URL chain. The URL chain should contain // the original URL and redirect URL, and should not contain the final URL. - std::vector<GURL> expected_url_chain = {request_params.url, - redirect_info.new_url}; EXPECT_EQ(download()->url_chain(), expected_url_chain); EXPECT_EQ(download()->response_headers()->raw_headers(), response_head.headers->raw_headers());
diff --git a/components/download/internal/common/download_file_unittest.cc b/components/download/internal/common/download_file_unittest.cc index f0f2204..64207502 100644 --- a/components/download/internal/common/download_file_unittest.cc +++ b/components/download/internal/common/download_file_unittest.cc
@@ -266,7 +266,8 @@ for (size_t i = 0; i < num_chunks; i++) { const char* source_data = data_chunks[i]; size_t length = strlen(source_data); - scoped_refptr<net::IOBuffer> data = new net::IOBuffer(length); + scoped_refptr<net::IOBuffer> data = + base::MakeRefCounted<net::IOBuffer>(length); memcpy(data->data(), source_data, length); EXPECT_CALL(*input_stream, Read(_, _)) .InSequence(s)
diff --git a/components/download/internal/common/stream_handle_input_stream.cc b/components/download/internal/common/stream_handle_input_stream.cc index c6c0c7f7..d6a2a823 100644 --- a/components/download/internal/common/stream_handle_input_stream.cc +++ b/components/download/internal/common/stream_handle_input_stream.cc
@@ -70,7 +70,7 @@ return InputStream::EMPTY; *length = kBytesToRead; - *data = new net::IOBuffer(kBytesToRead); + *data = base::MakeRefCounted<net::IOBuffer>(kBytesToRead); MojoResult mojo_result = stream_handle_->stream->ReadData( (*data)->data(), (uint32_t*)length, MOJO_READ_DATA_FLAG_NONE); // TODO(qinmin): figure out when COMPLETE should be returned.
diff --git a/components/drive/chromeos/directory_loader.cc b/components/drive/chromeos/directory_loader.cc index fd0c8a79..02f9898 100644 --- a/components/drive/chromeos/directory_loader.cc +++ b/components/drive/chromeos/directory_loader.cc
@@ -412,7 +412,7 @@ directory_start_page_token, &directory_changestamp)) { logger_->Log( logging::LOG_ERROR, - "Unable to covert directory start page tokens to changestamps, will " + "Unable to convert directory start page tokens to changestamps, will " "load directory from server %s; directory start page token: %s ", directory_fetch_info.ToString().c_str(), directory_start_page_token.c_str()); @@ -428,9 +428,9 @@ &local_changestamp)) { logger_->Log( logging::LOG_ERROR, - "Unable to covert start page tokens to changestamps, will load " + "Unable to convert start page tokens to changestamps, will load " "directory from server %s; local start page token: %s; " - "remove start page token: %s", + "remote start page token: %s", directory_fetch_info.ToString().c_str(), local_start_page_token->c_str(), remote_start_page_token.c_str()); LoadDirectoryFromServer(directory_fetch_info, root_folder_id); @@ -440,7 +440,7 @@ // Start loading the directory. directory_changestamp = std::max(directory_changestamp, local_changestamp); - // If the directory's changestamp is up to date or the global changestamp of + // If the directory's changestamp is up to date or the global changestamp or // the metadata DB is new enough (which means the normal changelist loading // should finish very soon), just schedule to run the callback, as there is no // need to fetch the directory.
diff --git a/components/drive/chromeos/drive_test_util.h b/components/drive/chromeos/drive_test_util.h index 4c81ea3..81e37d04 100644 --- a/components/drive/chromeos/drive_test_util.h +++ b/components/drive/chromeos/drive_test_util.h
@@ -48,7 +48,8 @@ template<typename Reader> int ReadAllData(Reader* reader, std::string* content) { const int kBufferSize = 10; - scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); + scoped_refptr<net::IOBuffer> buffer = + base::MakeRefCounted<net::IOBuffer>(kBufferSize); while (true) { net::TestCompletionCallback callback; int result = reader->Read(buffer.get(), kBufferSize, callback.callback());
diff --git a/components/drive/chromeos/file_system.cc b/components/drive/chromeos/file_system.cc index cea334b..5fc38d20 100644 --- a/components/drive/chromeos/file_system.cc +++ b/components/drive/chromeos/file_system.cc
@@ -438,9 +438,22 @@ // It is possible for the team drive to have been deleted by the time we // receive the push notification. if (it != team_drive_change_list_loaders_.end()) { - it->second->CheckForUpdates(base::Bind(&FileSystem::OnUpdateChecked, - weak_ptr_factory_.GetWeakPtr(), - it->first, closure)); + auto update_checked_closure = + base::Bind(&FileSystem::OnUpdateChecked, + weak_ptr_factory_.GetWeakPtr(), it->first, closure); + if (!it->second->IsRefreshing()) { + team_drive_operation_queue_->AddOperation( + it->second->GetWeakPtr(), + base::BindOnce( + &internal::TeamDriveChangeListLoader::CheckForUpdates, + it->second->GetWeakPtr()), + update_checked_closure); + } else { + // If the change list loader is refreshing, then calling + // CheckForUpdates will just add the callback to a queue to be called + // when the refresh is complete. + it->second->CheckForUpdates(update_checked_closure); + } } else { closure.Run(); }
diff --git a/components/drive/drive_notification_manager.cc b/components/drive/drive_notification_manager.cc index 34e8ab5..1c1daf4 100644 --- a/components/drive/drive_notification_manager.cc +++ b/components/drive/drive_notification_manager.cc
@@ -4,6 +4,7 @@ #include "components/drive/drive_notification_manager.h" +#include <memory> #include <utility> #include "base/metrics/histogram_macros.h" @@ -26,6 +27,10 @@ // polling should be unnecessary if XMPP is enabled, but just in case. const int kSlowPollingIntervalInSecs = 300; +// The period to batch together invalidations before passing them to observers. +constexpr base::TimeDelta kInvalidationBatchInterval = + base::TimeDelta::FromSeconds(5); + // The sync invalidation object ID for Google Drive. const char kDriveInvalidationObjectId[] = "CHANGELOG"; @@ -38,7 +43,8 @@ } // namespace DriveNotificationManager::DriveNotificationManager( - invalidation::InvalidationService* invalidation_service) + invalidation::InvalidationService* invalidation_service, + const base::TickClock* clock) : invalidation_service_(invalidation_service), push_notification_registered_(false), push_notification_enabled_(false), @@ -47,11 +53,20 @@ DCHECK(invalidation_service_); RegisterDriveNotifications(); RestartPollingTimer(); + + batch_timer_ = std::make_unique<base::RetainingOneShotTimer>( + FROM_HERE, kInvalidationBatchInterval, + base::BindRepeating(&DriveNotificationManager::OnBatchTimerExpired, + weak_ptr_factory_.GetWeakPtr()), + clock); } -DriveNotificationManager::~DriveNotificationManager() = default; +DriveNotificationManager::~DriveNotificationManager() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} void DriveNotificationManager::Shutdown() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Unregister for Drive notifications. if (!invalidation_service_ || !push_notification_registered_) return; @@ -65,6 +80,7 @@ void DriveNotificationManager::OnInvalidatorStateChange( syncer::InvalidatorState state) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); push_notification_enabled_ = (state == syncer::INVALIDATIONS_ENABLED); if (push_notification_enabled_) { DVLOG(1) << "XMPP Notifications enabled"; @@ -77,22 +93,18 @@ void DriveNotificationManager::OnIncomingInvalidation( const syncer::ObjectIdInvalidationMap& invalidation_map) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOG(2) << "XMPP Drive Notification Received"; syncer::ObjectIdSet ids = invalidation_map.GetObjectIds(); - // TODO(slangley): Look at batching together notifications, it appears that - // we get can get many consecutive invalidations for the same ObjectId due to - // how drive stores changes. We should collate a few seconds worth of changes - // to filter out duplicates. - std::set<std::string> change_ids; - for (const auto& id : ids) { if (id.name() == kDriveInvalidationObjectId) { // Empty string indicates default change list. - change_ids.insert(""); + invalidated_change_ids_.insert(""); } else if (base::StartsWith(id.name(), kTeamDriveChangePrefix, base::CompareCase::SENSITIVE)) { - change_ids.insert(id.name().substr(kTeamDriveChangePrefixLength)); + invalidated_change_ids_.insert( + id.name().substr(kTeamDriveChangePrefixLength)); } else { NOTREACHED() << "Unexpected ID " << id.name(); } @@ -102,24 +114,34 @@ // to not bother saving invalidations across restarts for us. // See crbug.com/320878. invalidation_map.AcknowledgeAll(); - NotifyObserversToUpdate(NOTIFICATION_XMPP, std::move(change_ids)); + + if (!batch_timer_->IsRunning() && !invalidated_change_ids_.empty()) { + // Stop the polling timer as we'll be sending a batch soon. + polling_timer_.Stop(); + + // Restart the timer to send the batch when the timer fires. + batch_timer_->Reset(); + } } std::string DriveNotificationManager::GetOwnerName() const { return "Drive"; } void DriveNotificationManager::AddObserver( DriveNotificationObserver* observer) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); observers_.AddObserver(observer); } void DriveNotificationManager::RemoveObserver( DriveNotificationObserver* observer) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); observers_.RemoveObserver(observer); } void DriveNotificationManager::UpdateTeamDriveIds( const std::set<std::string>& added_team_drive_ids, const std::set<std::string>& removed_team_drive_ids) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // We only want to update the invalidation service if we actually change the // set of team drive id's we're currently registered for. bool set_changed = false; @@ -142,6 +164,7 @@ } void DriveNotificationManager::RestartPollingTimer() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const int interval_secs = (push_notification_enabled_ ? kSlowPollingIntervalInSecs : kFastPollingIntervalInSecs); @@ -156,6 +179,7 @@ void DriveNotificationManager::NotifyObserversToUpdate( NotificationSource source, const std::set<std::string> ids) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOG(1) << "Notifying observers: " << NotificationSourceToString(source); if (source == NOTIFICATION_XMPP) { @@ -178,6 +202,7 @@ } void DriveNotificationManager::RegisterDriveNotifications() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!push_notification_enabled_); if (!invalidation_service_) @@ -192,6 +217,7 @@ } void DriveNotificationManager::UpdateRegisteredDriveNotifications() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!invalidation_service_) return; @@ -211,6 +237,16 @@ OnInvalidatorStateChange(invalidation_service_->GetInvalidatorState()); } +void DriveNotificationManager::OnBatchTimerExpired() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + std::set<std::string> change_ids_to_update; + invalidated_change_ids_.swap(change_ids_to_update); + if (!change_ids_to_update.empty()) { + NotifyObserversToUpdate(NOTIFICATION_XMPP, change_ids_to_update); + } +} + // static std::string DriveNotificationManager::NotificationSourceToString( NotificationSource source) {
diff --git a/components/drive/drive_notification_manager.h b/components/drive/drive_notification_manager.h index 7291dee52..6f34a31 100644 --- a/components/drive/drive_notification_manager.h +++ b/components/drive/drive_notification_manager.h
@@ -5,12 +5,15 @@ #ifndef COMPONENTS_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ #define COMPONENTS_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ +#include <memory> #include <set> #include <string> #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +#include "base/sequence_checker.h" +#include "base/time/default_tick_clock.h" #include "base/timer/timer.h" #include "components/drive/drive_notification_observer.h" #include "components/invalidation/public/invalidation_handler.h" @@ -29,8 +32,10 @@ class DriveNotificationManager : public KeyedService, public syncer::InvalidationHandler { public: + // |clock| can be injected for testing. explicit DriveNotificationManager( - invalidation::InvalidationService* invalidation_service); + invalidation::InvalidationService* invalidation_service, + const base::TickClock* clock = base::DefaultTickClock::GetInstance()); ~DriveNotificationManager() override; // KeyedService override. @@ -80,6 +85,9 @@ // Updates the list of notifications that we're expecting void UpdateRegisteredDriveNotifications(); + // Dispatches batched invalidations to observers. + void OnBatchTimerExpired(); + // Returns a string representation of NotificationSource. static std::string NotificationSourceToString(NotificationSource source); @@ -100,6 +108,17 @@ // used but notification is done per polling when XMPP is not working. base::OneShotTimer polling_timer_; + // This timer is used to batch together invalidations. The invalidation + // service can send many invalidations for the same id in rapid succession, + // batching them together and removing duplicates is an optimzation. + std::unique_ptr<base::RetainingOneShotTimer> batch_timer_; + + // The batch of invalidation id's that we've seen from the invaliation + // service, will be reset when when send the invalidations to the observers. + std::set<std::string> invalidated_change_ids_; + + SEQUENCE_CHECKER(sequence_checker_); + // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory<DriveNotificationManager> weak_ptr_factory_;
diff --git a/components/drive/drive_notification_manager_unittest.cc b/components/drive/drive_notification_manager_unittest.cc new file mode 100644 index 0000000..82c32da --- /dev/null +++ b/components/drive/drive_notification_manager_unittest.cc
@@ -0,0 +1,212 @@ +// 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 <memory> + +#include "base/strings/strcat.h" +#include "base/test/test_mock_time_task_runner.h" +#include "components/drive/drive_notification_manager.h" +#include "components/drive/drive_notification_observer.h" +#include "components/invalidation/impl/fake_invalidation_service.h" +#include "components/invalidation/public/object_id_invalidation_map.h" +#include "google/cacheinvalidation/types.pb.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace drive { + +namespace { + +const invalidation::ObjectId kDefaultCorpusObjectId( + ipc::invalidation::ObjectSource::COSMO_CHANGELOG, + "CHANGELOG"); + +struct ShutdownHelper { + template <typename T> + void operator()(T* object) const { + if (object) { + object->Shutdown(); + delete object; + } + } +}; + +class FakeDriveNotificationObserver : public DriveNotificationObserver { + public: + ~FakeDriveNotificationObserver() override {} + + // DriveNotificationObserver overrides + void OnNotificationReceived(const std::set<std::string>& ids) override { + notification_ids_ = ids; + } + void OnNotificationTimerFired() override {} + void OnPushNotificationEnabled(bool enabled) override {} + + const std::set<std::string> GetNotificationIds() const { + return notification_ids_; + } + + void ClearNotificationIds() { notification_ids_.clear(); } + + private: + std::set<std::string> notification_ids_; +}; + +invalidation::ObjectId CreateTeamDriveInvalidationObjectId( + const std::string& team_drive_id) { + return invalidation::ObjectId( + ipc::invalidation::ObjectSource::COSMO_CHANGELOG, + base::StrCat({"TD:", team_drive_id})); +} + +} // namespace + +class DriveNotificationManagerTest : public testing::Test { + protected: + void SetUp() override { + task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>( + base::TestMockTimeTaskRunner::Type::kBoundToThread); + fake_invalidation_service_ = + std::make_unique<invalidation::FakeInvalidationService>(); + drive_notification_observer_ = + std::make_unique<FakeDriveNotificationObserver>(); + + // Can't use make_unique with a custom deleter. + drive_notification_manager_.reset( + new DriveNotificationManager(fake_invalidation_service_.get())); + + drive_notification_manager_->AddObserver( + drive_notification_observer_.get()); + } + + void TearDown() override { + drive_notification_manager_->RemoveObserver( + drive_notification_observer_.get()); + } + + scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; + std::unique_ptr<invalidation::FakeInvalidationService> + fake_invalidation_service_; + std::unique_ptr<FakeDriveNotificationObserver> drive_notification_observer_; + std::unique_ptr<DriveNotificationManager, ShutdownHelper> + drive_notification_manager_; +}; + +TEST_F(DriveNotificationManagerTest, RegisterTeamDrives) { + // By default, we should have registered for default corpus notifications on + // initialization. + auto registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + syncer::ObjectIdSet expected_object_ids = {kDefaultCorpusObjectId}; + EXPECT_EQ(expected_object_ids, registered_ids); + + const std::string team_drive_id_1 = "td_id_1"; + const auto team_drive_1_object_id = + CreateTeamDriveInvalidationObjectId(team_drive_id_1); + + // Add the team drive + drive_notification_manager_->UpdateTeamDriveIds({team_drive_id_1}, {}); + registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + expected_object_ids = {kDefaultCorpusObjectId, team_drive_1_object_id}; + EXPECT_EQ(expected_object_ids, registered_ids); + + // Remove the team drive. + drive_notification_manager_->UpdateTeamDriveIds({}, {team_drive_id_1}); + registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + expected_object_ids = {kDefaultCorpusObjectId}; + EXPECT_EQ(expected_object_ids, registered_ids); + + const std::string team_drive_id_2 = "td_id_2"; + const auto team_drive_2_object_id = + CreateTeamDriveInvalidationObjectId(team_drive_id_2); + + // Add two team drives + drive_notification_manager_->UpdateTeamDriveIds( + {team_drive_id_1, team_drive_id_2}, {}); + registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + expected_object_ids = {kDefaultCorpusObjectId, team_drive_1_object_id, + team_drive_2_object_id}; + EXPECT_EQ(expected_object_ids, registered_ids); + + drive_notification_manager_->UpdateTeamDriveIds({}, {team_drive_id_1}); + registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + expected_object_ids = {kDefaultCorpusObjectId, team_drive_2_object_id}; + EXPECT_EQ(expected_object_ids, registered_ids); + + // Remove a team drive that doesn't exists with no changes. + const std::string team_drive_id_3 = "td_id_3"; + drive_notification_manager_->UpdateTeamDriveIds({}, {team_drive_id_3}); + registered_ids = + fake_invalidation_service_->invalidator_registrar().GetAllRegisteredIds(); + + expected_object_ids = {kDefaultCorpusObjectId, team_drive_2_object_id}; + EXPECT_EQ(expected_object_ids, registered_ids); +} + +TEST_F(DriveNotificationManagerTest, TestBatchInvalidation) { + // By default we'll be registered for the default change notification. + + // Emitting an invalidation should not call our observer until the timer + // expires. + fake_invalidation_service_->EmitInvalidationForTest( + syncer::Invalidation::InitUnknownVersion(kDefaultCorpusObjectId)); + EXPECT_TRUE(drive_notification_observer_->GetNotificationIds().empty()); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(5)); + + // Default corpus is has the id "" when sent to observers. + std::set<std::string> expected_ids = {""}; + EXPECT_EQ(expected_ids, drive_notification_observer_->GetNotificationIds()); + drive_notification_observer_->ClearNotificationIds(); + + // Register a team drive for notifications + const std::string team_drive_id_1 = "td_id_1"; + const auto team_drive_1_object_id = + CreateTeamDriveInvalidationObjectId(team_drive_id_1); + drive_notification_manager_->UpdateTeamDriveIds({team_drive_id_1}, {}); + + // Emit invalidation for default corpus, should not emit a team drive + // invalidation. + fake_invalidation_service_->EmitInvalidationForTest( + syncer::Invalidation::InitUnknownVersion(kDefaultCorpusObjectId)); + EXPECT_TRUE(drive_notification_observer_->GetNotificationIds().empty()); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(5)); + + // Default corpus is has the id "" when sent to observers. + expected_ids = {""}; + EXPECT_EQ(expected_ids, drive_notification_observer_->GetNotificationIds()); + drive_notification_observer_->ClearNotificationIds(); + + // Emit team drive invalidation + fake_invalidation_service_->EmitInvalidationForTest( + syncer::Invalidation::InitUnknownVersion(team_drive_1_object_id)); + EXPECT_TRUE(drive_notification_observer_->GetNotificationIds().empty()); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(5)); + expected_ids = {team_drive_id_1}; + EXPECT_EQ(expected_ids, drive_notification_observer_->GetNotificationIds()); + drive_notification_observer_->ClearNotificationIds(); + + // Emit both default corpus and team drive. + fake_invalidation_service_->EmitInvalidationForTest( + syncer::Invalidation::InitUnknownVersion(kDefaultCorpusObjectId)); + fake_invalidation_service_->EmitInvalidationForTest( + syncer::Invalidation::InitUnknownVersion(team_drive_1_object_id)); + EXPECT_TRUE(drive_notification_observer_->GetNotificationIds().empty()); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(5)); + expected_ids = {"", team_drive_id_1}; + EXPECT_EQ(expected_ids, drive_notification_observer_->GetNotificationIds()); +} + +} // namespace drive
diff --git a/components/drive/drive_pref_names.cc b/components/drive/drive_pref_names.cc index 5caa8146..41773b6 100644 --- a/components/drive/drive_pref_names.cc +++ b/components/drive/drive_pref_names.cc
@@ -23,5 +23,8 @@ // when passed to drivefs. const char kDriveFsProfileSalt[] = "drivefs.profile_salt"; +// A boolean pref containing whether pinned files have been migrated to DriveFS. +const char kDriveFsPinnedMigrated[] = "drivefs.pinned_migrated"; + } // namespace prefs } // namespace drive
diff --git a/components/drive/drive_pref_names.h b/components/drive/drive_pref_names.h index fa40c9a..a4c76e28 100644 --- a/components/drive/drive_pref_names.h +++ b/components/drive/drive_pref_names.h
@@ -14,6 +14,7 @@ extern const char kDisableDriveOverCellular[]; extern const char kDisableDriveHostedFiles[]; extern const char kDriveFsProfileSalt[]; +extern const char kDriveFsPinnedMigrated[]; } // namespace prefs } // namespace drive
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn index d2e6fbe..e3f2b93 100644 --- a/components/exo/BUILD.gn +++ b/components/exo/BUILD.gn
@@ -222,6 +222,7 @@ "//ash/strings:ash_test_strings", "//ash/resources:ash_test_resources_100_percent", "//ash/resources:ash_test_resources_200_percent", + "//testing/buildbot/filters:exo_unittests_filters", ] if (is_linux) {
diff --git a/components/exo/buffer_unittest.cc b/components/exo/buffer_unittest.cc index 8cd792c..f3d9525e 100644 --- a/components/exo/buffer_unittest.cc +++ b/components/exo/buffer_unittest.cc
@@ -4,6 +4,7 @@ #include <GLES2/gl2extchromium.h> +#include "ash/shell.h" #include "base/bind.h" #include "base/run_loop.h" #include "components/exo/buffer.h" @@ -25,6 +26,10 @@ using BufferTest = test::ExoTestBase; +aura::Env* GetAuraEnv() { + return ash::Shell::Get()->aura_env(); +} + void Release(int* release_call_count) { (*release_call_count)++; } @@ -33,7 +38,7 @@ std::vector<GLbyte*> sync_tokens; for (auto& resource : frame->resource_list) sync_tokens.push_back(resource.mailbox_holder.sync_token.GetData()); - gpu::gles2::GLES2Interface* gles2 = aura::Env::GetInstance() + gpu::gles2::GLES2Interface* gles2 = GetAuraEnv() ->context_factory() ->SharedMainThreadContextProvider() ->ContextGL(); @@ -97,9 +102,7 @@ ASSERT_TRUE(rv); scoped_refptr<viz::ContextProvider> context_provider = - aura::Env::GetInstance() - ->context_factory() - ->SharedMainThreadContextProvider(); + GetAuraEnv()->context_factory()->SharedMainThreadContextProvider(); if (context_provider) { gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, @@ -151,8 +154,7 @@ buffer->ProduceTransferableResource(frame_sink_holder, false, &resource); ASSERT_TRUE(rv); - static_cast<ui::InProcessContextFactory*>( - aura::Env::GetInstance()->context_factory()) + static_cast<ui::InProcessContextFactory*>(GetAuraEnv()->context_factory()) ->SendOnLostSharedContext(); }
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc index d77205a..78ae006 100644 --- a/components/exo/client_controlled_shell_surface.cc +++ b/components/exo/client_controlled_shell_surface.cc
@@ -19,11 +19,9 @@ #include "ash/shell.h" #include "ash/wm/client_controlled_state.h" #include "ash/wm/drag_details.h" -#include "ash/wm/drag_window_resizer.h" #include "ash/wm/toplevel_window_event_handler.h" #include "ash/wm/window_positioning_utils.h" #include "ash/wm/window_properties.h" -#include "ash/wm/window_resizer.h" #include "ash/wm/window_state.h" #include "ash/wm/window_state_delegate.h" #include "ash/wm/window_util.h" @@ -64,22 +62,6 @@ // Fix it on Android side and reduce the timeout. constexpr int kOrientationLockTimeoutMs = 2500; -// Minimal WindowResizer that unlike DefaultWindowResizer does not handle -// dragging and resizing windows. -class CustomWindowResizer : public ash::WindowResizer { - public: - explicit CustomWindowResizer(ash::wm::WindowState* window_state) - : WindowResizer(window_state) {} - - // Overridden from ash::WindowResizer: - void Drag(const gfx::Point& location, int event_flags) override {} - void CompleteDrag() override {} - void RevertDrag() override {} - - private: - DISALLOW_COPY_AND_ASSIGN(CustomWindowResizer); -}; - Orientation SizeToOrientation(const gfx::Size& size) { DCHECK_NE(size.width(), size.height()); return size.width() > size.height() ? Orientation::LANDSCAPE @@ -327,6 +309,20 @@ display::Screen::GetScreen()->RemoveObserver(this); } +void ClientControlledShellSurface::SetBounds(int64_t display_id, + const gfx::Rect& bounds) { + TRACE_EVENT2("exo", "ClientControlledShellSurface::SetBounds", "display_id", + display_id, "bounds", bounds.ToString()); + + if (bounds.IsEmpty()) { + DLOG(WARNING) << "Bounds must be non-empty"; + return; + } + + SetDisplay(display_id); + SetGeometry(bounds); +} + void ClientControlledShellSurface::SetMaximized() { TRACE_EVENT0("exo", "ClientControlledShellSurface::SetMaximized"); pending_window_state_ = ash::mojom::WindowStateType::MAXIMIZED; @@ -630,7 +626,6 @@ void ClientControlledShellSurface::OnWindowAddedToRootWindow( aura::Window* window) { - ScopedSetBoundsLocally scoped_set_bounds(this); ScopedLockedToRoot scoped_locked_to_root(widget_); UpdateWidgetBounds(); } @@ -734,66 +729,83 @@ // ShellSurfaceBase overrides: void ClientControlledShellSurface::SetWidgetBounds(const gfx::Rect& bounds) { + const auto* screen = display::Screen::GetScreen(); + aura::Window* window = widget_->GetNativeWindow(); + display::Display current_display = screen->GetDisplayNearestWindow(window); + + bool is_display_move_pending = false; + display::Display target_display = current_display; + + display::Display display; + if (screen->GetDisplayWithDisplayId(display_id_, &display)) { + bool is_display_stale = display_id_ != current_display.id(); + + // Preserve widget bounds until client acknowledges display move. + if (preserve_widget_bounds_ && is_display_stale) + return; + + // True if the window has just been reparented to another root window, and + // the move was initiated by the server. + // TODO(oshima): Improve the window moving logic. https://crbug.com/875047 + is_display_move_pending = + window->GetProperty(ash::kLockedToRootKey) && is_display_stale; + + if (!is_display_move_pending) + target_display = display; + + preserve_widget_bounds_ = is_display_move_pending; + } else { + preserve_widget_bounds_ = false; + } + + if (bounds == widget_->GetWindowBoundsInScreen() && + target_display.id() == current_display.id()) { + return; + } + + bool set_bounds_locally = !client_controlled_move_resize_ && + GetWindowState()->is_dragged() && + !is_display_move_pending; + // Android PIP windows can be dismissed by swiping off the screen. Let them be - // positioned off-screen. Apart from swipe to dismiss, the PIP window will - // be kept on screen. - // TODO(edcourtney): This should be done as a client controlled move, not - // a special case. - if (((!client_controlled_move_resize_ && !GetWindowState()->is_dragged()) || - client_controlled_move_resize_) && - !client_controlled_state_->set_bounds_locally() && - !GetWindowState()->IsPip()) { + // positioned off-screen. Apart from swipe to dismiss, the PIP window will be + // kept on screen. + // TODO(edcourtney): This should be done as a client controlled move, not a + // special case. + if (set_bounds_locally || client_controlled_state_->set_bounds_locally() || + GetWindowState()->IsPip()) { + // Convert from screen to display coordinates. + gfx::Point origin = bounds.origin(); + wm::ConvertPointFromScreen(window->parent(), &origin); + + // Move the window relative to the current display. { - // Calculate a minimum window visibility required bounds. - aura::Window* window = widget_->GetNativeWindow(); - gfx::Rect root_rect(bounds); - wm::ConvertRectFromScreen(window->GetRootWindow(), &root_rect); - ash::wm::ClientControlledState::AdjustBoundsForMinimumWindowVisibility( - window, &root_rect); - gfx::Rect screen_rect(root_rect); - wm::ConvertRectToScreen(window->GetRootWindow(), &screen_rect); - if (bounds != screen_rect && - !GetWindowState()->IsMaximizedOrFullscreenOrPinned()) { - { - ScopedSetBoundsLocally scoped_set_bounds(this); - window->SetBounds(root_rect); - } - // Request the client a new bounds to ensure that it has enough visible - // area. - auto state_type = GetWindowState()->GetStateType(); - int64_t display_id = - display::Screen::GetScreen() - ->GetDisplayNearestWindow(window->GetRootWindow()) - .id(); - OnBoundsChangeEvent(state_type, state_type, display_id, screen_rect, 0); - } else { - // TODO(oshima|domlaskowski): This prevent a client from moving a window - // between display. This is ok for now because a user needs to take an - // action to move right now. This will be fixed by new API. - ScopedLockedToRoot scoped_locked_to_root(widget_); - ScopedSetBoundsLocally scoped_set_bounds(this); - widget_->SetBounds(bounds); - } + ScopedSetBoundsLocally scoped_set_bounds(this); + window->SetBounds(gfx::Rect(origin, bounds.size())); } UpdateSurfaceBounds(); return; } - // TODO(domlaskowski): Synchronize window state transitions with the client, - // and abort client-side dragging on transition to fullscreen. - // See crbug.com/699746. - DLOG_IF(ERROR, widget_->GetWindowBoundsInScreen().size() != bounds.size()) - << "Window size changed during client-driven drag"; + // Calculate a minimum window visibility required bounds. + gfx::Rect adjusted_bounds = bounds; + if (!is_display_move_pending) { + ash::wm::ClientControlledState::AdjustBoundsForMinimumWindowVisibility( + target_display.bounds(), &adjusted_bounds); + } - // Convert from screen to display coordinates. - gfx::Point origin = bounds.origin(); - wm::ConvertPointFromScreen(widget_->GetNativeWindow()->parent(), &origin); - - // Move the window relative to the current display. { ScopedSetBoundsLocally scoped_set_bounds(this); - widget_->GetNativeWindow()->SetBounds(gfx::Rect(origin, bounds.size())); + window->SetBoundsInScreen(adjusted_bounds, target_display); } + + if (bounds != adjusted_bounds || is_display_move_pending) { + // Notify client that bounds were adjusted or window moved across displays. + auto state_type = GetWindowState()->GetStateType(); + OnBoundsChangeEvent(state_type, state_type, target_display.id(), + adjusted_bounds, 0); + } + UpdateSurfaceBounds(); } @@ -858,6 +870,8 @@ if (!widget_) { // Modify the |origin_| to the |pending_geometry_| to place the window on // the intended display. See b/77472684 for details. + // TODO(domlaskowski): Remove this once clients migrate to geometry API with + // explicit target display. if (!pending_geometry_.IsEmpty()) origin_ = pending_geometry_.origin(); CreateShellSurfaceWidget(ash::ToWindowShowState(pending_window_state_));
diff --git a/components/exo/client_controlled_shell_surface.h b/components/exo/client_controlled_shell_surface.h index 0d3a07d..2556721 100644 --- a/components/exo/client_controlled_shell_surface.h +++ b/components/exo/client_controlled_shell_surface.h
@@ -56,6 +56,9 @@ client_controlled_move_resize_ = client_controlled_move_resize; } + // Set bounds in root window coordinates relative to the given display. + void SetBounds(int64_t display_id, const gfx::Rect& bounds); + // Called when the client was maximized. void SetMaximized(); @@ -298,6 +301,8 @@ ash::OrientationLockType initial_orientation_lock_ = ash::OrientationLockType::kAny; + bool preserve_widget_bounds_ = false; + DISALLOW_COPY_AND_ASSIGN(ClientControlledShellSurface); };
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc index d1489b9..21d7c34 100644 --- a/components/exo/client_controlled_shell_surface_unittest.cc +++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -608,7 +608,7 @@ // AutoHide base::RunLoop().RunUntilIdle(); - auto* env = aura::Env::GetInstance(); + aura::Env* env = ash::Shell::Get()->aura_env(); gfx::Rect cropped_fullscreen_bounds(0, 0, 800, 400); env->SetLastMouseLocation(gfx::Point(100, 30)); TestEventHandler handler; @@ -1266,8 +1266,11 @@ std::unique_ptr<Buffer> desktop_buffer( new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(window_size))); surface->Attach(desktop_buffer.get()); + + display::Display primary_display = + display::Screen::GetScreen()->GetPrimaryDisplay(); gfx::Rect initial_bounds(-150, 10, 200, 200); - shell_surface->SetGeometry(initial_bounds); + shell_surface->SetBounds(primary_display.id(), initial_bounds); surface->Commit(); shell_surface->GetWidget()->Show(); @@ -1312,8 +1315,12 @@ std::unique_ptr<Buffer> desktop_buffer( new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(window_size))); surface->Attach(desktop_buffer.get()); + + display::Display primary_display = + display::Screen::GetScreen()->GetPrimaryDisplay(); + gfx::Rect initial_bounds(-174, 10, 200, 200); - shell_surface->SetGeometry(initial_bounds); + shell_surface->SetBounds(primary_display.id(), initial_bounds); surface->Commit(); shell_surface->GetWidget()->Show(); @@ -1327,8 +1334,6 @@ &ClientControlledShellSurfaceDisplayTest::OnBoundsChangeEvent, base::Unretained(this))); - display::Display primary_display = - display::Screen::GetScreen()->GetPrimaryDisplay(); display::Display secondary_display = display::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[1]); @@ -1336,13 +1341,13 @@ EXPECT_EQ(root_windows[1], window->GetRootWindow()); ASSERT_EQ(1, bounds_change_count()); - EXPECT_EQ(gfx::Rect(226, 10, 200, 200), requested_bounds()[0]); + EXPECT_EQ(gfx::Rect(-174, 10, 200, 200), requested_bounds()[0]); EXPECT_EQ(secondary_display.id(), requested_display_ids()[0]); - gfx::Rect secondary_position(1100, 10, 200, 200); - shell_surface->SetGeometry(secondary_position); + gfx::Rect secondary_position(700, 10, 200, 200); + shell_surface->SetBounds(secondary_display.id(), secondary_position); surface->Commit(); - EXPECT_EQ(secondary_position, window->GetBoundsInScreen()); + EXPECT_EQ(gfx::Rect(1100, 10, 200, 200), window->GetBoundsInScreen()); Reset(); @@ -1352,7 +1357,7 @@ EXPECT_EQ(root_windows[0], window->GetRootWindow()); ASSERT_EQ(2, bounds_change_count()); // Should fit in the primary display. - EXPECT_EQ(gfx::Rect(700, 10, 200, 200), requested_bounds()[0]); + EXPECT_EQ(gfx::Rect(1100, 10, 200, 200), requested_bounds()[0]); EXPECT_EQ(primary_display.id(), requested_display_ids()[0]); EXPECT_EQ(gfx::Rect(374, 10, 200, 200), requested_bounds()[1]); @@ -1535,15 +1540,16 @@ EXPECT_FALSE(shell_surface->frame_enabled()); } -TEST_F(ClientControlledShellSurfaceTest, MultiDisplay) { - display::test::DisplayManagerTestApi test_api( - ash::Shell::Get()->display_manager()); - test_api.UpdateDisplay("100x100,100+0-100x100"); +TEST_F(ClientControlledShellSurfaceTest, + SetGeometryReparentsToDisplayOnFirstCommit) { + UpdateDisplay("100x100,100+0-100x100"); gfx::Size buffer_size(64, 64); std::unique_ptr<Buffer> buffer( new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); + const auto* screen = display::Screen::GetScreen(); + { std::unique_ptr<Surface> surface(new Surface); auto shell_surface = @@ -1553,16 +1559,12 @@ shell_surface->SetGeometry(geometry); surface->Attach(buffer.get()); surface->Commit(); - EXPECT_EQ(geometry.size().ToString(), shell_surface->GetWidget() - ->GetWindowBoundsInScreen() - .size() - .ToString()); + EXPECT_EQ(geometry, shell_surface->GetWidget()->GetWindowBoundsInScreen()); - display::Display display = - display::Screen::GetScreen()->GetDisplayNearestWindow( - shell_surface->host_window()); - EXPECT_EQ(gfx::Point(0, 0).ToString(), - display.bounds().origin().ToString()); + display::Display primary_display = screen->GetPrimaryDisplay(); + display::Display display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(primary_display.id(), display.id()); } { @@ -1574,19 +1576,79 @@ shell_surface->SetGeometry(geometry); surface->Attach(buffer.get()); surface->Commit(); - EXPECT_EQ(geometry.size().ToString(), shell_surface->GetWidget() - ->GetWindowBoundsInScreen() - .size() - .ToString()); + EXPECT_EQ(geometry, shell_surface->GetWidget()->GetWindowBoundsInScreen()); - display::Display display = - display::Screen::GetScreen()->GetDisplayNearestWindow( - shell_surface->host_window()); - EXPECT_EQ(gfx::Point(100, 0).ToString(), - display.bounds().origin().ToString()); + auto root_windows = ash::Shell::GetAllRootWindows(); + display::Display secondary_display = + screen->GetDisplayNearestWindow(root_windows[1]); + display::Display display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(secondary_display.id(), display.id()); } } +TEST_F(ClientControlledShellSurfaceTest, SetBoundsReparentsToDisplay) { + UpdateDisplay("100x100,100+0-100x100"); + + gfx::Size buffer_size(64, 64); + std::unique_ptr<Buffer> buffer( + new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); + + const auto* screen = display::Screen::GetScreen(); + + std::unique_ptr<Surface> surface(new Surface); + auto shell_surface = + exo_test_helper()->CreateClientControlledShellSurface(surface.get()); + + display::Display primary_display = screen->GetPrimaryDisplay(); + gfx::Rect geometry(16, 16, 32, 32); + + // Move to primary display with bounds inside display. + shell_surface->SetBounds(primary_display.id(), geometry); + surface->Attach(buffer.get()); + surface->Commit(); + EXPECT_EQ(geometry, shell_surface->GetWidget()->GetWindowBoundsInScreen()); + + display::Display display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(primary_display.id(), display.id()); + + auto root_windows = ash::Shell::GetAllRootWindows(); + display::Display secondary_display = + screen->GetDisplayNearestWindow(root_windows[1]); + + // Move to secondary display with bounds inside display. + shell_surface->SetBounds(secondary_display.id(), geometry); + surface->Commit(); + EXPECT_EQ(gfx::Rect(116, 16, 32, 32), + shell_surface->GetWidget()->GetWindowBoundsInScreen()); + + display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(secondary_display.id(), display.id()); + + // Move to primary display with bounds outside display. + geometry.set_origin({-100, 0}); + shell_surface->SetBounds(primary_display.id(), geometry); + surface->Commit(); + EXPECT_EQ(gfx::Rect(-6, 0, 32, 32), + shell_surface->GetWidget()->GetWindowBoundsInScreen()); + + display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(primary_display.id(), display.id()); + + // Move to secondary display with bounds outside display. + shell_surface->SetBounds(secondary_display.id(), geometry); + surface->Commit(); + EXPECT_EQ(gfx::Rect(94, 0, 32, 32), + shell_surface->GetWidget()->GetWindowBoundsInScreen()); + + display = screen->GetDisplayNearestWindow( + shell_surface->GetWidget()->GetNativeWindow()); + EXPECT_EQ(secondary_display.id(), display.id()); +} + // Set orientation lock to a window. TEST_F(ClientControlledShellSurfaceTest, SetOrientationLock) { display::test::DisplayManagerTestApi(ash::Shell::Get()->display_manager())
diff --git a/components/exo/pointer_unittest.cc b/components/exo/pointer_unittest.cc index 9056fea..7c5b19f 100644 --- a/components/exo/pointer_unittest.cc +++ b/components/exo/pointer_unittest.cc
@@ -27,6 +27,14 @@ namespace exo { namespace { +viz::SurfaceManager* GetSurfaceManager() { + return ash::Shell::Get() + ->aura_env() + ->context_factory_private() + ->GetFrameSinkManager() + ->surface_manager(); +} + class MockPointerDelegate : public PointerDelegate { public: MockPointerDelegate() {} @@ -98,10 +106,7 @@ const viz::RenderPass* last_render_pass; { viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); - viz::SurfaceManager* surface_manager = aura::Env::GetInstance() - ->context_factory_private() - ->GetFrameSinkManager() - ->surface_manager(); + viz::SurfaceManager* surface_manager = GetSurfaceManager(); ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame()); const viz::CompositorFrame& frame = surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); @@ -117,10 +122,7 @@ // Verify that adjustment to hotspot resulted in new frame. { viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); - viz::SurfaceManager* surface_manager = aura::Env::GetInstance() - ->context_factory_private() - ->GetFrameSinkManager() - ->surface_manager(); + viz::SurfaceManager* surface_manager = GetSurfaceManager(); ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame()); const viz::CompositorFrame& frame = surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); @@ -204,10 +206,7 @@ { viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); - viz::SurfaceManager* surface_manager = aura::Env::GetInstance() - ->context_factory_private() - ->GetFrameSinkManager() - ->surface_manager(); + viz::SurfaceManager* surface_manager = GetSurfaceManager(); ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame()); const viz::CompositorFrame& frame = surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); @@ -289,10 +288,7 @@ { viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); - viz::SurfaceManager* surface_manager = aura::Env::GetInstance() - ->context_factory_private() - ->GetFrameSinkManager() - ->surface_manager(); + viz::SurfaceManager* surface_manager = GetSurfaceManager(); ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame()); const viz::CompositorFrame& frame = surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); @@ -311,10 +307,7 @@ { viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); - viz::SurfaceManager* surface_manager = aura::Env::GetInstance() - ->context_factory_private() - ->GetFrameSinkManager() - ->surface_manager(); + viz::SurfaceManager* surface_manager = GetSurfaceManager(); ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame()); const viz::CompositorFrame& frame = surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame();
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc index 1f4c3e3..a816f35 100644 --- a/components/exo/shell_surface.cc +++ b/components/exo/shell_surface.cc
@@ -456,6 +456,9 @@ // ShellSurfaceBase overrides: void ShellSurface::SetWidgetBounds(const gfx::Rect& bounds) { + if (bounds == widget_->GetWindowBoundsInScreen()) + return; + // Set |ignore_window_bounds_changes_| as this change to window bounds // should not result in a configure request. DCHECK(!ignore_window_bounds_changes_);
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc index 8d51d8d..89919c15 100644 --- a/components/exo/shell_surface_base.cc +++ b/components/exo/shell_surface_base.cc
@@ -7,7 +7,6 @@ #include <algorithm> #include "ash/frame/non_client_frame_view_ash.h" -#include "ash/public/cpp/config.h" #include "ash/public/cpp/shelf_types.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" @@ -33,12 +32,12 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/window.h" -#include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_observer.h" #include "ui/aura/window_targeter.h" #include "ui/aura/window_tree_host.h" #include "ui/base/accelerators/accelerator.h" #include "ui/base/class_property.h" +#include "ui/base/ui_base_features.h" #include "ui/compositor/compositor.h" #include "ui/compositor/dip_util.h" #include "ui/compositor_extra/shadow.h" @@ -529,6 +528,12 @@ pending_geometry_ = geometry; } +void ShellSurfaceBase::SetDisplay(int64_t display_id) { + TRACE_EVENT1("exo", "ShellSurfaceBase::SetDisplay", "display_id", display_id); + + pending_display_id_ = display_id; +} + void ShellSurfaceBase::SetOrigin(const gfx::Point& origin) { TRACE_EVENT1("exo", "ShellSurfaceBase::SetOrigin", "origin", origin.ToString()); @@ -980,13 +985,9 @@ aura::Window* window = widget_->GetNativeWindow(); window->SetName("ExoShellSurface"); window->AddChild(host_window()); - // Use DESCENDANTS_ONLY event targeting policy for mus/mash. - // TODO(https://crbug.com/839521): Revisit after event dispatching code is - // changed for mus/mash. + // Works for both mash and non-mash. https://crbug.com/839521 window->SetEventTargetingPolicy( - ash::Shell::GetAshConfig() == ash::Config::CLASSIC - ? ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS - : ws::mojom::EventTargetingPolicy::DESCENDANTS_ONLY); + ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS); window->SetEventTargeter(std::make_unique<CustomWindowTargeter>( widget_, client_controlled_move_resize_)); SetApplicationId(window, application_id_); @@ -1051,12 +1052,9 @@ return; } - base::Optional<gfx::Rect> new_widget_bounds = GetWidgetBounds(); - if (!new_widget_bounds) - return; - - if (*new_widget_bounds != widget_->GetWindowBoundsInScreen()) - SetWidgetBounds(*new_widget_bounds); + base::Optional<gfx::Rect> bounds = GetWidgetBounds(); + if (bounds) + SetWidgetBounds(*bounds); } void ShellSurfaceBase::UpdateSurfaceBounds() { @@ -1105,20 +1103,19 @@ gfx::Rect ShellSurfaceBase::GetVisibleBounds() const { // Use |geometry_| if set, otherwise use the visual bounds of the surface. - if (!geometry_.IsEmpty()) + if (geometry_.IsEmpty()) { + return root_surface() ? gfx::Rect(root_surface()->content_size()) + : gfx::Rect(); + } + + const auto* screen = display::Screen::GetScreen(); + display::Display display; + + if (!screen->GetDisplayWithDisplayId(display_id_, &display)) return geometry_; - return root_surface() ? gfx::Rect(root_surface()->content_size()) - : gfx::Rect(); -} - -gfx::Point ShellSurfaceBase::GetMouseLocation() const { - aura::Window* const root_window = widget_->GetNativeWindow()->GetRootWindow(); - gfx::Point location = - root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot(); - aura::Window::ConvertPointToTarget( - root_window, widget_->GetNativeWindow()->parent(), &location); - return location; + // Convert from display to screen coordinates. + return geometry_ + display.bounds().OffsetFromOrigin(); } gfx::Rect ShellSurfaceBase::GetClientViewBounds() const { @@ -1170,6 +1167,7 @@ void ShellSurfaceBase::CommitWidget() { // Apply new window geometry. geometry_ = pending_geometry_; + display_id_ = pending_display_id_; // Apply new minimum/maximium size. bool size_constraint_changed = minimum_size_ != pending_minimum_size_ ||
diff --git a/components/exo/shell_surface_base.h b/components/exo/shell_surface_base.h index 34d93b2..6e6a2732 100644 --- a/components/exo/shell_surface_base.h +++ b/components/exo/shell_surface_base.h
@@ -20,6 +20,7 @@ #include "ui/aura/window_observer.h" #include "ui/base/hit_test.h" #include "ui/display/display_observer.h" +#include "ui/display/types/display_constants.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/vector2d.h" @@ -114,6 +115,9 @@ // for the surface from the user's perspective. void SetGeometry(const gfx::Rect& geometry); + // If set, geometry is in display rather than window or screen coordinates. + void SetDisplay(int64_t display_id); + // Set origin in screen coordinate space. void SetOrigin(const gfx::Point& origin); @@ -232,9 +236,6 @@ // Returns the "visible bounds" for the surface from the user's perspective. gfx::Rect GetVisibleBounds() const; - // In the coordinate system of the parent root window. - gfx::Point GetMouseLocation() const; - // Returns the bounds of the client area.nnn gfx::Rect GetClientViewBounds() const; @@ -258,6 +259,8 @@ int container_; gfx::Rect geometry_; gfx::Rect pending_geometry_; + int64_t display_id_ = display::kInvalidDisplayId; + int64_t pending_display_id_ = display::kInvalidDisplayId; base::Optional<gfx::Rect> shadow_bounds_; bool shadow_bounds_changed_ = false; base::string16 title_;
diff --git a/components/exo/test/test_client_controlled_state_delegate.cc b/components/exo/test/test_client_controlled_state_delegate.cc index 6abd7a31..c1cf594 100644 --- a/components/exo/test/test_client_controlled_state_delegate.cc +++ b/components/exo/test/test_client_controlled_state_delegate.cc
@@ -59,22 +59,10 @@ if (!shell_surface->host_window()->GetRootWindow()) return; - gfx::Rect bounds_in_screen(bounds); - ::wm::ConvertRectToScreen(window_state->window()->GetRootWindow(), - &bounds_in_screen); - if (shell_surface->has_bounds_changed_callback()) { - int64_t display_id = display::Screen::GetScreen() - ->GetDisplayNearestWindow(window_state->window()) - .id(); - shell_surface->OnBoundsChangeEvent( - window_state->GetStateType(), requested_state, display_id, - bounds_in_screen, - window_state->drag_details() - ? window_state->drag_details()->bounds_change - : 0); - } - - shell_surface->SetGeometry(bounds_in_screen); + int64_t display_id = display::Screen::GetScreen() + ->GetDisplayNearestWindow(window_state->window()) + .id(); + shell_surface->SetBounds(display_id, bounds); if (requested_state != window_state->GetStateType()) { DCHECK(requested_state == ash::mojom::WindowStateType::LEFT_SNAPPED ||
diff --git a/components/exo/wayland/clients/test/wayland_client_test.cc b/components/exo/wayland/clients/test/wayland_client_test.cc index 34100a2f..bf5200c 100644 --- a/components/exo/wayland/clients/test/wayland_client_test.cc +++ b/components/exo/wayland/clients/test/wayland_client_test.cc
@@ -8,7 +8,6 @@ #include <memory> -#include "ash/public/cpp/config.h" #include "ash/session/session_controller.h" #include "ash/shell.h" #include "ash/test/ash_test_environment.h" @@ -132,9 +131,7 @@ ash::Shell::GetPrimaryRootWindow()->Show(); ash::Shell::GetPrimaryRootWindow()->GetHost()->Show(); ash::Shell::GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(-1000, -1000)); - - if (ash::Shell::GetAshConfig() == ash::Config::CLASSIC) - ash::Shell::Get()->cursor_manager()->EnableMouseEvents(); + ash::Shell::Get()->cursor_manager()->EnableMouseEvents(); // Changing GestureConfiguration shouldn't make tests fail. These values // prevent unexpected events from being generated during tests. Such as
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc index 7deee195..104eace1 100644 --- a/components/exo/wayland/server.cc +++ b/components/exo/wayland/server.cc
@@ -2438,6 +2438,19 @@ GetUserDataAs<ClientControlledShellSurface>(resource)->SetPip(); } +void remote_surface_set_bounds(wl_client* client, + wl_resource* resource, + uint32_t display_id_hi, + uint32_t display_id_lo, + int32_t x, + int32_t y, + int32_t width, + int32_t height) { + GetUserDataAs<ClientControlledShellSurface>(resource)->SetBounds( + static_cast<int64_t>(display_id_hi) << 32 | display_id_lo, + gfx::Rect(x, y, width, height)); +} + const struct zcr_remote_surface_v1_interface remote_surface_implementation = { remote_surface_destroy, remote_surface_set_app_id, @@ -2479,7 +2492,8 @@ remote_surface_set_frame_buttons, remote_surface_set_extra_title, remote_surface_set_orientation_lock, - remote_surface_pip}; + remote_surface_pip, + remote_surface_set_bounds}; //////////////////////////////////////////////////////////////////////////////// // notification_surface_interface: @@ -2938,7 +2952,7 @@ remote_shell_get_notification_surface, remote_shell_get_input_method_surface}; -const uint32_t remote_shell_version = 17; +const uint32_t remote_shell_version = 18; void bind_remote_shell(wl_client* client, void* data,
diff --git a/components/feed/content/feed_offline_host.cc b/components/feed/content/feed_offline_host.cc index 72c53db..94eef9a 100644 --- a/components/feed/content/feed_offline_host.cc +++ b/components/feed/content/feed_offline_host.cc
@@ -21,6 +21,28 @@ FeedOfflineHost::~FeedOfflineHost() = default; +base::Optional<int64_t> FeedOfflineHost::GetOfflineId(std::string url) { + return {}; +} + +void FeedOfflineHost::GetOfflineStatus( + std::vector<std::string> urls, + base::OnceCallback<void(const std::vector<std::string>&)> callback) { + // TODO(skym): Call OfflinePageModel::GetPagesByURL() for each url. +} + +void FeedOfflineHost::OnContentRemoved(std::vector<std::string> urls) { + // TODO(skym): Call PrefetchService::RemoveSuggestion(). +} + +void FeedOfflineHost::OnNewContentReceived() { + // TODO(skym): Call PrefetchService::NewSuggestionsAvailable(). +} + +void FeedOfflineHost::OnNoListeners() { + // TODO(skym): Clear out local cache of offline data. +} + void FeedOfflineHost::GetCurrentArticleSuggestions( offline_pages::SuggestionsProvider::SuggestionCallback suggestions_callback) {
diff --git a/components/feed/content/feed_offline_host.h b/components/feed/content/feed_offline_host.h index 2af25b6..ad8799d 100644 --- a/components/feed/content/feed_offline_host.h +++ b/components/feed/content/feed_offline_host.h
@@ -5,9 +5,13 @@ #ifndef COMPONENTS_FEED_CONTENT_FEED_OFFLINE_HOST_H_ #define COMPONENTS_FEED_CONTENT_FEED_OFFLINE_HOST_H_ +#include <string> +#include <vector> + #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "components/offline_pages/core/offline_page_model.h" #include "components/offline_pages/core/prefetch/suggestions_provider.h" @@ -34,6 +38,32 @@ FeedSchedulerHost* feed_scheduler_host); ~FeedOfflineHost() override; + // Synchronously returns the offline id of the given page. The host will only + // have knowledge of the page if it had previously returned status about it + // through GetOfflineState() or as a notification. Otherwise the caller will + // receive a false negative. Additionally, since the host tracks pages by + // hashing, there's also a small chance that the host erroneously returns an + // id for a page that is not offlined. + base::Optional<int64_t> GetOfflineId(std::string url); + + // Asynchronously fetches offline status for the given URLs. Any pages that + // are currently offlined will be remembered by the FeedOfflineHost. + void GetOfflineStatus( + std::vector<std::string> urls, + base::OnceCallback<void(const std::vector<std::string>&)> callback); + + // Should be called from Feed any time the user manually removes articles or + // groupings of articles. Propagates the signal to Prefetch. + void OnContentRemoved(std::vector<std::string> urls); + + // Should be called from Feed any time new articles are fetched. + void OnNewContentReceived(); + + // Should be called from Feed side any time there are no active surfaces + // displaying articles and listening to our notifications. This signal is used + // to clear local tracking of offlined items. + void OnNoListeners(); + // offline_pages::SuggestionsProvider: void GetCurrentArticleSuggestions( offline_pages::SuggestionsProvider::SuggestionCallback
diff --git a/components/grpc_support/BUILD.gn b/components/grpc_support/BUILD.gn index 515aeba5..d7f8d1a 100644 --- a/components/grpc_support/BUILD.gn +++ b/components/grpc_support/BUILD.gn
@@ -1,3 +1,9 @@ +source_set("headers") { + public = [ + "include/bidirectional_stream_c.h", + ] +} + source_set("grpc_support") { sources = [ "bidirectional_stream.cc", @@ -7,12 +13,14 @@ ] deps = [ + ":headers", "//base", "//net", "//url", ] } +# Depends on ":grpc_support" implementation. source_set("bidirectional_stream_unittest") { testonly = true sources = [ @@ -30,3 +38,22 @@ "//components/grpc_support/test:get_stream_engine_header", ] } + +# Depends on ":headers" to avoid ":grpc_support" implementation. +source_set("bidirectional_stream_test") { + testonly = true + sources = [ + "bidirectional_stream_unittest.cc", + ] + + deps = [ + ":headers", + "//base", + "//net", + "//net:test_support", + ] + + public_deps = [ + "//components/grpc_support/test:get_stream_engine_header", + ] +}
diff --git a/components/grpc_support/bidirectional_stream.cc b/components/grpc_support/bidirectional_stream.cc index 2a7ba56..7141763 100644 --- a/components/grpc_support/bidirectional_stream.cc +++ b/components/grpc_support/bidirectional_stream.cc
@@ -109,8 +109,8 @@ bool BidirectionalStream::ReadData(char* buffer, int capacity) { if (!buffer) return false; - scoped_refptr<net::WrappedIOBuffer> read_buffer( - new net::WrappedIOBuffer(buffer)); + scoped_refptr<net::WrappedIOBuffer> read_buffer = + base::MakeRefCounted<net::WrappedIOBuffer>(buffer); PostToNetworkThread( FROM_HERE, base::BindOnce(&BidirectionalStream::ReadDataOnNetworkThread, @@ -124,8 +124,8 @@ if (!buffer) return false; - scoped_refptr<net::WrappedIOBuffer> write_buffer( - new net::WrappedIOBuffer(buffer)); + scoped_refptr<net::WrappedIOBuffer> write_buffer = + base::MakeRefCounted<net::WrappedIOBuffer>(buffer); PostToNetworkThread( FROM_HERE,
diff --git a/components/grpc_support/include/bidirectional_stream_c.h b/components/grpc_support/include/bidirectional_stream_c.h index 98866696..3a6fae8 100644 --- a/components/grpc_support/include/bidirectional_stream_c.h +++ b/components/grpc_support/include/bidirectional_stream_c.h
@@ -6,7 +6,7 @@ #define COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_C_H_ #if defined(WIN32) -#define GRPC_SUPPORT_EXPORT +#define GRPC_SUPPORT_EXPORT __declspec(dllexport) #else #define GRPC_SUPPORT_EXPORT __attribute__((visibility("default"))) #endif @@ -242,4 +242,4 @@ } #endif -#endif // COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_H_ +#endif // COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_C_H_
diff --git a/components/invalidation/impl/fcm_network_handler.cc b/components/invalidation/impl/fcm_network_handler.cc index 32e6eb3..4b68c25 100644 --- a/components/invalidation/impl/fcm_network_handler.cc +++ b/components/invalidation/impl/fcm_network_handler.cc
@@ -23,7 +23,9 @@ const char kInvalidationsAppId[] = "com.google.chrome.fcm.invalidations"; const char kInvalidationGCMSenderId[] = "8181035976"; -const char kContentKey[] = "data"; +const char kPayloadKey[] = "payload"; +const char kPublicTopic[] = "external_name"; +const char kVersionKey[] = "version"; // OAuth2 Scope passed to getToken to obtain GCM registration tokens. // Must match Java GoogleCloudMessaging.INSTANCE_ID_SCOPE. @@ -32,6 +34,15 @@ // Lower bound time between two token validations when listening. const int kTokenValidationPeriodMinutesDefault = 60 * 24; +std::string GetValueFromMessage(const gcm::IncomingMessage& message, + const std::string& key) { + std::string value; + auto it = message.data.find(key); + if (it != message.data.end()) + value = it->second; + return value; +} + } // namespace FCMNetworkHandler::FCMNetworkHandler( @@ -144,21 +155,25 @@ void FCMNetworkHandler::OnMessage(const std::string& app_id, const gcm::IncomingMessage& message) { DCHECK_EQ(app_id, kInvalidationsAppId); - std::string content; - auto it = message.data.find(kContentKey); - if (it != message.data.end()) - content = it->second; - if (content.empty()) { + std::string payload = GetValueFromMessage(message, kPayloadKey); + std::string version = GetValueFromMessage(message, kVersionKey); + + // Version must always be there. + if (version.empty()) return; - } + + std::string public_topic = GetValueFromMessage(message, kPublicTopic); + + // Public topic must always be there. + if (public_topic.empty()) + return; // TODO(melandory): check if content is empty and report. - // TODO(melandory): decode base64 and report in case it is invalid. - // TODO(melandory): parse proto and record histogram in case of invalid proto. // TODO(melandory): report histogram in case of success. + std::string private_topic = message.sender_id; UpdateGcmChannelState(true); - DeliverIncomingMessage(content); + DeliverIncomingMessage(payload, private_topic, public_topic, version); } void FCMNetworkHandler::OnMessagesDeleted(const std::string& app_id) {
diff --git a/components/invalidation/impl/fcm_network_handler_unittests.cc b/components/invalidation/impl/fcm_network_handler_unittests.cc index 84d80fa..b3b2798f 100644 --- a/components/invalidation/impl/fcm_network_handler_unittests.cc +++ b/components/invalidation/impl/fcm_network_handler_unittests.cc
@@ -31,7 +31,11 @@ namespace { const char kInvalidationsAppId[] = "com.google.chrome.fcm.invalidations"; -using DataCallback = base::RepeatingCallback<void(const std::string& message)>; +using TokenCallback = base::RepeatingCallback<void(const std::string& message)>; +using MessageCallback = base::RepeatingCallback<void(const std::string&, + const std::string&, + const std::string&, + const std::string&)>; base::Time GetDummyNow() { base::Time out_time; @@ -142,19 +146,41 @@ DISALLOW_COPY_AND_ASSIGN(MockInstanceIDDriver); }; -class MockOnDataCallback { +class MockOnTokenCallback { public: // Workaround for gMock's lack of support for movable-only arguments. void WrappedRun(const std::string& token) { Run(token); } - DataCallback Get() { - return base::BindRepeating(&MockOnDataCallback::WrappedRun, + TokenCallback Get() { + return base::BindRepeating(&MockOnTokenCallback::WrappedRun, base::Unretained(this)); } MOCK_METHOD1(Run, void(const std::string&)); }; +class MockOnMessageCallback { + public: + // Workaround for gMock's lack of support for movable-only arguments. + void WrappedRun(const std::string& payload, + const std::string& private_topic_name, + const std::string& public_topic_name, + const std::string& version) { + Run(payload, private_topic_name, public_topic_name, version); + } + + MessageCallback Get() { + return base::BindRepeating(&MockOnMessageCallback::WrappedRun, + base::Unretained(this)); + } + + MOCK_METHOD4(Run, + void(const std::string&, + const std::string&, + const std::string&, + const std::string&)); +}; + ACTION_TEMPLATE(InvokeCallbackArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_1_VALUE_PARAMS(p0)) { @@ -216,7 +242,7 @@ TEST_F(FCMNetworkHandlerTest, ShouldPassTheTokenOnceRecieved) { std::unique_ptr<FCMNetworkHandler> handler = MakeHandler(); - MockOnDataCallback mock_on_token_callback; + MockOnTokenCallback mock_on_token_callback; handler->SetTokenReceiver(mock_on_token_callback.Get()); // Check that the handler gets the token through GetToken. @@ -230,7 +256,7 @@ TEST_F(FCMNetworkHandlerTest, ShouldPassTheTokenOnceSubscribed) { std::unique_ptr<FCMNetworkHandler> handler = MakeHandler(); - MockOnDataCallback mock_on_token_callback; + MockOnTokenCallback mock_on_token_callback; // Check that the handler gets the token through GetToken. EXPECT_CALL(*mock_instance_id(), GetToken(_, _, _, _)) @@ -244,10 +270,10 @@ } TEST_F(FCMNetworkHandlerTest, ShouldNotInvokeMessageCallbackOnEmptyMessage) { - MockOnDataCallback mock_on_message_callback; + MockOnMessageCallback mock_on_message_callback; std::unique_ptr<FCMNetworkHandler> handler = MakeHandler(); - EXPECT_CALL(mock_on_message_callback, Run(_)).Times(0); + EXPECT_CALL(mock_on_message_callback, Run(_, _, _, _)).Times(0); handler->SetMessageReceiver(mock_on_message_callback.Get()); EXPECT_CALL(*mock_instance_id(), GetToken(_, _, _, _)) .WillOnce( @@ -258,7 +284,7 @@ } TEST_F(FCMNetworkHandlerTest, ShouldInvokeMessageCallbackOnValidMessage) { - MockOnDataCallback mock_on_message_callback; + MockOnMessageCallback mock_on_message_callback; gcm::IncomingMessage message; message.data["data"] = "test"; @@ -267,14 +293,14 @@ .WillOnce( InvokeCallbackArgument<3>("token", InstanceID::Result::SUCCESS)); handler->StartListening(); - EXPECT_CALL(mock_on_message_callback, Run("test")).Times(0); + EXPECT_CALL(mock_on_message_callback, Run("test", _, _, _)).Times(0); handler->SetMessageReceiver(mock_on_message_callback.Get()); handler->OnMessage(kInvalidationsAppId, gcm::IncomingMessage()); } TEST_F(FCMNetworkHandlerTest, ShouldRequestTokenImmediatellyEvenIfSaved) { // Setting up network handler. - MockOnDataCallback mock_on_token_callback; + MockOnTokenCallback mock_on_token_callback; auto handler = MakeHandler(); auto task_runner = CreateFakeTaskRunnerAndInjectToHandler(handler); handler->SetTokenReceiver(mock_on_token_callback.Get()); @@ -305,7 +331,7 @@ TEST_F(FCMNetworkHandlerTest, ShouldScheduleTokenValidationAndActOnNewToken) { // Setting up network handler. - MockOnDataCallback mock_on_token_callback; + MockOnTokenCallback mock_on_token_callback; auto handler = MakeHandler(); auto task_runner = CreateFakeTaskRunnerAndInjectToHandler(handler); handler->SetTokenReceiver(mock_on_token_callback.Get()); @@ -336,7 +362,7 @@ TEST_F(FCMNetworkHandlerTest, ShouldScheduleTokenValidationAndDoNotActOnSameToken) { // Setting up network handler. - MockOnDataCallback mock_on_token_callback; + MockOnTokenCallback mock_on_token_callback; std::unique_ptr<FCMNetworkHandler> handler = MakeHandler(); auto task_runner = CreateFakeTaskRunnerAndInjectToHandler(handler); handler->SetTokenReceiver(mock_on_token_callback.Get());
diff --git a/components/invalidation/impl/fcm_sync_invalidation_listener.cc b/components/invalidation/impl/fcm_sync_invalidation_listener.cc index 11fb5835..13b7d28d 100644 --- a/components/invalidation/impl/fcm_sync_invalidation_listener.cc +++ b/components/invalidation/impl/fcm_sync_invalidation_listener.cc
@@ -55,8 +55,9 @@ const TopicSet& topics) { registered_topics_ = topics; if (ticl_state_ == INVALIDATIONS_ENABLED && - per_user_topic_registration_manager_ && !token_.empty()) + per_user_topic_registration_manager_ && !token_.empty()) { DoRegistrationUpdate(); + } } void FCMSyncInvalidationListener::Ready(InvalidationClient* client) { @@ -68,56 +69,20 @@ void FCMSyncInvalidationListener::Invalidate( InvalidationClient* client, - const invalidation::Invalidation& invalidation) { + const std::string& payload, + const std::string& private_topic_name, + const std::string& public_topic_name, + int64_t version) { DCHECK_EQ(client, invalidation_client_.get()); - const invalidation::ObjectId& id = invalidation.object_id(); - - std::string payload; - // payload() CHECK()'s has_payload(), so we must check it ourselves first. - if (invalidation.has_payload()) - payload = invalidation.payload(); - - DVLOG(2) << "Received invalidation with version " << invalidation.version() - << " for " << ObjectIdToString(id); - TopicInvalidationMap invalidations; - Invalidation inv = Invalidation::Init(id, invalidation.version(), payload); + Invalidation inv = + Invalidation::Init(ConvertTopicToId(public_topic_name), version, payload); inv.SetAckHandler(AsWeakPtr(), base::ThreadTaskRunnerHandle::Get()); + DVLOG(1) << "Received invalidation with version " << inv.version() << " for " + << public_topic_name; + invalidations.Insert(inv); - - DispatchInvalidations(invalidations); -} - -void FCMSyncInvalidationListener::InvalidateUnknownVersion( - InvalidationClient* client, - const invalidation::ObjectId& object_id) { - DCHECK_EQ(client, invalidation_client_.get()); - DVLOG(1) << "InvalidateUnknownVersion"; - - TopicInvalidationMap invalidations; - Invalidation unknown_version = Invalidation::InitUnknownVersion(object_id); - unknown_version.SetAckHandler(AsWeakPtr(), - base::ThreadTaskRunnerHandle::Get()); - invalidations.Insert(unknown_version); - - DispatchInvalidations(invalidations); -} - -// This should behave as if we got an invalidation with version -// UNKNOWN_OBJECT_VERSION for all known data types. -void FCMSyncInvalidationListener::InvalidateAll(InvalidationClient* client) { - DCHECK_EQ(client, invalidation_client_.get()); - DVLOG(1) << "InvalidateAll"; - - TopicInvalidationMap invalidations; - for (const auto& registered_topic : registered_topics_) { - invalidation::ObjectId id(ConvertTopicToId(registered_topic)); - Invalidation unknown_version = Invalidation::InitUnknownVersion(id); - unknown_version.SetAckHandler(AsWeakPtr(), - base::ThreadTaskRunnerHandle::Get()); - invalidations.Insert(unknown_version); - } DispatchInvalidations(invalidations); } @@ -149,14 +114,9 @@ void FCMSyncInvalidationListener::EmitSavedInvalidations( const TopicInvalidationMap& to_emit) { - DVLOG(2) << "Emitting invalidations: " << to_emit.ToString(); delegate_->OnInvalidate(to_emit); } -void FCMSyncInvalidationListener::InformError( - InvalidationClient* client, - const invalidation::ErrorInfo& error_info) {} - void FCMSyncInvalidationListener::InformTokenRecieved( InvalidationClient* client, const std::string& token) {
diff --git a/components/invalidation/impl/fcm_sync_invalidation_listener.h b/components/invalidation/impl/fcm_sync_invalidation_listener.h index a962292..f37ba5f 100644 --- a/components/invalidation/impl/fcm_sync_invalidation_listener.h +++ b/components/invalidation/impl/fcm_sync_invalidation_listener.h
@@ -67,13 +67,10 @@ // InvalidationListener implementation. void Ready(InvalidationClient* client) override; void Invalidate(InvalidationClient* client, - const invalidation::Invalidation& invalidation) override; - void InvalidateUnknownVersion( - InvalidationClient* client, - const invalidation::ObjectId& object_id) override; - void InvalidateAll(InvalidationClient* client) override; - void InformError(InvalidationClient* client, - const invalidation::ErrorInfo& error_info) override; + const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + int64_t version) override; void InformTokenRecieved(InvalidationClient* client, const std::string& token) override;
diff --git a/components/invalidation/impl/fcm_sync_invalidation_listener_unittest.cc b/components/invalidation/impl/fcm_sync_invalidation_listener_unittest.cc index 0dd049b..14b6716 100644 --- a/components/invalidation/impl/fcm_sync_invalidation_listener_unittest.cc +++ b/components/invalidation/impl/fcm_sync_invalidation_listener_unittest.cc
@@ -223,6 +223,7 @@ fake_invalidation_client_ = nullptr; std::unique_ptr<MockRegistrationManager> mock_registration_manager = std::make_unique<MockRegistrationManager>(); + registration_manager_ = mock_registration_manager.get(); listener_.Start(base::BindOnce(&CreateFakeInvalidationClient, &fake_invalidation_client_), &fake_delegate_, std::move(mock_registration_manager)); @@ -284,28 +285,17 @@ return listener_.GetRegisteredIdsForTest(); } - // |payload| can be NULL. + void RegisterAndFireInvalidate(const Topic& topic, + int64_t version, + const std::string& payload) { + FireInvalidate(topic, version, payload); + } + void FireInvalidate(const Topic& topic, int64_t version, - const char* payload) { - invalidation::Invalidation inv; - if (payload) { - inv = - invalidation::Invalidation(ConvertTopicToId(topic), version, payload); - } else { - inv = invalidation::Invalidation(ConvertTopicToId(topic), version); - } - listener_.Invalidate(fake_invalidation_client_, inv); - } - - // |payload| can be NULL, but not |type_name|. - void FireInvalidateUnknownVersion(const Topic& topic) { - listener_.InvalidateUnknownVersion(fake_invalidation_client_, - ConvertTopicToId(topic)); - } - - void FireInvalidateAll() { - listener_.InvalidateAll(fake_invalidation_client_); + const std::string& payload) { + listener_.Invalidate(fake_invalidation_client_, payload, topic, topic, + version); } void EnableNotifications() { @@ -327,6 +317,7 @@ private: base::MessageLoop message_loop_; FCMSyncNetworkChannel* fcm_sync_network_channel_; + MockRegistrationManager* registration_manager_; protected: // A derrived test needs direct access to this. @@ -347,7 +338,7 @@ TEST_F(FCMSyncInvalidationListenerTest, InvalidateNoPayload) { const Topic& topic = kBookmarksTopic_; - FireInvalidate(topic, kVersion1, nullptr); + RegisterAndFireInvalidate(topic, kVersion1, std::string()); ASSERT_EQ(1U, GetInvalidationCount(topic)); ASSERT_FALSE(IsUnknownVersion(topic)); @@ -361,7 +352,7 @@ TEST_F(FCMSyncInvalidationListenerTest, InvalidateEmptyPayload) { const Topic& topic = kBookmarksTopic_; - FireInvalidate(topic, kVersion1, ""); + RegisterAndFireInvalidate(topic, kVersion1, std::string()); ASSERT_EQ(1U, GetInvalidationCount(topic)); ASSERT_FALSE(IsUnknownVersion(topic)); @@ -374,7 +365,7 @@ TEST_F(FCMSyncInvalidationListenerTest, InvalidateWithPayload) { const Topic& topic = kPreferencesTopic_; - FireInvalidate(topic, kVersion1, kPayload1); + RegisterAndFireInvalidate(topic, kVersion1, kPayload1); ASSERT_EQ(1U, GetInvalidationCount(topic)); ASSERT_FALSE(IsUnknownVersion(topic)); @@ -388,7 +379,7 @@ const Topic& topic = kPreferencesTopic_; int64_t initial_version = kVersion1; for (int64_t i = initial_version; i < initial_version + kRepeatCount; ++i) { - FireInvalidate(topic, i, kPayload1); + RegisterAndFireInvalidate(topic, i, kPayload1); } ASSERT_EQ(static_cast<size_t>(kRepeatCount), GetInvalidationCount(topic)); ASSERT_FALSE(IsUnknownVersion(topic)); @@ -444,10 +435,6 @@ ASSERT_EQ(UnackedInvalidationSet::kMaxBufferedInvalidations, GetInvalidationCount(topic)); - ASSERT_FALSE(IsUnknownVersion(topic)); - EXPECT_EQ(initial_version + kRepeatCount - 1, GetVersion(topic)); - EXPECT_EQ(kPayload1, GetPayload(topic)); - EXPECT_TRUE(StartsWithUnknownVersion(topic)); } // Fire an invalidation, then fire another one with a lower version. Both @@ -455,7 +442,7 @@ TEST_F(FCMSyncInvalidationListenerTest, InvalidateVersion) { const Topic& topic = kPreferencesTopic_; - FireInvalidate(topic, kVersion2, kPayload2); + RegisterAndFireInvalidate(topic, kVersion2, kPayload2); ASSERT_EQ(1U, GetInvalidationCount(topic)); ASSERT_FALSE(IsUnknownVersion(topic)); @@ -471,37 +458,16 @@ EXPECT_EQ(kPayload1, GetPayload(topic)); } -// Fire an invalidation with an unknown version. -TEST_F(FCMSyncInvalidationListenerTest, InvalidateUnknownVersion) { - const Topic& topic = kBookmarksTopic_; - - FireInvalidateUnknownVersion(topic); - - ASSERT_EQ(1U, GetInvalidationCount(topic)); - EXPECT_TRUE(IsUnknownVersion(topic)); -} - -// Fire an invalidation for all enabled topics. -TEST_F(FCMSyncInvalidationListenerTest, InvalidateAll) { - FireInvalidateAll(); - - for (const auto& topic : registred_topics_) { - ASSERT_EQ(1U, GetInvalidationCount(topic)); - EXPECT_TRUE(IsUnknownVersion(topic)); - } -} - -// Test a simple scenario for multiple topics. +// Test a simple scenario for multiple IDs. TEST_F(FCMSyncInvalidationListenerTest, InvalidateMultipleIds) { - FireInvalidate(kBookmarksTopic_, 3, nullptr); - + RegisterAndFireInvalidate(kBookmarksTopic_, 3, std::string()); ASSERT_EQ(1U, GetInvalidationCount(kBookmarksTopic_)); ASSERT_FALSE(IsUnknownVersion(kBookmarksTopic_)); EXPECT_EQ(3, GetVersion(kBookmarksTopic_)); EXPECT_EQ("", GetPayload(kBookmarksTopic_)); // kExtensionId is not registered, so the invalidation should not get through. - FireInvalidate(kExtensionsTopic_, 2, nullptr); + FireInvalidate(kExtensionsTopic_, 2, std::string()); ASSERT_EQ(0U, GetInvalidationCount(kExtensionsTopic_)); }
diff --git a/components/invalidation/impl/fcm_sync_network_channel.cc b/components/invalidation/impl/fcm_sync_network_channel.cc index fbfd051..1e45bda 100644 --- a/components/invalidation/impl/fcm_sync_network_channel.cc +++ b/components/invalidation/impl/fcm_sync_network_channel.cc
@@ -35,13 +35,17 @@ observer.OnFCMSyncNetworkChannelStateChanged(invalidator_state); } -bool FCMSyncNetworkChannel::DeliverIncomingMessage(const std::string& message) { +bool FCMSyncNetworkChannel::DeliverIncomingMessage( + const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + const std::string& version) { if (!incoming_receiver_) { DLOG(ERROR) << "No receiver for incoming notification"; return false; } received_messages_count_++; - incoming_receiver_.Run(message); + incoming_receiver_.Run(payload, private_topic, public_topic, version); return true; }
diff --git a/components/invalidation/impl/fcm_sync_network_channel.h b/components/invalidation/impl/fcm_sync_network_channel.h index 669bc873..a9f9d3c5 100644 --- a/components/invalidation/impl/fcm_sync_network_channel.h +++ b/components/invalidation/impl/fcm_sync_network_channel.h
@@ -54,7 +54,10 @@ // Subclass should call DeliverIncomingMessage for message to reach // invalidations library. - bool DeliverIncomingMessage(const std::string& message); + bool DeliverIncomingMessage(const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + const std::string& version); // Subclass should call DeliverToken for token to reach registration // manager.
diff --git a/components/invalidation/impl/invalidation_listener.h b/components/invalidation/impl/invalidation_listener.h index 411f5a0..983462c 100644 --- a/components/invalidation/impl/invalidation_listener.h +++ b/components/invalidation/impl/invalidation_listener.h
@@ -7,12 +7,6 @@ #include <string> -namespace invalidation { -class ObjectId; -class Invalidation; -class ErrorInfo; -} // namespace invalidation - namespace syncer { class InvalidationClient; @@ -20,9 +14,6 @@ // Handlers registration and message recieving events. class InvalidationListener { public: - /* Possible registration states for an object. */ - enum RegistrationState { REGISTERED, UNREGISTERED }; - virtual ~InvalidationListener() {} /* Called in response to the InvalidationClient::Start call. Indicates that @@ -43,39 +34,15 @@ * * Arguments: * client - the InvalidationClient invoking the listener + * payload - additional info specific to the invalidations + * version - version of the invalidation + * private_topic_name - the topic, which was invalidated */ virtual void Invalidate(InvalidationClient* client, - const invalidation::Invalidation& invalidation) = 0; - - /* As Invalidate, but for an unknown application store version. The object may - * or may not have been updated - to ensure that the application does not miss - * an update from its backend, the application must check and/or fetch the - * latest version from its store. - */ - virtual void InvalidateUnknownVersion( - InvalidationClient* client, - const invalidation::ObjectId& object_id) = 0; - - /* Indicates that the application should consider all objects to have changed. - * This event is generally sent when the client has been disconnected from the - * network for too long a period and has been unable to resynchronize with the - * update stream, but it may be invoked arbitrarily (although the service - * tries hard not to invoke it under normal circumstances). - * - * Arguments: - * client - the InvalidationClient invoking the listener - */ - virtual void InvalidateAll(InvalidationClient* client) = 0; - - /* Informs the listener about errors that have occurred in the backend, e.g., - * authentication, authorization problems. - * - * Arguments: - * client - the InvalidationClient invoking the listener - * error_info - information about the error - */ - virtual void InformError(InvalidationClient* client, - const invalidation::ErrorInfo& error_info) = 0; + const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + int64_t version) = 0; /* Informs the listener token *
diff --git a/components/invalidation/impl/network_channel.h b/components/invalidation/impl/network_channel.h index cbb843a..76f6c30 100644 --- a/components/invalidation/impl/network_channel.h +++ b/components/invalidation/impl/network_channel.h
@@ -10,7 +10,10 @@ namespace syncer { using MessageCallback = - base::RepeatingCallback<void(const std::string& message)>; + base::RepeatingCallback<void(const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + const std::string& version)>; using TokenCallback = base::RepeatingCallback<void(const std::string& message)>; /*
diff --git a/components/invalidation/impl/per_user_topic_invalidation_client.cc b/components/invalidation/impl/per_user_topic_invalidation_client.cc index 0266947..6c12c0a4 100644 --- a/components/invalidation/impl/per_user_topic_invalidation_client.cc +++ b/components/invalidation/impl/per_user_topic_invalidation_client.cc
@@ -5,10 +5,18 @@ #include "components/invalidation/impl/per_user_topic_invalidation_client.h" #include "base/bind.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "components/invalidation/impl/invalidation_listener.h" #include "components/invalidation/impl/logger.h" #include "components/invalidation/impl/network_channel.h" +namespace { + +const char kPrivatTopicName[] = "/topics"; +const int kPrivatTopicNameSize = 7; +} + namespace syncer { std::unique_ptr<InvalidationClient> CreatePerUserTopicInvalidationClient( @@ -64,9 +72,25 @@ } void PerUserTopicInvalidationClient::MessageReceiver( - const std::string& message) { - // TODO(melandory): Here message should be passed to the protocol handler, - // converted to the invalidation and passed to the listener afterwards. + const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + const std::string& version) { + std::string private_topic_name = private_topic; + if (base::StartsWith(private_topic, kPrivatTopicName, + base::CompareCase::INSENSITIVE_ASCII)) { + // FCM protocol requires topic to start with"/topics" to topic name. + // Reason why it is necessary to strip the prefix is that later the shorter + // topic name is used for indexing into maps. + private_topic_name = private_topic.substr(kPrivatTopicNameSize); + } + int64_t v = 0; + if (!base::StringToInt64(version, &v)) { + // Version must always be in the message and + // in addition version must be number. + // TODO(melandory): Report Error to listener; + } + GetListener()->Invalidate(this, payload, private_topic_name, public_topic, v); } void PerUserTopicInvalidationClient::TokenReceiver(const std::string& token) {
diff --git a/components/invalidation/impl/per_user_topic_invalidation_client.h b/components/invalidation/impl/per_user_topic_invalidation_client.h index 53028a2..5e2235a 100644 --- a/components/invalidation/impl/per_user_topic_invalidation_client.h +++ b/components/invalidation/impl/per_user_topic_invalidation_client.h
@@ -45,7 +45,10 @@ void RegisterWithNetwork(); /* Handles inbound messages from the network. */ - void MessageReceiver(const std::string& message); + void MessageReceiver(const std::string& payload, + const std::string& private_topic, + const std::string& public_topic, + const std::string& version); /* Handles registartion tokens from the network. */ void TokenReceiver(const std::string& token);
diff --git a/components/invalidation/impl/per_user_topic_invalidation_client_unittest.cc b/components/invalidation/impl/per_user_topic_invalidation_client_unittest.cc index a1cac91c..4817cfd 100644 --- a/components/invalidation/impl/per_user_topic_invalidation_client_unittest.cc +++ b/components/invalidation/impl/per_user_topic_invalidation_client_unittest.cc
@@ -16,24 +16,12 @@ class MockInvalidationListener : public InvalidationListener { public: MOCK_METHOD1(Ready, void(InvalidationClient*)); - MOCK_METHOD2(Invalidate, - void(InvalidationClient*, const invalidation::Invalidation&)); - MOCK_METHOD2(InvalidateUnknownVersion, - void(InvalidationClient*, const invalidation::ObjectId&)); - MOCK_METHOD1(InvalidateAll, void(InvalidationClient*)); - MOCK_METHOD3(InformRegistrationStatus, + MOCK_METHOD5(Invalidate, void(InvalidationClient*, - const invalidation::ObjectId&, - InvalidationListener::RegistrationState)); - MOCK_METHOD4(InformRegistrationFailure, - void(InvalidationClient*, - const invalidation::ObjectId&, - bool, - const std::string&)); - MOCK_METHOD3(ReissueRegistrations, - void(InvalidationClient*, const std::string&, int)); - MOCK_METHOD2(InformError, - void(InvalidationClient*, const invalidation::ErrorInfo&)); + const std::string&, + const std::string&, + const std::string&, + int64_t)); MOCK_METHOD2(InformTokenRecieved, void(InvalidationClient*, const std::string&)); };
diff --git a/components/invalidation/impl/per_user_topic_registration_manager.cc b/components/invalidation/impl/per_user_topic_registration_manager.cc index 289b3abf..e126cbaa 100644 --- a/components/invalidation/impl/per_user_topic_registration_manager.cc +++ b/components/invalidation/impl/per_user_topic_registration_manager.cc
@@ -39,9 +39,9 @@ "https://www.googleapis.com/auth/firebase.messaging"; using SubscriptionFinishedCallback = - base::OnceCallback<void(Topic id, - const Status& code, - const std::string& private_topic_name, + base::OnceCallback<void(Topic topic, + Status code, + std::string private_topic_name, PerUserTopicRegistrationRequest::RequestType type)>; static const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { @@ -110,7 +110,8 @@ void PerUserTopicRegistrationManager::RegistrationEntry::RegistrationFinished( const Status& code, const std::string& topic_name) { - std::move(completion_callback).Run(id, code, topic_name, type); + if (completion_callback) + std::move(completion_callback).Run(id, code, topic_name, type); } PerUserTopicRegistrationManager::PerUserTopicRegistrationManager( @@ -139,9 +140,9 @@ !private_topic_name.empty()) { topic_to_private_topic_[topic] = private_topic_name; continue; - } + } // Remove saved pref. - keys_to_remove.push_back(topic); + keys_to_remove.push_back(topic); } // Delete prefs, which weren't decoded successfully. @@ -153,35 +154,35 @@ } void PerUserTopicRegistrationManager::UpdateRegisteredTopics( - const TopicSet& ids, + const TopicSet& topics, const std::string& instance_id_token) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); token_ = instance_id_token; // TODO(melandory): On change of token registrations // should be re-requested. - for (const auto& id : ids) { + for (const auto& topic : topics) { // If id isn't registered, schedule the registration. - if (topic_to_private_topic_.find(id) == topic_to_private_topic_.end()) { - registration_statuses_[id] = std::make_unique<RegistrationEntry>( - id, + if (topic_to_private_topic_.find(topic) == topic_to_private_topic_.end()) { + registration_statuses_[topic] = std::make_unique<RegistrationEntry>( + topic, base::BindOnce( - &PerUserTopicRegistrationManager::RegistrationFinishedForId, + &PerUserTopicRegistrationManager::RegistrationFinishedForTopic, base::Unretained(this)), PerUserTopicRegistrationRequest::SUBSCRIBE); } } - // There is registered id, which need to be unregistered. + // There is registered topic, which need to be unregistered. // Schedule unregistration and immediately remove from // |topic_to_private_topic_| for (auto it = topic_to_private_topic_.begin(); it != topic_to_private_topic_.end();) { - auto id = it->first; - if (ids.find(id) == ids.end()) { - registration_statuses_[id] = std::make_unique<RegistrationEntry>( - id, + auto topic = it->first; + if (topics.find(topic) == topics.end()) { + registration_statuses_[topic] = std::make_unique<RegistrationEntry>( + topic, base::BindOnce( - &PerUserTopicRegistrationManager::RegistrationFinishedForId, + &PerUserTopicRegistrationManager::RegistrationFinishedForTopic, base::Unretained(this)), PerUserTopicRegistrationRequest::UNSUBSCRIBE); it = topic_to_private_topic_.erase(it); @@ -223,28 +224,28 @@ parse_json_, url_loader_factory_); } -void PerUserTopicRegistrationManager::RegistrationFinishedForId( - Topic id, - const Status& code, - const std::string& private_topic_name, +void PerUserTopicRegistrationManager::RegistrationFinishedForTopic( + Topic topic, + Status code, + std::string private_topic_name, PerUserTopicRegistrationRequest::RequestType type) { if (code.IsSuccess()) { - auto it = registration_statuses_.find(id); + auto it = registration_statuses_.find(topic); registration_statuses_.erase(it); DictionaryPrefUpdate update(local_state_, kTypeRegisteredForInvalidation); switch (type) { case PerUserTopicRegistrationRequest::SUBSCRIBE: { - update->SetKey(id, base::Value(private_topic_name)); - topic_to_private_topic_[id] = private_topic_name; + update->SetKey(topic, base::Value(private_topic_name)); + topic_to_private_topic_[topic] = private_topic_name; break; } case PerUserTopicRegistrationRequest::UNSUBSCRIBE: { - update->RemoveKey(id); + update->RemoveKey(topic); break; } } - local_state_->CommitPendingWrite(); + return; } // TODO(melandory): reschedule subscription or unsubscription attempt // in case of failure.
diff --git a/components/invalidation/impl/per_user_topic_registration_manager.h b/components/invalidation/impl/per_user_topic_registration_manager.h index 5141b46..3c05b72 100644 --- a/components/invalidation/impl/per_user_topic_registration_manager.h +++ b/components/invalidation/impl/per_user_topic_registration_manager.h
@@ -55,7 +55,6 @@ const std::string& token); virtual void Init(); - TopicSet GetRegisteredIds() const; private: @@ -66,10 +65,10 @@ // Tries to register |id|. No retry in case of failure. void StartRegistrationRequest(const Topic& id); - void RegistrationFinishedForId( - Topic id, - const Status& code, - const std::string& private_topic_name, + void RegistrationFinishedForTopic( + Topic topic, + Status code, + std::string private_topic_name, PerUserTopicRegistrationRequest::RequestType type); void RequestAccessToken();
diff --git a/components/management_strings.grdp b/components/management_strings.grdp new file mode 100644 index 0000000..91cc0c8 --- /dev/null +++ b/components/management_strings.grdp
@@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <message name="IDS_MANAGEMENT_TITLE" desc="Title of chrome://management page, which shows the administrator's capabilities in a managed environment" translateable="false"> + Management + </message> + <message name="IDS_MANAGEMENT_DEVICE_NOT_MANAGED" desc="Message indicating that the device is not managed" translateable="false"> + Your device is not managed by an administrator + </message> + <message name="IDS_MANAGEMENT_DEVICE_MANAGED_BY" desc="Message indicating that the device is enterprise enrolled to be managed by an administrator, from a specific domain" translateable="false"> + Your device is managed by <ph name="ENROLLMENT_DOMAIN">$1<ex>example.com</ex></ph> + </message> + <message name="IDS_MANAGEMENT_DEVICE_MANAGED" desc="Message indicating that the device is enterprise enrolled to be managed by an administrator" translateable="false"> + Your device is managed by an administrator + </message> +</grit-part>
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn index 3171e82..504f6d37 100644 --- a/components/metrics/BUILD.gn +++ b/components/metrics/BUILD.gn
@@ -399,7 +399,6 @@ "//base/test:test_support", "//components/component_updater:test_support", "//components/encrypted_messages:encrypted_message_proto", - "//components/metrics/public/cpp:call_stack_unit_tests", "//components/prefs:test_support", "//components/variations", "//extensions/buildflags", @@ -426,7 +425,6 @@ # these tests. if (is_ios) { sources -= [ "child_call_stack_profile_collector_unittest.cc" ] - deps -= [ "//components/metrics/public/cpp:call_stack_unit_tests" ] } }
diff --git a/components/metrics/call_stack_profile_builder.cc b/components/metrics/call_stack_profile_builder.cc index 7b2890f..c94262b0 100644 --- a/components/metrics/call_stack_profile_builder.cc +++ b/components/metrics/call_stack_profile_builder.cc
@@ -281,18 +281,6 @@ GetBrowserProcessReceiverCallbackInstance() = callback; } -void CallStackProfileBuilder::PassProfilesToMetricsProvider( - SampledProfile sampled_profile) { - if (profile_params_.process == CallStackProfileParams::BROWSER_PROCESS) { - GetBrowserProcessReceiverCallbackInstance().Run(profile_start_time_, - std::move(sampled_profile)); - } else { - g_child_call_stack_profile_collector.Get() - .ChildCallStackProfileCollector::Collect(profile_start_time_, - std::move(sampled_profile)); - } -} - // static void CallStackProfileBuilder::SetProcessMilestone(int milestone) { DCHECK_LE(0, milestone); @@ -309,6 +297,18 @@ std::move(browser_interface)); } +void CallStackProfileBuilder::PassProfilesToMetricsProvider( + SampledProfile sampled_profile) { + if (profile_params_.process == CallStackProfileParams::BROWSER_PROCESS) { + GetBrowserProcessReceiverCallbackInstance().Run(profile_start_time_, + std::move(sampled_profile)); + } else { + g_child_call_stack_profile_collector.Get() + .ChildCallStackProfileCollector::Collect(profile_start_time_, + std::move(sampled_profile)); + } +} + // These operators permit types to be compared and used in a map of Samples. bool operator==(const CallStackProfileBuilder::Sample& a,
diff --git a/components/metrics/call_stack_profile_collector.cc b/components/metrics/call_stack_profile_collector.cc index 38633314..2242954 100644 --- a/components/metrics/call_stack_profile_collector.cc +++ b/components/metrics/call_stack_profile_collector.cc
@@ -13,28 +13,21 @@ namespace metrics { -CallStackProfileCollector::CallStackProfileCollector( - CallStackProfileParams::Process expected_process) - : expected_process_(expected_process) {} +CallStackProfileCollector::CallStackProfileCollector() = default; -CallStackProfileCollector::~CallStackProfileCollector() {} +CallStackProfileCollector::~CallStackProfileCollector() = default; // static void CallStackProfileCollector::Create( - CallStackProfileParams::Process expected_process, mojom::CallStackProfileCollectorRequest request) { - mojo::MakeStrongBinding( - std::make_unique<CallStackProfileCollector>(expected_process), - std::move(request)); + mojo::MakeStrongBinding(std::make_unique<CallStackProfileCollector>(), + std::move(request)); } void CallStackProfileCollector::Collect(base::TimeTicks start_timestamp, - SampledProfile profile) { - if (profile.process() != ToExecutionContextProcess(expected_process_)) - return; - - CallStackProfileMetricsProvider::ReceiveCompletedProfile(start_timestamp, - std::move(profile)); + mojom::SampledProfilePtr profile) { + CallStackProfileMetricsProvider::ReceiveSerializedProfile( + start_timestamp, std::move(profile->contents)); } } // namespace metrics
diff --git a/components/metrics/call_stack_profile_collector.h b/components/metrics/call_stack_profile_collector.h index 0ffb94d..e4b6371 100644 --- a/components/metrics/call_stack_profile_collector.h +++ b/components/metrics/call_stack_profile_collector.h
@@ -6,32 +6,23 @@ #define COMPONENTS_METRICS_CALL_STACK_PROFILE_COLLECTOR_H_ #include "base/macros.h" -#include "components/metrics/call_stack_profile_params.h" #include "components/metrics/public/interfaces/call_stack_profile_collector.mojom.h" -#include "third_party/metrics_proto/sampled_profile.pb.h" namespace metrics { class CallStackProfileCollector : public mojom::CallStackProfileCollector { public: - explicit CallStackProfileCollector( - CallStackProfileParams::Process expected_process); + CallStackProfileCollector(); ~CallStackProfileCollector() override; // Create a collector to receive profiles from |expected_process|. - static void Create(CallStackProfileParams::Process expected_process, - mojom::CallStackProfileCollectorRequest request); + static void Create(mojom::CallStackProfileCollectorRequest request); // mojom::CallStackProfileCollector: void Collect(base::TimeTicks start_timestamp, - SampledProfile profile) override; + mojom::SampledProfilePtr profile) override; private: - // Profile params are validated to come from this process. Profiles with a - // different process declared in the params are considered untrustworthy and - // ignored. - const CallStackProfileParams::Process expected_process_; - DISALLOW_COPY_AND_ASSIGN(CallStackProfileCollector); };
diff --git a/components/metrics/call_stack_profile_metrics_provider.cc b/components/metrics/call_stack_profile_metrics_provider.cc index 63160d1..cd473e3 100644 --- a/components/metrics/call_stack_profile_metrics_provider.cc +++ b/components/metrics/call_stack_profile_metrics_provider.cc
@@ -31,12 +31,18 @@ // A set of profiles and the start time of the collection associated with them. struct ProfileState { ProfileState(base::TimeTicks start_timestamp, SampledProfile profile); + ProfileState(base::TimeTicks start_timestamp, std::string serialized_profile); ProfileState(ProfileState&&); ProfileState& operator=(ProfileState&&); // The time at which the profile collection was started. base::TimeTicks start_timestamp; + // A serialized SampledProfile. The profile for this instance will be + // contained in exactly one of |serialized_profile| or |profile|. If + // |serialized_profile| is empty, the profile will be in |profile|. + std::string serialized_profile; + // The call stack profile message collected by the profiler. SampledProfile profile; @@ -48,6 +54,11 @@ SampledProfile profile) : start_timestamp(start_timestamp), profile(std::move(profile)) {} +ProfileState::ProfileState(base::TimeTicks start_timestamp, + std::string serialized_profile) + : start_timestamp(start_timestamp), + serialized_profile(std::move(serialized_profile)) {} + ProfileState::ProfileState(ProfileState&&) = default; // Some versions of GCC need this for push_back to work with std::move. @@ -195,11 +206,22 @@ CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() {} // static -void CallStackProfileMetricsProvider::ReceiveCompletedProfile( +void CallStackProfileMetricsProvider::ReceiveProfile( base::TimeTicks profile_start_time, SampledProfile profile) { PendingProfiles::GetInstance()->CollectProfilesIfCollectionEnabled( ProfileState(profile_start_time, std::move(profile))); + // TODO(wittman): Check if we have a lot of raw profiles outstanding + // (e.g. because the client is offline) and if so, convert them to serialized + // form to minimize memory usage. +} + +// static +void CallStackProfileMetricsProvider::ReceiveSerializedProfile( + base::TimeTicks profile_start_time, + std::string serialized_sampled_profile) { + PendingProfiles::GetInstance()->CollectProfilesIfCollectionEnabled( + ProfileState(profile_start_time, std::move(serialized_sampled_profile))); } void CallStackProfileMetricsProvider::OnRecordingEnabled() { @@ -220,8 +242,15 @@ pending_profiles.empty()); for (const auto& profile_state : pending_profiles) { - SampledProfile* sampled_profile = uma_proto->add_sampled_profile(); - *sampled_profile = std::move(profile_state.profile); + if (!profile_state.serialized_profile.empty()) { + SampledProfile profile; + if (profile.ParseFromArray(profile_state.serialized_profile.data(), + profile_state.serialized_profile.size())) { + *uma_proto->add_sampled_profile() = std::move(profile); + } + } else { + *uma_proto->add_sampled_profile() = std::move(profile_state.profile); + } } }
diff --git a/components/metrics/call_stack_profile_metrics_provider.h b/components/metrics/call_stack_profile_metrics_provider.h index e977040..47623eb 100644 --- a/components/metrics/call_stack_profile_metrics_provider.h +++ b/components/metrics/call_stack_profile_metrics_provider.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_METRICS_CALL_STACK_PROFILE_METRICS_PROVIDER_H_ #define COMPONENTS_METRICS_CALL_STACK_PROFILE_METRICS_PROVIDER_H_ +#include <string> + #include "base/feature_list.h" #include "base/macros.h" #include "base/time/time.h" @@ -21,11 +23,18 @@ CallStackProfileMetricsProvider(); ~CallStackProfileMetricsProvider() override; - // Will be invoked on either the main thread or the profiler's thread. - // Provides the profile to PendingProfiles to append, if the collecting state - // allows. |profile| is not const& because it must be passed with std::move. - static void ReceiveCompletedProfile(base::TimeTicks profile_start_time, - SampledProfile profile); + // Receives SampledProfile protobuf instances. May be called on any thread. + static void ReceiveProfile(base::TimeTicks profile_start_time, + SampledProfile profile); + + // Receives serialized SampledProfile protobuf instances. May be called on any + // thread. Note that receiving serialized profiles is supported separately so + // that profiles received in serialized form can be kept in that form until + // upload. This significantly reduces memory costs. Serialized profile strings + // may be large, so the caller should use std::move() to provide them to this + // API rather than copying by value. + static void ReceiveSerializedProfile(base::TimeTicks profile_start_time, + std::string serialized_sampled_profile); // MetricsProvider: void OnRecordingEnabled() override;
diff --git a/components/metrics/call_stack_profile_metrics_provider_unittest.cc b/components/metrics/call_stack_profile_metrics_provider_unittest.cc index b3262527..5869883 100644 --- a/components/metrics/call_stack_profile_metrics_provider_unittest.cc +++ b/components/metrics/call_stack_profile_metrics_provider_unittest.cc
@@ -37,23 +37,48 @@ DISALLOW_COPY_AND_ASSIGN(CallStackProfileMetricsProviderTest); }; -// Checks that the pending profile is passed to ProvideCurrentSessionData. -TEST_F(CallStackProfileMetricsProviderTest, ProvideCurrentSessionData) { +// Checks that the unserialized pending profile is encoded in the session data. +TEST_F(CallStackProfileMetricsProviderTest, + ProvideCurrentSessionDataUnserialized) { CallStackProfileMetricsProvider provider; provider.OnRecordingEnabled(); - CallStackProfileMetricsProvider::ReceiveCompletedProfile( - base::TimeTicks::Now(), SampledProfile()); + SampledProfile profile; + profile.set_trigger_event(SampledProfile::PERIODIC_COLLECTION); + CallStackProfileMetricsProvider::ReceiveProfile(base::TimeTicks::Now(), + profile); ChromeUserMetricsExtension uma_proto; provider.ProvideCurrentSessionData(&uma_proto); ASSERT_EQ(1, uma_proto.sampled_profile().size()); + EXPECT_EQ(SampledProfile::PERIODIC_COLLECTION, + uma_proto.sampled_profile(0).trigger_event()); +} + +// Checks that the serialized pending profile is encoded in the session data. +TEST_F(CallStackProfileMetricsProviderTest, + ProvideCurrentSessionDataSerialized) { + CallStackProfileMetricsProvider provider; + provider.OnRecordingEnabled(); + std::string contents; + { + SampledProfile profile; + profile.set_trigger_event(SampledProfile::PERIODIC_COLLECTION); + profile.SerializeToString(&contents); + } + CallStackProfileMetricsProvider::ReceiveSerializedProfile( + base::TimeTicks::Now(), contents); + ChromeUserMetricsExtension uma_proto; + provider.ProvideCurrentSessionData(&uma_proto); + ASSERT_EQ(1, uma_proto.sampled_profile().size()); + EXPECT_EQ(SampledProfile::PERIODIC_COLLECTION, + uma_proto.sampled_profile(0).trigger_event()); } // Checks that the pending profile is provided to ProvideCurrentSessionData // when collected before CallStackProfileMetricsProvider is instantiated. TEST_F(CallStackProfileMetricsProviderTest, ProfileProvidedWhenCollectedBeforeInstantiation) { - CallStackProfileMetricsProvider::ReceiveCompletedProfile( - base::TimeTicks::Now(), SampledProfile()); + CallStackProfileMetricsProvider::ReceiveProfile(base::TimeTicks::Now(), + SampledProfile()); CallStackProfileMetricsProvider provider; provider.OnRecordingEnabled(); ChromeUserMetricsExtension uma_proto; @@ -66,8 +91,8 @@ TEST_F(CallStackProfileMetricsProviderTest, ProfileNotProvidedWhileDisabled) { CallStackProfileMetricsProvider provider; provider.OnRecordingDisabled(); - CallStackProfileMetricsProvider::ReceiveCompletedProfile( - base::TimeTicks::Now(), SampledProfile()); + CallStackProfileMetricsProvider::ReceiveProfile(base::TimeTicks::Now(), + SampledProfile()); ChromeUserMetricsExtension uma_proto; provider.ProvideCurrentSessionData(&uma_proto); EXPECT_EQ(0, uma_proto.sampled_profile_size()); @@ -81,8 +106,8 @@ provider.OnRecordingEnabled(); base::TimeTicks profile_start_time = base::TimeTicks::Now(); provider.OnRecordingDisabled(); - CallStackProfileMetricsProvider::ReceiveCompletedProfile(profile_start_time, - SampledProfile()); + CallStackProfileMetricsProvider::ReceiveProfile(profile_start_time, + SampledProfile()); ChromeUserMetricsExtension uma_proto; provider.ProvideCurrentSessionData(&uma_proto); EXPECT_EQ(0, uma_proto.sampled_profile_size()); @@ -97,8 +122,8 @@ base::TimeTicks profile_start_time = base::TimeTicks::Now(); provider.OnRecordingDisabled(); provider.OnRecordingEnabled(); - CallStackProfileMetricsProvider::ReceiveCompletedProfile(profile_start_time, - SampledProfile()); + CallStackProfileMetricsProvider::ReceiveProfile(profile_start_time, + SampledProfile()); ChromeUserMetricsExtension uma_proto; provider.ProvideCurrentSessionData(&uma_proto); EXPECT_EQ(0, uma_proto.sampled_profile_size()); @@ -112,8 +137,8 @@ provider.OnRecordingDisabled(); base::TimeTicks profile_start_time = base::TimeTicks::Now(); provider.OnRecordingEnabled(); - CallStackProfileMetricsProvider::ReceiveCompletedProfile(profile_start_time, - SampledProfile()); + CallStackProfileMetricsProvider::ReceiveProfile(profile_start_time, + SampledProfile()); ChromeUserMetricsExtension uma_proto; provider.ProvideCurrentSessionData(&uma_proto); EXPECT_EQ(0, uma_proto.sampled_profile_size());
diff --git a/components/metrics/child_call_stack_profile_collector.cc b/components/metrics/child_call_stack_profile_collector.cc index 0ae6d47..8019390 100644 --- a/components/metrics/child_call_stack_profile_collector.cc +++ b/components/metrics/child_call_stack_profile_collector.cc
@@ -47,8 +47,10 @@ parent_collector_ = std::move(parent_collector); if (parent_collector_) { for (ProfileState& state : profiles_) { + mojom::SampledProfilePtr mojo_profile = mojom::SampledProfile::New(); + state.profile.SerializeToString(&mojo_profile->contents); parent_collector_->Collect(state.start_timestamp, - std::move(state.profile)); + std::move(mojo_profile)); } } profiles_.clear(); @@ -72,7 +74,9 @@ } if (parent_collector_) { - parent_collector_->Collect(start_timestamp, std::move(profile)); + mojom::SampledProfilePtr mojo_profile = mojom::SampledProfile::New(); + profile.SerializeToString(&mojo_profile->contents); + parent_collector_->Collect(start_timestamp, std::move(mojo_profile)); } else if (retain_profiles_) { profiles_.push_back(ProfileState(start_timestamp, std::move(profile))); }
diff --git a/components/metrics/child_call_stack_profile_collector_unittest.cc b/components/metrics/child_call_stack_profile_collector_unittest.cc index 24cc30e..bead3d95 100644 --- a/components/metrics/child_call_stack_profile_collector_unittest.cc +++ b/components/metrics/child_call_stack_profile_collector_unittest.cc
@@ -25,12 +25,11 @@ ~Receiver() override {} void Collect(base::TimeTicks start_timestamp, - SampledProfile profile) override { - this->profiles.push_back(ChildCallStackProfileCollector::ProfileState( - start_timestamp, std::move(profile))); + mojom::SampledProfilePtr profile) override { + profile_start_times.push_back(start_timestamp); } - std::vector<ChildCallStackProfileCollector::ProfileState> profiles; + std::vector<base::TimeTicks> profile_start_times; private: mojo::Binding<mojom::CallStackProfileCollector> binding_; @@ -74,18 +73,17 @@ child_collector_.SetParentProfileCollector(std::move(receiver_)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(0u, profiles().size()); - ASSERT_EQ(1u, receiver_impl_->profiles.size()); - EXPECT_EQ(start_timestamp, receiver_impl_->profiles[0].start_timestamp); + ASSERT_EQ(1u, receiver_impl_->profile_start_times.size()); + EXPECT_EQ(start_timestamp, receiver_impl_->profile_start_times[0]); // Add a profile after providing the interface. It should also be passed. - receiver_impl_->profiles.clear(); + receiver_impl_->profile_start_times.clear(); CollectEmptyProfile(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(0u, profiles().size()); - ASSERT_EQ(1u, receiver_impl_->profiles.size()); + ASSERT_EQ(1u, receiver_impl_->profile_start_times.size()); EXPECT_GE(base::TimeDelta::FromMilliseconds(10), - (base::TimeTicks::Now() - - receiver_impl_->profiles[0].start_timestamp)); + (base::TimeTicks::Now() - receiver_impl_->profile_start_times[0])); } TEST_F(ChildCallStackProfileCollectorTest, InterfaceNotProvided) {
diff --git a/components/metrics/public/cpp/BUILD.gn b/components/metrics/public/cpp/BUILD.gn deleted file mode 100644 index b9c2af5c..0000000 --- a/components/metrics/public/cpp/BUILD.gn +++ /dev/null
@@ -1,20 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//mojo/public/tools/bindings/mojom.gni") - -source_set("call_stack_unit_tests") { - testonly = true - sources = [ - "call_stack_profile_struct_traits_unittest.cc", - ] - - deps = [ - "//base", - "//components/metrics/public/interfaces:call_stack_mojo_test_bindings", - "//mojo/public/cpp/bindings", - "//testing/gtest", - "//third_party/metrics_proto", - ] -}
diff --git a/components/metrics/public/cpp/OWNERS b/components/metrics/public/cpp/OWNERS deleted file mode 100644 index 2c44a46..0000000 --- a/components/metrics/public/cpp/OWNERS +++ /dev/null
@@ -1,6 +0,0 @@ -per-file *.mojom=set noparent -per-file *.mojom=file://ipc/SECURITY_OWNERS -per-file *_struct_traits*.*=set noparent -per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS -per-file *.typemap=set noparent -per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/components/metrics/public/cpp/call_stack_profile.typemap b/components/metrics/public/cpp/call_stack_profile.typemap deleted file mode 100644 index e7fa49f0..0000000 --- a/components/metrics/public/cpp/call_stack_profile.typemap +++ /dev/null
@@ -1,14 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mojom = - "//components/metrics/public/interfaces/call_stack_profile_collector.mojom" -public_headers = [ "//third_party/metrics_proto/sampled_profile.pb.h" ] -traits_headers = - [ "//components/metrics/public/cpp/call_stack_profile_struct_traits.h" ] -deps = [ - "//third_party/metrics_proto", -] -type_mappings = - [ "metrics.mojom.SampledProfile=metrics::SampledProfile[move_only]" ]
diff --git a/components/metrics/public/cpp/call_stack_profile_struct_traits.h b/components/metrics/public/cpp/call_stack_profile_struct_traits.h deleted file mode 100644 index bdcc617..0000000 --- a/components/metrics/public/cpp/call_stack_profile_struct_traits.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Defines StructTraits specializations for translating between mojo types and -// metrics:: types, with data validity checks. - -#ifndef COMPONENTS_METRICS_PUBLIC_CPP_CALL_STACK_PROFILE_STRUCT_TRAITS_H_ -#define COMPONENTS_METRICS_PUBLIC_CPP_CALL_STACK_PROFILE_STRUCT_TRAITS_H_ - -#include <string> - -#include "base/strings/string_piece.h" -#include "components/metrics/public/interfaces/call_stack_profile_collector.mojom.h" -#include "third_party/metrics_proto/sampled_profile.pb.h" - -namespace mojo { - -template <> -struct StructTraits<metrics::mojom::SampledProfileDataView, - metrics::SampledProfile> { - static std::string contents(const metrics::SampledProfile& profile) { - std::string output; - profile.SerializeToString(&output); - return output; - } - - static bool Read(metrics::mojom::SampledProfileDataView data, - metrics::SampledProfile* out) { - base::StringPiece contents; - if (!data.ReadContents(&contents)) - return false; - - if (!out->ParseFromArray(contents.data(), contents.size())) - return false; - - // This is purely a sanity check to minimize bad data uploaded, and not - // required for security reasons. - if (!out->unknown_fields().empty()) - return false; - - return true; - } -}; - -} // namespace mojo - -#endif // COMPONENTS_METRICS_PUBLIC_CPP_CALL_STACK_PROFILE_STRUCT_TRAITS_H_
diff --git a/components/metrics/public/cpp/call_stack_profile_struct_traits_unittest.cc b/components/metrics/public/cpp/call_stack_profile_struct_traits_unittest.cc deleted file mode 100644 index 236d6196..0000000 --- a/components/metrics/public/cpp/call_stack_profile_struct_traits_unittest.cc +++ /dev/null
@@ -1,101 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <utility> - -#include "base/macros.h" -#include "base/message_loop/message_loop.h" -#include "components/metrics/public/interfaces/call_stack_profile_collector_test.mojom.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/metrics_proto/sampled_profile.pb.h" - -namespace metrics { - -class CallStackProfileCollectorTestImpl - : public mojom::CallStackProfileCollectorTest { - public: - explicit CallStackProfileCollectorTestImpl( - mojo::InterfaceRequest<mojom::CallStackProfileCollectorTest> request) - : binding_(this, std::move(request)) { - } - - // CallStackProfileCollectorTest: - void BounceSampledProfile(SampledProfile in, - BounceSampledProfileCallback callback) override { - std::move(callback).Run(in); - } - - private: - mojo::Binding<CallStackProfileCollectorTest> binding_; - - DISALLOW_COPY_AND_ASSIGN(CallStackProfileCollectorTestImpl); -}; - -class CallStackProfileStructTraitsTest : public testing::Test { - public: - CallStackProfileStructTraitsTest() : impl_(MakeRequest(&proxy_)) {} - - protected: - base::MessageLoop message_loop_; - mojom::CallStackProfileCollectorTestPtr proxy_; - CallStackProfileCollectorTestImpl impl_; - - DISALLOW_COPY_AND_ASSIGN(CallStackProfileStructTraitsTest); -}; - -// Checks serialization/deserialization of SampledProfile. -TEST_F(CallStackProfileStructTraitsTest, SampledProfile) { - // Construct a SampledProfile protocol buffer message. - SampledProfile input_proto; - - CallStackProfile* proto_profile = input_proto.mutable_call_stack_profile(); - - CallStackProfile::Sample* proto_sample = - proto_profile->add_deprecated_sample(); - proto_sample->set_count(1); - CallStackProfile::Location* location = proto_sample->add_frame(); - location->set_address(0x10ULL); - location->set_module_id_index(0); - - CallStackProfile::ModuleIdentifier* module_id = - proto_profile->add_module_id(); - module_id->set_build_id("a"); - module_id->set_name_md5_prefix(111U); - - proto_profile->set_profile_duration_ms(1000); - proto_profile->set_sampling_period_ms(2000); - - // Send the message round trip, and verify those values. - SampledProfile output_proto; - EXPECT_TRUE( - proxy_->BounceSampledProfile(std::move(input_proto), &output_proto)); - - const CallStackProfile& out_profile = output_proto.call_stack_profile(); - - ASSERT_EQ(1, out_profile.deprecated_sample_size()); - ASSERT_EQ(1, out_profile.deprecated_sample(0).frame_size()); - - ASSERT_TRUE(out_profile.deprecated_sample(0).frame(0).has_address()); - EXPECT_EQ(0x10ULL, out_profile.deprecated_sample(0).frame(0).address()); - - ASSERT_TRUE(out_profile.deprecated_sample(0).frame(0).has_module_id_index()); - EXPECT_EQ(0, out_profile.deprecated_sample(0).frame(0).module_id_index()); - - ASSERT_EQ(1, out_profile.module_id().size()); - - ASSERT_TRUE(out_profile.module_id(0).has_build_id()); - ASSERT_EQ("a", out_profile.module_id(0).build_id()); - - ASSERT_TRUE(out_profile.module_id(0).has_name_md5_prefix()); - ASSERT_EQ(111U, out_profile.module_id(0).name_md5_prefix()); - - ASSERT_TRUE(out_profile.has_profile_duration_ms()); - EXPECT_EQ(1000, out_profile.profile_duration_ms()); - - ASSERT_TRUE(out_profile.has_sampling_period_ms()); - EXPECT_EQ(2000, out_profile.sampling_period_ms()); -} - -} // namespace metrics
diff --git a/components/metrics/public/cpp/call_stack_profile_unittest.typemap b/components/metrics/public/cpp/call_stack_profile_unittest.typemap deleted file mode 100644 index 5a8cd99..0000000 --- a/components/metrics/public/cpp/call_stack_profile_unittest.typemap +++ /dev/null
@@ -1,18 +0,0 @@ -# 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 is necessary because without it compiling -# call_stack_profile_struct_traits_unittest produces error below: -# "gen\third_party/metrics_proto/sampled_profile.pb.h(9,10): fatal error: -# 'google/protobuf/stubs/common.h' file not found". - -mojom = "//components/metrics/public/interfaces/call_stack_profile_collector_test.mojom" -public_headers = [ "//third_party/metrics_proto/sampled_profile.pb.h" ] -traits_headers = - [ "//components/metrics/public/cpp/call_stack_profile_struct_traits.h" ] -deps = [ - "//third_party/metrics_proto", -] -type_mappings = - [ "metrics.mojom.SampledProfile=metrics::SampledProfile[move_only]" ]
diff --git a/components/metrics/public/cpp/typemaps.gni b/components/metrics/public/cpp/typemaps.gni deleted file mode 100644 index 9e4e1db..0000000 --- a/components/metrics/public/cpp/typemaps.gni +++ /dev/null
@@ -1,8 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -typemaps = [ - "//components/metrics/public/cpp/call_stack_profile.typemap", - "//components/metrics/public/cpp/call_stack_profile_unittest.typemap", -]
diff --git a/components/metrics/version_utils.cc b/components/metrics/version_utils.cc index d24932b..27011aa 100644 --- a/components/metrics/version_utils.cc +++ b/components/metrics/version_utils.cc
@@ -15,7 +15,13 @@ #if defined(ARCH_CPU_64_BITS) version += "-64"; #endif // defined(ARCH_CPU_64_BITS) - if (!version_info::IsOfficialBuild()) + +#if defined(GOOGLE_CHROME_BUILD) + bool is_chrome_branded = true; +#else + bool is_chrome_branded = false; +#endif + if (!is_chrome_branded || !version_info::IsOfficialBuild()) version.append("-devel"); return version; }
diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java index d57f0ff..7472c3e 100644 --- a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java +++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java
@@ -37,7 +37,7 @@ // Used in Debug builds to assert that this job service never attempts to run more than one job // at a time: private final Object mRunningLock = new Object(); - private boolean mRunningJob = false; + private boolean mRunningJob; /** * Schedules uploading of all pending minidumps.
diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploaderImpl.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploaderImpl.java index e90e98e..7275b671 100644 --- a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploaderImpl.java +++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploaderImpl.java
@@ -31,7 +31,7 @@ * Whether the current job has been canceled. This is written to from the main thread, and read * from the worker thread. */ - private volatile boolean mCancelUpload = false; + private volatile boolean mCancelUpload; /** * The thread used for the actual work of uploading minidumps.
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java index 7756d38..4a1fc34c 100644 --- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java +++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java
@@ -271,7 +271,7 @@ private MinidumpUploaderImpl createCallableListMinidumpUploader( final List<MinidumpUploadCallableCreator> callables, final boolean userPermitted) { return new TestMinidumpUploaderImpl(mTestRule.getExistingCacheDir(), null) { - private int mIndex = 0; + private int mIndex; @Override public MinidumpUploadCallable createMinidumpUploadCallable(
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css index e124f58..fc58163 100644 --- a/components/neterror/resources/neterror.css +++ b/components/neterror/resources/neterror.css
@@ -112,12 +112,12 @@ } #error-information-button { - padding-left: 0.5em; content: -webkit-image-set( url(../../resources/default_100_percent/neterror/help_outline.png) 1x, url(../../resources/default_200_percent/neterror/help_outline.png) 2x); - width: 24px; height: 24px; + vertical-align: -.15em; + width: 24px; } .use-popup-container#error-information-popup-container @@ -134,22 +134,32 @@ } .use-popup-container#error-information-popup-container + #error-information-popup-content > p { + margin-bottom: 11px; + margin-inline-start: 20px; +} + +.use-popup-container#error-information-popup-container #suggestions-list ul { + margin-inline-start: 15px; +} + +.use-popup-container#error-information-popup-container #error-information-popup-box { background-color: white; left: 5%; + padding-bottom: 15px; + padding-top: 15px; position: fixed; width: 90%; z-index: 101; } -.use-popup-container#error-information-popup-container - #error-information-popup-content { - padding: 0.5em; +.use-popup-container#error-information-popup-container div.error-code { + margin-inline-start: 20px; } -.use-popup-container#error-information-popup-container - #error-information-popup-content { - padding: 0.5em; +.use-popup-container#error-information-popup-container #suggestions-list p { + margin-inline-start: 20px; } :not(.use-popup-container)#error-information-popup-container @@ -158,8 +168,10 @@ } #error-information-popup-close { - margin-right: 2em; - text-align: right; + margin-bottom: 0px; + margin-inline-end: 35px; + margin-top: 15px; + text-align: end; } .link-button { @@ -389,17 +401,24 @@ border-color: rgb(241, 243, 244); border-radius: 12px; border-style: solid; - border-width: 2px; + border-width: 1px; padding: 12px; text-align: center; } -.offline-content-summary-images { - padding-bottom: 12px; - transform: translateX(22.5px); +.offline-content-summary-image-truncate { + width: 45px; } -.offline-content-summary-images > img { +.offline-content-summary-images { + direction: ltr; + display: flex; + margin-top: 10px; + justify-content: center; + padding-bottom: 12px; +} + +.offline-content-summary-images img { background: rgb(241, 243, 244); border-radius: 50%; box-shadow: @@ -409,20 +428,8 @@ width: 32px; } -img#music-note { - transform: translateX(-15px); -} - -img#video { - transform: translateX(-30px); -} - -img#image { - transform: translateX(-45px); -} - .offline-content-summary-description { - border-top: 2px solid rgb(241, 243, 244); + border-top: 1px solid rgb(241, 243, 244); padding-top: 12px; }
diff --git a/components/neterror/resources/neterror.html b/components/neterror/resources/neterror.html index f4b4bfc9..62ba4e05 100644 --- a/components/neterror/resources/neterror.html +++ b/components/neterror/resources/neterror.html
@@ -65,10 +65,18 @@ <div id="offline-content-list" hidden></div> <div id="offline-content-summary" onclick="launchDownloadsPage()" hidden> <div class="offline-content-summary-images"> - <img id="earth" src="offline_content/earth.svg"> - <img id="music-note" src="offline_content/music-note.svg"> - <img id="video" src="offline_content/video.svg"> - <img id="image" src="offline_content/image.svg"> + <div class="offline-content-summary-image-truncate"> + <img id="earth" src="offline_content/earth.svg"> + </div> + <div class="offline-content-summary-image-truncate"> + <img id="music-note" src="offline_content/music-note.svg"> + </div> + <div class="offline-content-summary-image-truncate"> + <img id="video" src="offline_content/video.svg"> + </div> + <div> + <img id="image" src="offline_content/image.svg"> + </div> </div> <div class="offline-content-summary-description" jsselect="offlineContentSummary" jscontent="description">
diff --git a/components/network_hints/browser/BUILD.gn b/components/network_hints/browser/BUILD.gn index 9ff7114..351a31c 100644 --- a/components/network_hints/browser/BUILD.gn +++ b/components/network_hints/browser/BUILD.gn
@@ -13,6 +13,8 @@ "//components/network_hints/common", "//content/public/browser", "//ipc", + "//mojo/public/cpp/bindings", "//net", + "//services/network/public/mojom", ] }
diff --git a/components/network_hints/browser/DEPS b/components/network_hints/browser/DEPS index 9883d79b..080d177 100644 --- a/components/network_hints/browser/DEPS +++ b/components/network_hints/browser/DEPS
@@ -1,5 +1,7 @@ include_rules = [ "+content/public/browser", "+ipc", + "+mojo/public/cpp/bindings", "+net", + "+services/network/public/mojom", ]
diff --git a/components/network_hints/browser/network_hints_message_filter.cc b/components/network_hints/browser/network_hints_message_filter.cc index 02f1c498..dcdb51a 100644 --- a/components/network_hints/browser/network_hints_message_filter.cc +++ b/components/network_hints/browser/network_hints_message_filter.cc
@@ -4,17 +4,23 @@ #include "components/network_hints/browser/network_hints_message_filter.h" +#include <memory> #include <string> #include "base/logging.h" #include "base/macros.h" #include "components/network_hints/common/network_hints_common.h" #include "components/network_hints/common/network_hints_messages.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/storage_partition.h" #include "ipc/ipc_message_macros.h" +#include "mojo/public/cpp/bindings/binding.h" #include "net/base/address_list.h" #include "net/base/net_errors.h" -#include "net/dns/host_resolver.h" #include "net/log/net_log_with_source.h" +#include "services/network/public/mojom/host_resolver.mojom.h" +#include "services/network/public/mojom/network_context.mojom.h" #include "url/gurl.h" namespace network_hints { @@ -23,53 +29,74 @@ const int kDefaultPort = 80; -class DnsLookupRequest { +// This class contains a std::unique_ptr of itself, it is passed in through +// Start() method, and will be freed by the OnComplete() method when resolving +// has completed or mojo connection error has happened. +class DnsLookupRequest : public network::mojom::ResolveHostClient { public: - DnsLookupRequest(net::HostResolver* host_resolver, - const std::string& hostname) - : hostname_(hostname), - resolver_(host_resolver) { - } + DnsLookupRequest(int render_process_id, const std::string& hostname) + : binding_(this), + render_process_id_(render_process_id), + hostname_(hostname) {} // Return underlying network resolver status. // net::OK ==> Host was found synchronously. // net:ERR_IO_PENDING ==> Network will callback later with result. // anything else ==> Host was not found synchronously. - int Start() { - net::HostResolver::RequestInfo resolve_info( - net::HostPortPair(hostname_, kDefaultPort)); + void Start(std::unique_ptr<DnsLookupRequest> request) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + request_ = std::move(request); + + content::RenderProcessHost* render_process_host = + content::RenderProcessHost::FromID(render_process_id_); + if (!render_process_host) { + OnComplete(net::ERR_FAILED, base::nullopt); + return; + } + + DCHECK(!binding_); + network::mojom::ResolveHostClientPtr client_ptr; + binding_.Bind(mojo::MakeRequest(&client_ptr)); + binding_.set_connection_error_handler( + base::BindOnce(&DnsLookupRequest::OnComplete, base::Unretained(this), + net::ERR_FAILED, base::nullopt)); + net::HostPortPair host_port_pair(hostname_, kDefaultPort); + network::mojom::ResolveHostParametersPtr resolve_host_parameters = + network::mojom::ResolveHostParameters::New(); + // Lets the host resolver know it can be de-prioritized. + resolve_host_parameters->initial_priority = net::RequestPriority::IDLE; // Make a note that this is a speculative resolve request. This allows - // separating it from real navigations in the observer's callback, and - // lets the HostResolver know it can be de-prioritized. - resolve_info.set_is_speculative(true); - return resolver_->Resolve( - resolve_info, net::DEFAULT_PRIORITY, &addresses_, - base::Bind(&DnsLookupRequest::OnLookupFinished, base::Owned(this)), - &request_, net::NetLogWithSource()); + // separating it from real navigations in the observer's callback. + resolve_host_parameters->is_speculative = true; + render_process_host->GetStoragePartition() + ->GetNetworkContext() + ->ResolveHost(host_port_pair, std::move(resolve_host_parameters), + std::move(client_ptr)); } private: - void OnLookupFinished(int result) { + // network::mojom::ResolveHostClient: + void OnComplete( + int result, + const base::Optional<net::AddressList>& resolved_addresses) override { VLOG(2) << __FUNCTION__ << ": " << hostname_ << ", result=" << result; + std::move(request_); } + mojo::Binding<network::mojom::ResolveHostClient> binding_; + int render_process_id_; const std::string hostname_; - net::HostResolver* resolver_; - std::unique_ptr<net::HostResolver::Request> request_; - net::AddressList addresses_; + std::unique_ptr<DnsLookupRequest> request_; DISALLOW_COPY_AND_ASSIGN(DnsLookupRequest); }; } // namespace -NetworkHintsMessageFilter::NetworkHintsMessageFilter( - net::HostResolver* host_resolver) +NetworkHintsMessageFilter::NetworkHintsMessageFilter(int render_process_id) : content::BrowserMessageFilter(NetworkHintsMsgStart), - host_resolver_(host_resolver) { - DCHECK(host_resolver_); -} + render_process_id_(render_process_id) {} NetworkHintsMessageFilter::~NetworkHintsMessageFilter() { } @@ -83,14 +110,22 @@ return handled; } +void NetworkHintsMessageFilter::OverrideThreadForMessage( + const IPC::Message& message, + content::BrowserThread::ID* thread) { + if (message.type() == NetworkHintsMsg_DNSPrefetch::ID) + *thread = content::BrowserThread::UI; +} + void NetworkHintsMessageFilter::OnDnsPrefetch( const LookupRequest& lookup_request) { - DCHECK(host_resolver_); + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + for (const std::string& hostname : lookup_request.hostname_list) { - DnsLookupRequest* request = new DnsLookupRequest(host_resolver_, hostname); - // Note: DnsLookupRequest will be freed by the base::Owned call when - // resolving has completed. - request->Start(); + std::unique_ptr<DnsLookupRequest> request = + std::make_unique<DnsLookupRequest>(render_process_id_, hostname); + DnsLookupRequest* request_ptr = request.get(); + request_ptr->Start(std::move(request)); } }
diff --git a/components/network_hints/browser/network_hints_message_filter.h b/components/network_hints/browser/network_hints_message_filter.h index f30216ef..208342b7 100644 --- a/components/network_hints/browser/network_hints_message_filter.h +++ b/components/network_hints/browser/network_hints_message_filter.h
@@ -8,29 +8,26 @@ #include "base/macros.h" #include "content/public/browser/browser_message_filter.h" -namespace net { -class HostResolver; -} - namespace network_hints { struct LookupRequest; // Simple browser-side handler for DNS prefetch requests. -// Passes prefetch requests to the provided net::HostResolver. // Each renderer process requires its own filter. class NetworkHintsMessageFilter : public content::BrowserMessageFilter { public: - explicit NetworkHintsMessageFilter(net::HostResolver* host_resolver); + explicit NetworkHintsMessageFilter(int render_process_id); // content::BrowserMessageFilter implementation: bool OnMessageReceived(const IPC::Message& message) override; + void OverrideThreadForMessage(const IPC::Message& message, + content::BrowserThread::ID* thread) override; private: ~NetworkHintsMessageFilter() override; void OnDnsPrefetch(const LookupRequest& lookup_request); - net::HostResolver* host_resolver_; + int render_process_id_; DISALLOW_COPY_AND_ASSIGN(NetworkHintsMessageFilter); };
diff --git a/components/ntp_snippets/features.cc b/components/ntp_snippets/features.cc index 56f101b..cdae24a5 100644 --- a/components/ntp_snippets/features.cc +++ b/components/ntp_snippets/features.cc
@@ -21,7 +21,6 @@ // Keep sorted, and keep nullptr at the end. const base::Feature* const kAllFeatures[] = { - &kArticleSuggestionsExpandableHeader, &kArticleSuggestionsFeature, &kBookmarkSuggestionsFeature, &kBreakingNewsPushFeature, @@ -35,9 +34,6 @@ &kPublisherFaviconsFromNewServerFeature, &kRemoteSuggestionsBackendFeature}; -const base::Feature kArticleSuggestionsExpandableHeader{ - "NTPArticleSuggestionsExpandableHeader", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kArticleSuggestionsFeature{ "NTPArticleSuggestions", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/ntp_snippets/features.h b/components/ntp_snippets/features.h index 1804187..48e36ff 100644 --- a/components/ntp_snippets/features.h +++ b/components/ntp_snippets/features.h
@@ -38,9 +38,6 @@ //////////////////////////////////////////////////////////////////////////////// // Independent features. Treat as normal -// Feature to allow show/hide article suggestions by clicking the header. -extern const base::Feature kArticleSuggestionsExpandableHeader; - extern const base::Feature kArticleSuggestionsFeature; // Feature to allow UI as specified here: https://crbug.com/660837.
diff --git a/components/ntp_snippets/remote/remote_suggestions_status_service_impl.cc b/components/ntp_snippets/remote/remote_suggestions_status_service_impl.cc index fa2af3d..cbecb83 100644 --- a/components/ntp_snippets/remote/remote_suggestions_status_service_impl.cc +++ b/components/ntp_snippets/remote/remote_suggestions_status_service_impl.cc
@@ -112,15 +112,12 @@ return true; } - if (base::FeatureList::IsEnabled( - ntp_snippets::kArticleSuggestionsExpandableHeader) && - !list_visible_during_session_) { + if (!list_visible_during_session_) { DVLOG(1) << "[GetStatusFromDeps] Disabled because articles list hidden."; return true; } - // |additional_toggle_pref_| will always be empty when - // kArticleSuggestionsExpandableHeader is enabled. + // |additional_toggle_pref_| will always be empty on Android. if (!additional_toggle_pref_.empty()) { if (!pref_service_->GetBoolean(additional_toggle_pref_)) { DVLOG(1) << "[GetStatusFromDeps] Disabled via additional pref";
diff --git a/components/ntp_snippets/remote/remote_suggestions_status_service_impl_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_status_service_impl_unittest.cc index 829b2c0..e83ea6cb 100644 --- a/components/ntp_snippets/remote/remote_suggestions_status_service_impl_unittest.cc +++ b/components/ntp_snippets/remote/remote_suggestions_status_service_impl_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "components/ntp_snippets/features.h" #include "components/ntp_snippets/ntp_snippets_constants.h" @@ -37,22 +36,13 @@ utils_.pref_service()->registry()->RegisterBooleanPref(kTestPrefName, true); } - // |list_hiding_enabled| indicates whether kArticleSuggestionsExpandableHeader - // is enabled. + // |empty_additional_pref| indicates whether the service is created without an + // additional pref. std::unique_ptr<RemoteSuggestionsStatusServiceImpl> MakeService( - bool list_hiding_enabled) { - // Enabling/disabling the feature. - if (list_hiding_enabled) { - feature_list_.InitAndEnableFeature( - ntp_snippets::kArticleSuggestionsExpandableHeader); - } else { - feature_list_.InitAndDisableFeature( - ntp_snippets::kArticleSuggestionsExpandableHeader); - } - + bool empty_additional_pref) { auto service = std::make_unique<RemoteSuggestionsStatusServiceImpl>( false, utils_.pref_service(), - list_hiding_enabled ? std::string() : kTestPrefName); + empty_additional_pref ? std::string() : kTestPrefName); service->Init(base::BindRepeating( &RemoteSuggestionsStatusServiceImplTest::OnStatusChange, base::Unretained(this))); @@ -67,14 +57,13 @@ last_status_ = new_status; } - base::test::ScopedFeatureList feature_list_; RemoteSuggestionsStatus last_status_; test::RemoteSuggestionsTestUtils utils_; variations::testing::VariationParamsManager params_manager_; }; TEST_F(RemoteSuggestionsStatusServiceImplTest, NoSigninNeeded) { - auto service = MakeService(/*list_hiding_enabled=*/false); + auto service = MakeService(/*empty_additional_pref=*/false); // By default, no signin is required. EXPECT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, last_status()); @@ -85,7 +74,7 @@ } TEST_F(RemoteSuggestionsStatusServiceImplTest, DisabledViaPref) { - auto service = MakeService(/*list_hiding_enabled=*/false); + auto service = MakeService(/*empty_additional_pref=*/false); // The default test setup is signed out. The service is enabled. ASSERT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, last_status()); @@ -100,7 +89,7 @@ } TEST_F(RemoteSuggestionsStatusServiceImplTest, DisabledViaAdditionalPref) { - auto service = MakeService(/*list_hiding_enabled=*/false); + auto service = MakeService(/*empty_additional_pref=*/false); // The default test setup is signed out. The service is enabled. ASSERT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, last_status()); @@ -115,7 +104,7 @@ } TEST_F(RemoteSuggestionsStatusServiceImplTest, EnabledAfterListFolded) { - auto service = MakeService(/*list_hiding_enabled="*/ true); + auto service = MakeService(/*empty_additional_pref=*/true); // By default, the articles list should be visible. EXPECT_TRUE(utils_.pref_service()->GetBoolean(prefs::kArticlesListVisible)); @@ -134,7 +123,7 @@ TEST_F(RemoteSuggestionsStatusServiceImplTest, DisabledWhenListFoldedOnStart) { utils_.pref_service()->SetBoolean(prefs::kArticlesListVisible, false); - auto service = MakeService(/*list_hiding_enabled="*/ true); + auto service = MakeService(/*empty_additional_pref=*/true); // The state should be disabled when starting with no list shown. EXPECT_EQ(RemoteSuggestionsStatus::EXPLICITLY_DISABLED, last_status()); @@ -146,7 +135,7 @@ TEST_F(RemoteSuggestionsStatusServiceImplTest, EnablingAfterFoldedStart) { utils_.pref_service()->SetBoolean(prefs::kArticlesListVisible, false); - auto service = MakeService(/*list_hiding_enabled="*/ true); + auto service = MakeService(/*empty_additional_pref=*/true); // The state should be disabled when starting with no list shown. EXPECT_EQ(RemoteSuggestionsStatus::EXPLICITLY_DISABLED, last_status()); @@ -164,7 +153,7 @@ TEST_F(RemoteSuggestionsStatusServiceImplTest, EnablingAfterFoldedStartSignedIn) { utils_.pref_service()->SetBoolean(prefs::kArticlesListVisible, false); - auto service = MakeService(/*list_hiding_enabled="*/ true); + auto service = MakeService(/*empty_additional_pref=*/true); // Signin should not cause a state change, because UI is not visible. service->OnSignInStateChanged(/*has_signed_in=*/true); @@ -176,17 +165,4 @@ EXPECT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN, last_status()); } -TEST_F(RemoteSuggestionsStatusServiceImplTest, - DisablingHidingFeatureWhenFolder) { - utils_.pref_service()->SetBoolean(prefs::kArticlesListVisible, false); - auto service = MakeService(/*list_hiding_enabled="*/ false); - - // The state should be enabled when hiding is disabled. - EXPECT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, last_status()); - - // Signin should cause a state change. - service->OnSignInStateChanged(/*has_signed_in=*/true); - EXPECT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN, last_status()); -} - } // namespace ntp_snippets
diff --git a/components/nux/BUILD.gn b/components/nux/BUILD.gn index 1172a8e..0fdc1ed 100644 --- a/components/nux/BUILD.gn +++ b/components/nux/BUILD.gn
@@ -5,6 +5,27 @@ import("//build/config/chrome_build.gni") if (is_win && is_chrome_branded) { + static_library("set_as_default_feature") { + sources = [ + "set_as_default/set_as_default_handler.cc", + "set_as_default/set_as_default_handler.h", + ] + + public_deps = [ + "//base", + "//net", + "//url", + ] + + deps = [ + "//components/resources", + "//components/strings", + "//components/variations", + "//content/public/browser", + "//ui/base", + ] + } + source_set("constants") { sources = [ "constants.cc",
diff --git a/components/nux/OWNERS b/components/nux/OWNERS index 08ee1a9..bfe00f2 100644 --- a/components/nux/OWNERS +++ b/components/nux/OWNERS
@@ -1 +1,2 @@ hcarmona@chromium.org +scottchen@chromium.org
diff --git a/components/nux/constants.cc b/components/nux/constants.cc index aa3f4f8..ef1933b 100644 --- a/components/nux/constants.cc +++ b/components/nux/constants.cc
@@ -14,6 +14,9 @@ extern const base::Feature kNuxGoogleAppsFeature{ "NuxGoogleApps", base::FEATURE_DISABLED_BY_DEFAULT}; +extern const base::Feature kNuxOnboardingFeature{ + "NuxOnboarding", base::FEATURE_DISABLED_BY_DEFAULT}; + extern const char kNuxEmailUrl[] = "chrome://welcome/email"; extern const char kNuxGoogleAppsUrl[] = "chrome://welcome/apps";
diff --git a/components/nux/constants.h b/components/nux/constants.h index c8608748..8ce07e4c 100644 --- a/components/nux/constants.h +++ b/components/nux/constants.h
@@ -13,6 +13,7 @@ extern const base::Feature kNuxEmailFeature; extern const base::Feature kNuxGoogleAppsFeature; +extern const base::Feature kNuxOnboardingFeature; extern const char kNuxEmailUrl[]; extern const char kNuxGoogleAppsUrl[];
diff --git a/components/nux/email/email_handler.cc b/components/nux/email/email_handler.cc index f587fe9..fe15114c 100644 --- a/components/nux/email/email_handler.cc +++ b/components/nux/email/email_handler.cc
@@ -24,6 +24,12 @@ namespace nux { +struct EmailProviderType { + const char* name; + const char* url; + const int icon; +}; + // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class EmailProviders { @@ -40,29 +46,19 @@ // Strings in costants not translated because this is an experiment. // Translate before wide release. - -constexpr const char* kEmailNames[] = { - "Gmail", "Yahoo", "Outlook", "AOL", "iCloud", -}; - -// TODO(hcarmona): get correct URLs -constexpr const char* kEmailUrls[] = { - "https://gmail.com", "https://youtube.com", - "https://maps.google.com", "https://translate.google.com", - "https://news.google.com", +// TODO(hcarmona): populate with icon ids. +const EmailProviderType kEmail[] = { + {"Gmail", "https://accounts.google.com/b/0/AddMailService", 0}, + {"Yahoo", "https://mail.yahoo.com", 0}, + {"Outlook", "https://login.live.com/login.srf?", 0}, + {"AOL", "https://mail.aol.com", 0}, + {"iCloud", "https://www.icloud.com/mail", 0}, }; constexpr const int kEmailIconSize = 48; // Pixels. -constexpr const int kEmailIcons[] = { - // TODO(hcarmona): populate list of icons -}; -static_assert(base::size(kEmailNames) == base::size(kEmailUrls), - "names and urls must match"); -static_assert(base::size(kEmailNames) == (size_t)EmailProviders::kCount, +static_assert(base::size(kEmail) == (size_t)EmailProviders::kCount, "names and histograms must match"); -/*static_assert(base::size(kEmailNames) == base::size(kEmailIcons), - "names and icons must match");*/ EmailHandler::EmailHandler(PrefService* prefs, favicon::FaviconService* favicon_service, @@ -103,10 +99,10 @@ (EmailProviders)i, EmailProviders::kCount); */ - GURL app_url = GURL(kEmailUrls[i]); + GURL app_url = GURL(kEmail[i].url); bookmark_model_->AddURL(bookmark_model_->bookmark_bar_node(), bookmarkIndex++, - base::ASCIIToUTF16(kEmailNames[i]), app_url); + base::ASCIIToUTF16(kEmail[i].name), app_url); // Preload the favicon cache with Chrome-bundled images. Otherwise, the // pre-populated bookmarks don't have favicons and look bad. Favicons are @@ -114,7 +110,7 @@ favicon_service_->MergeFavicon( app_url, app_url, favicon_base::IconType::kFavicon, ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes( - kEmailIcons[i]), + kEmail[i].icon), gfx::Size(kEmailIconSize, kEmailIconSize)); } } @@ -138,6 +134,10 @@ void EmailHandler::AddSources(content::WebUIDataSource* html_source) { // Localized strings. + html_source->AddLocalizedString("noThanks", IDS_NO_THANKS); + html_source->AddLocalizedString("getStarted", IDS_NUX_EMAIL_GET_STARTED); + html_source->AddLocalizedString("welcomeTitle", IDS_NUX_EMAIL_WELCOME_TITLE); + html_source->AddLocalizedString("emailPrompt", IDS_NUX_EMAIL_PROMPT); // Add required resources. html_source->AddResourcePath("email", IDR_NUX_EMAIL_HTML); @@ -154,6 +154,14 @@ IDR_NUX_EMAIL_CHOOSER_JS); // Add icons + + // Add constants to loadtime data + for (size_t i = 0; i < (size_t)EmailProviders::kCount; ++i) { + html_source->AddString("email_name_" + std::to_string(i), kEmail[i].name); + html_source->AddString("email_url_" + std::to_string(i), kEmail[i].url); + } + html_source->AddInteger("email_count", (int)EmailProviders::kCount); + html_source->SetJsonPath("strings.js"); } } // namespace nux \ No newline at end of file
diff --git a/components/nux/email/resources/email_chooser.html b/components/nux/email/resources/email_chooser.html index 6cdeef7..8485c5c8 100644 --- a/components/nux/email/resources/email_chooser.html +++ b/components/nux/email/resources/email_chooser.html
@@ -106,11 +106,11 @@ <div class="button-bar"> <paper-button on-click="onNoThanksClicked_"> - TODO_NO_THANKS + $i18n{noThanks} </paper-button> <paper-button class="action-button" on-click="onGetStartedClicked_" disabled="[[!selectedEmailProvider_]]"> - TODO_GET_STARTED + $i18n{getStarted} </paper-button> </div> </template>
diff --git a/components/nux/email/resources/email_chooser.js b/components/nux/email/resources/email_chooser.js index 93d3e6f..568a691 100644 --- a/components/nux/email/resources/email_chooser.js +++ b/components/nux/email/resources/email_chooser.js
@@ -24,39 +24,7 @@ /** @private */ bookmarkBarWasHidden_: Boolean, - emailList: { - type: Array, - // TODO(scottchen): get from loadTimeData - value: function() { - return [ - { - name: 'Gmail', - icon: 'gmail', - url: 'https://gmail.com', - }, - { - name: 'YouTube', - icon: 'youtube', - url: 'https://gmail.com', - }, - { - name: 'Maps', - icon: 'maps', - url: 'https://gmail.com', - }, - { - name: 'Translate', - icon: 'translate', - url: 'https://gmail.com', - }, - { - name: 'News', - icon: 'news', - url: 'https://gmail.com', - }, - ]; - }, - }, + emailList: Array, /** @private {nux_email.EmailProviderModel} */ selectedEmailProvider_: { @@ -71,6 +39,7 @@ ready: function() { this.browserProxy_ = nux.NuxEmailProxyImpl.getInstance(); + this.emailList = this.browserProxy_.getEmailList(); window.addEventListener('beforeunload', () => { this.revertBookmark_(); });
diff --git a/components/nux/email/resources/nux_email.html b/components/nux/email/resources/nux_email.html index 281fd27..cc6e40a0 100644 --- a/components/nux/email/resources/nux_email.html +++ b/components/nux/email/resources/nux_email.html
@@ -2,7 +2,9 @@ <html dir="$i18n{textdirection}" lang="$i18n{language}"> <head> <meta charset="utf-8"> - <title>TODO_TITLE</title> + <title>$i18n{headerText}</title> + <script src="chrome://resources/js/load_time_data.js"></script> + <script src="strings.js"></script> <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://welcome/email/email_chooser.html"> <link rel="import" href="chrome://welcome/email/nux_email_proxy.html"> @@ -60,8 +62,8 @@ </style> <div class="email-ask"> <div class="email-logo"></div> - <h1>TODO_HEADER</h1> - <h2>TODO_SUBHEADER</h2> + <h1>$i18n{welcomeTitle}</h1> + <h2>$i18n{emailPrompt}</h2> <email-chooser id="emailChooser"></email-chooser> </div> </template>
diff --git a/components/nux/email/resources/nux_email_proxy.js b/components/nux/email/resources/nux_email_proxy.js index a8ca69d..cd65efda 100644 --- a/components/nux/email/resources/nux_email_proxy.js +++ b/components/nux/email/resources/nux_email_proxy.js
@@ -13,6 +13,9 @@ * @param {!Function} callback */ addBookmark(data, callback) {} + + /** @return {!Array<Object>} Array of email providers. */ + getEmailList() {} } /** @implements {NuxEmailProxy} */ @@ -27,6 +30,20 @@ chrome.bookmarks.create(data, callback); // TODO(scottchen): request C++ to cache favicon } + + /** @override */ + getEmailList() { + let emailCount = loadTimeData.getInteger('email_count'); + let emailList = []; + for (let i = 0; i < emailCount; ++i) { + emailList.push({ + name: loadTimeData.getString(`email_name_${i}`), + icon: loadTimeData.getString(`email_name_${i}`).toLowerCase(), + url: loadTimeData.getString(`email_url_${i}`) + }) + } + return emailList; + } } cr.addSingletonGetter(NuxEmailProxyImpl);
diff --git a/components/nux/set_as_default/resources/BUILD.gn b/components/nux/set_as_default/resources/BUILD.gn new file mode 100644 index 0000000..4db1759 --- /dev/null +++ b/components/nux/set_as_default/resources/BUILD.gn
@@ -0,0 +1,21 @@ +# 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("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + deps = [ + ":nux_set_as_default", + ] +} + +js_library("nux_set_as_default") { + deps = [ + ":nux_set_as_default_proxy", + ] +} + +js_library("nux_set_as_default_proxy") { + deps = [] +}
diff --git a/components/nux/set_as_default/resources/nux_set_as_default.html b/components/nux/set_as_default/resources/nux_set_as_default.html new file mode 100644 index 0000000..ec5465f1 --- /dev/null +++ b/components/nux/set_as_default/resources/nux_set_as_default.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html dir="$i18n{textdirection}" lang="$i18n{language}"> +<head> + <meta charset="utf-8"> + <title>TODO_TITLE</title> + <link rel="import" href="chrome://resources/html/polymer.html"> + <link rel="import" href="nux_set_as_default_proxy.html"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <style> + body { + margin: 0; + } + </style> + + <dom-module id="nux-set-as-default"> + <template> + <style> + :host { + align-items: center; + display: flex; + height: 100vh; + justify-content: space-around; + } + + .container { + text-align: center; + width: 800; + } + </style> + <div class="container"> + hi + </div> + </template> + <script src="nux_set_as_default.js"></script> + </dom-module> +</head> +<body> + <nux-set-as-default></nux-set-as-default> +</body> +</html> \ No newline at end of file
diff --git a/components/nux/set_as_default/resources/nux_set_as_default.js b/components/nux/set_as_default/resources/nux_set_as_default.js new file mode 100644 index 0000000..fa1e154 --- /dev/null +++ b/components/nux/set_as_default/resources/nux_set_as_default.js
@@ -0,0 +1,7 @@ +// 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. + +Polymer({ + is: 'nux-set-as-default', +});
diff --git a/components/nux/set_as_default/resources/nux_set_as_default_proxy.html b/components/nux/set_as_default/resources/nux_set_as_default_proxy.html new file mode 100644 index 0000000..b1dcbde2 --- /dev/null +++ b/components/nux/set_as_default/resources/nux_set_as_default_proxy.html
@@ -0,0 +1,2 @@ +<link rel="import" href="chrome://resources/html/cr.html"> +<script src="nux_set_as_default_proxy.js"></script> \ No newline at end of file
diff --git a/components/nux/set_as_default/resources/nux_set_as_default_proxy.js b/components/nux/set_as_default/resources/nux_set_as_default_proxy.js new file mode 100644 index 0000000..f33fe32 --- /dev/null +++ b/components/nux/set_as_default/resources/nux_set_as_default_proxy.js
@@ -0,0 +1,20 @@ +// 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. + +cr.define('nux', function() { + /** @interface */ + class NuxSetAsDefaultProxy { + } + + /** @implements {NuxSetAsDefaultProxy} */ + class NuxSetAsDefaultProxyImpl { + } + + cr.addSingletonGetter(NuxSetAsDefaultProxyImpl); + + return { + NuxSetAsDefaultProxy: NuxSetAsDefaultProxy, + NuxSetAsDefaultProxyImpl: NuxSetAsDefaultProxyImpl, + }; +}); \ No newline at end of file
diff --git a/components/nux/set_as_default/set_as_default_handler.cc b/components/nux/set_as_default/set_as_default_handler.cc new file mode 100644 index 0000000..8c02d06 --- /dev/null +++ b/components/nux/set_as_default/set_as_default_handler.cc
@@ -0,0 +1,44 @@ +// 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/nux/set_as_default/set_as_default_handler.h" + +#include "base/bind.h" +#include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_macros.h" +#include "base/stl_util.h" +#include "base/strings/utf_string_conversions.h" +#include "components/grit/components_resources.h" +#include "components/grit/components_scaled_resources.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" +#include "ui/base/resource/resource_bundle.h" + +namespace nux { + +SetAsDefaultHandler::SetAsDefaultHandler() {} + +SetAsDefaultHandler::~SetAsDefaultHandler() {} + +void SetAsDefaultHandler::RegisterMessages() {} + +void SetAsDefaultHandler::AddSources(content::WebUIDataSource* html_source) { + // Localized strings. + + // Add required resources. + html_source->AddResourcePath("nux_set_as_default.html", + IDR_NUX_SET_AS_DEFAULT_HTML); + html_source->AddResourcePath("nux_set_as_default.js", + IDR_NUX_SET_AS_DEFAULT_JS); + html_source->AddResourcePath("nux_set_as_default_proxy.html", + IDR_NUX_SET_AS_DEFAULT_PROXY_HTML); + html_source->AddResourcePath("nux_set_as_default_proxy.js", + IDR_NUX_SET_AS_DEFAULT_PROXY_JS); + + // Add icons +} + +} // namespace nux \ No newline at end of file
diff --git a/components/nux/set_as_default/set_as_default_handler.h b/components/nux/set_as_default/set_as_default_handler.h new file mode 100644 index 0000000..1011808 --- /dev/null +++ b/components/nux/set_as_default/set_as_default_handler.h
@@ -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. + +#ifndef COMPONENTS_NUX_SET_AS_DEFAULT_SET_AS_DEFAULT_HANDLER_H_ +#define COMPONENTS_NUX_SET_AS_DEFAULT_SET_AS_DEFAULT_HANDLER_H_ + +#include "base/macros.h" +#include "base/values.h" +#include "content/public/browser/web_ui_message_handler.h" + +namespace content { +class WebUIDataSource; +} // namespace content + +namespace nux { + +class SetAsDefaultHandler : public content::WebUIMessageHandler { + public: + SetAsDefaultHandler(); + ~SetAsDefaultHandler() override; + + // WebUIMessageHandler: + void RegisterMessages() override; + + // Adds webui sources. + static void AddSources(content::WebUIDataSource* html_source); + + DISALLOW_COPY_AND_ASSIGN(SetAsDefaultHandler); +}; + +} // namespace nux + +#endif // COMPONENTS_NUX_SET_AS_DEFAULT_SET_AS_DEFAULT_HANDLER_H_
diff --git a/components/nux_email_strings.grdp b/components/nux_email_strings.grdp new file mode 100644 index 0000000..4686b8c --- /dev/null +++ b/components/nux_email_strings.grdp
@@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <message name="IDS_NUX_EMAIL_GET_STARTED" desc="Label for a confirmation button to finish adding a bookmark and get the user started with using the browser."> + Get started + </message> + <message name="IDS_NUX_EMAIL_PROMPT" desc="Text shown to prompt the users to select an email service to add as bookmark. This is the subheader for IDS_NUX_EMAIL_WELCOME_TITLE."> + Choose your email service for quick access + </message> + <message name="IDS_NUX_EMAIL_WELCOME_TITLE" desc="Text shown to welcome the users to chrome."> + Make Chrome your own + </message> +</grit-part>
diff --git a/components/omnibox/browser/omnibox_edit_controller.cc b/components/omnibox/browser/omnibox_edit_controller.cc index 1ac14ecb..1ddfd0e 100644 --- a/components/omnibox/browser/omnibox_edit_controller.cc +++ b/components/omnibox/browser/omnibox_edit_controller.cc
@@ -10,10 +10,12 @@ const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type type) { + AutocompleteMatchType::Type type, + base::TimeTicks match_selection_timestamp) { destination_url_ = destination_url; disposition_ = disposition; transition_ = transition; + match_selection_timestamp_ = match_selection_timestamp; } void OmniboxEditController::OnInputInProgress(bool in_progress) {}
diff --git a/components/omnibox/browser/omnibox_edit_controller.h b/components/omnibox/browser/omnibox_edit_controller.h index a18241d..de8befb 100644 --- a/components/omnibox/browser/omnibox_edit_controller.h +++ b/components/omnibox/browser/omnibox_edit_controller.h
@@ -6,6 +6,7 @@ #define COMPONENTS_OMNIBOX_BROWSER_OMNIBOX_EDIT_CONTROLLER_H_ #include "base/macros.h" +#include "base/time/time.h" #include "components/omnibox/browser/autocomplete_match_type.h" #include "ui/base/page_transition_types.h" #include "ui/base/window_open_disposition.h" @@ -18,7 +19,8 @@ virtual void OnAutocompleteAccept(const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type match_type); + AutocompleteMatchType::Type match_type, + base::TimeTicks match_selection_timestamp); virtual void OnInputInProgress(bool in_progress); @@ -40,12 +42,16 @@ GURL destination_url() const { return destination_url_; } WindowOpenDisposition disposition() const { return disposition_; } ui::PageTransition transition() const { return transition_; } + base::TimeTicks match_selection_timestamp() const { + return match_selection_timestamp_; + } private: // The details necessary to open the user's desired omnibox match. GURL destination_url_; WindowOpenDisposition disposition_; ui::PageTransition transition_; + base::TimeTicks match_selection_timestamp_; DISALLOW_COPY_AND_ASSIGN(OmniboxEditController); };
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc index 710120e7..0df80fc 100644 --- a/components/omnibox/browser/omnibox_edit_model.cc +++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -469,7 +469,8 @@ return match.destination_url.is_valid(); } -void OmniboxEditModel::PasteAndGo(const base::string16& text) { +void OmniboxEditModel::PasteAndGo(const base::string16& text, + base::TimeTicks match_selection_timestamp) { DCHECK(CanPasteAndGo(text)); UMA_HISTOGRAM_COUNTS("Omnibox.PasteAndGo", 1); @@ -478,7 +479,8 @@ GURL alternate_nav_url; ClassifyString(text, &match, &alternate_nav_url); view_->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB, alternate_nav_url, - text, OmniboxPopupModel::kNoMatch); + text, OmniboxPopupModel::kNoMatch, + match_selection_timestamp); } bool OmniboxEditModel::ClassifiesAsSearch(const base::string16& text) const { @@ -488,7 +490,8 @@ } void OmniboxEditModel::AcceptInput(WindowOpenDisposition disposition, - bool for_drop) { + bool for_drop, + base::TimeTicks match_selection_timestamp) { // Get the URL and transition type for the selected entry. GURL alternate_nav_url; AutocompleteMatch match = CurrentMatch(&alternate_nav_url); @@ -557,7 +560,7 @@ DCHECK(popup_model()); view_->OpenMatch(match, disposition, alternate_nav_url, base::string16(), - popup_model()->selected_line()); + popup_model()->selected_line(), match_selection_timestamp); } void OmniboxEditModel::EnterKeywordModeForDefaultSearchProvider( @@ -594,7 +597,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t index) { + size_t index, + base::TimeTicks match_selection_timestamp) { const base::TimeTicks& now(base::TimeTicks::Now()); base::TimeDelta elapsed_time_since_user_first_modified_omnibox( now - time_user_first_modified_omnibox_); @@ -739,9 +743,9 @@ base::AutoReset<bool> tmp(&in_revert_, true); controller_->OnAutocompleteAccept( match.destination_url, disposition, - ui::PageTransitionFromInt( - match.transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR), - match.type); + ui::PageTransitionFromInt(match.transition | + ui::PAGE_TRANSITION_FROM_ADDRESS_BAR), + match.type, match_selection_timestamp); // The observer should have been synchronously notified of a pending load. if (observer && observer->HasSeenPendingLoad())
diff --git a/components/omnibox/browser/omnibox_edit_model.h b/components/omnibox/browser/omnibox_edit_model.h index 47967cac..6808095 100644 --- a/components/omnibox/browser/omnibox_edit_model.h +++ b/components/omnibox/browser/omnibox_edit_model.h
@@ -193,7 +193,9 @@ bool CanPasteAndGo(const base::string16& text) const; // Navigates to the destination last supplied to CanPasteAndGo. - void PasteAndGo(const base::string16& text); + void PasteAndGo( + const base::string16& text, + base::TimeTicks match_selection_timestamp = base::TimeTicks()); // Returns true if |text| classifies as a Search rather than a URL. bool ClassifiesAsSearch(const base::string16& text) const; @@ -203,8 +205,10 @@ // it indicates the input is being accepted as part of a drop operation and // the transition should be treated as LINK (so that it won't trigger the // URL to be autocompleted). - void AcceptInput(WindowOpenDisposition disposition, - bool for_drop); + void AcceptInput( + WindowOpenDisposition disposition, + bool for_drop, + base::TimeTicks match_selection_timestamp = base::TimeTicks()); // Asks the browser to load the item at |index|, with the given properties. // OpenMatch() needs to know the original text that drove this action. If @@ -226,7 +230,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t index); + size_t index, + base::TimeTicks match_selection_timestamp = base::TimeTicks()); OmniboxFocusState focus_state() const { return focus_state_; } bool has_focus() const { return focus_state_ != OMNIBOX_FOCUS_NONE; }
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 6a1bb48..faf4d784 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -136,18 +136,26 @@ "OmniboxUIExperimentJogTextfieldOnPopup", base::FEATURE_ENABLED_BY_DEFAULT}; -// Feature used for showing the URL suggestion favicons as a UI experiment. +// Feature used for showing the URL suggestion favicons as a UI experiment, +// currently only used on desktop platforms. const base::Feature kUIExperimentShowSuggestionFavicons{ "OmniboxUIExperimentShowSuggestionFavicons", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Feature used to always swap the title and URL. const base::Feature kUIExperimentSwapTitleAndUrl{ - "OmniboxUIExperimentSwapTitleAndUrl", base::FEATURE_DISABLED_BY_DEFAULT}; + "OmniboxUIExperimentSwapTitleAndUrl", +#if defined(OS_IOS) || defined(OS_ANDROID) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +}; -// Feature used for the vertical margin UI experiment. +// Feature used for the vertical margin UI experiment, currently only used on +// desktop platforms. const base::Feature kUIExperimentVerticalMargin{ - "OmniboxUIExperimentVerticalMargin", base::FEATURE_DISABLED_BY_DEFAULT}; + "OmniboxUIExperimentVerticalMargin", base::FEATURE_ENABLED_BY_DEFAULT}; // Feature used to enable speculatively starting a service worker associated // with the destination of the default match when the user's input looks like a @@ -766,10 +774,8 @@ if (base::FeatureList::IsEnabled(features::kExperimentalUi)) return 10; - using Md = ui::MaterialDesignController; return base::GetFieldTrialParamByFeatureAsInt( - omnibox::kUIExperimentVerticalMargin, kUIVerticalMarginParam, - Md::GetMode() == Md::MATERIAL_HYBRID ? 8 : 4); + omnibox::kUIExperimentVerticalMargin, kUIVerticalMarginParam, 10); } const char OmniboxFieldTrial::kBundledExperimentFieldTrialName[] =
diff --git a/components/omnibox/browser/omnibox_view.cc b/components/omnibox/browser/omnibox_view.cc index 89a0aff3..6bcca5f 100644 --- a/components/omnibox/browser/omnibox_view.cc +++ b/components/omnibox/browser/omnibox_view.cc
@@ -89,12 +89,13 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) { + size_t selected_line, + base::TimeTicks match_selection_timestamp) { // Invalid URLs such as chrome://history can end up here. if (!match.destination_url.is_valid() || !model_) return; - model_->OpenMatch( - match, disposition, alternate_nav_url, pasted_text, selected_line); + model_->OpenMatch(match, disposition, alternate_nav_url, pasted_text, + selected_line, match_selection_timestamp); } bool OmniboxView::IsEditingOrEmpty() const {
diff --git a/components/omnibox/browser/omnibox_view.h b/components/omnibox/browser/omnibox_view.h index b8c0795..65641ca 100644 --- a/components/omnibox/browser/omnibox_view.h +++ b/components/omnibox/browser/omnibox_view.h
@@ -77,7 +77,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line); + size_t selected_line, + base::TimeTicks match_selection_timestamp); // Returns the current text of the edit control, which could be the // "temporary" text set by the popup, the "permanent" text set by the
diff --git a/components/omnibox/browser/query_in_omnibox.h b/components/omnibox/browser/query_in_omnibox.h index 440e120..0c5d7bd 100644 --- a/components/omnibox/browser/query_in_omnibox.h +++ b/components/omnibox/browser/query_in_omnibox.h
@@ -7,6 +7,7 @@ #include "base/macros.h" #include "base/strings/string16.h" +#include "components/keyed_service/core/keyed_service.h" #include "components/security_state/core/security_state.h" #include "url/gurl.h" @@ -15,7 +16,7 @@ // This class holds the business logic for Query in Omnibox shared between both // Android and Desktop. -class QueryInOmnibox { +class QueryInOmnibox : public KeyedService { public: QueryInOmnibox(AutocompleteClassifier* autocomplete_classifier, TemplateURLService* template_url_service);
diff --git a/components/omnibox/browser/test_omnibox_view.h b/components/omnibox/browser/test_omnibox_view.h index 2b29397..7ad1810 100644 --- a/components/omnibox/browser/test_omnibox_view.h +++ b/components/omnibox/browser/test_omnibox_view.h
@@ -31,7 +31,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) override {} + size_t selected_line, + base::TimeTicks match_selection_timestamp) override {} base::string16 GetText() const override; void SetUserText(const base::string16& text, bool update_popup) override; void SetWindowTextAndCaretPos(const base::string16& text,
diff --git a/components/pairing/message_buffer_unittest.cc b/components/pairing/message_buffer_unittest.cc index 2f9fe407..e2d41229 100644 --- a/components/pairing/message_buffer_unittest.cc +++ b/components/pairing/message_buffer_unittest.cc
@@ -13,7 +13,8 @@ TEST_F(MessageBufferTest, BasicReadWrite) { MessageBuffer message_buffer; - scoped_refptr<net::IOBuffer> io_buffer(new net::IOBuffer(3)); + scoped_refptr<net::IOBuffer> io_buffer = + base::MakeRefCounted<net::IOBuffer>(3); io_buffer->data()[0] = 3; io_buffer->data()[1] = 1; io_buffer->data()[2] = 4; @@ -35,10 +36,12 @@ TEST_F(MessageBufferTest, SplitBuffer) { MessageBuffer message_buffer; - scoped_refptr<net::IOBuffer> io_buffer0(new net::IOBuffer(1)); + scoped_refptr<net::IOBuffer> io_buffer0 = + base::MakeRefCounted<net::IOBuffer>(1); io_buffer0->data()[0] = 3; - scoped_refptr<net::IOBuffer> io_buffer1(new net::IOBuffer(2)); + scoped_refptr<net::IOBuffer> io_buffer1 = + base::MakeRefCounted<net::IOBuffer>(2); io_buffer1->data()[0] = 1; io_buffer1->data()[1] = 4; @@ -56,11 +59,14 @@ TEST_F(MessageBufferTest, EmptyBuffer) { MessageBuffer message_buffer; - scoped_refptr<net::IOBuffer> io_buffer0(new net::IOBuffer(1)); + scoped_refptr<net::IOBuffer> io_buffer0 = + base::MakeRefCounted<net::IOBuffer>(1); io_buffer0->data()[0] = 3; - scoped_refptr<net::IOBuffer> io_buffer1(new net::IOBuffer(0)); - scoped_refptr<net::IOBuffer> io_buffer2(new net::IOBuffer(2)); + scoped_refptr<net::IOBuffer> io_buffer1 = + base::MakeRefCounted<net::IOBuffer>(0); + scoped_refptr<net::IOBuffer> io_buffer2 = + base::MakeRefCounted<net::IOBuffer>(2); io_buffer2->data()[0] = 1; io_buffer2->data()[1] = 4;
diff --git a/components/pairing/proto_decoder.cc b/components/pairing/proto_decoder.cc index c0e01a6..83bb7ac 100644 --- a/components/pairing/proto_decoder.cc +++ b/components/pairing/proto_decoder.cc
@@ -204,7 +204,7 @@ uint16_t message_size = message.size(); *size = sizeof(message_type) + sizeof(message_size) + message.size(); - IOBufferRefPtr io_buffer(new net::IOBuffer(*size)); + IOBufferRefPtr io_buffer = base::MakeRefCounted<net::IOBuffer>(*size); // Write the message type. int offset = 0;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 77eb5e2..943f5bac7 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -140,6 +140,8 @@ "password_ui_utils.h", "psl_matching_helper.cc", "psl_matching_helper.h", + "redundant_credentials_cleaner.cc", + "redundant_credentials_cleaner.h", "site_affiliation/asset_link_data.cc", "site_affiliation/asset_link_data.h", "sql_table_builder.cc", @@ -402,6 +404,7 @@ "password_syncable_service_unittest.cc", "password_ui_utils_unittest.cc", "psl_matching_helper_unittest.cc", + "redundant_credentials_cleaner_unittest.cc", "site_affiliation/asset_link_data_unittest.cc", "sql_table_builder_unittest.cc", "statistics_table_unittest.cc",
diff --git a/components/password_manager/core/browser/new_password_form_manager.cc b/components/password_manager/core/browser/new_password_form_manager.cc index 3f4c041f..886263fa 100644 --- a/components/password_manager/core/browser/new_password_form_manager.cc +++ b/components/password_manager/core/browser/new_password_form_manager.cc
@@ -5,11 +5,15 @@ #include "components/password_manager/core/browser/new_password_form_manager.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/user_metrics.h" +#include "base/metrics/user_metrics_action.h" #include "components/autofill/core/browser/form_structure.h" +#include "components/autofill/core/browser/validation.h" #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/browser_save_password_progress_logger.h" #include "components/password_manager/core/browser/form_fetcher_impl.h" #include "components/password_manager/core/browser/form_parsing/form_parser.h" +#include "components/password_manager/core/browser/form_saver.h" #include "components/password_manager/core/browser/password_form_filling.h" #include "components/password_manager/core/browser/password_form_metrics_recorder.h" #include "components/password_manager/core/browser/password_manager_client.h" @@ -77,13 +81,48 @@ } } +// Returns true iff |best_matches| contain a preferred credential with a +// username other than |preferred_username|. +bool DidPreferenceChange( + const std::map<base::string16, const PasswordForm*>& best_matches, + const base::string16& preferred_username) { + for (const auto& key_value_pair : best_matches) { + const PasswordForm& form = *key_value_pair.second; + if (form.preferred && !form.is_public_suffix_match && + form.username_value != preferred_username) { + return true; + } + } + return false; +} + +// Filter sensitive information, duplicates and |username_value| out from +// |form->other_possible_usernames|. +void SanitizePossibleUsernames(PasswordForm* form) { + auto& usernames = form->other_possible_usernames; + + // Deduplicate. + std::sort(usernames.begin(), usernames.end()); + usernames.erase(std::unique(usernames.begin(), usernames.end()), + usernames.end()); + + // Filter out |form->username_value| and sensitive information. + const base::string16& username_value = form->username_value; + base::EraseIf(usernames, [&username_value](const ValueElementPair& pair) { + return pair.first == username_value || + autofill::IsValidCreditCardNumber(pair.first) || + autofill::IsSSN(pair.first); + }); +} + } // namespace NewPasswordFormManager::NewPasswordFormManager( PasswordManagerClient* client, const base::WeakPtr<PasswordManagerDriver>& driver, const FormData& observed_form, - FormFetcher* form_fetcher) + FormFetcher* form_fetcher, + std::unique_ptr<FormSaver> form_saver) : client_(client), driver_(driver), observed_form_(observed_form), @@ -95,6 +134,7 @@ true /* should_migrate_http_passwords */, true /* should_query_suppressed_https_forms */)), form_fetcher_(form_fetcher ? form_fetcher : owned_form_fetcher_.get()), + form_saver_(std::move(form_saver)), // TODO(https://crbug.com/831123): set correctly // |is_possible_change_password_form| in |votes_uploader_| constructor votes_uploader_(client, false /* is_possible_change_password_form */), @@ -183,11 +223,52 @@ return preferred_match_; } -// TODO(https://crbug.com/831123): Implement all methods from -// PasswordFormManagerForUI. -void NewPasswordFormManager::Save() {} +void NewPasswordFormManager::Save() { + DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState()); + DCHECK(!client_->IsIncognito()); + + // TODO(https://crbug.com/831123): Implement indicator event metrics. + if (user_action_ == UserAction::kNone && + DidPreferenceChange(best_matches_, pending_credentials_.username_value)) { + SetUserAction(UserAction::kChoose); + } + if (user_action_ == UserAction::kOverridePassword && + pending_credentials_.type == PasswordForm::TYPE_GENERATED && + !has_generated_password_) { + metrics_util::LogPasswordGenerationSubmissionEvent( + metrics_util::PASSWORD_OVERRIDDEN); + pending_credentials_.type = PasswordForm::TYPE_MANUAL; + } + + if (is_new_login_) { + SanitizePossibleUsernames(&pending_credentials_); + pending_credentials_.date_created = base::Time::Now(); + votes_uploader_.SendVotesOnSave(observed_form_, *parsed_submitted_form_, + best_matches_, &pending_credentials_); + form_saver_->Save(pending_credentials_, best_matches_); + } else { + ProcessUpdate(); + std::vector<PasswordForm> credentials_to_update = + FindOtherCredentialsToUpdate(); + form_saver_->Update(pending_credentials_, best_matches_, + &credentials_to_update, nullptr); + } + + if (pending_credentials_.times_used == 1 && + pending_credentials_.type == PasswordForm::TYPE_GENERATED) { + // This also includes PSL matched credentials. + metrics_util::LogPasswordGenerationSubmissionEvent( + metrics_util::PASSWORD_USED); + } + + // TODO(https://crbug.com/831123): Implement updating Password Form Managers. +} + void NewPasswordFormManager::Update(const PasswordForm& credentials_to_update) { } + +// TODO(https://crbug.com/831123): Implement all methods from +// PasswordFormManagerForUI. void NewPasswordFormManager::UpdateUsername( const base::string16& new_username) {} void NewPasswordFormManager::UpdatePasswordValue( @@ -359,18 +440,17 @@ DCHECK(is_submitted_); // TODO(https://crbug.com/831123): Process correctly the case when saved // credentials are not received from the store yet. - std::unique_ptr<PasswordForm> submitted_password_form = - ParseFormAndMakeLogging(client_, submitted_form_, predictions_, - FormParsingMode::SAVING); - if (!submitted_password_form) + parsed_submitted_form_ = ParseFormAndMakeLogging( + client_, submitted_form_, predictions_, FormParsingMode::SAVING); + if (!parsed_submitted_form_) return; - ValueElementPair password_to_save(PasswordToSave(*submitted_password_form)); + ValueElementPair password_to_save(PasswordToSave(*parsed_submitted_form_)); // Look for the actually submitted credentials in the list of previously saved // credentials that were available to autofilling. const PasswordForm* saved_form = - FindBestSavedMatch(submitted_password_form.get()); + FindBestSavedMatch(parsed_submitted_form_.get()); if (saved_form) { // The user signed in with a login we autofilled. pending_credentials_ = *saved_form; @@ -393,7 +473,7 @@ // Update |pending_credentials_| in order to be able correctly save it. pending_credentials_.origin = submitted_form_.origin; - pending_credentials_.signon_realm = submitted_password_form->signon_realm; + pending_credentials_.signon_realm = parsed_submitted_form_->signon_realm; // Normally, the copy of the PSL matched credentials, adapted for the // current domain, is saved automatically without asking the user, because @@ -426,8 +506,8 @@ SetUserAction(UserAction::kOverridePassword); } } else if (!best_matches_.empty() && - submitted_password_form->type != PasswordForm::TYPE_API && - submitted_password_form->username_value.empty()) { + parsed_submitted_form_->type != PasswordForm::TYPE_API && + parsed_submitted_form_->username_value.empty()) { // This branch deals with the case that the submitted form has no username // element and needs to decide whether to offer to update any credentials. // In that case, the user can select any previously stored credential as @@ -436,13 +516,13 @@ // Find the best candidate to select by default in the password update // bubble. If no best candidate is found, any one can be offered. const PasswordForm* best_update_match = - FindBestMatchForUpdatePassword(submitted_password_form->password_value); + FindBestMatchForUpdatePassword(parsed_submitted_form_->password_value); // A retry password form is one that consists of only an "old password" // field, i.e. one that is not a "new password". retry_password_form_password_update_ = - submitted_password_form->username_value.empty() && - submitted_password_form->new_password_value.empty(); + parsed_submitted_form_->username_value.empty() && + parsed_submitted_form_->new_password_value.empty(); is_new_login_ = false; if (best_update_match) { @@ -452,7 +532,7 @@ // If a password was generated and we didn't find a match, we have to save // it in a separate entry since we have to store it but we don't know // where. - CreatePendingCredentialsForNewCredentials(*submitted_password_form, + CreatePendingCredentialsForNewCredentials(*parsed_submitted_form_, password_to_save.second); is_new_login_ = true; } else { @@ -466,14 +546,14 @@ is_new_login_ = true; // No stored credentials can be matched to the submitted form. Offer to // save new credentials. - CreatePendingCredentialsForNewCredentials(*submitted_password_form, + CreatePendingCredentialsForNewCredentials(*parsed_submitted_form_, password_to_save.second); // Generate username correction votes. bool username_correction_found = votes_uploader_.FindCorrectedUsernameElement( best_matches_, not_best_matches_, - submitted_password_form->username_value, - submitted_password_form->password_value); + parsed_submitted_form_->username_value, + parsed_submitted_form_->password_value); UMA_HISTOGRAM_BOOLEAN("PasswordManager.UsernameCorrectionFound", username_correction_found); if (username_correction_found) { @@ -489,25 +569,25 @@ pending_credentials_.password_value = password_to_save.first; pending_credentials_.preferred = true; pending_credentials_.form_has_autofilled_value = - submitted_password_form->form_has_autofilled_value; + parsed_submitted_form_->form_has_autofilled_value; pending_credentials_.all_possible_passwords = - submitted_password_form->all_possible_passwords; + parsed_submitted_form_->all_possible_passwords; CopyFieldPropertiesMasks(submitted_form_, &pending_credentials_.form_data); // If we're dealing with an API-driven provisionally saved form, then take // the server provided values. We don't do this for non-API forms, as // those will never have those members set. - if (submitted_password_form->type == PasswordForm::TYPE_API) { + if (parsed_submitted_form_->type == PasswordForm::TYPE_API) { pending_credentials_.skip_zero_click = - submitted_password_form->skip_zero_click; - pending_credentials_.display_name = submitted_password_form->display_name; + parsed_submitted_form_->skip_zero_click; + pending_credentials_.display_name = parsed_submitted_form_->display_name; pending_credentials_.federation_origin = - submitted_password_form->federation_origin; - pending_credentials_.icon_url = submitted_password_form->icon_url; + parsed_submitted_form_->federation_origin; + pending_credentials_.icon_url = parsed_submitted_form_->icon_url; // It's important to override |signon_realm| for federated credentials // because it has format "federation://" + origin_host + "/" + // federation_host - pending_credentials_.signon_realm = submitted_password_form->signon_realm; + pending_credentials_.signon_realm = parsed_submitted_form_->signon_realm; } if (has_generated_password_) @@ -603,4 +683,57 @@ metrics_recorder_->SetUserAction(user_action); } +void NewPasswordFormManager::ProcessUpdate() { + DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState()); + DCHECK(preferred_match_ || !pending_credentials_.federation_origin.unique()); + // If we're doing an Update, we either autofilled correctly and need to + // update the stats, or the user typed in a new password for autofilled + // username, or the user selected one of the non-preferred matches, + // thus requiring a swap of preferred bits. + DCHECK(!is_new_login_ && pending_credentials_.preferred); + DCHECK(!client_->IsIncognito()); + DCHECK(parsed_submitted_form_); + + password_manager_util::UpdateMetadataForUsage(&pending_credentials_); + + base::RecordAction( + base::UserMetricsAction("PasswordManager_LoginFollowingAutofill")); + + // Check to see if this form is a candidate for password generation. + // Do not send votes on change password forms, since they were already sent in + // Update() method. + if (!parsed_submitted_form_->IsPossibleChangePasswordForm()) { + votes_uploader_.SendVoteOnCredentialsReuse( + observed_form_, *parsed_submitted_form_, &pending_credentials_); + } + + if (pending_credentials_.times_used == 1) { + votes_uploader_.UploadFirstLoginVotes(best_matches_, pending_credentials_, + *parsed_submitted_form_); + } +} + +std::vector<PasswordForm> +NewPasswordFormManager::FindOtherCredentialsToUpdate() { + std::vector<autofill::PasswordForm> credentials_to_update; + if (!pending_credentials_.federation_origin.unique()) + return credentials_to_update; + + auto updated_password_it = + best_matches_.find(pending_credentials_.username_value); + DCHECK(best_matches_.end() != updated_password_it); + const base::string16& old_password = + updated_password_it->second->password_value; + for (auto* not_best_match : not_best_matches_) { + if (not_best_match->username_value == pending_credentials_.username_value && + not_best_match->password_value == old_password) { + credentials_to_update.push_back(*not_best_match); + credentials_to_update.back().password_value = + pending_credentials_.password_value; + } + } + + return credentials_to_update; +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/new_password_form_manager.h b/components/password_manager/core/browser/new_password_form_manager.h index 85cf94f..6d794cc 100644 --- a/components/password_manager/core/browser/new_password_form_manager.h +++ b/components/password_manager/core/browser/new_password_form_manager.h
@@ -27,6 +27,7 @@ namespace password_manager { +class FormSaver; class PasswordFormMetricsRecorder; class PasswordManagerClient; class PasswordManagerDriver; @@ -41,11 +42,13 @@ // TODO(crbug.com/621355): So far, |form_fetcher| can be null. In that case // |this| creates an instance of it itself (meant for production code). Once // the fetcher is shared between PasswordFormManager instances, it will be - // required that |form_fetcher| is not null. + // required that |form_fetcher| is not null. |form_saver| is used to + // save/update the form. NewPasswordFormManager(PasswordManagerClient* client, const base::WeakPtr<PasswordManagerDriver>& driver, const autofill::FormData& observed_form, - FormFetcher* form_fetcher); + FormFetcher* form_fetcher, + std::unique_ptr<FormSaver> form_saver); ~NewPasswordFormManager() override; @@ -121,6 +124,9 @@ static void set_wait_for_server_predictions_for_filling(bool value) { wait_for_server_predictions_for_filling_ = value; } + + FormSaver* form_saver() { return form_saver_.get(); } + #endif protected: @@ -171,6 +177,17 @@ votes_uploader_.set_password_overridden(password_overridden); } + // Helper for Save in the case there is at least one match for the pending + // credentials. This sends needed signals to the autofill server, and also + // triggers some UMA reporting. + void ProcessUpdate(); + + // Goes through |not_best_matches_|, updates the password of those which share + // the old password and username with |pending_credentials_| to the new + // password of |pending_credentials_|, and returns copies of all such modified + // credentials. + std::vector<autofill::PasswordForm> FindOtherCredentialsToUpdate(); + // The client which implements embedder-specific PasswordManager operations. PasswordManagerClient* client_; @@ -209,12 +226,17 @@ // FormFetcher instance which owns the login data from PasswordStore. FormFetcher* form_fetcher_; + // FormSaver instance used by |this| to all tasks related to storing + // credentials. + const std::unique_ptr<FormSaver> form_saver_; + VotesUploader votes_uploader_; // |is_submitted_| = true means that a submission of the managed form was seen // and then |submitted_form_| contains the submitted form. bool is_submitted_ = false; autofill::FormData submitted_form_; + std::unique_ptr<autofill::PasswordForm> parsed_submitted_form_; // Stores updated credentials when the form was submitted but success is still // unknown. This variable contains credentials that are ready to be written @@ -267,6 +289,6 @@ DISALLOW_COPY_AND_ASSIGN(NewPasswordFormManager); }; -} // namespace password_manager +} // namespace password_manager #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_NEW_PASSWORD_FORM_MANAGER_H_
diff --git a/components/password_manager/core/browser/new_password_form_manager_unittest.cc b/components/password_manager/core/browser/new_password_form_manager_unittest.cc index a564af5..a59ca7a 100644 --- a/components/password_manager/core/browser/new_password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/new_password_form_manager_unittest.cc
@@ -12,6 +12,7 @@ #include "components/autofill/core/common/password_form.h" #include "components/autofill/core/common/password_form_fill_data.h" #include "components/password_manager/core/browser/fake_form_fetcher.h" +#include "components/password_manager/core/browser/stub_form_saver.h" #include "components/password_manager/core/browser/stub_password_manager_client.h" #include "components/password_manager/core/browser/stub_password_manager_driver.h" #include "testing/gmock/include/gmock/gmock.h" @@ -26,7 +27,9 @@ using base::TestMockTimeTaskRunner; using testing::_; using testing::Mock; +using testing::NiceMock; using testing::SaveArg; +using testing::SaveArgPointee; namespace password_manager { @@ -59,6 +62,45 @@ EXPECT_EQ(expected.form_data, actual.form_data); } +class MockFormSaver : public StubFormSaver { + public: + MockFormSaver() = default; + + ~MockFormSaver() override = default; + + // FormSaver: + MOCK_METHOD1(PermanentlyBlacklist, void(autofill::PasswordForm* observed)); + MOCK_METHOD2( + Save, + void(const autofill::PasswordForm& pending, + const std::map<base::string16, const PasswordForm*>& best_matches)); + MOCK_METHOD4( + Update, + void(const autofill::PasswordForm& pending, + const std::map<base::string16, const PasswordForm*>& best_matches, + const std::vector<autofill::PasswordForm>* credentials_to_update, + const autofill::PasswordForm* old_primary_key)); + MOCK_METHOD1(PresaveGeneratedPassword, + void(const autofill::PasswordForm& generated)); + MOCK_METHOD0(RemovePresavedPassword, void()); + + std::unique_ptr<FormSaver> Clone() override { + return std::make_unique<MockFormSaver>(); + } + + // Convenience downcasting method. + static MockFormSaver& Get(NewPasswordFormManager* form_manager) { + return *static_cast<MockFormSaver*>(form_manager->form_saver()); + } + + private: + DISALLOW_COPY_AND_ASSIGN(MockFormSaver); +}; + +std::string GetSignonRealm(GURL origin) { + return origin.GetOrigin().spec(); +} + } // namespace // TODO(https://crbug.com/831123): Test sending metrics. @@ -71,6 +113,8 @@ NewPasswordFormManagerTest() : task_runner_(new TestMockTimeTaskRunner) { GURL origin = GURL("https://accounts.google.com/a/ServiceLoginAuth"); GURL action = GURL("https://accounts.google.com/a/ServiceLogin"); + GURL psl_origin = GURL("https://myaccounts.google.com/a/ServiceLoginAuth"); + GURL psl_action = GURL("https://myaccounts.google.com/a/ServiceLogin"); observed_form_.origin = origin; observed_form_.action = action; @@ -110,10 +154,18 @@ saved_match_.signon_realm = "https://accounts.google.com/"; saved_match_.preferred = true; saved_match_.username_value = ASCIIToUTF16("test@gmail.com"); + saved_match_.username_element = ASCIIToUTF16("field1"); saved_match_.password_value = ASCIIToUTF16("test1"); + saved_match_.password_element = ASCIIToUTF16("field2"); saved_match_.is_public_suffix_match = false; saved_match_.scheme = PasswordForm::SCHEME_HTML; + psl_saved_match_ = saved_match_; + psl_saved_match_.origin = psl_origin; + psl_saved_match_.action = psl_action; + psl_saved_match_.signon_realm = "https://myaccounts.google.com/"; + psl_saved_match_.is_public_suffix_match = true; + parsed_form_ = saved_match_; parsed_form_.form_data = observed_form_; parsed_form_.username_element = observed_form_.fields[1].name; @@ -129,6 +181,7 @@ FormData observed_form_; FormData observed_form_only_password_fields_; PasswordForm saved_match_; + PasswordForm psl_saved_match_; PasswordForm blacklisted_match_; PasswordForm parsed_form_; StubPasswordManagerClient client_; @@ -145,7 +198,8 @@ fetcher_.reset(new FakeFormFetcher()); fetcher_->Fetch(); form_manager_.reset(new NewPasswordFormManager( - &client_, driver_.AsWeakPtr(), observed_form_, fetcher_.get())); + &client_, driver_.AsWeakPtr(), observed_form_, fetcher_.get(), + std::make_unique<NiceMock<MockFormSaver>>())); } }; @@ -519,4 +573,174 @@ EXPECT_FALSE(form_manager_->IsEqualToSubmittedForm(observed_form_)); } +// Tests that when credentials with a new username (i.e. not saved yet) is +// successfully submitted, then they are saved correctly. +TEST_F(NewPasswordFormManagerTest, SaveNewCredentials) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + fetcher_->SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_; + base::string16 new_username = saved_match_.username_value + ASCIIToUTF16("1"); + base::string16 new_password = saved_match_.password_value + ASCIIToUTF16("1"); + submitted_form.fields[kUsernameFieldIndex].value = new_username; + submitted_form.fields[kPasswordFieldIndex].value = new_password; + + EXPECT_TRUE( + form_manager_->SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + EXPECT_TRUE(form_manager_->IsNewLogin()); + + MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); + PasswordForm saved_form; + std::map<base::string16, const PasswordForm*> best_matches; + EXPECT_CALL(form_saver, Save(_, _)) + .WillOnce(DoAll(SaveArg<0>(&saved_form), SaveArg<1>(&best_matches))); + + form_manager_->Save(); + + std::string expected_signon_realm = submitted_form.origin.GetOrigin().spec(); + EXPECT_EQ(submitted_form.origin, saved_form.origin); + EXPECT_EQ(expected_signon_realm, saved_form.signon_realm); + EXPECT_EQ(new_username, saved_form.username_value); + EXPECT_EQ(new_password, saved_form.password_value); + EXPECT_TRUE(saved_form.preferred); + + EXPECT_EQ(submitted_form.fields[kUsernameFieldIndex].name, + saved_form.username_element); + EXPECT_EQ(submitted_form.fields[kPasswordFieldIndex].name, + saved_form.password_element); + EXPECT_EQ(1u, best_matches.size()); + base::string16 saved_username = saved_match_.username_value; + ASSERT_TRUE(best_matches.find(saved_username) != best_matches.end()); + EXPECT_EQ(saved_match_, *best_matches[saved_username]); +} + +// Check that if there is saved PSL matched credentials with the same +// username/password as in submitted form, then the saved form is the same +// already saved only with origin and signon_realm from the submitted form. +TEST_F(NewPasswordFormManagerTest, SavePSLToAlreadySaved) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + fetcher_->SetNonFederated({&psl_saved_match_}, 0u); + + FormData submitted_form = observed_form_; + // Change + submitted_form.fields[kUsernameFieldIndex].value = + psl_saved_match_.username_value; + submitted_form.fields[kPasswordFieldIndex].value = + psl_saved_match_.password_value; + + EXPECT_TRUE( + form_manager_->SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + EXPECT_TRUE(form_manager_->IsNewLogin()); + EXPECT_TRUE(form_manager_->IsPendingCredentialsPublicSuffixMatch()); + + MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); + PasswordForm saved_form; + std::map<base::string16, const PasswordForm*> best_matches; + EXPECT_CALL(form_saver, Save(_, _)) + .WillOnce(DoAll(SaveArg<0>(&saved_form), SaveArg<1>(&best_matches))); + + form_manager_->Save(); + + EXPECT_EQ(submitted_form.origin, saved_form.origin); + EXPECT_EQ(GetSignonRealm(submitted_form.origin), saved_form.signon_realm); + EXPECT_EQ(saved_form.username_value, psl_saved_match_.username_value); + EXPECT_EQ(saved_form.password_value, psl_saved_match_.password_value); + EXPECT_EQ(saved_form.username_element, psl_saved_match_.username_element); + EXPECT_EQ(saved_form.password_element, psl_saved_match_.password_element); + + EXPECT_TRUE(saved_form.preferred); + + EXPECT_EQ(1u, best_matches.size()); + base::string16 saved_username = psl_saved_match_.username_value; + ASSERT_TRUE(best_matches.find(saved_username) != best_matches.end()); + EXPECT_EQ(psl_saved_match_, *best_matches[saved_username]); +} + +// Tests that when credentials with already saved username but with a new +// password are submitted, then the saved password is updated. +TEST_F(NewPasswordFormManagerTest, OverridePassword) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + fetcher_->SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_; + base::string16 username = saved_match_.username_value; + base::string16 new_password = saved_match_.password_value + ASCIIToUTF16("1"); + submitted_form.fields[kUsernameFieldIndex].value = username; + submitted_form.fields[kPasswordFieldIndex].value = new_password; + + EXPECT_TRUE( + form_manager_->SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + EXPECT_FALSE(form_manager_->IsNewLogin()); + EXPECT_TRUE(form_manager_->IsPasswordOverridden()); + + MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); + PasswordForm updated_form; + std::map<base::string16, const PasswordForm*> best_matches; + std::vector<PasswordForm> credentials_to_update; + EXPECT_CALL(form_saver, Update(_, _, _, nullptr)) + .WillOnce(DoAll(SaveArg<0>(&updated_form), SaveArg<1>(&best_matches), + SaveArgPointee<2>(&credentials_to_update))); + + form_manager_->Save(); + + EXPECT_TRUE(ArePasswordFormUniqueKeyEqual(saved_match_, updated_form)); + EXPECT_TRUE(updated_form.preferred); + EXPECT_EQ(new_password, updated_form.password_value); + EXPECT_EQ(1u, best_matches.size()); + ASSERT_TRUE(best_matches.find(username) != best_matches.end()); + EXPECT_EQ(saved_match_, *best_matches[username]); + EXPECT_TRUE(credentials_to_update.empty()); +} + +// Tests that when the user changes password on a change password form then the +// saved password is updated. +TEST_F(NewPasswordFormManagerTest, UpdatePasswordOnChangePasswordForm) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + CreateFormManager(observed_form_only_password_fields_); + PasswordForm not_best_saved_match = saved_match_; + not_best_saved_match.preferred = false; + PasswordForm saved_match_another_username = saved_match_; + saved_match_another_username.username_value += ASCIIToUTF16("1"); + + fetcher_->SetNonFederated( + {&saved_match_, ¬_best_saved_match, &saved_match_another_username}, + 0u); + + FormData submitted_form = observed_form_only_password_fields_; + submitted_form.fields[0].value = saved_match_.password_value; + base::string16 new_password = saved_match_.password_value + ASCIIToUTF16("1"); + submitted_form.fields[1].value = new_password; + + EXPECT_TRUE( + form_manager_->SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + EXPECT_FALSE(form_manager_->IsNewLogin()); + EXPECT_FALSE(form_manager_->IsPasswordOverridden()); + + MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); + PasswordForm updated_form; + std::map<base::string16, const PasswordForm*> best_matches; + std::vector<PasswordForm> credentials_to_update; + EXPECT_CALL(form_saver, Update(_, _, _, nullptr)) + .WillOnce(DoAll(SaveArg<0>(&updated_form), SaveArg<1>(&best_matches), + SaveArgPointee<2>(&credentials_to_update))); + + form_manager_->Save(); + + EXPECT_TRUE(ArePasswordFormUniqueKeyEqual(saved_match_, updated_form)); + EXPECT_TRUE(updated_form.preferred); + EXPECT_EQ(new_password, updated_form.password_value); + + EXPECT_EQ(2u, best_matches.size()); + base::string16 username = saved_match_.username_value; + ASSERT_TRUE(best_matches.find(username) != best_matches.end()); + EXPECT_EQ(saved_match_, *best_matches[username]); + base::string16 another_username = saved_match_another_username.username_value; + ASSERT_TRUE(best_matches.find(another_username) != best_matches.end()); + EXPECT_EQ(saved_match_another_username, *best_matches[another_username]); + + ASSERT_EQ(1u, credentials_to_update.size()); + not_best_saved_match.password_value = new_password; + EXPECT_EQ(not_best_saved_match, credentials_to_update[0]); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index d522291..b815ef0 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -50,18 +50,9 @@ namespace { -bool DoesStringContainOnlyDigits(const base::string16& s) { - for (auto c : s) { - if (!base::IsAsciiDigit(c)) - return false; - } - return true; -} - -// Heuristics to determine that a string is very unlikely to be a username. -bool IsProbablyNotUsername(const base::string16& s) { - return !s.empty() && DoesStringContainOnlyDigits(s) && s.size() < 3; -} +// This namespace is for fixing Jumbo builds, because the same functions are +// defined in new_password_form_manager.cc. +namespace password_form_manager_helpers { // Returns true iff |best_matches| contain a preferred credential with a // username other than |preferred_username|. @@ -97,6 +88,21 @@ }); } +} // namespace password_form_manager_helpers + +bool DoesStringContainOnlyDigits(const base::string16& s) { + for (auto c : s) { + if (!base::IsAsciiDigit(c)) + return false; + } + return true; +} + +// Heuristics to determine that a string is very unlikely to be a username. +bool IsProbablyNotUsername(const base::string16& s) { + return !s.empty() && DoesStringContainOnlyDigits(s) && s.size() < 3; +} + // Copies field properties masks from the form |from| to the form |to|. void CopyFieldPropertiesMasks(const PasswordForm& from, PasswordForm* to) { // Skip copying if the number of fields is different. @@ -299,7 +305,8 @@ submitted_form_->submission_event); if ((user_action_ == UserAction::kNone) && - DidPreferenceChange(best_matches_, pending_credentials_.username_value)) { + password_form_manager_helpers::DidPreferenceChange( + best_matches_, pending_credentials_.username_value)) { SetUserAction(UserAction::kChoose); } if (user_action_ == UserAction::kOverridePassword && @@ -311,7 +318,8 @@ } if (is_new_login_) { - SanitizePossibleUsernames(&pending_credentials_); + password_form_manager_helpers::SanitizePossibleUsernames( + &pending_credentials_); pending_credentials_.date_created = base::Time::Now(); votes_uploader_.SendVotesOnSave(observed_form_.form_data, *submitted_form_, best_matches_, &pending_credentials_); @@ -324,9 +332,9 @@ &credentials_to_update, nullptr); } - // This is not in ProcessUpdate() to catch PSL matched credentials. if (pending_credentials_.times_used == 1 && pending_credentials_.type == PasswordForm::TYPE_GENERATED) { + // This also includes PSL matched credentials. metrics_util::LogPasswordGenerationSubmissionEvent( metrics_util::PASSWORD_USED); }
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index c65d04d..dc0b8a5 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -250,6 +250,16 @@ return manager.IsNewLogin(); } +// Checks that |form| has visible password fields. It should be used only for +// GAIA forms. +bool IsThereVisiblePasswordField(const FormData& form) { + for (const autofill::FormFieldData& field : form.fields) { + if (field.form_control_type == "password" && field.is_focusable) + return true; + } + return false; +} + } // namespace // static @@ -515,6 +525,16 @@ logger.LogMessage(Logger::STRING_ON_SAME_DOCUMENT_NAVIGATION); } + if (gaia::IsGaiaSignonRealm(GURL(password_form.signon_realm)) && + !IsThereVisiblePasswordField(password_form.form_data)) { + // Gaia form without visible password fields is found. + // It might happen only when Password Manager autofilled a username + // (visible) and a password (invisible) fields. Then the user typed a new + // username. A page removed the form. As result a form is inconsistent - the + // username from one account, the password from another. Skip such form. + return; + } + if (is_new_form_parsing_for_saving_enabled_) ProcessSubmittedForm(password_form.form_data, driver); @@ -725,7 +745,8 @@ form_managers_.push_back(std::make_unique<NewPasswordFormManager>( client_, driver ? driver->AsWeakPtr() : base::WeakPtr<PasswordManagerDriver>(), - new_form->form_data, nullptr)); + new_form->form_data, nullptr, + std::make_unique<FormSaverImpl>(client_->GetPasswordStore()))); form_managers_.back()->set_old_parsing_result(*new_form); } }
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.h b/components/password_manager/core/browser/password_manager_metrics_util.h index aa6d0cb..a8063ba34 100644 --- a/components/password_manager/core/browser/password_manager_metrics_util.h +++ b/components/password_manager/core/browser/password_manager_metrics_util.h
@@ -289,7 +289,9 @@ kFailed = 1, // All the data is in the encrypted loginDB. kCopiedAll = 2, - kMaxValue = kCopiedAll + // The standard login database is encrypted. + kLoginDBReplaced = 3, + kMaxValue = kLoginDBReplaced }; // A version of the UMA_HISTOGRAM_BOOLEAN macro that allows the |name|
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 5196e4ee..5461e34 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -2627,4 +2627,26 @@ manager()->OnPasswordFormSubmittedNoChecks(&driver_, submitted_form); } +TEST_F(PasswordManagerTest, SubmittedGaiaFormWithoutVisiblePasswordField) { + // Tests that a submitted GAIA sign-in form which does not contain a visible + // password field is skipped. + std::vector<PasswordForm> observed; + PasswordForm form(MakeSimpleGAIAForm()); + observed.push_back(form); + EXPECT_CALL(*store_, GetLogins(_, _)) + .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms())); + manager()->OnPasswordFormsParsed(&driver_, observed); + manager()->OnPasswordFormsRendered(&driver_, observed, true); + + EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) + .WillRepeatedly(Return(true)); + + form.username_value = ASCIIToUTF16("username"); + form.password_value = ASCIIToUTF16("password"); + form.form_data.fields[1].is_focusable = false; + + EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); + manager()->OnPasswordFormSubmittedNoChecks(&driver_, form); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_manager_util.cc b/components/password_manager/core/browser/password_manager_util.cc index 3d4ffba..292b24e7 100644 --- a/components/password_manager/core/browser/password_manager_util.cc +++ b/components/password_manager/core/browser/password_manager_util.cc
@@ -23,6 +23,7 @@ #include "components/password_manager/core/browser/password_manager_driver.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_store_consumer.h" +#include "components/password_manager/core/browser/redundant_credentials_cleaner.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" @@ -33,49 +34,11 @@ namespace password_manager_util { namespace { -// This class is responsible for deleting blacklisted duplicates. -class BlacklistedDuplicatesCleaner - : public password_manager::PasswordStoreConsumer { - public: - BlacklistedDuplicatesCleaner(password_manager::PasswordStore* store, - PrefService* prefs) - : store_(store), prefs_(prefs) { - store_->GetBlacklistLogins(this); - } - ~BlacklistedDuplicatesCleaner() override = default; - - // PasswordStoreConsumer: - void OnGetPasswordStoreResults( - std::vector<std::unique_ptr<autofill::PasswordForm>> results) override { - std::set<std::string> signon_realms; - for (const auto& form : results) { - DCHECK(form->blacklisted_by_user); - if (!signon_realms.insert(form->signon_realm).second) { - // |results| already contain a form with the same signon_realm. - store_->RemoveLogin(*form); - } - } - const size_t duplicates = results.size() - signon_realms.size(); - if (duplicates == 0) { - prefs_->SetBoolean( - password_manager::prefs::kDuplicatedBlacklistedCredentialsRemoved, - true); - } - delete this; - } - - private: - password_manager::PasswordStore* store_; - PrefService* prefs_; - - DISALLOW_COPY_AND_ASSIGN(BlacklistedDuplicatesCleaner); -}; - void StartDeletingBlacklistedDuplicates( - const scoped_refptr<password_manager::PasswordStore>& store, + scoped_refptr<password_manager::PasswordStore> store, PrefService* prefs) { // The object will delete itself once the credentials are retrieved. - new BlacklistedDuplicatesCleaner(store.get(), prefs); + new password_manager::RedundantCredentialsCleaner(std::move(store), prefs); } // Return true if @@ -370,9 +333,10 @@ autofill::password_generation::PASSWORD_GENERATION_CONTEXT_MENU_PRESSED); } -void DeleteBlacklistedDuplicates(password_manager::PasswordStore* store, - PrefService* prefs, - int delay_in_seconds) { +void DeleteBlacklistedDuplicates( + scoped_refptr<password_manager::PasswordStore> store, + PrefService* prefs, + int delay_in_seconds) { const bool need_to_remove_blacklisted_duplicates = !prefs->GetBoolean( password_manager::prefs::kDuplicatedBlacklistedCredentialsRemoved); base::UmaHistogramBoolean( @@ -381,8 +345,8 @@ if (need_to_remove_blacklisted_duplicates) base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, - base::BindOnce(&StartDeletingBlacklistedDuplicates, - base::WrapRefCounted(store), prefs), + base::BindOnce(&StartDeletingBlacklistedDuplicates, std::move(store), + prefs), base::TimeDelta::FromSeconds(delay_in_seconds)); }
diff --git a/components/password_manager/core/browser/password_manager_util.h b/components/password_manager/core/browser/password_manager_util.h index 4cd8613..ea8369d 100644 --- a/components/password_manager/core/browser/password_manager_util.h +++ b/components/password_manager/core/browser/password_manager_util.h
@@ -93,9 +93,10 @@ // Two blacklisted forms are considered equal if they have the same // signon_realm. -void DeleteBlacklistedDuplicates(password_manager::PasswordStore* store, - PrefService* prefs, - int delay_in_seconds); +void DeleteBlacklistedDuplicates( + scoped_refptr<password_manager::PasswordStore> store, + PrefService* prefs, + int delay_in_seconds); // Report metrics about HTTP to HTTPS migration process. This function cannot be // used on iOS platform because the HSTS query is not supported.
diff --git a/components/password_manager/core/browser/password_manager_util_unittest.cc b/components/password_manager/core/browser/password_manager_util_unittest.cc index 86fbe29..832f064 100644 --- a/components/password_manager/core/browser/password_manager_util_unittest.cc +++ b/components/password_manager/core/browser/password_manager_util_unittest.cc
@@ -20,8 +20,6 @@ #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/test_password_store.h" #include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/prefs/pref_registry_simple.h" -#include "components/prefs/testing_pref_service.h" #include "net/url_request/url_request_test_util.h" #include "services/network/network_context.h" #include "testing/gmock/include/gmock/gmock.h" @@ -34,7 +32,6 @@ constexpr char kTestAndroidRealm[] = "android://hash@com.example.beta.android"; constexpr char kTestFederationURL[] = "https://google.com/"; -constexpr char kTestURL[] = "https://example.com/"; constexpr char kTestUsername[] = "Username"; constexpr char kTestUsername2[] = "Username2"; constexpr char kTestPassword[] = "12345"; @@ -88,42 +85,6 @@ EXPECT_THAT(forms, UnorderedPasswordFormElementsAre(&expected_forms)); } -TEST(PasswordManagerUtil, RemoveBlacklistedDuplicates) { - autofill::PasswordForm blacklisted; - blacklisted.blacklisted_by_user = true; - blacklisted.signon_realm = kTestURL; - blacklisted.origin = GURL(kTestURL); - - autofill::PasswordForm blacklisted_first_example = blacklisted; - blacklisted_first_example.signon_realm += "first_example"; - - autofill::PasswordForm blacklisted_second_example = blacklisted; - blacklisted_second_example.signon_realm += "second_example"; - - base::test::ScopedTaskEnvironment scoped_task_environment; - TestingPrefServiceSimple prefs; - - prefs.registry()->RegisterBooleanPref( - password_manager::prefs::kDuplicatedBlacklistedCredentialsRemoved, false); - - auto password_store = base::MakeRefCounted< - testing::StrictMock<password_manager::MockPasswordStore>>(); - ASSERT_TRUE( - password_store->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); - - EXPECT_CALL(*password_store, FillBlacklistLogins(_)) - .WillOnce(DoAll(AppendForm(blacklisted), - AppendForm(blacklisted_first_example), - AppendForm(blacklisted_second_example), - AppendForm(blacklisted_first_example), Return(true))); - - // Duplicated credentials are to be deleted. - EXPECT_CALL(*password_store, RemoveLogin(blacklisted_first_example)); - DeleteBlacklistedDuplicates(password_store.get(), &prefs, 0); - scoped_task_environment.RunUntilIdle(); - password_store->ShutdownOnUIThread(); -} - #if !defined(OS_IOS) TEST(PasswordManagerUtil, ReportHttpMigrationMetrics) { enum class HttpCredentialType { kNoMatching, kEquivalent, kConflicting };
diff --git a/components/password_manager/core/browser/redundant_credentials_cleaner.cc b/components/password_manager/core/browser/redundant_credentials_cleaner.cc new file mode 100644 index 0000000..9261347b --- /dev/null +++ b/components/password_manager/core/browser/redundant_credentials_cleaner.cc
@@ -0,0 +1,42 @@ +// 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/password_manager/core/browser/redundant_credentials_cleaner.h" + +#include <set> +#include <string> +#include <utility> + +#include "components/autofill/core/common/password_form.h" +#include "components/password_manager/core/browser/password_store.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/prefs/pref_service.h" + +namespace password_manager { + +RedundantCredentialsCleaner::RedundantCredentialsCleaner( + scoped_refptr<PasswordStore> store, + PrefService* prefs) + : store_(std::move(store)), prefs_(prefs) { + store_->GetBlacklistLogins(this); +} + +RedundantCredentialsCleaner::~RedundantCredentialsCleaner() = default; + +void RedundantCredentialsCleaner::OnGetPasswordStoreResults( + std::vector<std::unique_ptr<autofill::PasswordForm>> results) { + std::set<std::string> signon_realms; + for (const auto& form : results) { + DCHECK(form->blacklisted_by_user); + if (!signon_realms.insert(form->signon_realm).second) { + // |results| already contain a form with the same signon_realm. + store_->RemoveLogin(*form); + } + } + prefs_->SetBoolean(prefs::kDuplicatedBlacklistedCredentialsRemoved, + results.size() == signon_realms.size()); + delete this; +} + +} // namespace password_manager \ No newline at end of file
diff --git a/components/password_manager/core/browser/redundant_credentials_cleaner.h b/components/password_manager/core/browser/redundant_credentials_cleaner.h new file mode 100644 index 0000000..7174fbc --- /dev/null +++ b/components/password_manager/core/browser/redundant_credentials_cleaner.h
@@ -0,0 +1,49 @@ +// 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_PASSWORD_MANAGER_CORE_BROWSER_REDUNDANT_CREDENTIALS_CLEANER_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_REDUNDANT_CREDENTIALS_CLEANER_H_ + +#include <memory> +#include <vector> + +#include "base/memory/ref_counted.h" +#include "components/password_manager/core/browser/password_store_consumer.h" + +namespace autofill { +struct PasswordForm; +} // namespace autofill + +class PrefService; + +namespace password_manager { + +class PasswordStore; + +// This class is responsible for deleting blacklisted duplicates. Two +// blacklisted forms are considered equal if they have the same signon_realm. +// Important note: The object will delete itself once the credentials are +// cleared. +// TODO(https://crbug.com/866794): Remove the code once majority of the users +// executed it. +class RedundantCredentialsCleaner : public PasswordStoreConsumer { + public: + RedundantCredentialsCleaner(scoped_refptr<PasswordStore> store, + PrefService* prefs); + ~RedundantCredentialsCleaner() override; + + // PasswordStoreConsumer: + void OnGetPasswordStoreResults( + std::vector<std::unique_ptr<autofill::PasswordForm>> results) override; + + private: + scoped_refptr<PasswordStore> store_; + PrefService* prefs_; + + DISALLOW_COPY_AND_ASSIGN(RedundantCredentialsCleaner); +}; + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_REDUNDANT_CREDENTIALS_CLEANER_H_ \ No newline at end of file
diff --git a/components/password_manager/core/browser/redundant_credentials_cleaner_unittest.cc b/components/password_manager/core/browser/redundant_credentials_cleaner_unittest.cc new file mode 100644 index 0000000..60ddab0d8 --- /dev/null +++ b/components/password_manager/core/browser/redundant_credentials_cleaner_unittest.cc
@@ -0,0 +1,105 @@ +// 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/password_manager/core/browser/redundant_credentials_cleaner.h" + +#include "base/stl_util.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_task_environment.h" +#include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/browser/test_password_store.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace password_manager { + +class RedundantCredentialsCleanerTest : public ::testing::Test { + public: + RedundantCredentialsCleanerTest() = default; + + ~RedundantCredentialsCleanerTest() override = default; + + protected: + TestPasswordStore* store() { return store_.get(); } + + TestingPrefServiceSimple* prefs() { return &prefs_; } + + bool StoreContains(const autofill::PasswordForm& form) { + const auto it = store_->stored_passwords().find(form.signon_realm); + return it != store_->stored_passwords().end() && + base::ContainsValue(it->second, form); + } + + private: + scoped_refptr<TestPasswordStore> store_ = + base::MakeRefCounted<TestPasswordStore>(); + TestingPrefServiceSimple prefs_; + + DISALLOW_COPY_AND_ASSIGN(RedundantCredentialsCleanerTest); +}; + +TEST_F(RedundantCredentialsCleanerTest, RemoveBlacklistedDuplicates) { + base::test::ScopedTaskEnvironment scoped_task_environment; + ASSERT_TRUE( + store()->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + + autofill::PasswordForm blacklisted; + blacklisted.blacklisted_by_user = true; + blacklisted.origin = GURL("https://example.com/"); + blacklisted.signon_realm = "https://example.com/"; + store()->AddLogin(blacklisted); + + autofill::PasswordForm blacklisted_different; + blacklisted_different.blacklisted_by_user = true; + blacklisted_different.origin = GURL("https://host.com/"); + blacklisted_different.signon_realm = "https://host.com/"; + store()->AddLogin(blacklisted_different); + + autofill::PasswordForm blacklisted_duplicated; + blacklisted_duplicated.blacklisted_by_user = true; + blacklisted_duplicated.origin = GURL("https://example.com/duplicated/"); + blacklisted_duplicated.signon_realm = "https://example.com/"; + store()->AddLogin(blacklisted_duplicated); + + autofill::PasswordForm not_blacklisted; + not_blacklisted.blacklisted_by_user = false; + not_blacklisted.origin = GURL("https://google.com/"); + not_blacklisted.signon_realm = "https://google.com/"; + store()->AddLogin(not_blacklisted); + + scoped_task_environment.RunUntilIdle(); + + // Check that all credentials were successfully added. + ASSERT_TRUE(StoreContains(blacklisted)); + ASSERT_TRUE(StoreContains(blacklisted_different)); + ASSERT_TRUE(StoreContains(blacklisted_duplicated)); + ASSERT_TRUE(StoreContains(not_blacklisted)); + + prefs()->registry()->RegisterBooleanPref( + prefs::kDuplicatedBlacklistedCredentialsRemoved, false); + + password_manager_util::DeleteBlacklistedDuplicates(store(), prefs(), 0); + scoped_task_environment.RunUntilIdle(); + + // Check that one of the next two forms was removed. + EXPECT_NE(StoreContains(blacklisted_duplicated), StoreContains(blacklisted)); + + EXPECT_TRUE(StoreContains(blacklisted_different)); + EXPECT_TRUE(StoreContains(not_blacklisted)); + + EXPECT_FALSE( + prefs()->GetBoolean(prefs::kDuplicatedBlacklistedCredentialsRemoved)); + + password_manager_util::DeleteBlacklistedDuplicates(store(), prefs(), 0); + scoped_task_environment.RunUntilIdle(); + EXPECT_TRUE( + prefs()->GetBoolean(prefs::kDuplicatedBlacklistedCredentialsRemoved)); + + store()->ShutdownOnUIThread(); + scoped_task_environment.RunUntilIdle(); +} + +} // namespace password_manager \ No newline at end of file
diff --git a/components/password_manager/core/browser/vote_uploads_test_matchers.h b/components/password_manager/core/browser/vote_uploads_test_matchers.h index 1f5d307..4072642 100644 --- a/components/password_manager/core/browser/vote_uploads_test_matchers.h +++ b/components/password_manager/core/browser/vote_uploads_test_matchers.h
@@ -25,6 +25,19 @@ return false; } +MATCHER_P(SubmissionEventIsSameAs, + expected_submission_event, + std::string(negation ? "submission event isn't " + : "submission event is ") + + std::to_string(static_cast<int>(expected_submission_event))) { + if (expected_submission_event == arg.get_submission_event_for_testing()) + return true; + + *result_listener << "submission event is " + << arg.get_submission_event_for_testing() << " instead"; + return false; +} + MATCHER_P(UploadedAutofillTypesAre, expected_types, "") { size_t fields_matched_type_count = 0; bool conflict_found = false;
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc index 3f8850b..31fed0f 100644 --- a/components/password_manager/core/browser/votes_uploader.cc +++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -137,7 +137,7 @@ // values. Fill username field value with username to allow AutofillManager // to detect username autofill type. form_data.fields[0].value = pending_credentials->username_value; - SendSignInVote(form_data); + SendSignInVote(form_data, submitted_form.submission_event); } if (pending_credentials->times_used == 1 || @@ -227,6 +227,7 @@ // re-uses credentials, a vote about the saved form is sent. If the user saves // credentials, the observed and pending forms are the same. FormStructure form_structure(form_to_upload.form_data); + form_structure.set_submission_event(submitted_form.submission_event); if (!autofill_manager->ShouldUploadForm(form_structure)) { UMA_HISTOGRAM_BOOLEAN("PasswordGeneration.UploadStarted", false); return false; @@ -318,6 +319,7 @@ return; FormStructure form_structure(form_to_upload.form_data); + form_structure.set_submission_event(form_to_upload.submission_event); if (!autofill_manager->ShouldUploadForm(form_structure)) return; @@ -349,11 +351,14 @@ std::string(), true /* observed_submission */); } -void VotesUploader::SendSignInVote(const FormData& form_data) { +void VotesUploader::SendSignInVote( + const FormData& form_data, + const PasswordForm::SubmissionIndicatorEvent& submission_event) { AutofillManager* autofill_manager = client_->GetAutofillManagerForMainFrame(); if (!autofill_manager) return; std::unique_ptr<FormStructure> form_structure(new FormStructure(form_data)); + form_structure->set_submission_event(submission_event); form_structure->set_is_signin_upload(true); DCHECK(form_structure->ShouldBeUploaded()); DCHECK_EQ(2u, form_structure->field_count());
diff --git a/components/password_manager/core/browser/votes_uploader.h b/components/password_manager/core/browser/votes_uploader.h index bdcaf4a..c6aeb63 100644 --- a/components/password_manager/core/browser/votes_uploader.h +++ b/components/password_manager/core/browser/votes_uploader.h
@@ -137,7 +137,9 @@ // Send a vote for sign-in forms with autofill types for a username field. // TODO(https://crbug.com/831123): Remove this method. - void SendSignInVote(const autofill::FormData& form_data); + void SendSignInVote( + const autofill::FormData& form_data, + const autofill::PasswordForm::SubmissionIndicatorEvent& submission_event); // Adds a vote on password generation usage to |form_structure|. void AddGeneratedVote(autofill::FormStructure* form_structure);
diff --git a/components/password_manager/core/browser/votes_uploader_unittest.cc b/components/password_manager/core/browser/votes_uploader_unittest.cc index e49f570..0f52852a 100644 --- a/components/password_manager/core/browser/votes_uploader_unittest.cc +++ b/components/password_manager/core/browser/votes_uploader_unittest.cc
@@ -147,16 +147,21 @@ submitted_form_.new_password_element = new_password_element; form_to_upload_.confirmation_password_element = confirmation_element; submitted_form_.confirmation_password_element = confirmation_element; - ServerFieldTypeSet expexted_field_types = {NEW_PASSWORD, + submitted_form_.submission_event = + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION; + ServerFieldTypeSet expected_field_types = {NEW_PASSWORD, CONFIRMATION_PASSWORD}; FieldTypeMap expected_types = {{new_password_element, NEW_PASSWORD}, {confirmation_element, CONFIRMATION_PASSWORD}}; + PasswordForm::SubmissionIndicatorEvent expected_submission_event = + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION; EXPECT_CALL(*mock_autofill_download_manager_, StartUploadRequest( AllOf(SignatureIsSameAs(form_to_upload_), - UploadedAutofillTypesAre(expected_types)), - false, expexted_field_types, login_form_signature_, true)); + UploadedAutofillTypesAre(expected_types), + SubmissionEventIsSameAs(expected_submission_event)), + false, expected_field_types, login_form_signature_, true)); EXPECT_TRUE(votes_uploader.UploadPasswordVote( form_to_upload_, submitted_form_, NEW_PASSWORD, login_form_signature_)); @@ -170,11 +175,16 @@ submitted_form_.password_element = password_element; form_to_upload_.confirmation_password_element = confirmation_element; submitted_form_.confirmation_password_element = confirmation_element; - ServerFieldTypeSet expexted_field_types = {PASSWORD, CONFIRMATION_PASSWORD}; + submitted_form_.submission_event = + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION; + ServerFieldTypeSet expected_field_types = {PASSWORD, CONFIRMATION_PASSWORD}; + PasswordForm::SubmissionIndicatorEvent expected_submission_event = + PasswordForm::SubmissionIndicatorEvent::HTML_FORM_SUBMISSION; EXPECT_CALL(*mock_autofill_download_manager_, - StartUploadRequest(_, false, expexted_field_types, - login_form_signature_, true)); + StartUploadRequest( + SubmissionEventIsSameAs(expected_submission_event), false, + expected_field_types, login_form_signature_, true)); EXPECT_TRUE(votes_uploader.UploadPasswordVote( form_to_upload_, submitted_form_, PASSWORD, login_form_signature_));
diff --git a/components/password_manager/ios/BUILD.gn b/components/password_manager/ios/BUILD.gn index 5fa91e3..c10662a 100644 --- a/components/password_manager/ios/BUILD.gn +++ b/components/password_manager/ios/BUILD.gn
@@ -36,6 +36,7 @@ ] deps = [ + ":ios", "//base", "//components/autofill/core/common", "//url",
diff --git a/components/password_manager/ios/account_select_fill_data_unittest.cc b/components/password_manager/ios/account_select_fill_data_unittest.cc index b115f4b..80b00318 100644 --- a/components/password_manager/ios/account_select_fill_data_unittest.cc +++ b/components/password_manager/ios/account_select_fill_data_unittest.cc
@@ -33,10 +33,10 @@ public: AccountSelectFillDataTest() { for (size_t i = 0; i < base::size(form_data_); ++i) { - SetPasswordFormFillData(form_data_[i], kUrl, kUrl, kUsernameElements[i], - kUsernames[i], kPasswordElements[i], - kPasswords[i], kAdditionalUsernames[i], - kAdditionalPasswords[i], false); + SetPasswordFormFillData(kUrl, kUrl, kUsernameElements[i], kUsernames[i], + kPasswordElements[i], kPasswords[i], + kAdditionalUsernames[i], kAdditionalPasswords[i], + false, &form_data_[i]); form_data_[i].name = base::ASCIIToUTF16(kFormNames[i]); }
diff --git a/components/password_manager/ios/password_controller_helper.mm b/components/password_manager/ios/password_controller_helper.mm index ad0de29c..8aa0e88d 100644 --- a/components/password_manager/ios/password_controller_helper.mm +++ b/components/password_manager/ios/password_controller_helper.mm
@@ -74,6 +74,15 @@ withUsername:(const base::string16&)username password:(const base::string16&)password completionHandler:(nullable void (^)(BOOL))completionHandler; + +@end + +// Category for test only. +@interface PasswordControllerHelper (Testing) + +// Replaces JsPasswordManager for test. +- (void)setJsPasswordManager:(JsPasswordManager*)jsPasswordManager; + @end @implementation PasswordControllerHelper { @@ -157,7 +166,7 @@ #pragma mark - FormActivityObserver - (void)webState:(web::WebState*)webState - submittedDocumentWithFormNamed:(const std::string&)formName + didSubmitDocumentWithFormNamed:(const std::string&)formName hasUserGesture:(BOOL)hasUserGesture formInMainFrame:(BOOL)formInMainFrame { DCHECK_EQ(_webState, webState); @@ -302,6 +311,12 @@ }]; } +#pragma mark - Private methods for test only + +- (void)setJsPasswordManager:(JsPasswordManager*)jsPasswordManager { + _jsPasswordManager = jsPasswordManager; +} + #pragma mark - Public methods - (void)findPasswordFormsWithCompletionHandler:
diff --git a/components/password_manager/ios/password_controller_helper_unittest.mm b/components/password_manager/ios/password_controller_helper_unittest.mm index d4285fcc..eaa6d895 100644 --- a/components/password_manager/ios/password_controller_helper_unittest.mm +++ b/components/password_manager/ios/password_controller_helper_unittest.mm
@@ -14,19 +14,91 @@ #include "components/password_manager/core/browser/log_manager.h" #include "components/password_manager/core/browser/stub_password_manager_client.h" #include "components/password_manager/core/browser/stub_password_manager_driver.h" +#include "components/password_manager/ios/account_select_fill_data.h" #import "components/password_manager/ios/js_password_manager.h" #import "components/password_manager/ios/password_controller_helper.h" +#include "components/password_manager/ios/test_helpers.h" #include "ios/web/public/test/fakes/test_web_client.h" #import "ios/web/public/test/web_test_with_web_state.h" +#import "ios/web/public/web_state/web_state.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +NS_ASSUME_NONNULL_BEGIN + using autofill::PasswordForm; +using autofill::PasswordFormFillData; using base::test::ios::kWaitForJSCompletionTimeout; using base::test::ios::WaitUntilConditionOrTimeout; +using password_manager::FillData; +using test_helpers::SetPasswordFormFillData; +using test_helpers::SetFillData; + +@interface PasswordControllerHelper (Testing) + +// Provides access to the method below for testing with mocks. +- (void)extractSubmittedPasswordForm:(const std::string&)formName + completionHandler: + (void (^)(BOOL found, + const PasswordForm& form))completionHandler; + +// Provides access to replace |jsPasswordManager| with Mock one for test. +- (void)setJsPasswordManager:(JsPasswordManager*)jsPasswordManager; + +@end + +// Mocks JsPasswordManager to simluate javascript execution failure. +@interface MockJsPasswordManager : JsPasswordManager + +// Designated initializer. +- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver + NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +// For the first |targetFailureCount| calls to +// |fillPasswordForm:withUserName:password:completionHandler:|, skips the +// invocation of the real JavaScript manager, giving the effect that password +// form fill failed. As soon as |_fillPasswordFormFailureCountRemaining| reaches +// zero, stop mocking and let the original JavaScript manager execute. +- (void)setFillPasswordFormTargetFailureCount:(NSUInteger)targetFailureCount; + +@end + +@implementation MockJsPasswordManager { + NSUInteger _fillPasswordFormFailureCountRemaining; +} + +- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver { + return [super initWithReceiver:receiver]; +} + +- (void)setFillPasswordFormTargetFailureCount:(NSUInteger)targetFailureCount { + _fillPasswordFormFailureCountRemaining = targetFailureCount; +} + +- (void)fillPasswordForm:(NSString*)JSONString + withUsername:(NSString*)username + password:(NSString*)password + completionHandler:(void (^)(BOOL))completionHandler { + if (_fillPasswordFormFailureCountRemaining > 0) { + --_fillPasswordFormFailureCountRemaining; + if (completionHandler) { + completionHandler(NO); + } + return; + } + [super fillPasswordForm:JSONString + withUsername:username + password:password + completionHandler:completionHandler]; +} + +@end namespace { // Returns a string containing the JavaScript loaded from a @@ -53,20 +125,6 @@ return GetPageScript(@"test_bundle"); } }; -} - -@interface PasswordControllerHelper (Testing) - -// Provides access to JavaScript Manager for testing with mocks. -@property(readonly) JsPasswordManager* jsPasswordManager; - -// Provides access to the method below for testing with mocks. -- (void)extractSubmittedPasswordForm:(const std::string&)formName - completionHandler: - (void (^)(BOOL found, - const PasswordForm& form))completionHandler; - -@end class PasswordControllerHelperTest : public web::WebTestWithWebState { public: @@ -312,3 +370,369 @@ } } } + +// A script that resets all text fields, including those in iframes. +static NSString* kClearInputFieldsScript = + @"function clearInputFields(win) {" + " var inputs = win.document.getElementsByTagName('input');" + " for (var i = 0; i < inputs.length; i++) {" + " inputs[i].value = '';" + " }" + " var frames = win.frames;" + " for (var i = 0; i < frames.length; i++) {" + " clearInputFields(frames[i]);" + " }" + "}" + "clearInputFields(window);"; + +// A script that runs after autofilling forms. It returns ids and values of all +// non-empty fields, including those in iframes. +static NSString* kInputFieldValueVerificationScript = + @"function findAllInputsInFrame(win, prefix) {" + " var result = '';" + " var inputs = win.document.getElementsByTagName('input');" + " for (var i = 0; i < inputs.length; i++) {" + " var input = inputs[i];" + " if (input.value) {" + " result += prefix + input.id + '=' + input.value + ';';" + " }" + " }" + " var frames = win.frames;" + " for (var i = 0; i < frames.length; i++) {" + " result += findAllInputsInFrame(" + " frames[i], prefix + frames[i].name +'.');" + " }" + " return result;" + "};" + "function findAllInputs(win) {" + " return findAllInputsInFrame(win, '');" + "};" + "findAllInputs(window);"; + +// Test HTML page. It contains several password forms. Tests autofill +// them and verify that the right ones are autofilled. +static NSString* kHtmlWithMultiplePasswordForms = + @"" + // Basic form. + "<form>" + "<input id='un0' type='text' name='u0'>" + "<input id='pw0' type='password' name='p0'>" + "</form>" + // Form with action in the same origin. + "<form action='?query=yes#reference'>" + "<input id='un1' type='text' name='u1'>" + "<input id='pw1' type='password' name='p1'>" + "</form>" + // Form with action in other origin. + "<form action='http://some_other_action'>" + "<input id='un2' type='text' name='u2'>" + "<input id='pw2' type='password' name='p2'>" + "</form>" + // Form with two exactly same password fields. + "<form>" + "<input id='un3' type='text' name='u3'>" + "<input id='pw3' type='password' name='p3'>" + "<input id='pw3' type='password' name='p3'>" + "</form>" + // Forms with same names but different ids (1 of 2). + "<form>" + "<input id='un4' type='text' name='u4'>" + "<input id='pw4' type='password' name='p4'>" + "</form>" + // Forms with same names but different ids (2 of 2). + "<form>" + "<input id='un5' type='text' name='u4'>" + "<input id='pw5' type='password' name='p4'>" + "</form>" + // Basic form, but with quotes in the names and IDs. + "<form name=\"f6'\">" + "<input id=\"un6'\" type='text' name=\"u6'\">" + "<input id=\"pw6'\" type='password' name=\"p6'\">" + "</form>" + // Test forms inside iframes. + "<iframe id='pf' name='pf'></iframe>" + "<iframe id='npf' name='npf'></iframe>" + "<script>" + " var doc = frames['pf'].document.open();" + // Add a form inside iframe. It should also be matched and autofilled. + // Note: The id and name fields are deliberately set as same as those of + // some other fields outside of the frames. The algorithm should be + // able to handle this conflict. + " doc.write('<form><input id=\\'un4\\' type=\\'text\\' name=\\'u4\\'>');" + " doc.write('<input id=\\'pw4\\' type=\\'password\\' name=\\'p4\\'>');" + " doc.write('</form>');" + // Add a non-password form inside iframe. It should not be matched. + // Note: Same as above, the type mismatch of id and name as well as + // the conflict with existing fields are deliberately arranged. + " var doc = frames['npf'].document.open();" + " doc.write('<form><input id=\\'un4\\' type=\\'text\\' name=\\'u4\\'>');" + " doc.write('<input id=\\'pw4\\' type=\\'text\\' name=\\'p4\\'>');" + " doc.write('</form>');" + " doc.close();" + "</script>" + // Fields inside this form don't have name. + "<form>" + "<input id='un9' type='text'>" + "<input id='pw9' type='password'>" + "</form>" + // Fields in this form is attached by form's id. + "<form id='form10'></form>" + "<input id='un10' type='text' form='form10'>" + "<input id='pw10' type='password' form='form10'>"; + +struct FillPasswordFormTestData { + // Origin of the form data. + const std::string origin; + // Action of the form data. + const std::string action; + // Name/id of the user name field in the form data. + const char* username_field; + // Value of the user name field in the form data. + const char* username_value; + // Name/id of the password field in the form data. + const char* password_field; + // Value of the password field in the form data. + const char* password_value; + // True if the match should be found. + const BOOL should_succeed; + // Expected result generated by |kInputFieldValueVerificationScript|. + NSString* expected_result; +}; + +// Tests that filling password forms works correctly. +TEST_F(PasswordControllerHelperTest, FillPasswordForm) { + LoadHtml(kHtmlWithMultiplePasswordForms); + + const std::string base_url = BaseUrl(); + // clang-format off + const FillPasswordFormTestData test_data[] = { + // Basic test: one-to-one match on the first password form. + { + base_url, + base_url, + "un0", + "test_user", + "pw0", + "test_password", + YES, + @"un0=test_user;pw0=test_password;" + }, + // Multiple forms match (including one in iframe): they should all be + // autofilled. + { + base_url, + base_url, + "un4", + "test_user", + "pw4", + "test_password", + YES, + @"un4=test_user;pw4=test_password;pf.un4=test_user;pf.pw4=test_password;" + }, + // The form matches despite a different action: the only difference + // is a query and reference. + { + base_url, + base_url, + "un1", + "test_user", + "pw1", + "test_password", + YES, + @"un1=test_user;pw1=test_password;" + }, + // No match because of a different origin. + { + "http://someotherfakedomain.com", + base_url, + "un0", + "test_user", + "pw0", + "test_password", + NO, + @"" + }, + // No match because of a different action. + { + base_url, + "http://someotherfakedomain.com", + "un0", + "test_user", + "pw0", + "test_password", + NO, + @"" + }, + // No match because some inputs are not in the form. + { + base_url, + base_url, + "un0", + "test_user", + "pw1", + "test_password", + NO, + @"" + }, + // There are inputs with duplicate names in the form, the first of them is + // filled. + { + base_url, + base_url, + "un3", + "test_user", + "pw3", + "test_password", + YES, + @"un3=test_user;pw3=test_password;" + }, + // Basic test, but with quotes in the names and IDs. + { + base_url, + base_url, + "un6'", + "test_user", + "pw6'", + "test_password", + YES, + @"un6'=test_user;pw6'=test_password;" + }, + // Fields don't have name attributes so id attribute is used for fields + // identification. + { + base_url, + base_url, + "un9", + "test_user", + "pw9", + "test_password", + YES, + @"un9=test_user;pw9=test_password;" + }, + // Fields in this form is attached by form's id. + { + base_url, + base_url, + "un10", + "test_user", + "pw10", + "test_password", + YES, + @"un10=test_user;pw10=test_password;" + }, + }; + // clang-format on + + for (const FillPasswordFormTestData& data : test_data) { + ExecuteJavaScript(kClearInputFieldsScript); + + PasswordFormFillData form_data; + SetPasswordFormFillData(data.origin, data.action, data.username_field, + data.username_value, data.password_field, + data.password_value, nullptr, nullptr, false, + &form_data); + + __block BOOL block_was_called = NO; + [helper_ fillPasswordForm:form_data + completionHandler:^(BOOL success) { + block_was_called = YES; + EXPECT_EQ(data.should_succeed, success); + }]; + EXPECT_TRUE( + WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^bool() { + return block_was_called; + })); + + id result = ExecuteJavaScript(kInputFieldValueVerificationScript); + EXPECT_NSEQ(data.expected_result, result); + } +} + +// Tests that filling password forms with fill data works correctly. +TEST_F(PasswordControllerHelperTest, FillPasswordFormWithFillData) { + LoadHtml( + @"<form><input id='u1' type='text' name='un1'>" + "<input id='p1' type='password' name='pw1'></form>"); + const std::string base_url = BaseUrl(); + FillData fill_data; + SetFillData(base_url, base_url, "u1", "john.doe@gmail.com", "p1", + "super!secret", &fill_data); + + __block int call_counter = 0; + [helper_ fillPasswordFormWithFillData:fill_data + completionHandler:^(BOOL complete) { + ++call_counter; + EXPECT_TRUE(complete); + }]; + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return call_counter == 1; + })); + id result = ExecuteJavaScript(kInputFieldValueVerificationScript); + EXPECT_NSEQ(@"u1=john.doe@gmail.com;p1=super!secret;", result); +} + +// Tests that a form is found and the found form is filled in with the given +// username and password. +TEST_F(PasswordControllerHelperTest, FindAndFillOnePasswordForm) { + LoadHtml( + @"<form><input id='u1' type='text' name='un1'>" + "<input id='p1' type='password' name='pw1'></form>"); + __block int call_counter = 0; + __block int success_counter = 0; + [helper_ findAndFillPasswordFormsWithUserName:@"john.doe@gmail.com" + password:@"super!secret" + completionHandler:^(BOOL complete) { + ++call_counter; + if (complete) { + ++success_counter; + } + }]; + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return call_counter == 1; + })); + EXPECT_EQ(1, success_counter); + id result = ExecuteJavaScript(kInputFieldValueVerificationScript); + EXPECT_NSEQ(@"u1=john.doe@gmail.com;p1=super!secret;", result); +} + +// Tests that multiple forms on the same page are found and filled. +// This test includes an mock injected failure on form filling to verify +// that completion handler is called with the proper values. +TEST_F(PasswordControllerHelperTest, FindAndFillMultiplePasswordForms) { + // Fails the first call to fill password form. + MockJsPasswordManager* mockJsPasswordManager = [[MockJsPasswordManager alloc] + initWithReceiver:web_state()->GetJSInjectionReceiver()]; + [mockJsPasswordManager setFillPasswordFormTargetFailureCount:1]; + [helper_ setJsPasswordManager:mockJsPasswordManager]; + LoadHtml( + @"<form><input id='u1' type='text' name='un1'>" + "<input id='p1' type='password' name='pw1'></form>" + "<form><input id='u2' type='text' name='un2'>" + "<input id='p2' type='password' name='pw2'></form>" + "<form><input id='u3' type='text' name='un3'>" + "<input id='p3' type='password' name='pw3'></form>"); + __block int call_counter = 0; + __block int success_counter = 0; + [helper_ findAndFillPasswordFormsWithUserName:@"john.doe@gmail.com" + password:@"super!secret" + completionHandler:^(BOOL complete) { + ++call_counter; + if (complete) { + ++success_counter; + } + }]; + // There should be 3 password forms and only 2 successfully filled forms. + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return call_counter == 3; + })); + EXPECT_EQ(2, success_counter); + id result = ExecuteJavaScript(kInputFieldValueVerificationScript); + EXPECT_NSEQ( + @"u2=john.doe@gmail.com;p2=super!secret;" + "u3=john.doe@gmail.com;p3=super!secret;", + result); +} + +} // namespace + +NS_ASSUME_NONNULL_END
diff --git a/components/password_manager/ios/test_helpers.cc b/components/password_manager/ios/test_helpers.cc index 8e5d48a..406a9e3a 100644 --- a/components/password_manager/ios/test_helpers.cc +++ b/components/password_manager/ios/test_helpers.cc
@@ -6,15 +6,15 @@ #include "base/strings/utf_string_conversions.h" #include "components/autofill/core/common/password_form_fill_data.h" +#include "components/password_manager/ios/account_select_fill_data.h" #include "url/gurl.h" using autofill::PasswordFormFillData; +using password_manager::FillData; namespace test_helpers { -// Populates |form_data| with test values. -void SetPasswordFormFillData(PasswordFormFillData& form_data, - const std::string& origin, +void SetPasswordFormFillData(const std::string& origin, const std::string& action, const char* username_field, const char* username_value, @@ -22,28 +22,45 @@ const char* password_value, const char* additional_username, const char* additional_password, - bool wait_for_username) { - form_data.origin = GURL(origin); - form_data.action = GURL(action); + bool wait_for_username, + PasswordFormFillData* form_data) { + form_data->origin = GURL(origin); + form_data->action = GURL(action); autofill::FormFieldData username; username.name = base::UTF8ToUTF16(username_field); username.id = base::UTF8ToUTF16(username_field); username.value = base::UTF8ToUTF16(username_value); - form_data.username_field = username; + form_data->username_field = username; autofill::FormFieldData password; password.name = base::UTF8ToUTF16(password_field); password.id = base::UTF8ToUTF16(password_field); password.value = base::UTF8ToUTF16(password_value); - form_data.password_field = password; + form_data->password_field = password; if (additional_username) { autofill::PasswordAndRealm additional_password_data; additional_password_data.password = base::UTF8ToUTF16(additional_password); additional_password_data.realm.clear(); - form_data.additional_logins.insert( + form_data->additional_logins.insert( std::pair<base::string16, autofill::PasswordAndRealm>( base::UTF8ToUTF16(additional_username), additional_password_data)); } - form_data.wait_for_username = wait_for_username; + form_data->wait_for_username = wait_for_username; +} + +void SetFillData(const std::string& origin, + const std::string& action, + const char* username_field, + const char* username_value, + const char* password_field, + const char* password_value, + FillData* fill_data) { + DCHECK(fill_data); + fill_data->origin = GURL(origin); + fill_data->action = GURL(action); + fill_data->username_element = base::UTF8ToUTF16(username_field); + fill_data->username_value = base::UTF8ToUTF16(username_value); + fill_data->password_element = base::UTF8ToUTF16(password_field); + fill_data->password_value = base::UTF8ToUTF16(password_value); } } // namespace test_helpers
diff --git a/components/password_manager/ios/test_helpers.h b/components/password_manager/ios/test_helpers.h index ea6c176..d8c0954 100644 --- a/components/password_manager/ios/test_helpers.h +++ b/components/password_manager/ios/test_helpers.h
@@ -9,13 +9,16 @@ namespace autofill { struct PasswordFormFillData; -} +} // namespace autofill + +namespace password_manager { +struct FillData; +} // namespace password_manager namespace test_helpers { // Populates |form_data| with test values. -void SetPasswordFormFillData(autofill::PasswordFormFillData& form_data, - const std::string& origin, +void SetPasswordFormFillData(const std::string& origin, const std::string& action, const char* username_field, const char* username_value, @@ -23,8 +26,18 @@ const char* password_value, const char* additional_username, const char* additional_password, - bool wait_for_username); + bool wait_for_username, + autofill::PasswordFormFillData* form_data); -} // namespace test_helpers +// Populates |fill_data| with test values. +void SetFillData(const std::string& origin, + const std::string& action, + const char* username_field, + const char* username_value, + const char* password_field, + const char* password_value, + password_manager::FillData* fill_data); + +} // namespace test_helpers #endif // COMPONENTS_PASSWORD_MANAGER_IOS_TEST_HELPERS_H_
diff --git a/components/payments/core/autofill_payment_instrument_unittest.cc b/components/payments/core/autofill_payment_instrument_unittest.cc index 9e170be..ea5b0b6 100644 --- a/components/payments/core/autofill_payment_instrument_unittest.cc +++ b/components/payments/core/autofill_payment_instrument_unittest.cc
@@ -70,7 +70,8 @@ &test_url_loader_factory_)), payments_client_(test_shared_loader_factory_, /*pref_service=*/nullptr, - /*identity_manager=*/nullptr), + /*identity_manager=*/nullptr, + /*account_info_getter=*/nullptr), full_card_request_(&autofill_client_, &payments_client_, &personal_data_) {}
diff --git a/components/payments/core/payments_validators.cc b/components/payments/core/payments_validators.cc index 7a63c9b..155e5b4 100644 --- a/components/payments/core/payments_validators.cc +++ b/components/payments/core/payments_validators.cc
@@ -114,40 +114,43 @@ } // static +bool PaymentsValidators::IsValidAddressErrorsFormat( + const mojom::AddressErrorsPtr& errors, + std::string* optional_error_message) { + return errors && + IsValidErrorMsgFormat(errors->address_line, optional_error_message) && + IsValidErrorMsgFormat(errors->city, optional_error_message) && + IsValidErrorMsgFormat(errors->country, optional_error_message) && + IsValidErrorMsgFormat(errors->dependent_locality, + optional_error_message) && + IsValidErrorMsgFormat(errors->language_code, optional_error_message) && + IsValidErrorMsgFormat(errors->organization, optional_error_message) && + IsValidErrorMsgFormat(errors->phone, optional_error_message) && + IsValidErrorMsgFormat(errors->postal_code, optional_error_message) && + IsValidErrorMsgFormat(errors->recipient, optional_error_message) && + IsValidErrorMsgFormat(errors->region, optional_error_message) && + IsValidErrorMsgFormat(errors->region_code, optional_error_message) && + IsValidErrorMsgFormat(errors->sorting_code, optional_error_message); +} + +// static +bool PaymentsValidators::IsValidPayerErrorsFormat( + const mojom::PayerErrorFieldsPtr& errors, + std::string* optional_error_message) { + return errors && + IsValidErrorMsgFormat(errors->email, optional_error_message) && + IsValidErrorMsgFormat(errors->name, optional_error_message) && + IsValidErrorMsgFormat(errors->phone, optional_error_message); +} + +// static bool PaymentsValidators::IsValidPaymentValidationErrorsFormat( const mojom::PaymentValidationErrorsPtr& errors, std::string* optional_error_message) { - if (!errors || !errors->payer || !errors->shipping_address) - return false; - - return IsValidErrorMsgFormat(errors->payer->email, optional_error_message) && - IsValidErrorMsgFormat(errors->payer->email, optional_error_message) && - IsValidErrorMsgFormat(errors->payer->name, optional_error_message) && - IsValidErrorMsgFormat(errors->payer->phone, optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->address_line, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->city, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->country, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->dependent_locality, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->language_code, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->organization, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->phone, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->postal_code, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->recipient, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->region, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->region_code, - optional_error_message) && - IsValidErrorMsgFormat(errors->shipping_address->sorting_code, - optional_error_message); + return errors && + IsValidAddressErrorsFormat(errors->shipping_address, + optional_error_message) && + IsValidPayerErrorsFormat(errors->payer, optional_error_message); } } // namespace payments
diff --git a/components/payments/core/payments_validators.h b/components/payments/core/payments_validators.h index 3259ea3..658b894 100644 --- a/components/payments/core/payments_validators.h +++ b/components/payments/core/payments_validators.h
@@ -47,6 +47,16 @@ // Returns false and optionally populate |optional_error_message| if any // fields of |errors| have too long string (greater than 2048). + static bool IsValidAddressErrorsFormat(const mojom::AddressErrorsPtr& errors, + std::string* optional_error_message); + + // Returns false and optionally populate |optional_error_message| if any + // fields of |errors| have too long string (greater than 2048). + static bool IsValidPayerErrorsFormat(const mojom::PayerErrorFieldsPtr& errors, + std::string* optional_error_message); + + // Returns false and optionally populate |optional_error_message| if any + // fields of |errors| have too long string (greater than 2048). static bool IsValidPaymentValidationErrorsFormat( const mojom::PaymentValidationErrorsPtr& errors, std::string* optional_error_message);
diff --git a/components/payments/core/test_payment_request_delegate.cc b/components/payments/core/test_payment_request_delegate.cc index ccd5d8d..3a00584 100644 --- a/components/payments/core/test_payment_request_delegate.cc +++ b/components/payments/core/test_payment_request_delegate.cc
@@ -5,6 +5,7 @@ #include "components/payments/core/test_payment_request_delegate.h" #include "base/strings/utf_string_conversions.h" +#include "components/autofill/core/browser/personal_data_manager.h" namespace payments { @@ -18,7 +19,8 @@ &test_url_loader_factory_)), payments_client_(test_shared_loader_factory_, /*pref_service=*/nullptr, - /*identity_manager=*/nullptr), + /*identity_manager=*/nullptr, + personal_data_manager), full_card_request_(&autofill_client_, &payments_client_, personal_data_manager) {}
diff --git a/components/pdf/browser/BUILD.gn b/components/pdf/browser/BUILD.gn index f7db28b..10b9c21 100644 --- a/components/pdf/browser/BUILD.gn +++ b/components/pdf/browser/BUILD.gn
@@ -3,8 +3,9 @@ # found in the LICENSE file. import("//build/config/features.gni") +import("//build/config/jumbo.gni") -static_library("browser") { +jumbo_static_library("browser") { sources = [ "pdf_web_contents_helper.cc", "pdf_web_contents_helper.h",
diff --git a/components/pdf/renderer/BUILD.gn b/components/pdf/renderer/BUILD.gn index 44ccce2..fc847d5 100644 --- a/components/pdf/renderer/BUILD.gn +++ b/components/pdf/renderer/BUILD.gn
@@ -3,8 +3,9 @@ # found in the LICENSE file. import("//build/config/features.gni") +import("//build/config/jumbo.gni") -static_library("renderer") { +jumbo_static_library("renderer") { sources = [ "pdf_accessibility_tree.cc", "pdf_accessibility_tree.h",
diff --git a/components/policy/core/browser/url_blacklist_manager.cc b/components/policy/core/browser/url_blacklist_manager.cc index da4c67b5..2af598a 100644 --- a/components/policy/core/browser/url_blacklist_manager.cc +++ b/components/policy/core/browser/url_blacklist_manager.cc
@@ -17,7 +17,6 @@ #include "base/location.h" #include "base/logging.h" #include "base/macros.h" -#include "base/metrics/histogram_macros.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" #include "base/stl_util.h" @@ -449,7 +448,6 @@ // startup. if (pref_service_->HasPrefPath(policy_prefs::kUrlBlacklist) || pref_service_->HasPrefPath(policy_prefs::kUrlWhitelist)) { - SCOPED_UMA_HISTOGRAM_TIMER("URLBlacklistManager.ConstructorBuildTime"); SetBlacklist( BuildBlacklist(pref_service_->GetList(policy_prefs::kUrlBlacklist), pref_service_->GetList(policy_prefs::kUrlWhitelist)));
diff --git a/components/policy/core/common/cloud/cloud_policy_constants.h b/components/policy/core/common/cloud/cloud_policy_constants.h index 934c761..beccce5 100644 --- a/components/policy/core/common/cloud/cloud_policy_constants.h +++ b/components/policy/core/common/cloud/cloud_policy_constants.h
@@ -158,6 +158,13 @@ KIOSK // Single App Kiosk license }; +// Indicate this device's market segment. go/cros-rlz-segments +enum class MarketSegment { + UNKNOWN, // If device is not enrolled or market segment is not specified. + EDUCATION, + ENTERPRISE, +}; + } // namespace policy #endif // COMPONENTS_POLICY_CORE_COMMON_CLOUD_CLOUD_POLICY_CONSTANTS_H_
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index e1b1c96c..ce59bdc 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -1072,6 +1072,12 @@ optional Type saml_login_authentication_type = 1 [default = TYPE_DEFAULT]; } +// Setting that controls whether unaffiliated users are allowed to run Crostini +// (true by default) +message DeviceUnaffiliatedCrostiniAllowedProto { + optional bool device_unaffiliated_crostini_allowed = 1; +} + message ChromeDeviceSettingsProto { reserved 61; optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1; @@ -1162,4 +1168,6 @@ optional DeviceMachinePasswordChangeRateProto device_machine_password_change_rate = 70; optional SamlLoginAuthenticationTypeProto saml_login_authentication_type = 71; + optional DeviceUnaffiliatedCrostiniAllowedProto + device_unaffiliated_crostini_allowed = 72; }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index acd21f12..c7e47e6f 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -11827,16 +11827,15 @@ 'name': 'DeviceHostnameTemplate', 'type': 'string', 'schema': { 'type': 'string' }, - 'supported_on': ['chrome_os:64-'], + 'supported_on': ['chrome_os:65-'], 'device_only': True, - 'future': True, 'features': { 'dynamic_refresh': True, 'per_profile': False, }, 'example_value': 'chromebook-${ASSET_ID}', 'id': 403, - 'caption': '''Device network hostname''', + 'caption': '''Device network hostname template''', 'tags': [], 'desc': '''Determine the hostname of the device used in DHCP requests. @@ -12101,11 +12100,51 @@ If the policy is set to True, the device is allowed to run virtual machines. If the policy is set to False, the device will not be allowed to run virtual machines. + All three policies, VirtualMachinesAllowed, CrostiniAllowed, and DeviceUnaffiliatedCrostiniAllowed need to be true when they apply for Crostini to be allowed to run. When this policy is changed to False, it applies to starting new virtual machines but does not shut down virtual machines which are already running. When this policy is not set on a managed device, the device is not allowed to run virtual machines. Unmanaged devices are allowed to run virtual machines.''', }, { + 'name': 'CrostiniAllowed', + 'type': 'main', + 'schema': { 'type': 'boolean' }, + 'supported_on': ['chrome_os:70-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': False, + 'id': 481, + 'caption': '''User is enabled to run Crostini''', + 'tags': ['system-security'], + 'desc': '''Enable this user to run Crostini. + + If the policy is set to false, Crostini is not enabled for the user. + If set to true or left unset, Crostini is enabled for the user as long as other settings also allow it. + All three policies, VirtualMachinesAllowed, CrostiniAllowed, and DeviceUnaffiliatedCrostiniAllowed need to be true when they apply for Crostini to be allowed to run. + When this policy is changed to false, it applies to starting new Crostini containers but does not shut down containers which are already running.''', + }, + { + 'name': 'DeviceUnaffiliatedCrostiniAllowed', + 'type': 'main', + 'schema': { 'type': 'boolean' }, + 'supported_on': ['chrome_os:70-'], + 'device_only': True, + 'features': { + 'dynamic_refresh': True, + }, + 'example_value': False, + 'id': 482, + 'caption': '''Allow unaffiliated users to use Crostini''', + 'tags': ['system-security'], + 'desc': '''If the policy is set to false, unaffiliated users will not be allowed to use Crostini. + + If the policy is unset or set to true, all users are allowed to use Crostini as long as other settings also allow it. + All three policies, VirtualMachinesAllowed, CrostiniAllowed, and DeviceUnaffiliatedCrostiniAllowed need to be true when they apply for Crostini to be allowed to run. + When this policy is changed to false, it applies to starting new Crostini containers but does not shut down containers which are already running.''', + }, + { 'name': 'SafeBrowsingWhitelistDomains', 'type': 'list', 'schema': { @@ -13372,5 +13411,5 @@ }, 'placeholders': [], 'deleted_policy_ids': [412], - 'highest_id_currently_used': 480 + 'highest_id_currently_used': 482 }
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index 24dda9c..b15fbd5 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -343,6 +343,7 @@ <translation id="199764499252435679">በ<ph name="PRODUCT_NAME" /> ውስጥ የክፍለ-አካላት ዝማኔዎችን ያንቁ</translation> <translation id="2006530844219044261">የኃይል አስተዳደር</translation> <translation id="201557587962247231">የመሣሪያ ሁኔታ ሪፓርት ሰቀላዎች ድግግሞሽ</translation> +<translation id="2017301949684549118">በጸጥታ ለሚጫኑ የድር መተግበሪያዎች የሚሆኑ ዩአርኤሎች።</translation> <translation id="2018836497795982119">የመሣሪያው አስተዳደር አገልግሎት ለተጠቃሚ መመሪያ መረጃ የተጠየቀበትን ክፍለ-ጊዜ በሚሊሰክንዶች ያስቀምጣል። ይህን መመሪያ ማዋቀር ነባሪውን የ3 ሰዓቶች እሴት ይሽራል። ለዚህ መመሪያ የሚሆኑ የሚሠሩ እሴቶች ከ1800000 (30 ደቂቃዎች) እስከ 86400000 (1 ቀን) ባለው ክልል ውስጥ ናቸው። በዚህ ክልል ውስጥ ያልሆኑ ማንኛቸውም እሴቶች ወደ የሚመለከተው ድንበር እንዲጠጋጉ ይደረጋሉ። የመሣሪያ ስርዓቱ የመመሪያ ማሳወቂያዎችን የሚደግፍ ከሆነ፣ የማደሻ መዘግየት ጊዜው ወደ 24 ሰዓታት ይዋቀራል፤ ይህም የሆነበት ምክንያት የመመሪያ ማሳወቂያዎች መመሪያ በተለወጠ ቁጥር በራስ-ሰር ማደስን እንደሚያስገድዱ ስለሚጠበቅ ነው። @@ -650,6 +651,11 @@ የGoogle ፍለጋ ዩአርኤል እንደሚከተለው ሊገለጽ ይችላል፦ <ph name="GOOGLE_SEARCH_URL" /> ይህ አማራጭ መዋቀር ያለበት የ«DefaultSearchProviderEnabled» መምሪያ ሲነቃ ነው፣ እና በዚህ ሁኔታ ላይ ብቻ ነው የሚከበረው።</translation> +<translation id="2659019163577049044">ይህ ቅንብር ከነቃ ተጠቃሚዎች የእነሱን መሣሪያዎች የኤስኤምኤስ መልእክቶችን በእነሱ ስልኮች እና Chromebooks ላይ እንዲያሳምሩ አድርገው እንዲያቀናብሯቸው ይፈቀድላቸዋል። ይህ መመሪያ ከተፈቀደ ተጠቃሚዎች የቅንብር ፍሰት በማጠናቀቅ በግልጽ ወደዚህ ባህሪ መርጠው መግባት አለባቸው። አንዴ የቅንብር ፍሰቱ ከተጠናቀቀ ተጠቃሚዎች በእነሱ Chromebooks ላይ የኤስኤምኤስ መልዕክቶችን መላክ እና መቀበል ይችላሉ። + + ይህ ቅንብር ከተሰናከለ ተጠቃሚዎች የኤስኤምኤስ ማሳመርን እንዲያቀናብሩ አይፈቀድላቸውም። + + ይህ መመሪያ እንዳልተዋቀረ ከተተወ ነባሪው በድርጅት-ለሚተዳደሩ ተጠቃሚዎች አይፈቀድም፣ እና ለማይተዳደሩ ተጠቃሚዎች ይፈቀዳል።</translation> <translation id="2660846099862559570">በጭራሽ ተኪ አይጠቀሙ</translation> <translation id="267596348720209223">በፍለጋ አቅራቢው የሚደገፉ የቁምፊ ኮድ ግቤቶችን ይገልጻል። የኮድ ግቤቶች እንደ UTF-8፣ GB2312 እና ISO-8859-1 ያሉ የኮድ ገጽ ስሞች ናቸው። በቀረቡት ቅደም ተከተል ነው የሚሞከሩት። @@ -720,7 +726,6 @@ ይህን ቅንብር ካሰናከሉት ወይም እሴት ካላዋቀሩ የሕትመት ቅድመ-እይታ በጣም በቅርብ ጊዜ ጥቅም ላይ የዋለውን ማተሚያ እንደ ነባሪ የመድረሻ ምርጫ አድርጎ ይጠቀማል። ይህን ቅንብር ካዋቀሩት የሕትመት ቅድመ-እይታ የስርዓተ-ክወና ሥርዓቱን ነባሪ ማተሚያ እንደ ነባሪው የመድረሻ ምርጫ አድርጎ ይጠቀማል።</translation> -<translation id="2867699958489427143">የሥርዓተ ክወናው ስሪቱ ከዒላማው ይበልጥ አዲስ ከሆነ ወደ ዒላማው ይቀልብሱ። በሂደቱ ላይ ሙሉ ፓወርዋሽ ያከናውኑ።</translation> <translation id="2872961005593481000">ዝጋ</translation> <translation id="2874209944580848064">የAndroid መተግበሪያዎችን ለሚደግፉ የ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች ማስታወሻ፦</translation> <translation id="2877225735001246144">የKerberos ማረጋገጫ ሲደራደሩ CNAMEን ፍለጋን ያሰናክሉ</translation> @@ -963,7 +968,6 @@ <translation id="3711895659073496551">አንጠልጥል</translation> <translation id="3715569262675717862">በደንበኛ እውቅና ማረጋገጫዎች ላይ የተመሠረተ ማረጋገጥ</translation> <translation id="3736879847913515635">በተጠቃሚ አስተዳዳሪ ውስጥ ሰው ማከልን ያንቁ</translation> -<translation id="3737544779868348650">የመሣሪያ አውታረ መረብ የአስተናጋጅ ስም</translation> <translation id="3746590506846867985"> ይህ መመሪያ በመግቢያ ገጹ ላይ የሚተገበር ነው። እንዲሁም እባክዎ በተጠቃሚ ክፍለ-ጊዜው ላይ የሚተገበረውን የ<ph name="ISOLATE_ORIGINS_POLICY_NAME" /> መመሪያ ይመልከቱ። ሁለቱም መመሪያዎች ወደ ተመሳሳዩ እሴት እንዲዋቀሩ ይመከራል። እሴቶቹ የማይዛመዱ ከሆኑ ወደ የተጠቃም ክፍለ-ጊዜ ሲገቡ በተጠቃሚ መመሪያው የተገለጸው እሴት እየተተገበረ ሳለ መዘግየት ሊከሰት ይችላል። መመሪያው ከነቃ በኮማ በተለየ ዝርዝር ውስጥ ያለ እያንዳንዱ የተሰየመ ምንጭ በራሱ ሂደት ውስጥ ያሂዳል። ይህ እንዲሁም በንዑስ ጎራዎች የተሰየሙትን ምንጮች ያገልላል፤ ለምሳሌ፣ https://example.com/ ን መግለጽ እንዲሁም https://foo.example.com/ እንደ የ https://example.com/ ጣቢያው አካል እንዲገለል ያደርገዋል። @@ -1078,6 +1082,7 @@ እያንዳንዱ የዝርዝር ግቤት የቅጥያ መታወቂያውን በ«extension-id» መስክ ውስጥ እና የማዘመኛ ዩአርኤል በ«update-url» መስክ ውስጥ ማካተት ያለበት መዝገበ-ቃላት ሊኖረው ይገባል።</translation> <translation id="3874773863217952418">ለመፈለግ መታ ያድርጉን ያንቁ</translation> <translation id="3877517141460819966">የተዋሃደ የሁለተኛ ደረጃ ማረጋገጥ ሁነታ</translation> +<translation id="3879208481373875102">በግዳጅ የተጫኑ የድር መተግበሪያዎች ዝርዝርን ያዋቅሩ</translation> <translation id="388237772682176890">የSPDY/3.1 ድጋፍ ስለተወገደ ይህ መመሪያ በM53 ውስጥ ተቋርጧል እና በM54 ውስጥ ተወግዷል። በ<ph name="PRODUCT_NAME" /> ውስጥ የSPDY ፕሮቶኮል መጠቀምን ያሰናክላል። @@ -1321,6 +1326,10 @@ ሊሆኑ የሚችሉ የዚህ መመሪያ ቅንብሮች እና መዋቅር ሙሉ መግለጫ ለማግኘት እባክዎ https://www.chromium.org/administrators/policy-list-3/extension-settings-fullን ይጎብኙ </translation> <translation id="4554651132977135445">የተጠቃሚ መመሪያ ድግግሞሽ ተመላሽ ማስኬጃ ሁነታ</translation> +<translation id="4554841826517980623">ይህ መመሪያ <ph name="PRODUCT_NAME" /> በአውታረ መረብ ላይ ማጋራቶች ባህሪን ለማግኘት <ph name="NETBIOS_PROTOCOL" />ን አውታረ መረብ ፋይል ማጋራቶች ጥቅም ላይ ይውሉ እንደሆነ ይቆጣጠራል። + ይህ መመሪያ ወደ እውነት ሲዋቀር የማጋራት ግኝት በአውታረ መረቡ ላይ ማጋራቶችን ለማግኘት የ<ph name="NETBIOS_PROTOCOL" /> ፕሮቶኮልን ይጠቀማል። + ይህ መመሪያ ወደ ሐሰት ሲዋቀር የማጋራት ግኝት ማጋራቶችን ለማግኘት የ<ph name="NETBIOS_PROTOCOL" /> ፕሮቶኮልን አይጠቀምም። + ይህ መመሪያ ሳይዋቀር ከተተወ ነባሪው በድርጅት ለሚተዳደሩ ተጠቃሚዎች ይሰናከላል እና ለማይተዳደሩ ተጠቃሚዎች ይነቃል።</translation> <translation id="4555850956567117258">ለተጠቃሚው በርቀት ማስረገጥን ያንቁ</translation> <translation id="4557134566541205630">የነባሪ የፍለጋ አቅራቢ አዲስ ትር ገጽ ዩአርኤል</translation> <translation id="4567137030726189378">የገንቢ መሣሪያዎችን አጠቃቀም ፍቀድ</translation> @@ -1744,6 +1753,7 @@ ይህ መመሪያ እንዳልተዋቀረ ከተተወ የመግቢያ ገጹ መጀመሪያ ላይ ሲታይ የሚነገር ግብረመልስ ይሰናከላል። ተጠቃሚዎች በማንኛውም ጊዜ የሚነገር ግብረመልስን ሊያነቁ ወይም ሊያሰናክሉ ይችላሉ፣ እና በመግቢያ ገጹ ላይ ያለው ሁኔታው በተጠቃሚዎች መካከል ቋሚ ነው።</translation> <translation id="5868414965372171132">የተጠቃሚ-ደረጃ የአውታረ መረብ ውቅር</translation> +<translation id="5879014913445067283">የአውታረ መረብ ፋይል ማጋራት ግኝት በ<ph name="NETBIOS_NAME" /> በኩል ይቆጣጠራል</translation> <translation id="5883015257301027298">ነባሪ የኩኪዎች ቅንብር</translation> <translation id="5887414688706570295">በሩቅ መዳረሻ አስተናጋጆች ስራ ላይ የሚውል የTalkGadget ቅድመ-ቅጥያውን የሚያዋቅርና ተጠቃሚዎች እንዳይቀይሩት የሚያግድ ነው። @@ -2197,6 +2207,17 @@ ካልተዋቀረ ተጠቃሚው ይመጣለት እንደሆነ ይጠየቃል ወይም ማስመጣት በራስ-ሰር ሊከሰት ይችላል።</translation> <translation id="7063895219334505671">በእነዚህ ጣቢያዎች ላይ ብቅ-ባዮችን ፍቀድ</translation> +<translation id="706568410943497889"> + መመሪያው ወደ እውነት ከተዋቀረ <ph name="PRODUCT_NAME" /> የWebRTC ክስተት ምዝግብ ማስታወሻዎችን ከGoogle አገልግሎቶች (ለምሳሌ፦ Google Meet) እንዲሰበስብና እነዚህን ምዝግብ ማስታወሻዎች ወደ Google እንዲሰቅል ይፈቀድለታል። + + መመሪያው ወደ ሐሰት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ <ph name="PRODUCT_NAME" /> እንዲህ ያሉ ምዝግብ ማስታወሻዎችን መሰብሰብም ሆነ መስቀል አይችልም። + + እነዚህ ምዝግብ ማስታወሻዎች እንደ የተላኩ እና የተቀበሏቸው የRTP ጥቅሎች ጊዜ እና መጠን፣ በአውታረ መረቡ ላይ ያለ የጭንቅንቅ ግብረመልስ እና የኦዲዮና ቪዲዮ ክፈፎች ጊዜ እና ጥራት ዲበ ውሂብ ያለ በበChrome ውስጥ በሚደረጉ የኦዲዮና ቪዲዮ ጥሪዎች ጊዜ የሚኖሩ ችግሮችን ለማረም የሚያግዝ መረጃን ይይዛሉ። እነዚህ ምዝግብ ማስታወሻዎች ከጥሪው የመጡ የኦዲዮ ወይም ቪዲዮ ይዘቶች አይይዙም። + + ይህ የChrome የውሂብ መሰብሰብ እንደ Google Hangouts ወይም Google Meet ባሉ የGoogle የድር አገልግሎቶች ላይ ብቻ ነው ሊቀሰቀስ የሚችለው። + + Google እነዚህን የምዝግብ ማስታወሻዎች በክፍለ-ጊዜ መታወቂያ አማካኝነት በGoogle አገልግሎቱ ራሱ ከተሰበሰቡ ሌሎች ምዝግብ ማስታወሻዎች ጋር ሊዛመዱ ይችላሉ፤ ይህ ማረምን ለማቅለል የታሰበ ነው። + </translation> <translation id="706669471845501145">ጣቢያዎች የዴስክቶፕ ማሳወቂያዎችን እንዲያሳዩ ፍቀድ</translation> <translation id="7072208053150563108">የማሽን ይለፍ ቃል ለውጥ ፍጥነት</translation> <translation id="7074513465313721551">የጥንቃቄ አሰሳ የሚያምናቸውን የጎራዎች ዝርዝር ያዋቅሩ። ይህ ማለት፦ @@ -2330,6 +2351,9 @@ <translation id="7336878834592315572">ክፍለ ጊዜው እስከቆየበት ያህል ጊዜ ድረስ ኩኪዎችን አቆይ</translation> <translation id="7340034977315324840">የመሣሪያ እንቅስቃሴዎች ብዛት ሪፖርት ያድርጉ</translation> <translation id="7343497214039883642">የድርጅት አታሚ ውቅረት ፋይል ለመሣሪያዎች</translation> +<translation id="7349338075015720646">ያለተጠቃሚ መስተጋብር ያለተጠቃሚው ተሳትፎ በጸጥታ የተጫኑ እና ሊራገፉ የማይችሉ ወይም በተጠቃሚው ሊሰናከሉ የማይችሉ የድር ጣቢያዎችን ዝርዝር ይጠቅሳል። + + እያንዳንዱ የመመሪያው የዝርዝር ንጥል ሁለት አባላት ያሉት አንድ ነገር ነው፦ «url» እና «launch_container»። «url» የሚጫነው የድር መተግበሪያ ዩአርኤል መሆን ያለበት ሲሆን ፣የድር መተግበሪያ አንዴ ከተጫነ በኋላ እንዴት እንደሚከፈት ለመጠቆም «launch_container» ወይም «መስኮት» አሊያም «ትር» መሆን አለበት። «launch_container» ከተተወ Chrome መተግበሪያውን እንደ ገስጋሽ የድር መተግበሪያ እንደሆነ አድርጎ ከቆጠረው በመስኮት ውስጥ ይጀመራል፣ ካልሆነ በትር ውስጥ ይጀምራል።</translation> <translation id="7367028210010532881">ተጠቃሚዎች ተንኮል-አዘል ሊሆኑ ይችላሉ ተብለው ወደተጠቆሙ ጣቢያዎች ሲሄዱ የጥንቃቄ አሰሳ አገልግሎት የማስጠንቀቂያ ገጽ ያሳያል። ይህን ቅንብር ማንቃት ተጠቃሚዎች በማንኛውም መልኩ ከማስጠንቀቂያው ገጹ ወደ ተንኮል-አዘሉ ጣቢያ እንዳይቀጥሉ ያግዳቸዋል። ይህ ቅንብር ከተሰናከለ ወይም ካልተዋቀረ ተጠቃሚዎች ማስጠንቀቂያውን ካዩ በኋላ ወደ ተጠቆመው ጣቢያ ለመቀጠል መምረጥ ይችላሉ። @@ -2793,6 +2817,7 @@ እዚህ «ስሪት» እንደ «61.0.3163.120» ያለ ትክክለኛ ስሪት ወይም እንደ «61.0» ያለ የስሪት ቅድመ-ቅጥያ ሊሆን ይችላል። </translation> <translation id="8544375438507658205">የ<ph name="PRODUCT_FRAME_NAME" /> ነባሪ ኤች ቲ ኤም ኤል አሳዪ</translation> +<translation id="8544465954173828789">የኤስኤምኤስ መልዕክቶች ከስልክ ወደ Chromebook እንዲሳመሩ ይፍቀዱ።</translation> <translation id="8549772397068118889">ከይዘት ጥቅሎች ውጪ የሆኑ ጣቢያዎችን በሚጎበኙበት ጊዜ ያስጠንቅቅ</translation> <translation id="8566842294717252664">የድር መደብሩን ከአዲስ ትር ገጹ እና ከመተግበሪያ ማስጀመሪያው ይደብቁ</translation> <translation id="8586528890725660268">ተጠቃሚው ሊጠቀምባቸው የማይችላቸው አታሚዎችን ይገልጻል። @@ -2837,6 +2862,11 @@ ይህ መመሪያ እንዳልተዋቀረ ከተተወ ተጠቃሚው የተጠበቀው የይለፍ ቃላቸውን በማስገሪያ ጣቢያ ላይ ሲጠቀሙ የGoogle የይለፍ ቃል ጥበቃ ማስጠንቀቂያው ይቀሰቀሳል፣ ነገር ግን ተጠቃሚው ይህን ቅንብር መቀየር ይችላል።</translation> <translation id="8672321184841719703">ራስ-አዘምን ስሪቱን አነጣጥር</translation> <translation id="867410340948518937">U2F (ሁለገብ ሁለተኛ ደረጃ)</translation> +<translation id="8682611302223077049">የትኛዎቹ ተጠቃሚዎች <ph name="PRODUCT_NAME" /> እንደገና መጀመር እንዳለበት ወይም አንድ የ<ph name="PRODUCT_OS_NAME" /> መሣሪያ በመጠባበቅ ላይ ያለ ዝማኔን ለመተግበር እንደገና መጀመር ይኖርበት እንደሆነ ማሳወኢያ የሚያገኙበት ጊዜን በሚሊሰከንዶች እንዲያቀናብሩ ያስችልዎታል። + + በዚህ ጊዜ ላይ ተጠቃሚው የዝማኔ አስፈላጊነት በተደጋጋሚ እንዲያውቁት ይደረጋሉ። ለ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች፣ ማላቂያ እንዳለ ሲገኝ በሥርዓት ትሪው ውስጥ የዳግም ማስጀመሪያ ማሳወቂያ ብቅ ይላል። ለ<ph name="PRODUCT_NAME" /> አሳሾች፣ አንዴ የማሳወቂያው ክፍለ-ጊዜ አንድ ሦስተኛ ያህሉ እንዳለፈ ዳግም ማስጀመር እንደሚያስፈልግ ለመጠቆም የመተግበሪያው ምናሌ ይለውጣል። አንዴ የማሳወቂያው ክፍለ-ጊዜ ሁለት ሦስተኛው ካለፈ በኋላና እንዲሁም እንደገና ሙሉው ክፍለ-ጊዜ ካለፈ በኋላ ይህ ምናሌ ቀለም ይለውጣል። በ<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> መመሪያ የነቁ ተጨማሪ ማሳወቂያዎች ይህንኑ ተመሳሳይ የጊዜ መርሐግብር ይከተላሉ። + + ካልተዋቀረ ነባሪው ክፍለ-ጊዜ 345600000 ሚሊሰከንዶች (አራት ቀናት) ለ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች እና ሚሊሰከንዶች (አንድ ሳምንት) ለ<ph name="PRODUCT_NAME" /> ስራ ላይ ይውላሉ።</translation> <translation id="8685024486845674965">የይለፍ ቃል ጥበቃ ማስጠንቀቂያ በይለፍ ቃል ዳግም መጠቀም ይቀሰቀሳል</translation> <translation id="8693243869659262736">አብሮ የተሰራው የዲ ኤን ኤስ ደንበኛን ተጠቀም</translation> <translation id="8704831857353097849">የተሰናከሉ ተሰኪዎች ዝርዝር</translation> @@ -2881,6 +2911,7 @@ የመመጠን መለኪያው 100% ወይም ከዚያ በላይ መሆን አለበት። በማቅረቢያ ሁነታ ላይ ያለውን የማያ ገጽ መደብዘዝ መዘግየቱን ከመደበኛው የማያ ገጽ መደብዘዝ መዘግየት ያጠረ የሚያደርጉ ዋጋዎች አይፈቀዱም።</translation> <translation id="8798099450830957504">እንደወረደ</translation> +<translation id="8801680448782904838">አንድ አሳሽ ዳግም መጀመር ወይም መሣሪያ ዳግም መነሳት እንደሚመከር ወይም እንደሚያስፈልግ ለተጠቃሚ ያሳውቁ</translation> <translation id="8818173863808665831">የመሣሪያውን ምድራዊ አካባቢ ሪፖርት ያድርጉ። መምሪያው ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ አካባቢ ሪፖርት አይደረግም።</translation> @@ -3030,6 +3061,11 @@ ይህ መመሪያ ወደ እውነት ከተዋቀረ ተጠቃሚ መሣሪያውን ሲያጠፋው <ph name="PRODUCT_OS_NAME" /> ዳግም ማስነሳት ይቀሰቅሳል። <ph name="PRODUCT_OS_NAME" /> ሁሉንም በበይነገጹ ውስጥ ያሉ የመዝጊያ አዝራሮች ክስተቶችን በዳግም ማስነሻ አዝራሮች ይተካቸዋል። ተጠቃሚው የኃይል አዝራሩን በመጠቀም መሣሪያውን ካጠፋው በራስ-ሰር ዳግም አይነሳም፣ መመሪያው ቢነቃም እንኳ።</translation> <translation id="9152473318295429890">የተዛማጅ የድር ገጾችን የነገር አገባብ የጠበቁ ጥቆማ ሐሳቦችን ያንቁ</translation> <translation id="9158929520101169054">በአሳሹ ውስጥ በርካታ በመለያ መግባትን ይፍቀዱ</translation> +<translation id="9159126470527871268">በመጠባበቀቅ ላይ ያለ ዝማኔን ለመተግበር <ph name="PRODUCT_NAME" /> ዳግም መጀመር እንዳለበት ወይም <ph name="PRODUCT_OS_NAME" /> ዳግም መነሳት እንዳለበት ለተጠቃሚዎች ያሳውቁ። + + ይህ የመመሪያ ቅንብር የአሳሽ ዳግም መጀመር ወይም የመሣሪያ ዳግም መነሳት የሚመከር ወይም የሚያስፈልግ መሆኑን ለተጠቃሚው የሚያሳውቅ ማሳወቂያዎችን ያነቃል። ካልተዋቀረ <ph name="PRODUCT_NAME" /> በምናሌው ላይ በሚደረጉ አነስተኛ ለውጦች አማካኝነት ዳግም መጀመር የሚያስፈልግ መሆኑን ለተጠቃሚው የሚያመለክት ሲሆን፣ <ph name="PRODUCT_OS_NAME" /> እንዲህ ያለውን ነገር በስርዓት ትሪው ላይ ባለ ማሳወቂያ በኩል ያመለክታል። ወደ «የሚመከር» ከተዋቀረ ዳግም መጀመር የሚመከር መሆኑን የሚያሳይ ተደጋጋሚ ማስጠንቀቂያ ለተጠቃሚው እንዲታይ ይደረጋል። ተጠቃሚው ዳግም ማስጀመሩን ለበኋላ ለማቆየት ይህን ማስጠንቀቂያ ማሰናበት ይችላል። ወደ «የሚያስፈልግ» ከተዋቀረ የማሳወቂያ ጊዜው ካለፈ በኋላ አሳሹ በግዴታ ዳግም የሚጀመር መሆኑን ለተጠቃሚው የሚያመለክት ተደጋጋሚ ማስጠንቀቂያ ይታያል። ነባሪው ክፍለ-ጊዜ ለ<ph name="PRODUCT_NAME" /> ሰባት ቀናት እና ለ<ph name="PRODUCT_OS_NAME" /> አራት ቀናት ሲሆን፣ በ<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> መመሪያ ቅንብር በኩል ሊዋቀር ይችላል። + + ዳግም መጀመሩ/ዳግም መነሳቱ ተከትሎ የተጠቃሚው ክፍለ-ጊዜ ወደነበረበት ይመለሳል።</translation> <translation id="9165792353046089850">ድር ጣቢያዎች የተገናኙ የዩኤስቢ መሣሪያዎች መዳረሻ ይኖራቸው ወይም አይኖራቸው እንደሆነ እንዲያዋቅሩ ያስችልዎታል። መዳረሻ ሙሉ በሙሉ ሊታገድ ወይም ድር ጣቢያ የተገናኙ ዩኤስቢ መሣሪያዎች መዳረሻ ለማግኘት በፈለገ ቁጥር ተጠቃሚው ሊጠየቅ ይችላል። ይህ መመሪያ የ«'WebUsbAskForUrls» እና «WebUsbBlockedForUrls» መመሪያዎችን በመጠቀም ለተወሰኑ የዩአርኤል ስርዓተ-ጥለቶች ሊሻር ይችላል።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index 6d21895c..a9da805 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -349,6 +349,7 @@ <translation id="199764499252435679">تفعيل تحديثات المكوِّنات في <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">إدارة الطاقة</translation> <translation id="201557587962247231">فترة تكرار تحميلات الإبلاغ عن حالة الجهاز</translation> +<translation id="2017301949684549118">عناوين URL لتطبيقات الويب المراد تثبيتها تلقائيًا.</translation> <translation id="2018836497795982119">تحدد الفترة بالمللي ثانية والتي تطلب بعدها خدمة إدارة الجهاز معلومات بشأن سياسة المستخدم. يؤدي تعيين هذه السياسة إلى إلغاء القيمة التلقائية التي تبلغ 3 ساعات. تتراوح القيم الصالحة لهذه السياسة في النطاق من 1800000 (30 دقيقة) إلى 86400000 (يوم واحد). وسيتم تثبيت أي قيمة ليست داخل هذا النطاق على الحد النسبي. وفي حالة دعم النظام الأساسي لإشعارات السياسة، سيتم تعيين تأخير التحديث إلى 24 ساعة لأنه من المتوقع أن إشعارات السياسة ستفرض تحديثًا تلقائيًا في الوقت الذي يتم فيه تغيير السياسة. @@ -644,6 +645,11 @@ يمكن تعيين عنوان URL لبحث Google على النحو: <ph name="GOOGLE_SEARCH_URL" />. يجب تعيين هذا الخيار في حالة تفعيل سياسة 'DefaultSearchProviderEnabled' ويتم الالتزام به فقط إذا كانت هذه هي الحالة.</translation> +<translation id="2659019163577049044">في حال تفعيل هذا الإعداد، سيُسمح للمستخدمين بإعداد أجهزتهم لمزامنة الرسائل القصيرة (SMS) بين هواتفهم وأجهزة Chromebook. وتجدر الإشارة إلى أنه إذا تم السماح بهذه السياسة، على المستخدمين تفعيل هذه الميزة بشكلٍ صريح عن طريق إكمال خطوات عملية الإعداد. وبعد اكتمال خطوات عملية الإعداد، سيتمكّن المستخدمون من إرسال رسائل SMS وتلقيها على أجهزة Chromebook. + + إذا تم إلغاء تفعيل هذا الإعداد، لن يتمكّن المستخدمون من إعداد مزامنة رسائل SMS. + + إذا لم يتم وضع هذه السياسة، لن يُسمح بالسياسة التلقائية للمستخدمين الخاضعين للإدارة، ولكن سيُسمح بها لغير الخاضعين للإدارة.</translation> <translation id="2660846099862559570">عدم استخدام خادم وكيل مطلقًا</translation> <translation id="267596348720209223">لتحديد ترميزات الحروف المعتمدة من قِبل مزود البحث. والترميزات هي أسماء صفحات الرموز، مثل UTF-8 وGB2312 وISO-8859-1. وتتم تجربتها بالترتيب المذكور. هذه السياسة اختيارية. وإذا لم يتم تعيينها، فسيتم استخدام الترميز التلقائي وهو UTF-8. لا يتم الالتزام بهذه السياسة إلا إذا تم تفعيل السياسة 'DefaultSearchProviderEnabled'.</translation> <translation id="268577405881275241">تفعيل ميزة ضغط البيانات في الخادم الوكيل</translation> @@ -706,7 +712,6 @@ إذا عطَّلتَ هذا الإعداد أو لم تعيّن قيمة، فستستخدم معاينة الطباعة آخر طابعة مستخدمة باعتبارها خيار الوجهة التلقائي. إذا مكَّنتَ هذا الإعداد، فستستخدم معاينة الطباعة الطابعة التلقائية لنظام التشغيل باعتبارها خيار الوجهة التلقائي.</translation> -<translation id="2867699958489427143">يمكنك العودة إلى الإصدار المستهدف والاستمرار في استخدامه إذا كان إصدار نظام التشغيل أحدث من الإصدار المستهدف. ويمكنك تنفيذ عملية Powerwash بالكامل في هذه الأثناء.</translation> <translation id="2872961005593481000">إيقاف التشغيل</translation> <translation id="2874209944580848064">ملاحظة لأجهزة <ph name="PRODUCT_OS_NAME" /> التي تدعم تطبيقات Android:</translation> <translation id="2877225735001246144">إيقاف بحث CNAME عند التفاوض مع مصادقة Kerberos</translation> @@ -937,7 +942,6 @@ <translation id="3711895659073496551">تعليق</translation> <translation id="3715569262675717862">المصادقة بالاستناد إلى شهادات العميل</translation> <translation id="3736879847913515635">تفعيل إضافة شخص في مدير المستخدمين</translation> -<translation id="3737544779868348650">اسم مضيف شبكة الجهاز</translation> <translation id="3746590506846867985"> تنطبق هذه السياسة على شاشة تسجيل الدخول. يُرجى الاطِّلاع أيضًا على سياسة <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> التي تنطبق على جلسة المستخدم. يُوصى بضبط كلتا السياستين على القيمة نفسها. وفي حال عدم تطابق القيم، قد يحدث تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدَّدة في سياسة المستخدم. في حال تفعيل هذه السياسة، سيتم تشغيل كل أصل من الأصول المسماة الواردة في @@ -1052,6 +1056,7 @@ يحتوي كل إدخال في القائمة على قاموس يجب أن يشتمل على معرف الإضافة في الحقل 'extension-id' وعنوان URL الخاص بتحديثها في الحقل 'update-url'.</translation> <translation id="3874773863217952418">تفعيل ميزة "البحث بالنقر"</translation> <translation id="3877517141460819966">وضع عامل المصادقة الثاني المُدمج</translation> +<translation id="3879208481373875102">إعداد قائمة تطبيقات الويب المثبَّتة من المؤسّسة</translation> <translation id="388237772682176890">تم إيقاف هذه السياسة في M53 وإزالتها في M54؛ نظرًا لأنه تمت إزالة دعم SPDY/3.1. لإيقاف استخدام بروتوكول SPDY في <ph name="PRODUCT_NAME" />. @@ -1283,6 +1288,10 @@ للاطلاع على الوصف الكامل للإعدادات المُحتملة وبنية هذه السياسة، يُرجى زيارة https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">وضع معالجة الاسترجاع لسياسة المستخدم</translation> +<translation id="4554841826517980623">تتحكّم هذه السياسة في ما إذا كانت ميزة "خوادم مشاركة الملفات على الشبكة" لـ <ph name="PRODUCT_NAME" /> يجب أن تستخدم <ph name="NETBIOS_PROTOCOL" /> لاكتشاف عمليات المشاركة على الشبكة. + عند ضبط هذه السياسة على True، سيستخدم إعداد "اكتشاف المشاركة" بروتوكول <ph name="NETBIOS_PROTOCOL" /> لاكتشاف عمليات المشاركة على الشبكة. + عند ضبط هذه السياسة على False، لن يستخدم إعداد "اكتشاف المشاركة" بروتوكول <ph name="NETBIOS_PROTOCOL" /> لاكتشاف عمليات المشاركة. + إذا لم يتم وضع هذه السياسة، سيُلغى تفعيل السياسة التلقائية للمستخدمين الخاضعين لإدارة المؤسسات وستُفعّل لغير الخاضعين للإدارة.</translation> <translation id="4555850956567117258">يمكنك تفعيل التأكيد عن بُعد للمستخدم</translation> <translation id="4557134566541205630">عنوان URL لصفحة علامة تبويب جديدة لموفّر خدمة البحث التلقائي</translation> <translation id="4567137030726189378">السماح باستخدام "أدوات المطوّرين"</translation> @@ -1665,6 +1674,7 @@ في حالة ترك هذه السياسة بدون تعيين، سيتم إيقاف التعليقات المنطوقة عند ظهور شاشة تسجيل الدخول للمرة الأولى. ويُمكن للمستخدمين تفعيل التعليقات المنطوقة أو إيقافها في أي وقت وستستمر الحالة في شاشة تسجيل الدخول بين المستخدمين.</translation> <translation id="5868414965372171132">تهيئة الشبكة على مستوى المستخدم</translation> +<translation id="5879014913445067283">تتحكّم في اكتشاف "خادم مشاركة الملفات على الشبكة" عبر <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">الإعدادات التلقائية لملفات تعريف الارتباط</translation> <translation id="5887414688706570295">لتهيئة بادئة TalkGadget التي سيتم استخدامها بواسطة عمليات استضافة الدخول عن بُعد ومنع المستخدمين من تغييرها. @@ -2089,6 +2099,17 @@ إذا تم إيقاف هذا الإعداد، فلن يتمكن المستخدمون من الطباعة إلى <ph name="CLOUD_PRINT_NAME" /> من مربع الحوار "طباعة" في <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">تفرض هذه السياسة استيراد الإشارات المرجعية من المتصفح التلقائي الحالي إذا تم تمكينها. وإذا تم تمكينها، فإن هذه السياسة تؤثر أيضًا في مربع الحوار "استيراد". إذا تم إيقافها، فلا يتم استيراد الإشارات المرجعية. إذا لم يتم تعيينها، فقد يتم سؤال المستخدم بشأن الاستيراد أو إجراء الاستيراد تلقائيًا.</translation> <translation id="7063895219334505671">السماح بالنوافذ المنبثقة في هذه المواقع</translation> +<translation id="706568410943497889"> + إذا تم ضبط هذه السياسة على true، يُسمح لـ <ph name="PRODUCT_NAME" /> بجمع سجلّات أحداث WebRTC من خدمات Google (مثل Google Meet) وتحميل هذه السجلّات إلى Google. + + إذا تم ضبط هذه السياسة على false، أو إذا لم يتم وضعها، قد لا يجمع <ph name="PRODUCT_NAME" /> هذه السجلّات أو يحمّلها. + + تحتوي هذه السجلّات على معلومات تشخيص تكون مفيدة عند تصحيح الأخطاء المتعلقة بمكالمات الصوت والفيديو في Chrome، مثل وقت حزم RTP المُرسلة والمُستلمة وحجمها والتعليقات حول التكدس على الشبكة والبيانات الوصفية حول وقت إطارات الفيديو والصوت وجودتها. ولا تتضمّن هذه السجلّات محتوى الفيديو أو الصوت من المكالمة. + + لا يمكن تشغيل مجموعة بيانات Chrome هذه إلا من خلال خدمات الويب في Google، مثل Google Hangouts أو Google Meet. + + قد تربط Google هذه السجلّات بسجلّات أخرى تم تجميعها عن طريق خدمة Google نفسها من خلال رقم تعريف الجلسة. والهدف من ذلك تسهيل عملية تصحيح الأخطاء. + </translation> <translation id="706669471845501145">السماح للمواقع بعرض اشعارات سطح المكتب</translation> <translation id="7072208053150563108">معدّل تغيير كلمة مرور الجهاز</translation> <translation id="7074513465313721551">تتيح هذه السياسة تهيئة قائمة النطاقات الموثوقة من ميزة "التصفّح الآمن"، أي بمعنى آخر: @@ -2220,6 +2241,9 @@ <translation id="7336878834592315572">الاحتفاظ بملفات تعريف الارتباط طوال مدة الجلسة</translation> <translation id="7340034977315324840">تسجيل أوقات نشاط الجهاز</translation> <translation id="7343497214039883642">ملف تهيئة طابعة المؤسسة للأجهزة</translation> +<translation id="7349338075015720646">تحدّد هذه السياسة قائمة من مواقع الويب التي تم تثبيتها تلقائيًا بدون تفاعل المستخدم، والتي لا يمكن له إلغاء تثبيتها أو إيقافها. + + كل عنصر قائمة في السياسة هو كائن مكوّن من عضوين: "url" و"launch_container". يجب أن يكون "url" هوعنوان URL لتطبيق الويب المُراد تثبيته ويجب أن يكون "launch_container" إما "نافذة" أو "علامة تبويب" للإشارة إلى كيف سيفتح "تطبيق الويب" بعد تثبيته. إذا تم حذف "launch_container"، سيتم تشغيل التطبيق في نافذة إذا اعتبره Chrome "تطبيق ويب تقدّمي" وسيتم تشغيله في علامة تبويب بخلاف ذلك.</translation> <translation id="7367028210010532881">تعرض خدمة "التصفُّح الآمن" صفحة تحذير عند انتقال المستخدم إلى المواقع التي تم الإبلاغ بأنها ضارة. تفعيل هذا الإعداد يمنع المستخدمين من متابعة الانتقال من صفحة التحذير إلى الموقع الضار. عند إيقاف هذا الإعداد أو عدم تهيئته، يمكن للمستخدمين المتابعة إلى الموقع الذي تم الإبلاغ عنه بعد ظهور التحذير. @@ -2668,6 +2692,7 @@ يمكن أن تشير كلمة "إصدار" هنا إلى إصدار محدد مثل، '61.0.3163.120' أو بادئة إصدار، مثل '61.0' </translation> <translation id="8544375438507658205">عارض HTML التلقائي <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">السماح بمزامنة رسائل SMS من الهاتف إلى Chromebook</translation> <translation id="8549772397068118889">التحذير عند الانتقال إلى مواقع خارج حزمات المحتوى</translation> <translation id="8566842294717252664">إخفاء السوق الإلكتروني من صفحة علامة التبويب الجديدة ومشّغل التطبيقات.</translation> <translation id="8586528890725660268">تُحدد السياسة الطابعات التي لا يمكن للمستخدم استخدامها. @@ -2711,6 +2736,10 @@ وفي حال عدم ضبط هذه السياسة، لن تحمي خدمة حماية كلمة المرور في هذه الحالة إلا كلمات مرور Google ولكن سيتمكّن المستخدم من تغيير هذا الإعداد.</translation> <translation id="8672321184841719703">إصدار التحديث التلقائي المستهدف</translation> <translation id="867410340948518937">U2F (العامل الثاني العالمي)</translation> +<translation id="8682611302223077049">تسمح لك هذه السياسة بتحديد الفترة الزمنية بالمللي ثانية، التي يتم بعدها إبلاغ المستخدمين بضرورة إعادة تشغيل <ph name="PRODUCT_NAME" /> أو إعادة تشغيل جهاز <ph name="PRODUCT_OS_NAME" /> لتثبيت تحديث مُعلّق. + خلال تلك الفترة الزمنية، سيتم إبلاغ المستخدم مرارًا بضرورة التحديث. بالنسبة إلى أجهزة <ph name="PRODUCT_OS_NAME" /> يظهر إشعار إعادة التشغيل في لوحة النظام عند رصد ترقية. أما بالنسبة إلى متصفّحات <ph name="PRODUCT_NAME" /> تتغير قائمة التطبيق لتشير إلى ضرورة إعادة التشغيل بعد مرور ثلث مدة الإشعار. ويتغير لون هذا الإشعار بعد مرور ثلثي مدته وكذلك بعد مرور مدته بالكامل. كما تتبّع الإشعارات الإضافية التي تفعّلها سياسة <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> نفس الجدول. + + إذا لم يتم وضع السياسة، يتم استخدام الفترة التلقائية التي تبلغ 345600000 مللي ثانية (أربعة أيام) لأجهزة <ph name="PRODUCT_OS_NAME" /> و604800000 مللي ثانية (أسبوع واحد) لـ <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">تم تشغيل تحذير حماية كلمة المرور من خلال إعادة استخدام كلمة المرور.</translation> <translation id="8693243869659262736">استخدام عميل نظام أسماء النطاقات المدمج</translation> <translation id="8704831857353097849">قائمة بالمكونات الإضافية غير المفعّلة</translation> @@ -2747,6 +2776,7 @@ يجب أن يكون عامل تحديد قيمة المهلة 100% أو أكثر من ذلك. القيم التي ستجعل مهلة وضع الخمول في وضع العرض التقديمي أقل من المهلة العادية لوضع الخمول غير مسموح بها.</translation> <translation id="8798099450830957504">التلقائي</translation> +<translation id="8801680448782904838">إبلاغ أحد المستخدمين بأن إعادة تشغيل المتصفح أو الجهاز موصى بها أو مطلوبة</translation> <translation id="8818173863808665831">الإبلاغ عن الموقع الجغرافي للجهاز. إذا لم يتم تعيين هذه السياسة، أو تم تعيينها على false، فلن يتم الإبلاغ عن الموقع.</translation> @@ -2903,6 +2933,11 @@ وفي حالة تعيينها إلى true، سيبدأ <ph name="PRODUCT_OS_NAME" /> إعادة التشغيل عندما يعمل المستخدم على إيقاف تشغيل الجهاز. يستبدل <ph name="PRODUCT_OS_NAME" /> كل مواضع ورود أزرار إيقاف التشغيل في واجهة المستخدم بأزرار إعادة التشغيل. وإذا أوقف المستخدم تشغيل الجهاز باستخدام زر التشغيل، فلن تتم إعادة تشغيله تلقائيًا، حتى إذا تم تفعيل السياسة.</translation> <translation id="9152473318295429890">تفعيل الاقتراحات السياقية لصفحات الويب ذات الصلة</translation> <translation id="9158929520101169054">السماح بالدخول المتعدد في المتصفح</translation> +<translation id="9159126470527871268">إبلاغ المستخدمين أنه يجب إعادة تشغيل <ph name="PRODUCT_NAME" /> أو <ph name="PRODUCT_OS_NAME" /> لتطبيق تحديث مُعلّق. + + يؤدي ضبط هذه السياسة إلى تفعيل الإشعارات لإبلاغ المستخدم أن إعادة تشغيل المتصفّح أو الجهاز موصى بها أومطلوبة. إذا لم يتم ضبط هذه السياسة، يشير <ph name="PRODUCT_NAME" /> إلى المستخدم أنه يجب إعادة التشغيل عبر إجراء تغييرات دقيقة بالقائمة، بينما يشير <ph name="PRODUCT_OS_NAME" /> إلى هذا الأمر عبر إشعار في لوحة النظام. وفي حال الضبط على "موصى بها"، ستظهر رسالة تحذير متكررة للمستخدم تخبره بأن إعادة التشغيل موصى بها. يمكن للمستخدم رفض هذا التحذير لتأجيل عملية إعادة التشغيل. وفي حال الضبط على "مطلوبة" تظهر رسالة تحذير متكررة للمستخدم تشير إلى أنه سيتم فرض إعادة تشغيل المتصفّح فور انتهاء مدة الإشعار. وتكون الفترة التلقائية 7 أيام لـ <ph name="PRODUCT_NAME" /> و أربعة أيام لـ <ph name="PRODUCT_OS_NAME" />، ويمكن تهيئتها عبر ضبط سياسة <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + تتم استعادة جلسة المستخدم بعد إعادة التشغيل.</translation> <translation id="9165792353046089850">تتيح لك هذه السياسة تحديد ما إذا كان يُسمح لمواقع الويب بالحصول على إمكانية الوصول إلى أجهزة USB المتصلة أم لا. يمكن حظر إمكانية الوصول تمامًا، أو يمكن سؤال المستخدم في كل مرة يريد فيها موقع ويب الحصول على إمكانية الوصول إلى أجهزة USB المتصلة. يمكن إلغاء هذه السياسة لأنماط عناوين URL مُحدّدة باستخدام سياستي "WebUsbAskForUrls" و"WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index bdbcc1a..063f063 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -332,6 +332,7 @@ <translation id="199764499252435679">Активиране на актуализациите на компонентите в <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Управление на захранването</translation> <translation id="201557587962247231">Честота на качване на информация за състоянието на устройството</translation> +<translation id="2017301949684549118">URL адреси за уеб приложения, които да се инсталират негласно.</translation> <translation id="2018836497795982119">Посочва периода в милисекунди, на който услугата за управление на устройството се запитва за информация относно потребителските правила. Задаването на това правило отменя стандартната стойност от 3 часа. Валидните стойности са между 1 800 000 (30 минути) и 86 400 000 (1 ден). Всичко извън този диапазон ще бъде променено към съответната граница. Ако платформата поддържа известия за правилата, опресняването ще се извършва на 24 часа, тъй като се очаква, че тези известия автоматично ще го задействат при промяна в правилата. @@ -637,6 +638,11 @@ URL адресът на Google за търсене може да бъде посочен като: <ph name="GOOGLE_SEARCH_URL" /> Тази опция трябва да бъде зададена, когато правилото „DefaultSearchProviderEnabled“ е активирано, и ще се спазва само в такъв случай.</translation> +<translation id="2659019163577049044">Ако тази настройка е активирана, на потребителите е разрешено да настройват синхронизиране на SMS съобщения между своите телефони и Chromebook. Обърнете внимание, че ако правилото е разрешено, потребителите трябва изрично да включат функцията, като извършат настройване. След края на настройването те ще могат да изпращат и получават SMS съобщения на своите Chromebook. + + Ако настройката е деактивирана, на потребителите не е разрешено да настройват синхронизиране на SMS съобщения. + + Ако правилото не е зададено, стандартно функцията не е разрешена за управляваните потребители и е разрешена за неуправляваните.</translation> <translation id="2660846099862559570">Никога да не се използва прокси сървър</translation> <translation id="267596348720209223">Посочва кодиранията на знаците, поддържани от търсещата машина. Това са имена на кодови страници, като UTF-8, GB2312 и ISO-8859-1. Те се изпробват в посочения ред. Това правило не е задължително. В случай че не е зададено, ще се използва кодиране по подразбиране, което е UTF-8. То се спазва само ако правилото „DefaultSearchProviderEnabled“ е активирано.</translation> <translation id="268577405881275241">Активиране на функцията на прокси сървър за компресиране на данни</translation> @@ -703,7 +709,6 @@ Ако деактивирате тази настройка или не зададете стойност, стандартният избор за местоназначение във визуализацията за печат ще бъде последно използваният принтер. В случай че активирате настройката, стандартният принтер за операционната система ще се използва като опция по подразбиране във визуализацията за печат.</translation> -<translation id="2867699958489427143">Трайно възстановяване на целевата версия на операционната система, ако текущата версия е по-нова от нея. Извършване на Powerwash с пълен обхват по време на процеса.</translation> <translation id="2872961005593481000">Изключване</translation> <translation id="2874209944580848064">Забележка относно устройствата с <ph name="PRODUCT_OS_NAME" />, поддържащи приложения за Android:</translation> <translation id="2877225735001246144">Деактивиране на търсенето на CNAME при съгласуване на удостоверяване с Kerberos</translation> @@ -937,7 +942,6 @@ <translation id="3711895659073496551">Спиране</translation> <translation id="3715569262675717862">Удостоверяване въз основа на клиентски сертификати</translation> <translation id="3736879847913515635">Активиране на възможността за добавяне на хора чрез функцията за управление на потребителите</translation> -<translation id="3737544779868348650">Име на хоста за мрежата на устройството</translation> <translation id="3746590506846867985"> Това правило се отнася за екрана за вход. Моля, вижте и правилото <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, което се прилага на ниво потребителска сесия. Препоръчително е да зададете една и съща стойност и за двете правила. В противен случай прилагането на стойността от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия. Ако правилото е активирано, всеки сайт от наименованите източници в списък, разделен със запетаи, ще се изпълнява в собствен процес. Това също така ще изолира източниците по поддомейни, напр. посочването на https://example.com/ ще доведе до изолирането и на https://foo.example.com/, тъй като е част от сайта https://example.com/. @@ -1050,6 +1054,7 @@ Всеки запис в списъка съдържа речник, който трябва да включва идентификационния номер на разширението в полето „extension-id“ и неговия URL адрес за актуализация в „update-url“.</translation> <translation id="3874773863217952418">Активиране на функцията за търсене с докосване</translation> <translation id="3877517141460819966">Режим с интегрирано второ ниво на удостоверяване на самоличността</translation> +<translation id="3879208481373875102">Конфигуриране на списъка с принудително инсталирани уеб приложения</translation> <translation id="388237772682176890">Това правило е оттеглено във версия M53 и премахнато в M54, защото SPDY/3.1 вече не се поддържа. Деактивира използването на протокола SPDY в <ph name="PRODUCT_NAME" />. @@ -1283,6 +1288,10 @@ За пълно описание на възможните настройки и структурата на това правило, моля, посетете https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Режим за обработване на правилата за потребители от GPO на ниво устройство</translation> +<translation id="4554841826517980623">Това правило контролира дали функцията на <ph name="PRODUCT_NAME" /> за споделяне на файлове в мрежата да използва <ph name="NETBIOS_PROTOCOL" /> за откриване на мрежови дялове. + Когато правилото е True, за откриване на мрежови дялове се използва <ph name="NETBIOS_PROTOCOL" />. + Когато правилото е False, за откриване на мрежови дялове не се използва <ph name="NETBIOS_PROTOCOL" />. + Ако правилото не е зададено, стандартно е деактивирано за корпоративни управлявани потребители и е активирано за неуправлявани потребители.</translation> <translation id="4555850956567117258">Активиране на отдалеченото удостоверяване за потребителя</translation> <translation id="4557134566541205630">URL адрес на новия раздел за търсещата машина по подразбиране</translation> <translation id="4567137030726189378">Разрешаване на използването на инструментите за програмисти</translation> @@ -1676,6 +1685,7 @@ Ако правилото не бъде зададено, обратната връзка с говор е деактивирана при първото показване на екрана за вход. Потребителите могат да я активират или деактивират по всяко време и състоянието й в екрана за вход се запазва между тях.</translation> <translation id="5868414965372171132">Конфигурация на мрежата на ниво потребител</translation> +<translation id="5879014913445067283">Контролиране на откриването на мрежови дялове чрез <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Настройка по подразбиране за „бисквитките“</translation> <translation id="5887414688706570295">Конфигурира префикса за притурката за Talk, който ще се използва от хостовете за отдалечен достъп, и не разрешава на потребителите да го променят. @@ -2116,6 +2126,17 @@ <translation id="7049373494483449255">Активира изпращането на документи за отпечатване от <ph name="PRODUCT_NAME" /> до <ph name="CLOUD_PRINT_NAME" />. ЗАБЕЛЕЖКА: Това правило се отразява само на поддръжката на <ph name="CLOUD_PRINT_NAME" /> в <ph name="PRODUCT_NAME" />. То не забранява на потребителите да изпращат задания за печат на уебсайтове. Ако тази настройка е активирана или не е конфигурирана, потребителите могат да отпечатват чрез <ph name="CLOUD_PRINT_NAME" /> от съответния диалогов прозорец на <ph name="PRODUCT_NAME" />. В случай че е деактивирана, те не могат да отпечатват чрез <ph name="CLOUD_PRINT_NAME" /> от диалоговия прозорец на <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Ако е активирано, това правило импортира принудително отметките от текущия браузър по подразбиране. В такъв случай то оказва влияние и върху диалоговия прозорец за импортиране. Ако правилото е деактивирано, не се импортират отметки. В случай че не е зададено, потребителят може да бъде попитан дали операцията да се извърши, или импортирането може да стане автоматично.</translation> <translation id="7063895219334505671">Разрешаване на изскачащи прозорци на тези сайтове</translation> +<translation id="706568410943497889"> + Ако правилото е true, на <ph name="PRODUCT_NAME" /> се разрешава да събира регистри на събитията за WebRTC от услугите на Google (напр. Google Meet) и да ги качва в Google. + + Ако правилото е false или не е зададено, <ph name="PRODUCT_NAME" /> не може да събира и качва такива регистри. + + Тези регистри съдържат диагностична информация, като часа и размера на изпратените и получените RTP пакети, обратна връзка за претоварване в мрежата, както и метаданни за времената и качеството на аудио- и видеокадрите. Тази информация е полезна при отстраняването на проблеми с гласовите или видеообажданията в Chrome. Регистрите не включват аудио- или видеосъдържание от обажданията. + + Това събиране на данни от страна на Chrome може да бъде задействано само от уеб услугите на Google, като Google Hangouts или Google Meet. + + Посредством идентификационен номер на сесията тези регистри може да бъдат свързани с други регистрационни файлове, събирани от самата услуга на Google. Това се прави с цел улесняване на отстраняването на грешки. + </translation> <translation id="706669471845501145">Разрешаване на сайтовете да показват известия на работния плот</translation> <translation id="7072208053150563108">Честота на промяна на паролата на машината</translation> <translation id="7074513465313721551">Конфигуриране на списъка с домейни, които Безопасно сърфиране да смята за надеждни. Това означава, че: @@ -2247,6 +2268,9 @@ <translation id="7336878834592315572">Съхраняване на „бисквитките“ за цялата продължителност на сесията</translation> <translation id="7340034977315324840">Съобщаване на времената на активност на устройствата</translation> <translation id="7343497214039883642">Конфигурационен файл с корпоративни принтери за устройствата</translation> +<translation id="7349338075015720646">Посочва списък с уебсайтове, които се инсталират негласно, без взаимодействие с потребителя и без възможност за деинсталиране или деактивиране от него. + + Всеки списъчен елемент в правилото е обект с два члена, „url“ и „launch_container“. Стойността на „url“ е URL адресът на уеб приложението, което да се инсталира, а стойността на „launch_container“ е или „window“, или „tab“, което показва по какъв начин да се отваря уеб приложението след инсталирането. Ако „launch_container“ е пропуснато, приложението ще стартира в прозорец, при условие че Chrome го сметне за прогресивно уеб приложение, а в противен случай стартира в раздел.</translation> <translation id="7367028210010532881">Услугата Безопасно сърфиране показва предупредителна страница, когато потребителите навигират до сайтове, за които е сигнализирано, че са потенциално злонамерени. Активирането на тази настройка не разрешава продължаването към злонамерения сайт от съответната страница. Ако настройката е деактивирана или не е конфигурирана, потребителите могат да продължат към сайта, за който е подаден сигнал, след като видят предупреждението. @@ -2699,6 +2723,7 @@ Тук „Версия“ може да е или точен номер на версия (например „61.0.3163.120“), или префикс (например „61.0“). </translation> <translation id="8544375438507658205">HTML визуализатор по подразбиране за <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Разрешаване на синхронизирането на SMS съобщения от телефона към Chromebook.</translation> <translation id="8549772397068118889">Предупреждение при посещаване на сайтове извън пакети със съдържание</translation> <translation id="8566842294717252664">Скриване на уеб магазина от новия раздел в браузъра и от стартовия панел за приложения</translation> <translation id="8586528890725660268">Посочва кои принтери не могат да се използват от потребителя. @@ -2743,6 +2768,11 @@ Ако правилото не е зададено, услугата за защита ще предпазва само паролите за Google, но потребителят ще може да променя настройката.</translation> <translation id="8672321184841719703">Целева версия за автоматично актуализиране</translation> <translation id="867410340948518937">U2F (универсално второ ниво)</translation> +<translation id="8682611302223077049">Дава възможност да зададете периода от време (в милисекунди), през който потребителите да бъдат известявани, че трябва да стартират отново <ph name="PRODUCT_NAME" /> или да рестартират устройството с <ph name="PRODUCT_OS_NAME" />, за да се приложи изчакваща актуализация. + + По време на този период потребителите ще бъдат уведомявани неколкократно за необходимостта от актуализиране. Когато бъде открито надстройване на устройства с <ph name="PRODUCT_OS_NAME" />, в системната област ще се покаже известие за рестартиране. За браузъра <ph name="PRODUCT_NAME" /> менюто на приложението се променя, за да укаже, че е нужно повторно стартиране, щом изтече една трета от периода на известяване. Известието променя цвета си веднъж при изтичане на две трети от периода и втори път в края му. Този график важи и за допълнителните известия, активирани чрез правилото <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. + + Ако правилото не е зададено, за устройства с <ph name="PRODUCT_OS_NAME" /> ще се използва стандартният период от 345600000 милисекунди (четири дни), а за <ph name="PRODUCT_NAME" /> – 604800000 милисекунди (една седмица).</translation> <translation id="8685024486845674965">Извеждане на предупреждение, когато паролата се използва повторно</translation> <translation id="8693243869659262736">Използване на вградената клиентска програма за DNS</translation> <translation id="8704831857353097849">Списък с деактивирани приставки</translation> @@ -2783,6 +2813,7 @@ Коефициентът трябва да е поне 100%. Не са разрешени стойности, които биха направили забавянето на затъмняването на екрана в режим за презентации по-малко от обичайното.</translation> <translation id="8798099450830957504">По подразбиране</translation> +<translation id="8801680448782904838">Известяване на потребителя, че е препоръчително или задължително да стартира отново браузъра или да рестартира устройството</translation> <translation id="8818173863808665831">Съобщаване на географското местоположение на устройството. Ако правилото не е зададено или е „false“, това няма да се случва.</translation> @@ -2933,6 +2964,11 @@ При true <ph name="PRODUCT_OS_NAME" /> ще се рестартира, когато потребител изключи устройството. Всички бутони за изключване в потребителския интерфейс на <ph name="PRODUCT_OS_NAME" /> ще бъдат заменени с такива за рестартиране. Ако устройството бъде изключено чрез бутона за захранване, то няма да се рестартира автоматично дори правилото да е активирано.</translation> <translation id="9152473318295429890">Активиране на контекстуалните предложения за сродни уеб страници</translation> <translation id="9158929520101169054">Разрешаване на централизирания вход в браузъра</translation> +<translation id="9159126470527871268">Известяване на потребителите, че трябва да стартират отново <ph name="PRODUCT_NAME" /> или да рестартират <ph name="PRODUCT_OS_NAME" />, за да се приложи изчакваща актуализация. + + С настройката на това правило се активират известията, които уведомяват потребителя, че е препоръчително или задължително браузърът да се стартира отново или устройството да се рестартира. Ако правилото не е зададено, необходимостта от повторно стартиране се указва чрез малки промени в менюто на <ph name="PRODUCT_NAME" />, а <ph name="PRODUCT_OS_NAME" /> показва това чрез известия в системната област. При задаване на „Recommended“ периодично ще се извежда предупреждение, че повторното стартиране е препоръчително. Потребителят може да отхвърли предупреждението, за да отложи рестартирането. При „Required“ периодичното предупреждение ще указва, че браузърът ще бъде рестартиран принудително след края на периода на известяване. Стандартно продължителността на периода е седем дни за <ph name="PRODUCT_NAME" /> и четири дни за <ph name="PRODUCT_OS_NAME" />, като може да бъде конфигурирана чрез правилото <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Потребителската сесия се възстановява след повторното стартиране или рестартирането.</translation> <translation id="9165792353046089850">Позволява да зададете дали уебсайтовете да имат достъп до свързани USB устройства. Той може да е блокиран напълно или е възможно потребителят да получава запитване всеки път, когато уебсайт иска достъп до такива устройства. Това правило може да бъде заменено за конкретни образци на URL адреси, като се използват правилата WebUsbAskForUrls и WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 4030ba7b..f07ed5e 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -796,7 +796,6 @@ যদি আপনি এই সেটিংসটি অক্ষম করেন বা মান সেট না করে থাকেন তাহলে প্রিন্টিং প্রিভিউ ডিফল্ট হিসাবে সম্প্রতি ব্যবহার করা প্রিন্টার ব্যবহার করবে। যদি আপনি এই সেটিংসটি সক্ষম করেন, তাহলে প্রিন্টিং প্রিভিউ ডিফল্ট হিসাবে OS সিস্টেমের ডিফল্ট প্রিন্টিং ব্যবহার করবে।</translation> -<translation id="2867699958489427143">ফিরে আসুন এবং টার্গেট ভার্সন যদি OS ভার্সনের থেকে নতুন হয় তাহলে টার্গেট ভার্সনেই থাকুন। প্রক্রিয়া চলাকালীন সম্পূর্ণ পাওয়ারওয়াশ করুন।</translation> <translation id="2872961005593481000">বন্ধ করুন</translation> <translation id="2874209944580848064">Android অ্যাপ্লিকেশান সমর্থন করে এমন <ph name="PRODUCT_OS_NAME" /> ডিভাইসগুলির জন্য দ্রষ্টব্য:</translation> <translation id="2877225735001246144">কার্বেরস প্রমাণীকরণের সাথে সমঝোতা করার সময় CNAME লুকআপ অক্ষম করুন</translation> @@ -1077,7 +1076,6 @@ <translation id="3715569262675717862">ক্লায়েন্ট সার্টিফিকেটের উপর ভিত্তি করে প্রমাণীকরণ</translation> <translation id="3734995764843493369">প্রতিদিন (২৪ ঘণ্টা) পাসওয়ার্ড দেওয়া প্রয়োজন</translation> <translation id="3736879847913515635">ইউজার ম্যানেজারে অন্যদের যোগ করা সক্ষম করুন</translation> -<translation id="3737544779868348650">ডিভাইসের নেটওয়ার্ক হোস্টনেম</translation> <translation id="3746590506846867985"> সাইন-ইন স্ক্রিনেও এই নীতিটি প্রযোজ্য হয়। অনুগ্রহ করে <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> নীতিও দেখুন, যেটি ব্যবহারকারীর সেশনে প্রযোজ্য হয়। উভয় নীতির মান সমানভাবে সেট করার পরামর্শ দেওয়া হয়। যদি মানগুলি না মেলে তাহলে ব্যবহারকারীর সেশনে প্রবেশ করার সময় ব্যবহারকারী পলিসি দ্বারা নির্দিষ্ট মানটি প্রয়োগ করার কারণে একটু বিলম্ব হতে পারে। নীতিটি চালু করা হলে কমা দিয়ে বিভক্ত তালিকার প্রতিটি উল্লিখিত উৎস নিজস্ব প্রসেসের মধ্যে কাজ করবে। এর ফলে সাবডোমেন দিয়ে উল্লেখ করা উৎসগুলিও আইসোলেট করা হবে; উদাহরণ, https://example.com/ উল্লেখ করা হলে https://example.com/ সাইটের অংশ হিসেবে https://foo.example.com/ ও আইসোলেট করা হবে।
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index da4afb7..44c6f0b1 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -331,6 +331,7 @@ <translation id="199764499252435679">Permet les actualitzacions de components a <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestió de l'alimentació</translation> <translation id="201557587962247231">Freqüència amb què s'envien càrregues per informar sobre l'estat del dispositiu</translation> +<translation id="2017301949684549118">URL per a aplicacions web que s'instal·laran en segon pla.</translation> <translation id="2018836497795982119">Especifica el període en mil·lisegons per al qual se sol·licita informació sobre polítiques relatives a l'usuari al servei de gestió de dispositius. Si aquesta política s'estableix, el valor predeterminat de tres hores se substituirà per un dels valors vàlids, que es troben en un interval d'1.800.000 (30 minuts) a 86.400.000 mil·lisegons (un dia). Els valors que no es trobin dins d'aquest interval s'ajustaran al límit corresponent. Si la plataforma admet notificacions sobre polítiques, el retard d'actualització s'establirà en 24 hores, ja que es preveu que aquestes notificacions forcin una actualització automàtica cada vegada que canviï la política. @@ -633,6 +634,11 @@ L'URL de cerca de Google es pot especificar de la manera següent: <ph name="GOOGLE_SEARCH_URL" />. Aquesta opció s'ha d'establir quan s'activa la política DefaultSearchProviderEnabled i només es respectarà si és així.</translation> +<translation id="2659019163577049044">Si s'activa aquesta opció de configuració, els usuaris podran configurar els dispositius perquè sincronitzin els missatges SMS entre els telèfons i els dispositius Chromebook. Tingues en compte que, si es permet aquesta política, els usuaris hauran d'activar aquesta funció explícitament completant un procés de configuració. Un cop finalitzat aquest procés, els usuaris podran enviar i rebre missatges SMS als dispositius Chromebook. + + Si aquesta opció de configuració es desactiva, no es permetrà que els usuaris configurin la sincronització d'SMS. + + Si aquesta política es deixa sense establir, el valor predeterminat no es permetrà als usuaris gestionats i es permetrà als usuaris no gestionats.</translation> <translation id="2660846099862559570">No facis servir mai un servidor intermediari</translation> <translation id="267596348720209223">Especifica les codificacions de caràcters que admet el proveïdor de cerca. Les codificacions són noms de pàgines de codi com ara UTF-8, GB2312 i ISO-8859-1. Es proven per ordre. Aquesta política és opcional. Si no es defineix, s'utilitzarà el valor predeterminat, que és UTF-8. Aquesta política només es respecta si la política "DefaultSearchProviderEnabled" està activada.</translation> <translation id="268577405881275241">Activa la funció del servidor intermediari de compressió de dades</translation> @@ -698,7 +704,6 @@ Si desactives aquesta opció de configuració o no hi estableixes cap valor, a Previsualització de la impressió s'utilitzarà la impressora que s'ha fet servir més recentment com a opció de destinació predeterminada. Si actives aquesta opció de configuració, a Previsualització de la impressió s'utilitzarà la impressora predeterminada del sistema operatiu com a opció de destinació predeterminada.</translation> -<translation id="2867699958489427143">Torna a la versió de destinació si la versió del sistema operatiu és més recent que la de destinació. Executa la funció Powerwash durant el procés.</translation> <translation id="2872961005593481000">Apaga</translation> <translation id="2874209944580848064">Nota per als dispositius <ph name="PRODUCT_OS_NAME" /> que admeten aplicacions per a Android:</translation> <translation id="2877225735001246144">Desactiva la cerca de CNAME en negociar l'autenticació de Kerberos</translation> @@ -936,7 +941,6 @@ <translation id="3711895659073496551">Suspèn</translation> <translation id="3715569262675717862">Autenticació basada en certificats del client</translation> <translation id="3736879847913515635">Activa l'opció Afegeix una persona al gestor d'usuaris</translation> -<translation id="3737544779868348650">Nom d'amfitrió de la xarxa del dispositiu</translation> <translation id="3746590506846867985"> 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 de l'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, 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/). @@ -1041,6 +1045,7 @@ Cada entrada de la llista conté un diccionari que ha d'incloure l'identificador de l'extensió al camp "extension-id" i l'URL d'actualització al camp "update-url".</translation> <translation id="3874773863217952418">Activa Toca per cercar</translation> <translation id="3877517141460819966">Mode d'autenticació de dos factors integrat</translation> +<translation id="3879208481373875102">Configura la llista d'aplicacions web instal·lades per la força</translation> <translation id="388237772682176890">Aquesta política es considera obsoleta a M53 i s'ha suprimit a M54, perquè el protocol SPDY/3.1 ja no s'admet. Desactiva l'ús del protocol SPDY a <ph name="PRODUCT_NAME" />. @@ -1274,6 +1279,10 @@ Per obtenir una descripció detallada de les opcions de configuració possibles i de l'estructura d'aquesta política, visita https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Mode de processament retroactiu de la política d'usuari</translation> +<translation id="4554841826517980623">Aquesta política controla si la funció Usos compartits de fitxers de la xarxa per a <ph name="PRODUCT_NAME" /> ha d'utilitzar <ph name="NETBIOS_PROTOCOL" /> per descobrir usos compartits a la xarxa. + Si aquesta política s'estableix en "true", la detecció d'usos compartits farà servir el protocol <ph name="NETBIOS_PROTOCOL" /> per detectar usos compartits a la xarxa. + Si aquesta política s'estableix en "false", la detecció d'usos compartits no farà servir el protocol <ph name="NETBIOS_PROTOCOL" /> per detectar usos compartits. + Si la política es deixa sense establir, el valor predeterminat es desactivarà per als usuaris gestionats per l'empresa i s'activarà per als usuaris no gestionats.</translation> <translation id="4555850956567117258">Activa el testimoni remot per a l'usuari.</translation> <translation id="4557134566541205630">URL de la pestanya nova del proveïdor de cerca predeterminat</translation> <translation id="4567137030726189378">Permet l'ús de les Eines per a desenvolupadors</translation> @@ -1665,6 +1674,7 @@ Si no s'estableix aquesta política, els comentaris de veu es desactivaran quan la pantalla d'inici de sessió es mostri per primera vegada. Els usuaris poden activar o desactivar els comentaris de veu en qualsevol moment i el seu estat a la pantalla d'inici de sessió es mantindrà entre els usuaris.</translation> <translation id="5868414965372171132">Configuració de la xarxa per part de l'usuari</translation> +<translation id="5879014913445067283">Controla la detecció d'usos compartits de fitxers a la xarxa mitjançant <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Configuració predeterminada de les galetes</translation> <translation id="5887414688706570295">Configura el prefix TalkGadget que utilitzaran els amfitrions d'accés remot i que impedeix que els usuaris el canviïn. @@ -2098,6 +2108,17 @@ <translation id="7049373494483449255">Permet que <ph name="PRODUCT_NAME" /> enviï documents a <ph name="CLOUD_PRINT_NAME" /> per imprimir. NOTA: Això només afecta a l'assistència de <ph name="CLOUD_PRINT_NAME" /> a <ph name="PRODUCT_NAME" />. No impedeix que els usuaris enviïn treballs d'impressió als llocs web. Si aquest paràmetre està activat o no està configurat, els usuaris podran imprimir a <ph name="CLOUD_PRINT_NAME" /> des del diàleg d'impressió <ph name="PRODUCT_NAME" />. Si aquest paràmetre està desactivat, els usuaris no podran imprimir a <ph name="CLOUD_PRINT_NAME" /> des del diàleg d'impressió <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">Si està activada, aquesta política fa que s'importin les adreces d'interès des del navegador predeterminat actual. Si està activada, aquesta política també afecta el diàleg d'importació. Si està desactivada, no s'importaran les adreces d'interès. Si no s'ha definit, es demanarà a l'usuari si vol importar o la importació es pot produir de forma automàtica.</translation> <translation id="7063895219334505671">Permet les finestres emergents en aquests llocs</translation> +<translation id="706568410943497889"> + Si la política s'estableix en "true", <ph name="PRODUCT_NAME" /> pot recollir registres d'esdeveniments WebRTC dels serveis de Google (per exemple, Google Meet) i penjar-los a Google. + + Si la política s'estableix en "false" o no s'estableix, és possible que <ph name="PRODUCT_NAME" /> no reculli ni pengi aquests registres. + + Aquests registres contenen informació de diagnòstic útil a l'hora de depurar problemes relacionats amb trucades d'àudio o videotrucades a Chrome, com ara l'hora i la mida dels paquets RTP enviats i rebuts, comentaris sobre la congestió de la xarxa, i metadades sobre l'hora i la qualitat dels marcs d'àudio i de vídeo. Aquests registres no inclouen contingut d'àudio ni vídeo de les trucades. + + Aquesta recollida de dades que fa Chrome només la poden activar els serveis web de Google, com ara Google Hangouts o Google Meet. + + Google pot associar aquests registres, mitjançant un identificador de sessió, a altres registres recollits pel servei de Google per tal de facilitar la depuració. + </translation> <translation id="706669471845501145">Permet que els llocs mostrin les notificacions d'escriptori</translation> <translation id="7072208053150563108">Freqüència de canvi de la contrasenya de l'ordinador</translation> <translation id="7074513465313721551">Configura la llista de dominis en què Navegació segura confiarà. És a dir: @@ -2229,6 +2250,9 @@ <translation id="7336878834592315572">Conserva les galetes mentre duri la sessió</translation> <translation id="7340034977315324840">Informa del temps d'activitat dels dispositius</translation> <translation id="7343497214039883642">Fitxer de configuració de la impressora d'empresa per a dispositius</translation> +<translation id="7349338075015720646">Especifica una llista de llocs web que s'instal·len en segon pla, sense la interacció de l'usuari, i que l'usuari no pot desinstal·lar ni desactivar. + + Cada element de la llista de la política és un objecte amb dos membres: "url" i "launch_container". "url" ha de ser l'URL de l'aplicació web que cal instal·lar i "launch_container" ha de ser "window" (finestra) o "tab" (pestanya) per indicar com s'obrirà l'aplicació web un cop instal·lada. Si "launch_container" s'omet, l'aplicació s'obrirà en una finestra si Chrome la considera una aplicació web progressiva i s'obrirà en una pestanya en cas contrari.</translation> <translation id="7367028210010532881">El servei Navegació segura mostra una pàgina d'advertiment quan els usuaris naveguen a llocs web marcats com a potencialment maliciosos. En activar aquesta opció de configuració, els usuaris no poden accedir de cap manera a un lloc web maliciós des del lloc web d'advertiment. Si aquesta opció de configuració es desactiva o no s'estableix, els usuaris poden decidir si volen accedir al lloc web marcat després de veure l'advertiment. @@ -2676,6 +2700,7 @@ En aquesta política, "versió" pot ser una versió exacta com ara "61.0.3163.120" o un prefix per a la versió com ara "61.0". </translation> <translation id="8544375438507658205">Renderitzador HTML predeterminat per a <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Permet que se sincronitzin missatges SMS del telèfon al dispositiu Chromebook.</translation> <translation id="8549772397068118889">Mostra un advertiment quan es visitin llocs no inclosos en paquets de contingut.</translation> <translation id="8566842294717252664">Amaga Web Store a la pàgina Pestanya nova i al Menú d'aplicacions</translation> <translation id="8586528890725660268">Especifica les impressores que un usuari no pot fer servir. @@ -2720,6 +2745,11 @@ Si aquesta política es deixa sense establir, el servei de protecció de contrasenyes només protegirà les contrasenyes de Google, però l'usuari podrà canviar aquesta opció de configuració.</translation> <translation id="8672321184841719703">Versió objectiu de l'actualització automàtica</translation> <translation id="867410340948518937">U2F (segon factor universal)</translation> +<translation id="8682611302223077049">El permet establir el període de temps, en mil·lisegons, durant el qual es notifica als usuaris que <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> s'han de reiniciar per aplicar una actualització pendent. + + Durant aquest període de temps, s'informa l'usuari repetidament de la necessitat de dur a terme una actualització. En dispositius amb <ph name="PRODUCT_OS_NAME" />, es mostra una notificació de reinici a la safata del sistema quan es detecta que una actualització. En navegadors <ph name="PRODUCT_NAME" />, el menú d'aplicacions canvia un cop transcorregut un terç del període de notificació per indicar que cal dur a terme un reinici. Aquesta notificació canvia de color quan han transcorregut dos terços del període de notificació i, de nou, quan ha transcorregut el període de notificació complet. Les altres notificacions activades per la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> segueixen aquest mateix patró. + + Si no s'estableix, s'utilitza el període predeterminat de 345.600.000 mil·lisegons (4 dies) per a dispositius amb <ph name="PRODUCT_OS_NAME" /> i 604.800.000 mil·lisegons (1 setmana) per a <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">L'advertiment sobre la protecció de contrasenyes s'activa quan es reutilitza una contrasenya</translation> <translation id="8693243869659262736">Utilitza el client DNS integrat</translation> <translation id="8704831857353097849">Llista de connectors desactivats</translation> @@ -2756,6 +2786,7 @@ El factor d'ajust ha de ser de 100% o més. No es permeten valors que puguin reduir el temps d'espera d'inactivitat de la pantalla en mode de presentació més enllà del seu valor habitual.</translation> <translation id="8798099450830957504">Predeterminat</translation> +<translation id="8801680448782904838">Notifica a un usuari que es recomana o que és necessari reiniciar el navegador o el dispositiu</translation> <translation id="8818173863808665831">Informeu de la ubicació geogràfica d'un dispositiu. Si no definiu la política, o bé si la definiu com a falsa, no s'informarà de la ubicació.</translation> @@ -2898,6 +2929,11 @@ Si aquesta política s'estableix en true, <ph name="PRODUCT_OS_NAME" /> reiniciarà el dispositiu quan l'usuari l'apagui. És a dir, <ph name="PRODUCT_OS_NAME" /> substitueix tots els botons d'apagat de la interfície d'usuari per botons de reinici. Per tant, si l'usuari apaga el dispositiu amb el botó d'engegada, es reiniciarà de manera automàtica, encara que la política estigui activada.</translation> <translation id="9152473318295429890">Activa suggeriments contextuals de pàgines web relacionades</translation> <translation id="9158929520101169054">Permet l'inici de sessió múltiple al navegador</translation> +<translation id="9159126470527871268">Notifica els usuaris que cal reiniciar <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> per aplicar una actualització pendent. + + Aquesta política activa les notificacions per avisar l'usuari que es recomana o es requereix reiniciar el navegador o el dispositiu. Si no s'estableix, <ph name="PRODUCT_NAME" /> fa canvis subtils al menú per indicar a l'usuari que cal reiniciar el navegador, mentre que <ph name="PRODUCT_OS_NAME" /> ho indica mitjançant una notificació a la safata del sistema. Si s'estableix en "Recommended", s'avisa periòdicament l'usuari que es recomana reiniciar el navegador o el dispositiu. L'usuari pot ignorar aquest advertiment per posposar el reinici. Si s'estableix en "Required", s'avisa periòdicament l'usuari que el navegador es reiniciarà per la força en finalitzar el període de notificació. La durada predeterminada d'aquest període és de 7 dies per a <ph name="PRODUCT_NAME" /> i 4 dies per a <ph name="PRODUCT_OS_NAME" />, i es pot configurar amb la política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + La sessió de l'usuari es restaura després del reinici.</translation> <translation id="9165792353046089850">Permet definir si els llocs web poden obtenir accés a dispositius USB connectats. L'accés es pot bloquejar completament o es pot consultar a l'usuari cada cop que un lloc web vulgui obtenir accés a dispositius USB connectats. En el cas de patrons d'URL específics, aquesta política es pot substituir per les polítiques WebUsbAskForUrls i WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index ba2848a8..cdb3c4c 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -329,6 +329,7 @@ <translation id="199764499252435679">Povolit aktualizace komponent v prohlížeči <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Správa možností napájení</translation> <translation id="201557587962247231">Frekvence nahrávání hlášení o stavu zařízení</translation> +<translation id="2017301949684549118">Adresy URL webových aplikací, které mají být instalovány na pozadí.</translation> <translation id="2018836497795982119">Určuje interval (v ms), ve kterém budou službě správy zařízení zasílány požadavky na informace o zásadách pro uživatele. Nastavení této zásady přepíše výchozí hodnotu 3 hodiny. Platné hodnoty pro tuto zásadu jsou v rozsahu od 1800000 (30 minut) do 86400000 (1 den). Místo hodnot mimo tento rozsah bude použita příslušná mezní hodnota. Pokud platforma podporuje oznámení o zásadách, bude interval aktualizací nastaven na 24 hodin, protože se očekává, že při změně zásad bude aktualizace vynucena automaticky prostřednictvím oznámení. @@ -628,6 +629,11 @@ Adresu URL Googlu pro vyhledávání lze zadat takto: <ph name="GOOGLE_SEARCH_URL" />. Tato možnost bude respektována, pouze pokud je aktivována zásada DefaultSearchProviderEnabled, a v tomto případě musí být nastavena.</translation> +<translation id="2659019163577049044">Je-li toto nastavení aktivováno, uživatelé budou moci ve svých zařízeních nastavit synchronizaci zpráv SMS mezi telefonem a Chromebookem. Upozorňujeme, že pokud je tato zásada povolena, uživatelé se k této funkci musejí výslovně přihlásit dokončením procesu nastavení. Po dokončení nastavení budou moci uživatelé odesílat a přijímat zprávy SMS v Chromebooku. + + Je-li toto nastavení deaktivováno, uživatelé nebudou moci nastavit synchronizaci SMS. + + Pokud tato zásada není nastavena, ve výchozím nastavení je pro spravované uživatele zakázána a pro nespravované uživatele povolena.</translation> <translation id="2660846099862559570">Nikdy nepoužívat proxy server</translation> <translation id="267596348720209223">Určuje kódování znaků podporovaná poskytovatelem vyhledávání. Kódování jsou názvy stránek kódů, například UTF-8, GB2312 nebo ISO-8859-1. Budou vyzkoušena v uvedeném pořadí. @@ -698,7 +704,6 @@ Pokud toto nastavení zakážete nebo nenastavíte žádnou hodnotu, bude Náhled tisku jako výchozí cíl používat naposledy použitou tiskárnu. Pokud aktivujete toto nastavení, bude Náhled tisku jako výchozí cíl používat výchozí tiskárnu systému.</translation> -<translation id="2867699958489427143">Pokud je verze operačního systému novější než cílová verze, vrátit se zpět k cílové verzi a zachovat ji. Během tohoto procesu provést úplné vyčištění Powerwash.</translation> <translation id="2872961005593481000">Vypnout</translation> <translation id="2874209944580848064">Poznámka ohledně zařízení se systémem <ph name="PRODUCT_OS_NAME" />, která podporují aplikace pro Android:</translation> <translation id="2877225735001246144">Deaktivovat vyhledání záznamů CNAME při vyjednávání ověření protokolu Kerberos</translation> @@ -938,7 +943,6 @@ <translation id="3711895659073496551">Pozastavit</translation> <translation id="3715569262675717862">Ověřování založené na certifikátech klientů</translation> <translation id="3736879847913515635">Povolit přidání osoby ve správci uživatelů</translation> -<translation id="3737544779868348650">Název hostitele používaný pro zařízení v síti</translation> <translation id="3746590506846867985"> 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í. @@ -1050,6 +1054,7 @@ Každý záznam v seznamu obsahuje adresář, který musí zahrnovat ID rozšíření v poli „extension-id“ a jeho webovou adresu pro aktualizace v poli „update-url“.</translation> <translation id="3874773863217952418">Aktivovat funkci Vyhledání klepnutím</translation> <translation id="3877517141460819966">Režim integrovaného dvoufaktorového ověření</translation> +<translation id="3879208481373875102">Konfigurace seznamu webových aplikací s vynucenou instalací</translation> <translation id="388237772682176890">Ve verzi M53 byla podpora této zásady ukončena a ve verzi M54 byla tato zásada zcela odstraněna, protože byla odstraněna podpora protokolu SPDY/3.1. Zakáže v prohlížeči <ph name="PRODUCT_NAME" /> použití protokolu SPDY. @@ -1291,6 +1296,10 @@ Úplný popis možných nastavení a struktury této zásady najdete na stránce https://www.chromium.org/administrators/policy-list-3/extension-settings-full. </translation> <translation id="4554651132977135445">Režim zpracování zásad pro uživatele (loopback)</translation> +<translation id="4554841826517980623">Tato zásada určuje, zda smí funkce sdílení síťových položek prohlížeče <ph name="PRODUCT_NAME" /> rozpoznávat sdílení v síti pomocí protokolu <ph name="NETBIOS_PROTOCOL" />. + Je-li tato zásada nastavena na hodnotu true, při rozpoznávání sdílení v síti bude používán protokol <ph name="NETBIOS_PROTOCOL" />. + Je-li tato zásada nastavena na hodnotu false, při rozpoznávání sdílení nebude protokol <ph name="NETBIOS_PROTOCOL" /> používán. + Pokud tato zásada není nastavena, ve výchozím nastavení je pro spravované uživatele zakázána a pro nespravované uživatele povolena.</translation> <translation id="4555850956567117258">Aktivuje vzdálené ověření identity uživatele</translation> <translation id="4557134566541205630">Výchozí adresa URL stránky nové karty poskytovatele vyhledávání</translation> <translation id="4567137030726189378">Povolit použití Nástrojů pro vývojáře</translation> @@ -1710,6 +1719,7 @@ Pokud tuto zásadu nenastavíte, bude při prvním zobrazení přihlašovací obrazovky hlasová odezva deaktivována. Uživatelé budou moci hlasovou odezvu kdykoli aktivovat nebo deaktivovat a zvolený stav na přihlašovací obrazovce přetrvá i u jiných uživatelů.</translation> <translation id="5868414965372171132">Konfigurace sítě na úrovni uživatele</translation> +<translation id="5879014913445067283">Ovládání rozpoznávání sdílení síťových položek prostřednictvím rozhraní <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Výchozí nastavení souborů cookie</translation> <translation id="5887414688706570295">Slouží ke konfiguraci předpony TalkGadget, kterou budou používat hostitelé vzdáleného přístupu, a brání uživatelům, aby ji změnili. @@ -2159,6 +2169,17 @@ Není-li nastavena, může se uživatelům zobrazit výzva, zda chtějí záložky importovat, nebo může import probíhat automaticky.</translation> <translation id="7063895219334505671">Povolit na těchto stránkách vyskakovací okna</translation> +<translation id="706568410943497889"> + Je-li zásada nastavena na hodnotu true, má <ph name="PRODUCT_NAME" /> povoleno shromažďovat protokoly událostí WebRTC ze služeb Google (např. Google Meet) a nahrávat je do Googlu. + + Je-li zásada nastavena na hodnotu false nebo je ponechána nenastavená, prohlížeč <ph name="PRODUCT_NAME" /> takové protokoly shromažďovat ani nahrávat nesmí. + + Tyto protokoly obsahují diagnostické údaje, které jsou užitečné při odstraňování problémů s audio nebo videohovory v Chromu, jako je čas a velikost odeslaných a přijatých paketů RTP, zpětná vazba ohledně zahlcení sítě a metadata ohledně času a kvality snímků zvuku a videa. Protokoly neobsahují zvukový ani obrazový obsah z hovoru. + + Toto shromažďování dat Chromem mohou spustit pouze webové služby Googlu, například Google Hangouts nebo Google Meet. + + Kvůli snazšímu ladění může Google tyto protokoly prostřednictvím ID relace přidružit k jiným protokolům shromažďovaným samotnou službou Google. + </translation> <translation id="706669471845501145">Povolit webovým stránkám zobrazovat oznámení na ploše</translation> <translation id="7072208053150563108">Frekvence změny hesla počítače</translation> <translation id="7074513465313721551">Konfiguruje seznam domén, kterým bude Bezpečné prohlížení důvěřovat: @@ -2292,6 +2313,9 @@ <translation id="7336878834592315572">Uchovat soubory cookie po dobu trvání relace</translation> <translation id="7340034977315324840">Hlásit časy aktivity zařízení</translation> <translation id="7343497214039883642">Konfigurační soubor podnikových tiskáren pro zařízení</translation> +<translation id="7349338075015720646">Určuje seznam webových stránek, které se instalují na pozadí bez zásahu uživatele a které uživatel nemůže odinstalovat ani deaktivovat. + + Každá položka v seznamu zásady je objekt se dvěma členy: „url“ a „launch_container“. „url“ má být adresa URL webové aplikace k instalaci a „launch_container“ má být buď „window“ (okno) nebo „tab“ (karta), aby bylo zadáno, jak bude webová aplikace po nainstalování otevřena. Pokud člen „launch_container“ vynecháte, aplikace se spustí v okně, jestliže Chrome vyhodnotí, že se jedná o progresivní webovou aplikaci, a v ostatních případech se spustí na kartě.</translation> <translation id="7367028210010532881">Když uživatel přejde na web, který je označen jako potenciálně škodlivý, zobrazí služba Bezpečné prohlížení stránku s upozorněním. Aktivace tohoto nastavení zabrání uživatelům pokračovat ze stránky s upozorněním na škodlivý web. Pokud je toto nastavení deaktivováno nebo není nakonfigurováno, uživatelé mohou po zobrazení upozornění pokračovat na nahlášený web. @@ -2736,6 +2760,7 @@ Verzí v tomto případě může být přesná verze, například „61.0.3163.120“, nebo předpona verze, například „61.0“ </translation> <translation id="8544375438507658205">Výchozí modul vykreslení HTML pro plugin <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Povolení synchronizace zpráv SMS z telefonu do Chromebooku.</translation> <translation id="8549772397068118889">Při návštěvě webů mimo obsahové balíčky zobrazit upozornění</translation> <translation id="8566842294717252664">Skrýt internetový obchod z karty Nová stránka a ze spouštěče aplikací</translation> <translation id="8586528890725660268">Určuje, které tiskárny uživatel nesmí používat. @@ -2780,6 +2805,11 @@ Pokud tuto zásadu ponecháte nenastavenou, bude služba pro ochranu hesel chránit pouze hesla Google, ale uživatel toto nastavení bude moci změnit.</translation> <translation id="8672321184841719703">Cílová verze automatické aktualizace</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Umožňuje nastavit dobu v milisekundách, po kterou se uživatelům bude zobrazovat oznámení, že je třeba prohlížeč <ph name="PRODUCT_NAME" /> nebo zařízení se systémem <ph name="PRODUCT_OS_NAME" /> restartovat, aby bylo možné nainstalovat čekající aktualizaci. + + Během této doby bude uživatel opakovaně informován, že je potřeba nainstalovat aktualizaci. Na zařízeních se systémem <ph name="PRODUCT_OS_NAME" /> se oznámení o restartu zobrazuje na hlavním panelu systému, když je zjištěn upgrade. V prohlížečích <ph name="PRODUCT_NAME" /> se po uplynutí jedné třetiny lhůty pro oznámení změní nabídka aplikace na znamení, že je prohlížeč potřeba aktualizovat. Barva tohoto oznámení se změní po uplynutí dvou třetin lhůty a poté znovu po uplynutí celé lhůty. Další oznámení aktivovaná pomocí zásady <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> se řídí stejným časovým plánem. + + Pokud tuto zásadu nenastavíte, použije se pro systém <ph name="PRODUCT_OS_NAME" /> výchozí doba 345 600 000 milisekund (čtyři dny) a pro prohlížeč <ph name="PRODUCT_NAME" /> 604 800 000 milisekund (jeden týden).</translation> <translation id="8685024486845674965">Ochrana hesla – upozornění je spouštěno opětovným použitím hesla</translation> <translation id="8693243869659262736">Použít integrovaného klienta DNS</translation> <translation id="8704831857353097849">Seznam deaktivovaných pluginů</translation> @@ -2824,6 +2854,7 @@ Hodnota prodloužení musí být 100 % nebo více. Hodnoty, které by prodlevu ztmavení obrazovky oproti výchozí hodnotě zkrátily, nejsou povoleny.</translation> <translation id="8798099450830957504">Výchozí</translation> +<translation id="8801680448782904838">Oznamovat uživateli, že je doporučen nebo vyžadován restart prohlížeče nebo zařízení</translation> <translation id="8818173863808665831">Oznámí zeměpisnou polohu zařízení. Pokud tato zásada není nastavena, nebo je nastavena na hodnotu false, poloha oznamována nebude.</translation> @@ -2970,6 +3001,11 @@ Pokud je tato zásada nastavena na hodnotu true a uživatel vypne zařízení, spustí systém <ph name="PRODUCT_OS_NAME" /> restart. Systém <ph name="PRODUCT_OS_NAME" /> nahradí všechna tlačítka pro vypnutí v uživatelském rozhraní tlačítky pro restart. Pokud uživatel zařízení vypne pomocí vypínače, zařízení se automaticky restartovat nebude, a to ani v případě, že je tato zásada aktivována.</translation> <translation id="9152473318295429890">Povolit kontextové návrhy souvisejících webových stránek</translation> <translation id="9158929520101169054">Povolit v prohlížeči vícenásobné přihlášení</translation> +<translation id="9159126470527871268">Oznamuje uživateli, že je třeba restartovat prohlížeč <ph name="PRODUCT_NAME" /> nebo systém <ph name="PRODUCT_OS_NAME" />, aby bylo možné nainstalovat čekající aktualizaci. + + Toto nastavení zásady umožňuje, aby byl uživatel prostřednictvím oznámení informován, že je doporučeno nebo nutno restartovat prohlížeč nebo zařízení. Pokud zásada nebude nastavena, prohlížeč <ph name="PRODUCT_NAME" /> o potřebném restartování informuje uživatele pomocí drobných změn v nabídce, zatímco systém <ph name="PRODUCT_OS_NAME" /> o něm informuje prostřednictvím oznámení v hlavním panel systému. Pokud je nastavena na hodnotu Doporučeno, bude se uživateli opakovaně zobrazovat upozornění, že je doporučen restart. Uživatel upozornění může odmítnout a tím restart odložit. Pokud je nastavena na hodnotu Povinné, bude se uživateli opakovaně zobrazovat upozornění, že po uplynutí lhůty pro oznámení bude vynucen restart prohlížeče. Výchozí lhůta je u prohlížeče <ph name="PRODUCT_NAME" /> sedm dní, u systému <ph name="PRODUCT_OS_NAME" /> čtyři dny a lze ji nakonfigurovat nastavením zásady <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Relace uživatele bude po restartování obnovena.</translation> <translation id="9165792353046089850">Umožňuje nastavit, zda weby mají povoleno získat přístup k připojeným zařízením USB. Přístup lze zcela zablokovat, nebo je možné uživatele požádat pokaždé, když chce web k připojeným zařízením USB získat přístup. Tuto zásadu lze pro konkrétní vzory adres URL přepsat pomocí zásad WebUsbAskForUrls a WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 7c7699d..aa16e29b 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -339,6 +339,7 @@ <translation id="199764499252435679">Aktivér komponentopdateringer i <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Strømstyring</translation> <translation id="201557587962247231">Hyppighed for upload af rapporter om enhedsstatus</translation> +<translation id="2017301949684549118">Webadresser til webapps skal installeres lydløst.</translation> <translation id="2018836497795982119">Angiver den periode i millisekunder, hvor enhedsadministrationstjenesten anmodes om brugerpolitikoplysninger. Angivelse af denne politik tilsidesætter standardværdien på tre timer. Gyldige værdier for denne politik ligger i intervallet fra 1800000 (30 minutter) til 86400000 (ét døgn). Alle værdier, der ikke ligger inden for dette interval, fastgøres til den respektive grænse. Hvis platformen understøtter underretninger vedrørende politik, angives forsinkelsen af opdateringen til 24 timer, da det forventes, at underretninger vedrørende politik automatisk gennemtvinger en opdatering, når politikken ændres. @@ -641,6 +642,11 @@ Googles søgewebadresse kan angives som: <ph name="GOOGLE_SEARCH_URL" />. Denne indstilling skal aktiveres, når politikken "DefaultSearchProviderEnabled" er aktiveret, og den vil kun blive respekteret, hvis dette er tilfældet.</translation> +<translation id="2659019163577049044">Hvis denne indstilling aktiveres, kan brugerne konfigurere deres enheder for at synkronisere sms-beskeder mellem deres telefoner og Chromebooks. Bemærk! Hvis denne politik tillades, skal brugerne udtrykkeligt tilmelde sig denne funktion ved at gennemføre en konfiguration. Når konfigurationen er gennemført, kan brugerne sende og modtage sms-beskeder på deres Chromebooks. + + Hvis denne indstilling deaktiveres, kan brugerne ikke konfigurere synkronisering af sms-beskeder. + + Hvis politikken ikke konfigureres, tillades den som standard ikke for administrerede brugere, mens den som standard tillades for ikke-administrerede brugere.</translation> <translation id="2660846099862559570">Brug aldrig en proxy</translation> <translation id="267596348720209223">Angiver tegnkodninger, der understøttes af søgemaskinen. Kodninger er tegntabelnavne såsom UTF-8, GB2312, og ISO-8859-1. De afprøves i den angivne rækkefølge. Denne politik er valgfri. Hvis den ikke er angivet, anvendes standarden, UTF-8. Denne politik respekteres kun, hvis politikken "DefaultSearchProviderEnabled" er aktiveret.</translation> <translation id="268577405881275241">Aktivér proxyfunktionen for datakomprimering</translation> @@ -707,7 +713,6 @@ Hvis du deaktiverer denne indstilling eller ikke angiver en værdi, benytter Vis udskrift den senest brugte printer som standarddestination. Hvis du aktiverer denne indstilling, benytter Vis udskrift operativsystemets standardprinter som standarddestination.</translation> -<translation id="2867699958489427143">Gå tilbage til og behold målversionen, hvis OS-versionen er nyere end målversionen. Foretag en fuldstændig powerwash under processen.</translation> <translation id="2872961005593481000">Sluk</translation> <translation id="2874209944580848064">Bemærkning om <ph name="PRODUCT_OS_NAME" />-enheder, der understøtter Android-apps:</translation> <translation id="2877225735001246144">Deaktiver CNAME-opslag, når godkendelsen af Kerberos forhandles</translation> @@ -946,7 +951,6 @@ <translation id="3711895659073496551">Suspender</translation> <translation id="3715569262675717862">Godkendelse på baggrund af klientcertifikater</translation> <translation id="3736879847913515635">Aktivér tilføjelse af personer i brugeradministration</translation> -<translation id="3737544779868348650">Enhedens hostname på netværket</translation> <translation id="3746590506846867985"> 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 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/. @@ -1059,6 +1063,7 @@ Alle poster på listen indeholder en ordbog, der skal indeholde udvidelses-id'et i feltet "udvidelses-id" samt webadressen til opdatering i feltet "opdateringswebadresse".</translation> <translation id="3874773863217952418">Aktivér "Tryk for at søge"</translation> <translation id="3877517141460819966">Integreret godkendelsestilstand med sekundær faktor</translation> +<translation id="3879208481373875102">Konfigurer en liste over fjerninstallerede webapps</translation> <translation id="388237772682176890">Denne politik er udfaset i M53 og fjernet i M54, da understøttelse af SPDY/3.1 er fjernet. Deaktiverer brug af SPDY-protokollen i <ph name="PRODUCT_NAME" />. @@ -1292,6 +1297,10 @@ Du kan få en komplet beskrivelse af mulige indstillinger og mulig struktur for denne politik på https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Brugerpolitik for tilstand til behandling via loopback</translation> +<translation id="4554841826517980623">Denne politik bestemmer, om funktionen Fildeling via netværk for <ph name="PRODUCT_NAME" /> anvender <ph name="NETBIOS_PROTOCOL" /> til at registrere deling på netværket. + Når politikken er angivet som Sand, anvendes protokollen <ph name="NETBIOS_PROTOCOL" /> til at registrere deling på netværket. + Når politikken er angivet som Falsk, anvendes protokollen <ph name="NETBIOS_PROTOCOL" /> ikke til at registrere deling. + Hvis politikken ikke konfigureres, er den som standard deaktiveret for virksomhedsadministrerede brugere, mens den som standard er aktiveret for ikke-administrerede brugere.</translation> <translation id="4555850956567117258">Aktivér fjernattestering for brugeren</translation> <translation id="4557134566541205630">Webadresse for siden Ny fane i standardsøgemaskinen</translation> <translation id="4567137030726189378">Tillad brug af Udviklerværktøjer</translation> @@ -1685,6 +1694,7 @@ Hvis denne politik ikke angives, deaktiveres talefeedback, når loginskærmen vises første gang. Brugerne kan når som helst aktivere eller deaktivere talefeedback, og dens status på loginskærmen fastholdes hos brugerne.</translation> <translation id="5868414965372171132">Netværkskonfiguration på brugerniveau</translation> +<translation id="5879014913445067283">Kontrollerer registrering for Fildeling via netværk via <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Standardindstilling for cookies</translation> <translation id="5887414688706570295">Konfigurerer det TalkGadget-præfiks, der anvendes af værter med fjernadgang, og forhindrer brugere i at ændre det. @@ -2119,6 +2129,17 @@ <translation id="7049373494483449255">Gør det muligt for <ph name="PRODUCT_NAME" /> at sende dokumenter til <ph name="CLOUD_PRINT_NAME" /> til udskrivning. BEMÆRK! Dette påvirker kun understøttelse af <ph name="CLOUD_PRINT_NAME" /> i <ph name="PRODUCT_NAME" />. Det forhindrer ikke brugerne i at sende udskriftsjob på websites. Hvis denne indstilling er aktiveret eller ikke er konfigureret, kan brugerne udskrive til <ph name="CLOUD_PRINT_NAME" /> via dialogboksen for udskrivning i <ph name="PRODUCT_NAME" />. Hvis denne indstilling er deaktiveret, kan brugerne ikke udskrive til <ph name="CLOUD_PRINT_NAME" /> via dialogboksen for udskrivning i <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">Denne politik påtvinger import af bogmærker fra den nuværende standardbrowser, hvis det er aktiveret. Hvis det er aktiveret, påvirker denne politik også importdialogboksen. Hvis det er deaktiveret, importeres der ingen bogmærker. Hvis den ikke er angivet, kan brugeren blive bedt om at importere, eller importen kan ske automatisk.</translation> <translation id="7063895219334505671">Tillad pop op-vinduer på disse websites</translation> +<translation id="706568410943497889"> + Hvis politikken er angivet som sand, har <ph name="PRODUCT_NAME" /> tilladelse til at indsamle WebRTC-hændelseslogfiler fra Google-tjenester (f.eks. Google Meet) og uploade de pågældende logfiler til Google. + + Hvis politikken er angivet som falsk eller ikke er angivet, må <ph name="PRODUCT_NAME" /> ikke indsamle eller uploade sådanne logfiler. + + Disse logfiler indeholder diagnosticeringsoplysninger, som er nyttige i forbindelse med fejlretning af problemer med lyd- og videoopkald i Chrome, f.eks. tidspunkt for og størrelsen på sendte og modtagne RTP-pakker, feedback om belastning af netværket samt metadata om varigheden og kvaliteten af lyd- og videorammer. Logfilerne omfatter ikke lyd- eller videoindhold fra opkald. + + Denne dataindsamling af Chrome kan kun aktiveres af Google-webtjenester såsom Google Hangouts eller Google Meet. + + Google kan ved hjælp af et sessions-id knytte disse logfiler til andre logfiler, der er indsamlet af selve Google-tjenesten. Dette kan gøre fejlretningen nemmere. + </translation> <translation id="706669471845501145">Tillad, at websites viser skrivebordsunderretninger</translation> <translation id="7072208053150563108">Hvor ofte computeradgangskoden skiftes</translation> <translation id="7074513465313721551">Konfigurer listen over domæner, som Beskyttet browsing skal have tillid til. Dette betyder følgende: @@ -2252,6 +2273,9 @@ <translation id="7336878834592315572">Behold cookies under sessionen</translation> <translation id="7340034977315324840">Rapportér tidspunkter for aktiviteter på enheden</translation> <translation id="7343497214039883642">Fil til konfiguration af virksomhedsprintere for enheder</translation> +<translation id="7349338075015720646">Angiver en liste over websites, som installeres lydløst uden brugerinteraktion, og som ikke kan afinstalleres af brugeren. + + Hvert listepunkt i politikken er et objekt med to medlemmer: "url" og "launch_container". "url" bør være webadressen til den webapp, der skal installeres, og "launch_container" bør enten være "window" eller "tab" for at indikere, hvordan webappen åbnes, når den er installeret. Hvis "launch_container" udelades, åbnes appen i et vindue, hvis Chrome betragter den som en progressiv webapp, og ellers åbnes den på en fane.</translation> <translation id="7367028210010532881">Tjenesten Beskyttet browsing viser en advarselsside, når brugerne går til websites, der er rapporteret som potentielt skadelige. Denne indstilling forhindrer brugerne i at fortsætte fra advarselssiden til det skadelige website. Hvis denne indstilling er deaktiveret eller ikke er angivet, kan brugerne vælge at gå til det rapporterede website, efter advarslen er blevet vist. @@ -2696,6 +2720,7 @@ Her kan "Version" være enten en eksakt version såsom "61.0.3163.120" eller et præfiks for versionen, f.eks. "61.0" </translation> <translation id="8544375438507658205">Standard HTML-gengivelse for <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Tillad, at sms-beskeder synkroniseres mellem telefon og Chromebook.</translation> <translation id="8549772397068118889">Vis en advarsel, når du er på websites uden for indholdspakkerne</translation> <translation id="8566842294717252664">Skjul webshoppen fra siden Ny fane og applisten</translation> <translation id="8586528890725660268">Angiver, hvilke printere en bruger ikke kan anvende. @@ -2740,6 +2765,11 @@ Hvis politikken ikke er indstillet, beskytter adgangskodebeskyttelse kun Google-adgangskoder, men brugeren kan ændre denne indstilling.</translation> <translation id="8672321184841719703">Målversion for automatiske opdateringer</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Giver dig mulighed for at angive et tidsrum i millisekunder, hvor brugerne underrettes om, at <ph name="PRODUCT_NAME" /> eller en <ph name="PRODUCT_OS_NAME" />-enhed skal genstartes for at anvende en afventende opdatering. + + I dette tidsrum informeres brugeren gentagne gange om nødvendigheden af en opdatering. Når der registreres en opdatering til <ph name="PRODUCT_OS_NAME" />-enheder, vises en underretning om genstart i systembakken. For <ph name="PRODUCT_NAME" />-browsere ændres appmenuen for at vise, at genstart er nødvendig, når en tredjedel af underretningsperioden er gået. Underretningen skifter farve, når to tredjedele af underretningsperioden er gået, og igen når hele underretningsperioden er udløbet. De yderligere underretninger, der aktiveres af politikken <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, følger samme tidsplan. + + Hvis politikken ikke konfigureres, anvendes standardtidsrummet på 345600000 millisekunder (fire dage) for <ph name="PRODUCT_OS_NAME" /> -enheder og 604800000 millisekunder (én uge) for <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Advarsler via adgangskodebeskyttelse udløses ved genbrug af adgangskoder</translation> <translation id="8693243869659262736">Brug den indbyggede DNS-klient</translation> <translation id="8704831857353097849">Liste over deaktiverede plugins</translation> @@ -2776,6 +2806,7 @@ Skaleringsfaktoren skal være 100 % eller mere. Værdier, der forkorter nedtoningsforsinkelsen på skærmen i præsentationstilstand i forhold til den normale nedtoningsforsinkelse, er ikke tilladt.</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8801680448782904838">Underret en bruger om, at genstart af browseren eller enheden anbefales eller påkræves</translation> <translation id="8818173863808665831">Rapportér enhedens geografiske placering. Hvis politikken ikke er angivet eller angivet til falsk, rapporteres placeringen ikke.</translation> @@ -2917,6 +2948,11 @@ Hvis denne politik er angivet til Sand, aktiverer <ph name="PRODUCT_OS_NAME" /> en genstart, når brugeren lukker enheden ned. <ph name="PRODUCT_OS_NAME" /> erstatter alle forekomster af Luk-knapper i grænsefladen med genstartsknapper. Hvis brugeren lukker enheden ved hjælp af afbryderknappen, genstartes den ikke automatisk, selvom politikken er aktiveret.</translation> <translation id="9152473318295429890">Aktivér indholdsbestemte forslag for relaterede websider</translation> <translation id="9158929520101169054">Tillad samlet login fra flere konti i browseren</translation> +<translation id="9159126470527871268">Underretter brugeren om, at <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" /> skal genstartes for at anvende en afventende opdatering. + + Denne politikindstilling aktiverer underretninger, som anbefaler eller kræver, at brugeren genstarter browseren eller enheden. Hvis politikken ikke angives, indikerer <ph name="PRODUCT_NAME" /> over for brugeren via diskrete ændringer af menuen, at en genstart er nødvendig, mens <ph name="PRODUCT_OS_NAME" /> indikerer det samme via en underretning i systembakken. Hvis "Anbefales" angives for politikken, får brugeren vist en fast advarsel med en anbefaling om, at browseren genstartes. Brugeren kan afvise advarslen for at udskyde genstarten. Hvis "Påkrævet" angives for politikken, får brugeren vist en fast advarsel, som indikerer, at der gennemtvinges en genstart af browseren, når underretningsperioden er udløbet. Denne periode er som standard syv dage for <ph name="PRODUCT_NAME" /> og fire dage for <ph name="PRODUCT_OS_NAME" />, og den kan konfigureres via politikindstillingen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Brugerens session genoprettes efter genstarten.</translation> <translation id="9165792353046089850">Giver dig mulighed for at angive, om websites må få adgang til tilsluttede USB-enheder. Adgangen kan være fuldstændig blokeret, eller brugeren kan blive spurgt, hver gang et website vil have adgang til tilsluttede USB-enheder. Denne politik kan tilsidesættes for bestemte webadressemønstre ved hjælp af politikkerne "WebUsbAskForUrls" og "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index a2b69645..bb703d5 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -344,6 +344,7 @@ <translation id="199764499252435679">Komponentenupdates in <ph name="PRODUCT_NAME" /> aktivieren</translation> <translation id="2006530844219044261">Energieverwaltung</translation> <translation id="201557587962247231">Häufigkeit von Uploads mit Berichten zum Gerätestatus</translation> +<translation id="2017301949684549118">Ohne Nutzereingriff zu installierende URLs für Web-Apps.</translation> <translation id="2018836497795982119">Gibt den Zeitraum in Millisekunden an, in dem Nutzerrichtlinieninformationen vom Geräteverwaltungsdienst abgefragt werden. Durch das Festlegen dieser Richtlinie wird der Standardwert von 3 Stunden außer Kraft gesetzt. Gültige Werte für diese Richtlinie liegen im Bereich zwischen 1.800.000 (30 Minuten) und 86.400.000 (1 Tag). Alle Werte, die nicht in diesem Bereich liegen, werden auf den jeweiligen Grenzwert gesetzt. Wenn die Plattform Richtlinienbenachrichtigungen unterstützt, wird für die Verzögerung der Aktualisierung 24 Stunden festgelegt, da davon ausgegangen wird, dass diese Benachrichtigungen bei jeglichen Richtlinienänderungen automatisch eine Aktualisierung erzwingen. @@ -647,6 +648,11 @@ Die URL für die Google-Suche kann wie folgt angegeben werden: <ph name="GOOGLE_SEARCH_URL" />. Diese Option muss festgelegt werden, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist, und wird auch nur dann beachtet.</translation> +<translation id="2659019163577049044">Wenn diese Einstellung aktiviert ist, können Nutzer ihre Geräte so einrichten, dass SMS zwischen ihrem Smartphone und Chromebook synchronisiert werden. Wird diese Richtlinie festgelegt, müssen sich Nutzer ausdrücklich für diese Funktion anmelden, indem sie einen Einrichtungsvorgang ausführen. Danach können Nutzer SMS auf ihren Chromebooks senden und empfangen. + + Wenn diese Einstellung deaktiviert ist, dürfen Nutzer die SMS-Synchronisierung nicht einrichten. + + Falls die Richtlinie nicht konfiguriert ist, kommt die Standardeinstellung zum Einsatz, bei der die Funktion von verwalteten Nutzern nicht verwendet und von nicht verwalteten Nutzern verwendet werden kann.</translation> <translation id="2660846099862559570">Nie Proxy verwenden</translation> <translation id="267596348720209223">Gibt die vom Suchanbieter unterstützten Zeichencodierungen an. Codierungen sind Codepage-Namen wie UTF-8, GB2312 und ISO-8859-1. Sie werden in der Reihenfolge durchprobiert, in der sie angegeben werden. Diese Richtlinie ist optional. Ist sie nicht konfiguriert, so kommt der Standardwert UTF-8 zum Einsatz. Diese Richtlinie wird nur umgesetzt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation> <translation id="268577405881275241">Funktion für Datenkomprimierungs-Proxy aktivieren</translation> @@ -713,7 +719,6 @@ Wenn Sie diese Einstellung deaktivieren oder keinen Wert festlegen, wird für die Druckvorschau der zuletzt genutzte Drucker als Standarddrucker verwendet. Ist diese Einstellung aktiviert, wird für die Druckvorschau der Standarddrucker des Betriebssystems als Standarddrucker ausgewählt.</translation> -<translation id="2867699958489427143">Führen Sie ein Rollback durch und bleiben Sie bei der Zielversion, falls die Version des Betriebssystems neuer ist als die der Zielversion. Außerdem sollten Sie während des Vorgangs einen vollständigen Powerwash durchführen.</translation> <translation id="2872961005593481000">Herunterfahren</translation> <translation id="2874209944580848064">Hinweis für <ph name="PRODUCT_OS_NAME" />-Geräte, die Android-Apps unterstützen:</translation> <translation id="2877225735001246144">CNAME-Suche bei der Aushandlung der Kerberos-Authentifizierung deaktivieren</translation> @@ -948,7 +953,6 @@ <translation id="3711895659073496551">Suspend-Modus</translation> <translation id="3715569262675717862">Authentifizierung auf Grundlage von Clientzertifikaten</translation> <translation id="3736879847913515635">"Person hinzufügen" im Nutzermanager aktivieren</translation> -<translation id="3737544779868348650">Hostname im Gerätenetzwerk</translation> <translation id="3746590506846867985"> Diese Richtlinie gilt für die Anmeldeseite. Bitte 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; wenn Sie z. B. https://example.com/ angeben, wird auch https://foo.example.com/ als Teil der Website https://example.com/ isoliert. @@ -1052,6 +1056,7 @@ Jeder Eintrag enthält ein Verzeichnis, in dem im Feld "extension-id" die Erweiterungs-ID und im Feld "update-url" die Aktualisierungs-URL angegeben werden müssen.</translation> <translation id="3874773863217952418">"Zum Suchen tippen" aktivieren</translation> <translation id="3877517141460819966">Integrierter Zwei-Faktor-Authentifizierungsmodus</translation> +<translation id="3879208481373875102">Liste der Web-Apps konfigurieren, deren Installation erzwungen wurde</translation> <translation id="388237772682176890">Da SPDY/3.1 nicht mehr unterstützt wird, wurde diese Richtlinie in M53 eingestellt und in M54 entfernt. Sie verhindert die Verwendung des SPDY-Protokolls in <ph name="PRODUCT_NAME" />. @@ -1287,6 +1292,10 @@ Eine vollständige Beschreibung möglicher Einstellungen und des Aufbaus dieser Richtlinie finden Sie unter https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Loopback-Verarbeitungsmodus der Nutzerrichtlinien</translation> +<translation id="4554841826517980623">Mit dieser Richtlinie wird gesteuert, ob die Funktion "Netzwerkfreigaben" für <ph name="PRODUCT_NAME" /> das <ph name="NETBIOS_PROTOCOL" /> nutzen sollte, um Inhaltsfreigaben im Netzwerk zu erkennen. + Wenn diese Richtlinie auf "true" eingestellt ist, verwendet die Freigabeerkennung das Protokoll <ph name="NETBIOS_PROTOCOL" />, um Freigaben im Netzwerk zu erkennen. + Wenn diese Richtlinie auf "false" eingestellt ist, verwendet die Freigabeerkennung nicht das Protokoll <ph name="NETBIOS_PROTOCOL" />, um Freigaben zu erkennen. + Wenn die Richtlinie nicht eingerichtet ist, kommt die Standardeinstellung zum Einsatz, bei der die Funktion für vom Unternehmen verwaltete Nutzer deaktiviert und für nicht verwaltete Nutzer aktiviert ist.</translation> <translation id="4555850956567117258">Remote-Bescheinigung (Remote Attestation) für den Nutzer aktivieren</translation> <translation id="4557134566541205630">Standardsuchanbieter-URL für die "Neuer Tab"-Seite</translation> <translation id="4567137030726189378">Nutzung der Entwicklertools zulassen</translation> @@ -1682,6 +1691,7 @@ Falls diese Richtlinie nicht konfiguriert wird, ist das gesprochene Feedback deaktiviert, wenn die Anmeldeseite das erste Mal angezeigt wird. Die Nutzer können das gesprochene Feedback jederzeit aktivieren oder deaktivieren und dieser Status bleibt auf der Anmeldeseite erhalten.</translation> <translation id="5868414965372171132">Netzwerkkonfiguration auf Nutzerebene</translation> +<translation id="5879014913445067283">Steuerung der Erkennung von Netzwerkfreigaben über <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Standardeinstellungen für Cookies</translation> <translation id="5887414688706570295">Konfiguriert das TalkGadget-Präfix, das von Remotezugriff-Hosts verwendet wird, und verhindert, dass dieses von Nutzern geändert werden kann. @@ -2125,6 +2135,17 @@ <translation id="7049373494483449255">Ermöglicht es <ph name="PRODUCT_NAME" />, Dokumente zum Drucken an <ph name="CLOUD_PRINT_NAME" /> zu senden. Hinweis: Dies wirkt sich nur auf die <ph name="CLOUD_PRINT_NAME" />-Unterstützung in <ph name="PRODUCT_NAME" /> aus. Die Richtlinie verhindert nicht, dass Nutzer Druckaufträge auf Websites geben. Wenn diese Einstellung aktiviert oder nicht konfiguriert ist, können Nutzer im <ph name="PRODUCT_NAME" />-Druckdialog über <ph name="CLOUD_PRINT_NAME" /> drucken. Sollte die Einstellung deaktiviert sein, können Nutzer im <ph name="PRODUCT_NAME" />-Druckdialog über <ph name="CLOUD_PRINT_NAME" /> nicht drucken.</translation> <translation id="7053678646221257043">Bei Aktivierung erzwingt diese Richtlinie, dass die Lesezeichen vom aktuellen Standardbrowser importiert werden. Wenn Sie deaktiviert ist, werden keine Lesezeichen importiert. Sollte Sie nicht konfiguriert sein, wird der Nutzer gefragt, ob ein Import erfolgen soll, oder der Import findet automatisch statt.</translation> <translation id="7063895219334505671">Pop-ups auf diesen Websites zulassen</translation> +<translation id="706568410943497889"> + Wenn diese Richtlinie auf "true" gesetzt ist, darf <ph name="PRODUCT_NAME" /> WebRTC-Ereignisprotokolle aus Google-Diensten, wie z. B. Hangouts Meet, speichern und die Protokolle bei Google hochladen. + + Ist die Richtlinie auf "false" gesetzt oder nicht festgelegt, darf <ph name="PRODUCT_NAME" /> solche Protokolle nicht speichern oder hochladen. + + Diese Protokolle enthalten Diagnoseinformationen, die bei der Fehlerbehebung bei Audio- oder Videoanrufen in Chrome hilfreich sein können. Dazu zählen die Uhrzeit und die Größe gesendeter und empfangener RTP-Pakete, Feedback zur Auslastung des Netzwerks und Metadaten zur Länge und Qualität von Audio- und Videoframes. Die Protokolle enthalten keine Audio- oder Videoinhalte aus dem Anruf. + + Das Erfassen dieser Daten kann nur von den Google-Webdiensten ausgelöst werden, etwa von Google Hangouts oder Hangouts Meet. + + Google kann diese Protokolle anhand einer Sitzungs-ID mit anderen Protokollen verknüpfen, die vom Google-Dienst selbst erstellt wurden. Dies dient dazu, Fehler leichter zu beheben. + </translation> <translation id="706669471845501145">Anzeige von Desktop-Benachrichtigungen durch Websites zulassen</translation> <translation id="7072208053150563108">Änderungsrate des Computerpassworts</translation> <translation id="7074513465313721551">Konfigurieren Sie die Liste der Domains, die von Safe Browsing als vertrauenswürdig eingestuft werden. Dies bedeutet: @@ -2256,6 +2277,9 @@ <translation id="7336878834592315572">Cookies für die Dauer der Sitzung beibehalten</translation> <translation id="7340034977315324840">Aktivitätszeit von Geräten melden</translation> <translation id="7343497214039883642">Unternehmensdrucker-Konfigurationsdatei für Geräte</translation> +<translation id="7349338075015720646">Hierdurch wird eine Liste von Websites festgelegt, die automatisch installiert werden, also ohne Interaktion des Nutzers, und die nicht wieder vom Nutzer deinstalliert werden können. + + Jedes Listenelement der Richtlinie ist ein Objekt mit zwei Teilen: "url" und "launch_container". Bei "url" handelt es sich um die URL der Web-App, die installiert werden soll. Der "Launch_container" sollte entweder ein Fenster oder ein Tab sein, um festzulegen, wie die Web-App nach der Installation geöffnet wird. Wird "launch_container" nicht festgelegt, wird die App in einem Fenster geöffnet, wenn sie von Chrome als progressive Web-App erachtet wird. Andernfalls wird sie in einem Tab geöffnet.</translation> <translation id="7367028210010532881">Der Safe Browsing-Dienst zeigt eine Seite mit einer Warnmeldung an, wenn Nutzer Websites aufrufen, die als potenziell schädlich eingestuft sind. Wenn diese Einstellung aktiviert ist, können Nutzer die schädliche Website nicht von der Hinweisseite aus besuchen. Ist die Einstellung deaktiviert oder nicht konfiguriert, können Nutzer zu der gekennzeichneten Website gehen, nachdem sie den Warnhinweis gesehen haben. @@ -2697,6 +2721,7 @@ Mit "Version" ist entweder eine exakte Versionsangabe wie "61.0.3163.120" oder ein Versionspräfix wie "61.0" gemeint. </translation> <translation id="8544375438507658205">Standardanwendung für HTML-Darstellung in <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Zulassen, dass SMS zwischen Smartphone mit Chromebook synchronisiert werden.</translation> <translation id="8549772397068118889">Vor dem Besuch von Websites außerhalb von Inhaltspaketen warnen</translation> <translation id="8566842294717252664">Web Store auf der "Neuer Tab"-Seite und im App Launcher ausblenden</translation> <translation id="8586528890725660268">Gibt die Drucker an, die ein Nutzer nicht verwenden kann. @@ -2741,6 +2766,11 @@ Ist diese Richtlinie nicht konfiguriert, schützt der Passwortschutzdienst nur Google-Passwörter, aber der Nutzer kann diese Einstellung ändern.</translation> <translation id="8672321184841719703">Automatische Aktualisierung auf Zielversion</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Mit dieser Einstellung kann der Zeitraum in Millisekunden festgelegt werden, in dem ein Nutzer benachrichtigt wird, dass <ph name="PRODUCT_NAME" /> neu gestartet werden muss oder ein <ph name="PRODUCT_OS_NAME" />-Gerät neu gestartet werden muss, um ein ausstehendes Update durchzuführen. + + In diesem Zeitraum wird der Nutzer wiederholt darüber informiert, dass ein Update erforderlich ist. Auf <ph name="PRODUCT_OS_NAME" />-Geräten erscheint in der Taskleiste eine Neustartbenachrichtigung, wenn ein Upgrade gefunden wird. In <ph name="PRODUCT_NAME" />-Browsern ändert sich das App-Menü, sobald ein Drittel des Benachrichtigungszeitraums vorüber ist, um anzuzeigen, dass ein Neustart nötig ist. Die Farbe dieser Benachrichtigung ändert sich, sobald zwei Drittel des Benachrichtigungszeitraums vergangen sind. Sie ändert sich noch einmal, wenn der gesamte Benachrichtigungszeitraum verstrichen ist. Für die zusätzlichen Benachrichtigungen, die über die Richtlinie "<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />" aktiviert werden, gilt derselbe Zeitplan. + + Wenn nichts festgelegt ist, wird für <ph name="PRODUCT_OS_NAME" />-Geräte der Standardzeitraum von 345.600.000 Millisekunden (vier Tagen) und für <ph name="PRODUCT_NAME" /> ein Zeitraum von 604.800.000 Millisekunden (einer Woche) verwendet.</translation> <translation id="8685024486845674965">Die Passwortschutzwarnung wird durch die Wiederverwendung eines Passworts ausgelöst</translation> <translation id="8693243869659262736">Integrierten DNS-Client verwenden</translation> <translation id="8704831857353097849">Liste der deaktivierten Plug-ins</translation> @@ -2777,6 +2807,7 @@ Der Skalierungsfaktor muss mindestens 100 % betragen. Werte, bei denen die Spanne für die Bildschirmabdunkelung im Präsentationsmodus kürzer wäre als regulär, sind nicht zulässig.</translation> <translation id="8798099450830957504">Standardeinstellung</translation> +<translation id="8801680448782904838">Nutzer benachrichtigen, dass ein Neustart des Browsers oder des Geräts empfohlen wird oder erforderlich ist</translation> <translation id="8818173863808665831">Meldet den Standort des Geräts. Wenn die Richtlinie nicht oder auf "False" festgelegt wird, wird der Standort nicht gemeldet.</translation> @@ -2934,6 +2965,11 @@ Ist diese Richtlinie auf "true" gesetzt, löst <ph name="PRODUCT_OS_NAME" /> einen Neustart aus, wenn der Nutzer das Gerät herunterfährt. <ph name="PRODUCT_OS_NAME" /> ersetzt alle Schaltflächen zum Herunterfahren auf der Benutzeroberfläche durch Schaltflächen zum Neustarten. Wenn der Nutzer das Gerät über die Ein-/Aus-Taste herunterfährt, wird es nicht automatisch neu gestartet, auch wenn die Richtlinie aktiviert ist.</translation> <translation id="9152473318295429890">Kontextbezogene Vorschläge ähnlicher Webseiten aktivieren</translation> <translation id="9158929520101169054">Mehrfachanmeldung im Browser zulassen</translation> +<translation id="9159126470527871268">Nutzer benachrichtigen, dass <ph name="PRODUCT_NAME" /> neu gestartet werden muss oder ein <ph name="PRODUCT_OS_NAME" />-Gerät neu gestartet werden muss, um ein ausstehendes Update durchzuführen. + + Mit dieser Richtlinieneinstellung kann der Nutzer durch Benachrichtigungen informiert werden, dass ein Neustart des Browsers oder des Geräts empfohlen wird oder erforderlich ist. Wenn die Richtlinie nicht festgelegt ist, wird dem Nutzer in <ph name="PRODUCT_NAME" /> durch kleinere Menüänderungen angezeigt, dass ein Neustart erforderlich ist. In <ph name="PRODUCT_OS_NAME" /> wird dies über eine Benachrichtigung in der Taskleiste angezeigt. Wenn die Richtlinie auf "Recommended" (Empfohlen) festgelegt ist, wird dem Nutzer in einer wiederkehrenden Warnung angezeigt, dass ein Neustart empfohlen wird. Der Nutzer kann diese Warnung schließen, um den Neustart zu verschieben. Wenn die Richtlinie auf "Required" (Erforderlich) festgelegt ist, wird dem Nutzer in einer wiederkehrenden Warnung angezeigt, dass nach Ablauf des Benachrichtigungszeitraums ein Neustart des Browsers erzwungen wird. Dieser Zeitraum beträgt standardmäßig sieben Tage für <ph name="PRODUCT_NAME" /> und vier Tage für <ph name="PRODUCT_OS_NAME" /> und kann über die <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />-Richtlinieneinstellung konfiguriert werden. + + Nach dem Neustart wird die Sitzung des Nutzers wiederhergestellt.</translation> <translation id="9165792353046089850">Mit dieser Richtlinie können Sie festlegen, ob Websites Zugriff auf angeschlossene USB-Geräte erhalten. Der Zugriff kann vollständig blockiert werden oder der Nutzer wird jedes Mal gefragt, wenn eine Website auf angeschlossene USB-Geräte zugreifen möchte. Diese Richtlinie kann für spezifische URL-Muster mithilfe der Richtlinien "WebUsbAskForUrls" und "WebUsbBlockedForUrls" überschrieben werden.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 5298922..556a047 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -356,6 +356,7 @@ <translation id="199764499252435679">Ενεργοποιεί ενημερώσεις στοιχείων στο <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Διαχείριση ενέργειας</translation> <translation id="201557587962247231">Συχνότητα των μεταφορτώσεων αναφορών κατάστασης συσκευής</translation> +<translation id="2017301949684549118">URL για εφαρμογές ιστού που θα εγκατασταθούν αθόρυβα.</translation> <translation id="2018836497795982119">Καθορίζει το χρονικό διάστημα σε χιλιοστά του δευτερολέπτου κατά το οποίο υποβάλλονται ερωτήματα στην υπηρεσία διαχείρισης της συσκευής σχετικά με τις πληροφορίες πολιτικής χρήστη. Η ρύθμιση αυτής της πολιτικής παρακάμπτει την προεπιλεγμένη τιμή των 3 ωρών. Οι έγκυρες τιμές γι' αυτήν την πολιτική κυμαίνονται εντός του εύρους από 1800000 (30 λεπτά) έως 86400000 (1 ημέρα). Οποιεσδήποτε τιμές δεν ανήκουν σε αυτό το εύρος θα περιοριστούν στο αντίστοιχο όριο. Αν η πλατφόρμα υποστηρίζει ειδοποιήσεις πολιτικής, η καθυστέρηση ανανέωσης θα οριστεί σε 24 ώρες, επειδή αναμένεται ότι οι ειδοποιήσεις πολιτικής θα επιβάλλουν αυτόματη ανανέωση κάθε φορά που αλλάζει η πολιτική. @@ -669,6 +670,11 @@ Το URL αναζήτησης της Google μπορεί να καθοριστεί ως εξής: <ph name="GOOGLE_SEARCH_URL" />. Αυτή η επιλογή θα πρέπει να οριστεί όταν ενεργοποιηθεί η πολιτική "DefaultSearchProviderEnabled" και θα τηρείται μόνο σε αυτήν την περίπτωση.</translation> +<translation id="2659019163577049044">Εάν αυτή η ρύθμιση είναι ενεργοποιημένη, οι χρήστες θα επιτρέπεται να ρυθμίσουν τις συσκευές τους για το συγχρονισμό μηνυμάτων SMS μεταξύ των τηλεφώνων τους και των Chromebook που χρησιμοποιούν. Λάβετε υπόψη ότι εάν αυτή η πολιτική επιτραπεί, οι χρήστες θα πρέπει να συμμετάσχουν ρητά σε αυτήν τη λειτουργία ολοκληρώνοντας μια ροή ρύθμισης. Μόλις ολοκληρωθεί η ροή ρύθμισης, οι χρήστες θα μπορούν να στέλνουν και να λαμβάνουν μηνύματα SMS στα Chromebook. + + Εάν αυτή η ρύθμιση είναι απενεργοποιημένη, οι χρήστες δεν θα επιτρέπεται να ρυθμίσουν τον συγχρονισμό SMS. + + Εάν αυτή η πολιτική δεν οριστεί, η προεπιλογή δεν επιτρέπεται για διαχειριζόμενους χρήστες, αλλά επιτρέπεται για μη διαχειριζόμενους χρήστες.</translation> <translation id="2660846099862559570">Να μην γίνεται ποτέ χρήση διακομιστή μεσολάβησης</translation> <translation id="267596348720209223">Καθορίζει τις κωδικοποιήσεις χαρακτήρων που υποστηρίζονται από τον πάροχο αναζήτησης. Οι κωδικοποιήσεις είναι ονόματα κωδικών σελίδων όπως UTF-8, GB2312 και ISO-8859-1. Δοκιμάζονται με τη σειρά στην οποία παρέχονται. @@ -739,7 +745,6 @@ Εάν απενεργοποιήσετε αυτήν τη ρύθμιση ή δεν ορίσετε κάποια τιμή, η Προεπισκόπηση εκτύπωσης θα χρησιμοποιήσει τον εκτυπωτή που χρησιμοποιήθηκε πιο πρόσφατα ως προεπιλεγμένο προορισμό. Εάν ενεργοποιήσετε αυτήν τη ρύθμιση, η Προεπισκόπηση εκτύπωσης θα χρησιμοποιήσει τον προεπιλεγμένο εκτυπωτή του λειτουργικού συστήματος ως προεπιλεγμένο προορισμό.</translation> -<translation id="2867699958489427143">Κάντε επαναφορά και μείνετε στην έκδοση προορισμού εάν η έκδοση του λειτουργικού συστήματος είναι νεότερη από την έκδοση προορισμού. Εκτελέστε ένα πλήρες powerwash κατά τη διάρκεια της διαδικασίας.</translation> <translation id="2872961005593481000">Τερματισμός λειτουργίας</translation> <translation id="2874209944580848064">Σημείωση για συσκευές <ph name="PRODUCT_OS_NAME" /> που υποστηρίζουν εφαρμογές Android:</translation> <translation id="2877225735001246144">Απενεργοποίηση της αναζήτησης CNAME κατά τη διαπραγμάτευση του ελέγχου ταυτότητας Kerberos</translation> @@ -984,7 +989,6 @@ <translation id="3711895659073496551">Αναστολή</translation> <translation id="3715569262675717862">Έλεγχος ταυτότητας που βασίζεται σε πιστοποιητικά πελάτη</translation> <translation id="3736879847913515635">Ενεργοποίηση προσθήκης ατόμου στο Εργαλείο διαχείρισης χρηστών</translation> -<translation id="3737544779868348650">Όνομα κεντρικού υπολογιστή δικτύου συσκευής</translation> <translation id="3746590506846867985"> Αυτή η πολιτική ισχύει για την οθόνη σύνδεσης. Δείτε επίσης την πολιτική <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, η οποία ισχύει για την περίοδο σύνδεσης χρήστη. Συνιστάται να ορίσετε την ίδια τιμή και για τις δύο πολιτικές. Εάν οι τιμές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση κατά την είσοδο σε μια περίοδο σύνδεσης χρήστη όταν εφαρμόζεται η τιμή που προσδιορίζεται από την πολιτική χρήστη. Εάν η πολιτική είναι ενεργοποιημένη, καθεμία από τις καθορισμένες προελεύσεις σε μια @@ -1096,6 +1100,7 @@ Κάθε καταχώριση της λίστας περιέχει ένα λεξικό που θα πρέπει να περιλαμβάνει το αναγνωριστικό επέκτασης στο πεδίο "αναγνωριστικό επέκτασης" και τη διεύθυνση URL ενημέρωσης στο πεδίο "διεύθυνση url ενημέρωσης".</translation> <translation id="3874773863217952418">Ενεργοποίηση λειτουργίας "Πατήστε για αναζήτηση"</translation> <translation id="3877517141460819966">Ενσωματωμένη λειτουργία ελέγχου ταυτότητας δευτερεύοντα παράγοντα</translation> +<translation id="3879208481373875102">Διαμόρφωση της λίστας εφαρμογών ιστού των οποίων η εγκατάσταση έχει επιβληθεί</translation> <translation id="388237772682176890">Αυτή η πολιτική καταργήθηκε στο M53 και αφαιρέθηκε στο M54, επειδή καταργήθηκε η υποστήριξη SPDY/3.1. Απενεργοποιεί τη χρήση του πρωτοκόλλου SPDY στο προϊόν <ph name="PRODUCT_NAME" />. @@ -1340,6 +1345,10 @@ Για να δείτε μια πλήρη περιγραφή των πιθανών ρυθμίσεων και της δομής αυτής της πολιτικής, επισκεφτείτε τη διεύθυνση https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Λειτουργία επεξεργασίας βρόχου επιστροφής πολιτικής χρήστη</translation> +<translation id="4554841826517980623">Αυτή η πολιτική ελέγχει εάν η λειτουργία "Κοινόχρηστα αρχεία δικτύου" για το προϊόν <ph name="PRODUCT_NAME" /> θα πρέπει να χρησιμοποιεί το πρωτόκολλο <ph name="NETBIOS_PROTOCOL" /> για την ανακάλυψη κοινοποιήσεων στο δίκτυο. + Εάν αυτή η πολιτική οριστεί ως αληθής, η ανακάλυψη κοινοποιήσεων θα χρησιμοποιεί το πρωτόκολλο <ph name="NETBIOS_PROTOCOL" /> για την ανακάλυψη κοινοποιήσεων στο δίκτυο. + Εάν αυτή η πολιτική οριστεί ως ψευδής, η ανακάλυψη κοινοποιήσεων δεν θα χρησιμοποιεί το πρωτόκολλο <ph name="NETBIOS_PROTOCOL" /> για την ανακάλυψη κοινοποιήσεων. + Εάν δεν οριστεί αυτή η πολιτική, η προεπιλογή απενεργοποιείται για εταιρικά διαχειριζόμενους χρήστες και ενεργοποιείται για μη διαχειριζόμενους χρήστες.</translation> <translation id="4555850956567117258">Ενεργοποίηση απομακρυσμένης διαβεβαίωσης για το χρήστη</translation> <translation id="4557134566541205630">URL της σελίδας "Νέα καρτέλα" του παρόχου αναζήτησης</translation> <translation id="4567137030726189378">Να επιτρέπεται η χρήση των Εργαλείων για προγραμματιστές</translation> @@ -1763,6 +1772,7 @@ Αν δεν ρυθμιστεί αυτή η πολιτική, η λειτουργία προφορικών σχολίων απενεργοποιείται την πρώτη φορά που εμφανίζεται η οθόνη σύνδεσης. Οι χρήστες μπορούν να ενεργοποιούν ή να απενεργοποιούν τα προφορικά σχόλια ανά πάσα στιγμή και η κατάσταση της οθόνης σύνδεσης διατηρείται από τον ένα χρήστη στον άλλο.</translation> <translation id="5868414965372171132">Διαμόρφωση δικτύου σε επίπεδο χρήστη</translation> +<translation id="5879014913445067283">Ελέγχει την ανακάλυψη των Κοινόχρηστων αρχείων δικτύου μέσω <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Προεπιλεγμένη ρύθμιση cookie</translation> <translation id="5887414688706570295">Διαμορφώνει το πρόθεμα TalkGadget που θα χρησιμοποιηθεί από κεντρικούς υπολογιστές απομακρυσμένης πρόσβασης και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. @@ -2219,6 +2229,17 @@ Αν δεν έχει καθοριστεί, μπορεί να ζητηθεί από τον χρήστη αν θα γίνει εισαγωγή, διαφορετικά η εισαγωγή μπορεί να συμβεί αυτόματα.</translation> <translation id="7063895219334505671">Να επιτρέπονται τα αναδυόμενα παράθυρα σε αυτούς τους ιστότοπους</translation> +<translation id="706568410943497889"> + Εάν η πολιτική οριστεί ως αληθής, επιτρέπεται στο προϊόν <ph name="PRODUCT_NAME" /> η συλλογή αρχείων καταγραφής συμβάντων WebRTC από υπηρεσίες Google (π.χ. το Google Meet) και η μεταφόρτωση αυτών των αρχείων καταγραφής στο Google. + + Εάν η πολιτική οριστεί ως ψευδής ή δεν οριστεί, το προϊόν <ph name="PRODUCT_NAME" /> δεν θα μπορεί να συλλέγει ή να ανεβάζει αρχεία καταγραφής αυτού του τύπου. + + Αυτά τα αρχεία καταγραφής περιέχουν διαγνωστικά στοιχεία τα οποία είναι χρήσιμα κατά τον εντοπισμό και την αντιμετώπιση ζητημάτων που σχετίζονται με ηχητικές κλήσεις και βιντεοκλήσεις στο Chrome, όπως την ώρα και το μέγεθος των πακέτων RTP που έχουν σταλεί και ληφθεί, σχόλια σχετικά με τη συμφόρηση του δικτύου και μεταδεδομένα σχετικά με την ώρα και την ποιότητα των πλαισίων βίντεο και ήχου. Αυτά τα αρχεία καταγραφής δεν περιέχουν στοιχεία ήχου ή βίντεο από την κλήση. + + Αυτή η συλλογή δεδομένων από το Chrome μπορεί να ενεργοποιηθεί μόνο από υπηρεσίες ιστού της Google, όπως το Google Hangouts ή το Google Meet. + + Η Google μπορεί να συσχετίσει αυτά τα αρχεία καταγραφής, μέσω κάποιου αναγνωριστικού περιόδου σύνδεσης, με άλλα αρχεία καταγραφής που συλλέγονται από την ίδια την υπηρεσία Google. Αυτό έχει ως στόχο τη διευκόλυνση του εντοπισμού και της διόρθωσης σφαλμάτων. + </translation> <translation id="706669471845501145">Να επιτρέπεται σε όλους τους ιστότοπους να εμφανίζουν ειδοποιήσεις στην επιφάνεια εργασίας</translation> <translation id="7072208053150563108">Ρυθμός αλλαγής κωδικού πρόσβασης μηχανήματος</translation> <translation id="7074513465313721551">Διαμορφώστε τη λίστα με τους τομείς που θα θεωρεί αξιόπιστους η Ασφαλής περιήγηση. Αυτό σημαίνει ότι: @@ -2352,6 +2373,9 @@ <translation id="7336878834592315572">Διατήρηση cookie για τη διάρκεια της περιόδου σύνδεσης</translation> <translation id="7340034977315324840">Αναφορά χρονικών περιόδων δραστηριότητας συσκευής</translation> <translation id="7343497214039883642">Αρχείο διαμόρφωσης εταιρικού εκτυπωτή για συσκευές</translation> +<translation id="7349338075015720646">Καθορίζει μια λίστα ιστοτόπων οι οποίοι εγκαθίστανται αθόρυβα, χωρίς αλληλεπίδραση με τον χρήστη, και οι οποίοι δεν είναι δυνατό να απεγκατασταθούν ή να απενεργοποιηθούν από τον χρήστη. + + Κάθε στοιχείο της λίστας της πολιτικής είναι ένα αντικείμενο με δύο μέλη: "url" και "launch_container". Το στοιχείο "url" θα πρέπει να είναι το URL της εφαρμογής ιστού που θα εγκατασταθεί και το "launch_container" θα πρέπει να είναι είτε "window" είτε "tab", προκειμένου να υποδεικνύει τον τρόπο με τον οποίο ανοίγει η εφαρμογή ιστού μετά την εγκατάσταση. Εάν το στοιχείο "launch_container" παραβλεφθεί, η εφαρμογή θα εκκινηθεί σε κάποιο παράθυρο εάν το Chrome τη θεωρήσει προηγμένη εφαρμογή ιστού. Διαφορετικά θα εκκινηθεί σε μια καρτέλα.</translation> <translation id="7367028210010532881">Η υπηρεσία Ασφαλούς περιήγησης εμφανίζει μια προειδοποιητική σελίδα όταν οι χρήστες πλοηγούνται σε ιστοτόπους που έχουν επισημανθεί ως δυνητικά επιβλαβείς. Η ενεργοποίηση αυτής της ρύθμισης αποτρέπει τη μετάβαση των χρηστών στον επιβλαβή ιστότοπο από την προειδοποιητική σελίδα. Εάν αυτή η ρύθμιση έχει απενεργοποιηθεί ή δεν έχει διαμορφωθεί, τότε οι χρήστες θα μπορούν να επιλέξουν να μεταβούν στον ιστότοπο που έχει επισημανθεί μετά την εμφάνιση της προειδοποίησης. @@ -2820,6 +2844,7 @@ Εδώ, η "Έκδοση" μπορεί να είναι είτε μια ακριβής έκδοση, όπως "61.0.3163.120" είτε ένα πρόθεμα έκδοσης, όπως "61.0" </translation> <translation id="8544375438507658205">Προεπιλεγμένη λειτουργία απόδοσης HTML για το <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Επιτρέψτε τον συγχρονισμό μηνυμάτων SMS από το τηλέφωνο στο Chromebook.</translation> <translation id="8549772397068118889">Να προειδοποιείται ο χρήστης όταν επισκέπτεται ιστότοπους εκτός των πακέτων περιεχομένου</translation> <translation id="8566842294717252664">Απόκρυψη του web store από τη Σελίδα σε νέα καρτέλα και από τη λειτουργία εκκίνησης εφαρμογών</translation> <translation id="8586528890725660268">Καθορίζει τους εκτυπωτές που δεν μπορεί να χρησιμοποιήσει ένας χρήστης. @@ -2864,6 +2889,11 @@ Εάν δεν οριστεί αυτή η πολιτική, η υπηρεσία προστασίας κωδικού πρόσβασης θα προστατεύει μόνο κωδικούς πρόσβασης Google, αλλά ο χρήστης θα έχει τη δυνατότητα να αλλάξει αυτήν τη ρύθμιση.</translation> <translation id="8672321184841719703">Στόχευση έκδοσης αυτόματης ενημέρωσης</translation> <translation id="867410340948518937">U2F (Καθολικός δευτερεύων παράγοντας)</translation> +<translation id="8682611302223077049">Σας επιτρέπει να ορίσετε τη χρονική περίοδο, σε χιλιοστά του δευτερολέπτου, κατά τη διάρκεια της οποίας οι χρήστες ειδοποιούνται ότι το προϊόν <ph name="PRODUCT_NAME" /> πρέπει να επανεκκινηθεί ή ότι μια συσκευή <ph name="PRODUCT_OS_NAME" /> πρέπει να επανεκκινηθεί προκειμένου να εφαρμοστεί μια ενημέρωση που είναι σε εκκρεμότητα. + + Κατά τη διάρκεια αυτής της χρονικής περιόδου, ο χρήστης θα ενημερώνεται επανειλημμένως ότι απαιτείται ενημέρωση. Για συσκευές <ph name="PRODUCT_OS_NAME" />, εμφανίζεται μια ειδοποίηση επανεκκίνησης στην περιοχή ειδοποιήσεων, μόλις εντοπιστεί κάποια αναβάθμιση. Για προγράμματα περιήγησης <ph name="PRODUCT_NAME" />, το μενού εφαρμογών αλλάζει για να υποδείξει ότι απαιτείται επανεκκίνηση μόλις παρέλθει το ένα τρίτο της περιόδου ειδοποίησης. Αυτή η ειδοποίηση αλλάζει χρώμα μόλις παρέλθουν τα δύο τρίτα της περιόδου ειδοποίησης και έπειτα αλλάζει χρώμα ξανά μόλις παρέλθει η πλήρης περίοδος ειδοποίησης. Οι επιπλέον ειδοποιήσεις που ενεργοποιούνται από την πολιτική <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ακολουθούν το ίδιο χρονοδιάγραμμα. + + Εάν δεν οριστεί, η προεπιλεγμένη περίοδος των 345.600.000 χιλιοστών του δευτερολέπτου (τέσσερις ημέρες) χρησιμοποιείται για συσκευές <ph name="PRODUCT_OS_NAME" /> και η περίοδος των 604.800.000 χιλιοστών του δευτερολέπτου (μία εβδομάδα) χρησιμοποιείται για <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Η προειδοποίηση προστασίας κωδικού πρόσβασης ενεργοποιείται από την επαναχρησιμοποίηση του κωδικού πρόσβασης</translation> <translation id="8693243869659262736">Χρήση ενσωματωμένου προγράμματος-πελάτη DNS</translation> <translation id="8704831857353097849">Λίστα απενεργοποιημένων προσθηκών</translation> @@ -2908,6 +2938,7 @@ Ο συντελεστής προσαρμογής πρέπει να είναι 100% ή μεγαλύτερος. Δεν επιτρέπεται η χρήση τιμών που θα μείωναν την καθυστέρηση μείωσης φωτεινότητας της οθόνης σε τιμές μικρότερες της "κανονικής" καθυστέρησης.</translation> <translation id="8798099450830957504">Προεπιλογή</translation> +<translation id="8801680448782904838">Ειδοποίηση προς κάποιον χρήστη ότι συνιστάται ή απαιτείται επανεκκίνηση ενός προγράμματος περιήγησης ή επανεκκίνηση συσκευής</translation> <translation id="8818173863808665831">Αναφορά της γεωγραφικής τοποθεσίας της συσκευής. Αν η πολιτική δεν οριστεί ή οριστεί σε false, η τοποθεσία δεν θα αναφερθεί.</translation> @@ -3071,6 +3102,11 @@ Αν αυτή η πολιτική οριστεί σε "True", το <ph name="PRODUCT_OS_NAME" /> θα εκτελεί επανεκκίνηση, όταν ο χρήστης κλείνει τη συσκευή. Το <ph name="PRODUCT_OS_NAME" /> αντικαθιστά όλες τις εμφανίσεις των κουμπιών τερματισμού λειτουργίας στη διεπαφή χρήστη με κουμπιά επανεκκίνησης. Αν ο χρήστης κλείσει τη συσκευή χρησιμοποιώντας το κουμπί λειτουργίας, δεν θα γίνει αυτόματη επανεκκίνηση, ακόμη και αν η πολιτική είναι ενεργοποιημένη.</translation> <translation id="9152473318295429890">Ενεργοποίηση προτάσεων για σχετικές ιστοσελίδες βάσει περιβάλλοντος</translation> <translation id="9158929520101169054">Να επιτρέπεται η σύνδεση σε πολλούς λογαριασμούς στο πρόγραμμα περιήγησης</translation> +<translation id="9159126470527871268">Ειδοποιήστε τους χρήστες ότι θα πρέπει να γίνει επανεκκίνηση του προϊόντος <ph name="PRODUCT_NAME" /> ή του προϊόντος <ph name="PRODUCT_OS_NAME" />, προκειμένου να εφαρμοστεί μια ενημέρωση που είναι σε εκκρεμότητα. + + Αυτή η ρύθμιση πολιτικής επιτρέπει στις ειδοποιήσεις να ενημερώνουν τον χρήστη ότι συνιστάται ή απαιτείται επανεκκίνηση του προγράμματος περιήγησης. Εάν δεν έχει οριστεί, το προϊόν <ph name="PRODUCT_NAME" /> υποδεικνύει στον χρήστη ότι απαιτείται επανεκκίνηση μέσω ανεπαίσθητων αλλαγών στο μενού του, ενώ το προϊόν <ph name="PRODUCT_OS_NAME" /> υποδεικνύει την ίδια ανάγκη μέσω μιας ειδοποίησης στον δίσκο συστήματος. Εάν έχει οριστεί ως "Συνιστάται", θα εμφανίζεται μια επαναλαμβανόμενη προειδοποίηση στον χρήστη, η οποία θα τον ενημερώνει ότι συνιστάται επανεκκίνηση. Ο χρήστης μπορεί να παραβλέψει αυτήν την προειδοποίηση, ούτως ώστε να καθυστερήσει την επανεκκίνηση. Εάν έχει οριστεί ως "Απαιτείται", θα εμφανίζεται μια επαναλαμβανόμενη προειδοποίηση στον χρήστη, η οποία θα υποδεικνύει ότι θα πραγματοποιηθεί αναγκαστική επανεκκίνηση του προγράμματος περιήγησης μόλις παρέλθει η περίοδος της ειδοποίησης. Η προεπιλεγμένη περίοδος είναι επτά ημέρες για το προϊόν <ph name="PRODUCT_NAME" /> και τέσσερις ημέρες για το προϊόν <ph name="PRODUCT_OS_NAME" /> και μπορεί να διαμορφωθεί μέσω της ρύθμισης της πολιτικής <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Γίνεται επαναφορά της περιόδου σύνδεσης του χρήστη μετά την επανεκκίνηση.</translation> <translation id="9165792353046089850">Σας επιτρέπει να ορίσετε εάν οι ιστότοποι θα μπορούν να αποκτούν πρόσβαση σε συνδεδεμένες συσκευές USB. Μπορείτε να επιλέξετε εάν θα γίνει πλήρης αποκλεισμός της πρόσβασης ή εάν θα γίνεται ερώτηση στον χρήστη κάθε φορά που ένας ιστότοπος ζητά πρόσβαση σε συνδεδεμένες συσκευές USB. Μπορεί να γίνει παράκαμψη αυτής της πολιτικής για συγκεκριμένα μοτίβα URL χρησιμοποιώντας τις πολιτικές "WebUsbAskForUrls" και "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 205b117..a49300d 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -749,7 +749,6 @@ If you disable this setting or do not set a value, Print Preview will use the most recently used printer as the default destination choice. If you enable this setting, Print Preview will use the OS system default printer as the default destination choice.</translation> -<translation id="2867699958489427143">Roll back and stay on target version if OS version is newer than target. Do a full Powerwash during the process.</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="2874209944580848064">Note for <ph name="PRODUCT_OS_NAME" /> devices supporting Android apps:</translation> <translation id="2877225735001246144">Disable CNAME lookup when negotiating Kerberos authentication</translation> @@ -994,7 +993,6 @@ <translation id="3711895659073496551">Suspend</translation> <translation id="3715569262675717862">Authentication based on client certificates</translation> <translation id="3736879847913515635">Enable add person in user manager</translation> -<translation id="3737544779868348650">Device network hostname</translation> <translation id="3746590506846867985"> This policy applies to the sign-in screen. Please also see the <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> policy which applies to the user session. It is recommended that both policies are set to the same value. If the values don't match, a delay may be incurred when entering a user session due to the value specified by user policy 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.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index d7689b9..eb51e52b9 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -711,7 +711,6 @@ Si inhabilitas esta configuración o no estableces un valor, Vista previa de impresión usará la impresora que se usó de forma más reciente como la opción de destino predeterminada. Si habilitas esta configuración, Vista previa de impresión usará la impresora predeterminada del sistema operativo como la opción de destino predeterminada.</translation> -<translation id="2867699958489427143">Implementa la reversión y mantiene la versión objetivo si la versión del sistema operativo es más reciente que la objetivo. Aplica la función Powerwash durante el proceso.</translation> <translation id="2872961005593481000">Cerrar</translation> <translation id="2874209944580848064">Nota para dispositivos <ph name="PRODUCT_OS_NAME" /> compatibles con apps de Android:</translation> <translation id="2877225735001246144">Inhabilitar la búsqueda de CNAME al negociar la autenticación de Kerberos</translation> @@ -949,7 +948,6 @@ <translation id="3711895659073496551">Suspender</translation> <translation id="3715569262675717862">Autenticación basada en certificados de clientes</translation> <translation id="3736879847913515635">Habilitar la opción para agregar una persona en el Administrador de usuarios</translation> -<translation id="3737544779868348650">Nombre de host de la red del dispositivo</translation> <translation id="3746590506846867985"> 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 que especifica 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/.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index db1d1bb6..7aac535 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -355,6 +355,7 @@ <translation id="199764499252435679">Habilitar las actualizaciones de componentes en <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestión de la batería</translation> <translation id="201557587962247231">Frecuencia de subida de informes de estado del dispositivo</translation> +<translation id="2017301949684549118">URLs de aplicaciones web que se tienen que instalar de forma silenciosa.</translation> <translation id="2018836497795982119">Permite especificar el periodo en milisegundos en el que se solicita información sobre políticas del usuario al servicio de administración de dispositivos. Al establecer esta política, se anula el valor predeterminado de tres horas. Los valores válidos están comprendidos entre 1.800.000 (30 minutos) y 86.400.000 (un día). Si el valor no está incluido en este intervalo, se redondeará al límite correspondiente. Si la plataforma admite notificaciones sobre políticas, el tiempo de actualización se establecerá en 24 horas, ya que se espera que estas notificaciones fuercen una actualización automática en cuanto se produzca algún cambio en una política. @@ -672,6 +673,11 @@ Una URL de búsqueda de Google se puede especificar de la siguiente forma: <ph name="GOOGLE_SEARCH_URL" />. Esta opción se debe establecer si se habilita la política "DefaultSearchProviderEnabled" y solo se aplicará en este caso.</translation> +<translation id="2659019163577049044">Si este ajuste está habilitado, el usuario podrá configurar sus dispositivos para sincronizar SMS entre su teléfono y su Chromebook. Ten en cuenta que, si se permite esta política, los usuarios deben habilitar la función completando un proceso de configuración. Después, podrán enviar y recibir SMS con sus Chromebooks. + + Si este ajuste está inhabilitado, los usuarios no podrán configurar la sincronización de SMS. + + Si no se define esta política, no estará disponible de forma predeterminada para los usuarios administrados pero sí lo estará para los no administrados.</translation> <translation id="2660846099862559570">No utilizar nunca un proxy</translation> <translation id="267596348720209223">Permite especificar las codificaciones de caracteres admitidas por el proveedor de búsquedas. Las codificaciones son nombres de páginas de códigos, como UTF-8, GB2312 o ISO-8859-1. Los intentos de uso se hacen en el orden especificado. @@ -742,7 +748,6 @@ Si inhabilitas esta opción o no se establece ningún valor, la vista previa de impresión mostrará la última impresora utilizada como impresora de destino predeterminada. Si habilitas esta opción, la vista previa de impresión mostrará la impresora predeterminada del sistema operativo como impresora de destino predeterminada.</translation> -<translation id="2867699958489427143">Vuelve a instalar la versión de destino si la versión del SO es más reciente que la de destino. Realiza un powerwash completo durante el proceso.</translation> <translation id="2872961005593481000">Apagar</translation> <translation id="2874209944580848064">Nota para los dispositivos <ph name="PRODUCT_OS_NAME" /> compatibles con las aplicaciones de Android:</translation> <translation id="2877225735001246144">Inhabilitar la consulta de nombre canónico en negociación de autenticación Kerberos</translation> @@ -987,7 +992,6 @@ <translation id="3711895659073496551">Suspender</translation> <translation id="3715569262675717862">Autenticación basada en certificados de cliente</translation> <translation id="3736879847913515635">Habilitar Añadir persona en el administrador de usuarios</translation> -<translation id="3737544779868348650">Nombre de host de la red del dispositivo</translation> <translation id="3746590506846867985"> 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/, se aislará https://foo.example.com/ como parte del sitio web https://example.com/). @@ -1102,6 +1106,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="3874773863217952418">Habilitar Tocar para buscar</translation> <translation id="3877517141460819966">Modo de autenticación de dos factores integrado</translation> +<translation id="3879208481373875102">Configurar lista de aplicaciones web de instalación forzada</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. Inhabilita el uso del protocolo SPDY en <ph name="PRODUCT_NAME" />. @@ -1346,6 +1351,10 @@ Para consultar una descripción completa de las posibles pociones y la estructura de esta política, accede a https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Modo de procesamiento loopback de políticas del usuario</translation> +<translation id="4554841826517980623">Esta política controla si la función Uso compartido de archivos de <ph name="PRODUCT_NAME" /> debe usar <ph name="NETBIOS_PROTOCOL" /> para buscar elementos compartidos en la red. + Si se le asigna el valor "True" a esta política, la búsqueda usará el protocolo <ph name="NETBIOS_PROTOCOL" /> para encontrar elementos compartidos en la red. + Si se le asigna el valor "False", la búsqueda no usará el protocolo <ph name="NETBIOS_PROTOCOL" /> para encontrar elementos compartidos. + Si no se le asigna ningún valor, la búsqueda de elementos compartidos en la red estará inhabilitada de forma predeterminada para los usuarios administrados y estará habilitada para los usuarios no administrados.</translation> <translation id="4555850956567117258">Habilitar confirmación remota para el usuario</translation> <translation id="4557134566541205630">URL de la página Nueva pestaña del proveedor de búsqueda predeterminado</translation> <translation id="4567137030726189378">Permite el uso de las herramientas para desarrolladores</translation> @@ -1770,6 +1779,7 @@ Si no se establece esta política, se inhabilitarán los comentarios por voz la primera vez que se muestre la pantalla de inicio de sesión. No obstante, los usuarios podrán habilitar o inhabilitar los comentarios por voz en cualquier momento, y su estado en la pantalla de inicio de sesión permanecerá entre usuarios.</translation> <translation id="5868414965372171132">Configuración de red de usuarios</translation> +<translation id="5879014913445067283">Controla la búsqueda de archivos compartidos en la red mediante <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Configuración de cookies predeterminada</translation> <translation id="5887414688706570295">Permite configurar el prefijo TalkGadget que utilizarán los hosts de acceso remoto y evita que los usuarios lo modifiquen. @@ -2231,6 +2241,17 @@ Si no se establece, es posible que se le pida al usuario que haga la importación o que los marcadores se importen automáticamente.</translation> <translation id="7063895219334505671">Permitir pop-ups en estos sitios</translation> +<translation id="706568410943497889"> + Si se le asigna el valor "True" a esta política, <ph name="PRODUCT_NAME" /> puede recopilar registros de eventos WebRTC de los servicios de Google (por ejemplo, Google Meet) y subirlos a Google. + + Si se le asigna el valor "False" o no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> no podrá recopilar ni subir los registros. + + Los registros contienen información de diagnóstico que resulta útil para depurar errores de las llamadas de audio o las videollamadas en Chrome, como la hora y el tamaño de los paquetes RTP recibidos y enviados, comentarios sobre la congestión de la red y metadatos sobre la hora y la calidad de las tramas de audio y vídeo. Estos registros no incluyen contenido de audio ni de vídeo de las llamadas. + + Solo los servicios web de Google, como Hangouts o Google Meet, pueden activar la recogida de datos que realiza Chrome. + + Google puede asociar estos registros, mediante un ID de sesión, a otros registros recopilados por el servicio de Google para facilitar la depuración. + </translation> <translation id="706669471845501145">Permitir que los sitios muestren notificaciones de escritorio</translation> <translation id="7072208053150563108">Frecuencia de cambio de contraseña de dispositivo</translation> <translation id="7074513465313721551">Configura la lista de dominios en los que confiará la función Navegación Segura. Por lo tanto: @@ -2364,6 +2385,9 @@ <translation id="7336878834592315572">Guardar las cookies durante la duración de la sesión</translation> <translation id="7340034977315324840">Notificar tiempo de actividad del dispositivo</translation> <translation id="7343497214039883642">Archivo de configuración de las impresoras de empresa para los dispositivos</translation> +<translation id="7349338075015720646">Define una lista de sitios web que se instalan de forma silenciosa, sin intervención del usuario, y que el usuario no puede desinstalar ni inhabilitar. + + Cada elemento de la lista es un objeto formado por dos componentes: "url" y "launch_container". El valor de "url" es la URL de la aplicación web que se va a instalar, mientras que el valor de "launch_container" puede ser "window" o "tab", y sirve para definir cómo se abrirá la aplicación web una vez instalada. Si se omite "launch_container", la aplicación se abrirá en una ventana si Chrome considera que es una aplicación web progresiva; en caso contrario, la aplicación se abrirá en una pestaña.</translation> <translation id="7367028210010532881">El servicio Navegación Segura muestra una página de advertencia cuando los usuarios acceden a sitios web marcados como potencialmente peligrosos. Si se habilita esta opción, los usuarios no pueden acceder al sitio web malicioso desde la página de advertencia. Si se inhabilita esta opción o no se configura, los usuarios pueden elegir si quieren acceder al sitio web marcado después de ver la advertencia. @@ -2830,6 +2854,7 @@ "Versión" puede hacer referencia a una versión exacta, como "61.0.3163.120" o al prefijo de una versión, como "61.0" </translation> <translation id="8544375438507658205">Procesador de HTML predeterminado de <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Permite que los SMS del teléfono se sincronicen con Chromebook.</translation> <translation id="8549772397068118889">Advertir cuando se visitan sitios no incluidos en paquetes de contenido</translation> <translation id="8566842294717252664">Oculta tienda web en página Nueva pestaña y en menú de aplicaciones</translation> <translation id="8586528890725660268">Especifica las impresoras que un usuario no puede utilizar. @@ -2874,6 +2899,11 @@ Si no se le asigna ningún valor a esta política, el servicio de protección de contraseña solo protegerá las contraseñas de Google, pero el usuario podrá cambiar esta opción.</translation> <translation id="8672321184841719703">Versión de destino de actualizaciones automáticas</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Permite establecer el periodo de tiempo (en milisegundos) durante el que los usuarios recibirán una notificación informándoles de que deben reiniciar <ph name="PRODUCT_NAME" /> o un dispositivo <ph name="PRODUCT_OS_NAME" /> para aplicar una actualización pendiente. + + Durante este periodo de tiempo, se informará de forma reiterada al usuario de que la actualización es necesaria. En el caso de los dispositivos <ph name="PRODUCT_OS_NAME" />, se mostrará una notificación de reinicio en la bandeja del sistema cuando se detecte una actualización. En el caso de los navegadores <ph name="PRODUCT_NAME" />, el menú de aplicaciones cambiará para indicar que es necesario reiniciar cuando haya transcurrido un tercio del periodo de notificación. Esta notificación cambiará de color cuando hayan transcurrido dos tercios del periodo de notificación y, de nuevo, cuando este periodo haya finalizado. Las notificaciones adicionales habilitadas por la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> siguen esta misma programación. + + Si no se asigna ningún valor, se usará el periodo predeterminado de 345.600.000 milisegundos (cuatro días) para los dispositivos <ph name="PRODUCT_OS_NAME" /> y de 604.800.000 milisegundos (una semana) para <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">La advertencia de protección de contraseña se activa al reutilizar la contraseña</translation> <translation id="8693243869659262736">Utilizar cliente DNS integrado</translation> <translation id="8704831857353097849">Lista de complementos inhabilitados</translation> @@ -2918,6 +2948,7 @@ El factor de escala debe ser igual o superior a 100%. No se permiten valores que puedan reducir el tiempo de espera de inactividad de la pantalla en el modo de presentación más allá de su valor habitual.</translation> <translation id="8798099450830957504">Predeterminado</translation> +<translation id="8801680448782904838">Informar al usuario de que es necesario o recomendable reiniciar el navegador o el dispositivo</translation> <translation id="8818173863808665831">Informa de la ubicación geográfica del dispositivo. Si no se establece esta política o se establece el valor "false", no se informará de la ubicación.</translation> @@ -3081,6 +3112,11 @@ Si se asigna el valor true, <ph name="PRODUCT_OS_NAME" /> reiniciará el dispositivo cuando el usuario lo apague. Cada vez que aparece un botón de apagado en la interfaz de usuario, <ph name="PRODUCT_OS_NAME" /> lo sustituye por un botón de reinicio. Sin embargo, si el usuario apaga el dispositivo con el botón de encendido, este no se reiniciará automáticamente, incluso si se ha habilitado la política.</translation> <translation id="9152473318295429890">Habilitar las sugerencias contextuales de páginas web relacionadas</translation> <translation id="9158929520101169054">Permitir inicio de sesión múltiple en el navegador</translation> +<translation id="9159126470527871268">Informar a los usuarios de que deben reiniciar <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> para aplicar una actualización pendiente. + + Este ajuste de la política habilita las notificaciones para informar al usuario de que es necesario o recomendable reiniciar el navegador o el dispositivo. Si no se define, <ph name="PRODUCT_NAME" /> indica al usuario que es necesario reiniciarlo mediante pequeños cambios en el menú, mientras que <ph name="PRODUCT_OS_NAME" /> lo indica mediante una notificación en la bandeja del sistema. Si se le asigna el valor "Recomendada", se muestra una advertencia al usuario de forma periódica indicando que se recomienda reiniciar, aunque el usuario puede ignorarla y reiniciar más tarde. Si se le asigna el valor "Obligatoria", se muestra una advertencia al usuario de forma periódica indicando que se reiniciará el navegador cuando haya transcurrido el periodo de notificación. De forma predeterminada, este periodo dura siete días para <ph name="PRODUCT_NAME" /> y cuatro días para <ph name="PRODUCT_OS_NAME" />, pero se puede cambiar mediante el ajuste <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> de la política. + + La sesión del usuario se restaurará tras el reinicio.</translation> <translation id="9165792353046089850">Permite establecer si los sitios web pueden acceder a los dispositivos USB conectados. El acceso se puede bloquear por completo, o se le puede preguntar al usuario cada vez que un sitio web quiera acceder a los dispositivos USB conectados. Esta política se puede anular usando patrones de URL específicos en las políticas "WebUsbAskForUrls" y "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index 432bc00..f6607dfa4 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -361,6 +361,7 @@ <translation id="199764499252435679">Komponentide värskenduste lubamine teenuses <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Toitehaldus</translation> <translation id="201557587962247231">Seadme oleku aruannete üleslaadimise sagedus</translation> +<translation id="2017301949684549118">Märkamatult installitavate veebirakenduste URL-id.</translation> <translation id="2018836497795982119">Määrab perioodi millisekundites, mille jooksul seadme haldusteenusele esitatakse päring kasutajareegli teabe hankimiseks. Selle reegli määramisel alistatakse vaikeväärtus 3 tundi. Selle reegli kehtivad väärtused jäävad vahemikku 1 800 000 (30 minutit) kuni 86 400 000 (1 päev). Sellest vahemikust välja jäävad väärtused surutakse vastavatesse piiridesse. Kui platvorm toetab reeglite märguandeid, määratakse värskendamise viiteks 24 tundi, kuna eeldatakse, et reegli märguanded jõustavad värskendamise reegli muutmisel automaatselt. @@ -673,6 +674,11 @@ Google'i otsingu URL-iks võib määrata: <ph name="GOOGLE_SEARCH_URL" /> Valik tuleb määrata ja seda rakendatakse vaid juhul, kui reegel „DefaultSearchProviderEnabled” on lubatud.</translation> +<translation id="2659019163577049044">Kui seade on lubatud, võivad kasutajad seadmetes seadistada SMS-ide sünkroonimise telefoni ja Chromebooki vahel. Pange tähele, et kui reegel on lubatud, peavad kasutajad funktsiooni selgesõnaliselt lubama, viies lõpule seadistusvoo. Pärast seadistusvoo lõppu saavad kasutajad Chromebookis SMS-e saata ja vastu võtta. + + Kui seade on keelatud, ei ole kasutajatel lubatud SMS-ide sünkroonimist seadistada. + + Kui seade jäetakse seadistamata, on see hallatavate kasutajate puhul vaikimisi keelatud ja haldamata kasutajate puhul lubatud.</translation> <translation id="2660846099862559570">Ära kunagi kasuta puhverserverit</translation> <translation id="267596348720209223">Määrab tähemärkide kodeeringu, mida otsingupakkuja toetab. Kodeeringud on koodilehtede nimed, näiteks UTF-8, GB2312 või ISO-8859-1. Neid proovitakse sisestatud järjestuses. @@ -743,7 +749,6 @@ Kui keelate seade või jätate väärtuse määramata, kasutab printimise eelvaade vaikesihtkohana viimati kasutatud printerit. Kui lubate selle seade, kasutab printimise eelvaade vaikesihtkohana operatsioonisüsteemi vaikeprinterit.</translation> -<translation id="2867699958489427143">Mine tagasi ja jää sihtversioonile, kui operatsioonisüsteemi versioon on uuem kui sihtversioon. Protsessi käigus tehakse täielik Powerwash.</translation> <translation id="2872961005593481000">Lülita välja</translation> <translation id="2874209944580848064">Märkus Androidi rakendusi toetavate operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete kohta.</translation> <translation id="2877225735001246144">Keela CNAME-i otsing Kerberose autentimise läbirääkimisel</translation> @@ -984,7 +989,6 @@ <translation id="3711895659073496551">Peata</translation> <translation id="3715569262675717862">Kliendi sertifikaatidel põhinev autentimine</translation> <translation id="3736879847913515635">Kasutajahalduris inimese lisamise lubamine</translation> -<translation id="3737544779868348650">Seadme võrgu hostinimi</translation> <translation id="3746590506846867985"> See reegel kehtib sisselogimiskuval. 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/. @@ -1094,6 +1098,7 @@ Iga loendi kirje sisaldab sõnastikku, mis peab väljal „extension-id” sisaldama laienduse ID-d ja väljal „update-url” värskenduse URL-i.</translation> <translation id="3874773863217952418">Funktsiooni Puuduta otsimiseks lubamine</translation> <translation id="3877517141460819966">Integreeritud kahe teguriga autentimise režiim</translation> +<translation id="3879208481373875102">Sunnitult installitud veebirakenduste loendi seadistamine</translation> <translation id="388237772682176890">Selle reegli tugi katkestatakse versioonis M53 ja see eemaldatakse versioonis M54, kuna SPDY/3.1 tugi eemaldatakse. Keelab SPDY-protokolli kasutamise rakenduses <ph name="PRODUCT_NAME" />. @@ -1336,6 +1341,10 @@ Vaadake reegli võimalike seadete ja struktuuri täielikku kirjeldust https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Kasutajareeglite tagastusliidese töötlemisrežiim</translation> +<translation id="4554841826517980623">Reegel määrab, kas teenuse<ph name="PRODUCT_NAME" /> failide võrguhoidlate funktsioon peab võrguhoidlate tuvastamiseks kasutama protokolli <ph name="NETBIOS_PROTOCOL" />. + Kui reegel on seatud väärtusele Tõene, kasutab hoidlate tuvastamise funktsioon võrgus hoidlate tuvastamiseks protokolli <ph name="NETBIOS_PROTOCOL" />. + Kui reegel on seatud väärtusele Väär, ei kasuta hoidlate tuvastamise funktsioon hoidlate tuvastamiseks protokolli <ph name="NETBIOS_PROTOCOL" />. + Kui reegel jäetakse seadistamata, on seade ettevõtte hallatavate kasutajate puhul vaikimisi keelatud ja haldamata kasutajate puhul lubatud.</translation> <translation id="4555850956567117258">Kasutajale kaugatesteerimise lubamine</translation> <translation id="4557134566541205630">Otsingupakkuja uue vahelehe vaike-URL</translation> <translation id="4567137030726189378">Arendaja tööriistade kasutamise lubamine</translation> @@ -1758,6 +1767,7 @@ Kui jätate reegli määramata, on suuline tagasiside algselt keelatud. Kasutaja võib suulise tagasiside igal ajal lubada või keelata ja selle olek jääb sisselogimisekraanil kasutajati püsivaks.</translation> <translation id="5868414965372171132">Kasutaja tasemel võrgukonfiguratsioon</translation> +<translation id="5879014913445067283">Juhib võrguhoidlate tuvastamist teenuse <ph name="NETBIOS_NAME" /> kaudu</translation> <translation id="5883015257301027298">Küpsiste vaikeseade</translation> <translation id="5887414688706570295">Seadistab TalkGadgeti eesliite, mida kasutavad kaugjuurdepääsu hostid, ja takistab kasutajatel selle muutmist. @@ -2221,6 +2231,16 @@ Kui jätate reegli määramata, siis võib importimine toimuda automaatselt või kasutajalt võidakse küsida, kas ta soovib importida.</translation> <translation id="7063895219334505671">Luba hüpikaknad nendel saitidel</translation> +<translation id="706568410943497889"> + Kui reegli väärtuseks määratakse Tõene, võib <ph name="PRODUCT_NAME" /> koguda Google'i teenustest (nt Google Meet) WebRTC sündmuselogisid ja need Google'i serveritesse üles laadida. + + Kui reegli väärtuseks määratakse Väär või jäetakse see määramata, ei tohi <ph name="PRODUCT_NAME" /> logisid koguda ega üles laadida. + + Need logid sisaldavad diagnostikateavet, mis on kasulik Chrome'i hääl- või videokõnedega seotud probleemide silumisel. See hõlmab näiteks näiteks saadetud ja vastuvõetud RTP-pakettide kellaaja ja suuruse teavet, tagasisidet võrgu ummistuste kohta ja metaandmeid heli- ja videokaadrite aja ja kvaliteedi kohta. Logid ei sisalda kõne hääl- ega videosisu. + + Chrome'is savad andmete kogumise käivitada ainult Google'i veebiteenused, nt Google Hangouts või Google Meet. + Google võib seansi ID alusel seostada logid muude logidega, mida Google'i teenus kogub. Selle eesmärk on hõlbustada silumist. + </translation> <translation id="706669471845501145">Luba saitidel töölauateatiste näitamine</translation> <translation id="7072208053150563108">Seadme parooli muutmise sagedus</translation> <translation id="7074513465313721551">Seadistage loend domeenidest, mida ohutu sirvimise funktsioon usaldab. See tähendab järgmist. @@ -2354,6 +2374,9 @@ <translation id="7336878834592315572">Säilita küpsised seansi kestuse jooksul</translation> <translation id="7340034977315324840">Saada teavet seadme aktiivsuse aja kohta</translation> <translation id="7343497214039883642">Ettevõtte printerite konfiguratsioonifail seadmetele</translation> +<translation id="7349338075015720646">Määrab loendi veebisaitidest, mis installitakse märkamatult, ilma et kasutaja peaks sekkuma. + + Reegli iga loendiüksus on objekt, mis koosneb kahest liikmest: „url” ja „launch_container”. Väärtus „url” peab olema installitava veebirakenduse URL ja „launch_container” peab olema „window” või „tab”, mis näitab, kuidas veebirakendus pärast installimist avatakse. Kui väärtus „launch_container” jäetakse tühjaks ja Chrome peab rakendust progressiivseks veebirakenduseks, avaneb see aknas, muidu avaneb rakendus vahelehel.</translation> <translation id="7367028210010532881">Kui kasutajad satuvad navigeerides saitidele, mis on märgistatud potentsiaalselt pahatahtlikuks, kuvab teenus Google'i ohutu sirvimine hoiatuslehe. Selle seade lubamine takistab kasutajatel hoiatuslehelt pahatahtlikule saidile edasi liikuda. Kui seade on keelatud või seadistamata, saavad kasutajad pärast hoiatuse kuvamist teha valiku edasiminekuks märgistatud saidile. @@ -2819,6 +2842,7 @@ Siin võib „versioon” tähendada nii täpset versiooninumbrit „61.0.3163.120” kui ka versiooni eesliidet „61.0” </translation> <translation id="8544375438507658205">Rakenduse <ph name="PRODUCT_FRAME_NAME" /> HTML-i vaikerenderdaja</translation> +<translation id="8544465954173828789">SMS-ide sünkroonimise lubamine telefoni ja Chromebooki vahel</translation> <translation id="8549772397068118889">Hoiatamine sisupakettidest väljaspool olevate saitide külastamisel</translation> <translation id="8566842294717252664">Veebipoe peitmine uuel vahelehel ja rakenduste käivitajas</translation> <translation id="8586528890725660268">Määrab printerid, mida kasutaja ei saa kasutada. @@ -2864,6 +2888,11 @@ Kui see reegel jäetakse määramata, kaitseb paroolikaitse ainult Google'i paroole, ent kasutaja saab seda seadet muuta.</translation> <translation id="8672321184841719703">Automaatse värskendamise sihtversioon</translation> <translation id="867410340948518937">U2F (universaalne teine tegur)</translation> +<translation id="8682611302223077049">Võimaldab määrata ajaperioodi (millisekundites), mille jooksul antakse kasutajatele teada, et ootel oleva värskenduse rakendamiseks tuleb <ph name="PRODUCT_NAME" /> või operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seade taaskäivitada. + + Selle vahemiku jooksul teavitatakse kasutajat värskendusest korduvalt. <ph name="PRODUCT_OS_NAME" />-i seadmete puhul kuvatakse värskenduse tuvastamisel taaskäivituse märguanne süsteemisalves. <ph name="PRODUCT_NAME" />'i brauseri puhul rakenduse menüü muutub, kui kolmandik ajavahemikust on möödunud, ja näitab, et rakendus on vaja taaskäivitada. Märguanne muudab esimest korda värvi siis, kui möödunud on kaks kolmandikku ajavahemikust, ja teist korda ajavahemiku lõpus. Reegliga <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> lubatud lisamärguanded järgivad sama ajakava. + + Kui reegel on määramata, kasutatakse vaikeperioodi, mis on <ph name="PRODUCT_OS_NAME" />-iga seadmete puhul 345 600 000 millisekundit (neli päeva) ja <ph name="PRODUCT_NAME" />'i puhul 604 800 000 millisekundit (üks nädal).</translation> <translation id="8685024486845674965">Paroolikaitse hoiatuse käivitab parooli uuesti kasutamine</translation> <translation id="8693243869659262736">Kasuta sisseehitatud DNS-i klienti</translation> <translation id="8704831857353097849">Keelatud pistikprogrammide loend</translation> @@ -2908,6 +2937,7 @@ Skaleerimistegur peab olema vähemalt 100%. Väärtused, mis võivad teha ekraani tumenduse viivituse esitlusrežiimis lühemaks kui tavaline ekraani tumenduse viivitus, pole lubatud.</translation> <translation id="8798099450830957504">Vaikimisi</translation> +<translation id="8801680448782904838">Kasutaja teavitamine brauseri või seadme soovitatavast või kohustuslikust taaskäivitamisest</translation> <translation id="8818173863808665831">Esitab seadme geograafilise asukoha. Kui jätate eeskirjad määramata või keelate need, siis asukohta ei esitata.</translation> @@ -3070,6 +3100,11 @@ Kui reegel on seatud väärtusele Tõene ja kasutaja lülitab seadme välja, taaskäivitab <ph name="PRODUCT_OS_NAME" /> seadme. <ph name="PRODUCT_OS_NAME" /> asendab kasutajaliidese kõik väljalülitamisnupud taaskäivitusnuppudega. Kui kasutaja lülitab seadme toitenupuga välja, ei taaskäivitata seda automaatselt, isegi kui reegel on lubatud.</translation> <translation id="9152473318295429890">Seotud veebilehtede kontekstipõhiste soovituste lubamine</translation> <translation id="9158929520101169054">Brauseris mitmele kontole sisselogimise lubamine</translation> +<translation id="9159126470527871268">Võimaldab anda kasutajatele teada, et ootel oleva värskenduse rakendamiseks tuleb <ph name="PRODUCT_NAME" /> või <ph name="PRODUCT_OS_NAME" /> taaskäivitada. + + See reegli seade lubab märguanded, mis annavad kasutajale teada, et brauseri või seadme taaskäivitamine on soovitatav või kohustuslik. Kui reegel on määramata, teavitab <ph name="PRODUCT_NAME" /> kasutajat menüüs ilmuvate väikeste muutuste abil, <ph name="PRODUCT_OS_NAME" /> kasutab teavitamiseks süsteemisalves kuvatavat märguannet. Kui reegel on seatud väärtusele „Soovitatav”, kuvatakse kasutajale korduvalt soovitatava taaskäivitamise hoiatus. Kasutaja saab taaskäivitamise edasilükkamiseks hoiatusest loobuda. Kui reegel on seatud väärtusele „Nõutav”, kuvatakse kasutajale korduvalt hoiatus, mis annab teada, et brauser sundtaaskäivitatakse pärast märguandeperioodi möödumist. Vaikeperiood on rakenduse <ph name="PRODUCT_NAME" /> puhul seitse päeva ja operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> puhul neli päeva ning seda saab reegli <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> seade abil muuta. + + Pärast taaskäivitamist kasutaja seanss taastatakse.</translation> <translation id="9165792353046089850">Võimaldab määrata, kas veebisaitidel on juurdepääs ühendatud USB-seadmetele. Juurdepääsu saab täielikult blokeerida või küsida kasutaja käest iga kord luba, kui veebisait soovib juurdepääsu ühendatud USB-seadmetele. Selle reegli saab teatud URL-i mustrite puhul alistada, kasutades reegleid „WebUsbAskForUrls” ja „WebUsbBlockedForUrls”.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 11f6dc6..088f73b 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -349,6 +349,7 @@ <translation id="199764499252435679">فعال کردن بهروزرسانیهای مؤلفه در <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">مدیریت نیرو</translation> <translation id="201557587962247231">تواتر بارگذاری گزارش وضعیت دستگاه</translation> +<translation id="2017301949684549118">نشانی وب «برنامههای وب» برای نصب بیصدا.</translation> <translation id="2018836497795982119">دوره زمانی (بر حسب میلیثانیه) را که سرویس مدیریت دستگاه برای اطلاعات خطمشی کاربر جستجو میشود مشخص میکند. تنظیم این خطمشی مقدار پیشفرض ۳ ساعت را لغو میکند. مقادیر معتبر برای این خطمشی در محدوده ۱۸۰۰۰۰۰ میلیثانیه (۳۰ دقیقه) تا ۸۶۴۰۰۰۰۰ میلیثانیه (۱ روز) است. هر مقداری خارج از این محدوده، به مقداری در داخل آن تبدیل میشود. اگر پلتفورم از اعلانهای خطمشی پشتیبانی کند، تأخیر زمانی بازخوانی روی ۲۴ ساعت تنظیم میشود، زیرا انتظار میرود هر زمان که خطمشی تغییر کند، اعلانهای خطمشی، بازخوانی خودکاری را به وجود آورند. @@ -649,6 +650,11 @@ نشانی وب جستجوی Google را میتوان به این صورت مشخص کرد: <ph name="GOOGLE_SEARCH_URL" />. درصورتیکه خطمشی «DefaultSearchProviderEnabled» فعال باشد، این گزینه باید تنظیم شود تنها در این صورت رعایت میشود.</translation> +<translation id="2659019163577049044">اگر این تنظیم فعال باشد، کاربران مجاز خواهند بود دستگاهشان را برای همگامسازی پیامکها بین تلفن و Chromebook تنظیم کنند. توجه کنید اگر این خطمشی مجاز باشد، کاربران باید با تکمیل روند راهاندازی، این ویژگی را صراحتاً انتخاب کنند. پس از تکمیل روند راهاندازی، کاربران میتوانند در Chromebook پیامک ارسال و دریافت کنند. + + اگر این تنظیم غیرفعال باشد، کاربران مجاز نیستند همگامسازی پیامک را راهاندازی کنند. + + اگر این خطمشی بدون تنظیم باشد، این ویژگی بهصورت پیشفرض برای کاربران مدیریتشده مجاز نیست و برای کاربران غیرمدیریتشده مجاز است.</translation> <translation id="2660846099862559570">هرگز از پروکسی استفاده نشود</translation> <translation id="267596348720209223">رمزگذاریهای نویسه پشتیبانی شده توسط ارائه دهنده جستجوی پیشفرض را تعیین میکند. رمزگذاریها، نامهای صفحه کدی مانند UTF-8، GB2312 و ISO-8859-1 هستند. از آنها به ترتیب ارائه شده استفاده میشود. این قانون اختیاری است. اگر تنظیم نشود، مقدار پیشفرض که UTF-8 است استفاده میشود. از این قانون فقط در صورتی استفاده میشود که قانون "DefaultSearchProviderEnabled" فعال باشد.</translation> <translation id="268577405881275241">فعال کردن قابلیت پروکسی فشردهسازی داده</translation> @@ -715,7 +721,6 @@ اگر این تنظیم را غیرفعال کنید یا مقداری برای آن تنظیم نکنید، «پیشنمایش چاپ» از آخرین چاپگر استفادهشده، بهعنوان انتخاب مقصد پیشفرض استفاده میکند. اگر این تنظیم را فعال کنید، «پیشنمایش چاپ» از چاپگر پیشفرض سیستمعامل، بهعنوان انتخاب مقصد پیشفرض استفاده میکند.</translation> -<translation id="2867699958489427143">اگر نسخه سیستمعامل جدیدتر از نسخه هدف است، عقبگرد کنید و نسخه هدف را تغییر ندهید. درحین پردازش powerwash کاملی انجام دهید.</translation> <translation id="2872961005593481000">خاموش کردن</translation> <translation id="2874209944580848064">نکته برای دستگاههای <ph name="PRODUCT_OS_NAME" /> که از برنامههای Android پشتیبانی میکنند:</translation> <translation id="2877225735001246144">غیرفعال کردن جستجوی CNAME هنگام راستیآزمایی Kerberos</translation> @@ -949,7 +954,6 @@ <translation id="3711895659073496551">تعویق</translation> <translation id="3715569262675717862">احراز هویت براساس گواهینامه کارخواه</translation> <translation id="3736879847913515635">فعال کردن اضافه کردن شخص در مدیریت کاربر</translation> -<translation id="3737544779868348650">نام میزبان شبکه دستگاه</translation> <translation id="3746590506846867985"> این خطمشی برای صفحه ورود به سیستم کاربرد دارد. لطفاً خطمشی <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> را که برای جلسه کاربری کاربرد دارد نیز ببینید. توصیه میشود هردو خطمشی را روی مقدار یکسانی تنظیم کنید. اگر مقادیر مشخصشده توسط این دو خطمشی با هم مطابقت نداشته باشد، ممکن است هنگام وارد شدن به جلسه کاربری (وقتی مقدار مشخصشده توسط خطمشی کاربر اعمال میشود) تأخیری به وجود آید. اگر این خطمشی فعال شود، هریک از مبدأهای نامگذاریشده در فهرستی جداشده با ویرگول، با پردازش مخصوص به خود اجرا خواهند شد. این خطمشی، مبدأهای نامگذاریشده با زیردامنهها را نیز جدا خواهد کرد؛ برای مثال مشخص کردن https://example.com/ باعث میشود https://foo.example.com/ نیز بهعنوان بخشی از سایت https://example.com جدا شود. @@ -1057,6 +1061,7 @@ هر ورودی فهرست شامل واژهنامهای میشود که باید شناسه برنامه افزودنی را در قسمت 'extension-id' و نشانی وب بهروزرسانی خود را در قسمت 'pdate-url' داشته باشد.</translation> <translation id="3874773863217952418">فعال کردن ضربه برای جستجو</translation> <translation id="3877517141460819966">حالت احراز هویت با فاکتور دوم یکپارچه</translation> +<translation id="3879208481373875102">پیکربندی فهرست «برنامههای وب» برای نصب اجباری</translation> <translation id="388237772682176890">این خطمشی در M53 منسوخ میشود و به دلیل حذف پشتیبانی SPDY/3.1 در M54 برداشته میشود. استفاده از پروتکل SPDY را در <ph name="PRODUCT_NAME" /> غیرفعال میکند. @@ -1288,6 +1293,10 @@ برای توصیف کامل تنظیمات و ساختار ممکن این خطمشی، لطفاً به اینجا بروید: https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">حالت پردازش مسیریابی سیگنال خطمشی کاربر</translation> +<translation id="4554841826517980623">این خطمشی کنترل میکند ویژگی Network File Shares در <ph name="PRODUCT_NAME" /> برای شناسایی کردن اشتراکگذاریهای موجود در شبکه از <ph name="NETBIOS_PROTOCOL" /> استفاده کند یا نه. + وقتی این خطمشی روی «درست» تنظیم شود، از پروتکل <ph name="NETBIOS_PROTOCOL" /> برای شناسایی کردن اشتراکگذاریهای موجود در شبکه استفاده میشود. + وقتی این خطمشی روی «نادرست» تنظیم شود، از پروتکل <ph name="NETBIOS_PROTOCOL" /> برای شناسایی کردن اشتراکگذاریها استفاده نمیشود. + اگر این خطمشی بدون تنظیم باشد، این ویژگی بهصورت پیشفرض برای کاربران مدیریتشده سازمانی غیرفعال است و برای کاربران غیرمدیریتشده فعال است.</translation> <translation id="4555850956567117258">فعال کردن اعطای گواهی ازراهدور برای کاربر</translation> <translation id="4557134566541205630">نشانی وب صفحه برگه جدید ارائه دهنده جستجوی پیشفرض</translation> <translation id="4567137030726189378">مجاز کردن استفاده از «ابزارهای برنامهنویس»</translation> @@ -1681,6 +1690,7 @@ چنانچه این خطمشی بدون تنظیم رها شده باشد، با نمایش صفحه ورود به سیستم، بازخورد گفتاری از کار انداخته میشود. کاربران میتوانند در هر زمان که بخواهند بازخورد گفتاری را به کار انداخته یا از کار بیاندازند و این وضعیت در صفحه ورود به سیستم در بین کاربران دائمی خواهد بود.</translation> <translation id="5868414965372171132">پیکربندی شبکه در سطح کاربر</translation> +<translation id="5879014913445067283">شناسایی Network File Share را ازطریق <ph name="NETBIOS_NAME" /> کنترل میکند</translation> <translation id="5883015257301027298">تنظیمات پیشفرض کوکیها</translation> <translation id="5887414688706570295">پیشوند TalkGadget را فعال میکند که توسط میزبانهای دسترسی راه دور استفاده میشود و نمیگذارد کاربران آن را تغییر دهند. @@ -2121,6 +2131,17 @@ <translation id="7049373494483449255">به <ph name="PRODUCT_NAME" /> این امکان را میدهد که اسناد را برای چاپ به <ph name="CLOUD_PRINT_NAME" /> ارسال کند. نکته: این فقط بر روی پشتیبانی <ph name="PRODUCT_NAME" /> از <ph name="CLOUD_PRINT_NAME" /> تأثیر میگذارد. اما جلوی کاربران را برای ارسال کارهای چاپ به وب سایتها نمیگیرد. اگر این گزینه فعال شود یا تنظیم نشده بماند، کاربران میتوانند از پیام چاپ <ph name="PRODUCT_NAME" /> به <ph name="CLOUD_PRINT_NAME" /> کار چاپی ارسال کنند. اگر این گزینه غیرفعال شود، کاربران نمیتوانند از پیام چاپ <ph name="PRODUCT_NAME" /> به <ph name="CLOUD_PRINT_NAME" /> کار چاپی ارسال کنند.</translation> <translation id="7053678646221257043">این قانون در صورت فعال بودن، باعث میشود نشانکها به اجبار از مرورگر پیشفرض کنونی وارد شوند. اگر این قانون فعال باشد، بر روی پیام وارد کردن تأثیر میگذارد. اگر غیرفعال باشد، هیچ نشانکی وارد نمیشود. اگر تنظیم نشده باقی بماند، ممکن است از کاربر در مورد وارد کردن نشانک سؤال شود یا بهطور خودکار وارد کردن انجام شود.</translation> <translation id="7063895219334505671">مجاز بودن پنجرههای بازشو برای این سایتها</translation> +<translation id="706568410943497889"> + اگر این خطمشی روی درست تنظیم شود، <ph name="PRODUCT_NAME" /> مجاز است گزارش وقایع WebRTC را از سرویسهای Google (برای نمونه Google Meet) جمعآوری کند و آن گزارشها را در Google بارگذاری کند. + + اگر این خطمشی روی نادرست تنظیم شود یا بدون تنظیم باشد، <ph name="PRODUCT_NAME" /> نمیتواند چنین گزارشهایی را جمعآوری یا بارگذاری کند. + + این گزارشها حاوی اطلاعات عیبیابی است که میتواند هنگام اشکالزدایی مشکلات تماس صوتی یا تصویری در Chrome سودمند باشد (مانند زمان و اندازه بستههای ارسالی و دریافتی RTP، بازخورد درباره شلوغی شبکه و فرادادههای مربوط به زمان و کیفیت فریمهای صوتی و تصویری). محتوای صوتی و تصویری تماس در این گزارشها ذخیره نمیشود. + + این جمعآوری داده توسط Chrome، تنها توسط سرویسهای وب Google (مانند Google Hangouts یا Google Meet) قابلانجام است. + + ممکن است Google، این گزارشها را ازطریق شناسه جلسه با سایر گزارشهایی که توسط سرویس Google جمعآوری میشود مرتبط کند؛ این کار با هدف تسهیل اشکالزدایی انجام میشود. + </translation> <translation id="706669471845501145">به سایتها اجازه نمایش اعلانهای دسکتاپی داده شود</translation> <translation id="7072208053150563108">سرعت تغییر گذرواژه دستگاه</translation> <translation id="7074513465313721551">فهرست دامنههایی را که «مرور امن» به آنها اعتماد خواهد کرد پیکربندی کنید. یعنی: @@ -2252,6 +2273,9 @@ <translation id="7336878834592315572">نگهداشتن کوکیها برای کل مدت جلسه</translation> <translation id="7340034977315324840">گزارش زمانهای فعالیت دستگاه</translation> <translation id="7343497214039883642">فایل پیکربندی چاپگر شرکتی برای دستگاهها</translation> +<translation id="7349338075015720646">فهرست وبسایتهایی را تعیین میکند که بیصدا و بدون دخالت کاربر نصب میشود و کاربر نمیتواند آنها را حذف نصب یا غیرفعال کند. + + هر مورد فهرست در این خطمشی از یک شیء با دو عضو تشکیل میشود: «url» و «launch_container». قسمت «url» باید نشانی وب برنامه وب موردنظر برای نصب باشد و «launch_container» باید «window» یا «tab» باشد تا مشخص کند «برنامه وب» بعد از نصب چگونه باز میشود. اگر «launch_container» موجود نباشد، درصورتیکه Chrome برنامه را یک «برنامه وب پیشرو» درنظر بگیرد، آن را در پنجره راهاندازی میکند و درغیراینصورت آن را در برگه راهاندازی میکند.</translation> <translation id="7367028210010532881">وقتی کاربران سایتهایی را پیمایش میکنند که بهعنوان بالقوه مخرب پرچمگذاری شدهاند، سرویس «مرور ایمن» صفحه هشداری نشان میدهد. فعال کردن این تنظیم مانع از آن میشود که کاربران از صفحه هشدار به سایت مخرب بروند. اگر این تنظیم غیرفعال شود یا پیکربندی نشود، کاربران میتوانند پس از مشاهده هشدار، به سایت پرچمگذاریشده بروند. @@ -2701,6 +2725,7 @@ در اینجا، «نسخه» میتواند نسخهای دقیق (مانند «۶۱.۰.۳۱۶۳.۱۲۰» یا پیشوند نسخه (مانند ۶۱.۰) باشد </translation> <translation id="8544375438507658205">مجری و تفسیرگر پیشفرض HTML برای <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">اجازه میدهد پیامکها بین تلفن و Chromebook همگامسازی شود</translation> <translation id="8549772397068118889">هشدار در هنگام بازدید از سایتهای خارج از بستههای محتوا</translation> <translation id="8566842294717252664">مخفی کردن فروشگاه وب از صفحه برگه جدید و راهانداز برنامه</translation> <translation id="8586528890725660268">چاپگرهایی را که کاربر نمیتواند استفاده کند مشخص میکند. @@ -2745,6 +2770,11 @@ اگر این خطمشی تنظیم نشود، سرویس محافظت از گذرواژه فقط از گذرواژههای Google محافظت میکند اما کاربر میتواند این تنظیم را تغییر دهد.</translation> <translation id="8672321184841719703">نسخه بهروزرسانی خودکار هدف</translation> <translation id="867410340948518937">U2F (فاکتور عمومی دوم)</translation> +<translation id="8682611302223077049">اجازه میدهد دوره زمانی را (به میلیثانیه) تنظیم کنید که طی آن به کاربران اعلان میشود برای اعمال بهروزرسانی درانتظار، <ph name="PRODUCT_NAME" /> باید راهاندازی مجدد شود یا اینکه دستگاه <ph name="PRODUCT_OS_NAME" /> باید بازراهاندازی شود. + + طی این دوره زمانی، بهطور مداوم درباره ضرورت بهروزرسانی به کاربر اطلاع داده میشود. در دستگاههای <ph name="PRODUCT_OS_NAME" />، وقتی بهروزرسانی شناسایی شود، در سینی سیستم اعلان بازراهاندازی ظاهر میشود. در مرورگرهای <ph name="PRODUCT_NAME" />، بعد از گذشت یکسوم از دوره زمانی اعلان، برای نشان دادن لزوم راهاندازی مجدد، منوی برنامه تغییر میکند. این اعلان، بعداز گذشت دوسوم دوره زمانی اعلان و مجدداً بعد از اتمام کل دوره زمانی اعلان، تغییر رنگ میدهد. اعلانهای دیگری که توسط خطمشی <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> فعال میشود، از همین زمانبندی پیروی میکند. + + اگر تنظیم نشود، از دوره زمانی پیشفرض ۳۴۵۶۰۰۰۰۰ میلیثانیه (چهار روز) برای دستگاههای <ph name="PRODUCT_OS_NAME" /> و ۶۰۴۸۰۰۰۰۰ میلیثانیه (یک هفته) برای <ph name="PRODUCT_NAME" /> استفاده میشود.</translation> <translation id="8685024486845674965">هشدار حفاظت با گذرواژه با استفاده مجدد گذرواژه راهاندازی شده است</translation> <translation id="8693243869659262736">استفاده از کلاینت DNS داخلی</translation> <translation id="8704831857353097849">فهرست افزایههای غیرفعال شده</translation> @@ -2785,6 +2815,7 @@ فاکتور اندازهگیری باید ۱۰۰ درصد یا بیشتر باشد. مقادیری که تأخیر عدم فعالیت صفحه نمایش را در حالت ارائه نسبت به تأخیر عدم فعالیت عادی صفحه نمایش کوتاهترمیکنند، مجاز نیستند.</translation> <translation id="8798099450830957504">پیشفرض</translation> +<translation id="8801680448782904838">اعلان به کاربر درباره اینکه راهاندازی مجدد مرورگر یا بازراهاندازی دستگاه توصیه میشود یا لازم است</translation> <translation id="8818173863808665831">موقعیت مکانی دستگاه را گزارش دهید. اگر خطمشی تعیین نشده باشد٬ یا اشتباه تعیین شده باشد٬ موقعیت مکانی گزارش نمیشود.</translation> @@ -2941,6 +2972,11 @@ اگر این خطمشی روی درست تنظیم شود، <ph name="PRODUCT_OS_NAME" /> هنگامی که کاربر دستگاه را خاموش میکند، دوباره راهاندازی را آغاز میکند. <ph name="PRODUCT_OS_NAME" /> همه رخدادهای دکمه خاموش را در واسط کاربر با دکمه راهاندازی مجدد جایگزین میکند. اگر کاربر با استفاده از دکمه روشن/خاموش دستگاه را خاموش کند، دستگاه بهصورت خودکار راهاندازی مجدد نمیشود، حتی اگر خطمشی فعال باشد.</translation> <translation id="9152473318295429890">فعال کردن پیشنهادهای زمینهای صفحههای وب مرتبط</translation> <translation id="9158929520101169054">مجاز کردن ورود چندگانه به سیستم در مرورگر</translation> +<translation id="9159126470527871268">به کاربران اعلان میشود برای اعمال بهروزرسانی درانتظار، <ph name="PRODUCT_NAME" /> باید راهاندازی مجدد شود یا <ph name="PRODUCT_OS_NAME" /> بازراهاندازی شود. + + این تنظیم خطمشی، اعلانهایی را فعال میکند تا به کاربر اطلاع داده شود راهاندازی مجدد مرورگر توصیه میشود یا لازم است. اگر تنظیم نشود، <ph name="PRODUCT_NAME" /> ازطریق تغییرات کوچک در منوی خود به کاربر نشان میدهد راهاندازی مجدد لازم است، درحالیکه <ph name="PRODUCT_OS_NAME" /> این را ازطریق اعلانی در سینی سیستم نشان میدهد. اگر روی «Recommended» (توصیه میشود) تنظیم شود، هشدار تکرارشوندهای به کاربر نشان داده میشود مبنی بر اینکه راهاندازی مجدد توصیه میشود. اگر روی «لازم است» تنظیم شود، هشدار تکرارشوندهای به کاربر نمایش داده میشود که نشان میدهد بعد از گذشت مدتزمان اعلان، راهاندازی مجدد مرورگر بهاجبار اعمال میشود. این مدتزمان بهطور پیشفرض برای <ph name="PRODUCT_NAME" /> هفت روز است و برای <ph name="PRODUCT_OS_NAME" /> چهار روز است و ازطریق تنظیم خطمشی <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> پیکربندی میشود. + + بعد از راهاندازی مجدد/بازراهاندازی، جلسه کاربر بازیابی میشود.</translation> <translation id="9165792353046089850">به شما امکان میدهد تعیین کنید وبسایتها میتوانند به دستگاههای USB متصل دسترسی داشته باشند یا نه. میتوان دسترسی را کاملاً مسدود کرد یا تنظیمات را بهگونهای انجام داد که هر بار وبسایتی میخواهد به دستگاههای USB متصل دسترسی داشته باشد از کاربر سؤال کند. این خطمشی میتواند با استفاده از خطمشیهای «WebUsbAskForUrls» و «WebUsbBlockedForUrls» برای الگوهای نشانی وب خاصی لغو شود.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 2625731d..7570dd85 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -725,7 +725,6 @@ Jos poistat tämän asetuksen käytöstä tai et määritä sille arvoa, Tulostuksen esikatselussa valitaan oletuskohteeksi viimeksi käytetty tulostin. Jos otat tämän asetuksen käyttöön, Tulostuksen esikatselussa valitaan oletuskohteeksi käyttöjärjestelmän oletustulostin.</translation> -<translation id="2867699958489427143">Palaa ja pysy kohdeversiossa, jos käyttöjärjestelmän versio on uudempi kuin kohde. Suorita täysi powerwash-toiminto prosessin aikana.</translation> <translation id="2872961005593481000">Sammuta</translation> <translation id="2874209944580848064">Huomioitavaa, jos laitteesi käyttöjärjestelmä on <ph name="PRODUCT_OS_NAME" /> ja tukee Android-sovelluksia:</translation> <translation id="2877225735001246144">Poista CNAME-haku käytöstä Kerberos-todennusta suoritettaessa</translation> @@ -964,7 +963,6 @@ <translation id="3711895659073496551">Keskeytä</translation> <translation id="3715569262675717862">Käyttöoikeusvarmenteisiin perustuva todennus</translation> <translation id="3736879847913515635">Salli profiilien luominen käyttäjien hallinnassa</translation> -<translation id="3737544779868348650">Laitteen verkon isäntänimi</translation> <translation id="3746590506846867985"> Tätä käytäntöä sovelletaan kirjautumisnäytöllä. Tutustu myös käytäntöön <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, joka koskee käyttökertaa. On suositeltavaa asettaa molemmille käytännöille sama arvo. Jos arvot eivät täsmää, käyttökerran aloittaminen voi viivästyä käyttäjäkäytännössä määritetyn arvon käyttöönoton vuoksi. Jos käytäntö on käytössä, jokainen pilkuilla erotetussa luettelossa nimetty alkuperäkohde suoritetaan omana prosessinaan. Tällöin myös nimettyjen kohteiden aliverkkotunnukset eristetään. Esimerkiksi jos luetteloon lisätään osoite https://example.com/, myös https://foo.example.com/ eristetään osana https://example.com/-sivustoa.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 16f36ae..5a7acf7c 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -357,6 +357,7 @@ <translation id="199764499252435679">I-enable ang mga pag-update ng bahagi sa <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Pamamahala ng power</translation> <translation id="201557587962247231">Dalas ng pag-upload ng mga ulat ng status ng device</translation> +<translation id="2017301949684549118">Mga URL para sa Mga Web App na ii-install nang hindi napapansin.</translation> <translation id="2018836497795982119">Tinutukoy ang tagal sa mga millisecond kung gaano katagal na-query ang serbisyo ng pamamahala sa device para sa impormasyon ng patakaran ng user. Kapag itinakda ang patakarang ito, mao-override ang default na value na 3 oras. Ang mga wastong value para sa patakarang ito ay nasa saklaw mula 1800000 (30 minuto) hanggang 86400000 (1 araw). Maka-clamp sa kaukulang hangganan ang anumang mga value na wala sa saklaw na ito. Kung sinusuportahan ng platform ang mga notification ng patakaran, itatakda ang pagkaantala ng pag-refresh sa 24 na oras dahil inaasahan na ang mga notification ng patakaran ay magpipilit ng awtomatikong pag-refresh sa tuwing magbabago ang patakaran. @@ -669,6 +670,11 @@ Ang URL sa paghahanap ng Google ay maaaring tukuyin bilang: <ph name="GOOGLE_SEARCH_URL" />. Dapat na itakda ang opsyong ito kapag naka-enable ang patakaran na 'DefaultSearchProviderEnabled' at kikilalanin lang kung ganito ang sitwasyon.</translation> +<translation id="2659019163577049044">Kung naka-enable ang setting na ito, papayagan ang mga user na i-set up ang kanilang mga device para ma-sync ang mga mensaheng SMS sa kanilang mga telepono at Chromebook. Tandaang kung papayagan ang patakarang ito, dapat ay tahasang mag-opt in ang mga user sa feature na ito sa pamamagitan ng pagkumpleto sa proseso ng pag-set up. Kapag kumpleto na ang proseso ng pag-set up, magagawa na ng mga user na magpadala at tumanggap ng mga mensaheng SMS sa kanilang Mga Chromebook. + + Kung naka-disable ang setting na ito, hindi papayagan ang mga user na i-set up ang pag-sync ng SMS. + + Kung hahayaang hindi nakatakda ang patakarang ito, ang default ay hindi pinapayagan para sa mga pinapamahalaang user at pinapayagan para sa mga hindi pinapamahalaang user.</translation> <translation id="2660846099862559570">Huwag kailanman gumamit ng proxy</translation> <translation id="267596348720209223">Tinutukoy ang mga pag-encode ng character na sinusuportahan ng provider ng paghahanap. Ang mga pag-encode ay mga pangalan ng pahina ng code tulad ng UTF-8, GB2312, at ISO-8859-1. Sinusubukan ang mga ito sa pagkakasunud-sunod na ibinigay. @@ -739,7 +745,6 @@ Kung idi-disable mo ang setting na ito o hindi ka magtatakda ng value, gagamitin ng Preview ng Pag-print ang pinakahuling ginamit na printer bilang default na pagpipilian. Kung ie-enable mo ang setting na ito, gagamitin ng Preview sa Pag-print ang default na printer ng OS system bilang default na pagpipilian.</translation> -<translation id="2867699958489427143">Mag-roll back at manatili sa target na bersyon kung mas bago ang bersyon ng OS kaysa sa target. Magsagawa ng ganap na pag-powerwash habang nasa proseso.</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="2874209944580848064">Tala para sa mga <ph name="PRODUCT_OS_NAME" /> device na sumusuporta sa mga Android app:</translation> <translation id="2877225735001246144">Huwag paganahin ang paghahanap ng CNAME kapag nakikipagsundo sa pagpapatotoo ng Kerberos</translation> @@ -983,7 +988,6 @@ <translation id="3711895659073496551">Suspendihin</translation> <translation id="3715569262675717862">Pag-authenticate batay sa mga certificate ng kliyente</translation> <translation id="3736879847913515635">I-enable ang magdagdag ng tao sa user manager</translation> -<translation id="3737544779868348650">Hostname ng network ng device</translation> <translation id="3746590506846867985"> 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 parehong patakaran sa iisang value. Kung hindi magkatugma ang mga value, maaaring magkaroon ng pagkaantala kapag pumapasok sa session ng user habang inilalapat ang value na natukoy ng patakaran ng user. Kung ie-enable ang patakaran, ang bawat isa sa mga pinangalanang pinagmulan sa isang comma-separated list ay tatakbo sa sarili nitong proseso. Ia-isolate din nito ang mga pinagmulang pinangalanan ayon sa 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/. @@ -1092,6 +1096,7 @@ Ang bawat entry sa listahan ay naglalaman ng diksyunaryong dapat kabilangan ng ID ng extension sa field na 'extension-id,' at ng URL ng update nito sa field na 'update-url.'</translation> <translation id="3874773863217952418">I-enable ang I-tap para Maghanap</translation> <translation id="3877517141460819966">Kasamang second factor authentication mode</translation> +<translation id="3879208481373875102">I-configure ang listahan ng mga sapilitang na-install na Web App</translation> <translation id="388237772682176890">Ang patakarang ito ay hindi na ginagamit sa M53 at inalis na sa M54, dahil inalis na ang suporta sa SPDY/3.1. Dini-disable ang paggamit ng SPDY protocol sa <ph name="PRODUCT_NAME" />. @@ -1335,6 +1340,10 @@ Para sa kumpletong paglalarawan ng mga posibleng setting at istruktura ng patakarang ito, pakibisita ang https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">loopback processing mode ng patakaran ng user</translation> +<translation id="4554841826517980623">Kinokontrol ng patakarang ito kung gagamitin ng feature na Mga File Share sa Network para sa <ph name="PRODUCT_NAME" /> ang <ph name="NETBIOS_PROTOCOL" /> para tumuklas ng mga pagbabahagi sa network. + Kapag nakatakda sa True ang patakarang ito, gagamitin sa pagtuklas ng pagbabahagi ang protocol na <ph name="NETBIOS_PROTOCOL" /> para tumuklas ng mga pagbabahagi sa network. + Kapag nakatakda ang patakarang ito sa False, hindi gagamitin sa pagtuklas ng pagbabahagi ang protocol na <ph name="NETBIOS_PROTOCOL" /> para tumuklas ng mga pagbabahagi. + Kung hahayaang hindi nakatakda ang patakaran, ang default ay naka-disable para sa mga user na pinapamahalaan ang enterprise at naka-enable para sa mga user na hindi pinapamahalaan.</translation> <translation id="4555850956567117258">I-enable ang malayuang pagpapatotoo para sa user</translation> <translation id="4557134566541205630">URL ng pahina ng bagong tab ng default na search provider</translation> <translation id="4567137030726189378">Payagan ang paggamit ng Mga Tool ng Developer</translation> @@ -1756,6 +1765,7 @@ Kung hahayaang hindi nakatakda ang patakarang ito, naka-disable ang sinasalitang feedback kapag unang ipinakita ang screen sa pag-login. Maaaring i-enable o i-disable ng mga user ang sinasalitang feedback anumang oras at mananatili ang katayuan nito sa screen sa pag-login sa pagitan ng mga user.</translation> <translation id="5868414965372171132">Configuration ng network sa antas ng user</translation> +<translation id="5879014913445067283">Kinokontrol ang pagtuklas ng File Share sa Network sa pamamagitan ng <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Default na setting ng cookies</translation> <translation id="5887414688706570295">Kino-configure ang prefix ng TalkGadget na gagamitin ng mga host ng malayuang pag-access at pinipigilan ang mga user na baguhin ito. @@ -2217,6 +2227,17 @@ Kung hindi nakatakda, maaaring tanungin sa user kung mag-i-import o hindi, o maaaring awtomatikong mangyari ang pag-import.</translation> <translation id="7063895219334505671">Pinapayagan ang mga popup sa mga site na ito</translation> +<translation id="706568410943497889"> + Kung nakatakda ang patakaran sa true, pinapayagan ang <ph name="PRODUCT_NAME" /> na mangolekta ng mga log ng event sa WebRTC mula sa mga serbisyo ng Google (hal. Google Meet), at i-upload ang mga log na iyon sa Google. + + Kung nakatakda ang patakaran sa false, o hindi ito nakatakda, hindi maaaring kolektahin o i-upload ng <ph name="PRODUCT_NAME" /> ang mga nasabing log. + + Ang mga log na ito ay naglalaman ng diagnostic na impormasyong makakatulong kapag nagde-debug ng mga isyu sa mga audio o video call sa Chrome, gaya ng oras at laki ng mga naipadala at natanggap na RTP packet, feedback tungkol sa pagdami ng gumagamit sa network, at metadata tungkol sa oras at kalidad ng mga audio at video frame. Ang mga log na ito ay hindi naglalaman ng mga audio o video content mula sa tawag. + + Mati-trigger lang ang ganitong pagkolekta ng data sa pamamagitan ng mga serbisyo sa web ng Google, gaya ng Google Hangouts o Google Meet. + + Maiuugnay ng Google ang mga log na ito, sa pamamagitan ng session ID, sa iba pang log na nakolekta ng mismong serbisyo ng Google; layunin nitong mas padaliin ang pag-debug. + </translation> <translation id="706669471845501145">Payagan ang mga site upang magpakita ng mga notification sa desktop</translation> <translation id="7072208053150563108">Rate ng pagpapalit ng password ng machine</translation> <translation id="7074513465313721551">Nagko-configure sa listahan ng mga domain na pagkakatiwalaan ng Ligtas na Pag-browse. Ang ibig sabihin nito ay: @@ -2350,6 +2371,9 @@ <translation id="7336878834592315572">Panatilihin ang cookies para sa kabuuan ng session</translation> <translation id="7340034977315324840">Iulat ang mga panahon ng aktibidad ng device</translation> <translation id="7343497214039883642">File ng configuration para sa mga device ng printer ng enterprise</translation> +<translation id="7349338075015720646">Tumutukoy ng listahan ng mga website na na-install nang hindi napapansin, nang walang pakikipag-ugnayan ng user, at hindi maa-uninstall o madi-disable ng user. + + Ang bawat item ng patakaran ay isang object na may dalawang miyembro: "url" at "launch_container." Ang "url" ay dapat ang URL ng web app na ii-install at ang "launch_container" ay dapat alinman sa "window" o "tab" para maisaad kung paano bubuksan ang Web App kapag na-install na. Kung tatanggalin ang "launch_container," ilulunsad ang app sa window kung ituturing ito ng Chrome na Progressive Web App at kung hindi naman, ilulunsad ito sa tab.</translation> <translation id="7367028210010532881">Nagpapakita ang serbisyo ng Ligtas na Pag-browse ng page ng babala kapag nag-navigate ang mga user sa mga site na naka-flag bilang posibleng nakakahamak. Kapag na-enable ang setting na ito, mapipigilan ang mga user na tumuloy pa rin sa nakakahamak na site mula sa page ng babala. Kung naka-disable o hindi naka-configure ang setting na ito, maaaring piliin ng mga user na tumuloy sa naka-flag na site pagkatapos mabigyan ng babala. @@ -2813,6 +2837,7 @@ Dito, ang "Bersyon" ay maaaring maging eksaktong bersyon tulad ng '61.0.3163.120' o prefix ng bersyon, tulad ng '61.0' </translation> <translation id="8544375438507658205">Default na taga-render ng HTML para sa <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Payagan ang Mga Mensaheng SMS na ma-sync mula sa telepono papunta sa Chromebook.</translation> <translation id="8549772397068118889">Magbabala kapag bumibisita ng mga site na nasa labas ng mga pack ng nilalaman</translation> <translation id="8566842294717252664">Itago ang web store sa Page ng Bagong Tab at app launcher</translation> <translation id="8586528890725660268">Tinutukoy ang mga printer na maaaring gamitin ng isang user. @@ -2857,6 +2882,11 @@ Kung iiwang hindi nakatakda ang patakarang ito, ang mga password lang sa Google ang poprotektahan ng serbisyo sa pagprotekta ng password ngunit mababago ng user ang setting na ito.</translation> <translation id="8672321184841719703">Target Auto Update Na Bersyon</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Nagbibigay-daan sa iyong itakda ang yugto ng panahon, sa millisecond, kung kailan aabisuhan ang mga user na dapat muling ilunsad ang <ph name="PRODUCT_NAME" /> o dapat i-restart ang <ph name="PRODUCT_OS_NAME" /> para malapat ang nakabinbing pag-update. + + Sa yugto ng panahong ito, paulit-ulit na ipapaalam sa user ang pangangailangang mag-update. Para sa mga <ph name="PRODUCT_OS_NAME" /> device, lalabas sa system tray ang notification sa pag-restart kapag may na-detect na pag-upgrade. Para sa mga <ph name="PRODUCT_NAME" /> browser, magbabago ang menu ng app para isaad na kinakailangan ng muling paglulunsad kapag lumipas ang one third ng yugto ng panahon ng notification. Magbabago ng kulay ang notification na ito kapag lumipas ang two thirds ng yugto ng panahon ng notification, at muli kapag lumipas ang buong yugto ng panahon ng notification. Ang mga karagdagang notification na na-enable ng patakarang <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ay sumusunod sa kaparehong iskedyul na ito. + + Kung hindi itatakda, ang default na yugto ng panahong 345600000 millisecond (apat na araw) ang gagamitin para sa mga <ph name="PRODUCT_OS_NAME" /> device at 604800000 millisecond (isang linggo) ang gagamitin para sa <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Ang babala ng proteksyon sa password ay nati-trigger ng muling paggamit ng password</translation> <translation id="8693243869659262736">Gamitin ang built-in na DNS client</translation> <translation id="8704831857353097849">Listahan ng mga hindi pinaganang plugin</translation> @@ -2901,6 +2931,7 @@ Dapat nasa 100% o higit pa ang salik ng scale. Hindi pinahihintulutan ang mga value magpapaikli sa pag-aantala ng pagdilim ng screen sa presentation mode kaysa sa regular.</translation> <translation id="8798099450830957504">Default</translation> +<translation id="8801680448782904838">Abisuhan ang user na inirerekomenda o kinakailangang muling ilunsad ang browser o i-restart ang device</translation> <translation id="8818173863808665831">I-ulat ang heyograpikong lokasyon ng device. Kung hindi naitakda ang patakaran, o naitakda sa false, hindi ma-uulat ang lokasyon.</translation> @@ -3064,6 +3095,11 @@ Kung nakatakda sa true ang patakarang ito, magti-trigger ang <ph name="PRODUCT_OS_NAME" /> ng reboot kapag i-shut down ng user ang device. Papalitan ng <ph name="PRODUCT_OS_NAME" /> ang lahat ng button ng pag-shutdown sa UI ng mga button sa pag-reboot. Kung i-shut down ng user ang device gamit ang button ng power, hindi ito awtomatikong magre-reboot, kahit na naka-enable ang patakaran.</translation> <translation id="9152473318295429890">Ine-enable ang mga kontekstwal na suhestyon ng mga nauugnay na web page</translation> <translation id="9158929520101169054">Payagan ang Maraming Pag-sign Sa Browser</translation> +<translation id="9159126470527871268">Nag-aabiso sa mga user na dapat muling ilunsad ang <ph name="PRODUCT_NAME" /> o i-restart ang <ph name="PRODUCT_OS_NAME" /> para malapat ang nakabinbing pag-update. + + Ine-enable ng setting ng patakarang ito ang mga notification para ipaalam sa user na inirerekomenda o kinakailangan ang muling paglulunsad ng browser o pag-restart ng device. Kung hindi nakatakda, ipapaalam ng <ph name="PRODUCT_NAME" /> sa user na kinakailangan ang muling paglulunsad sa pamamagitan ng maliliit na pagbabago sa menu nito, at ipapaalam iyon ng <ph name="PRODUCT_OS_NAME" /> sa pamamagitan ng notification sa system tray. Kung nakatakda sa 'Inirerekomenda,' magpapakita ng umuulit na babala sa user na inirerekomenda ang muling paglulunsad. Maaaring i-dismiss ng user ang babalang ito para ipagpaliban ang muling paglulunsad. Kung nakatakda sa 'Kinakailangan,' magpapakita ng umuulit na babala sa user na nagsasaad na sapilitang magsasagawa ng muling paglulunsad ng browser kapag lumampas na sa panahon ng notification. Ang default na panahon ay pitong araw para sa <ph name="PRODUCT_NAME" /> at apat na araw para sa <ph name="PRODUCT_OS_NAME" />, at maaari itong i-configure sa pamamagitan ng setting ng patakarang <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Ire-restore ang session ng user pagkatapos ng muling paglulunsad/pag-restart.</translation> <translation id="9165792353046089850">Binibigyang-daan kang itakda kung pinapayagan ang mga website na magkaroon ng access sa mga nakakonektang USB device. Maaaring ganap na i-block ang access, o maaaring tanungin ang user sa tuwing gusto ng website na magkaroon ng access sa mga nakakonektang USB device. Maaaring ma-override ang patakarang ito para sa mga partikular na pattern ng URL gamit ang mga patakarang 'WebUsbAskForUrls' at 'WebUsbBlockedForUrls.'
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index d3babcfd..062bebb 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -361,6 +361,7 @@ <translation id="199764499252435679">Activer la mise à jour des composants de <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestion de l'alimentation</translation> <translation id="201557587962247231">Fréquence d'importation des rapports sur l'état de l'appareil</translation> +<translation id="2017301949684549118">URL des applications Web à installer de façon silencieuse.</translation> <translation id="2018836497795982119">Indique la fréquence en millisecondes à laquelle le service de gestion des appareils est interrogé sur les informations concernant les règles relatives aux utilisateurs. La définition de cette règle remplace la valeur par défaut de 3 heures. Les valeurs valides pour cette règle sont comprises entre 1 800 000 (30 minutes) et 86,4 millions (1 jour). Toutes les valeurs non comprises dans cette plage seront nivelées à la limite respective. Si la plate-forme est compatible avec les notifications relatives aux règles, le délai d'actualisation est défini par défaut sur 24 heures. De plus, la règle est actualisée automatiquement chaque fois qu'elle est modifiée. @@ -681,6 +682,11 @@ L'URL en question peut être spécifiée comme suit : <ph name="GOOGLE_SEARCH_URL" />. Cette option doit être définie lorsque la règle "DefaultSearchProviderEnabled" est activée et ne sera respectée que si c'est le cas.</translation> +<translation id="2659019163577049044">Si ce paramètre est activé, les utilisateurs peuvent configurer la synchronisation des SMS entre leur téléphone et leur appareil Chromebook. Ils doivent activer explicitement cette fonctionnalité en suivant une procédure de configuration, à l'issue de laquelle ils pourront envoyer et recevoir des SMS sur leur Chromebook. + + Si ce paramètre est désactivé, les utilisateurs n'auront pas la possibilité de configurer la synchronisation des SMS. + + Si vous ne configurez pas cette règle, le paramètre sera désactivé par défaut pour les utilisateurs gérés et activé par défaut pour les utilisateurs non gérés.</translation> <translation id="2660846099862559570">Ne jamais utiliser de proxy</translation> <translation id="267596348720209223">Spécifie les encodages de caractères compatibles avec le moteur de recherche. Les encodages sont des noms de page de code, comme UTF-8, GB2312 et ISO-8859-1. Ils sont testés dans l'ordre indiqué. @@ -751,7 +757,6 @@ Si vous désactivez ce paramètre ou si vous ne définissez pas de valeur, l'aperçu avant impression utilisera par défaut l'imprimante qui a servi le plus récemment. Si vous activez ce paramètre, l'aperçu avant impression utilisera l'imprimante par défaut du système d'exploitation.</translation> -<translation id="2867699958489427143">Rétablissez et conservez la version cible si elle est antérieure à la version de l'OS. Effectuez un Powerwash complet pendant le processus.</translation> <translation id="2872961005593481000">Éteindre</translation> <translation id="2874209944580848064">Remarque concernant les appareils <ph name="PRODUCT_OS_NAME" /> compatibles avec les applications Android :</translation> <translation id="2877225735001246144">Désactiver la consultation CNAME lors de la négociation de l'authentification Kerberos</translation> @@ -996,7 +1001,6 @@ <translation id="3711895659073496551">Arrêter</translation> <translation id="3715569262675717862">Authentification basée sur les certificats client</translation> <translation id="3736879847913515635">Autoriser l'ajout de personnes dans le gestionnaire d'utilisateurs</translation> -<translation id="3737544779868348650">Nom d'hôte du réseau de l'appareil</translation> <translation id="3746590506846867985"> Cette règle s'applique à l'écran de connexion. Veuillez également consulter la règle <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> qui concerne la session utilisateur. Nous vous recommandons de définir ces deux règles sur la même valeur. 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 une virgule 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/. @@ -1111,6 +1115,7 @@ Chaque entrée de la liste contient un dictionnaire qui doit inclure l'identifiant d'extension dans le champ "extension-id", ainsi que son adresse URL dans le champ "update-url".</translation> <translation id="3874773863217952418">Activer la fonctionnalité "Appuyer pour rechercher"</translation> <translation id="3877517141460819966">Mode d'authentification à deux facteurs intégré</translation> +<translation id="3879208481373875102">Configurer la liste des applications Web installées d'office</translation> <translation id="388237772682176890">Cette règle a été abandonnée dans la version M53 et supprimée dans la version M54, car le protocole SPDY 3.1 n'est plus pris en charge. Elle désactive l'utilisation du protocole SPDY dans <ph name="PRODUCT_NAME" />. @@ -1354,6 +1359,10 @@ Pour accéder à une description complète de la structure et des paramètres possibles pour cette règle, veuillez consulter https://www.chromium.org/administrators/policy-list-3/extension-settings-full.</translation> <translation id="4554651132977135445">Mode de traitement du bouclage pour les règles relatives aux utilisateurs</translation> +<translation id="4554841826517980623">Cette règle permet de déterminer si la fonctionnalité Partages de fichiers en réseau pour <ph name="PRODUCT_NAME" /> doit détecter les partages sur le réseau via le protocole <ph name="NETBIOS_PROTOCOL" />. + Lorsque cette règle est définie sur "True", la détection des partages sur le réseau s'effectue via le protocole <ph name="NETBIOS_PROTOCOL" />. + Lorsque cette règle est définie sur "False", le protocole <ph name="NETBIOS_PROTOCOL" /> n'est pas utilisé pour détecter les partages. + Si vous ne configurez pas cette règle, le paramètre sera désactivé par défaut pour les utilisateurs gérés par une entreprise et activé par défaut pour les utilisateurs non gérés.</translation> <translation id="4555850956567117258">Activer l'attestation à distance pour l'utilisateur</translation> <translation id="4557134566541205630">URL de la page Nouvel onglet du moteur de recherche par défaut</translation> <translation id="4567137030726189378">Autoriser l'utilisation des outils pour les développeurs</translation> @@ -1779,6 +1788,7 @@ Si vous ne définissez pas cette règle, les commentaires audio sont désactivés au premier affichage de l'écran de connexion. Les utilisateurs peuvent les activer ou les désactiver à tout moment, et leur état sur l'écran de connexion est appliqué à tous les utilisateurs.</translation> <translation id="5868414965372171132">Configuration réseau au niveau de l'utilisateur</translation> +<translation id="5879014913445067283">Contrôler la détection des partages de fichiers sur le réseau via <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Paramètre de cookies par défaut</translation> <translation id="5887414688706570295">Configure le préfixe TalkGadget utilisé par les hôtes d'accès à distance et empêche les utilisateurs de le modifier. @@ -2242,6 +2252,17 @@ Si elle n'est pas configurée, l'utilisateur peut être invité à effectuer l'importation, ou celle-ci peut se faire automatiquement.</translation> <translation id="7063895219334505671">Autoriser les fenêtres pop-up sur ces sites</translation> +<translation id="706568410943497889"> + Lorsque cette règle est définie sur "True", <ph name="PRODUCT_NAME" /> est autorisé à collecter les journaux d'événements WebRTC à partir des services Google (Google Meet, par exemple) et à les transférer vers Google. + + Si la règle est définie sur "False" ou n'est pas définie, <ph name="PRODUCT_NAME" /> ne peut pas collecter ces journaux ni les transférer. + + Ces journaux contiennent des informations de diagnostic utiles lors du débogage de problèmes liés aux appels audio ou vidéo dans Chrome, telles que l'horodatage et la taille des paquets RTP envoyés et reçus, des commentaires sur l'encombrement du réseau, et des métadonnées relatives à l'horodatage et à la qualité des trames vidéo et audio. Les journaux n'incluent aucun contenu audio ou vidéo des appels. + + Cette collecte de données par Chrome ne peut être déclenchée que par des services Web de Google, tels que Google Hangouts ou Google Meet. + + Google peut associer ces journaux à d'autres journaux collectés par le service Google proprement dit à l'aide d'un ID de session dans le but de faciliter le débogage. + </translation> <translation id="706669471845501145">Autoriser les sites à afficher des notifications sur le bureau</translation> <translation id="7072208053150563108">Fréquence de modification du mot de passe machine</translation> <translation id="7074513465313721551">Configurez la liste des domaines de confiance pour la navigation privée. Cela signifie que, pour les domaines de cette liste : @@ -2375,6 +2396,9 @@ <translation id="7336878834592315572">Conserver les cookies pendant toute la durée de la session</translation> <translation id="7340034977315324840">Indiquer les périodes d'activité de l'appareil</translation> <translation id="7343497214039883642">Fichier de configuration des imprimantes d'entreprise pour des appareils</translation> +<translation id="7349338075015720646">Établit une liste de sites Web installés de façon silencieuse, sans intervention de l'utilisateur, qui ne peuvent être ni désinstallés, ni désactivés par l'utilisateur. + + Chaque élément de la liste de cette règle est un objet constitué de deux paramètres : "url" et "launch_container". "url" correspond à l'URL de l'application Web à installer et "launch_container" désigne l'endroit où celle-ci doit s'ouvrir ("window" ou "tab"). Lorsque le paramètre "launch_container" n'est pas défini, l'application se lance dans une fenêtre si Chrome considère qu'il s'agit d'une progressive web app. Sinon, elle s'affiche dans un onglet.</translation> <translation id="7367028210010532881">Dans le cadre du service de navigation sécurisée, un avertissement s'affiche lorsque les utilisateurs essaient d'accéder à des sites potentiellement malveillants. Si cette règle est activée, les utilisateurs ne peuvent pas poursuivre et accéder aux sites en question lorsqu'un cet avertissement s'affiche. Si cette règle est désactivée ou n'est pas configurée, les utilisateurs peuvent choisir de poursuivre et accéder ainsi aux sites potentiellement malveillants après avoir lu l'avertissement. @@ -2839,6 +2863,7 @@ Notez que le terme "version" désigne autant les versions exactes (telles que 61.0.3163.120) que les préfixes de version (tels que 61.0). </translation> <translation id="8544375438507658205">Moteur de rendu HTML par défaut pour <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Autoriser la synchronisation des SMS entre le téléphone et le Chromebook</translation> <translation id="8549772397068118889">Prévenir en cas de consultation de sites en dehors des packs de contenu</translation> <translation id="8566842294717252664">Masquer le Chrome Web Store sur la page Nouvel onglet et dans le lanceur d'applications</translation> <translation id="8586528890725660268">Indique les imprimantes auxquelles un utilisateur n'a pas accès. @@ -2883,6 +2908,11 @@ Si cette règle n'est pas configurée, le service de protection par mot de passe ne protège que les mots de passe Google. Toutefois, l'utilisateur peut modifier ce paramètre.</translation> <translation id="8672321184841719703">Cibler une version pour les mises à jour automatiques</translation> <translation id="867410340948518937">U2F (Deuxième facteur universel)</translation> +<translation id="8682611302223077049">Permet de fixer la période, en millisecondes, pendant laquelle les utilisateurs sont avertis que <ph name="PRODUCT_NAME" /> doit être relancé ou qu'un appareil <ph name="PRODUCT_OS_NAME" /> doit être redémarré pour appliquer une mise à jour en attente. + + Au cours de cette période, l'utilisateur est régulièrement informé de la nécessité d'appliquer la mise à jour. Pour les appareils <ph name="PRODUCT_OS_NAME" />, une notification de redémarrage s'affiche dans la barre d'état système lorsqu'une mise à jour est détectée. Pour les navigateurs <ph name="PRODUCT_NAME" />, lorsqu'un tiers de la période de notification s'est écoulé, le menu d'application change pour indiquer qu'il est nécessaire de redémarrer le navigateur. La notification change de couleur une première fois lorsque les deux tiers de la période de notification se sont écoulés et une deuxième fois à l'issue de cette période. Les notifications supplémentaires activées par la règle <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> pour les navigateurs suivent ce même programme. + + Si ce paramètre n'est pas défini, la période par défaut est fixée à 345 600 000 millisecondes (quatre jours) pour les appareils <ph name="PRODUCT_OS_NAME" /> et à 604 800 000 millisecondes (une semaine) pour les navigateurs <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">L'avertissement relatif à la protection par mot de passe est déclenché par la réutilisation d'un mot de passe</translation> <translation id="8693243869659262736">Utiliser le client DNS intégré</translation> <translation id="8704831857353097849">Liste des plug-ins désactivés</translation> @@ -2927,6 +2957,7 @@ Ce facteur doit être de 100 % ou plus. Les valeurs qui auraient pour conséquence de rendre le délai d'assombrissement de l'écran en mode Présentation plus court que le délai d'assombrissement de l'écran standard ne sont pas autorisées.</translation> <translation id="8798099450830957504">Par défaut</translation> +<translation id="8801680448782904838">Avertir un utilisateur qu'un redémarrage du navigateur ou de l'appareil est recommandé ou requis</translation> <translation id="8818173863808665831">Permet d'indiquer l'emplacement géographique de l'appareil. Si cette règle n'est pas définie, ou si la valeur "false" lui est attribuée, l'emplacement n'est pas indiqué.</translation> @@ -3093,6 +3124,11 @@ Si cette règle est définie sur "True", <ph name="PRODUCT_OS_NAME" /> déclenche un redémarrage lorsque l'utilisateur arrête l'appareil. <ph name="PRODUCT_OS_NAME" /> remplace toutes les occurrences des boutons d'arrêt de l'interface utilisateur par des boutons de redémarrage. Si l'utilisateur arrête l'appareil au moyen du bouton Marche/Arrêt, celui-ci ne redémarre pas automatiquement, même si la règle est activée.</translation> <translation id="9152473318295429890">Activer les suggestions contextuelles des pages Web associées</translation> <translation id="9158929520101169054">Autoriser la connexion multicompte dans le navigateur</translation> +<translation id="9159126470527871268">Avertit les utilisateurs que <ph name="PRODUCT_NAME" /> doit être relancé ou que l'appareil <ph name="PRODUCT_OS_NAME" /> doit être redémarré pour qu'une mise à jour en cours puisse être appliquée. + + Cette règle active l'envoi de notifications pour avertir l'utilisateur qu'un redémarrage du navigateur ou de l'appareil est recommandé ou requis. Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> indique à l'utilisateur, par le biais de modifications discrètes du menu, qu'un redémarrage est nécessaire. Pour l'appareil <ph name="PRODUCT_OS_NAME" />, une notification s'affiche dans la barre d'état système. Si la règle est définie sur "Recommandé", un avertissement récurrent s'affiche, indiquant qu'un redémarrage est recommandé. L'utilisateur peut ignorer cet avertissement et redémarrer le navigateur ou l'appareil plus tard. Si elle est définie sur "Requis", un avertissement récurrent s'affiche, indiquant que le redémarrage du navigateur ou de l'appareil sera forcé à l'issue de la période de notification. Par défaut, ce délai est de sept jours pour <ph name="PRODUCT_NAME" /> et de quatre jours pour l'appareil <ph name="PRODUCT_OS_NAME" />, et peut être configuré à l'aide du paramètre <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + La session de l'utilisateur est restaurée après le redémarrage.</translation> <translation id="9165792353046089850">Cette règle permet de définir si les sites Web sont autorisés à accéder aux appareils USB connectés. Soit l'accès est complètement bloqué, soit l'utilisateur reçoit un message chaque fois qu'un site Web souhaite accéder aux appareils USB connectés. Cette règle peut être ignorée pour les formats d'URL spécifiques qui utilisent les règles "WebUsbAskForUrls" et "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index 45b18ae..9f225989 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -205,6 +205,13 @@ <ph name="PROXY_HELP_URL" />.</translation> <translation id="1502843533062797703">તૃતીય-પક્ષના સૉફ્ટવેર ઇન્જેક્શન બ્લૉક કરવાનું ચાલુ કરો</translation> <translation id="1504431521196476721">દૂરસ્થ પ્રમાણન</translation> +<translation id="1507957856411744193">જો આ નીતિને True પર સેટ કરેલ હોય, તો <ph name="PRODUCT_NAME" /> માત્ર RFC1918/RFC4193 ગોપનીય ઍડ્રેસ પરનાં જ નહીં, પરંતુ બધાં જ IP ઍડ્રેસ પરના કાસ્ટ ઉપકરણો પર કનેક્ટ કરશે. + + જો આ નીતિને False પર સેટ કરેલ હોય, તો <ph name="PRODUCT_NAME" /> માત્ર RFC1918/RFC4193 ગોપનીય ઍડ્રેસ પરના કાસ્ટ ઉપકરણો પર જ કનેક્ટ કરશે. + + જો આ નીતિ સેટ કરેલ ન હોય, તો <ph name="PRODUCT_NAME" /> માત્ર RFC1918/RFC4193 ગોપનીય ઍડ્રેસ પરના કાસ્ટ ઉપકરણો પર જ કનેક્ટ કરશે, સિવાય કે CastAllowAllIPની સુવિધા ચાલુ કરેલી હોય. + + જો "EnableMediaRouter" નીતિ False પર સેટ કરેલ હોય, તો આ નીતિના મૂલ્યની કોઈ અસર નહીં થાય.</translation> <translation id="1509692106376861764">આ નીતિને <ph name="PRODUCT_NAME" /> સંસ્કરણ 29 થી હટાવવામાં આવી છે.</translation> <translation id="1514888685242892912"><ph name="PRODUCT_NAME" /> ચાલુ કરો</translation> <translation id="1522425503138261032">વપરાશકર્તાના ભૌતિક સ્થાનને શોધવાની સાઇટ્સને મંજૂરી આપો</translation> @@ -372,6 +379,7 @@ જો આ સેટિંગ સેટ કર્યા વગર છોડી હોય તો વપરાશકર્તા આ ફંકશનનો ઉપયોગ કરવો કે નહીં તે નક્કી કરી શકે છે.</translation> <translation id="2006530844219044261">પાવર સંચાલન</translation> <translation id="201557587962247231">ઉપકરણ સ્થિતિ રિપોર્ટ અપલોડ્સની તીવ્રતા</translation> +<translation id="2017301949684549118">સાઇલન્ટ રીતે ઇન્સ્ટૉલ કરવા વેબ માટે URLs.</translation> <translation id="2018836497795982119">અવધિનો ઉલ્લેખ મિલિસેકંડમાં કરે છે કે જેના પર ઉપકરણ સંચાલન સેવાને ઉપકરણ નીતિ માહિતી માટે ક્વેરી કરવામાં આવે છે. આ નીતિને સેટ કરવું 3 કલાકના ડિફૉલ્ટ મૂલ્યને ઓવરરાઇડ કરે છે. આ નીતિ માટેના માન્ય મૂલ્યો 1800000 (30 મિનિટ) થી 86400000 (1 દિવસ) સુધીની શ્રેણીમાં છે. આ શ્રેણીમાં ન હોય તેવા કોઈપણ મૂલ્ય તેની અનુક્રમે આવતી સીમાથી જોડાઈ જશે. જો પ્લેટફોર્મ નીતિ સૂચનાઓનું સમર્થન કરે છે, તો તાજું કરવા માટેનો વિલંબ 24 કલાક પર સેટ કરવામાં આવશે કારણ કે એ અપેક્ષા કરવામાં આવે છે કે જ્યારે પણ નીતિ બદલાય છે ત્યારે નીતિ સૂચનાઓ આપમેળે તાજું કરવાની ફરજ પાડશે. @@ -712,6 +720,11 @@ Google ના શોધ URL નો ઉલ્લેખ આ રીતે કરવામાં આવી શકે છે: <ph name="GOOGLE_SEARCH_URL" />. જ્યારે 'DefaultSearchProviderEnabled' નીતિ સક્ષમ કરેલ હોય ત્યારે આ વિકલ્પ સેટ કરેલો હોવો આવશ્યક છે અને ત્યારે જ પાલન કરવામાં આવશે જો આ કેસ હોય.</translation> +<translation id="2659019163577049044">જો આ સેટિંગને ચાલુ કરેલ હોય, તો વપરાશકર્તાઓને તેમના ઉપકરણોને તેમના ફોન અને Chromebooks વચ્ચે SMS સંદેશાને સિંક કરવા માટે સેટઅપ કરવાની મંજૂરી આપવામાં આવશે. ધ્યાનમાં રાખો કે જો આ નીતિની મંજૂરી આપેલી હોય, તો વપરાશકર્તાઓએ સેટઅપ ફ્લોને પૂર્ણ કરીને આ સુવિધામાં નિશ્ચિતપણે પસંદગી કરવી જરૂરી છે. એકવાર સેટઅપ ફ્લો પૂર્ણ થઈ જાય, તે પછી વપરાશકર્તાઓ તેમની Chromebooks પર SMS સંદેશા મોકલી અને પ્રાપ્ત કરી શકશે. + + જો આ સેટિંગ અક્ષમ કરેલ હોય, તો વપરાશકર્તાને SMS સિંક કરવાનું સેટઅપ કરવાની મંજૂરી આપવામાં આવશે. + + જો આ નીતિ સેટ કરેલ ન હોય, તો મેનેજ કરાયેલ વપરાશકર્તા માટે ડિફૉલ્ટની મંજૂરી નથી અને બિન-મેનેજ કરાયેલ વપરાશકર્તાઓને મંજૂરી છે.</translation> <translation id="2660846099862559570">પ્રોક્સીનો ઉપયોગ ક્યારેય કરશો નહીં</translation> <translation id="267596348720209223">શોધ પ્રદાતા દ્વારા સપોર્ટેડ અક્ષર એન્કોડિંગ્સનો ઉલ્લેખ કરે છે. એન્કોડિંગ્સ એ કોડ પૃષ્ઠ નામ છે જેમ કે UTF-8, GB2312, અને ISO-8859-1. તેનો આપેલ ક્રમમાં પ્રયાસ થાય છે. @@ -787,7 +800,6 @@ જો તમે આ સેટિંગ અક્ષમ કરો અથવા કોઈ મૂલ્ય સેટ ન કરો, તો પ્રિન્ટ પ્રીવ્યૂ ડિફૉલ્ટ ગંતવ્ય પસંદગી તરીકે એકદમ તાજેતરમાં વાપરેલ પ્રિન્ટરનો ઉપયોગ કરશે. જો તમે આ સેટિંગ સક્ષમ કરો છો, તો પ્રિન્ટ પ્રીવ્યૂ ડિફૉલ્ટ ગંતવ્ય પસંદગી તરીકે OS સિસ્ટમ ડિફૉલ્ટ પ્રિન્ટરનો ઉપયોગ કરશે.</translation> -<translation id="2867699958489427143">જો OS વર્ઝન લક્ષ્ય કરતાં નવું હોય, તો લક્ષ્ય વર્ઝન પર રોલબૅક કરો અને તેના પર રહો. પ્રક્રિયા દરમિયાન પૂર્ણ પાવરવૉશ કરો.</translation> <translation id="2872961005593481000">શટ ડાઉન કરો</translation> <translation id="2874209944580848064">Android ઍપ્લિકેશનોનું સમર્થન કરતાં <ph name="PRODUCT_OS_NAME" /> ઉપકરણો માટે નોંધ:</translation> <translation id="2877225735001246144">Kerberos પ્રમાણીકરણ નેગોશિયેટ થતું હોય ત્યારે CNAME લૂકઅપને અક્ષમ કરો</translation> @@ -1064,7 +1076,6 @@ <translation id="3715569262675717862">ક્લાયન્ટ પ્રમાણપત્રો આધારિત પ્રમાણીકરણ</translation> <translation id="3734995764843493369">દરરોજ (24 કલાક) પાસવર્ડ એન્ટ્રી જરૂરી છે</translation> <translation id="3736879847913515635">વપરાશકર્તા સંચાલકમાં વ્યક્તિ ઉમેરોને સક્ષમ કરો</translation> -<translation id="3737544779868348650">ઉપકરણના નેટવર્કના હોસ્ટનું નામ</translation> <translation id="3746590506846867985"> આ નીતિ સાઇન-ઇન સ્ક્રીનને લાગુ થાય છે. કૃપા કરીને વપરાશકર્તાના સત્રને લાગુ થતી <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> નીતિ પણ જુઓ. બન્ને નીતિઓને સમાન મૂલ્ય પર સેટ કરવાની ભલામણ કરવામાં આવે છે. જો મૂલ્યો મેળ નહીં ખાય, તો વપરાશકર્તા નીતિ દ્વારા ઉલ્લેખિત મૂલ્ય લાગુ થતું હોય ત્યારે વપરાશકર્તા સત્રમાં દાખલ થતી વખતે વિલંબ થઈ શકે છે. જો નીતિ ચાલુ કરવામાં આવી હોય, તો અલ્પવિરામથી છૂટી પાડેલી સૂચિમાંના નિર્દિષ્ટ ઘટકો તેની પોતાની પ્રક્રિયા મુજબ ચાલશે. આનાથી સબડોમેન દ્વારા નામ અપાયેલ મૂળ ઘટકો પણ અલગ થઈ જશે; દા.ત. https://example.com/ ને ઉલ્લેખિત કરવાથી https://foo.example.com/ પણ https://example.com/ સાઇટના ભાગ રૂપે અલગ થઈ જશે. @@ -1183,6 +1194,7 @@ દરેક સૂચિ એન્ટ્રીમાં એક શબ્દકોશ છે જેમાં 'એક્સ્ટેન્શન-id' ફીલ્ડમાં એક્સ્ટેન્શન ID અને 'અપડેટ-url' ફીલ્ડમાં તેનો અપડેટ URL શામેલ હોવો જોઈએ.</translation> <translation id="3874773863217952418">શોધ માટે ટૅપ કરો ચાલુ કરો</translation> <translation id="3877517141460819966">સંકલિત દ્વિતીય-ફેક્ટર પ્રમાણીકરણ મોડ</translation> +<translation id="3879208481373875102">ફરજિયાત-ઇન્સ્ટૉલ કરાયેલ વેબ ઍપની સૂચિ ગોઠવો</translation> <translation id="388237772682176890">આ નીતિ M53 માં ટાળવામાં આવી અને M54 માં દૂર કરવામાં આવી છે, કારણ કે SPDY/3.1 સમર્થન દૂર કરવામાં આવ્યું છે. <ph name="PRODUCT_NAME" /> માં SPDY પ્રોટોકોલના ઉપયોગને અક્ષમ કરે છે. @@ -1472,6 +1484,10 @@ સંભવિત સેટિંગ અને આ નીતિની સંરચનાના સંપૂર્ણ વર્ણન માટે કૃપા કરીને https://www.chromium.org/administrators/policy-list-3/extension-settings-full ની મુલાકાત લો </translation> <translation id="4554651132977135445">વપરાશકર્તા નીતિ લૂપબૅક પ્રક્રિયા મોડ</translation> +<translation id="4554841826517980623">આ નીતિ એ નિયંત્રિત કરે છે કે <ph name="PRODUCT_NAME" /> માટેની નેટવર્ક ફાઇલ શેર સુવિધાએ નેટવર્ક પર શેર શોધવા માટે <ph name="NETBIOS_PROTOCOL" />નો ઉપયોગ કરવો જોઈએ કે નહીં. + જ્યારે આ નીતિ True પર સેટ કરેલી હોય, ત્યારે શેર શોધ સુવિધા નેટવર્ક પર શેર શોધવા માટે <ph name="NETBIOS_PROTOCOL" /> પ્રોટોકોલનો ઉપયોગ કરશે. + જ્યારે આ નીતિને False પર સેટ કરેલ હોય, ત્યારે શેર શોધ સુવિધા શેર શોધવા માટે <ph name="NETBIOS_PROTOCOL" /> પ્રોટોકોલનો ઉપયોગ કરશે નહીં. + જો નીતિને સેટ કર્યા વિના રાખવામાં આવે, તો ડિફૉલ્ટને એન્ટરપ્રાઇઝ દ્વારા મેનેજ કરાતા વપરાશકર્તાઓ માટે બંધ કરવામાં આવે છે અને મેનેજ કરાતા વપરાશકર્તા ન હોય તેના માટે ચાલુ કરવામાં આવે છે.</translation> <translation id="4555850956567117258">વપરાશકર્તા માટે દૂરસ્થ પ્રમાણન સક્ષમ કરો</translation> <translation id="4557134566541205630">ડિફોલ્ટ શોધ પ્રદાતા નવું ટેબ પૃષ્ઠ URL</translation> <translation id="4567137030726189378">ડેવલપરના સાધનોનો ઉપયોગ કરવાની મંજૂરી આપો</translation> @@ -1982,6 +1998,7 @@ જો આ નીતિને સેટ કર્યા વિના છોડેલી હોય, તો લોગિન સ્ક્રીન પહેલી વખત બતાવવામાં આવે ત્યારે બોલાયેય પ્રતિસાદ અક્ષમ હોય છે. વપરાશકર્તાઓ બોલાયેલ પ્રતિસાદને કોઈપણ સમયે સક્ષમ અથવા અક્ષમ કરી શકે છે અને લોગિન સ્ક્રીન પર તેની સ્થિતિ વપરાશકર્તાઓ વચ્ચે નિરંતર હોય છે.</translation> <translation id="5868414965372171132">વપરાશકર્તા-સ્તર નેટવર્ક ગોઠવણી</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> દ્વારા નેટવર્ક ફાઇલ શેર શોધને નિયંત્રિત કરે છે</translation> <translation id="5883015257301027298">ડિફૉલ્ટ કૂકીઝ સેટિંગ</translation> <translation id="5887414688706570295">TalkGadget પ્રીફિક્સને ગોઠવે છે જેનો ઉપયોગ રીમોટ ઍક્સેસ હોસ્ટ્સ દ્વારા કરવામાં આવશે અને વપરાશકર્તાનોને તેને બદલવાથી અટકાવે છે. @@ -2262,6 +2279,7 @@ <ph name="SYNC_DISABLED_POLICY_NAME" /> નીતિ RoamingProfileSupportEnabledને ઓવરરાઇડ કરીને, બધા ડેટાને સિંક કરવાનું અક્ષમ કરે છે.</translation> <translation id="6731757988219967594">પુખ્ત લોકો માટેના કન્ટેન્ટ માટે ઉચ્ચ લેવલની સાઇટને ફિલ્ટર કરો (પણ એમ્બેડેડ iframes નહીં)</translation> +<translation id="6734521799274931721">ChromeOSની ઉપલબ્ધતા માટે 'નેટવર્ક ફાઇલ શેર'નું નિયંત્રણ કરે છે</translation> <translation id="6735701345096330595">જોડણી-તપાસ ભાષાઓને ચાલુ કરવાની ફરજ પાડો</translation> <translation id="673699536430961464">આ સેટિંગ વપરાશકર્તાઓને તેમના <ph name="PRODUCT_OS_NAME" /> ડિવાઇસમાં સાઇન ઇન કરે તે પછી તેમને તેમની બ્રાઉઝર વિંડોના કન્ટેન્ટ ક્ષેત્રમાં Google એકાઉન્ટ વચ્ચે સ્વિચ કરવાની મંજૂરી આપે છે. @@ -2446,6 +2464,17 @@ જો તે સેટ કરેલું નથી, તો વપરાશકર્તાને તે આયાત કરવું કે નહીં તે પૂછવામાં આવશે અથવા આપમેળે આયાત થશે.</translation> <translation id="7063895219334505671">આ સાઇટ્સમાં પૉપઅપ્સને મંજૂરી આપો</translation> +<translation id="706568410943497889"> + જો આ નીતિને true પર સેટ કરેલ હોય, <ph name="PRODUCT_NAME" />ને Google સેવાઓ (દા.ત. Google Meet) તરફથી WebRTC ઇવેન્ટ લૉગ એકત્રિત કરવાની અને તે લૉગને Google પર અપલોડ કરવાની મંજૂરી આપવામાં આવે છે. + + જો આ નીતિ પર false સેટ કરો હોય, તો <ph name="PRODUCT_NAME" /> લૉગ એકત્રિત અથવા અપલોડ કરશે નહીં. + + આ લૉગમાં જ્યારે Chromeમાં ઑડિઓ કે વીડિઓ કૉલમાં ડિબગિંગ સમસ્યાઓ આવે ત્યારે સહાયરૂપ થાય તેવી નિદાન માહિતી હોય છે, જેમ કે મોકલેલ અને પ્રાપ્ત RTP પૅકેજનો સમય અને કદ, નેટવર્કના ધસારા વિશે પ્રતિસાદ અને ઑડિઓ અને વીડિઓ ફ્રેમના સમય અને ક્વૉલિટી વિશેનો મેટાડેટા. + + Chromeનો આ ડેટા સંગ્રહ માત્ર Googleની વેબ સેવાઓ, જેમ કે Google Hangouts અથવા Google Meet દ્વારા ટ્રિગર થાય છે. + + Google આ લૉગને સત્ર IDના માધ્યમથી, Google સેવાએ પોતે એકત્રિત કરેલા અન્ય લૉગ સાથે જોડી શકે છે; આવું ડિબગિંગને સરળ બનાવવાના હેતુથી કરવામાં આવે છે. + </translation> <translation id="706669471845501145">સાઇટ્સને ડેસ્કટૉપ સૂચનાઓ બતાવવાની મંજૂરી આપો</translation> <translation id="7070525176564511548">દર અઠવાડિયે (168 કલાકે) પાસવર્ડ એન્ટ્રી જરૂરી છે</translation> <translation id="7072208053150563108">મશીન પાસવર્ડ બદલવાનો દર</translation> @@ -2598,6 +2627,9 @@ <translation id="7336878834592315572">સત્રની અવધિ માટે કૂકીઝ રાખો</translation> <translation id="7340034977315324840">ઉપરકણનાં પ્રવૃત્તિ સમયની જાણ કરો</translation> <translation id="7343497214039883642">ઉપકરણો માટે એન્ટરપ્રાઇઝ પ્રિન્ટર ગોઠવણી ફાઇલ</translation> +<translation id="7349338075015720646">એવી વેબસાઇટની સૂચિનો ઉલ્લેખ કરે છે કે જે વપરાશકર્તાની ક્રિયાપ્રતિક્રિયા વિના, સાઇલન્ટ રીતે ઇન્સ્ટૉલ થાય છે અને જેને વપરાશકર્તા અનઇન્સ્ટૉલ કે બંધ કરી શકતા નથી. + + આ નીતિની દરેક આઇટમ બે સભ્યો ધરાવતો એક ઑબ્જેક્ટ છે: "url" અને "launch_container". "url" એ ઇન્સ્ટૉલ કરવા માટેનું વેબ ઍપનું URL હોવું જોઈએ અને વેબ ઍપ એકવાર ઇન્સ્ટૉલ થાય પછી તે કેવી રીતે ખુલે તે જણાવતી "વિંડો" અથવા "ટૅબ" હોવી જોઈએ. જો "launch_container"ને છોડી દેવામાં આવે, તો ઍપ વિંડોમાં લૉન્ચ થશે પણ જો Chrome તેને પ્રગતિશીલ વેબ ઍપ તરીકે ધ્યાનમાં લે અને નહીં તો પછી ટૅબમાં લૉન્ચ થશે.</translation> <translation id="7367028210010532881">જ્યારે વપરાશકર્તાઓ સંભવિત રૂપે દૂષિત તરીકે ચિહ્નિત કરેલી હોય તેવી સાઇટ પર નૅવિગેટ કરે ત્યારે સુરક્ષિત બ્રાઉઝિંગ સેવા એક ચેતવણી પેજ બતાવે છે. આ સેટિંગને ચાલુ કરવું તે વપરાશકર્તાઓને કોઈપણ રીતે ચેતવણી પેજથી દૂષિત સાઇટ પર આગળ વધવાથી અટકાવે છે. જો આ સેટિંગ બંધ હોય અથવા ગોઠવેલ ન હોય, તો વપરાશકર્તાઓ ચેતવણી જોયા પછી ચિહ્નિત કરેલી સાઇટ પર આગળ વધવાનું પસંદ કરી શકશે. @@ -3103,6 +3135,7 @@ અહીં "વર્ઝન" સમાન વર્ઝન તરીકે, જેમ કે '61.0.3163.120' અથવા વર્ઝનના પૂર્વગ તરીકે, જેમ કે '61.0' તરીકે હોઈ શકે છે. </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> માટેનું ડિફૉલ્ટ HTML રેંડરર</translation> +<translation id="8544465954173828789">SMS સંદેશાને ફોનમાંથી Chromebook પર સિંક કરી શકાય તે માટેની મંજૂરી આપો.</translation> <translation id="8549772397068118889">જ્યારે કન્ટેન્ટ પૅક્સની બહારની સાઇટની મુલાકાત લઈ રહ્યાં હોય ત્યારે ચેતવો</translation> <translation id="8566842294717252664">નવા ટેબ પૃષ્ઠ અને એપ લૉન્ચરથી વેબ દુકાનને છુપાવવી</translation> <translation id="8586528890725660268">વપરાશકર્તા ઉપયોગમાં ન લઈ શકે તે પ્રિન્ટરને ઉલ્લેખિત કરે છે. @@ -3150,6 +3183,11 @@ જો આ નીતિ સેટ કર્યા વિનાની હશે, તો પાસવર્ડ સંરક્ષણ સેવા માત્ર Google પાસવર્ડની સુરક્ષા કરશે, પણ વપરાશકર્તા આ સેટિંગ બદલી શકશે.</translation> <translation id="8672321184841719703">લક્ષ્ય સ્વતઃ અપડેટ સંસ્કરણ</translation> <translation id="867410340948518937">U2F (યુનિવર્સલ દ્વિતીય ફેક્ટર)</translation> +<translation id="8682611302223077049">તમને મિલીસેકન્ડમાં સમયગાળો સેટ કરવાની મંજૂરી આપે છે, જેમાં વપરાશકર્તાઓને <ph name="PRODUCT_NAME" /> ફરીથી લૉન્ચ કરવાની આવશ્યકતા વિશે અથવા કોઈ <ph name="PRODUCT_OS_NAME" />ના ઉપકરણ પર બાકી અપડેટ લાગુ કરવાનું ફરીથી શરૂ કરવાની આવશ્યકતા વિશે જાણ કરવામાં આવે છે. + + આ સમયગાળા દરમ્યાન, વપરાશકર્તાને અપડેટની આવશ્યકતા વિશે નિરંતર જાણ કરતા રહેવામાં આવે છે. <ph name="PRODUCT_OS_NAME" />ના ઉપકરણો માટે, જ્યારે અપગ્રેડ મળે ત્યારે સિસ્ટમ ટ્રેમાં ફરી શરૂ કરવાનું નોટિફિકેશન દેખાય છે. <ph name="PRODUCT_NAME" /> બ્રાઉઝર માટે, જ્યારે નોટિફિકેશનના સમયગાળાનો એક તૃતીયાંશ સમય પસાર થાય, ત્યારે ઍપ મેનૂમાં રિલૉન્ચની આવશ્યકતા દર્શાવવા માટે ફેરફાર થાય છે. આ નોટિફિકેશનનો રંગ સમયગાળાના બે તૃતીયાંશ સમય પસાર થાય ત્યારે અને ફરી જ્યારે સંપૂર્ણ સમયગાળો પૂર્ણ થાય ત્યારે ફરી બદલાય છે. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> નીતિ દ્વારા ચાલુ કરેલ અતિરિક્ત નોટિફિકેશન આ જ શેડ્યૂલ ફૉલો કરે છે. + + જો સેટ કરવામાં આવેલ ન હોય, તો <ph name="PRODUCT_OS_NAME" /> ઉપકરણો માટે 345600000 મિલીસેકન્ડનો (ચાર દિવસ)ના અને <ph name="PRODUCT_NAME" /> માટે 604800000 મિલીસેકન્ડનો (એક અઠવાડિયા)ના ડિફૉલ્ટ સમયગાળાનો ઉપયોગ કરવામાં આવે છે.</translation> <translation id="8685024486845674965">પાસવર્ડનો ફરી ઉપયોગ કરવાથી પાસવર્ડની સુરક્ષા ચેતવણી ટ્રિગર થઈ છે</translation> <translation id="8693243869659262736">બિલ્ટ-ઇન DNS ક્લાયન્ટનો ઉપયોગ કરો</translation> <translation id="8704831857353097849">અક્ષમ પ્લગિન્સની સૂચિ</translation> @@ -3195,6 +3233,7 @@ માપ પરિબળ 100% અથવા વધુ હોવું આવશ્યક છે. પ્રસ્તુતિ મોડમાં સ્ક્રીન મંદતા વિલંબને નિયમિત સ્ક્રીન મંદતા વિલંબ કરતાં નાનાં બનાવશે તેવા મૂલ્યોને મંજૂરી નથી.</translation> <translation id="8798099450830957504">ડિફૉલ્ટ</translation> +<translation id="8801680448782904838">એક વપરાશકર્તાને સૂચિત કરો કે બ્રાઉઝર રીલૉન્ચ કરવાનો અથવા ઉપકરણને ફરી શરૂ કરવાનો સુઝાવ આપેલ છે અથવા આવશ્યક છે</translation> <translation id="8818173863808665831">ઉપકરણનાં ભૌગોલિક સ્થાનની જાણ કરો. જો આ નીતિ સેટ કરેલી નથી અથવા ફૉલ્સ પર સેટ કરેલી છે, તો સ્થાનની જાણ કરવામાં આવશે નહીં.</translation> @@ -3407,6 +3446,11 @@ જો આ નીતિ true પર સેટ કરવામાં આવી હોય, તો જ્યારે વપરાશકર્તા ઉપકરણને શટ ડાઉન કરશે ત્યારે <ph name="PRODUCT_OS_NAME" /> એક રીબૂટ ટ્રિગર કરશે. <ph name="PRODUCT_OS_NAME" />, શટડાઉન બટનોની તમામ ઘટનાઓને UI માં રીબૂટ બટનો દ્વારા બદલે છે. જો વપરાશકર્તા પાવર બટનનો ઉપયોગ કરીને ઉપકરણને શટ ડાઉન કરે છે, તો નીતિ સક્ષમ હોય તો પણ તે આપમેળે રીબૂટ થશે નહીં.</translation> <translation id="9152473318295429890">સંબંધિત વેબ પેજના સંદર્ભગત સૂચનો ચાલુ કરો</translation> <translation id="9158929520101169054">બ્રાઉઝરમાં બહુવિધ સાઇન ઇનની મંજૂરી આપો</translation> +<translation id="9159126470527871268">વપરાશકર્તાઓને સૂચિત કરો કે બાકી અપડેટને લાગુ કરવા માટે <ph name="PRODUCT_NAME" />ને ફરીથી લૉન્ચ કરવું અથવા<ph name="PRODUCT_OS_NAME" />ને ફરી શરૂ કરવું આવશ્યક છે. + + આ નીતિ સેટિંગ વપરાશકર્તાને જાણ કરવા માટે નોટિફિકેશનને ચાલુ કરેલ છે કે બ્રાઉઝર ફરીથી લૉન્ચ કરવાનો અથવા ફરી શરૂ કરવાનો સુઝાવ આપેલ છે કે આવશ્યક છે. જો તે સેટ કરવામાં ન આવે, તો <ph name="PRODUCT_NAME" /> વપરાશકર્તાને જણાવે છે કે ઝીણવટભર્યા ફેરફારોથી તેના મેનૂને ફરીથી લૉન્ચ કરવું જરૂરી છે, જ્યારે <ph name="PRODUCT_OS_NAME" /> આ આવું સિસ્ટમ ટ્રેમાં નોટિફિકેશન દ્વારા જણાવે છે. જો 'સુઝાવ આપેલ' સેટ કરવામાં આવે, તો ફરીથી લૉન્ચ કરવાનો સુઝાવ આપેલ છે તેવી ચેતવણી વપરાશકર્તાને વારંવાર બતાવવામાં આવશે. વપરાશકર્તા ફરીથી લૉન્ચ કરવાની આ ચેતવણીને મુલતવી રાખી શકે છે. જો 'આવશ્યક' તરીકે સેટ કરવામાં આવે, તો વપરાશકર્તાને એવું જણાવતી ચેતવણી વારંવાર બતાવવામાં આવશે કે બ્રાઉઝરને એકવાર ફરી લૉન્ચ કરવાનું ફરજિયાત હશે જ્યાં સુધી નોટિફિકેશનનો સમયગાળો પસાર ન થઈ જાય. ડિફૉલ્ટ સમયગાળો <ph name="PRODUCT_NAME" /> માટે 7 દિવસ છે અને <ph name="PRODUCT_OS_NAME" /> માટે ચાર દિવસ છે અને કદાચ <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> નીતિ સેટિંગથી ગોઠવેલ છે. + + ફરી લૉન્ચ/ફરી શરૂ કર્યા પછી વપરાશકર્તાનું સત્રન પહેલાંના જેવું થઈ જશે.</translation> <translation id="9165792353046089850">વેબસાઇટને નજીકના કનેક્ટ કરેલા USB ઉપકરણો માટે ઍક્સેસ મેળવવાની મંજૂરી આપવી કે નહીં તે તમને સેટ કરવા દે છે. ઍક્સેસ સંપૂર્ણપણે બ્લૉક કરેલો હોઈ શકે છે અથવા કોઈ વેબસાઇટ નજીકના કનેક્ટ કરેલા USB ઉપકરણો માટે ઍક્સેસ મેળવવા માગે ત્યારે દર વખતે વપરાશકર્તાને પૂછવામાં આવી શકે છે. આ નીતિ 'WebUsbAskForUrls' અને 'WebUsbBlockedForUrls' નીતિઓનો ઉપયોગ કરીને વિશિષ્ટ URL પૅટર્ન માટે ઓવરરાઇડ થઈ શકે છે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 7ab4f64e..8ae4404 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -358,6 +358,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> में घटक के अपडेट चालू करती है</translation> <translation id="2006530844219044261">पावर प्रबंधन</translation> <translation id="201557587962247231">डिवाइस स्थिति रिपोर्ट अपलोड की आवृत्ति</translation> +<translation id="2017301949684549118">बिना सूचना के इंस्टॉल किए जाने वाले वेब ऐप्लिकेशन के लिए यूआरएल.</translation> <translation id="2018836497795982119">यह नीति 'डिवाइस नीति की जानकारी' के लिए क्वेरी की गई 'डिवाइस प्रबंधन सेवा' की अवधि को मिलीसेकंड में तय करती है. यह नीति सेट करने से 3 घंटो का डिफ़ॉल्ट मान ओवरराइड हो जाता है. इस नीति के मान्य मान 1800000 (30 मिनट) से 86400000 (1 दिन) तक हैं. इस रेंज में न आने वाला कोई भी मान उसकी करीबी सीमा पर रख दिया जाएगा. @@ -377,7 +378,7 @@ यदि इस पॉलिसी को सेट नहीं किया जाता है, तो चारों योजनाओं का उपयोग किया जाएगा.</translation> <translation id="2067011586099792101">सामग्री पैक से बाहर की साइटों की एक्सेस अवरुद्ध करें</translation> <translation id="2073552873076775140"><ph name="PRODUCT_NAME" /> में साइन इन करने देती है</translation> -<translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation> +<translation id="2077129598763517140">उपलब्ध होने पर 'हार्डवेयर से तेज़ी लाएं' सुविधा का उपयोग करें</translation> <translation id="2077273864382355561">बैटरी पावर पर चलते समय स्क्रीन बंद विलंब</translation> <translation id="2082205219176343977">डिवाइस के लिए कम से कम अनुमत Chrome वर्शन कॉन्फ़िगर करें.</translation> <translation id="209586405398070749">स्थिर चैनल</translation> @@ -623,11 +624,11 @@ यह नीति सिर्फ़ तब काम करेगी जब 'DefaultSearchProviderEnabled' नीति चालू होगी.</translation> <translation id="2569647487017692047">अगर यह नीति गलत पर सेट की जाती है तो, <ph name="PRODUCT_OS_NAME" /> ब्लूटूथ को बंद कर देगा और उपयोगकर्ता उसे वापस चालू नहीं कर पाएगा. - अगर यह नीति सही पर सेट की जाती है या उसे सेट किए बिना छोड़ दिया जाता है तो, उपयोगकर्ता अपनी मर्ज़ी से ब्लूटूथ को चालू या बंद कर सकेगा. + अगर यह नीति सही पर सेट की जाती है या उसे सेट किए बिना छोड़ दिया जाता है, तो उपयोगकर्ता अपनी मर्ज़ी से ब्लूटूथ को चालू या बंद कर सकेगा. - अगर यह नीति सेट की जाती है तो, उपयोगकर्ता उसे बदल या रद्द नहीं कर सकता. + अगर यह नीति सेट की जाती है, तो उपयोगकर्ता उसे न ही बदल सकता है और न ही रद्द कर सकता है. - ब्लूटूथ चालू करने के बाद, बदलावों को लागू करने के लिए उपयोगकर्ता को पहले लॉग आउट करके फिर से लॉग इन करना होगा (ब्लूटूथ बंद करते समय ऐसा करने की ज़रूरत नहीं होगी).</translation> + ब्लूटूथ चालू करने के बाद, बदलावों को लागू करने के लिए उपयोगकर्ता को पहले लॉग आउट करके फिर से लॉग इन करना होगा (ब्लूटूथ बंद करते समय ऐसा करने की ज़रूरत नहीं है).</translation> <translation id="2571066091915960923">डेटा का आकार कम करने संबंधी प्रॉक्सी को चालू या बंद करें और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकें. अगर आप इस सेटिंग को चालू या बंद करते हैं तो, उपयोगकर्ता इस सेटिंग को बदल या इसे रद्द नहीं कर सकते. @@ -651,15 +652,15 @@ यह नीति आपको <ph name="PRODUCT_OS_NAME" /> डिवाइसों के लिए प्रिंटर कॉन्फ़िगरेशन उपलब्ध कराने की मंज़ूरी देती है. इसका फ़ॉर्मैट NativePrinters शब्दकोश की तरह ही होता है. इसमें अलग से एक "id" या "guid" फ़ील्ड दिया जाता है, जिसे भरना प्रिंटर को मंज़ूरी दिलवाने वाली सूची या रोक लगाने वाली सूची के लिए ज़रूरी होता है. - फ़ाइल पाँच एमबी से ज़्यादा बड़ी नहीं होनी चाहिए और उसे जेएसओएन (JSON) कोड में बदला जाना चाहिए. ऐसा माना जाता है कि करीब 21,000 प्रिंटर वाली फ़ाइल पाँच एमबी वाली फाइल के रूप में कोड की जाएगी. क्रिप्टोग्राफ़िक हैश का इस्तेमाल करके यह पक्का किया जाता है कि डाउनलोड पूरा और सही तरह से हो गया है. + फ़ाइल पाँच एमबी से ज़्यादा बड़ी नहीं होनी चाहिए और उसे जेएसओएन (JSON) कोड में बदला जाना चाहिए. ऐसा माना जाता है कि करीब 21,000 प्रिंटर वाली फ़ाइल पाँच एमबी वाली फ़ाइल के रूप में कोड की जाएगी. क्रिप्टोग्राफ़िक हैश का इस्तेमाल करके यह पक्का किया जाता है कि डाउनलोड पूरा हो गया है और सही तरह से हो गया है. फ़ाइल को डाउनलोड करके कैश मेमोरी में रखा जाता है. अगर यूआरएल या हैश में कोई बदलाव होगा तो उसे फिर से डाउनलोड किया जाएगा. - अगर यह नीति सेट की जाती है तो, <ph name="PRODUCT_OS_NAME" /> प्रिंटर कॉन्फ़िगरेशन के लिए फ़ाइल डाउनलोड करेगा और <ph name="BULK_PRINTERS_ACCESS_MODE" />, <ph name="BULK_PRINTERS_WHITELIST" /> और <ph name="BULK_PRINTERS_BLACKLIST" /> के मुताबिक प्रिंटर उपलब्ध कराएगा. + अगर यह नीति सेट की जाती है, तो <ph name="PRODUCT_OS_NAME" /> प्रिंटर कॉन्फ़िगरेशन के लिए फ़ाइल डाउनलोड करेगा और <ph name="BULK_PRINTERS_ACCESS_MODE" />, <ph name="BULK_PRINTERS_WHITELIST" />, और <ph name="BULK_PRINTERS_BLACKLIST" /> के मुताबिक प्रिंटर उपलब्ध कराएगा. - अगर आप यह नीति सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या इसे ओवरराइड नहीं कर सकते. + अगर आप यह नीति सेट करते हैं, तो उपयोगकर्ता इसे बदल नहीं सकते या इसे ओवरराइड नहीं कर सकते. - उपयोगकर्ता अलग-अलग डिवाइस पर प्रिंटर कॉन्फ़िगर कर पाते हैं या नहीं, इस पर इस नीति का कोई असर नहीं होता. यह नीति अलग-अलग उपयोगकर्ताओं प्रिंटर को कॉनफ़िगर करने के तरीके की पूरक है. + इस नीति का इस पर कोई असर नहीं होता कि उपयोगकर्ता अलग-अलग डिवाइस पर प्रिंटर कॉन्फ़िगर कर पाते हैं या नहीं. यह नीति अलग-अलग उपयोगकर्ताओं के प्रिंटर को कॉन्फ़िगर करने के तरीके की पूरक है. </translation> <translation id="2633084400146331575">मौखिक फ़ीडबैक सक्षम करें</translation> <translation id="2646290749315461919">आपको यह सेट करने की सुविधा देती है कि वेबसाइटों को उपयोगकर्ता की वास्तविक 'जगह की जानकारी' का पता लगाने अनुमति दी जाए या नहीं. उपयोगकर्ता की वास्तविक 'जगह की जानकारी' का पता लगाने की अनुमति डिफ़ॉल्ट रूप से दी जा सकती है, डिफ़ॉल्ट रूप से खारिज की जा सकती है या हर उस समय उपयोगकर्ता से पूछा जा सकता है जब कोई वेबसाइट डेस्कटॉप सूचनाएं दिखाना चाहती हो. @@ -672,6 +673,11 @@ Google के 'खोज यूआरएल' को इस रूप में तय किया जा सकता है: <ph name="GOOGLE_SEARCH_URL" />. जब 'DefaultSearchProviderEnabled' नीति चालू हो तो यह विकल्प सेट होना चाहिए. ऐसा होने पर ही यह विकल्प काम करेगा.</translation> +<translation id="2659019163577049044">अगर आप इस सेटिंग को चालू करते हैं, तो सुविधा के लिए ज़रूरी शर्तों को पूरा करने पर उपयोगकर्ताओं को उनके फ़ोन और Chromebook के बीच एसएमएस मैसेज सिंक करने की अनुमति दी जाएगी. ध्यान रहे कि अगर इस नीति को मंज़ूरी मिलती है, तो उपयोगकर्ता को सेट अप फ़्लो पूरा करके साफ़ तौर पर इस सुविधा को चुनना पड़ेगा. एक बार सेट अप फ़्लो पूरा होने पर, उपयोगकर्ता अपने Chromebook पर एसएमएस मैसेज भेज और पा सकते हैं. + + अगर इस सुविधा को बंद कर दिया जाता है, तो उपयोगकर्ता को एसएमएस सिंक करने की अनुमति नहीं मिलेगी. + + अगर इस पॉलिसी को सेट किए बिना छोड़ दिया जाता है, तो प्रबंधित उपयोगकर्ता डिफ़ॉल्ट का इस्तेमाल नहीं कर पाएंगे और गैर-प्रबंधित उपयोगकर्ता इसका इस्तेमाल कर सकते हैं.</translation> <translation id="2660846099862559570">प्रॉक्सी का उपयोग कभी न करें</translation> <translation id="267596348720209223">खोज प्रदाता द्वारा समर्थित वर्ण एन्कोडिंग निर्दिष्ट करती है. एन्कोडिंग UTF-8, GB2312, और ISO-8859-1 जैसे कोड पेज नाम होते हैं. वे प्रदान किए गए क्रम में आज़माए जाते हैं. @@ -742,7 +748,6 @@ अगर आप इस सेटिंग को बंद कर देते हैं या कोई मान तय नहीं करते हैं तो, 'प्रिंट की झलक' डिफ़ॉल्ट पसंद के तौर पर सबसे हाल में उपयोग किए गए प्रिंटर का इस्तेमाल करेगा. अगर आप इस सेटिंग को चालू करते हैं तो, 'प्रिंट की झलक' डिफ़ॉल्ट पसंद के तौर पर OS सिस्टम डिफ़ॉल्ट प्रिंटर का उपयोग करेगा.</translation> -<translation id="2867699958489427143">अगर OS वर्शन टार्गेट से नया है, तो रोल बैक करें और टार्गेट वर्शन पर रहें. इस प्रक्रिया के दौरान पूरा पावरवॉश करें.</translation> <translation id="2872961005593481000">शट डाउन करें</translation> <translation id="2874209944580848064">Android ऐप्लिकेशन का समर्थन करने वाले <ph name="PRODUCT_OS_NAME" /> डिवाइस के लिए नोट:</translation> <translation id="2877225735001246144">Kerberos की पुष्टि तय करते समय CNAME लुकअप बंद करें</translation> @@ -803,12 +808,12 @@ यह नीति वैकल्पिक है. अगर इसे जोड़ा नहीं जाता है तो, कोई खोज शब्द बदलाव नहीं किया जाएगा. 'DefaultSearchProviderEnabled' नीति चालू होने पर ही इस नीति का पालन किया जाएगा.</translation> -<translation id="306887062252197004">यह नीति WebDriver विशेषता के उपयोगकर्ताओं को उन नीतियों को +<translation id="306887062252197004">यह नीति WebDriver सुविधा के उपयोगकर्ताओं को उन नीतियों को बदलने देती है जो इसके काम में बाधा डाल सकती हैं. फ़िलहाल यह नीति SitePerProcess और IsolateOrigins नीतियों को बंद करती है. - अगर नीति चालू कर दी जाती है, तो WebDriver असंगत नीतियों को + अगर नीति चालू कर दी जाती है, तो WebDriver असंगत नीतियों को बदल पाएगा. अगर नीति बंद कर दी जाती है या कॉन्फ़िगर नहीं की जाती है, तो WebDriver असंगत नीतियों को नहीं बदल पाएगा.</translation> @@ -986,7 +991,6 @@ <translation id="3711895659073496551">निलंबित</translation> <translation id="3715569262675717862">क्लाइंट प्रमाणपत्रों के हिसाब से प्रमाणीकरण</translation> <translation id="3736879847913515635">उपयोगकर्ता प्रबंधक में 'किसी को जोड़ें' चालू करती है</translation> -<translation id="3737544779868348650">डिवाइस नेटवर्क होस्टनाम</translation> <translation id="3746590506846867985"> यह नीति 'साइन-इन स्क्रीन' पर लागू होती है. कृपया <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> नीति भी देखें जो 'उपयोगकर्ता सत्र' पर लागू होती है. दोनों नीतियों को एक जैसे मान पर सेट करने का सुझाव दिया जाता है. अगर मान अलग-अलग होंगे तो, 'उपयोगकर्ता नीति' में बताया गया मान लागू करने के दौरान 'उपयोगकर्ता सत्र' शुरू करने में देरी हो सकती है. अगर नीति चालू हो, तो 'कॉमा-सेपरेटेड लिस्ट' में बताया गया हर मूल अपनी खुद की प्रक्रिया में चलेगा. इससे उप डोमेन के वे मूल भी आइसोलेट हो जाएंगे जिनके नाम दिए गए हैं; जैसे कि https://example.com/ बताने से https://foo.example.com/ भी https://example.com/ साइट के हिस्से के तौर पर आइसोलेट हो जाएगा. @@ -1102,6 +1106,7 @@ सूची में दिए गए हर एक्सटेंशन से जुड़ा एक शब्दकोष होता है जिसमें 'एक्सटेंशन आईडी' वाले फ़ील्ड में एक्सटेंशन आईडी लिखा होना ज़रूरी है. इसी तरह 'अपडेट यूआरएल' वाले फ़ील्ड में भी अपडेट यूआरएल लिखा होना ज़रूरी है.</translation> <translation id="3874773863217952418">'खोजने के लिए टैप करें' को चालू करें</translation> <translation id="3877517141460819966">एकीकृत दूसरे-तरीके से भी पुष्टि मोड</translation> +<translation id="3879208481373875102">अनइंस्टॉल न किए जा सकने वाले वेब ऐप्लिकेशन की सूची कॉन्फ़िगर करें</translation> <translation id="388237772682176890">स्पीडी/3.1 समर्थन निकाले जाने के कारण इस पॉलिसी को M53 में बहिष्कृत कर दिया गया है और M54 में निकाल लिया गया है. <ph name="PRODUCT_NAME" /> में स्पीडी प्रोटोकॉल का उपयोग अक्षम करती है. @@ -1342,6 +1347,10 @@ इस नीति की संभावित सेटिंग और स्ट्रक्चर की पूरी जानकारी के लिए कृपया https://www.chromium.org/administrators/policy-list-3/extension-settings-full पर जाएं </translation> <translation id="4554651132977135445">उपयोगकर्ता नीति लूपबैक प्रोसेसिंग मोड</translation> +<translation id="4554841826517980623">यह नीति नियंत्रित करती है कि <ph name="PRODUCT_NAME" /> के लिए नेटवर्क फ़ाइल शेयर सुविधा <ph name="NETBIOS_PROTOCOL" /> को नेटवर्क पर होने वाले शेयरों को खोजने के लिए इस्तेमाल करना चाहिए या नहीं. + जब यह नीति सही पर सेट की जाती है, तो शेयर खोज <ph name="NETBIOS_PROTOCOL" /> प्रोटोकॉल का इस्तेमाल करके नेटवर्क पर शेयरों को खोजेगी. + जब यह नीति गलत पर सेट की जाती है, तो शेयर खोज <ph name="NETBIOS_PROTOCOL" /> प्रोटोकॉल का इस्तेमाल करके नेटवर्क पर शेयरों को नहीं खोजेगी. + अगर नीति को सेट नहीं किया जाता है, तो एंटरप्राइज़-प्रबंधित उपयोगकर्ताओं के लिए डिफ़ॉल्ट बंद है और गैर-प्रबंधित उपयोगकर्ताओं के लिए चालू है.</translation> <translation id="4555850956567117258">उपयोगकर्ता के लिए दूर से प्रमाणित करने की सुविधा चालू करें</translation> <translation id="4557134566541205630">डिफ़ॉल्ट खोज प्रदाता नया टैब पेज यूआरएल</translation> <translation id="4567137030726189378">डेवलपर टूल के इस्तेमाल की मंज़ूरी देती है</translation> @@ -1410,13 +1419,13 @@ अगर यह सेटिंग चालू होती है या कोई मान नहीं दिया जाता है, तो उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) में क्रेडिट कार्ड के लिए 'अपने आप भरने की सुविधा' को नियंत्रित कर पाएगा.</translation> <translation id="4791031774429044540">'बड़े कर्सर की सुलभता सुविधा' चालू करें. - अगर यह नीति 'सही' पर सेट है तो, बड़ा कर्सर हमेशा चालू रहेगा. + अगर यह नीति 'सही' पर सेट है, तो बड़ा कर्सर हमेशा चालू रहेगा. - अगर यह नीति 'गलत' पर सेट है तो, बड़ा कर्सर हमेशा बंद रहेगा. + अगर यह नीति 'गलत' पर सेट है, तो बड़ा कर्सर हमेशा बंद रहेगा. - अगर आप इस नीति को सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. + अगर आप इस नीति को सेट करते हैं, तो उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. - अगर यह नीति सेट नहीं की जाती है तो, बड़ा कर्सर शुरू में बंद रहेगा लेकिन उपयोगकर्ता इसे कभी भी चालू कर सकता है.</translation> + अगर यह नीति सेट नहीं की जाती है, तो बड़ा कर्सर शुरू में बंद रहेगा लेकिन उपयोगकर्ता इसे कभी भी चालू कर सकता है.</translation> <translation id="4802905909524200151"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> फ़र्मवेयर अपडेट व्यवहार कॉन्फ़िगर करें</translation> <translation id="4807950475297505572">पर्याप्त खाली स्थान नहीं होने तक, जिन उपयोगकर्ताओं ने हाल ही में सबसे कम उपयोग किया है उन्हें निकाल दिया जाता है</translation> <translation id="4815725774537609998">यह नीति हटा दी गई है, इसके बजाय ProxyMode का उपयोग करें. @@ -1528,11 +1537,11 @@ बाहर के मानों को इस सीमा में जोड़ दिया जाएगा.</translation> <translation id="5163002264923337812">पुरानी वेब-आधारित साइन इन प्रक्रिया चालू करती है</translation> <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" /> में Google डिस्क कॉन्फ़िगर करें.</translation> -<translation id="5183383917553127163">आपको यह निर्दिष्ट करने की सुविधा देता है कि कौन से विस्तार प्रतिबंधित नहीं करने चाहिए. +<translation id="5183383917553127163">आपको यह तय करने की सुविधा देता है कि कौन से एक्सटेंशन प्रतिबंधित नहीं करने चाहिए. - * के प्रतिबंधित मान का अर्थ यह है कि सभी विस्तार प्रतिबंधित हैं और उपयोगकर्ता केवल श्वेतसूची में सूचीबद्ध विस्तार ही इंस्टॉल कर सकते हैं. + * के प्रतिबंधित मान का अर्थ यह है कि सभी एक्सटेंशन प्रतिबंधित हैं और उपयोगकर्ता केवल मान्य सूची में दिए गए एक्सटेंशन ही इंस्टॉल कर सकते हैं. - सामान्य रूप से, सभी विस्तार श्वेतसूची में होते हैं, लेकिन यदि नीति के तहत सभी विस्तारों को प्रतिबंधित किया जाता है, तो नीति को ओवरराइड करने के लिए श्वेतसूची सूची का उपयोग किया जा सकता है.</translation> + सामान्य तौर पर, सभी एक्सटेंशन मान्य सूची में होते हैं, लेकिन अगर नीति के तहत सभी एक्सटेंशन को प्रतिबंधित किया जाता है, तो नीति को ओवरराइड करने के लिए मान्य सूची का उपयोग किया जा सकता है.</translation> <translation id="519247340330463721">सुरक्षित ब्राउज़िंग संबंधी नीतियों को कॉन्फ़िगर करें.</translation> <translation id="5192837635164433517">यह नीति गड़बड़ी के ऐसे वैकल्पिक पेज का उपयोग चालू करती है जो <ph name="PRODUCT_NAME" /> में तैयार होते हैं (जैसे 'पेज नहीं मिला') और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है. @@ -1776,6 +1785,7 @@ अगर यह नीति सेट नहीं की जाती है तो, पहली बार लॉग इन स्क्रीन दिखाई देने पर 'कंप्यूटर के बोलकर दिए जाने वाले जवाब की सुविधा' बंद होती है. उपयोगकर्ता इस सुविधा को किसी भी समय चालू या बंद कर सकते हैं और लॉग इन स्क्रीन पर उपयोगकर्ताओं के लिए यह स्थिति एक जैसी होती है.</translation> <translation id="5868414965372171132">उपयोगकर्ता-स्तरीय नेटवर्क कॉन्फ़िगरेशन</translation> +<translation id="5879014913445067283">नेटवर्क फ़ाइल शेयर खोज को <ph name="NETBIOS_NAME" /> के ज़रिए नियंत्रित करें</translation> <translation id="5883015257301027298">डिफ़ॉल्ट कुकी सेटिंग</translation> <translation id="5887414688706570295">उस TalkGadget के प्रारंभिक भाग को कॉन्फ़िगर करती है, जिसे दूरस्थ पहुंच होस्ट द्वारा उपयोग किया जाएगा और उपयोगकर्ताओं को इसे बदलने से रोकती है. @@ -2130,25 +2140,25 @@ <translation id="6903814433019432303">यह नीति सिर्फ़ रिटेल मोड में काम करती है. उन यूआरएल का समूह तय करती है जो डेमो सत्र के शुरू होने पर लोड होते हैं. यह नीति शुरुआती यूआरएल सेट करने की किसी भी अन्य प्रक्रिया को रद्द कर देगी और सिर्फ़ उसी सत्र पर लागू होगी जो किसी खास उपयोगकर्ता से जुड़ा हुआ नहीं होगा.</translation> -<translation id="6908347296939885026">G Suite में <ph name="PRODUCT_NAME" /> की प्रतिबंधित लॉग इन सुविधा चालू करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. +<translation id="6908347296939885026">G Suite में <ph name="PRODUCT_NAME" /> की पाबंदी वाली लॉग इन सुविधा को चालू करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. अगर आप यह सेटिंग तय करते हैं, तो उपयोगकर्ता सिर्फ़ खास डोमेन के खातों का इस्तेमाल करके - Google ऐप एक्सेस कर सकेगा (ध्यान रखें कि यह सेटिंग - gmail.com/googlemail.com के लिए काम नहीं करती है). + ही 'Google ऐप्लिकेशन' का एक्सेस कर सकेगा (ध्यान रखें कि यह सेटिंग + gmail.com/googlemail.com पर काम नहीं करती है). यह सेटिंग उपयोगकर्ता को किसी ऐसे प्रबंधित डिवाइस में लॉग इन करने से नहीं रोकेगी - जिसे Google प्रमाणीकरण की ज़रूरत होती है. उपयोगकर्ता को अभी भी अन्य डोमेन के खातों में - साइन इन करने की अनुमति होगी, लेकिन जब वे उन खातों के ज़रिए G Suite का इस्तेमाल - करने की कोशिश करेंगे तो उन्हें गड़बड़ी मिलेगी. + जिसे Google के ज़रिए पहचान साबित करने की ज़रूरत होती है. उपयोगकर्ता को अभी भी दूसरे + डोमेन के खातों में साइन इन करने की अनुमति होगी, लेकिन जब वे उन खातों के ज़रिए G Suite + का इस्तेमाल करने की कोशिश करेंगे तो उन्हें गड़बड़ी की सूचना मिलेगी. अगर आप इस सेटिंग को खाली/कॉन्फ़िगर किए बिना छोड़ देते हैं, तो - उपयोगकर्ता किसी भी खाते से G Suite एक्सेस कर सकेगा. + उपयोगकर्ता किसी भी खाते से G Suite को एक्सेस कर सकेगा. - इस नीति की वजह से X-GoogApps-Allowed-Domains हेडर सभी google.com डोमेन के - सभी HTTP और HTTPS अनुरोधों में जुड़ जाएगा, जैसा कि + इस नीति की वजह से X-GoogApps-Allowed-Domains हेडर google.com डोमेन के + सभी एचटीटीपी और एचटीटीपीएस अनुरोधों में जुड़ जाएगा, जैसा कि https://support.google.com/a/answer/1668854 में बताया गया है. - उपयोगकर्ता इस सेटिंग को बदल या ओवरराइड नहीं कर सकते.</translation> + उपयोगकर्ता इस सेटिंग को बदल या इसे रद्द नहीं कर सकते.</translation> <translation id="6908640907898649429">'डिफ़ॉल्ट खोज सेवा' कॉन्फ़िगर करती है. आप वह 'डिफ़ॉल्ट खोज सेवा' तय कर सकते हैं, उपयोगकर्ता जिसका उपयोग करेगा या जिसे डिफ़ॉल्ट खोज को बंद करने के लिए चुनेगा.</translation> <translation id="6913068954484253496"><ph name="PRODUCT_NAME" /> को सभी आईपी पतों पर कास्ट डिवाइस से कनेक्ट होने देती है.</translation> <translation id="6915442654606973733">'कंप्यूटर के बोलकर दिए जाने वाले जवाब' की सुलभता सुविधा चालू करें @@ -2236,6 +2246,18 @@ अगर इसे सेट नहीं किया गया हो तो, उपयोगकर्ता से बुकमार्क लाने के लिए पूछा जा सकता है या अपने आप लाया जा सकता है.</translation> <translation id="7063895219334505671">इन साइटों पर पॉपअप की अनुमति दें</translation> +<translation id="706568410943497889"> + अगर नीति सही पर सेट की गई है, तो <ph name="PRODUCT_NAME" /> को Google सेवाओं (जैसे Google Meet) से WebRTC इवेंट लॉग इकट्ठा करने की अनुमति है, और उन लॉग को Google पर अपलोड करें. + + +अगर नीति गलत पर सेट की गई है, या सेट नहीं है, तो <ph name="PRODUCT_NAME" /> ऐसे लॉग इकट्ठा नहीं कर सकते और न ही अपलोड कर सकते हैं. + Chrome में ऑडियो या वीडियो कॉल में आने वाले मुद्दों को डीबग करने में, इन लॉग में मौजूद निदान की जानकारी बहुत मददगार साबित होती है, जैसे आरटीपी पैकेट के भेजे जाने का समय और आकार, नेटवर्क में होने वाली भीड़ का फ़ीडबैक और ऑडियो और वीडियो फ़्रेम की क्वालिटी और समय का मेटाडेटा. इन लॉग में ऑडियो या वीडियो कॉल की सामग्री नहीं होती. + + Chrome के ज़रिए डेटा इकट्ठा सिर्फ़ Google की वेब सेवाओं जैसे Google Hangouts या Google Meet से ही ट्रिगर किया जा सकता है. + + + Google इन लॉग को एक सेशन आईडी की मदद से, Google सेवा के ज़रिए इकट्ठे किए गए दूसरे लॉग के साथ जोड़ सकता है; यह डीबगिंग को आसान बनाने के इरादे से किया जाता है. + </translation> <translation id="706669471845501145">साइटों को डेस्कटॉप सूचनाएं दिखाने की अनुमति दें</translation> <translation id="7072208053150563108">मशीन से पासवर्ड बदलने की दर</translation> <translation id="7074513465313721551">ऐसे डोमेन की सूची कॉन्फ़िगर करें, 'सुरक्षित ब्राउज़िंग' सुविधा जिन पर भरोसा करेगी. इसका मतलब यह है: @@ -2368,6 +2390,8 @@ <translation id="7336878834592315572">सत्र की अवधि तक कुकी बनाए रखना</translation> <translation id="7340034977315324840">डिवाइस गतिविधि समय की रिपोर्ट करें</translation> <translation id="7343497214039883642">डिवाइसों के लिए एंटरप्राइज़ प्रिंटर कॉन्फ़िगरेशन फ़ाइल</translation> +<translation id="7349338075015720646">खास तौर पर उन वेबसाइटों की एक सूची बनाती है जो उपयोगकर्ता इंटरैक्शन के बिना चुपचाप इंस्टॉल की गई हैं और जिन्हें उपयोगकर्ता अनइंस्टाल नहीं कर सकता और न ही उन पर रोक लगा सकता है. + पॉलिसी की हर सूची आइटम में दो सदस्य हैं: "यूआरएल" और "launch_container". "यूआरएल" इंस्टॉल किए जाने वाले वेब ऐप्लिकेशन का यूआरएल होना चाहिए और "लॉन्च_कंटेनर" या तो "विंडो" या "टैब" होना चाहिए जो यह दिखाए कि इंस्टॉल होने के बाद वेब ऐप्लिकेशन को किस तरह खोला जाएगा. अगर "launch_container" नहीं है, तो ऐप्लिकेशन विंडो में लॉन्च हो जाएगा अगर Chrome उसे प्रगतिशील वेब ऐप्लिकेशन मानता है, नहीं तो टैब में खुल जाएगा.</translation> <translation id="7367028210010532881">जब उपयोगकर्ता ऐसी साइटों पर नेविगेट करते हैं जिन्हें दुर्भावनापूर्ण हो सकने वाली साइट के रूप में फ़्लैग किया गया है, तो सुरक्षित ब्राउज़िंग सेवा एक चेतावनी पेज दिखाती है. इस सेटिंग को चालू करना उपयोगकर्ताओं को किसी भी तरह से चेतावनी पेज से दुर्भावनापूर्ण साइट पर जाने से रोकता है. अगर यह सेटिंग बंद की जाती है या कॉन्फ़िगर नहीं की जाती है तो उपयोगकर्ता चेतावनी दिखाए जाने के बाद फ़्लैग की गई साइट पर जाना चुन सकते हैं. @@ -2480,14 +2504,14 @@ <translation id="7683777542468165012">प्रभावी नीति रीफ़्रेश</translation> <translation id="7694807474048279351">किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने के बाद अपने आप होने वाला एक रीबूट शेड्यूल करें. - जब इस नीति को 'सही' पर सेट किया जाता है तो, किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने पर और अपडेट की प्रक्रिया पूरी होने के लिए रीबूट ज़रूरी होने पर अपने आप होने वाला रीबूट शेड्यूल किया जाता है. रीबूट को तुरंत शेड्यूल किया जाता है लेकिन अगर उपयोगकर्ता फ़िलहाल डिवाइस का उपयोग कर रहा है तो डिवाइस पर रीबूट में 24 घंटे तक की देरी हो सकती है. + जब इस नीति को 'सही' पर सेट किया जाता है, तो किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने पर और अपडेट की प्रक्रिया पूरी होने के लिए रीबूट ज़रूरी होने पर अपने आप होने वाला रीबूट शेड्यूल किया जाता है. रीबूट को तुरंत शेड्यूल किया जाता है लेकिन अगर उपयोगकर्ता फ़िलहाल डिवाइस का उपयोग कर रहा है तो डिवाइस पर रीबूट में 24 घंटे तक की देरी हो सकती है. - जब इस नीति को 'गलत' पर सेट किया जाता है तो, <ph name="PRODUCT_OS_NAME" /> अपडेट लागू करने के बाद अपने आप होने वाला कोई रीबूट शेड्यूल नहीं किया जाता. उपयोगकर्ता के अगली बार डिवाइस रीबूट करने पर अपडेट की प्रक्रिया पूरी हो जाती है. + जब इस नीति को 'गलत' पर सेट किया जाता है, तो <ph name="PRODUCT_OS_NAME" /> अपडेट लागू करने के बाद अपने आप होने वाला कोई रीबूट शेड्यूल नहीं किया जाता. उपयोगकर्ता के अगली बार डिवाइस रीबूट करने पर अपडेट की प्रक्रिया पूरी हो जाती है. - अगर आप इस नीति को सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. + अगर आप इस नीति को सेट करते हैं, तो उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. - ध्यान दें: फ़िलहाल, अपने आप होने वाला रीबूट सिर्फ़ तब चालू होते हैं जब लॉगिन स्क्रीन दिख रही हो या किओस्क ऐप्लिकेशन के सेशन चल रहा हो. आने वाले दिनों में यह बदल दिया जाएगा और नीति हमेशा लागू होगी, भले ही कोई खास प्रकार का सत्र चल रहा हो या न चल रहा हो.</translation> + ध्यान दें: फ़िलहाल, अपने आप होने वाले रीबूट सिर्फ़ तब चालू होते हैं जब लॉगिन स्क्रीन दिख रही हो या किओस्क ऐप्लिकेशन का सत्र चल रहा हो. आने वाले दिनों में यह बदल दिया जाएगा और नीति हमेशा लागू होगी, भले ही कोई खास प्रकार का सत्र चल रहा हो या न चल रहा हो.</translation> <translation id="7701341006446125684">ऐप्स और एक्सटेंशन संचय आकार सेट करना (बाइट में)</translation> <translation id="7709537117200051035">बूलियन फ़्लैग के लिए एक शब्दकोष मैपिंग होस्टनाम जो निर्दिष्ट करता है कि होस्ट की एक्सेस अनुमति (सही) होनी चाहिए या उसे अवरुद्ध (गलत) होना चाहिए. @@ -2691,13 +2715,13 @@ <translation id="8148785525797916822">जब <ph name="PRODUCT_NAME" /> ऐसे कंप्यूटर या ऑपरेटिंग सिस्टम पर चलाया जा रहा है जो अब समर्थित नहीं है, तो उस समय दिखाई देने वाली चेतावनी को छिपाती है.</translation> <translation id="8148901634826284024">'हाई कॉन्ट्रास्ट मोड' वाली सुलभता सुविधा चालू करें. - अगर यह नीति 'सही' पर सेट है तो, 'हाई कॉन्ट्रास्ट मोड' हमेशा चालू रहेगा. + अगर यह नीति 'सही' पर सेट है, तो 'हाई कॉन्ट्रास्ट मोड' हमेशा चालू रहेगा. - अगर यह नीति 'गलत' पर सेट है तो, 'हाई कॉन्ट्रास्ट मोड' हमेशा बंद रहेगा. + अगर यह नीति 'गलत' पर सेट है, तो 'हाई कॉन्ट्रास्ट मोड' हमेशा बंद रहेगा. - अगर आप इस नीति को सेट करते हैं तो, उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. + अगर आप इस नीति को सेट करते हैं, तो उपयोगकर्ता इसे बदल नहीं सकते या ओवरराइड नहीं कर सकते. - अगर यह नीति सेट नहीं की जाती है तो, 'हाई कॉन्ट्रास्ट मोड' शुरू में बंद होता है लेकिन उपयोगकर्ता इसे किसी भी समय चालू कर सकता है.</translation> + अगर यह नीति सेट नहीं की जाती है, तो 'हाई कॉन्ट्रास्ट मोड' शुरू में बंद होता है लेकिन उपयोगकर्ता इसे किसी भी समय चालू कर सकता है.</translation> <translation id="815061180603915310">अगर चालू रहने के लिए सेट की जाती है तो, इस नीति की वजह से प्रोफ़ाइल 'अल्पकालिक मोड' में बदल जाती है. अगर इस नीति को किसी 'OS नीति' (जैसे कि Windows पर जीपीओ) के रूप में तय किया जाता है तो यह सिस्टम पर मौजूद हर प्रोफ़ाइल पर लागू होगी; अगर नीति को 'क्लाउड नीति' के रूप में सेट किया जाता है तो यह सिर्फ़ किसी प्रबंधित खाते से साइन इन की गई प्रोफ़ाइल पर लागू होगी. इस मोड में प्रोफ़ाइल डेटा को सिर्फ़ 'उपयोगकर्ता सत्र' की अवधि तक डिस्क पर बनाए रखा जाता है. सुविधाएं, जैसे कि ब्राउज़र इतिहास, एक्सटेंशन और उनका डेटा, वेब डेटा, जैसे कि कुकी और वेब डेटाबेस, ब्राउज़र बंद होने के बाद सेव नहीं रखे जाते हैं. हालांकि इससे उपयोगकर्ता को किसी भी डेटा को डिस्क पर मैन्युअल रूप से डाउनलोड करने, पेज सेव करने या उन्हें प्रिंट करने से नहीं रोका जाता. @@ -2832,6 +2856,7 @@ यहां, "वर्शन" '61.0.3163.120' जैसा कोई सटीक वर्शन या '61.0' जैसा कोई वर्शन प्रीफ़िक्स हो सकता है </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> के लिए सामान्य HTML रेंडरर</translation> +<translation id="8544465954173828789">एसएमएस मैसेज को फ़ोन से Chromebook में सिंक करने की अनुमति दें.</translation> <translation id="8549772397068118889">सामग्री पैक से बाहर की साइटें विज़िट करने पर चेतावनी दें</translation> <translation id="8566842294717252664">वेब स्टोर को नया टैब पेज और ऐप चलाने के साधन से छिपाएं</translation> <translation id="8586528890725660268">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल उपयोगकर्ता नहीं कर सकता है. @@ -2877,6 +2902,12 @@ अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो 'पासवर्ड सुरक्षा सेवा' सिर्फ़ Google के पासवर्ड सुरक्षित रखेगी, लेकिन उपयोगकर्ता इस सेटिंग को बदल सकेगा.</translation> <translation id="8672321184841719703">स्वत: अपडेट वर्शन को लक्ष्य बनाएं</translation> <translation id="867410340948518937">U2F (यूनिवर्सल सेकेंड फैक्टर)</translation> +<translation id="8682611302223077049">आपको मिलीसेकंड में समय सीमा तय करने की अनुमति देती है, जिस पर उपयोगकर्ताओं को सूचित किया जाता है कि <ph name="PRODUCT_NAME" /> को फिर से लॉन्च किया जाना चाहिए या <ph name="PRODUCT_OS_NAME" /> को फिर से शुरू करना होगा ताकि उन अपडेट को लागू किया जा सके जिन्हें मंज़ूरी नहीं मिली है. + + + इस समय सीमा के दौरान, उपयोगकर्ता को बार-बार अपडेट की ज़रूरत के बारे में सूचित किया जाएगा. <ph name="PRODUCT_OS_NAME" /> डिवाइस के लिए, अपग्रेड की ज़रूरत होने पर सिस्टम ट्रे में फिर से शुरू करने का नोटिफ़िकेशन देगा. <ph name="PRODUCT_NAME" /> ब्राउज़र के लिए, ऐप्लिकेशन्लिकेशन मेन्यू में हुए बदलाव से तब यह पता चलता है कि फिर से लॉन्च की ज़रूरत है, जब एक तिहाई नोटिफ़िकेशन की समय सीमा गुज़र जाती है. नोटिफ़िकेशन का रंग एक बार दो तिहाई समय सीमा गुज़रने पर बदलता है और फिर से तब बदलता है जब पूरी समय सीमा खत्म हो जाती है. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> नीति के ज़रिए लागू अतिरिक्त नोटिफ़िकेशन इस शेड्यूल का पालन करती हैं. + + अगर सेट नहीं किया गया है, तो <ph name="PRODUCT_NAME" /> डिवाइस के लिए 345600000 मिलीसेकंड (चार दिन) की डिफ़ॉल्ट समय सीमा और <ph name="PRODUCT_OS_NAME" /> डिवाइस के लिए 604800000 मिलीसेकंड (एक हफ़्ता) की समय सीमा इस्तेमाल की जाती है.</translation> <translation id="8685024486845674965">पासवर्ड का फिर से इस्तेमाल होने पर पासवर्ड सुरक्षा की ओर से चेतावनी ट्रिगर की गई है</translation> <translation id="8693243869659262736">अंतर्निहित DNS क्लाइंट का उपयोग करना</translation> <translation id="8704831857353097849">अक्षम प्लग इन की सूची</translation> @@ -2917,6 +2948,7 @@ मापन कारक 100% या अधिक होना चाहिए. प्रस्तुतिकरण मोड में स्क्रीन को मंद विलंब बनाने वाले मान नियमित स्क्रीन मंद विलंब से कम अनुमत नहीं हैं.</translation> <translation id="8798099450830957504">सामान्य</translation> +<translation id="8801680448782904838">उपयोगकर्ता को सूचित करें कि ब्राउज़र को फिर से लॉन्च करने का सुझाव दिया गया है या ऐसा करना ज़रूरी है</translation> <translation id="8818173863808665831">डिवाइस के भौगोलिक स्थान की रिपोर्ट करें. यदि यह नीति सेट नहीं है, या गलत सेट है, तो स्थान की रिपोर्ट नहीं की जाएगी.</translation> @@ -2991,15 +3023,15 @@ सही पर सेट होने पर या सेट नहीं की गई होने पर, सिंक सहमति दिखाई जाएगी.</translation> <translation id="8947415621777543415">डिवाइस स्थान की रिपोर्ट करें</translation> <translation id="8951350807133946005">डिस्क संचय निर्देशिका सेट करें</translation> -<translation id="8952317565138994125">यह नीति Google की ओर से होस्ट की जाने वाली सिंक सेवाओं का उपयोग करके <ph name="PRODUCT_NAME" /> में डेटा सिंक को बंद करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. +<translation id="8952317565138994125">यह नीति Google की ओर से होस्ट की जाने वाली सिंक सेवाओं का उपयोग करके <ph name="PRODUCT_NAME" /> में डेटा सिंक को बंद करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. - अगर आप इस सेटिंग को चालू करते हैं तो, उपयोगकर्ता <ph name="PRODUCT_NAME" /> में इस सेटिंग को बदल नहीं सकते या ओवरराइड नहीं कर सकते. + अगर आप इस सेटिंग को चालू करते हैं, तो उपयोगकर्ता <ph name="PRODUCT_NAME" /> में इस सेटिंग को बदल नहीं सकते या ओवरराइड नहीं कर सकते. - अगर यह नीति सेट नहीं की जाती है तो, उपयोगकर्ता को इसका इस्तेमाल करने या नहीं करने का विकल्प देने के लिए 'Google सिंक' सेवा उपलब्ध होगी. + अगर यह नीति सेट नहीं की जाती है, तो उपयोगकर्ता को इसका इस्तेमाल करने या नहीं करने का विकल्प देने के लिए 'Google सिंक' सेवा उपलब्ध होगी. 'Google सिंक' को पूरी तरह से बंद करने के लिए, यह सुझाव दिया जाता है कि आप 'Google एडमिन कंसोल' में 'Google सिंक' सेवा को बंद करें. - जब <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> नीति 'चालू' पर सेट होती है तो, इस नीति को चालू नहीं करना चाहिए क्योंकि वह सुविधा वही क्लाइंट साइड फ़ंक्शन शेयर करती है. ऐसे मामले में Google की ओर से होस्ट किया जाने वाला सिंक पूरी तरह से बंद रहता है.</translation> + जब <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME" /> नीति 'चालू' पर सेट होती है, तो इस नीति को चालू नहीं करना चाहिए क्योंकि वह सुविधा वही क्लाइंट साइड फ़ंक्शन शेयर करती है. ऐसे मामलों में Google की ओर से होस्ट किया जाने वाला सिंक पूरी तरह से बंद रहता है.</translation> <translation id="8955719471735800169">शीर्ष पर वापस जाएं</translation> <translation id="8959992920425111821">डिफ़ॉल्ट कॉन्फ़िगरेशन</translation> <translation id="8960850473856121830">इस सूची के पैटर्न का मिलान अनुरोध करने वाले यूआरएल के सुरक्षा @@ -3028,7 +3060,7 @@ <translation id="9105265795073104888">Android ऐप्लिकेशन को प्रॉक्सी कॉन्फ़िगरेशन विकल्पों का सबसेट ही उपलब्ध कराया जाता है. Android ऐप्लिकेशन स्वैच्छिक रूप से प्रॉक्सी का उपयोग करना चुन सकते हैं. आप उन्हें किसी प्रॉक्सी का उपयोग करने के लिए मजबूर नहीं कर सकते हैं.</translation> <translation id="9106865192244721694">इन साइटों पर WebUSB की मंज़ूरी दें</translation> <translation id="9112727953998243860">एंटरप्राइज़ प्रिंटर कॉन्फ़िगरेशन फ़ाइल</translation> -<translation id="9112897538922695510">आपको प्रोटोकॉल प्रबंधकों की सूची रजिस्टर करवाने देती है. यह सिर्फ़ एक ऐसी नीति हो सकती है जो सुझाई गई हो. प्रॉपर्टी के |protocol| को सिर्फ़ 'mailto' जैसी स्कीम पर और |url| को स्कीम का प्रबंधन करने वाले ऐप्लिकेशन के यूआरएल पैटर्न पर ही सेट किया जा सकता है. पैटर्न में '%s' शामिल हो सकता है. अगर यह मौजूद होगा तो उसे प्रबंधित यूआरएल से बदल जिया जाएगा. +<translation id="9112897538922695510">आपको प्रोटोकॉल प्रबंधकों की सूची रजिस्टर करवाने देती है. यह सिर्फ़ एक ऐसी नीति हो सकती है जो सुझाई गई हो. प्रॉपर्टी के |protocol| को सिर्फ़ 'mailto' जैसी स्कीम पर और |url| को स्कीम का प्रबंधन करने वाले ऐप्लिकेशन के यूआरएल पैटर्न पर ही सेट किया जा सकता है. पैटर्न में '%s' शामिल हो सकता है. अगर यह मौजूद होगा तो उसे प्रबंधित यूआरएल से बदल दिया जाएगा. नीति के तहत रजिस्टर किए गए प्रोटोकॉल प्रबंधक, उपयोगकर्ता के रजिस्टर कराए गए प्रोटोकॉल प्रबंधकों के साथ मिला दिए जाते हैं. उपयोगकर्ता, नए डिफ़ॉल्ट प्रबंधक को इंस्टॉल करके नीति के तहत इंस्टॉल किए गए प्रोटोकॉल प्रबंधकों को रद्द कर सकता है, लेकिन नीति के तहत रजिस्टर कराए गए प्रोटोकॉल प्रबंधक को हटा नहीं सकता.</translation> <translation id="9123211093995421438">यह <ph name="PRODUCT_OS_NAME" /> उपलब्धियों की ऐसी कम से कम संख्या तय करती है जिसके लिए किसी भी समय स्थिर वर्शन से रोलबैक शुरू करने की मंज़ूरी दी जानी चाहिए. @@ -3061,6 +3093,10 @@ अगर यह नीति 'सही' पर सेट है तो, <ph name="PRODUCT_OS_NAME" /> उपयोगकर्ता के डिवाइस को बंद करने पर उसे फिर से चालू (रीबूट) कर देगा. <ph name="PRODUCT_OS_NAME" /> यूज़र इंटरफ़ेस (यूआई) में हर बार 'शटडाउन बटन' को 'रीबूट बटन' से बदल देता है. अगर उपयोगकर्ता 'पावर बटन' से डिवाइस को बंद कर देता है तो, वह अपने आप चालू नहीं होगा, भले ही नीति चालू हो.</translation> <translation id="9152473318295429890">मिलते-जुलते वेब पेज के प्रासंगिक सुझावों को चालू करें</translation> <translation id="9158929520101169054">ब्राउज़र के अंदर एक से ज़्यादा साइन-इन की अनुमति दें</translation> +<translation id="9159126470527871268">उपयोगकर्ताओं को सूचित करें कि <ph name="PRODUCT_NAME" /> को फिर से लॉन्च किया जाना चाहिए या <ph name="PRODUCT_OS_NAME" /> को फिर से शुरू करना होगा ताकि उन अपडेट को लागू किया जा सके जिन्हें मंज़ूरी नहीं मिली है. + इस नीति सेटिंग से उपयोगकर्ता को सूचित किया जा सकता है कि ब्राउज़र को फिर से लॉन्च करने का सुझाव दिया गया है या ऐसा करना ज़रूरी है. अगर सेट नहीं किया गया तो, <ph name="PRODUCT_NAME" /> उपयोगकर्ता को सूचित करती है कि मेन्यू में कुछ मामूली बदलावों के ज़रिए फिर से लॉन्च करना ज़रूरी है, जबकि <ph name="PRODUCT_OS_NAME" />, ऐसा सिस्टम ट्रे में नोटिफ़िकेशन के ज़रिए करता है. अगर 'सुझाव' पर सेट किया है, तो फिर से लॉन्च करने के लिए बार-बार चेतावनी दिखाई जाएगी. उपयोगकर्ता 'फिर से लॉन्च' करने की इस चेतावनी को खारिज कर सकता है. उपयोगकर्ता 'फिर से लॉन्च' करने की इस चेतावनी को रद्द कर सकता है. अगर 'ज़रूरी' पर सेट किया गया है, तो उपयोगकर्ता को बार-बार चेतावनी दिखाई देगी कि नोटिफ़िकेशन की समय सीमा खत्म होते ही ब्राउज़र को खुद ही फिर से लॉन्च कर दिया जाएगा. <ph name="PRODUCT_NAME" /> के लिए डिफ़ॉल्ट समय सीमा सात दिन है और <ph name="PRODUCT_OS_NAME" /> के लिए चार दिन और हो सकता है इसे <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> नीति सेटिंग के ज़रिए कॉन्फ़िगर किया जाए. + +उपयोगकर्ता का सेशन फिर से लॉन्च/शुरू होने के बाद बहाल हो जाता है.</translation> <translation id="9165792353046089850">आपको यह सेट करने देती है कि वेबसाइटों को कनेक्ट किए हुए यूएसबी डिवाइसों का एक्सेस पाने की मंज़ूरी है या नहीं. एक्सेस पर पूरी तरह रोक लगाई जा सकती है या जब भी कोई वेबसाइट कनेक्ट किए हुए यूएसबी डिवाइस का एक्सेस पाना चाहेगी तो, हर बार उपयोगकर्ता से पूछा जा सकता है. इस नीति को 'WebUsbAskForUrls' और 'WebUsbBlockedForUrls' नीतियों का इस्तेमाल करके खास यूआरएल पैटर्न के लिए रद्द किया जा सकता है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index 5b69ebd..1896c1b6 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -341,6 +341,7 @@ <translation id="199764499252435679">Omogući ažuriranja komponenti u pregledniku <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Upravljanje napajanjem</translation> <translation id="201557587962247231">Učestalost učitavanja izvješća o statusu uređaja</translation> +<translation id="2017301949684549118">URL-ovi za web aplikacije moraju biti instalirani u pozadini.</translation> <translation id="2018836497795982119">Određuje vrijeme u milisekundama tijekom kojeg se od usluge upravljanja uređajima traže podaci o korisničkim pravilima. Postavljanje ovog pravila nadjačava zadanu vrijednost od 3 sata. Valjane vrijednosti za ovo pravilo u rasponu su od 1800000 (30 minuta) do 86400000 (1 dan). Sve vrijednosti koje nisu u ovom rasponu prebacit će se u odgovarajuće granice. Ako platforma podržava obavijesti o pravilima, odgoda osvježavanja postavit će se na 24 sata jer se očekuje da će obavijesti o pravilima automatski nametnuti osvježavanje nakon svake promjene pravila. @@ -643,6 +644,11 @@ Googleov URL pretraživanja može se navesti kao: <ph name="GOOGLE_SEARCH_URL" />. Ta se opcija mora postaviti kada je omogućeno pravilo "DefaultSearchProviderEnabled" i poštovat će se samo u tom slučaju.</translation> +<translation id="2659019163577049044">Ako je ova postavka omogućena, korisnicima će biti dopušteno postaviti svoje uređaje da sinkroniziraju SMS poruke na telefonima i Chromebookovima. Ako se dopusti ovo pravilo, korisnici moraju eksplicitno uključiti ovu značajku izvršavanjem uputa za postavljanje. Nakon izvršenja uputa za postavljanje korisnici će moći slati i primati SMS poruke na svojim Chromebookovima. + + Ako je postavka onemogućena, korisnicima neće biti dopušteno postaviti sinkronizaciju SMS-a. + + Ako se pravilo ne postavi, zadana postavka nije dopuštena korisnicima kojima se upravlja, a dopuštena je neupravljanim korisnicima.</translation> <translation id="2660846099862559570">Nikad ne upotrebljavaj proxy</translation> <translation id="267596348720209223">Određuje kodiranje znakova koje podržava davatelj usluga pretraživanja. Kodiranja su nazivi kodnih stranica poput UTF-8, GB2312 i ISO-8859-1. Isprobavaju se navedenim redoslijedom. Ovo je pravilo izborno. Ako nije postavljeno, upotrebljavat će se zadana stranica UTF-8. Ovo će se pravilo poštovati samo ako je omogućeno pravilo "DefaultSearchProviderEnabled".</translation> <translation id="268577405881275241">Omogući značajku proxyja za kompresiju podataka</translation> @@ -709,7 +715,6 @@ Ako onemogućite tu postavku ili ne postavite nikakvu vrijednost, zadani će odredišni pisač u Pregledu ispisa biti pisač koji je upotrijebljen zadnji put. Ako omogućite tu postavku, u Pregledu ispisa upotrebljavat će se zadani pisač OS-a kao zadani odredišni pisač.</translation> -<translation id="2867699958489427143">Vrati se na ciljnu verziju i ostani na njoj ako je verzija OS-a novija od ciljne. Tijekom postupka izvrši potpuni powerwash.</translation> <translation id="2872961005593481000">Isključi</translation> <translation id="2874209944580848064">Napomena za uređaje <ph name="PRODUCT_OS_NAME" /> koji podržavaju Androidove aplikacije:</translation> <translation id="2877225735001246144">Onemogući CNAME pretraživanje prilikom provjere Kerberos autentičnosti</translation> @@ -945,7 +950,6 @@ <translation id="3711895659073496551">Obustavi</translation> <translation id="3715569262675717862">Autentifikacija na temelju korisničkih certifikata</translation> <translation id="3736879847913515635">Omogućivanje dodavanja osobe u upravitelju korisnika</translation> -<translation id="3737544779868348650">Naziv hosta mreže uređaja</translation> <translation id="3746590506846867985"> Ovo 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žda će prilikom otvaranja korisničke sesije biti potrebno pričekati 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/. @@ -1052,6 +1056,7 @@ Svaki unos popisa sadrži rječnik koji mora uključivati ID proširenja u polju "extension-id" i njegov URL za ažuriranje u polju "update-url".</translation> <translation id="3874773863217952418">Omogući značajku Dodirnite za pretraživanje</translation> <translation id="3877517141460819966">Integrirani način dvostruke autentifikacije</translation> +<translation id="3879208481373875102">Konfiguriranje popisa prisilno instaliranih web-aplikacija</translation> <translation id="388237772682176890">To je pravilo obustavljeno u verziji M53 i uklonjeno u verziji M54 jer je uklonjena podrška za SPDY/3.1. Onemogućuje upotrebu protokola SPDY za uslugu <ph name="PRODUCT_NAME" />. @@ -1285,6 +1290,10 @@ Cijeli opis mogućih postavki i strukture tog pravila potražite na stranici https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Način obrade povratne petlje korisničkog pravila</translation> +<translation id="4554841826517980623">To pravilo određuje treba li značajka mrežnog dijeljenja datoteka za <ph name="PRODUCT_NAME" /> upotrebljavati protokol <ph name="NETBIOS_PROTOCOL" /> za otkrivanje dijeljenja na mreži. + Ako se to pravilo postavi na True, otkriće dijeljenja upotrebljavat će protokol <ph name="NETBIOS_PROTOCOL" /> za otkrivanje dijeljenja na mreži. + Ako se to pravilo postavi na False, otkriće dijeljenja neće upotrebljavati protokol <ph name="NETBIOS_PROTOCOL" /> za otkrivanje dijeljenja. + Ako pravilo nije postavljeno, zadano će biti onemogućeno za korisnike kojima upravlja tvrtka, a omogućeno za neupravljane korisnike.</translation> <translation id="4555850956567117258">Omogući daljinsku ovjeru za korisnika</translation> <translation id="4557134566541205630">URL web-stranice nove kartice zadanog davatelja usluge pretraživanja</translation> <translation id="4567137030726189378">Dopusti upotrebu Alata za razvojne programere</translation> @@ -1685,6 +1694,7 @@ Ako se to pravilo ne postavi, izgovaranje povratnih informacija onemogućeno je pri prvom prikazivanju zaslona za prijavu. Korisnici mogu omogućiti ili onemogućiti izgovaranje povratnih informacija u bilo kojem trenutku, a status te značajke na zaslonu za prijavu zadržat će se i za sljedeće korisnike.</translation> <translation id="5868414965372171132">Mrežna konfiguracija na razini korisnika</translation> +<translation id="5879014913445067283">Upravlja otkrićem mrežnog dijeljenja datoteka putem <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Zadana postavka kolačića</translation> <translation id="5887414688706570295">Konfigurira prefiks za TalkGadget koji će upotrebljavati hostovi daljinskog pristupa i sprječava korisnike da ga mijenjaju. @@ -2118,6 +2128,17 @@ <translation id="7049373494483449255">Omogućuje proizvodu <ph name="PRODUCT_NAME" /> slanje dokumenata na uslugu <ph name="CLOUD_PRINT_NAME" /> za ispis. NAPOMENA: To se odnosi samo na podršku usluge <ph name="CLOUD_PRINT_NAME" /> u proizvodu <ph name="PRODUCT_NAME" />. To ne sprječava korisnike da poslove ispisa šalju na web-lokacije. Ako je ova postavka omogućena ili nije konfigurirana, korisnici mogu ispisivati putem usluge <ph name="CLOUD_PRINT_NAME" /> iz dijaloškog okvira za ispis u proizvodu <ph name="PRODUCT_NAME" />. Ako je ova postavka onemogućena, korisnici ne mogu ispisivati putem usluge <ph name="CLOUD_PRINT_NAME" /> iz dijaloškog okvira za ispis u proizvodu <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Ako je omogućeno, ovo pravilo prisilno uvozi knjižne oznake iz trenutačno zadanog preglednika. Ako je omogućeno, ovo pravilo također utječe na dijaloški okvir za uvoz. Ako je onemogućeno, nijedna knjižna oznaka neće biti uvezena. Ako nije postavljeno, korisniku može biti postavljen upit želi li uvesti oznake ili do uvoza može doći automatski.</translation> <translation id="7063895219334505671">Dopusti skočne prozore na ovim web-lokacijama</translation> +<translation id="706568410943497889"> + Ako je pravilo postavljeno na True, proizvod <ph name="PRODUCT_NAME" /> ima dopuštenje prikupljati zapisnike događaja WebRTC s Googleovih usluga (npr. Google Meet) i prenijeti te zapisnike na Google. + + Ako se pravilo postavi na False ili se ne postavi, <ph name="PRODUCT_NAME" /> ne smije prikupljati niti prenositi takve zapisnike. + + Ti zapisnici sadrže dijagnostičke podatke kao što su vrijeme i veličina poslanih i primljenih RTP paketa, povratne informacije o zagušenju na mreži i medapodatke o vremenu i kvaliteti zvučnih i videozapisa. Ti podaci pomažu pri otklanjanju pogrešaka kod audio i videopoziva na Chromeu, kao što su poteškoće s procjenom propusnosti itd. Zapisnici ne sadrže audio ili videosadržaje poziva. + + Ta kolekcija podataka može se pokrenuti samo pomoću Googleovih web-usluga, kao što su Hangouts ili Google Meet. + + Ti zapisnici mogu se putem ID-ja sesije povezati s drugim zapisnicima koje je prikupila sama Googleova usluga; to je namijenjeno lakšem otklanjanju pogrešaka. + </translation> <translation id="706669471845501145">Dopusti web-lokaciji prikazivanje obavijesti radne površine</translation> <translation id="7072208053150563108">Stopa promjene zaporke računala</translation> <translation id="7074513465313721551">Konfigurirajte popis domena koje će Sigurno pregledavanje smatrati pouzdanima. To znači sljedeće: @@ -2249,6 +2270,9 @@ <translation id="7336878834592315572">Zadrži kolačiće za vrijeme trajanja sesije</translation> <translation id="7340034977315324840">Izvješće o vremenima aktivnosti uređaja</translation> <translation id="7343497214039883642">Datoteka za konfiguraciju pisača tvrtke za uređaje</translation> +<translation id="7349338075015720646">Određuje popis web-lokacija koje su instalirane u pozadini, bez interakcije korisnika te se ne mogu deinstalirati niti ih korisnik može onemogućiti. + + Svaka je stavka na popisu objekt s dva člana: "url" i "launch_container". "url" bi trebao biti URL web-aplikacije koju je potrebno instalirati, a "launch_container" bi trebao biti ili "prozor" ili "kartica" kako bi se naznačilo kako će se web-aplikacija otvarati nakon instalacije. Ako se "launch_container" izostavi, aplikacija će se pokrenuti u prozoru ako je Chrome bude smatrao progresivnom web-aplikacijom. U suprotnom, pokrenut će se u kartici.</translation> <translation id="7367028210010532881">Usluga Sigurno pregledavanje prikazuje stranicu upozorenja kada korisnici dođu do web-lokacija koje su označene kao potencijalno zlonamjerne. Omogućivanje te postavke sprječava korisnike da ipak krenu dalje sa stranice upozorenja do zlonamjerne web-lokacije. Ako se ta postavka onemogući ili ako se ne konfigurira, korisnici prema želji mogu nastaviti do označene web-lokacije nakon što im se prikazalo upozorenje. @@ -2699,6 +2723,7 @@ Pojam "verzija" može se odnositi na točnu verziju, na primjer "61.0.3163.120" ili prefiks verzije, na primjer "61.0". </translation> <translation id="8544375438507658205">Zadani alat za prikazivanje HTML-a za <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Dopusti sinkronizaciju SMS poruka s telefona na Chromebook.</translation> <translation id="8549772397068118889">Upozori kada se posjećuju web-lokacije izvan paketa sadržaja</translation> <translation id="8566842294717252664">Skrivanje web-trgovine na web-stranici nove kartice i pokretaču aplikacija</translation> <translation id="8586528890725660268">Određuje pisače koje korisnik ne može upotrebljavati. @@ -2743,6 +2768,11 @@ Ako se pravilo ne postavi, usluga zaštite zaporke štitit će samo zaporke za Google, no korisnik će moći promijeniti tu postavku.</translation> <translation id="8672321184841719703">Ciljna verzija automatskog ažuriranja</translation> <translation id="867410340948518937">U2F (univerzalna dvostruka autentifikacija)</translation> +<translation id="8682611302223077049">Omogućuje postavljanje razdoblja u milisekundama tijekom kojeg će se prikazivati obavijesti o ponovnom pokretanju preglednika <ph name="PRODUCT_NAME" /> ili da je potrebno ponovo pokrenuti <ph name="PRODUCT_OS_NAME" /> radi primjene ažuriranja na čekanju. + Tijekom tog će se vremena korisniku prikazivati ponavljajuća obavijest o potrebnom ažuriranju. Za <ph name="PRODUCT_OS_NAME" /> uređaje obavijest o ponovnom pokretanju prikazuje se na traci sustava kada se otkrije nadogradnja. Za preglednike <ph name="PRODUCT_NAME" /> izbornik aplikacije mijenja se kada istekne trećina razdoblja obavijesti kako bi se naznačilo da je potrebno ponovno pokretanje. Boja te obavijesti mijenja se kada isteknu dvije trećine razdoblja i još jednom kada istekne cijelo razdoblje. Dodatne obavijesti omogućene pravilom <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> +za preglednike imaju isti raspored. + + Ako se ne postavi, za <ph name="PRODUCT_OS_NAME" /> uređaje upotrebljava se zadano razdoblje od 345.600.000 milisekundi (četiri dana), a za <ph name="PRODUCT_NAME" /> zadano razdoblje od 604.800.000 milisekundi (jedan tjedan).</translation> <translation id="8685024486845674965">Upozorenje o zaštiti zaporkom aktivira se ponovnom upotrebom zaporke</translation> <translation id="8693243869659262736">Upotreba ugrađenog DNS klijenta</translation> <translation id="8704831857353097849">Popis onemogućenih dodataka</translation> @@ -2779,6 +2809,7 @@ Faktor skaliranja mora biti 100% ili više. Vrijednosti koje bi učinile odgodu zatamnjivanja zaslona u načinu prezentacije kraćom od uobičajene odgode zatamnjivanja zaslona nisu dopuštene.</translation> <translation id="8798099450830957504">Zadano</translation> +<translation id="8801680448782904838">Obavijesti korisnika o obaveznom ili preporučenom ponovnom pokretanju preglednika ili uređaja</translation> <translation id="8818173863808665831">Prijavljuje geografsku lokaciju uređaja. Ako se to pravilo ne postavi ili ako se postavi na lažno, lokacija se neće prijavljivati.</translation> @@ -2925,6 +2956,11 @@ Ako se pravilo postavi na "točno", <ph name="PRODUCT_OS_NAME" /> ponovo će pokrenuti uređaj kada ga korisnik isključi. <ph name="PRODUCT_OS_NAME" /> zamjenjuje sve gumbe za isključivanje na korisničkom sučelju gumbima za ponovno pokretanje. Ako korisnik isključi uređaj tipkom za uključivanje/isključivanje, uređaj se neće automatski ponovo pokrenuti, čak ni ako je to pravilo omogućeno.</translation> <translation id="9152473318295429890">Omogući kontekstualne prijedloge povezanih web-stranica</translation> <translation id="9158929520101169054">Omogući višestruku prijavu u pregledniku</translation> +<translation id="9159126470527871268">Obavještava korisnike da se <ph name="PRODUCT_NAME" /> mora ponovo pokrenuti ili se <ph name="PRODUCT_OS_NAME" /> mora ponovo pokrenuti radi primjene ažuriranja na čekanju. + + Ova postavka pravila omogućuje obavijesti koje informiraju korisnika o preporučenom ili obaveznom ponovnom pokretanju preglednika. Ako nije postavljeno, <ph name="PRODUCT_NAME" /> korisniku naznačuje potrebu za ponovnim pokretanjem putem sitnih promjena na izborniku dok <ph name="PRODUCT_OS_NAME" /> naznačuje isto putem obavijesti u traci sustava. Ako se postavi na "Preporučeno", korisniku će se prikazivati ponavljajuće upozorenje da je preporučeno ponovno pokretanje. Korisnik može odbaciti upozorenje i tako odgoditi ponovno pokretanje. Ako se postavi na "Obavezno", korisniku će se prikazati ponavljajuće upozorenje da će se preglednik prisilno ponovo pokrenuti nakon isteka naznačenog vremena u obavijesti. To razdoblje prema zadanim postavkama iznosi sedam dana za <ph name="PRODUCT_NAME" /> i četiri dana za <ph name="PRODUCT_OS_NAME" />, a može se konfigurirati putem postavke pravila <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Korisnička će se sesija vratiti nakon ponovnog pokretanja.</translation> <translation id="9165792353046089850">Omogućuje vam da odredite smiju li web-lokacije dobivati pristup povezanim USB uređajima. Pristup se može potpuno blokirati ili se može tražiti dopuštenje korisnika svaki put kad neka web-lokacija želi pristupiti povezanom USB uređaju. To se pravilo može nadjačati za određene uzorke URL-ova pomoću pravila "WebUsbAskForUrls" i "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index 169bf7a..5723f550 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -351,6 +351,7 @@ <translation id="199764499252435679">Az összetevők frissítéseinek engedélyezése a <ph name="PRODUCT_NAME" /> termékben</translation> <translation id="2006530844219044261">Energiagazdálkodás</translation> <translation id="201557587962247231">Az eszköz állapotával kapcsolatos jelentések feltöltési gyakorisága</translation> +<translation id="2017301949684549118">„Csendes” telepítésű internetes alkalmazások URL-jei.</translation> <translation id="2018836497795982119">Azt az időtartamot adja meg ezredmásodpercben, amilyen rendszerességgel az eszközkezelő szolgáltatás lekérdezi a felhasználói szabályzattal kapcsolatos információkat. A házirend beállításával felülírja a 3 órás alapértelmezett értéket. Az érték 1800000 (30 perc) és 86400000 (1 nap) között lehet. A tartományon kívül eső értékeket a rendszer a közelebbi tartományhatárra állítja. Ha az operációs rendszer támogatja a házirendekkel kapcsolatos értesítéseket, akkor a frissítési időszak 24 órás lesz, ugyanis a házirenddel kapcsolatos értesítéseknek automatikusan ki kell kényszeríteniük a frissítést, amikor egy házirend megváltozik. @@ -653,6 +654,11 @@ A Google azonnali eredmény URL-je a következőként adható meg: <ph name="GOOGLE_SEARCH_URL" />. Ezt a beállítást akkor kell megadni, ha a „DefaultSearchProviderEnabled” házirend engedélyezve van, és csak ebben az esetben veszi figyelembe a rendszer.</translation> +<translation id="2659019163577049044">Ha ez a beállítás aktiválva van, a felhasználók beállíthatják eszközeiket úgy, hogy szinkronizálják az SMS-eket a telefonok és a Chromebookok között. Ha ez a házirend engedélyezve van, a felhasználóknak kifejezetten aktiválniuk kell ezt a funkciót a beállítási folyamat végrehajtásával. A beállítási folyamat elvégzése után küldhetnek és fogadhatnak SMS-eket a Chromebookjaikon. + + Ha a beállítás nincs aktiválva, a felhasználók nem állíthatják be az SMS-ek szinkronizálását. + + Ha a házirend nincs beállítva, alapértelmezés szerint nincs engedélyezve a felügyelt felhasználók számára, és engedélyezve van a nem felügyelt felhasználók számára.</translation> <translation id="2660846099862559570">Soha ne használjon proxyt</translation> <translation id="267596348720209223">Meghatározza a keresési szolgáltató által támogatott karakterkódolásokat. A kódolások kódtáblanevek, például UTF-8, GB2312 vagy ISO-8859-1. A szolgáltató a megadott sorrendben próbálja őket használni. A házirend nem kötelező. Ha nincs beállítva, akkor a rendszer az alapértelmezés szerinti UTF-8-at használja. A házirend csak akkor teljesül, ha a "DefaultSearchProviderEnabled" házirend engedélyezve van.</translation> <translation id="268577405881275241">Az adattömörítő proxyfunkció engedélyezése</translation> @@ -719,7 +725,6 @@ Ha letiltja ezt a beállítást, illetve nem adja meg az értékét, a nyomtatási előnézet a legutóbb használt nyomtatót választja ki alapértelmezettként. Ha engedélyezi ezt a beállítást, a nyomtatási előnézet az operációs rendszer alapértelmezett nyomtatóját használja alapértelmezettként.</translation> -<translation id="2867699958489427143">Visszaállítás és a célverzió megtartása, ha az operációs rendszer verziója újabb a célverziónál. A folyamat során teljes powerwash műveletet végez.</translation> <translation id="2872961005593481000">Leállítás</translation> <translation id="2874209944580848064">Megjegyzés az Android-alkalmazásokat támogató <ph name="PRODUCT_OS_NAME" /> rendszerű eszközökhöz:</translation> <translation id="2877225735001246144">CNAME keresés tiltása a Kerberos hitelesítési tárgyalások során</translation> @@ -956,7 +961,6 @@ <translation id="3711895659073496551">Felfüggesztés</translation> <translation id="3715569262675717862">Klienstanúsítványokon alapuló hitelesítés</translation> <translation id="3736879847913515635">Engedélyezi a személyek hozzáadását a felhasználókezelőben</translation> -<translation id="3737544779868348650">Eszköz hálózati gazdagépneve</translation> <translation id="3746590506846867985"> Ez a házirend a bejelentkezési képernyőre vonatkozik. A felhasználói munkamenetre az <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> házirend érvényes. Azt javasoljuk, hogy mindkét házirendet ugyanarra az értékre állítsa be. Ha nem egyeznek az értékek, 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. Ha a házirend engedélyezve van, a vesszővel tagolt listában szereplő összes megnevezett eredet önálló folyamatként fut majd. Ez aldomainek szerint is elkülöníti a megnevezett eredeteket; pl. a https://example.com/ megadása a https://foo.example.com/ webhely izolálását is eredményezi, mert ez a https://example.com/ webhely része. @@ -1060,6 +1064,7 @@ A listabejegyzések szótárának tartalmaznia kell a bővítményazonosítót az „extension-id” mezőben, valamint annak frissített URL-jét az „update-url” mezőben.</translation> <translation id="3874773863217952418">Keresés koppintással engedélyezése</translation> <translation id="3877517141460819966">Integrált kétlépcsős azonosítási mód</translation> +<translation id="3879208481373875102">A kényszerített telepítésű internetes alkalmazások listájának konfigurálása</translation> <translation id="388237772682176890">Ez az irányelv megszűnt az M53-ban, valamint eltávolításra került az M54-ben, mivel a SPDY/3.1 támogatását megszüntettük. Letiltja a SPDY protokoll használatát a(z) <ph name="PRODUCT_NAME" /> termékben. @@ -1293,6 +1298,10 @@ A beállítási lehetőségek és a házirend szerkezetének teljes leírásáért látogasson el a következő címre: https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Felhasználói házirend visszacsatolás-feldolgozási módja</translation> +<translation id="4554841826517980623">Ez a házirend azt szabályozza, hogy a <ph name="PRODUCT_NAME" /> hálózati fájlmegosztások funkciója a <ph name="NETBIOS_PROTOCOL" /> használatával fedezze-e fel a hálózaton megosztott tartalmakat. + Ha a házirend értéke Igaz, a megosztásfelfedezés a <ph name="NETBIOS_PROTOCOL" /> protokoll segítségével fedezi fel a hálózaton megosztott tartalmakat. + Ha a házirend értéke Hamis, a megosztásfelfedezés nem használja erre a célra a <ph name="NETBIOS_PROTOCOL" /> protokollt. + Ha a házirend nincs beállítva, akkor alapértelmezés szerint le van tiltva a vállalati felügyelt felhasználóknál, és aktiválva van a nem felügyelt felhasználóknál.</translation> <translation id="4555850956567117258">A felhasználó távoli tanúsításának engedélyezése</translation> <translation id="4557134566541205630">Alapértelmezett keresőszolgáltató új lap oldal URL-címe</translation> <translation id="4567137030726189378">A Fejlesztői eszközök használatának engedélyezése</translation> @@ -1687,6 +1696,7 @@ Ha nem állítja be ezt a házirendet, akkor a hangos visszajelzés le lesz tiltva a bejelentkezési képernyő első megjelenítésekor. A felhasználók bármikor engedélyezhetik vagy letilthatják a hangos visszajelzést, és annak állapota mindegyik felhasználó esetében megmarad a bejelentkezési képernyőn.</translation> <translation id="5868414965372171132">Felhasználói szintű hálózatbeállítás</translation> +<translation id="5879014913445067283">A megosztott hálózati fájlok felfedezésének vezérlése a <ph name="NETBIOS_NAME" /> protokoll segítségével</translation> <translation id="5883015257301027298">Alapértelmezett cookie-beállítások</translation> <translation id="5887414688706570295">Beállítja a távoli hozzáférésű gazdagépek által használt TalkGadget előtagot, és megakadályozza, hogy a felhasználók megváltoztassák azt. @@ -2129,6 +2139,17 @@ <translation id="7049373494483449255">Engedélyezi, hogy a(z) <ph name="PRODUCT_NAME" /> dokumentumokat küldjön nyomtatásra a(z) <ph name="CLOUD_PRINT_NAME" /> programnak. MEGJEGYZÉS: Ez csak a(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatásnak a(z) <ph name="PRODUCT_NAME" /> programban történő támogatását érinti. Nem akadályozza meg a felhasználókat abban, hogy webhelyekről küldjenek nyomtatási feladatokat. Ha a beállítás le van tiltva vagy konfigurálatlanul marad, akkor a felhasználók a <ph name="PRODUCT_NAME" /> nyomtatási párbeszédpanelból nyomtathatnak a(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatásban. Ha a beállítás le van tiltva, akkor a felhasználók nem nyomtathatnak a(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatásban a(z) <ph name="PRODUCT_NAME" /> nyomtatási párbeszédpanelről</translation> <translation id="7053678646221257043">Ez a házirend engedélyezése esetén kikényszeríti a könyvjelzők importálását a jelenlegi alapértelmezett böngészőből. Bekapcsolása esetén a házirend az importálás párbeszédpanelére is hatással van. Letiltása esetén a könyvjelzők importálása nem történik meg. Ha nincs konfigurálva, akkor az alapértelmezett viselkedés marad használatban. Ha nincs beállítva, akkor a rendszer a felhasználótól kérdezheti meg, hogy megtörténjen-e az importálás, vagy hogy lehet-e automatikus az importálás.</translation> <translation id="7063895219334505671">Előugró ablakok engedélyezése ezeken a webhelyeken</translation> +<translation id="706568410943497889"> + Ha a házirend értéke igaz, a <ph name="PRODUCT_NAME" /> gyűjtheti a WebRTC-eseménynaplókat a Google szolgáltatásaiból (pl. a Google Meetből), és feltöltheti ezeket a naplókat a Google rendszerébe. + + Ha a házirend értéke hamis, vagy ha nincs beállítva, akkor a <ph name="PRODUCT_NAME" /> nem gyűjthet és tölthet fel ilyen naplókat. + + Ezek a naplók a Chrome-ban végzett hang- vagy videohívások esetében tapasztalt problémák megkereséséhez segítséget nyújtó információkat tartalmaznak, például a küldött és fogadott RTP-csomagok méretét és időpontját, a hálózati torlódással kapcsolatos visszajelzést, illetve a hang- és videohívásokhoz tartozó képkockák minőségével és idejével kapcsolatos metaadatokat. A naplók nem tartalmazzák a hívások hang- vagy videóanyagát. + + A Chrome ilyen jellegű adatgyűjtését kizárólag a Google webes szolgáltatásai tudják kiváltani (például a Google Hangouts vagy a Google Meet). + + A Google – munkamenet-azonosítók révén – társíthatja ezeket a naplókat a Google adott szolgáltatása által gyűjtött naplókkal; ennek célja a hibakeresés megkönnyítése. + </translation> <translation id="706669471845501145">Megengedi a webhelyeknek, hogy értesítéseket jelenítsenek meg az asztalon</translation> <translation id="7072208053150563108">Gépi jelszó módosításának üteme</translation> <translation id="7074513465313721551">Azon domainek listájának megadása, amelyekben a Biztonságos Böngészés megbízik. Ez azt jelenti, hogy: @@ -2260,6 +2281,9 @@ <translation id="7336878834592315572">Cookie-k megtartása a munkamenet idejére</translation> <translation id="7340034977315324840">Az eszköz aktív idejének jelentése</translation> <translation id="7343497214039883642">Vállalati nyomtató eszközökre vonatkozó konfigurációs fájlja</translation> +<translation id="7349338075015720646">Megadja a „csendesen”, felhasználói beavatkozás nélkül telepített webhelyek listáját. Ezeket a webhelyeket a felhasználó nem távolíthatja el és nem tilthatja le. + + A házirend listáján szereplő összes elemnek két tagja van: „url” és „launch_container”. Az „url" a telepítendő internetes alkalmazás URL-je, míg a „launch_container” értéke vagy „window” (ablak), vagy „tab” (lap), amely jelzi, hogy a böngésző hogyan nyitja meg az internetes alkalmazást a telepítés után. Ha a „launch_container” nincs megadva, akkor az alkalmazás ablakban nyílik meg, ha a Chrome progresszív webes alkalmazásnak tekinti, és lapon, ha nem.</translation> <translation id="7367028210010532881">A Biztonságos Böngészés szolgáltatás figyelmeztető oldalt jelenít meg, ha a felhasználó esetlegesen rosszindulatúként megjelölt oldalra lép. A beállítás engedélyezése megakadályozza, hogy a felhasználó a figyelmeztető oldalról továbblépjen a rosszindulatú webhelyre. Ha a beállítás le van tiltva vagy nincs megadva, akkor a felhasználók dönthetik el, hogy a figyelmeztetés megtekintése után továbblépnek-e a megjelölt webhelyre. @@ -2711,6 +2735,7 @@ A „Verziószám” itt utalhat pontos verzióra (pl. „61.0.3163.120” vagy verzióelőtagra (pl. „61.0”). </translation> <translation id="8544375438507658205">Alapértelmezett HTML-megjelenítő a <ph name="PRODUCT_FRAME_NAME" /> számára</translation> +<translation id="8544465954173828789">Az SMS-ek telefon és Chromebook közti szinkronizálásának engedélyezése.</translation> <translation id="8549772397068118889">Figyelmeztetés tartalomcsomagokon kívüli webhelyek felkeresése esetén</translation> <translation id="8566842294717252664">Az Internetes áruház elrejtése az Új lap oldalon és az alkalmazásindítón</translation> <translation id="8586528890725660268">Meghatározza, hogy mely nyomtatókat nem használhatja a felhasználó. @@ -2755,6 +2780,11 @@ Ha a házirend nincs beállítva, a jelszóvédelmi szolgáltatás csak a Google-jelszavakat védi meg, de a felhasználó módosíthatja a beállítást.</translation> <translation id="8672321184841719703">Cél automatikus frissítési verziója</translation> <translation id="867410340948518937">U2F (univerzális kétlépcsős azonosítás)</translation> +<translation id="8682611302223077049">Lehetővé teszi annak az időtartamnak a megadását (ezredmásodpercben), melynek során a felhasználók értesítést kapnak, ha a <ph name="PRODUCT_NAME" /> újraindítására van szükség, vagy ha egy <ph name="PRODUCT_OS_NAME" />-eszközt újra kell indítani függőben lévő frissítés miatt. + + Ebben az időszakban a felhasználó folyamatosan tájékoztatást fog kapni a frissítés szükségességéről. <ph name="PRODUCT_OS_NAME" />-eszközök esetében újraindítási értesítés jelenik meg a tálcán, ha a rendszer frissítést észlel. A <ph name="PRODUCT_NAME" /> böngésző esetében az értesítési időszak egyharmadának letelte után megváltozik az alkalmazásmenü, jelezve, hogy újra kell indítani a böngészőt. Ennek az értesítésnek a színe ismét módosul az értesítési időszak kétharmadának elérésekor, majd megint módosul a teljes értesítési időszak letelte után. További értesítéseket a(z) <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> házirendben lehet aktiválni ugyanezen ütemezés szerint. + + Ha nincs beállítva, akkor <ph name="PRODUCT_OS_NAME" />-eszközök esetében 345 600 000 ezredmásodperc (négy nap), míg a <ph name="PRODUCT_NAME" /> esetében 604 800 000 ezredmásodperc (egy hét) az alapértelmezett időszak.</translation> <translation id="8685024486845674965">Jelszóvédelemmel kapcsolatos figyelmeztetést aktivál a jelszó újrafelhasználása</translation> <translation id="8693243869659262736">Beépített DNS-ügyfél használata</translation> <translation id="8704831857353097849">Tiltott bővítmények listája</translation> @@ -2791,6 +2821,7 @@ A skálázási tényezőnek 100%-nak vagy többnek kell lennie. Nem lehet olyan értékeket beállítani, amelyek révén a képernyő-elsötétítési késleltetés prezentációs módban rövidebb lenne, mint a rendes képernyő-elsötétítési késleltetés.</translation> <translation id="8798099450830957504">Alapértelmezett</translation> +<translation id="8801680448782904838">A felhasználó értesítése arról, hogy ajánlott, illetve szükséges a böngésző vagy az eszköz újraindítása</translation> <translation id="8818173863808665831">Az eszköz földrajzi helyének jelentése. Ha nincs beállítva, vagy ha hamis értékre van állítva ez a házirend, akkor a hely nem lesz jelentve.</translation> @@ -2947,6 +2978,11 @@ Ha a házirend értéke true (igaz), a <ph name="PRODUCT_OS_NAME" /> újraindítást kezdeményez, amikor a felhasználó leállítja az eszközt. A <ph name="PRODUCT_OS_NAME" /> a felhasználói felület összes leállítógombját újraindítást kezdeményező gombokra cseréli ki. Ha a felhasználó a bekapcsológombbal állítja le az eszközt, az nem indul automatikusan újra automatikusan akkor sem, ha a házirend engedélyezve van.</translation> <translation id="9152473318295429890">Kontextus szerinti javaslatok engedélyezése kapcsolódó weboldalak formájában</translation> <translation id="9158929520101169054">Böngészőn belüli többfiókos bejelentkezés engedélyezése</translation> +<translation id="9159126470527871268">A felhasználók értesítése arról, hogy szükség van a <ph name="PRODUCT_NAME" /> vagy a <ph name="PRODUCT_OS_NAME" /> újraindítására függőben lévő frissítés alkalmazása céljából. + + Ez a házirend engedélyezi azokat az értesítéseket, amelyek tájékoztatják a felhasználót arról, hogy ajánlott vagy szükséges a böngésző vagy az eszköz újraindítása. Ha nincs beállítva, akkor a <ph name="PRODUCT_NAME" /> a menüben látható apró módosításokkal jelzi az újraindítás szükségességét, míg a <ph name="PRODUCT_OS_NAME" /> értesítést jelenít meg a tálcán. Az „Ajánlott” beállítás használata esetén ismétlődően megjelenik a felhasználónak, hogy újraindítás ajánlott. Az üzenet elvetésével a felhasználó elhalaszthatja az újraindítást. A „Kötelező” beállítás használata esetén ismétlődő figyelmeztetés jelenik meg a felhasználónak, amely tájékoztatja őt, hogy a rendszer kikényszeríti a böngésző újraindítását az értesítési időszak letelte után. A <ph name="PRODUCT_NAME" /> esetében hét, a <ph name="PRODUCT_OS_NAME" /> esetében pedig négy nap az alapértelmezett időtartam, amely a következő házirendbeállításban módosítható: <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + A felhasználói munkamenet az újraindítást követően helyreáll.</translation> <translation id="9165792353046089850">Lehetővé teszi annak beállítását, hogy a webhelyek hozzáférhetnek-e a csatlakoztatott USB-eszközökhöz. A hozzáférés teljes mértékben letiltható, vagy a böngésző minden olyan alkalommal rákérdezhet a felhasználónál az engedélyezésre, amikor valamelyik webhely csatlakoztatott USB-eszközökhöz szeretne hozzáférni. A házirend felülbírálható URL-minták megadásával a „WebUsbAskForUrls” és „WebUsbBlockedForUrls” házirendekben.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 9da59cd..e1c3a50 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -339,6 +339,7 @@ <translation id="199764499252435679">Aktifkan update komponen di <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Pengelolaan daya</translation> <translation id="201557587962247231">Frekuensi upload laporan status perangkat</translation> +<translation id="2017301949684549118">URL untuk Aplikasi Web diinstal otomatis.</translation> <translation id="2018836497795982119">Menjelaskan jangka waktu dalam milidetik terkait layanan pengelolaan perangkat yang ditanyakan untuk informasi kebijakan pengguna. Menyetel kebijakan ini akan mengganti nilai default 3 jam. Nilai yang valid untuk kebijakan ini adalah rentang mulai 1800000 (30 menit) hingga 86400000 (1 hari). Nilai di luar rentang ini akan dimasukkan ke batas masing-masing. Jika platform mendukung pemberitahuan kebijakan, jeda penyegaran akan disetel menjadi 24 jam karena pemberitahuan kebijakan diperkirakan akan memaksa penyegaran otomatis setiap kali kebijakan berubah. @@ -635,6 +636,11 @@ URL penelusuran Google dapat ditentukan sebagai: <ph name="GOOGLE_SEARCH_URL" />. Opsi ini harus disetel jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan dan hanya akan diberlakukan jika opsi tersebut digunakan.</translation> +<translation id="2659019163577049044">Jika setelan ini diaktifkan, pengguna akan diizinkan menyiapkan perangkatnya untuk menyinkronkan SMS antara ponsel dan Chromebook-nya. Perhatikan bahwa jika kebijakan ini diizinkan, pengguna harus secara eksplisit ikut serta dalam fitur ini dengan menyelesaikan alur penyiapan. Setelan alur penyiapan selesai, pengguna akan dapat mengirim dan menerima SMS di Chromebook-nya. + + Jika setelan ini dinonaktifkan, pengguna tidak akan diizinkan untuk menyiapkan sinkronisasi SMS. + + Jika kebijakan ini tidak ditetapkan, setelan defaultnya adalah tidak diizinkan untuk pengguna yang dikelola dan diizinkan untuk pengguna yang tidak dikelola.</translation> <translation id="2660846099862559570">Jangan pernah gunakan proxy</translation> <translation id="267596348720209223">Menentukan penyandiaksaraan karakter yang didukung oleh penyedia penelusuran. Penyandiaksaraan adalah nama-nama halaman kode seperti UTF-8, GB2312, dan ISO-8859-1. Kode tersebut dicoba dalam urutan yang disediakan. Kebijakan ini bersifat opsional. Jika tidak disetel, default yang akan digunakan adalah UTF-8. Kebijakan ini hanya dipatuhi jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan.</translation> <translation id="268577405881275241">Aktifkan fitur proxy kompresi data</translation> @@ -701,7 +707,6 @@ Jika setelan ini dinonaktifkan atau nilai tidak ditetapkan, Pratinjau Cetak akan menggunakan printer yang terakhir kali digunakan sebagai pilihan tujuan default. Jika setelan ini diaktifkan, Pratinjau Cetak akan menggunakan printer default sistem OS sebagai pilihan tujuan default.</translation> -<translation id="2867699958489427143">Rollback dan tetap menggunakan versi target jika versi OS lebih baru dari target. Lakukan powerwash penuh selama prosesnya.</translation> <translation id="2872961005593481000">Matikan</translation> <translation id="2874209944580848064">Catatan untuk perangkat <ph name="PRODUCT_OS_NAME" /> yang mendukung aplikasi Android:</translation> <translation id="2877225735001246144">Nonaktifkan pencarian CNAME saat menegosiasikan autentikasi Kerberos</translation> @@ -940,7 +945,6 @@ <translation id="3711895659073496551">Tangguhkan</translation> <translation id="3715569262675717862">Autentikasi berdasarkan sertifikat klien</translation> <translation id="3736879847913515635">Mengaktifkan penambahan orang di pengelola pengguna</translation> -<translation id="3737544779868348650">Hostname jaringan perangkat</translation> <translation id="3746590506846867985"> Kebijakan ini berlaku untuk layar login. Lihat juga kebijakan <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> yang berlaku untuk sesi pengguna. Sebaiknya setel kedua kebijakan dengan nilai yang sama. Jika nilainya tidak sama, mungkin terjadi penundaan saat memasukkan sesi pengguna sementara nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan. Jika kebijakan ini diaktifkan, tiap 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/. @@ -1048,6 +1052,7 @@ Setiap entri cantuman berisi kamus yang harus menyertakan ID ekstensi dalam bidang 'extension-id', dan URL pembaruannya dalam bidang 'update-url'.</translation> <translation id="3874773863217952418">Aktifkan Tap untuk Menelusuri</translation> <translation id="3877517141460819966">Mode autentikasi faktor kedua yang terintegrasi</translation> +<translation id="3879208481373875102">Konfigurasikan daftar Aplikasi Web yang diinstal otomatis</translation> <translation id="388237772682176890">Kebijakan ini sudah tidak digunakan di M53 dan dihapus di M54, karena dukungan SPDY/3.1 telah dihapus. Menonaktifkan penggunaan protokol SPDY di <ph name="PRODUCT_NAME" />. @@ -1281,6 +1286,10 @@ Untuk deskripsi lengkap terkait kemungkinan setelan dan struktur kebijakan ini, buka https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Mode pemrosesan loopback kebijakan pengguna</translation> +<translation id="4554841826517980623">Kebijakan ini mengontrol apakah fitur Berbagi File Jaringan untuk <ph name="PRODUCT_NAME" /> harus menggunakan <ph name="NETBIOS_PROTOCOL" /> untuk menemukan file yang dibagikan di jaringan. + Jika kebijakan ini disetel ke True, penemuan berbagi akan menggunakan protokol <ph name="NETBIOS_PROTOCOL" /> untuk menemukan file yang dibagikan di jaringan. + Jika kebijakan ini disetel ke False, penemuan berbagi tidak akan menggunakan protokol <ph name="NETBIOS_PROTOCOL" /> untuk menemukan file yang dibagikan. + Jika kebijakan tidak disetel, setelan defaultnya adalah dinonaktifkan untuk pengguna yang dikelola perusahaan dan diaktifkan untuk pengguna yang tidak dikelola.</translation> <translation id="4555850956567117258">Mengaktifkan pengesahan jarak jauh bagi pengguna</translation> <translation id="4557134566541205630">URL halaman tab baru penyedia penelusuran default</translation> <translation id="4567137030726189378">Izinkan penggunaan Developer Tools</translation> @@ -1675,6 +1684,7 @@ Jika kebijakan ini tidak disetel, masukan yang diucapkan akan dinonaktifkan saat layar masuk ditampilkan untuk pertama kali. Pengguna dapat mengaktifkan atau menonaktifkan masukan yang diucapkan kapan saja dan statusnya di layar masuk bersifat permanen antar pengguna.</translation> <translation id="5868414965372171132">Konfigurasi jaringan tingkat pengguna</translation> +<translation id="5879014913445067283">Mengontrol penemuan Berbagi File Jaringan melalui <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Setelan cookie default</translation> <translation id="5887414688706570295">Mengonfigurasi awalan TalkGadget yang akan digunakan oleh hosting akses jarak jauh dan mencegah pengguna mengubahnya. @@ -2116,6 +2126,17 @@ <translation id="7049373494483449255">Mengizinkan <ph name="PRODUCT_NAME" /> mengirimkan dokumen ke <ph name="CLOUD_PRINT_NAME" /> untuk pencetakan. CATATAN: Setelan ini hanya memengaruhi dukungan <ph name="CLOUD_PRINT_NAME" /> dalam <ph name="PRODUCT_NAME" />. Setelan ini tidak mencegah pengguna mengirimkan pekerjaan cetak di situs web. Jika setelan ini diaktifkan atau tidak dikonfigurasi, pengguna dapat mencetak ke <ph name="CLOUD_PRINT_NAME" /> dari dialog cetak <ph name="PRODUCT_NAME" />. Jika setelan ini dinonaktifkan, pengguna tidak dapat mencetak ke <ph name="CLOUD_PRINT_NAME" /> dari dialog pencetakan <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Kebijakan ini memaksa bookmark diimpor dari browser default saat ini, jika diaktifkan. Jika diaktifkan, kebijakan ini juga memengaruhi dialog impor. Jika dinonaktifkan, tidak ada bookmark yang diimpor. Jika tidak disetel, pengguna mungkin akan diminta untuk mengimpor, atau pengimporan dapat terjadi secara otomatis.</translation> <translation id="7063895219334505671">Izinkan pop-up di situs ini</translation> +<translation id="706568410943497889"> + Jika kebijakan disetel ke true, <ph name="PRODUCT_NAME" /> diizinkan untuk mengumpulkan log aktivitas WebRTC dari layanan Google (mis., Google Meet), dan mengupload log tersebut ke Google. + + Jika kebijakan disetel ke false, atau tidak disetel, <ph name="PRODUCT_NAME" /> mungkin tidak mengumpulkan atau mengupload log tersebut. + + Log ini berisi informasi diagnostik yang berguna saat melakukan debug masalah pada panggilan audio atau video call di Chrome, seperti waktu dan ukuran paket RTP yang dikirim serta diterima, masukan tentang kemacetan di jaringan, dan metadata tentang waktu dan kualitas frame audio dan video. Log ini tidak berisi konten audio atau video dari panggilan. + + Pengumpulan data oleh Chrome ini hanya dapat dipicu oleh layanan web Google, seperti Google Hangouts atau Google Meet. + + Google dapat mengaitkan log ini, melalui ID sesi, dengan log lain yang dikumpulkan oleh layanan Google itu sendiri. Ini dimaksudkan agar debug lebih mudah. + </translation> <translation id="706669471845501145">Izinkan situs menampilkan pemberitahuan desktop</translation> <translation id="7072208053150563108">Tingkat perubahan sandi mesin</translation> <translation id="7074513465313721551">Mengonfigurasi daftar domain yang akan dipercaya Safe Browsing. Hal ini berarti: @@ -2247,6 +2268,9 @@ <translation id="7336878834592315572">Menyimpan cookie selama durasi sesi</translation> <translation id="7340034977315324840">Laporkan waktu aktivitas perangkat</translation> <translation id="7343497214039883642">File konfigurasi printer perusahaan untuk perangkat</translation> +<translation id="7349338075015720646">Menentukan daftar situs yang diinstal otomatis, tanpa interaksi pengguna, dan tidak dapat di-uninstal atau dinonaktifkan oleh pengguna. + + Setiap item daftar kebijakan adalah objek yang berisi dua anggota: "url" dan "launch_container". "url" harus berupa URL aplikasi web untuk menginstal dan "launch_container" harus berupa "window" atau "tab" untuk menunjukkan cara Aplikasi Web dibuka setelah diinstal. Jika "launch_container" dihilangkan, aplikasi akan diluncurkan di jendela jika Chrome mempertimbangkannya sebagai Progressive Web App dan di tab lain.</translation> <translation id="7367028210010532881">Layanan Safe Browsing menampilkan halaman peringatan jika pengguna membuka situs yang ditandai sebagai berpotensi berbahaya. Mengaktifkan setelan ini akan membuat pengguna tidak dapat melanjutkan dari halaman peringatan ke situs berbahaya. Jika setelan ini dinonaktifkan atau tidak dikonfigurasi, pengguna dapat memilih untuk melanjutkan ke situs yang ditandai setelah peringatan ditampilkan. @@ -2698,6 +2722,7 @@ "Versi" di sini dapat berarti versi yang tepat seperti '61.0.3163.120' atau awalan versi, seperti '61.0' </translation> <translation id="8544375438507658205">Pengurai HTML default untuk <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Izinkan SMS disinkronkan dari ponsel ke Chromebook.</translation> <translation id="8549772397068118889">Memperingatkan saat mengunjungi situs di luar paket konten</translation> <translation id="8566842294717252664">Menyembunyikan toko web dari Halaman Tab Baru dan peluncur aplikasi</translation> <translation id="8586528890725660268">Menentukan printer yang tidak dapat digunakan pengguna. @@ -2736,6 +2761,11 @@ Jika kebijakan ini dibiarkan tidak disetel, layanan perlindungan sandi hanya akan melindungi sandi Google, namun pengguna dapat mengubah setelan ini.</translation> <translation id="8672321184841719703">Versi Pembaruan Otomatis Target</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Mengizinkan Anda menyetel jangka waktu, dalam milidetik, pengguna diberi tahu bahwa <ph name="PRODUCT_NAME" /> harus diluncurkan ulang atau bahwa perangkat <ph name="PRODUCT_OS_NAME" /> harus dimulai ulang untuk menerapkan update yang tertunda. + + Selama jangka waktu ini, pengguna akan berulang kali diberi tahu tentang perlunya update. Untuk perangkat <ph name="PRODUCT_OS_NAME" />, notifikasi mulai ulang muncul di baki sistem ketika upgrade terdeteksi. Untuk browser <ph name="PRODUCT_NAME" />, menu aplikasi berubah untuk menunjukkan bahwa peluncuran ulang diperlukan setelah sepertiga periode notifikasi berlalu. Warna notifikasi akan berubah lagi setelah dua pertiga periode notifikasi berlalu, dan berubah lagi setelah seluruh periode notifikasi berlalu. Notifikasi tambahan yang diaktifkan oleh kebijakan <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> mengikuti jadwal yang sama seperti ini. + + Jika tidak disetel, periode default 345600000 milidetik (empat hari) digunakan untuk perangkat <ph name="PRODUCT_OS_NAME" /> dan 604800000 milidetik (satu minggu) untuk <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Peringatan perlindungan sandi dipicu oleh penggunaan ulang sandi</translation> <translation id="8693243869659262736">Gunakan klien DNS di dalamnya</translation> <translation id="8704831857353097849">Daftar plugin yang dinonaktifkan</translation> @@ -2772,6 +2802,7 @@ Faktor skala harus 100% atau lebih. Nilai yang akan membuat penundaan layar redup dalam mode presentasi jadi lebih pendek daripada versi reguler tidak diizinkan.</translation> <translation id="8798099450830957504">Default</translation> +<translation id="8801680448782904838">Beri tahu pengguna bahwa meluncurkan ulang browser atau memulai ulang perangkat direkomendasikan atau diperlukan</translation> <translation id="8818173863808665831">Melaporkan lokasi geografis perangkat. Jika kebijakan tidak disetel, atau disetel ke false, lokasi tidak akan dilaporkan.</translation> @@ -2913,6 +2944,11 @@ Jika kebijakan ini disetel ke True, <ph name="PRODUCT_OS_NAME" /> akan memicu boot ulang ketika pengguna mematikan perangkat. <ph name="PRODUCT_OS_NAME" /> menggantikan semua kemunculan tombol matikan di antarmuka pengguna dengan tombol boot ulang. Jika pengguna mematikan perangkat menggunakan tombol daya, perangkat tidak otomatis melakukan boot ulang, meskipun kebijakan ini diaktifkan.</translation> <translation id="9152473318295429890">Aktifkan saran kontekstual halaman terkait</translation> <translation id="9158929520101169054">Izinkan Login Multipel Dalam Browser</translation> +<translation id="9159126470527871268">Beri tahu pengguna bahwa <ph name="PRODUCT_NAME" /> harus diluncurkan ulang atau <ph name="PRODUCT_OS_NAME" /> harus dimulai ulang untuk menerapkan update yang tertunda. + + Setelan kebijakan ini mengaktifkan notifikasi untuk memberi tahu pengguna bahwa meluncurkan ulang browser atau memulai ulang perangkat direkomendasikan atau diperlukan. Jika tidak disetel, <ph name="PRODUCT_NAME" /> menunjukkan kepada pengguna bahwa peluncuran ulang diperlukan melalui sedikit perubahan pada menunya, sementara <ph name="PRODUCT_OS_NAME" /> menunjukkan hal tersebut melalui notifikasi di baki sistem. Jika disetel ke 'Recommended', akan muncul peringatan berulang yang menunjukkan bahwa peluncuran ulang direkomendasikan. Pengguna dapat menutup peringatan ini untuk menunda peluncuran ulang. Jika disetel ke 'Required', akan muncul peringatan berulang yang menunjukkan bahwa peluncuran ulang browser akan dilakukan secara paksa setelah periode notifikasi terlampaui. Periode ini akan disetel secara default menjadi tujuh hari untuk <ph name="PRODUCT_NAME" /> dan empat hari untuk <ph name="PRODUCT_OS_NAME" />, serta dapat dikonfigurasi melalui setelan kebijakan <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Sesi pengguna dipulihkan setelah peluncuran ulang/mulai ulang.</translation> <translation id="9165792353046089850">Memungkinkan Anda menyetel apakah situs diizinkan untuk mengakses perangkat USB yang terhubung. Akses dapat diblokir sepenuhnya, atau pengguna dapat dimintai izin setiap kali situs ingin mengakses perangkat USB yang terhubung. Kebijakan ini dapat diganti untuk pola URL yang spesifik menggunakan can be overridden for specific URL patterns using the 'WebUsbAskForUrls' and 'WebUsbBlockedForUrls' policies.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 70eac3e6..2c2039c 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -328,6 +328,7 @@ <translation id="199764499252435679">Consenti gli aggiornamenti dei componenti in <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestione dell'alimentazione</translation> <translation id="201557587962247231">Frequenza dei caricamenti del rapporto sullo stato del dispositivo</translation> +<translation id="2017301949684549118">URL per abb web da installare automaticamente.</translation> <translation id="2018836497795982119">Consente di specificare in millisecondi il periodo di tempo per cui vengono richieste informazioni sulle norme relative agli utenti al servizio di gestione del dispositivo. Se questa norma viene impostata, il valore predefinito di tre ore viene ignorato. L'intervallo dei valori validi per questa norma è compreso tra 1800000 (30 minuti) e 86400000 (un giorno). I valori non compresi in questo intervallo verranno bloccati al relativo limite. Se la piattaforma supporta le notifiche relative alle norme, il ritardo dell'aggiornamento verrà impostato su 24 ore perché è previsto che le notifiche relative alle norme forzino l'aggiornamento automatico quando cambiano le norme. @@ -624,6 +625,11 @@ L'URL per la ricerca di Google può essere specificato come segue: <ph name="GOOGLE_SEARCH_URL" />. Questa opzione deve essere impostata quando la norma "DefaultSearchProviderEnabled" è attiva e verrà rispettata soltanto in questo caso.</translation> +<translation id="2659019163577049044">Se questa impostazione viene attivata, gli utenti potranno configurare il proprio dispositivo in modo da sincronizzare i messaggi SMS tra i telefoni e i Chromebooks. Tieni presente che se questa norma viene consentita, gli utenti devono attivare in modo esplicito questa funzione tramite il completamento del flusso di configurazione. Una volta completato il flusso di configurazione, gli utenti potranno inviare e ricevere messaggi SMS sui loro Chromebook. + + Se questa impostazione è disattivata, gli utenti non potranno configurare la sincronizzazione degli SMS. + + Se questa norma non viene impostata, per impostazione predefinita non sarà disponibile per gli utenti gestiti, mentre lo sarà invece per gli utenti non gestiti.</translation> <translation id="2660846099862559570">Non utilizzare mai un proxy</translation> <translation id="267596348720209223">Consente di specificare le codifiche dei caratteri supportate dal provider di ricerca. Le codifiche sono nomi di pagine codificati come UTF-8, GB2312 e ISO-8859-1. Vengono provate nell'ordine indicato. Questa norma è facoltativa. Se non viene impostata viene utilizzato il valore predefinito UTF-8. Questa norma viene rispettata soltanto se è attiva la norma "DefaultSearchProviderEnabled".</translation> <translation id="268577405881275241">Attiva la funzione proxy di compressione dei dati</translation> @@ -690,7 +696,6 @@ Se disattivi o non configuri questa impostazione, in Anteprima di stampa viene indicata la stampante utilizzata più di recente come destinazione predefinita. Se attivi questa impostazione, in Anteprima di stampa viene usata la stampante predefinita del sistema operativo come destinazione predefinita.</translation> -<translation id="2867699958489427143">Esegui il rollback alla versione target se la versione del sistema operativo è più nuova del target. Esegui un powerwash completo durante la procedura.</translation> <translation id="2872961005593481000">Spegni</translation> <translation id="2874209944580848064">Nota per i dispositivi <ph name="PRODUCT_OS_NAME" /> che supportano le app Android:</translation> <translation id="2877225735001246144">Disabilita ricerca CNAME durante la negoziazione con Kerberos</translation> @@ -924,7 +929,6 @@ <translation id="3711895659073496551">Sospensione</translation> <translation id="3715569262675717862">Autenticazione basata su certificati client</translation> <translation id="3736879847913515635">Attiva la funzione Aggiungi persona in Gestione utenti</translation> -<translation id="3737544779868348650">Nome host della rete del dispositivo</translation> <translation id="3746590506846867985"> 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 viene attivata, ogni origine indicata in un elenco di valori separati da virgole verrà eseguita in un proprio processo. Verranno inoltre isolate le origini indicate dai sottodomini; ad esempio, se viene specificato il sito https://example.com/ viene isolato anche https://foo.example.com/, perché fa parte del sito https://example.com/. @@ -1028,6 +1032,7 @@ Ogni voce dell'elenco contiene un dizionario che deve includere l'ID dell'estensione nel campo "extension-id" e il relativo URL di aggiornamento nel campo "update-url".</translation> <translation id="3874773863217952418">Attiva Tocca per cercare</translation> <translation id="3877517141460819966">Modalità di autenticazione a due fattori integrata</translation> +<translation id="3879208481373875102">Configura l'elenco delle app web con installazione forzata</translation> <translation id="388237772682176890">Questa norma è stata ritirata in M53 e rimossa in M54 perché è stato rimosso il supporto di SPDY/3.1. Consente di disattivare l'utilizzo del protocollo SPDY in <ph name="PRODUCT_NAME" />. @@ -1255,6 +1260,10 @@ Per una descrizione completa delle possibili impostazioni e della struttura di questa norma, visita la pagina https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Modalità di elaborazione loopback delle norme relative agli utenti</translation> +<translation id="4554841826517980623">Questa norma controlla se per <ph name="PRODUCT_NAME" /> la funzione Condivisioni file di rete debba utilizzare o meno il protocollo <ph name="NETBIOS_PROTOCOL" /> per individuare le condivisioni sulla rete. + Quando questa norma è impostata su Vero, il rilevamento delle condivisioni utilizza il protocollo <ph name="NETBIOS_PROTOCOL" /> per individuare le condivisioni sulla rete. + Quando questa norma è impostata su Falso, il rilevamento delle condivisioni non utilizza il protocollo <ph name="NETBIOS_PROTOCOL" /> per individuare le condivisioni sulla rete. + Se la norma viene lasciata senza impostazione, per impostazione predefinita la norma sarà disattivata per gli utenti gestiti dall'azienda, mentre sarà attiva per gli utenti non gestiti.</translation> <translation id="4555850956567117258">Attivazione dell'attestazione da remoto per l'utente</translation> <translation id="4557134566541205630">URL pagina Nuova scheda provider di ricerca predefinito</translation> <translation id="4567137030726189378">Consenti l'utilizzo degli Strumenti per sviluppatori</translation> @@ -1646,6 +1655,7 @@ Se la norma non viene impostata, la lettura vocale viene disattivata alla prima visualizzazione della schermata di accesso. Gli utenti possono attivare o disattivare la lettura vocale in qualsiasi momento e il relativo stato nella schermata di accesso persiste per tutti gli utenti.</translation> <translation id="5868414965372171132">Configurazione di rete a livello di utente</translation> +<translation id="5879014913445067283">Consente di controllare la funzione Condivisioni file di rete tramite il protocollo <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Impostazione cookie predefiniti</translation> <translation id="5887414688706570295">Consente di configurare il prefisso TalkGadget che verrà utilizzato dagli host di accesso remoto e impedisce agli utenti di modificarlo. @@ -2075,6 +2085,16 @@ <translation id="7049373494483449255">Permette di consentire a <ph name="PRODUCT_NAME" /> di inviare documenti da stampare a <ph name="CLOUD_PRINT_NAME" />. NOTA. Questo riguarda soltanto il supporto di <ph name="CLOUD_PRINT_NAME" /> in <ph name="PRODUCT_NAME" />. Non impedisce agli utenti di inviare processi di stampa su siti web. Se questa impostazione viene attivata o non viene configurata, gli utenti potranno stampare con <ph name="CLOUD_PRINT_NAME" /> utilizzando la finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />. Se questa impostazione viene disattivata, gli utenti non potranno stampare con <ph name="CLOUD_PRINT_NAME" /> utilizzando la finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">Se è attiva, questa norma impone l'importazione dei Preferiti dal browser predefinito corrente. Se la norma è attiva incide anche sulla finestra di dialogo di importazione. Se non è attiva, i Preferiti non vengono importati. Se non viene impostata, all'utente potrebbe essere chiesto se desidera effettuare l'importazione, oppure l'importazione potrebbe avvenire automaticamente.</translation> <translation id="7063895219334505671">Consenti popup su questi siti</translation> +<translation id="706568410943497889"> + Se la norma è impostata su vero, <ph name="PRODUCT_NAME" /> può raccogliere log eventi WebRTC dai servizi Google (ad es., Google Meet) e caricare i log su Google. + + Se la norma è impostata su falso o è priva di impostazione, <ph name="PRODUCT_NAME" /> potrebbe non raccogliere né caricare tali log. + Questi log contengono informazioni di diagnostica utili per il debug dei problemi relativi a chiamate vocali o videochiamate in Chrome, ad esempio data/ora e dimensioni dei pacchetti RTP inviati e ricevuti,feedback sulla congestione della rete, nonché metadati su tempo e qualità dei frame audio e video. Questi log non contengono l'audio o i video delle chiamate. + + Questa raccolta di dati da parte di Chrome può essere attivata soltanto dai servizi web di Google, ad esempio Google Hangouts o Google Meet. + + Google potrebbe associare questi log tramite un ID sessione ad altri log raccolti dal servizio Google stesso al fine di facilitare il debug. + </translation> <translation id="706669471845501145">Consenti la visualizzazione di notifiche desktop da parte dei siti</translation> <translation id="7072208053150563108">Frequenza di modifica della password del computer</translation> <translation id="7074513465313721551">Configura l'elenco dei domini che Navigazione sicura ritiene affidabili. Ciò significa che Navigazione sicura non controllerà la presenza di risorse pericolose (ad es. phishing, malware o software indesiderato) se i rispettivi URL corrispondono a questi domini. @@ -2205,6 +2225,9 @@ <translation id="7336878834592315572">Conserva cookie per tutta la durata della sessione</translation> <translation id="7340034977315324840">Indicazione tempi di attività del dispositivo</translation> <translation id="7343497214039883642">File di configurazione delle stampanti aziendali per i dispositivi</translation> +<translation id="7349338075015720646">Consente di specificare un elenco di siti web installati automaticamente, senza interazione dell'utente e che non possono essere disinstallati o disattivati dall'utente. + + Ogni elemento dell'elenco della norma è un oggetto con due componenti: "url" e "launch_container". "url" deve essere l'URL dell'app web da installare e "launch_container" deve essere "finestra" o "scheda" per indicare in che modo l'app web verrà aperta una volta installata. Se il valore di "launch_container" non viene specificato, l'app verrà avviata in una finestra se Chrome la considera un'applicazione web progressiva, altrimenti in una scheda.</translation> <translation id="7367028210010532881">Il servizio Navigazione sicura mostra una pagina di avviso quando gli utenti visitano siti che sono segnalati come potenzialmente dannosi. L'attivazione di questa impostazione impedisce agli utenti di proseguire dalla pagina di avviso al sito dannoso. Se questa impostazione viene disattivata o non viene configurata, gli utenti possono scegliere di visitare il sito segnalato dopo che è stato mostrato l'avviso. @@ -2643,6 +2666,7 @@ Qui per "versione" si intende sia una versione esatta come "61.0.3163.120", sia un prefisso per la versione, come "61.0". </translation> <translation id="8544375438507658205">Renderer HTML predefinito per <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Consente la sincronizzazione di messaggi SMS dal telefono al Chromebook.</translation> <translation id="8549772397068118889">Avvisa quando vengono visitati siti non presenti nei pacchetti di contenuti</translation> <translation id="8566842294717252664">Nascondi il Web Store nella pagina Nuova scheda e in Avvio applicazioni</translation> <translation id="8586528890725660268">Consente di specificare le stampanti non utilizzabili dagli utenti. @@ -2687,6 +2711,11 @@ Se questa norma viene lasciata non impostata, il servizio di protezione tramite password proteggerà esclusivamente le password Google, ma l'utente sarà in grado di modificare questa impostazione.</translation> <translation id="8672321184841719703">Scegli versione target dell'aggiornamento automatico</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Consente di stabilire per quanto tempo, in millisecondi, gli utenti riceveranno notifiche relative alla necessità di riavviare <ph name="PRODUCT_NAME" /> o un dispositivo <ph name="PRODUCT_OS_NAME" /> per applicare un aggiornamento in sospeso. + + Durante questo periodo di tempo l'utente verrà informato più volte della necessità di un aggiornamento. Per quanto riguarda i dispositivi <ph name="PRODUCT_OS_NAME" />, nella barra delle applicazioni viene mostrata una notifica relativa al riavvio quando viene rilevato un upgrade. Per quanto riguarda i browser <ph name="PRODUCT_NAME" />, il menu delle app cambia per indicare che è necessario il riavvio una volta trascorso un terzo del periodo di notifica. Questa notifica cambia colore una volta trascorsi due terzi del periodo di notifica e lo cambia di nuovo al termine dell'intero periodo di notifica. Le notifiche aggiuntive attivate in base alla norma <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seguono questa stessa pianificazione. + + Se la norma non viene impostata, viene usato il periodo predefinito di 345600000 millisecondi (quattro giorni) per <ph name="PRODUCT_OS_NAME" /> e di 604800000 millisecondi (una settimana) per <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">L'avviso di protezione tramite password viene attivato se vengono riutilizzate password</translation> <translation id="8693243869659262736">Utilizza client DNS integrato</translation> <translation id="8704831857353097849">Elenco dei plug-in disattivati</translation> @@ -2723,6 +2752,7 @@ Il fattore di regolazione minimo deve essere 100%. Valori che renderebbero il ritardo di oscuramento dello schermo in modalità di presentazione inferiore al ritardo di oscuramento normale non sono consentiti.</translation> <translation id="8798099450830957504">Predefinito</translation> +<translation id="8801680448782904838">Consente di inviare a un utente una notifica che comunica che è consigliato o necessario eseguire un riavvio del browser o del dispositivo</translation> <translation id="8818173863808665831">Consente di segnalare la posizione geografica del dispositivo. Se la norma non viene impostata o viene impostata su false, la posizione non viene segnalata.</translation> @@ -2863,6 +2893,11 @@ Se questa norma viene impostata su true, <ph name="PRODUCT_OS_NAME" /> attiva il riavvio quando l'utente spegne il dispositivo. <ph name="PRODUCT_OS_NAME" /> sostituisce tutte le occorrenze dei pulsanti di spegnimento nell'interfaccia utente con pulsanti di riavvio. Se l'utente spegne il dispositivo utilizzando il tasto di accensione, il dispositivo non viene riavviato, anche se la norma è attivata.</translation> <translation id="9152473318295429890">Attiva i suggerimenti contestuali delle pagine web correlate</translation> <translation id="9158929520101169054">Consenti accesso simultaneo nel browser</translation> +<translation id="9159126470527871268">Consente di inviare agli utenti una notifica che comunica che <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> deve essere riavviato per applicare un aggiornamento in sospeso. + + Questa impostazione della norma attiva le notifiche che informano l'utente che è consigliabile oppure obbligatorio riavviare il browser o il dispositivo. Se non è impostata, <ph name="PRODUCT_NAME" /> indica all'utente che è necessario un riavvio tramite piccole modifiche al menu, mentre <ph name="PRODUCT_OS_NAME" /> indica ciò con una notifica nella barra delle applicazioni. Se l'impostazione è "Recommended", all'utente verrà mostrato un avviso ricorrente con un riavvio consigliato. L'utente può ignorare questo avviso e rimandare il riavvio. Se impostata su "Required", verrà visualizzato un avviso ricorrente all'utente che indica che il riavvio del browser sarà forzato una volta trascorso il periodo di notifica. Per impostazione predefinita, il periodo di notifica è di sette giorni per <ph name="PRODUCT_NAME" /> e di quattro giorni per <ph name="PRODUCT_OS_NAME" /> e può essere configurato tramite l'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + La sessione dell'utente viene ripristinata dopo il riavvio.</translation> <translation id="9165792353046089850">Consente di stabilire se consentire o meno ai siti web di accedere ai dispositivi USB collegati. L'accesso può essere bloccato completamente oppure l'utente può ricevere una richiesta ogni volta che un sito web vuole accedere ai dispositivi USB collegati. Questa norma può essere sostituita per pattern URL specifici che utilizzano le norme "WebUsbAskForUrls" e "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index fd51440..4afaa06 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -341,6 +341,7 @@ <translation id="199764499252435679">הפעלת עדכוני רכיבים ב-<ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">ניהול צריכת החשמל</translation> <translation id="201557587962247231">תדירות ההעלאות של דוח מצב המכשיר</translation> +<translation id="2017301949684549118">כתובות אתרים בשביל אפליקציות אינטרנט שיותקנו באופן שקט.</translation> <translation id="2018836497795982119">מדיניות זו מציינת את פרק הזמן במילי-שניות עד שנשלחת לשירות ניהול המכשיר בקשה לקבלת מידע על מדיניות המשתמש. הגדרה של מדיניות זו תחול במקום הגדרת ברירת המחדל של 3 שעות. ערכים חוקיים למדיניות זו נמצאים בטווח שבין 1800000 (30 דקות) ל-86400000 (יום אחד). ערכים שאינם נמצאים בטווח הזה יוחלפו בערכים המתאימים הנמצאים בגבולות הטווח. אם הפלטפורמה תומכת בהודעות בנוגע למדיניות, פרק הזמן עד לרענון יוגדר ל-24 שעות, מכיוון שהודעות בנוגע למדיניות צפויות לגרום לרענון אוטומטי בכל פעם שהמדיניות משתנה. @@ -641,6 +642,11 @@ ניתן לציין את כתובת האתר של החיפוש ב-Google כ: <ph name="GOOGLE_SEARCH_URL" /> יש להגדיר את האפשרות הזו כאשר המדיניות 'DefaultSearchProviderEnabled' מופעלת, והיא תקפה רק במקרה זה.</translation> +<translation id="2659019163577049044">אם ההגדרה הזו מופעלת, משתמשים יוכלו להגדיר את המכשירים שלהם לסנכרון הודעות SMS בין הטלפון ל-Chromebook. לתשומת ליבך, אם המדיניות הזו מורשית, משתמשים חייבים להסכים לתכונה הזו באופן מפורש על-ידי ביצוע תהליך הגדרה. בסיום תהליך ההגדרה, משתמשים יוכלו לשלוח ולקבל הודעות SMS ב-Chromebook. + + אם ההגדרה הזו מושבתת, משתמשים לא יורשו להגדיר סנכרון של הודעות SMS. + + אם המדיניות הזו לא תוגדר, ברירת המחדל היא לאסור זאת על משתמשים מנוהלים ולהתיר זאת למשתמשים שאינם מנוהלים.</translation> <translation id="2660846099862559570">לעולם אל תשתמש בשרת Proxy</translation> <translation id="267596348720209223">מציין את קידודי התווים שנתמכים על ידי ספק החיפוש. קידודים הם שמות דפי קידוד כגון UTF-8, GB2312 ו-ISO-8859-1. יש להשתמש בהם לפי הסדר שבו הם סופקו. מדיניות זו היא אופציונלית. אם היא אינה מוגדרת, ברירת המחדל שבה המערכת תשתמש הוא UTF-8. מדיניות זו תקפה רק אם המדיניות 'DefaultSearchProviderEnabled' מופעלת.</translation> <translation id="268577405881275241">הפעל את התכונה של שרת Proxy לדחיסת נתונים</translation> @@ -707,7 +713,6 @@ אם תשבית את ההגדרה הזו או לא תקבע ערך, המדפסת האחרונה שבה נעשה שימוש תיבחר, כברירת מחדל, כיעד לתצוגה המקדימה של ההדפסה. אם תפעיל את ההגדרה הזו, המדפסת שהוגדרה ב-OS תיבחר, כברירת מחדל, כיעד לתצוגה המקדימה של ההדפסה.</translation> -<translation id="2867699958489427143">חזרה לגירסה קודמת והשארת גירסת היעד אם גירסת ה-OS חדשה יותר מהיעד. ביצוע Powerwash מלא כחלק מהתהליך.</translation> <translation id="2872961005593481000">כיבוי</translation> <translation id="2874209944580848064">הערה למכשירי <ph name="PRODUCT_OS_NAME" /> התומכים באפליקציות Android:</translation> <translation id="2877225735001246144">השבת חיפוש CNAME בעת ניהול משא ומתן של אימות Kerberos</translation> @@ -944,7 +949,6 @@ <translation id="3711895659073496551">השהה</translation> <translation id="3715569262675717862">אימות המבוסס על אישורי לקוח</translation> <translation id="3736879847913515635">ניתן להוסיף מישהו דרך מנהל המשתמשים</translation> -<translation id="3737544779868348650">שם המארח של המכשיר ברשת</translation> <translation id="3746590506846867985"> המדיניות הזו חלה על מסך הכניסה. יש לעיין גם במדיניות <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> שחלה על הסשן של המשתמש. מומלץ לקבוע את אותו ערך בשתי הגדרות המדיניות. אם הערכים יהיו שונים, ייתכן עיכוב בכניסה לסשן של משתמש כשהמערכת מחילה את הערך שצוין במדיניות המשתמש. אם המדיניות מופעלת, כל אחד מהמקורות שצוינו ברשימה המופרדת באמצעות פסיקים יפעל בתהליך משלו. ההגדרה הזו תבודד גם מקורות שהשם שלהם הוא תת-דומיין. לדוגמה: ציון הכתובת https://example.com/ יגרום גם לבידוד של https://foo.example.com/ כחלק מהאתר https://example.com/. @@ -1049,6 +1053,7 @@ כל ערך ברשימה מכיל מילון שחייב לכלול את מזהה התוסף בשדה 'מזהה-תוסף' ואת כתובת האתר לעדכון בשדה 'כתובת אתר לעדכון'.</translation> <translation id="3874773863217952418">הפעלת 'הקשה כדי לחפש'</translation> <translation id="3877517141460819966">מצב משולב של אימות גורם שני</translation> +<translation id="3879208481373875102">הגדרת רשימה של אפליקציות אינטרנט שמותקנות בהגדרת מנהל המערכת</translation> <translation id="388237772682176890">המדיניות הוצאה משימוש ב-M53 והוסרה ב-M54, כתוצאה מהפסקת התמיכה ב-SPDY/3.1. מדיניות זו משביתה את פרוטוקול SPDY ב-<ph name="PRODUCT_NAME" />. @@ -1284,6 +1289,10 @@ תיאור מלא של ההגדרות האפשריות ושל מבנה המדיניות הזה זמין בכתובת https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">מצב עיבוד בלולאה חוזרת של מדיניות משתמש</translation> +<translation id="4554841826517980623">המדיניות הזו קובעת אם התכונה 'התקן רשת לשיתוף קבצים' של <ph name="PRODUCT_NAME" /> צריכה להשתמש ב-<ph name="NETBIOS_PROTOCOL" /> כדי לאתר התקני שיתוף ברשת. + כשהמדיניות הזו מוגדרת כ-True, איתור התקני השיתוף ישתמש בפרוטוקול <ph name="NETBIOS_PROTOCOL" /> כדי לאתר התקני שיתוף ברשת. + כשהמדיניות הזו מוגדרת כ-False, איתור התקני השיתוף לא ישתמש בפרוטוקול <ph name="NETBIOS_PROTOCOL" /> כדי לאתר התקני שיתוף. + אם המדיניות הזו לא תוגדר, ברירת המחדל היא להשבית את האפשרות הזו בשביל משתמשים מנוהלים בארגון ולהפעיל אותה בשביל משתמשים שאינם מנוהלים.</translation> <translation id="4555850956567117258">הפעל הזדהות מרחוק עבור המשתמש</translation> <translation id="4557134566541205630">כתובת האתר של דף הכרטיסייה החדשה של ספק החיפוש המוגדר כברירת מחדל</translation> <translation id="4567137030726189378">התרת שימוש ב'כלים למפתחים'</translation> @@ -1673,6 +1682,7 @@ אם תשאיר מדיניות זו ללא הגדרה, המשוב הקולי יהיה מושבת בעת ההצגה הראשונה של מסך ההתחברות. משתמשים יוכלו להפעיל או להשבית את המשוב הקולי בכל עת והסטטוס שלו במסך ההתחברות יישאר עקבי בין המשתמשים.</translation> <translation id="5868414965372171132">תצורת רשת ברמת המשתמש</translation> +<translation id="5879014913445067283">שולטת באיתור התקני שיתוף ברשת דרך <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">הגדרת ברירת מחדל של קובצי Cookie</translation> <translation id="5887414688706570295">מגדיר את קידומת TalkGadget שתשמש עבור מארחים של גישה מרחוק ומונע מהמשתמשים לשנות אותה. @@ -2113,6 +2123,17 @@ <translation id="7049373494483449255">מאפשר ל-<ph name="PRODUCT_NAME" /> לשלוח ל-<ph name="CLOUD_PRINT_NAME" /> מסמכים להדפסה. הערה: פעולה זו משפיעה רק על תמיכת <ph name="CLOUD_PRINT_NAME" /> ב-<ph name="PRODUCT_NAME" />. היא אינה מונעת ממשתמשים לשלוח עבודות הדפסה באתרי אינטרנט. אם הגדרה זו הופעלה או לא הוגדרה, המשתמשים יכולים להדפיס ל-<ph name="CLOUD_PRINT_NAME" /> מתיבת דו-שיח של הדפסה של <ph name="PRODUCT_NAME" />. אם הגדרה זו מושבתת, המשתמשים לא יכולים להדפיס ל-<ph name="CLOUD_PRINT_NAME" /> מתיבת דו-שיח של הדפסה של <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">מדיניות זו אוכפת על ייבוא סימניות מדפדפן ברירת המחדל הנוכחי, אם היא הוגדרה כפעילה. אם הופעלה, מדיניות זו גם משפיעה על תיבת הדו-שיח של הייבוא. אם היא מושבתת, לא יבוצע ייבוא לסימניות. אם מדיניות זו אינה מוגדרת, ייתכן שהמערכת תשאל את המשתמש אם לייבא, או שהייבוא יתרחש באופן אוטומטי.</translation> <translation id="7063895219334505671">אפשר חלונות קופצים באתרים אלה</translation> +<translation id="706568410943497889"> + אם המדיניות הזו מוגדרת כ-true, <ph name="PRODUCT_NAME" /> מורשה לאסוף יומנים של אירועי WebRTC משירותי Google (למשל Google Meet) ולהעלות את היומנים האלה אל Google. + + אם המדיניות מוגדרת כ-false או אינה מוגדרת, <ph name="PRODUCT_NAME" /> אינו מורשה לאסוף או להעלות יומנים כאלה. + + היומנים האלה מכילים מידע שעוזר לנפות באגים בשיחות אודיו או וידאו ב-Chrome, כמו השעה שבה נשלחו והתקבלו חבילות RTP והגודל שלהן, משוב לגבי עומס ברשת ומטא-נתונים לגבי משך הזמן והאיכות של מסגרות וידאו ואודיו. היומנים לא מכילים את תוכן האודיו או הווידאו מהשיחה. + + את איסוף הנתונים הזה על-ידי Chrome יכולים להפעיל רק שירותי האינטרנט של Google, כמו Google Hangouts או Google Meet. + + Google עשויה לשייך את היומנים האלה באמצעות מזהה סשן ליומנים אחרים שנאספו על-ידי שירות Google עצמו. מטרת השיוך היא להקל על ניפוי הבאגים. + </translation> <translation id="706669471845501145">אפשר לאתרים להציג התראות בשולחן העבודה</translation> <translation id="7072208053150563108">תדירות השינוי של סיסמת המחשב</translation> <translation id="7074513465313721551">הגדרה של רשימת הדומיינים שייחשבו כמהימנים בגלישה בטוחה. המשמעות: @@ -2245,6 +2266,9 @@ <translation id="7336878834592315572">שמור את קובצי ה-Cookie לכל משך ההפעלה.</translation> <translation id="7340034977315324840">דיווח על זמני הפעילות של המכשיר</translation> <translation id="7343497214039883642">קובץ תצורת מדפסות ארגוניות בשביל מכשירים</translation> +<translation id="7349338075015720646">מציינת רשימת אתרים המותקנים באופן שקט, ללא אינטראקציה של המשתמש, ושהמשתמש לא יכול להסיר את ההתקנה שלהם או להשבית אותם. + + כל פריט ברשימה שבמדיניות הוא אובייקט עם שני חלקים: "url" ו-"launch_container". הרכיב "url" צריך להיות כתובת האתר של אפליקצית האינטרנט שיש להתקין. הרכיב "launch_container" צריך להיות "window" או "tab" כדי לציין איך אפליקציית האינטרנט תפתח אחרי ההתקנה. אם הרכיב "launch_container" יושמט, האפליקציה תופעל בחלון אם דפדפן Chrome יניח שזו אפליקציה מסוג Progressive Web App. אם לא, היא תופעל בכרטיסייה.</translation> <translation id="7367028210010532881">שירות 'גלישה בטוחה' מציג דף אזהרה כשמשתמשים מנווטים אל אתרים שסומנו כבעלי פוטנציאל זדוני. הפעלת ההגדרה הזו מונעת ממשתמשים להמשיך מדף האזהרה אל האתר הזדוני. אם ההגדרה הזו מושבתת או לא מקבלת ערך, משתמשים יכולים להמשיך אל האתר המסומן לאחר הצגת האזהרה. @@ -2700,6 +2724,7 @@ במדיניות הזו, המונח "גירסה" יכול להתייחס לגירסה המדויקת, כמו '61.0.3163.120' או לתחילית של גירסה, כמו '61.0' </translation> <translation id="8544375438507658205">מעבד HTML המוגדר כברירת מחדל עבור <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">התרה של סנכרון הודעות SMS בין הטלפון לבין ה-Chromebook.</translation> <translation id="8549772397068118889">הצג אזהרה בעת ביקור באתרים שמחוץ לחבילות תוכן</translation> <translation id="8566842294717252664">הסתר את חנות האינטרנט בדף הכרטיסייה החדשה ובמפעיל היישומים</translation> <translation id="8586528890725660268">מציינת את המדפסות שאינן זמינות למשתמש. @@ -2745,6 +2770,11 @@ אם המדיניות הזו לא מוגדרת, שירות הגנת הסיסמה יגן רק על סיסמאות Google, אבל המשתמש יוכל לשנות את ההגדרה הזו.</translation> <translation id="8672321184841719703">גירסת עדכון אוטומטי המוגדרת כיעד</translation> <translation id="867410340948518937">U2F (גורם שני אוניברסלי)</translation> +<translation id="8682611302223077049">מאפשרת לך לקבוע את תקופת הזמן באלפיות שנייה להצגת הודעה למשתמש על כך שצריך להפעיל מחדש את <ph name="PRODUCT_NAME" /> או מכשיר <ph name="PRODUCT_OS_NAME" /> כדי להחיל עדכון שנמצא בהמתנה. + + בתקופת הזמן הזו תוצג למשתמש באופן חוזר ההודעה לגבי הצורך בעדכון. במכשירי <ph name="PRODUCT_OS_NAME" />, הודעה על הצורך בהפעלה מחדש מופיעה במגש המערכת כשיש שדרוג זמין. בדפדפני <ph name="PRODUCT_NAME" />, בתום שליש מתקופת ההודעה תפריט האפליקציות משתנה כדי לציין שיש צורך בהפעלה מחדש. צבע ההודעה הזו משתנה אחרי שחולפים שני שליש מתקופת ההודעה, ושוב אחרי שחולפת תקופת הזמן המלאה של ההודעה. ההודעות הנוספות שמופעלות במדיניות <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> לדפדפנים פועלות לפי אותו לוח זמנים. + + אם היא לא מוגדרת, ייעשה שימוש בתקופת ברירת המחדל: 345600000 אלפיות שנייה (ארבעה ימים) בשביל מכשירי <ph name="PRODUCT_OS_NAME" /> ו-604800000 אלפיות שנייה (שבוע) בשביל <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">האזהרה של שירות ההגנה באמצעות סיסמה מופעלת אחרי שימוש חוזר בסיסמה</translation> <translation id="8693243869659262736">השתמש בלקוח ה-DNS המובנה</translation> <translation id="8704831857353097849">רשימה של יישומי פלאגין מושבתים</translation> @@ -2781,6 +2811,7 @@ על פקטור הדירוג להיות 100% או יותר. אין להשתמש בערכים שיקצרו יותר מהרגיל את ההשהיה לפני עמעום המסך במצב מצגת.</translation> <translation id="8798099450830957504">ברירת מחדל</translation> +<translation id="8801680448782904838">הצגת הודעה למשתמש על כך שמומלץ או שיש צורך להפעיל מחדש את הדפדפן או המכשיר</translation> <translation id="8818173863808665831">דיווח על המיקום הגיאוגרפי של המכשיר. אם המדיניות אינה מוגדרת או מוגדרת כ-false, המיקום לא ידיווח.</translation> @@ -2930,6 +2961,11 @@ אם המדיניות מוגדרת לערך True, מערכת <ph name="PRODUCT_OS_NAME" /> תבצע הפעלה מחדש כאשר המשתמש יכבה את המכשיר. מערכת <ph name="PRODUCT_OS_NAME" /> מחליפה את כל המופעים של לחצני הכיבוי בממשק המשתמש בלחצני הפעלה מחדש. אם המשתמש מכבה את המכשיר באמצעות לחצן ההפעלה, המכשיר לא יופעל מחדש באופן אוטומטי, גם אם מדיניות זו מופעלת.</translation> <translation id="9152473318295429890">הפעלת הצעות תלויות הקשר לדפי אינטרנט קשורים</translation> <translation id="9158929520101169054">התרת כניסה עם מספר חשבונות בתוך הדפדפן</translation> +<translation id="9159126470527871268">הצגת הודעה למשתמשים על כך שצריך להפעיל מחדש את <ph name="PRODUCT_NAME" /> או את <ph name="PRODUCT_OS_NAME" /> כדי להחיל עדכון שנמצא בהמתנה. + + המדיניות הזו מאפשרת להציג למשתמש הודעות על כך שמומלץ לבצע הפעלה מחדש של הדפדפן, או שהיא נדרשת. אם המדיניות לא מוגדרת, <ph name="PRODUCT_NAME" /> מציין למשתמש שיש צורך בהפעלה מחדש בעזרת שינויים קלים במראה התפריט. ב-<ph name="PRODUCT_OS_NAME" /> ההודעה במצב הזה תופיע במגש המערכת. אם היא מוגדרת כ'מומלצת', תוצג למשתמש אזהרה חוזרת על כך שמומלץ להפעיל מחדש את הדפדפן. המשתמש יכול לסגור את האזהרה כדי לדחות את ההפעלה מחדש. אם המדיניות מוגדרת כ'נדרשת', תוצג למשתמש אזהרה חוזרת על כך שתבוצע הפעלה מחדש כפויה של הדפדפן בסיום תקופת ההודעה. התקופה נקבעת כברירת מחדל לשבעה ימים בשביל <ph name="PRODUCT_NAME" /> וארבעה ימים בשביל <ph name="PRODUCT_OS_NAME" />, ואפשר לשנות אותה דרך הגדרת המדיניות <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + בסיום ההפעלה מחדש המשתמש יוחזר לסשן שבו היה.</translation> <translation id="9165792353046089850">מאפשרת לך לקבוע אם אתרים יכולים לקבל גישה אל התקני USB מחוברים. ניתן לחסום את הגישה לחלוטין, או שהמשתמש יתבקש להעניק אישור בכל פעם שאתר רוצה לקבל גישה אל התקני USB מחוברים. אפשר לעקוף את המדיניות הזו בשביל דפוסים ספציפיים של כתובות אתרים בעזרת אפשרויות המדיניות 'WebUsbAskForUrls' ו-'WebUsbBlockedForUrls'.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 801f9fc..319ad5e9 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -352,6 +352,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> でのコンポーネントの更新を有効にする</translation> <translation id="2006530844219044261">電源管理</translation> <translation id="201557587962247231">デバイス ステータス レポートのアップロード頻度</translation> +<translation id="2017301949684549118">自動インストールするウェブアプリの URL。</translation> <translation id="2018836497795982119">デバイス管理サービスにユーザー ポリシー情報を照会する間隔をミリ秒単位で指定します。 このポリシーを設定すると、デフォルト値の 3 時間よりも優先されます。このポリシーの有効な値は 1,800,000(30 分)から 86,400,000(1 日)の範囲の値です。この範囲に収まらない値は上限値と下限値のどちらか近い方に設定されます。プラットフォームがポリシーの通知に対応している場合は、ポリシーが変更されるたびにポリシーの通知により更新は自動的に適用されることになるため、更新の遅延は 24 時間に設定されます。 @@ -648,6 +649,11 @@ Google の検索 URL は、<ph name="GOOGLE_SEARCH_URL" /> のように指定できます。 このオプションは、「DefaultSearchProviderEnabled」ポリシーが有効な場合に設定が必要で、適用されるのはその場合のみとなります。</translation> +<translation id="2659019163577049044">この設定が有効になっている場合、ユーザーは自身のスマートフォンと Chromebooks の間で SMS メッセージを同期するよう設定できます。なお、このポリシーが「許可する」となっている場合、ユーザーは設定フローを行って明示的にこの機能を有効にする必要があります。設定フローが完了すると、ユーザーは自身の Chromebooks で SMS メッセージを送受信できるようになります。 + + この設定が無効になっている場合、ユーザーは SMS の同期を設定できません。 + + このポリシーが未設定の場合、デフォルトの設定は、管理対象ユーザーに対しては「許可しない」、管理対象外のユーザーに対しては「許可する」となります。</translation> <translation id="2660846099862559570">プロキシを使用しない</translation> <translation id="267596348720209223">検索プロバイダによってサポートされる文字エンコードを指定します。エンコードは、UTF-8、GB2312、ISO-8859-1 などのコード ページ名であり、指定された順序で適用されます。このポリシーは省略可能です。未設定の場合、デフォルトでは UTF-8 が使用されます。このポリシーは、「DefaultSearchProviderEnabled」ポリシーが有効な場合にのみ適用されます。</translation> <translation id="268577405881275241">データ圧縮プロキシ機能を有効にする</translation> @@ -714,7 +720,6 @@ この設定を無効にするか値を設定しなかった場合、印刷プレビューではデフォルトの出力先として最近使用したプリンタが使用されます。 この設定を有効にした場合、印刷プレビューではデフォルトの出力先としてオペレーティング システムのデフォルト プリンタが使用されます。</translation> -<translation id="2867699958489427143">OS のバージョンが対象バージョンよりも新しい場合に、対象バージョンに戻してそのバージョンを維持します。このプロセスでは完全な Powerwash が行われます。</translation> <translation id="2872961005593481000">終了</translation> <translation id="2874209944580848064">Android アプリをサポートする <ph name="PRODUCT_OS_NAME" /> デバイスに関する注意:</translation> <translation id="2877225735001246144">Kerberos 認証をネゴシエートするときに CNAME 検索を無効にする</translation> @@ -953,7 +958,6 @@ <translation id="3711895659073496551">停止する</translation> <translation id="3715569262675717862">クライアント証明書に基づく認証</translation> <translation id="3736879847913515635">ユーザー管理画面でのユーザー追加を許可する</translation> -<translation id="3737544779868348650">端末のネットワーク ホスト名</translation> <translation id="3746590506846867985"> このポリシーはログイン画面に適用されます。ユーザー セッションに適用される <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ポリシーもご覧になり、両方のポリシーを同じ値に設定することをおすすめします。値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。 このポリシーが有効に設定されている場合、カンマ区切りのリストで指定された発行元が各自のプロセスで実行されます。また、サブドメインによって指定された発行元も分離されます。たとえば、https://example.com/ と指定すると、https://foo.example.com/ も https://example.com/ サイトの一部として分離されます。 @@ -1060,6 +1064,7 @@ リストの各エントリには辞書を指定し、[extension-id] フィールドに拡張機能 ID、[update-url] フィールドに更新 URL を指定する必要があります。</translation> <translation id="3874773863217952418">「タップして検索」を有効にする</translation> <translation id="3877517141460819966">統合 2 段階認証モード</translation> +<translation id="3879208481373875102">強制的にインストールされるウェブアプリのリストを設定する</translation> <translation id="388237772682176890">SPDY/3.1 がサポートされなくなるため、このポリシーは、M53 でサポート終了、M54 で廃止となります。 <ph name="PRODUCT_NAME" /> で SPDY プロトコルを使用できないようにします。 @@ -1293,6 +1298,10 @@ このポリシーで指定できる設定とその構成の詳しい説明については、https://www.chromium.org/administrators/policy-list-3/extension-settings-full をご覧ください。 </translation> <translation id="4554651132977135445">ユーザー ポリシーのループバック処理モード</translation> +<translation id="4554841826517980623"><ph name="PRODUCT_NAME" /> のネットワーク ファイル共有の機能で、ネットワーク上の共有場所の検出に <ph name="NETBIOS_PROTOCOL" /> を使用するかどうかを設定します。 + このポリシーが True に設定されている場合、共有場所の検出処理ではネットワーク上の共有場所の検出に <ph name="NETBIOS_PROTOCOL" /> プロトコルが使用されます。 + このポリシーが False に設定されている場合、共有場所の検出処理では共有場所の検出に <ph name="NETBIOS_PROTOCOL" /> プロトコルは使用されません。 + このポリシーが未設定の場合、デフォルトの設定は、企業の管理対象ユーザーに対しては「無効」、管理対象外のユーザーに対しては「有効」となります。</translation> <translation id="4555850956567117258">ユーザーのリモート認証を有効にする</translation> <translation id="4557134566541205630">デフォルトの検索プロバイダの新しいタブ ページ URL</translation> <translation id="4567137030726189378">デベロッパー ツールの使用を許可する</translation> @@ -1687,6 +1696,7 @@ このポリシーが未設定の場合は、ログイン画面が表示された直後は音声フィードバックが無効になります。ユーザーはいつでも音声フィードバックを有効または無効にすることができ、ログイン画面での音声フィードバックの状態はログアウト後も維持されます。</translation> <translation id="5868414965372171132">ユーザー レベルのネットワーク設定</translation> +<translation id="5879014913445067283">ネットワーク ファイル共有の検出の際に <ph name="NETBIOS_NAME" /> を有効にするかどうかを設定する</translation> <translation id="5883015257301027298">デフォルトの Cookie 設定</translation> <translation id="5887414688706570295">リモート アクセス ホストが使用する TalkGadget プレフィックスを設定し、ユーザーが変更できないようにします。 @@ -2128,6 +2138,17 @@ <translation id="7049373494483449255"><ph name="PRODUCT_NAME" /> がドキュメントを <ph name="CLOUD_PRINT_NAME" /> に送信して印刷できるようにします。注: この設定は <ph name="PRODUCT_NAME" /> での <ph name="CLOUD_PRINT_NAME" /> のサポートのみに影響します。ユーザーがウェブサイトで印刷ジョブを送信できなくなるわけではありません。この設定が有効または未設定の場合、ユーザーは <ph name="PRODUCT_NAME" /> の印刷ダイアログから <ph name="CLOUD_PRINT_NAME" /> に印刷できます。この設定を無効にすると、ユーザーは <ph name="PRODUCT_NAME" /> の印刷ダイアログから <ph name="CLOUD_PRINT_NAME" /> に印刷できなくなります。</translation> <translation id="7053678646221257043">このポリシーを有効にすると、現在の既定のブラウザからブックマークがインポートされます。有効にすると、このポリシーはインポートのダイアログにも影響を与えます。無効にすると、ブックマークはインポートされません。未設定の場合はインポートするかどうかをユーザーに尋ねるか、自動的にインポートされます。</translation> <translation id="7063895219334505671">これらのサイトのポップアップを許可する</translation> +<translation id="706568410943497889"> + このポリシーが true に設定されている場合は、<ph name="PRODUCT_NAME" /> に対して、Google サービス(Google Meet など)からの WebRTC イベントログの収集と、Google へのそれらのログのアップロードが許可されます。 + + このポリシーが false に設定されているか未設定の場合、<ph name="PRODUCT_NAME" /> によるログの収集とアップロードは行われません。 + + これらのログには、送受信された RTP パケットの時間とサイズ、ネットワークの輻輳に関するフィードバック、音声および動画フレームの時間と品質に関するメタデータなど、Chrome での音声や動画の呼び出しに関する問題をデバッグする際に役立つ診断情報が含まれます。呼び出された音声や動画のコンテンツは含まれません。 + + Chrome によるこのデータ収集は、Google のウェブサービス(Google ハングアウト、Google Meet など)からのみ行われます。 + + Google は、これらのログと、Google サービス自体により収集される他のログとを、セッション ID を使って関連付けることがあります。この関連付けは、デバッグを容易にする目的で行われます。 + </translation> <translation id="706669471845501145">サイトに対してデスクトップ通知の表示を許可する</translation> <translation id="7072208053150563108">パソコンのパスワードの変更頻度</translation> <translation id="7074513465313721551">セーフ ブラウジングで信頼するドメインのリストを設定します。動作は次のようになります。 @@ -2259,6 +2280,9 @@ <translation id="7336878834592315572">セッションの継続中は Cookie を保存する</translation> <translation id="7340034977315324840">デバイス操作時間を報告する</translation> <translation id="7343497214039883642">デバイスの企業プリンタ設定ファイル</translation> +<translation id="7349338075015720646">ユーザーに操作を求めずに自動インストールするウェブサイトのリストを指定します。ユーザーはここで指定されたウェブサイトをアンインストールすることも無効化することもできません。 + + このポリシーで指定するリストの個々の項目は、「url」と「launch_container」の 2 つで構成されるオブジェクトとなります。「url」には、インストールするウェブアプリの URL を指定します。「launch_container」には、インストール後にウェブアプリを開く方法として「window」または「tab」を指定します。「launch_container」を省略した場合、Chrome でプログレッシブ ウェブアプリと判定されたアプリはウィンドウで開かれ、それ以外のアプリはタブで開かれます。</translation> <translation id="7367028210010532881">不正なサイトの可能性があると報告されているサイトにユーザーが移動しようとすると、セーフ ブラウジング サービスにより警告ページが表示されます。この設定を有効にした場合、ユーザーはその警告ページから不正なサイトに進むことができなくなります。 この設定を無効にするか未設定のままにした場合、ユーザーは警告が表示された後にそのサイトに進むかどうかを選択できます。 @@ -2710,6 +2734,7 @@ この「バージョン」としては、正確なバージョン(61.0.3163.120 など)を指定することも、バージョンの接頭辞(61.0 など)を指定することもできます。 </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> のデフォルトの HTML レンダラ</translation> +<translation id="8544465954173828789">スマートフォンから Chromebook への SMS メッセージの同期を許可する。</translation> <translation id="8549772397068118889">コンテンツ パック外部のサイトを訪問したときに警告する</translation> <translation id="8566842294717252664">新しいタブページとアプリ ランチャーでウェブストアを非表示にする</translation> <translation id="8586528890725660268">ユーザーに使用を許可しないプリンタを指定します。 @@ -2754,6 +2779,11 @@ このポリシーが設定されていない場合、パスワード保護サービスでは Google パスワードのみが保護されますが、ユーザーはこの設定を変更できます。</translation> <translation id="8672321184841719703">自動更新の対象バージョンを指定</translation> <translation id="867410340948518937">U2F(Universal Second Factor)</translation> +<translation id="8682611302223077049">保留中のアップデートを適用するために <ph name="PRODUCT_NAME" /> または <ph name="PRODUCT_OS_NAME" /> 搭載端末の再起動が必要であることをユーザーに通知する期間をミリ秒単位で設定します。 + + 指定した期間中は、アップデートが必要であることがユーザーに繰り返し通知されます。<ph name="PRODUCT_OS_NAME" /> 搭載端末の場合は、アップグレードが検出されると、システムトレイに再起動を促す通知が表示されます。<ph name="PRODUCT_NAME" /> ブラウザの場合は、通知期間の 3 分の 1 が経過した時点で、再起動が必要であること表すためにアプリメニューの色が変わります。この通知の色は、通知期間の 3 分の 2 が経過した時点と、通知期間が最後まで経過した時点でさらに変わります。<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ポリシーによって追加の通知を有効にしている場合は、同じスケジュールで通知が表示されます。 + + このポリシーが設定されていない場合、デフォルトの期間として <ph name="PRODUCT_OS_NAME" /> 搭載端末では 345600000 ミリ秒 (4 日間)、<ph name="PRODUCT_NAME" /> では 604800000 ミリ秒(1 週間)が使用されます。</translation> <translation id="8685024486845674965">パスワードが再使用されたときに、パスワード保護について警告する</translation> <translation id="8693243869659262736">組み込みの DNS クライアントを使用する</translation> <translation id="8704831857353097849">無効なプラグインのリスト</translation> @@ -2790,6 +2820,7 @@ 倍率は 100% 以上でなければなりません。プレゼンテーション モードでの画面を暗くするまでの時間を標準値よりも短くするように値を設定することはできません。</translation> <translation id="8798099450830957504">既定</translation> +<translation id="8801680448782904838">ブラウザまたは端末の再起動が推奨されるか必要であることをユーザーに通知する</translation> <translation id="8818173863808665831">端末の地理的位置をレポートします。 このポリシーを設定していない場合、あるいは false に設定している場合、位置はレポートされません。</translation> @@ -2945,6 +2976,11 @@ このポリシーを true に設定すると、ユーザーがデバイスを終了したときに <ph name="PRODUCT_OS_NAME" /> は再起動を実行します。<ph name="PRODUCT_OS_NAME" /> は、UI 内でクリックされる終了ボタンをすべて再起動ボタンに置き換えます。ユーザーが電源ボタンを使ってデバイスを終了した場合は、このポリシーが有効なときでも自動的に再起動されることはありません。</translation> <translation id="9152473318295429890">現在のウェブページに関連するおすすめのウェブページの表示を有効にする</translation> <translation id="9158929520101169054">ブラウザ内でのマルチログインを許可する</translation> +<translation id="9159126470527871268">保留中のアップデートを適用するには <ph name="PRODUCT_NAME" /> または <ph name="PRODUCT_OS_NAME" /> の再起動が必要であることをユーザーに通知します。 + + このポリシー設定は、ブラウザまたは端末の再起動が推奨されるか必要であることをユーザーに示す通知を有効にするものです。このポリシーを設定しない場合、再起動が必要であることをユーザーに知らせるために <ph name="PRODUCT_NAME" /> ではメニュー表示がわずかに変更され、<ph name="PRODUCT_OS_NAME" /> ではシステムトレイに通知が表示されます。このポリシーを「推奨」に設定した場合は、再起動を推奨する警告がユーザーに繰り返し表示され、ユーザーはこの警告を閉じて再起動を遅らせることができます。このポリシーを「必須」に設定した場合は、通知期間を過ぎるとブラウザが自動的に再起動されることを示す警告がユーザーに繰り返し表示されます。このデフォルトの期間は、<ph name="PRODUCT_NAME" /> の場合は 7 日間、<ph name="PRODUCT_OS_NAME" /> の場合は 4 日間です。この期間は <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ポリシーの設定で変更できます。 + + ユーザー セッションは再起動後に復元されます。</translation> <translation id="9165792353046089850">接続されている USB デバイスへのアクセスをウェブサイトに許可するかどうかを設定します。アクセスを完全にブロックするか、接続されている USB デバイスへのアクセスがウェブサイトからリクエストされたときに毎回ユーザーに確認するように設定することができます。 「WebUsbAskForUrls」または「WebUsbBlockedForUrls」ポリシーで指定した URL パターンに該当するサイトには、これらのうちいずれか該当する方のポリシーが適用され、このポリシーは適用されません。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index 975d3f2..d47aa1cf 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -371,6 +371,7 @@ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ ಈ ಕಾರ್ಯವನ್ನು ಬಳಸಬೇಕೆ ಅಥವಾ ಬೇಡವೆ ಎಂದು ಬಳಕೆದಾರರು ನಿರ್ಧರಿಸಬಹುದಾಗಿದೆ.</translation> <translation id="2006530844219044261">ವಿದ್ಯುತ್ ವ್ಯವಸ್ಥಾಪನೆ</translation> <translation id="201557587962247231">ಸಾಧನ ಸ್ಥಿತಿ ವರದಿ ಅಪ್ಲೋಡ್ಗಳ ಆವರ್ತನೆ</translation> +<translation id="2017301949684549118">ವೆಬ್ ಆ್ಯಪ್ಗಳಿಗಾಗಿ URL ಗಳನ್ನು ನಿಶ್ಯಬ್ದವಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಬೇಕು.</translation> <translation id="2018836497795982119">ಬಳಕೆದಾರ ನೀತಿಯ ಮಾಹಿತಿಗಾಗಿ ಸಾಧನ ನಿರ್ವಹಣೆ ಸೇವೆಯನ್ನು ಪ್ರಶ್ನಿಸಲಾದ ಅವಧಿಯನ್ನು ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸುವುದರಿಂದಾಗಿ 3 ಗಂಟೆಗಳ ಡಿಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ. ಈ ನೀತಿಗಾಗಿ ಮಾನ್ಯವಾದ ಮೌಲ್ಯಗಳು 1800000 (30 ನಿಮಿಷಗಳು) ರಿಂದ 86400000 (1 ದಿನ) ವ್ಯಾಪ್ತಿಯಲ್ಲಿವೆ. ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲದ ಯಾವುದೇ ಮೌಲ್ಯಗಳನ್ನು ಅನುಕ್ರಮವಾದ ಎಲ್ಲೆಗೆ ಮಿತಿಗೊಳಿಸಲಾಗುತ್ತದೆ. ಒಂದು ವೇಳೆ ನೀತಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಬೆಂಬಲಿಸಿದರೆ, ರಿಫ್ರೆಶ್ ಮಾಡುವಿಕೆಯ ವಿಳಂಬವನ್ನು 24 ಗಂಟೆಗಳಿಗೆ ಹೊಂದಿಸಲಾಗುತ್ತದೆ ಏಕೆಂದರೆ ನೀತಿಯು ಬದಲಾದಾಗಲೆಲ್ಲಾ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಿಫ್ರೆಶ್ ಆಗುವಂತೆ ನೀತಿ ಅಧಿಸೂಚನೆಗಳು ಬಲವಂತಪಡಿಸುತ್ತವೆ ಎಂಬುದಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗಿದೆ. @@ -687,6 +688,11 @@ Google ಹುಡುಕಾಟ URL ಅನ್ನು ಹೀಗೆ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು: <ph name="GOOGLE_SEARCH_URL" />. 'DefaultSearchProviderEnabled' ನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿರುವಾಗ ಈ ಆಯ್ಕೆಯನ್ನು ಹೊಂದಿಸಬಹುದು ಮತ್ತು ಈ ಸಂದರ್ಭದಲ್ಲಿ ಮಾತ್ರ ಗೌರವಿಸಲಾಗುತ್ತದೆ.</translation> +<translation id="2659019163577049044">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರು ತಮ್ಮ ಫೋನ್ಗಳು ಹಾಗೂ Chromebook ಗಳ ನಡುವೆ ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವಂತೆ ತಮ್ಮ ಸಾಧನಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಅನುಮತಿ ನೀಡಲಾಗುತ್ತದೆ. ಗಮನಿಸಿ, ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಅನುಮತಿಸಿದರೆ, ಸೆಟಪ್ ಹರಿವನ್ನು ಪೂರ್ಣಗೊಳಿಸುವ ಮೂಲಕ ಬಳಕೆದಾರರು ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಆಯ್ಕೆ ಮಾಡಿಕೊಳ್ಳಬೇಕು. ಸೆಟಪ್ ಹರಿವು ಪೂರ್ಣಗೊಂಡ ಬಳಿಕ, ಬಳಕೆದಾರರು ತಮ್ಮ Chromebook ಗಳಲ್ಲಿ ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು. + + ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಎಸ್ಎಂಎಸ್ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಹೊಂದಿಸಲು, ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿ ನೀಡಲಾಗುವುದಿಲ್ಲ. + + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, ನಿರ್ವಹಿತ ಬಳಕೆದಾರರಿಗೆ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ, ಆದರೆ ನಿರ್ವಹಿಸದ ಬಳಕೆದಾರರಿಗೆ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="2660846099862559570">ಪ್ರಾಕ್ಸಿಯನ್ನು ಎಂದಿಗೂ ಬಳಸಬೇಡಿ</translation> <translation id="267596348720209223">ಹುಡುಕಾಟ ನೀಡುಗರಿಂದ ಬೆಂಬಲಿಸಲಾದ ಅಕ್ಷರ ಎನ್ಕೋಡಿಂಗ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಎನ್ಕೋಡಿಂಗ್ಗಳು ಎಂಬುದು UTF-8, GB2312, ಮತ್ತು ISO-8859-1ನಂತಹ ಕೋಡ್ ಪುಟ ಹೆಸರುಗಳಾಗಿರುತ್ತವೆ. ಅವುಗಳನ್ನು ಒದಗಿಸಲಾದ ಕ್ರಮದಲ್ಲಿ ಪ್ರಯತ್ನಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯು ಐಚ್ಛಿಕವಾಗಿರುತ್ತದೆ. ಹೊಂದಿಸದೆ ಇದ್ದಲ್ಲಿ, ಡಿಫಾಲ್ಟ್ ಆಗಿರುವ UTF-8 ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. 'DefaultSearchProviderEnabled' ನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯನ್ನು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="268577405881275241">ಡೇಟಾ ಕಂಪ್ರೆಷನ್ ಪ್ರಾಕ್ಸಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -755,7 +761,6 @@ ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಮುದ್ರಣದ ಪೂರ್ವ ವೀಕ್ಷಣೆ ಡೀಫಾಲ್ಟ್ ಇತ್ತೀಚೆಗೆ ಬಳಸಲಾದ ಪ್ರಿಂಟರ್ಅನ್ನು ಗಮ್ಯಸ್ಥಾನದ ಆಯ್ಕೆಯಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಲ್ಲಿ, ಮುದ್ರಣದ ಪೂರ್ವ ವೀಕ್ಷಣೆ ಡೀಫಾಲ್ಟ್ OS ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಪ್ರಿಂಟರ್ಅನ್ನು ಗಮ್ಯಸ್ಥಾನದ ಆಯ್ಕೆಯಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.</translation> -<translation id="2867699958489427143">OS ಆವೃತ್ತಿಯು ಟಾರ್ಗೆಟ್ಗಿಂತ ಹೊಸದಾಗಿದ್ದರೆ, ಟಾರ್ಗೆಟ್ ಆವೃತ್ತಿಗೆ ಹಿಂತಿರುಗಿ ಮತ್ತು ಅಲ್ಲೇ ಉಳಿಯಿರಿ. ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿರುವಾಗ, ಸಂಪೂರ್ಣವಾಗಿ ಪವರ್ವಾಷ್ ಮಾಡಿ.</translation> <translation id="2872961005593481000">ಮುಚ್ಚಿಬಿಡಿ </translation> <translation id="2874209944580848064">Android ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬೆಂಬಲಿಸುವ <ph name="PRODUCT_OS_NAME" /> ಸಾಧನಗಳಿಗಾಗಿ ಟಿಪ್ಪಣಿ:</translation> <translation id="2877225735001246144">Kerberos ಪ್ರಮಾಣೀಕರಣವನ್ನು ಸಮಾಲೋಚಿಸುವಾಗ CNAME ಲುಕಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು</translation> @@ -1010,7 +1015,6 @@ <translation id="3715569262675717862">ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಆಧರಿಸಿ ದೃಢೀಕರಣ</translation> <translation id="3734995764843493369">ಪ್ರತಿ ವಾರ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸುವ ಅಗತ್ಯವಿದೆ (24 ಗಂಟೆಗಳು)</translation> <translation id="3736879847913515635">ಬಳಕೆದಾರ ನಿರ್ವಾಹಕದಲ್ಲಿ ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="3737544779868348650">ಸಾಧನದ ನೆಟ್ವರ್ಕ್ ಹೋಸ್ಟ್ ಹೆಸರು</translation> <translation id="3746590506846867985"> ಈ ಕಾರ್ಯನೀತಿಯು ಸೈನ್ ಇನ್ ಪರದೆಗೆ ಅನ್ವಯವಾಗುತ್ತದೆ. ಬಳಕೆದಾರರ ಸೆಶನ್ಗೆ ಅನ್ವಯವಾಗುವ <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ವೀಕ್ಷಿಸಿ. ಎರಡೂ ಕಾರ್ಯನೀತಿಗಳನ್ನೂ ಒಂದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬೇಕೆಂದು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ-ಸೆಶನ್ಗೆ ಪ್ರವೇಶಿಸುವಾಗ, ಬಳಕೆದಾರ- ಕಾರ್ಯನೀತಿಯು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವಾಗ ವಿಳಂಬ ಉಂಟಾಗಬಹುದು. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಅಲ್ಪವಿರಾಮದಿಂದ ಪ್ರತ್ಯೇಕಿಸಿರುವ ಪಟ್ಟಿಯಲ್ಲಿನ ಹೆಸರಿಸಿರುವ ಪ್ರತಿಯೊಂದು ಮೂಲವೂ ಸಹ ತನ್ನದೇ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ. ಉಪ-ಡೊಮೇನ್ಗಳ ಮೂಲಕ ಹೆಸರಿಸಿರುವ ಮೂಲಗಳನ್ನು ಸಹ ಇದು ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ; ಉದಾ. https://example.com/ ಎಂದು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದರೆ, https://example.com/ ಸೈಟ್ನ ಭಾಗವಾಗಿ https://foo.example.com/ ಅನ್ನು ಸಹ ಪ್ರತ್ಯೇಕಿಸಲಾಗುತ್ತದೆ. @@ -1118,6 +1122,7 @@ ಪ್ರತಿ ಪಟ್ಟಿಯ ನಮೂದನೆಯು ನಿಘಂಟು ಒಳಗೊಂಡಿದ್ದು 'ವಿಸ್ತರಣೆಯ-id' ಕ್ಷೇತ್ರ ಮತ್ತು 'ಅಪ್ಡೇಟ್ ಆದ-url' ಕ್ಷೇತ್ರದಲ್ಲಿ ಇದರ ಅಪ್ಡೇಟ್ URL ನಲ್ಲಿ ವಿಸ್ತರಣಾ ID ಅನ್ನು ಒಳಗೊಂಡಿರಬೇಕು.</translation> <translation id="3874773863217952418">ಹುಡುಕಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="3877517141460819966">ಸಂಯೋಜಿತ ಎರಡನೆಯ ಅಂಶ ದೃಢೀಕರಣ ಮೋಡ್</translation> +<translation id="3879208481373875102">ಒತ್ತಾಯಪೂರ್ವಕವಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ವೆಬ್ ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation> <translation id="388237772682176890">ಈ ನೀತಿಯನ್ನು M53 ನಲ್ಲಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ ಮತ್ತು M54 ನಲ್ಲಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ, ಏಕೆಂದರೆ SPDY/3.1 ಬೆಂಬಲವನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ. <ph name="PRODUCT_NAME" /> ನಲ್ಲಿ SPDY ಪ್ರೋಟೊಕಾಲ್ನ ಬಳಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. @@ -1387,6 +1392,10 @@ ಈ ನೀತಿಯ ಸಾಧ್ಯವಿರುವ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಈ ನೀತಿಯ ರಚನೆ ಕುರಿತ ಪೂರ್ಣ ವಿವರಕ್ಕಾಗಿ https://www.chromium.org/administrators/policy-list-3/extension-settings-full ಗೆ ಭೇಟಿ ನೀಡಿ </translation> <translation id="4554651132977135445">ಬಳಕೆದಾರ ನೀತಿ ಲೂಪ್ಬ್ಯಾಕ್ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ ಮೋಡ್</translation> +<translation id="4554841826517980623">ನೆಟ್ವರ್ಕ್ನಲ್ಲಿನ ಹಂಚಿಕೆಗಳನ್ನು ಅನ್ವೇಷಿಸಲು <ph name="PRODUCT_NAME" /> ಗಾಗಿ ನೆಟ್ವರ್ಕ್ ಫೈಲ್ ಹಂಚಿಕೆಗಳ ವೈಶಿಷ್ಟ್ಯವು <ph name="NETBIOS_PROTOCOL" /> ಅನ್ನು ಬಳಸಬೇಕೇ ಎಂಬುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ. + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದಾಗ, ನೆಟ್ವರ್ಕ್ನಲ್ಲಿನ ಹಂಚಿಕೆಗಳನ್ನು ಅನ್ವೇಷಿಸಲು, ಹಂಚಿಕೆ ಅನ್ವೇಷಣೆಯು <ph name="NETBIOS_PROTOCOL" /> ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದಾಗ, ಹಂಚಿಕೆಗಳನ್ನು ಅನ್ವೇಷಿಸಲು, ಹಂಚಿಕೆ ಅನ್ವೇಷಣೆಯು <ph name="NETBIOS_PROTOCOL" /> ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಬಳಸುವುದಿಲ್ಲ. + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, ಎಂಟರ್ಪ್ರೈಸ್ ನಿರ್ವಹಿತ ಬಳಕೆದಾರರಿಗೆ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ನಿರ್ವಹಿಸದ ಬಳಕೆದಾರರಿಗೆ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="4555850956567117258">ಬಳಕೆದಾರರಿಗಾಗಿ ರಿಮೋಟ್ ದೃಢೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="4557134566541205630">ಡಿಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಪೂರೈಕೆದಾರರ ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದ URL</translation> <translation id="4567137030726189378">ಡೆವಲಪರ್ ಪರಿಕರಗಳ ಬಳಕೆಯನ್ನು ಅನುಮತಿಸಿ</translation> @@ -1847,6 +1856,7 @@ ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ, ಲಾಗಿನ್ ಪರದೆಯು ಮೊದಲು ಪ್ರದರ್ಶನಗೊಂಡಾಗ ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ ನಿಷ್ಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ. ಬಳಕೆದಾರರು ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು ಮತ್ತು ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿರುವ ಅದರ ಸ್ಥಿತಿಯು ಬಳಕೆದಾರರ ನಡುವೆ ನಿರಂತರವಾಗಿರುತ್ತದೆ.</translation> <translation id="5868414965372171132">ಬಳಕೆದಾರ ಮಟ್ಟದ ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> ಮೂಲಕ ನೆಟ್ವರ್ಕ್ ಫೈಲ್ ಹಂಚಿಕೆ ಅನ್ವೇಷಣೆಯನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ</translation> <translation id="5883015257301027298">ಡಿಫಾಲ್ಟ್ ಕುಕೀಸ್ ಸೆಟ್ಟಿಂಗ್</translation> <translation id="5887414688706570295">ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್ಗಳ ಮೂಲಕ ಬಳಸಲಾಗುವ TalkGadget ಪೂರ್ವಪ್ರತ್ಯಯವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಬದಲಿಸದಂತೆ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ. @@ -2288,6 +2298,17 @@ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಬಳಕೆದಾರರಿಗೆ <ph name="PRODUCT_NAME" /> ಮುದ್ರಣ ಸಂವಾದದಿಂದ <ph name="CLOUD_PRINT_NAME" /> ಗೆ ಮುದ್ರಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="7053678646221257043">ಪ್ರಸ್ತುತ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಆಮದಿಸುವಂತೆ ಈ ನೀತಿಯು ಒತ್ತಾಯಿಸುತ್ತದೆ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಈ ನೀತಿಯು ಆಮದು ಸಂವಾದವನ್ನು ಸಹ ಪರಿಣಾಮಬೀರುತ್ತದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, ಯಾವುದೇ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಇದನ್ನು ಹೊಂದಿಸದೆ ಇದ್ದಲ್ಲಿ, ಆಮದು ಮಾಡಬೇಕೆ ಎಂದು ಬಳಕೆದಾರರನ್ನು ಕೇಳಲಾಗುತ್ತದೆ, ಅಥವಾ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಮದು ಮಾಡಬಹುದು.</translation> <translation id="7063895219334505671">ಈ ಸೈಟ್ಗಳಲ್ಲಿ ಪಾಪ್ಅಪ್ಗಳನ್ನು ಅನುಮತಿಸಿ</translation> +<translation id="706568410943497889"> + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, Google ಸೇವೆಗಳಿಂದ (ಉದಾ. Google Meet) WebRTC ಈವೆಂಟ್ ಲಾಗ್ಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಮತ್ತು ಆ ಲಾಗ್ಗಳನ್ನು Google ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಲು <ph name="PRODUCT_NAME" /> ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ. + + ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದೇ ಇದ್ದಲ್ಲಿ, <ph name="PRODUCT_NAME" /> ಇಂತಹ ಲಾಗ್ಗಳನ್ನು ಸಂಗ್ರಹಿಸದಿರಬಹುದು ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡದಿರಬಹುದು. + + RTP ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಕಳುಹಿಸಿದ ಮತ್ತು ಸ್ವೀಕರಿಸಿದ ಸಮಯ ಹಾಗೂ ಅವುಗಳ ಗಾತ್ರ, ನೆಟ್ವರ್ಕ್ ದಟ್ಟಣೆಯ ಕುರಿತಾದ ಪ್ರತಿಕ್ರಿಯೆ ಮತ್ತು ಆಡಿಯೋ ಹಾಗೂ ವೀಡಿಯೊ ಫ್ರೇಮ್ಗಳ ಸಮಯ ಮತ್ತು ಗುಣಮಟ್ಟದ ಕುರಿತಾದ ಮೆಟಾಡೇಟಾದಂತಹ, Chrome ನಲ್ಲಿನ ಆಡಿಯೋ ಅಥವಾ ವೀಡಿಯೊ ಕರೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಸಮಸ್ಯೆಗಳನ್ನು ಡೀಬಗ್ ಮಾಡುವಾಗ ಸಹಾಯವಾಗುವ ವಿಶ್ಲೇಷಣಾತ್ಮಕ ಮಾಹಿತಿಯನ್ನು ಈ ಲಾಗ್ಗಳು ಒಳಗೊಂಡಿರುತ್ತವೆ. ಈ ಲಾಗ್ಗಳು ಕರೆಯ ಆಡಿಯೋ ಅಥವಾ ವೀಡಿಯೊ ವಿಷಯಗಳನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ. + + Chrome ನ ಈ ಡೇಟಾ ಸಂಗ್ರಹಣೆಯನ್ನು, Google Hangouts ಅಥವಾ Google Meet ನಂತಹ Google ನ ವೆಬ್ ಸೇವೆಗಳಿಂದ ಮಾತ್ರ ಟ್ರಿಗರ್ ಮಾಡಬಹುದು. + + Google ಈ ಲಾಗ್ಗಳನ್ನು, Google ಸೇವೆಯಿಂದಲೇ ಸಂಗ್ರಹಿಸಿದ ಇತರ ಲಾಗ್ಗಳೊಂದಿಗೆ ಸೆಷನ್ ಐಡಿ ಮೂಲಕ ಸಂಯೋಜಿಸಬಹುದು; ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಸುಲಭಗೊಳಿಸುವುದು ಇದರ ಉದ್ದೇಶವಾಗಿದೆ. + </translation> <translation id="706669471845501145">ಡೆಸ್ಕ್ಟಾಪ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿ ನೀಡು</translation> <translation id="7070525176564511548">ಪ್ರತಿ ವಾರ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸುವ ಅಗತ್ಯವಿದೆ (168 ಗಂಟೆಗಳು)</translation> <translation id="7072208053150563108">ಯಂತ್ರದ ಪಾಸ್ವರ್ಡ್ ಬದಲಾವಣೆಯ ದರ</translation> @@ -2428,6 +2449,9 @@ <translation id="7336878834592315572">ಸೆಶನ್ನ ಸಮಯದಲ್ಲಿ ಕುಕೀಗಳನ್ನು ಇರಿಸಿ</translation> <translation id="7340034977315324840">ಸಾಧನ ಚಟುವಟಿಕೆಯ ಸಮಯವನ್ನು ವರದಿಮಾಡಿ</translation> <translation id="7343497214039883642">ಸಾಧನಗಳಿಗಾಗಿ ಎಂಟರ್ಪ್ರೈಸ್ ಪ್ರಿಂಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್</translation> +<translation id="7349338075015720646">ಬಳಕೆದಾರರ ಸಂವಹನ ಇಲ್ಲದೆಯೇ ನಿಶ್ಯಬ್ದವಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿರುವ ವೈಬ್ಸೈಟ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ ಮತ್ತು ಇದನ್ನು ಬಳಕೆದಾರರು ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. + + ಕಾರ್ಯನೀತಿಯ ಪ್ರತಿಯೊಂದು ಪಟ್ಟಿಯ ಐಟಂ ಎರಡು ಸದಸ್ಯರನ್ನು ಹೊಂದಿರುವ ವಸ್ತುವಾಗಿದೆ: "url" ಮತ್ತು "launch_container". "url" ಎನ್ನುವುದು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಬೇಕಾದ ವೆಬ್ ಆ್ಯಪ್ನ URL ಆಗಿರಬೇಕು ಮತ್ತು "launch_container" ಎನ್ನುವುದು, ಒಮ್ಮೆ ವೆಬ್ ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ನಂತರ ಅದನ್ನು ತೆರೆಯುವುದು ಹೇಗೆ ಎಂಬುದನ್ನು ಸೂಚಿಸಬೇಕಾದ "ವಿಂಡೋ" ಇಲ್ಲವೇ "ಟ್ಯಾಬ್" ಆಗಿರಬೇಕು. "launch_container" ಅನ್ನು ಬಿಟ್ಟುಬಿಟ್ಟರೆ, ಆ್ಯಪ್ ಅನ್ನು ಅನುಭವ ವರ್ಧಿಸುವ ವೆಬ್ ಆ್ಯಪ್ ಎಂದು Chrome ಪರಿಗಣಿಸಿದರೆ ಅದು ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯುತ್ತದೆ ಇಲ್ಲವಾದಲ್ಲಿ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ.</translation> <translation id="7367028210010532881">ಸಂಭವನೀಯ ದುರುದ್ದೇಶಪೂರಿತ ಎಂದು ಫ್ಲ್ಯಾಗ್ ಮಾಡಿರುವ ಸೈಟ್ಗಳಿಗೆ ಬಳಕೆದಾರರು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿದಾಗ, ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಸೇವೆಯು ಒಂದು ಎಚ್ಚರಿಕೆ ಪುಟವನ್ನು ತೋರಿಸುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಎಚ್ಚರಿಕೆ ಪುಟದಿಂದ ದುರುದ್ದೇಶಪೂರಿತ ಸೈಟ್ಗೆ ಬಳಕೆದಾರರು ಯಾವುದೇ ಪರಿಸ್ಥಿತಿಯಲ್ಲೂ ಮುಂದುವರಿಯಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡಿರದಿದ್ದರೆ, ಎಚ್ಚರಿಕೆ ಸಂದೇಶ ಕಂಡುಬಂದ ಬಳಿಕ, ಫ್ಲ್ಯಾಗ್ ಮಾಡಿರುವ ಸೈಟ್ಗೆ ಬಳಕೆದಾರರು ಮುಂದುವರಿಯಬಹುದು. @@ -2925,6 +2949,7 @@ ಇಲ್ಲಿ "ಆವೃತ್ತಿ" ಎಂಬುದು '61.0.3163.120' ನಂತೆ ನಿಖರವಾದ ಆವೃತ್ತಿಯಾಗಿರಬಹುದು ಅಥವಾ '61.0' ನಂತೆ ಆವೃತ್ತಿಯ ಪೂರ್ವ-ಪ್ರತ್ಯಯವಾಗಿರಬಹುದು. </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> ಗಾಗಿ ಡಿಫಾಲ್ಟ್ HTML ರೆಂಡರರ್</translation> +<translation id="8544465954173828789">ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳನ್ನು ಫೋನ್ನಿಂದ Chromebook ಗೆ ಸಿಂಕ್ ಮಾಡಲು ಅನುಮತಿಸಿ.</translation> <translation id="8549772397068118889">ವಿಷಯ ಪ್ಯಾಕ್ಗಳ ಹೊರಗಿನ ಸೈಟ್ಗಳಿಗೆ ಭೇಟಿ ನೀಡುವಾಗ ಎಚ್ಚರಿಸಿ</translation> <translation id="8566842294717252664">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಲಾಂಚರ್ನಿಂದ ವೆಬ್ ಅಂಗಡಿಯನ್ನು ಮರೆಮಾಡಿ</translation> <translation id="8586528890725660268">ಬಳಕೆದಾರರು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲದ ಪ್ರಿಂಟರ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. @@ -2973,6 +2998,11 @@ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, ಪಾಸ್ವರ್ಡ್ ರಕ್ಷಣೆ ಸೇವೆಯು Google ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಮಾತ್ರ ರಕ್ಷಿಸುತ್ತದೆ ಆದರೆ ಬಳಕೆದಾರರಿಗೆ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="8672321184841719703">ಲಕ್ಷ್ಯ ಸ್ವಯಂ ಅಪ್ಡೇಟ್ ಆದ ಆವೃತ್ತಿ</translation> <translation id="867410340948518937">U2F (ಸಾರ್ವತ್ರಿಕ ಎರಡನೆಯ ಅಂಶ)</translation> +<translation id="8682611302223077049">ಕಾಲಾವಧಿಯನ್ನು ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ ಹೊಂದಿಸಲು ಇದು ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಬಾಕಿಯಿರುವ ಅಪ್ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು <ph name="PRODUCT_NAME" /> ಅನ್ನು ಪುನಃ ಪ್ರಾರಂಭಿಸಬೇಕು ಅಥವಾ <ph name="PRODUCT_OS_NAME" /> ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕು ಎಂದು ಈ ಅವಧಿಯಲ್ಲಿ ಬಳಕೆದಾರರಿಗೆ ಸೂಚನೆ ನೀಡಲಾಗುತ್ತದೆ. + + ಈ ಅವಧಿಯಲ್ಲಿ, ಅಪ್ಡೇಟ್ನ ಆವಶ್ಯಕತೆಯ ಕುರಿತು ಬಳಕೆದಾರರಿಗೆ ಮತ್ತೆ ಮತ್ತೆ ತಿಳಿಸಲಾಗುತ್ತದೆ. ಅಪ್ಗ್ರೇಡ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದಾಗ, <ph name="PRODUCT_OS_NAME" /> ಸಾಧನಗಳ ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಪುನರಾರಂಭಿಸುವಿಕೆಯ ಅಧಿಸೂಚನೆಯು ಕಾಣಿಸುತ್ತದೆ. <ph name="PRODUCT_NAME" /> ಬ್ರೌಸರ್ಗಳಲ್ಲಿ, ಅಧಿಸೂಚನೆ ಅವಧಿಯ ಮೂರನೇ ಒಂದರಷ್ಟು ಭಾಗವನ್ನು ದಾಟಿದಾಗ, ಪುನಃ ಪ್ರಾರಂಭಿಸಬೇಕಾದ ಅವಶ್ಯಕತೆಯನ್ನು ಸೂಚಿಸಲು ಆ್ಯಪ್ ಮೆನು ಬದಲಾಗುತ್ತದೆ. ಅಧಿಸೂಚನೆ ಅವಧಿಯ ಮೂರನೇ ಎರಡರಷ್ಟು ಭಾಗವನ್ನು ದಾಟಿದಾಗ ಈ ಅಧಿಸೂಚನೆಯು ಬಣ್ಣ ಬದಲಾಯಿಸುತ್ತದೆ ಮತ್ತು ಅಧಿಸೂಚನೆಯ ಸಂಪೂರ್ಣ ಅವಧಿಯು ದಾಟಿದಾಗ ಮತ್ತೊಮ್ಮೆ ಬಣ್ಣ ಬದಲಾಯಿಸುತ್ತದೆ. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯು ಸಕ್ರಿಯಗೊಳಿಸಿದ ಹೆಚ್ಚುವರಿ ಅಧಿಸೂಚನೆಗಳು ಇದೇ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಅನುಸರಿಸುತ್ತವೆ. + + ಇದನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, <ph name="PRODUCT_OS_NAME" /> ಸಾಧನಗಳಿಗಾಗಿ 345600000 ಮಿಲಿಸೆಕೆಂಡುಗಳ (ನಾಲ್ಕು ದಿನಗಳ) ಡಿಫಾಲ್ಟ್ ಅವಧಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು <ph name="PRODUCT_NAME" /> ಗಾಗಿ 604800000 ಮಿಲಿಸೆಕೆಂಡುಗಳನ್ನು (ಒಂದು ವಾರ) ಬಳಸಲಾಗುತ್ತದೆ.</translation> <translation id="8685024486845674965">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಿದರೆ ಪಾಸ್ವರ್ಡ್ ಸಂರಕ್ಷಣೆ ಎಚ್ಚರಿಕೆಯು ಟ್ರಿಗರ್ ಆಗುತ್ತದೆ</translation> <translation id="8693243869659262736">ಅಂತರ್-ನಿರ್ಮಿತ DNS ಕ್ಲೈಂಟ್ ಬಳಸಿ</translation> <translation id="8704831857353097849">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿ</translation> @@ -3010,6 +3040,7 @@ ಅಳತೆ ಅಂಶವು 100% ಅಥವಾ ಹೆಚ್ಚಿರಬೇಕು. ಪ್ರಸ್ತುತಿ ಮೋಡ್ನಲ್ಲಿ ಸಾಮಾನ್ಯ ಪರದೆ ಮಸುಕು ವಿಳಂಬಕ್ಕಿಂತ ಕಡಿಮೆ ಮಾಡುವಂತಹ ಪರದೆ ಮಸುಕು ವಿಳಂಬದ ಮೌಲ್ಯಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="8798099450830957504">ಡಿಫಾಲ್ಟ್</translation> +<translation id="8801680448782904838">ಬ್ರೌಸರ್ ಪುನಃ ಪ್ರಾರಂಭಿಸುವುದನ್ನು ಅಥವಾ ಸಾಧನ ಮರುಪ್ರಾರಂಭಿಸುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅದು ಅಗತ್ಯವಿದೆ ಎಂಬುದನ್ನು ಬಳಕೆದಾರರಿಗೆ ತಿಳಿಸಿ</translation> <translation id="8818173863808665831">ಸಾಧನದ ಭೌಗೋಳಿಕ ಸ್ಥಳವನ್ನು ವರದಿ ಮಾಡಿ. ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ, ಅಥವಾ ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದ್ದರೆ ಸ್ಥಳವನ್ನು ವರದಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation> @@ -3213,6 +3244,12 @@ ಈ ನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದಲ್ಲಿ, ಬಳಕೆದಾರರು ಸಾಧನವನ್ನು ಶಟ್ಡೌನ್ ಮಾಡಿದಾಗ <ph name="PRODUCT_OS_NAME" /> ರೀಬೂಟ್ ಅನ್ನು ಟ್ರಿಗ್ಗರ್ ಮಾಡುತ್ತದೆ. ರೀಬೂಟ್ ಬಟನ್ಗಳ ಮೂಲಕ UI ನಲ್ಲಿ <ph name="PRODUCT_OS_NAME" /> ಶಟ್ಡೌನ್ ಬಟನ್ಗಳ ಎಲ್ಲಾ ಸಂದರ್ಭಗಳನ್ನು ಸ್ಥಾನಾಂತರಿಸುತ್ತದೆ. ಬಳಕೆದಾರರು ಪವರ್ ಬಟನ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಸಾಧನವನ್ನು ಶಟ್ಡೌನ್ ಮಾಡಿದಲ್ಲಿ, ನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೂ ಸಹ ಅದು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರೀಬೂಟ್ ಆಗುವುದಿಲ್ಲ.</translation> <translation id="9152473318295429890">ಸಂಬಂಧಿತ ವೆಬ್ ಪುಟಗಳಿಗಾಗಿ, ಸಂದರ್ಭೋಚಿತ ಸಲಹೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="9158929520101169054">ಬ್ರೌಸರ್ನಲ್ಲಿ ಬಹು ಸೈನ್-ಇನ್ ಅನ್ನು ಅನುಮತಿಸಿ</translation> +<translation id="9159126470527871268">ಬಾಕಿ ಇರುವ ಅಪ್ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು <ph name="PRODUCT_NAME" /> ಅನ್ನು ಪುನಃ ಪ್ರಾರಂಭಿಸಬೇಕು ಅಥವಾ <ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕು ಎಂದು ಬಳಕೆದಾರರಿಗೆ ತಿಳಿಸಿ. + +ಬ್ರೌಸರ್ ಪುನಃ ಪ್ರಾರಂಭಿಸುವುದನ್ನು ಅಥವಾ ಸಾಧನ ಪುನರಾರಂಭಿಸುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಗತ್ಯವಿದೆ ಎಂಬುದನ್ನು ಬಳಕೆದಾರರಿಗೆ ತಿಳಿಸಲು ಈ ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್, ಅಧಿಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಇದನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಮೆನುವಿಗೆ ಸೂಕ್ಷ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡುವ ಮೂಲಕ ಪುನರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆಯೆಂದು <ph name="PRODUCT_NAME" /> ಬಳಕೆದಾರರಿಗೆ ಸೂಚನೆ ನೀಡುತ್ತದೆ, ಅದೇ ರೀತಿ <ph name="PRODUCT_OS_NAME" /> ಇಂತಹ ಅಧಿಸೂಚನೆಯನ್ನು ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಸೂಚಿಸುತ್ತದೆ. 'ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಪುನಃ ಪ್ರಾರಂಭಿಸುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ ಎಂದು ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸುವ, ಮರುಕಳಿಸುವ ಎಚ್ಚರಿಕೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. ಪುನರಾರಂಭಿಸುವುದನ್ನು ಮುಂದೂಡಲು, ಬಳಕೆದಾರರು ಈ ಎಚ್ಚರಿಕೆಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಬಹುದು. 'ಅಗತ್ಯವಿದೆ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಅಧಿಸೂಚನೆ ಅವಧಿ ಮುಗಿದ ಬಳಿಕ, ಬ್ರೌಸರ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ಪುನಃ ಪ್ರಾರಂಭಿಸಲಾಗುವುದು ಎಂದು ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸುವ, ಮರುಕಳಿಸುವ ಎಚ್ಚರಿಕೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. +ಡಿಫಾಲ್ಟ್ ಅವಧಿಯು <ph name="PRODUCT_NAME" /> ಗಾಗಿ ಏಳು ದಿನಗಳು ಮತ್ತು <ph name="PRODUCT_OS_NAME" /> ಗಾಗಿ ನಾಲ್ಕು ದಿನಗಳಾಗಿದೆ ಮತ್ತು <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಮೂಲಕ ಇದನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು. + +ಪುನಃ ಪ್ರಾರಂಭಿಸಿದ/ಮರುಪ್ರಾರಂಭಿಸಿದ ಬಳಿಕ ಬಳಕೆದಾರರ ಸೆಶನ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುವುದು.</translation> <translation id="9165792353046089850">ಸಂಪರ್ಕಿತ USB ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿ ಇದೆಯೇ ಎಂಬುದನ್ನು ಹೊಂದಿಸಲು ಇದು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಪ್ರವೇಶವನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ನಿರ್ಬಂಧಿಸಬಹುದು ಅಥವಾ ಯಾವುದಾದರೂ ವೆಬ್ಸೈಟ್, ಸಂಪರ್ಕಿತ USB ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ಬಯಸುವಾಗ, ಬಳಕೆದಾರರಲ್ಲಿ ಪ್ರತಿ ಬಾರಿ ಅನುಮತಿ ಕೇಳಬಹುದು. 'WebUsbAskForUrls' ಮತ್ತು 'WebUsbBlockedForUrls' ಕಾರ್ಯನೀತಿಗಳನ್ನು ಬಳಸಿಕೊಂಡು, ನಿರ್ದಿಷ್ಟ URL ವಿನ್ಯಾಸಗಳಿಗಾಗಿ ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಅತಿಕ್ರಮಿಸಬಹುದು.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 9807243..ff60c24 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -359,6 +359,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> 구성요소 업데이트 허용</translation> <translation id="2006530844219044261">전력 관리</translation> <translation id="201557587962247231">기기 상태 보고서 업로드 빈도</translation> +<translation id="2017301949684549118">웹 앱 URL이 자동으로 설치됨</translation> <translation id="2018836497795982119">사용자 정책 정보에 대해 기기 관리 서비스를 검색하는 시간(밀리초)을 지정합니다. 이 정책을 설정하면 기본값인 3시간이 무시됩니다. 이 정책에 대해 유효한 값은 1800000(30분)에서 86400000(1일) 사이입니다. 이 범위에 포함되지 않는 모든 값은 각 경계값으로 고정됩니다. 플랫폼에서 정책 알림을 지원하면 정책이 변경될 때마다 정책 알림이 자동으로 강제 새로고침되므로 새로고침 지연이 24시간으로 설정됩니다. @@ -671,6 +672,11 @@ Google의 검색 URL은 <ph name="GOOGLE_SEARCH_URL" />(으)로 지정될 수 있습니다. 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우 이 옵션을 설정해야 하며 이 경우에만 적용됩니다.</translation> +<translation id="2659019163577049044">이 설정을 사용하면 사용자가 휴대전화와 Chromebook 간에 SMS 메시지가 동기화되도록 기기를 설정할 수 있습니다. 이 정책이 허용되면 사용자가 설정 과정을 완료하여 이 기능을 명시적으로 선택해야 합니다. 설정 과정이 완료되면 사용자는 Chromebook에서 SMS 메시지를 보내고 받을 수 있습니다. + + 이 설정이 사용 중지되면 사용자가 SMS 동기화를 설정할 수 없게 됩니다. + + 이 정책을 설정하지 않고 그대로 두면 기본적으로 관리되는 사용자에게는 허용되지 않으며 관리되지 않는 사용자에게는 허용됩니다.</translation> <translation id="2660846099862559570">프록시 사용하지 않음</translation> <translation id="267596348720209223">검색 공급자가 지원하는 문자 인코딩을 지정합니다. 인코딩은 UTF-8, GB2312 및 ISO-8859-1과 같은 코드 페이지 이름입니다. 인코딩은 제공된 순서대로 시도됩니다. @@ -741,7 +747,6 @@ 이 설정을 사용 중지하거나 값을 저장하지 않으면 인쇄 미리보기에서 가장 최근에 사용한 프린터를 기본 선택으로 사용합니다. 이 설정을 사용하면 인쇄 미리보기에서 OS 시스템 기본 프린터를 기본 선택으로 사용합니다.</translation> -<translation id="2867699958489427143">OS 버전이 대상 버전보다 높은 경우 대상 버전으로 롤백하고 버전을 유지합니다. 이 과정 중에 전체 파워워시를 실행합니다.</translation> <translation id="2872961005593481000">종료</translation> <translation id="2874209944580848064">Android 앱을 지원하는 <ph name="PRODUCT_OS_NAME" /> 기기 관련 주의사항:</translation> <translation id="2877225735001246144">Kerberos 인증을 협상할 때 CNAME 조회 사용 중지</translation> @@ -986,7 +991,6 @@ <translation id="3711895659073496551">일시중지</translation> <translation id="3715569262675717862">클라이언트 인증서를 기반으로 하는 인증</translation> <translation id="3736879847913515635">사용자 관리자에서 사용자 추가 허용</translation> -<translation id="3737544779868348650">기기 네트워크 호스트 이름</translation> <translation id="3746590506846867985"> 이 정책은 로그인 화면에 적용됩니다. 사용자 세션에 적용되는 <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> 정책도 참조하시기 바랍니다. 두 정책을 동일한 값으로 설정하는 것이 좋습니다. 두 정책을 다른 값으로 설정하면 사용자 세션을 시작할 때 지연이 발생할 수 있으며 사용자 정책으로 지정된 값이 적용됩니다. 정책을 사용 설정하면 쉼표로 구분된 목록에 이름이 지정된 각 출처는 자체 프로세스로 작동합니다. 이 정책은 하위 도메인으로 이름이 지정된 출처도 격리합니다. 예를 들어, https://example.com/을 지정하면 https://foo.example.com/ 또한 https://example.com/ 사이트의 일부로 여겨져 격리됩니다. @@ -1095,6 +1099,7 @@ 각 목록 항목에는 '확장 프로그램 ID' 입력란에 확장 프로그램 ID를, 'url 업데이트' 입력란에 업데이트 URL을 포함해야 하는 사전이 포함됩니다.</translation> <translation id="3874773863217952418">탭하여 검색 사용</translation> <translation id="3877517141460819966">통합된 2단계 인증 모드</translation> +<translation id="3879208481373875102">강제로 설치된 웹 앱 목록 구성</translation> <translation id="388237772682176890">SPDY/3.1 지원이 삭제되어 이 정책은 M53에서 지원 중단되고 M54에서 삭제되었습니다. <ph name="PRODUCT_NAME" />에서 SPDY 프로토콜을 사용 중지합니다. @@ -1338,6 +1343,10 @@ 이 정책에서 가능한 설정과 구조에 관한 전체 설명을 보려면 다음 페이지를 방문하세요. https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">사용자 정책 루프백 처리 모드</translation> +<translation id="4554841826517980623">이 정책은 <ph name="PRODUCT_NAME" />의 네트워크 파일 공유 기능에서 <ph name="NETBIOS_PROTOCOL" />을(를) 사용하여 네트워크의 공유 항목을 검색할지 여부를 제어합니다. + 이 정책이 True로 설정되면 공유 검색 기능에서 <ph name="NETBIOS_PROTOCOL" /> 프로토콜을 사용하여 네트워크의 공유 항목을 검색합니다. + 이 정책이 False로 설정되면 공유 검색 기능에서 공유 항목을 검색할 때 <ph name="NETBIOS_PROTOCOL" /> 프로토콜을 사용하지 않습니다. + 이 정책이 설정되지 않으면 기본적으로 기업에서 관리하는 사용자에게는 사용 중지되고 관리되지 않는 사용자에게는 사용 설정됩니다.</translation> <translation id="4555850956567117258">사용자에 대한 원격 인증을 사용합니다.</translation> <translation id="4557134566541205630">기본 검색 공급자 새 탭 페이지 URL</translation> <translation id="4567137030726189378">Developer Tools를 사용하도록 허용</translation> @@ -1759,6 +1768,7 @@ 이 정책이 설정되지 않은 경우 로그인 화면이 처음 나타날 때 음성 피드백이 사용 중지되어 있습니다. 사용자는 언제든지 음성 피드백을 사용 설정 또는 사용 중지할 수 있으며 로그인 화면에서의 상태가 사용자별로 유지됩니다.</translation> <translation id="5868414965372171132">사용자 수준 네트워크 설정</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" />을(를) 통한 네트워크 파일 공유 검색 제어</translation> <translation id="5883015257301027298">기본 쿠키 설정</translation> <translation id="5887414688706570295">원격 액세스 호스트가 사용할 TalkGadget 프리픽스를 구성하여 사용자가 변경하지 못하게 합니다. @@ -2219,6 +2229,17 @@ 설정하지 않으면 북마크를 가져올지 여부를 사용자에게 확인하거나 자동으로 가져올 수 있습니다.</translation> <translation id="7063895219334505671">이러한 사이트에서 팝업 허용</translation> +<translation id="706568410943497889"> + 이 정책이 true로 설정되어 있으면 <ph name="PRODUCT_NAME" />에서 Google 서비스(예: Google Meet)에서 WebRTC 이벤트 로그를 수집하고 이러한 로그를 Google로 업로드할 수 있도록 허용합니다. + + 이 정책이 false로 설정되어 있거나 설정되어 있지 않으면 <ph name="PRODUCT_NAME" />에서 이러한 로그를 수집하거나 업로드할 수 없습니다. + + 이러한 로그에는 주고받는 RTP 패킷의 시간 및 크기, 네트워크 혼잡에 관한 의견, 오디오/동영상 프레임의 시간 및 품질에 관한 메타데이터 등과 같이 Chrome에서 음성/화상 통화 시 발생하는 문제를 디버깅할 때 유용한 진단 정보가 포함됩니다. 이러한 로그에는 통화의 음성 또는 동영상 콘텐츠가 포함되어 있지 않습니다. + + Chrome에 의한 이러한 데이터 수집은 Google 행아웃, Google Meet와 같은 Google 웹 서비스에 의해서만 실행됩니다. + + Google에서는 이러한 로그를 세션 ID를 통해 Google 서비스 자체에서 수집한 다른 로그와 연결할 수 있습니다. 이는 디버깅을 더 쉽게 하기 위해서입니다. + </translation> <translation id="706669471845501145">사이트에서 데스크톱 알림을 표시하도록 허용</translation> <translation id="7072208053150563108">기기 비밀번호 변경 속도</translation> <translation id="7074513465313721551">세이프 브라우징에서 신뢰할 도메인 목록을 설정하세요. 설정 시: @@ -2352,6 +2373,9 @@ <translation id="7336878834592315572">세션이 지속되는 동안 쿠키를 유지합니다.</translation> <translation id="7340034977315324840">기기 활동 시간 보고</translation> <translation id="7343497214039883642">기기에 적용되는 엔터프라이즈 프린터 설정 파일</translation> +<translation id="7349338075015720646">사용자가 개입하지 않아도 자동 설치되며 사용자가 제거하거나 사용 중지할 수 없는 웹사이트의 목록을 지정합니다 + + 정책 목록의 각 항목은 'url' 및 'launch_container' 등 2개의 멤버가 포함된 객체입니다. 'url'은 설치할 웹 앱의 URL이어야 하며 'launch_container'는 웹 앱이 설치된 뒤 어떻게 열릴지 표시하는 'window' 또는 'tab'이어야 합니다. 'launch_container'가 생략된 경우, Chrome에서 앱이 프로그레시브 웹 앱이라고 간주하면 창으로 열리고 그렇지 않으면 탭으로 열립니다.</translation> <translation id="7367028210010532881">세이프 브라우징 서비스에서는 사용자가 악성 사이트로 신고된 사이트로 이동할 때 경고 페이지를 표시합니다. 이 설정을 사용하면 사용자가 경고 페이지를 무시하고 악성 사이트로 이동할 수 없게 됩니다. 이 설정을 사용 중지하거나 구성하지 않으면 사용자가 경고 페이지를 무시하고 신고된 사이트로 이동할 수 있습니다. @@ -2816,6 +2840,7 @@ 여기서 ‘버전’은 '61.0.3163.120'과 같은 정확한 버전이거나 '61.0'과 같은 버전 접두어일 수 있습니다. </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />의 기본 HTML 렌더러</translation> +<translation id="8544465954173828789">SMS 메시지가 휴대전화에서 Chromebook으로 동기화되도록 허용</translation> <translation id="8549772397068118889">콘텐츠 팩 외부 사이트를 방문할 때 표시되는 경고입니다.</translation> <translation id="8566842294717252664">새 탭 페이지 및 앱 런처에서 웹 스토어 숨기기</translation> <translation id="8586528890725660268">사용자가 사용할 수 없는 프린터를 지정합니다. @@ -2860,6 +2885,11 @@ 정책이 설정되어 있지 않으면 비밀번호 보호 서비스가 Google 비밀번호만 보호하지만 사용자가 이 설정을 변경할 수 있습니다.</translation> <translation id="8672321184841719703">자동 업데이트 버전 타겟팅</translation> <translation id="867410340948518937">U2F(범용 2차 요소)</translation> +<translation id="8682611302223077049">대기 중인 업데이트를 적용하려면 <ph name="PRODUCT_NAME" />을(를) 재실행해야 하거나 <ph name="PRODUCT_OS_NAME" /> 기기를 다시 시작해야 한다는 알림을 사용자에게 표시할 기간을 밀리초로 설정할 수 있습니다. + + 이 기간 동안 업데이트를 해야 한다는 알림이 사용자에게 반복적으로 표시됩니다. <ph name="PRODUCT_OS_NAME" /> 기기의 경우 업그레이드가 감지되면 재시작 알림이 작업 표시줄에 표시됩니다. <ph name="PRODUCT_NAME" /> 브라우저의 경우 알림 기간 중 3분의 1이 지나면 앱 메뉴가 변경되면서 재실행이 필요하다는 알림이 표시됩니다. 알림 기간 중 3분의 2가 지나면 알림 색상이 또 바뀌며 알림 기간이 모두 지나면 알림 색상이 다시 한번 더 바뀝니다. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 정책을 통해 사용 설정되는 추가 알림도 이와 동일한 일정을 따릅니다. + + 설정되지 않는 경우 <ph name="PRODUCT_OS_NAME" /> 기기의 경우 345,600,000밀리초(4일), <ph name="PRODUCT_NAME" />의 경우 604,800,000밀리초(1주일)가 기본값으로 사용됩니다.</translation> <translation id="8685024486845674965">비밀번호가 재사용되어 비밀번호 보호 경고가 실행됨</translation> <translation id="8693243869659262736">내장 DNS 클라이언트 사용</translation> <translation id="8704831857353097849">사용할 수 없는 플러그인 목록</translation> @@ -2904,6 +2934,7 @@ 배율은 100% 이상이어야 합니다. 프레젠테이션 모드의 화면 어둡게 하기 지연 시간 값을 일반 화면 어둡게 하기 지연 시간보다 짧게 설정할 수 없습니다.</translation> <translation id="8798099450830957504">기본값</translation> +<translation id="8801680448782904838">사용자에게 브라우저 재실행 또는 기기 재시작이 필요하거나 권장된다고 알림</translation> <translation id="8818173863808665831">기기의 지리적 위치를 신고합니다. 정책이 설정되지 않았거나 잘못 설정되어 있으면 위치가 신고되지 않습니다.</translation> @@ -3067,6 +3098,11 @@ 이 정책을 true로 설정하면 사용자가 기기를 종료할 때 <ph name="PRODUCT_OS_NAME" />에서 재부팅을 시작하며 <ph name="PRODUCT_OS_NAME" />에서 UI의 종료 버튼을 모두 재부팅 버튼으로 바꿉니다. 정책을 사용하도록 설정해도 사용자가 전원 버튼을 사용하여 기기를 종료하면 자동으로 재부팅하지 않습니다.</translation> <translation id="9152473318295429890">상황에 따라 관련 웹페이지 추천</translation> <translation id="9158929520101169054">브라우저 내 멀티 로그인 허용</translation> +<translation id="9159126470527871268">대기 중인 업데이트를 적용하려면 <ph name="PRODUCT_NAME" />을(를) 재실행하거나 <ph name="PRODUCT_OS_NAME" />을(를) 재시작해야 한다고 사용자에게 알립니다. + + 이 정책을 설정하면 사용자에게 브라우저 재실행 또는 기기 재시작이 필요하거나 권장된다는 알림이 전송됩니다. 정책을 설정하지 않으면 <ph name="PRODUCT_NAME" />의 메뉴가 미세하게 변경되어 재실행이 필요하다는 정보가 사용자에게 전달되며 <ph name="PRODUCT_OS_NAME" />의 경우 작업 표시줄에 알림이 표시됩니다. 정책을 '권장'으로 설정하면 재실행하는 것이 좋다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 사용자는 이 경고를 무시하고 나중에 재실행할 수 있습니다. '필수'로 설정하면 알림 기간이 지난 후 브라우저가 강제로 재실행된다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 이 기간은 <ph name="PRODUCT_NAME" />의 경우 기본적으로 7일, <ph name="PRODUCT_OS_NAME" />의 경우 4일로 설정되어 있으며 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 정책 설정을 통해 변경할 수 있습니다. + + 재실행 및 재시작 후에는 사용자의 세션이 복원됩니다.</translation> <translation id="9165792353046089850">연결된 USB 기기에 관한 웹사이트의 액세스 허용 여부를 설정할 수 있습니다. 액세스를 완전히 차단하거나 웹사이트에서 연결된 USB 기기에 액세스하려고 할 때마다 사용자에게 확인을 요청할 수 있습니다. 'WebUsbAskForUrls' 및 'WebUsbBlockedForUrls' 정책을 사용하는 특정 URL 패턴은 이 정책보다 우선 적용됩니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 997ac80..4f76058 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -359,6 +359,7 @@ <translation id="199764499252435679">Įgalinti „<ph name="PRODUCT_NAME" />“ komponentų naujinius</translation> <translation id="2006530844219044261">Maitinimo valdymas</translation> <translation id="201557587962247231">Įrenginio būsenos ataskaitų įkėlimo dažnis</translation> +<translation id="2017301949684549118">Žiniatinklio programų, kurias reikia automatiškai įdiegti, URL.</translation> <translation id="2018836497795982119">Milisekundėmis nurodomas laikotarpis, per kurį įrenginio tvarkymo paslaugai pateikiama užklausa dėl naudotojo politikos informacijos. Nustačius šią politiką nepaisoma numatytosios 3 valandų vertės. Tinkamos šios politikos vertės svyruoja nuo 1 800 000 (30 minučių) iki 86 400 000 (1 diena). Vertės už šio diapazono ribų bus nustatytos į šio diapazono vertę. Jei platformoje palaikomi politikos pranešimai, atnaujinimo delsa bus nustatyta į 24 val., nes tikimasi, kad politikos pranešimai suaktyvins atnaujinimą kaskart, kai politika bus pakeista. @@ -673,6 +674,11 @@ „Google“ paieškos URL galima nurodyti kaip: <ph name="GOOGLE_SEARCH_URL" />. Ši parinktis turi būti nustatyta, kai politika „Numatytasis paieškos teikėjas įgalintas“ įgalinta, ir į ją bus atsižvelgta tik šiuo atveju.</translation> +<translation id="2659019163577049044">Įgalinus šį nustatymą, naudotojai galės nustatyti įrenginius, kad SMS pranešimai būtų sinchronizuojami iš telefonų į „Chromebook“ įrenginius. Atminkite, kad leidus šią politiką naudotojai turės aiškiai pasirinkti šią funkciją atlikdami sąrankos veiksmus. Juos atlikę naudotojai galės siųsti ir gauti SMS pranešimus „Chromebook“ įrenginiuose. + + Išjungus nustatymą, naudotojai negalės nustatyti SMS pranešimų sinchronizavimo. + + Jei ši politika nenustatyta, valdomų naudotojų numatytasis nustatymas bus „neleidžiama“, o nevaldomų naudotojų – „leidžiama“.</translation> <translation id="2660846099862559570">Niekada nenaudoti tarpinio serverio</translation> <translation id="267596348720209223">Nurodomos paieškos teikėjo palaikomos simbolių koduotės. Koduotės – tai kodų puslapių pavadinimai, pvz., UTF-8, GB2312 ir ISO-8859-1. Jie išbandomi nurodyta tvarka. @@ -743,7 +749,6 @@ Išjungus šį nustatymą arba nenustačius vertės, funkcija „Spaudinio peržiūra“ naudos pastarąjį naudotą spausdintuvą kaip numatytąją paskirties vietos parinktį. Įjungus šį nustatymą funkcija „Spaudinio peržiūra“ naudos OS sistemos numatytąjį spausdintuvą kaip numatytąją paskirties vietos parinktį.</translation> -<translation id="2867699958489427143">Grąžinti ir palikti tikslinę versiją, jei OS versija naujesnė nei tikslinė. Atlikti išsamų „Powerwash“ vykdant procesą.</translation> <translation id="2872961005593481000">Stabdyti</translation> <translation id="2874209944580848064">„<ph name="PRODUCT_OS_NAME" />“ įrenginiams, kuriuose palaikomos „Android“ programos, skirta pastaba:</translation> <translation id="2877225735001246144">Neleisti CNAME paieškos vykdant „Kerberos“ tapatumo nustatymą</translation> @@ -986,7 +991,6 @@ <translation id="3711895659073496551">Laikinai sustabdyti</translation> <translation id="3715569262675717862">Autentifikavimas atsižvelgiant į klientų sertifikatus</translation> <translation id="3736879847913515635">Asmens pridėjimo naudotojų tvarkytuvėje įgalinimas</translation> -<translation id="3737544779868348650">Įrenginio tinklo prieglobos serverio pavadinimas</translation> <translation id="3746590506846867985"> Ši politika taikoma prisijungimo ekranui. Taip pat žr. politiką „<ph name="ISOLATE_ORIGINS_POLICY_NAME" />“, kuri taikoma naudotojo sesijai. Rekomenduojama abiems politikoms nustatyti tą pačią vertę. Jei vertės neatitiks, 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 https://foo.example.com/ kaip svetainės https://example.com/ dalis. @@ -1101,6 +1105,7 @@ Kiekviename sąrašo įraše yra žodynas, į kurį turi būti įtrauktas plėtinio ID lauke „extension-id“ (plėtinio ID) ir naujinio URL lauke „update-url“ (naujinio URL).</translation> <translation id="3874773863217952418">Įgalinti Paiešką palietus</translation> <translation id="3877517141460819966">Integruotas tapatybės nustatymo dviem veiksniais režimas</translation> +<translation id="3879208481373875102">Konfigūruoti žiniatinklio programų, kurias įdiegti buvo privaloma, sąrašą</translation> <translation id="388237772682176890">Ši politika nebenaudojama M53 ir pašalinta iš M54, nes nebeteikiamas SPDY/3.1 palaikymas. Neleidžiama naudoti SPDY protokolo „<ph name="PRODUCT_NAME" />“. @@ -1344,6 +1349,10 @@ Jei norite peržiūrėti visą galimų šios politikos nustatymų ir struktūros aprašą, apsilankykite adresu https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Naudotojo politikos atgalinio ciklo apdorojimo režimas</translation> +<translation id="4554841826517980623">Ši politika valdo, ar „<ph name="PRODUCT_NAME" />“ tinklo failų bendrinimo įrenginių funkcija turėtų naudoti „<ph name="NETBIOS_PROTOCOL" />“, kad atrastų bendrinimus tinkle. + Kai ši politika nustatyta kaip „Tiesa“, bendrinimo įrenginys naudos protokolą „<ph name="NETBIOS_PROTOCOL" />“, kad atrastų bendrinimus tinkle. + Kai ši politika nustatyta kaip „Netiesa“, bendrinimo įrenginys nenaudos protokolo „<ph name="NETBIOS_PROTOCOL" />“, kad atrastų bendrinimus. + Nenustačius politikos numatytoji vertė yra išjungta įmonių valdomiems naudotojams ir įgalinta nevaldomiems naudotojams.</translation> <translation id="4555850956567117258">Įgalinti nuotolinį naudotojo patvirtinimą</translation> <translation id="4557134566541205630">Numatytojo paieškos teikėjo naujo skirtuko puslapio URL</translation> <translation id="4567137030726189378">Leidimas naudoti kūrėjo įrankius</translation> @@ -1768,6 +1777,7 @@ Jei ši politika nenustatyta, ekrano skaitymas balsu bus išjungtas, kai pirmą kartą bus rodomas prisijungimo ekranas. Naudotojai galės bet kada įgalinti arba išjungti ekrano skaitymą balsu, o jų būsena prisijungimo ekrane bus vienoda skirtingiems naudotojams.</translation> <translation id="5868414965372171132">Naudotojo lygio tinklo konfigūracija</translation> +<translation id="5879014913445067283">Valdo tinklo failų bendrinimo įrenginio atradimus per „<ph name="NETBIOS_NAME" />“</translation> <translation id="5883015257301027298">Numatytasis slapukų nustatymas</translation> <translation id="5887414688706570295">Konfigūruojamas „TalkGadget“ (Pokalbių programėlės) kodas, kuris bus naudojamas nuotolinės prieigos prieglobų, ir neleidžiama naudotojams jo keisti. @@ -2227,6 +2237,17 @@ Jei nenustatyta, naudotojo gali būti klausiama, ar importuoti, arba gali būti importuojama automatiškai.</translation> <translation id="7063895219334505671">Leisti iššokančiuosius langus šiose svetainėse</translation> +<translation id="706568410943497889"> + Jei ši politika nustatyta kaip „Tiesa“, „<ph name="PRODUCT_NAME" />“ leidžiama rinkti „WebRTC“ įvykių žurnalus iš „Google“ paslaugų (pvz., „Google Meet“) ir įkelti šiuos žurnalus į „Google“. + + Jei ši politika nustatyta kaip „Netiesa“ arba nenustatyta, „<ph name="PRODUCT_NAME" />“ nerinks ir neįkels tokių žurnalų. + + Šiuose žurnaluose yra tokios informacijos kaip išsiųstų ir gautų RTP paketų laikas ir dydis, atsiliepimai apie tinklo perpildymą ir metaduomenys apie garso ir vaizdo įrašų kadrų laiką ir kokybę. Ši informacija naudinga derinant problemas dėl garso ir vaizdo skambučių „Chrome“, pavyzdžiui, siuntimo spartos vertinimo problemas ir kt. Žurnaluose nėra skambučių garso ir vaizdo turinio. + + Šį duomenų rinkimą gali suaktyvinti tik „Google“ žiniatinklio paslaugos, pvz., „Google Hangouts“ ar „Google Meet“. + + Šie žurnalai naudojantis seanso ID gali būti susieti su kitais žurnalais, kuriuos surinko pačios „Google“ paslaugos; tai skirta lengvesniam derinimui. + </translation> <translation id="706669471845501145">Leisti svetainėse rodyti darbalaukio pranešimus</translation> <translation id="7072208053150563108">Įrenginio slaptažodžio keitimo dažnis</translation> <translation id="7074513465313721551">Konfigūruojamas domenų, kuriais Saugaus naršymo funkcija galėtų pasitikėti, sąrašas. Tai reiškia, kad: @@ -2360,6 +2381,9 @@ <translation id="7336878834592315572">Išsaugoti slapukus vykstant sesijai</translation> <translation id="7340034977315324840">Pranešti įrenginio veiklos laiką</translation> <translation id="7343497214039883642">Įrenginiams skirtas įmonės spausdintuvų konfigūracijos failas</translation> +<translation id="7349338075015720646">Nurodomas svetainių, įdiegtų automatiškai, naudotojui neatliekant jokių veiksmų, sąrašas. Naudotojas negali jų nei išdiegti, nei išjungti. + + Kiekvienas politikos sąrašo elementas yra objektas iš dviejų narių: „url“ ir „launch_container“. „url“ turėtų būti diegiamos žiniatinklio programos URL, o „launch_container“ – „window“ arba „tab“, skirti atskirti, kaip žiniatinklio programa atidaroma įdiegus. Praleidus „launch_container“, programa bus paleista lange, jei „Chrome“ įvertins ją kaip laipsniškąją žiniatinklio programą, skirtuke – jei įvertins kitaip.</translation> <translation id="7367028210010532881">Naudojant Saugaus naršymo paslaugą rodomas įspėjimo puslapis, kai naudotojai naršo svetaines, kurios pažymėtos kaip potencialiai kenkėjiškos. Įgalinus šį nustatymą neleidžiama naudotojams iš įspėjimo puslapio tęsti veiksmų kenkėjiškoje svetainėje. Jei šis nustatymas išjungtas arba nesukonfigūruotas, naudotojai gali pasirinkti tęsti veiksmus pažymėtoje svetainėje, kai parodomas įspėjimas. @@ -2822,6 +2846,7 @@ Čia „Versija“ gali būti tiksli versija, pvz., „61.0.3163.120“ arba versijos priešdėlis, pvz., „61.0“ </translation> <translation id="8544375438507658205">Numatytasis „<ph name="PRODUCT_FRAME_NAME" />“ HTML teikėjas</translation> +<translation id="8544465954173828789">Leisti SMS pranešimus sinchronizuoti iš telefono į „Chromebook“.</translation> <translation id="8549772397068118889">Įspėti, kai apsilankoma svetainėse, nesančiose turinio paketuose</translation> <translation id="8566842294717252664">Internetinės parduotuvės slėpimas Naujo skirtuko puslapyje ir programų paleidimo priemonėje</translation> <translation id="8586528890725660268">Nurodomi spausdintuvai, kurių naudotojas negali naudoti. @@ -2866,6 +2891,11 @@ Jei ši politika nenustatyta, slaptažodžio apsaugos paslauga apsaugos tik „Google“ slaptažodžius, bet naudotojas galės pakeisti šį nustatymą.</translation> <translation id="8672321184841719703">Taikomo automatinio naujinio versija</translation> <translation id="867410340948518937">U2F (universalusis antras veiksnys, angl. „Universal Second Factor“)</translation> +<translation id="8682611302223077049">Leidžiama nustatyti laikotarpį (milisekundėmis), per kurį naudotojams pranešama, kad „<ph name="PRODUCT_NAME" />“ arba „<ph name="PRODUCT_OS_NAME" />“ įrenginį reikia paleisti iš naujo, norint pritaikyti laukiantį naujinį. + + Per šį laikotarpį naudotojui bus pakartotinai pranešama apie reikalingą atnaujinimą. „<ph name="PRODUCT_OS_NAME" />“ įrenginiuose paleidimo iš naujo pranešimas rodomas sistemos juostelėje, kai aptinkamas naujovinimas. Praėjus trečdaliui pranešimo laikotarpio „<ph name="PRODUCT_NAME" />“ naršyklėse pakeičiamas programų meniu nurodant, kad reikia paleisti iš naujo. Šio pranešimo spalva pakeičiama praėjus dviem trečdaliams pranešimo laikotarpiui ir dar kartą praėjus visam pranešimo laikotarpiui. Tas pats tvarkaraštis taikomas papildomiems pranešimams naršyklėse, įgalintiems taikant „<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />“ politiką. + + Jei nenustatyta, „<ph name="PRODUCT_OS_NAME" />“ įrenginiams naudojamas numatytasis 345 600 000 milisekundžių (keturių dienų) laikotarpis, o „<ph name="PRODUCT_NAME" />“ – 604 800 000 milisekundžių (vienos savaitės) laikotarpis.</translation> <translation id="8685024486845674965">Įspėjimas dėl slaptažodžio apsaugos suaktyvinamas pakartotinai naudojant slaptažodį</translation> <translation id="8693243869659262736">Naudoti integruotą DNS kliento programą</translation> <translation id="8704831857353097849">Neleidžiamų papildinių sąrašas</translation> @@ -2910,6 +2940,7 @@ Skalės mastelio faktorius turi būti 100 proc. ar daugiau. Vertės, dėl kurių ekrano užtemdymo delsos laikas dirbant pristatymo režimu būtų trumpesnis nei įprastos ekrano užtemdymo delsos laikas, neleidžiamos.</translation> <translation id="8798099450830957504">Numatytasis</translation> +<translation id="8801680448782904838">Pranešimas naudotojui apie rekomenduojamą ar būtiną naršyklės arba įrenginio paleidimą iš naujo</translation> <translation id="8818173863808665831">Pranešti geografinę šio įrenginio vietą. Jei ši politika nenustatyta ar nustatyta „Ne“, nebus pranešta apie vietą.</translation> @@ -3074,6 +3105,11 @@ Jei ši politika nustatyta į „true“, „<ph name="PRODUCT_OS_NAME" />“ suaktyvina paleidimą iš naujo, kai naudotojas išjungia įrenginį. Visus išjungimo mygtukų atvejus NS „<ph name="PRODUCT_OS_NAME" />“ pakeičia paleidimo iš naujo mygtukais. Jei naudotojas išjungia įrenginį naudodamas maitinimo mygtuką, įrenginys nėra automatiškai paleidžiamas iš naujo, net jei politika įgalinta.</translation> <translation id="9152473318295429890">Kontekstinių susijusių tinklalapių siūlymų įgalinimas</translation> <translation id="9158929520101169054">Leidimas naršyklėje prisijungti prie kelių paskyrų</translation> +<translation id="9159126470527871268">Pranešama naudotojams, kad būtina iš naujo paleisti „<ph name="PRODUCT_NAME" />“ arba „<ph name="PRODUCT_OS_NAME" />“, norint pritaikyti laukiantį naujinį. + + Taikant šį politikos nustatymą įgalinami pranešimai, kuriais naudotojas informuojamas, kad rekomenduojama arba būtina iš naujo paleisti naršyklę ar įrenginį. Nenustačius, „<ph name="PRODUCT_NAME" />“ subtiliais meniu pakeitimais nurodo naudotojui, kad reikia paleisti iš naujo, o „<ph name="PRODUCT_OS_NAME" />“ tai praneša sistemos juostelės pranešimais. Nustačius kaip „Rekomenduojama“, naudotojui rodomas pasikartojantis įspėjimas, kad rekomenduojama paleisti iš naujo. Naudotojas gali atsisakyti šio pranešimo, kad atidėtų paleidimą iš naujo. Nustačius kaip „Būtina“, naudotojui rodomas pasikartojantis įspėjimas, nurodantis, kad naršyklė bus priverstinai paleista iš naujo pasibaigus pranešimo laikotarpiui. Pagal numatytuosius nustatymus šis laikotarpis „<ph name="PRODUCT_NAME" />“ yra septynios, o „<ph name="PRODUCT_OS_NAME" />“ – keturios dienos. Jį galima konfigūruoti politikos „<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />“ nustatymuose. + + Paleidus iš naujo, naudotojo sesija atkuriama.</translation> <translation id="9165792353046089850">Galite nustatyti, ar svetainėms leidžiama pasiekti prijungtus USB įrenginius. Pasiekiamumą galima užblokuoti visiškai arba naudotojo gali būti klausiama kiekvieną kartą, kai svetainė nori pasiekti prijungtus USB įrenginius. Šios politikos galima nepaisyti konkretiems URL šablonams, naudojantiems politiką „WebUsbAskForUrls“ ir „WebUsbBlockedForUrls“.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index 79a1d38..65ab0205 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -346,6 +346,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> komponentu atjauninājumu iespējošana</translation> <translation id="2006530844219044261">Barošanas pārvaldība</translation> <translation id="201557587962247231">Ierīces statusa pārskatu augšupielādes biežums</translation> +<translation id="2017301949684549118">Tīmekļa lietotņu vietrāži URL, kas jāinstalē neuzraudzīti.</translation> <translation id="2018836497795982119">Norāda laika periodu milisekundēs, pēc kura ierīces pārvaldības pakalpojumam tiek vaicāti lietotāja politikas dati. Iestatot šo politiku, tiek ignorēta noklusējuma vērtība (3 stundas). Šīs politikas derīgo vērtību diapazons ir no 1 800 000 (30 minūtēm) līdz 86 400 000 (1 dienai). Jebkura vērtība ārpus šī diapazona tiks pieskaņota attiecīgajai robežvērtībai. Ja platformā tiek atbalstīti politikas paziņojumi, tiks iestatīts atsvaidzināšanas aizkaves laiks 24 stundas, jo ir paredzēts, ka ar politikas paziņojumiem atsvaidzināšana tiks veikta piespiedu kārtā katru reizi, kad tiks mainīta politika. @@ -662,6 +663,11 @@ Google meklēšanas vietrādi URL var norādīt šādi: <ph name="GOOGLE_SEARCH_URL" />. Šī opcija ir jāiestata tikai tad, kad ir iespējota politika DefaultSearchProviderEnabled (tikai tad tā tiks ievērota).</translation> +<translation id="2659019163577049044">Ja šis iestatījums tiks iespējots, lietotāji varēs iestatīt, lai viņu ierīcēs tiktu sinhronizētas tālrunī un Chromebook ierīcēs glabātās īsziņas. Ņemiet vērā — ja šī politika tiek atļauta, lietotājiem ir tieši jāpiesakās šim līdzeklim, veicot iestatīšanas procedūru. Pēc iestatīšanas lietotāji varēs sūtīt īsziņas no savām Chromebook ierīcēm un saņemt īsziņas šajās ierīcēs. + + Ja šis iestatījums tiks atspējots, lietotāji nevarēs iestatīt īsziņu sinhronizēšanu. + + Ja šī politika netiks iestatīta, funkcijas izmantošana pēc noklusējuma nav atļauta pārvaldītiem lietotājiem, bet ir atļauta nepārvaldītiem lietotājiem.</translation> <translation id="2660846099862559570">Nekad nelietot starpniekserveri</translation> <translation id="267596348720209223">Norāda meklētājprogrammas atbalstītos rakstzīmju kodējumus. Kodējumi ir kodu lapu nosaukumi, piemēram, UTF-8, GB2312 un ISO-8859-1. Tie tiek izmēģināti ievadītajā secībā. @@ -732,7 +738,6 @@ Ja atspējosiet šo iestatījumu vai neiestatīsiet nekādu vērtību, drukas priekšskatījumā kā noklusējuma galamērķis tiks izmantots pēdējais lietotais printeris. Ja iespējosiet šo iestatījumu, drukas priekšskatījumā kā noklusējuma galamērķis tiks izmantots operētājsistēmas noklusējuma printeris.</translation> -<translation id="2867699958489427143">Veikt atriti un paturēt mērķa versiju, ja OS versija ir jaunāka nekā mērķa versija. Vienlaikus pilnībā atiestatīt rūpnīcas datus ar funkciju Powerwash.</translation> <translation id="2872961005593481000">Beidzēt</translation> <translation id="2874209944580848064">Piezīme par <ph name="PRODUCT_OS_NAME" /> ierīcēm, kurās tiek atbalstītas Android lietotnes:</translation> <translation id="2877225735001246144">Atspējo CNAME atrašanu, kamēr notiek vienošanās par Kerberos autentifikāciju</translation> @@ -974,7 +979,6 @@ <translation id="3711895659073496551">Darbības apturēšana</translation> <translation id="3715569262675717862">Uz klientu sertifikātiem balstīta autentifikācija</translation> <translation id="3736879847913515635">Iespēja pievienot personu lietotāju pārvaldniekā</translation> -<translation id="3737544779868348650">Ierīces tīkla saimniekdatora nosaukums</translation> <translation id="3746590506846867985"> Šī 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 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. 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/. @@ -1086,6 +1090,7 @@ Katrā saraksta ierakstā ir ietverta vārdnīca, kurai laukā “extension-id” ir jāiekļauj paplašinājuma ID, bet laukā “update-url” — tā atjaunināšanas URL.</translation> <translation id="3874773863217952418">Iespējot funkciju “Pieskarties, lai meklētu”</translation> <translation id="3877517141460819966">Integrētais divfaktoru autentificēšanas režīms</translation> +<translation id="3879208481373875102">Konfigurēt piespiedu kārtā instalēto tīmekļa lietotņu sarakstu</translation> <translation id="388237772682176890">Šī politika ir novecojusi versijā M53 un noņemta no versijas M54, jo ir noņemts protokola SPDY/3.1 atbalsts. Tiek atspējota SPDY protokola lietošana pakalpojumā <ph name="PRODUCT_NAME" />. @@ -1328,6 +1333,10 @@ Pilnu iespējamo iestatījumu un šīs politikas struktūras aprakstu skatiet tīmekļa vietnē https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Lietotāju politikas atgriezeniskās cilpas apstrādes režīms</translation> +<translation id="4554841826517980623">Šī politika nosaka to, vai lietotājam <ph name="PRODUCT_NAME" /> tiek atļauta tīkla failu kopīgošanas funkcijas lietošana ar <ph name="NETBIOS_PROTOCOL" />, lai meklētu tīklā kopīgotos failus. + Ja šai politikai tiks iestatīta vērtība “True”, kopīgoto failu meklēšanas funkcija tīklā kopīgoto failu meklēšanai izmantos <ph name="NETBIOS_PROTOCOL" /> protokolu. + Ja šai politikai tiks iestatīta vērtība “False”, kopīgoto failu meklēšanas funkcija kopīgoto failu meklēšanai neizmantos <ph name="NETBIOS_PROTOCOL" /> protokolu. + Ja politikai netiks iestatīta neviena funkcija, uzņēmuma pārvaldītiem lietotājiem pēc noklusējuma tā būs atspējota, savukārt nepārvaldītiem lietotājiem — iespējota.</translation> <translation id="4555850956567117258">Iespējo lietotājam attālināto apstiprināšanu.</translation> <translation id="4557134566541205630">Jaunas cilnes lapas noklusējuma URL meklēšanas nodrošinātājam</translation> <translation id="4567137030726189378">Atļauj izstrādātāju rīku lietošanu</translation> @@ -1754,6 +1763,7 @@ Ja šī politika nav iestatīta, mutiskās atsauksmes ir atspējotas, kad pirmo reizi tiek parādīts pieteikšanās ekrāns. Lietotāji var jebkurā brīdī iespējot vai atspējot mutiskās atsauksmes, un šī iestatījuma statuss pieteikšanās ekrānā tiek saglabāts visiem lietotājiem.</translation> <translation id="5868414965372171132">Lietotāja līmeņa tīkla konfigurācija</translation> +<translation id="5879014913445067283">Pārvaldīt tīklā kopīgoto failu meklēšanu no <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Noklusējuma sīkfailu iestatījums</translation> <translation id="5887414688706570295">Konfigurē attālās piekļuves saimniekdatoros izmantojamo sīkrīka TalkGadget prefiksu un neļauj lietotājiem to mainīt. @@ -2211,6 +2221,17 @@ Ja tā nav iestatīta, vai nu lietotājam var tikt vaicāts, vai importēt, vai arī importēšana var notikt automātiski.</translation> <translation id="7063895219334505671">Atļauj uznirstošos logus šajās vietnēs</translation> +<translation id="706568410943497889"> + Ja šai politikai tiks iestatīta vērtība “True”, <ph name="PRODUCT_NAME" /> tiks atļauts vākt WebRTC notikumu žurnālus no Google pakalpojumiem (piemēram, Google Meet) un augšupielādēt šos žurnālus Google sistēmā. + + Ja šai politikai tiks iestatīta vērtība “False” vai neviena vērtība netiks iestatīta, <ph name="PRODUCT_NAME" /> var netiks atļauts vākt un augšupielādēt šos žurnālus. + + Šajos žurnālos tiek iekļauta diagnostikas informācija, kas var būt noderīga, pārlūkā Chrome novēršot ar audio vai video zvaniem saistītas kļūdas. Žurnālos ir pieejami tādi dati kā nosūtīto un saņemto RTP pakotņu laiks un lielums, dati par pārslodzi tīklā un audio un video laika un kvalitātes metadati. Žurnālos netiek iekļauts zvanu audio vai video saturs. + + To, lai pārlūks Chrome vāc datus, var ieslēgt tikai Google tīmekļa pakalpojumi, piemēram, Google Hangouts vai Google Meet. + + Izmantojot sesijas ID Google šos žurnālus var saistīt ar citiem žurnāliem, ko vāc Google pakalpojums. Tas tiek darīts, lai atvieglotu atkļūdošanas procesu. + </translation> <translation id="706669471845501145">Atļaut vietnēm rādīt paziņojumus darbvirsmā</translation> <translation id="7072208053150563108">Ierīces paroles nomaiņas biežums</translation> <translation id="7074513465313721551">Tiek konfigurēts to domēnu saraksts, kuri būs uzticami drošajā pārlūkošanā. Tas nozīmē tālāk norādīto. @@ -2344,6 +2365,9 @@ <translation id="7336878834592315572">Sīkfailu saglabāšana sesijas laikā</translation> <translation id="7340034977315324840">Ziņot par ierīces darbības laikiem</translation> <translation id="7343497214039883642">Uzņēmuma printeru konfigurācijas fails ierīcēm</translation> +<translation id="7349338075015720646">Saraksts ar vietnēm, kas tika instalētas neuzraudzīti (bez lietotāja mijiedarbības) un ko lietotājs nevar atinstalēt vai atspējot. + + Katrs politikas saraksta vienums ir objekts ar diviem elementiem: “url” un “launch_container”. Elementam “url” jābūt instalējamās tīmekļa lietotnes vietrādim URL, savukārt elementam “launch_container” — vai nu “window”, vai “tab”, kas nosaka veidu, kādā tīmekļa vietne tiks atvērta pēc tās instalēšanas. Izlaižot elementu “launch_container”, ja pārlūks Chrome uzskatīs, ka tā ir progresīvā tīmekļa lietotne, lietotne tiks palaista loga veidā, citādi — cilnes veidā.</translation> <translation id="7367028210010532881">Kad lietotāji pāriet uz vietnēm, kas ir atzīmētas kā iespējami ļaunprātīgas, tiek rādīta funkcijas Droša pārlūkošana brīdinājuma lapa. Ja šis iestatījums ir iespējots, lietotāji nevar pāriet no brīdinājuma lapas uz ļaunprātīgo vietni. Ja šis iestatījums ir atspējots vai nav konfigurēts, lietotāji pēc brīdinājuma saņemšanas var pāriet uz vietni, kas atzīmēta kā nevēlama. @@ -2805,6 +2829,7 @@ Šeit “versija” var būt precīzs versijas nosaukums, piemēram, 61.0.3163.120, vai versijas prefikss, piemēram, 61.0. </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> noklusējuma HTML renderētājs</translation> +<translation id="8544465954173828789">Atļaut, lai īsziņas tiktu sinhronizētas no tālruņa uz Chromebook.</translation> <translation id="8549772397068118889">Brīdināt, kad tiek apmeklētas satura pakotnēs neiekļautas vietnes.</translation> <translation id="8566842294717252664">Interneta veikala ikonas nerādīšana jaunas cilnes lapā un lietotņu palaidējā</translation> <translation id="8586528890725660268">Norāda printerus, ko lietotājs nevar izmantot. @@ -2848,6 +2873,11 @@ Ja politika netiks iestatīta, paroles aizsardzības pakalpojums aizsargās tikai Google paroles, taču lietotājs varēs mainīt šo iestatījumu.</translation> <translation id="8672321184841719703">Automātiskā atjauninājuma vēlamā versija</translation> <translation id="867410340948518937">U2F (universālā divfaktoru autentificēšana)</translation> +<translation id="8682611302223077049">Atļauj iestatīt laika periodu milisekundēs, kura laikā lietotājiem tiek paziņots par to, ka pārlūks <ph name="PRODUCT_NAME" /> ir atkārtoti jāpalaiž vai <ph name="PRODUCT_OS_NAME" /> ierīce ir jārestartē, lai veiktu nepabeigto atjaunināšanu. + + Šajā periodā lietotājs tiks atkārtoti informēts par atjaunināšanu. <ph name="PRODUCT_OS_NAME" /> ierīcēs paziņojums par restartēšanu tiek rādīts sistēmas teknē, kad ir atrasts jauninājums. <ph name="PRODUCT_NAME" /> pārlūkos: kad ir pagājusi trešdaļa no perioda, lietotnes izvēlne tiek mainīta, lai norādītu, ka nepieciešama atkārtota lietotnes palaišana. Kad ir pagājusi puse no perioda, šī paziņojuma krāsa tiek mainīta. Kad ir pagājis viss periods, paziņojuma krāsa tiek mainīta vēl vienu reizi. Tādā pašā veidā tiek rādīti arī pārlūka <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> politikas papildu iespējotie paziņojumi. + + Ja šī politika nav iestatīta, <ph name="PRODUCT_OS_NAME" /> ierīcēs tiek izmantots noklusējuma periods 345 600 000 milisekundes (četras dienas), savukārt pārlūkā <ph name="PRODUCT_NAME" /> — 604 800 000 milisekundes (viena nedēļa).</translation> <translation id="8685024486845674965">Paroles aizsardzības brīdinājums ir aktivizēts, atkārtoti izmantojot paroli</translation> <translation id="8693243869659262736">Iebūvētā DNS klienta izmantošana</translation> <translation id="8704831857353097849">Atspējoto spraudņu saraksts</translation> @@ -2892,6 +2922,7 @@ Maiņas faktoram ir jābūt vismaz 100%. Nav atļautas vērtības, kas aizkavi līdz ekrāna aptumšošanai prezentācijas režīmā padara īsāku par parasto aizkavi līdz ekrāna aptumšošanai.</translation> <translation id="8798099450830957504">Noklusējums</translation> +<translation id="8801680448782904838">Paziņot lietotājam, ka ir ieteicama vai nepieciešama pārlūka atkārtota palaišana vai ierīces restartēšana</translation> <translation id="8818173863808665831">Ziņot par ierīces ģeogrāfisko atrašanās vietu. Ja šī politika nav iestatīta vai tā ir iestatīta kā Aplama, par atrašanās vietu netiks ziņots.</translation> @@ -3043,6 +3074,11 @@ Ja šai politikai ir iestatīta vērtība Patiesa, lietotājam izslēdzot ierīci, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> tiek aktivizēta atkārtotā palaišana. <ph name="PRODUCT_OS_NAME" /> aizstāj visas lietotāja saskarnē esošās izslēgšanas pogas ar atkārtotas palaišanas pogām. Ja lietotājs izslēdz ierīci, izmantojot barošanas pogu, ierīce tiek automātiski atkārtoti palaista, pat ja ir iespējota politika.</translation> <translation id="9152473318295429890">Iespējojiet saistīto tīmekļa lapu kontekstuālos ieteikumus</translation> <translation id="9158929520101169054">Atļauj pārlūkā vairākkārtēju pierakstīšanos</translation> +<translation id="9159126470527871268">Paziņo lietotājiem, ka pārlūks <ph name="PRODUCT_NAME" /> ir atkārtoti jāpalaiž vai <ph name="PRODUCT_OS_NAME" /> ierīce ir jārestartē, lai veiktu nepabeigto atjaunināšanu. + + Izmantojot šo politikas iestatījumu, tiek iespējoti paziņojumi lietotājiem par ieteicamu vai obligātu pārlūka atkārtotu palaišanu. Ja šī politika nav iestatīta, pārlūkā <ph name="PRODUCT_NAME" /> ar nelielām izmaiņām izvēlnē lietotājam tiek norādīts, ka ir jāveic atkārtota palaišana. <ph name="PRODUCT_OS_NAME" /> ierīcē par to tiek parādīts paziņojums sistēmas teknē. Ja politikai ir iestatīta vērtība “Recommended”, lietotājam periodiski tiek rādīts brīdinājums par to, ka ieteicams veikt atkārtotu palaišanu. Lietotājs var noraidīt šo brīdinājumu, lai atliktu atkārtoto palaišanu. Ja šai politikai ir iestatīta vērtība “Required”, lietotājam periodiski tiek rādīts brīdinājums par to, ka pārlūks tiks atkārtoti palaists piespiedu kārtā, tiklīdz beigsies paziņojuma periods. Pēc noklusējuma pārlūkam <ph name="PRODUCT_NAME" /> šis periods ir septiņas dienas, savukārt <ph name="PRODUCT_OS_NAME" /> ierīcēm — četras dienas, un to var konfigurēt <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> politikas iestatījumos. + + Pēc atkārtotas palaišanas tiek atjaunota lietotāja sesija.</translation> <translation id="9165792353046089850">Ļauj iestatīt, vai vietnēm atļauts iegūt piekļuvi pievienotajām USB ierīcēm. Piekļuvi var pilnībā bloķēt, vai lietotājam var tikt parādīta uzvedne ar jautājumu katru reizi, kad vietne vēlas iegūt piekļuvi pievienotajām USB ierīcēm. Šo politiku var ignorēt noteiktiem vietrāžu URL modeļiem, izmantojot politiku “WebUsbAskForUrls” un “WebUsbBlockedForUrls”.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 2aca09b8..f165c79 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -63,9 +63,9 @@ ഈ നയ മൂല്യം മില്ലിസെക്കൻഡിൽ വ്യക്തമാക്കിയിരിക്കണം.</translation> <translation id="1151353063931113432">ഈ സൈറ്റുകളില് ഇമേജ് അനുവദിക്കുക</translation> -<translation id="1152117524387175066">ബൂട്ടിലെ ഉപകരണത്തിന്റെ ഡെവലപ്പർ സ്വിച്ചിന്റെ നില റിപ്പോർട്ടുചെയ്യുക. +<translation id="1152117524387175066">ബൂട്ടിലെ ഉപകരണത്തിന്റെ ഡവലപ്പർ സ്വിച്ചിന്റെ നില റിപ്പോർട്ട് ചെയ്യുക. - നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഡെവലപ്പർ സ്വിച്ചിന്റെ നില റിപ്പോർട്ടുചെയ്യില്ല.</translation> + നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഡവലപ്പർ സ്വിച്ചിന്റെ നില റിപ്പോർട്ട് ചെയ്യില്ല.</translation> <translation id="1160479894929412407">QUIC പ്രോട്ടോക്കോൾ അനുവദിക്കുക</translation> <translation id="1160939557934457296">സുരക്ഷിത ബ്രൗസിംഗ് മുന്നറിയിപ്പ് പേജിൽ നിന്നും തുടരുന്നത് അപ്രാപ്തമാക്കുക</translation> <translation id="1189817621108632689">ചിത്രങ്ങൾ പ്രദർശിപ്പിക്കാൻ അനുവദിച്ചിട്ടില്ലാത്ത സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. @@ -219,7 +219,7 @@ <translation id="1514888685242892912"><ph name="PRODUCT_NAME" /> പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="1522425503138261032">ഉപയോക്താക്കളുടെ ഭൌതിക ലൊക്കേഷന് ട്രാക്കുചെയ്യാന് സൈറ്റുകളെ സഹായിക്കുക</translation> <translation id="152657506688053119">സ്ഥിര തിരയൽ ദാതാവിനുള്ള ഇതര URL-കളുടെ ലിസ്റ്റ്</translation> -<translation id="1530812829012954197">ഹോസ്റ്റ് ബ്രൌസറില് ഇനി പറയുന്ന URL പാറ്റേണുകള് എല്ലായ്പ്പോഴും റെന്ഡര് ചെയ്യുക</translation> +<translation id="1530812829012954197">ഹോസ്റ്റ് ബ്രൗസറില് ഇനി പറയുന്ന URL പാറ്റേണുകള് എല്ലായ്പ്പോഴും റെന്ഡര് ചെയ്യുക</translation> <translation id="1553684822621013552">ഈ നയത്തെ ശരി എന്ന് സജ്ജമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്താവിനായി ARC പ്രവർത്തനക്ഷമമാക്കും (അധിക നയ ക്രമീകരണ പരിശോധനകൾക്ക് വിധേയമായി - നിലവിലെ ഉപയോക്തൃ സെഷനിൽ എഫിമെറൽ മോഡോ @@ -391,6 +391,7 @@ ഈ ക്രമീകരണം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഈ ഫംഗ്ഷൻ ഉപയോഗിക്കണമോ വേണ്ടയോ എന്നത് ഉപയോക്താവിന് തീരുമാനിക്കാം.</translation> <translation id="2006530844219044261">പവർ മാനേജുമെന്റ്</translation> <translation id="201557587962247231">ഉപകരണ നില റിപ്പോർട്ട് അപ്ലോഡുകളുടെ ആവൃത്തി</translation> +<translation id="2017301949684549118">നിശ്ശബ്ദമായി ഇൻസ്റ്റാൾ ചെയ്യേണ്ട വെബ് ആപ്പുകൾക്കുള്ള URL-കൾ.</translation> <translation id="2018836497795982119">ഉപയോക്തൃ നയ വിവരത്തിന് വേണ്ടി അന്വേഷിച്ച ഉപകരണ മാനേജ്മെന്റ് സേവനത്തിൽ, കാലയളവ് മില്ലിസെക്കൻഡിലാണ് വ്യക്തമാക്കുന്നത്. ഈ നയം ക്രമീകരിക്കുന്നത് ഡിഫോൾട്ട് മൂല്യമായ 3 മണിക്കൂറിനെ അസാധുവാക്കും. ഈ നയത്തിന്റെ സാധുതയുള്ള മൂല്യങ്ങളുടെ ശ്രേണി 1800000 (30 മിനിറ്റ്) മുതൽ 86400000 (ഒരു ദിവസം) വരെയാണ്. ഈ ശ്രേണിയിലില്ലാത്ത ഏതൊരു മൂല്യത്തെയും അതിന്റെ പരിധിക്കുള്ളിൽത്തന്നെ ഉൾപ്പെടുത്തും. നയത്തിന്റെ അറിയിപ്പുകളെ പ്ലാറ്റ്ഫോം പിന്തുണയ്ക്കുന്നുണ്ടെങ്കിൽ, നയം മാറുമ്പോഴെല്ലാം നയത്തിന്റെ അറിയിപ്പുകൾ സ്വയം പുതുക്കിയെടുക്കാൻ നിർബന്ധിക്കുന്നതിന് സാധ്യതയുള്ളതിനാൽ, പുതുക്കിയെടുക്കാനുള്ള കാലയളവ് 24 മണിക്കൂറായി സജ്ജമാക്കും. @@ -505,7 +506,7 @@ <translation id="2204753382813641270">ഷെൽഫ് യാന്ത്രിക മറയ്ക്കൽ നിയന്ത്രിക്കുക</translation> <translation id="2208976000652006649">POST ഉപയോഗിക്കുന്ന തിരയൽ URL-നായുള്ള പാരാമീറ്ററുകൾ</translation> <translation id="2223598546285729819">സ്ഥിരസ്ഥിതി നോട്ടിഫിക്കേഷന് ക്രമീകരണം</translation> -<translation id="2231817271680715693">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള ബ്രൗസിംഗ് ചരിത്രം ഇംപോർട്ട് ചെയ്യുക</translation> +<translation id="2231817271680715693">ആദ്യ റൺ ചെയ്യലിൽ തന്നെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുള്ള ബ്രൗസിംഗ് ചരിത്രം ഇംപോർട്ട് ചെയ്യുക</translation> <translation id="2236488539271255289">പ്രാദേശിക ഡാറ്റ ക്രമീകരിക്കാന് ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation> <translation id="2240879329269430151">പോപ്പ്-അപ്പുകൾ കാണിക്കുന്നതിന് വെബ്സൈറ്റുകളെ അനുവദിക്കേണ്ടതുണ്ടോ എന്നത് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. പോപ്പ്അപ്പുകൾ കാണിക്കുന്നത് എല്ലാ വെബ്സൈറ്റുകൾക്കായും ഒന്നുകിൽ അനുവദിക്കപ്പെട്ടതോ അല്ലെങ്കിൽ നിരസിക്കപ്പെട്ടതോ ആകാം. @@ -589,9 +590,9 @@ <translation id="2386362615870139244">സ്ക്രീൻ വേക്ക് ലോക്കുകൾ അനുവദിക്കുക</translation> <translation id="2411817661175306360">പാസ്വേഡ് പരിരക്ഷ മുന്നറിയിപ്പ് ഓഫാണ്</translation> <translation id="2411919772666155530">ഈ സൈറ്റുകളിൽ അറിയിപ്പുകൾ തടയുക</translation> -<translation id="2418507228189425036"><ph name="PRODUCT_NAME" /> എന്നതിൽ ബ്രൗസർ ചരിത്രം സംരക്ഷിക്കുന്നതും ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുന്നതും പ്രവർത്തനക്ഷമമാക്കുന്നു. +<translation id="2418507228189425036"><ph name="PRODUCT_NAME" /> എന്നതിൽ ബ്രൗസർ ചരിത്രം സംരക്ഷിക്കുന്നത് പ്രവർത്തനരഹിതമാക്കുന്നു. ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. - ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയെങ്കിൽ, ബ്രൗസുചെയ്യൽ ചരിത്രം സംരക്ഷിക്കില്ല. ഈ ക്രമീകരണം ടാബ് സമന്വയവും പ്രവർത്തനരഹിതമാക്കുന്നു. + ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയെങ്കിൽ, ബ്രൗസ് ചെയ്യൽ ചരിത്രം സംരക്ഷിക്കില്ല. ഈ ക്രമീകരണം ടാബ് സമന്വയവും പ്രവർത്തനരഹിതമാക്കുന്നു. ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയെങ്കിലോ സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ, ബ്രൗസിംഗ് ചരിത്രം സംരക്ഷിക്കുന്നു.</translation> <translation id="2426782419955104525"><ph name="PRODUCT_NAME" /> എന്നതിന്റെ തൽക്ഷണ സവിശേഷത പ്രവർത്തനക്ഷമമാക്കി ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുന്നു. @@ -634,7 +635,7 @@ ഈ നയം കോൺഫിഗർ ചെയ്യാത്ത സാഹചര്യത്തിലോ "മുതിർന്നവർക്കുള്ള ഉള്ളടക്കത്തിനായി സൈറ്റുകൾ ഫിൽട്ടർ ചെയ്യരുത്" എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, സൈറ്റുകൾ ഫിൽട്ടർ ചെയ്യപ്പെടില്ല. ഈ നയം "മുതിർന്നവർക്കായുള്ള ഉള്ളടക്കത്തിനായി ഉന്നത നിലയിലുള്ള സൈറ്റുകൾ ഫിൽട്ടർ ചെയ്യുക" എന്നായി സജ്ജീകരിക്കുമ്പോൾ, അശ്ലീലമെന്ന് വർഗീകരിക്കപ്പെട്ടിട്ടുള്ള സൈറ്റുകൾ ഫിൽട്ടർ ചെയ്യപ്പെടും.</translation> -<translation id="2485721741875148980">ഈ നയം 'ശരി'യെന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ബ്രൗസർ ഉപയോഗിക്കുന്നതിന് മുമ്പ് ഉപയോക്താക്കൾ അവരുടെ പ്രൊഫൈൽ ഉപയോഗിച്ച് <ph name="PRODUCT_NAME" /> എന്നതിൽ സൈൻ ഇൻ ചെയ്യേണ്ടതുണ്ട്. ഒപ്പം BrowserGuestModeEnabled എന്നതിന്റെ ഡിഫോൾട്ട് മൂല്യം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയും ചെയ്യും. ഈ നയം പ്രവർത്തനക്ഷമമാക്കിക്കഴിഞ്ഞാൽ, സൈൻ ഇൻ ചെയ്യാത്ത പ്രൊഫൈലുകൾ ബ്ലോക്ക് ചെയ്യപ്പെടുമെന്നും ആക്സസ് ചെയ്യാൻ കഴിയുകയില്ലെന്നും ശ്രദ്ധിക്കുക. കൂടുതൽ വിവരങ്ങൾക്ക് സഹായകേന്ദ്ര ലേഖനം കാണുക. +<translation id="2485721741875148980">ഈ നയം 'ശരി'യെന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ബ്രൗസർ ഉപയോഗിക്കുന്നതിന് മുമ്പ് ഉപയോക്താക്കൾ അവരുടെ പ്രൊഫൈൽ ഉപയോഗിച്ച് <ph name="PRODUCT_NAME" /> എന്നതിൽ സൈൻ ഇൻ ചെയ്യേണ്ടതുണ്ട്. ഒപ്പം BrowserGuestModeEnabled എന്നതിന്റെ ഡിഫോൾട്ട് മൂല്യം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയും ചെയ്യും. ഈ നയം പ്രവർത്തനക്ഷമമാക്കിയാൽ, സൈൻ ഇൻ ചെയ്യാത്ത പ്രൊഫൈലുകൾ ബ്ലോക്ക് ചെയ്യപ്പെടുമെന്നും അവ ആക്സസ് ചെയ്യാൻ കഴിയുകയില്ലെന്നും ശ്രദ്ധിക്കുക. കൂടുതൽ വിവരങ്ങൾക്ക് സഹായകേന്ദ്ര ലേഖനം കാണുക. ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയോ കോൺഫിഗർ ചെയ്യാതിരിക്കുകയോ ആണെങ്കിൽ, ഉപയോക്താവിന് <ph name="PRODUCT_NAME" />-ൽ സൈൻ ഇൻ ചെയ്യാതെ തന്നെ ബ്രൗസർ ഉപയോഗിക്കാനാവും.</translation> <translation id="2486371469462493753">ലിസ്റ്റുചെയ്ത URL-കളിലേക്കുള്ള സർട്ടിഫിക്കറ്റ് സുതാര്യതാ ആവശ്യകതകൾ നടപ്പിലാക്കുന്നതിനെ പ്രവർത്തനരഹിതമാക്കുന്നു. @@ -661,7 +662,7 @@ ഈ ക്രമീകരണം അപ്രാപ്തമാക്കിയാൽ, ഉപയോക്താക്കൾക്ക് <ph name="PRODUCT_NAME" /> എന്നതിൽ നിന്നും പ്രിന്റുചെയ്യാൻ കഴിയില്ല. റെഞ്ച് മെനു, വിപുലീകരണങ്ങൾ, JavaScript അപ്ലിക്കേഷനുകൾ മുതലായവയിൽ പ്രിന്റുചെയ്യൽ അപ്രാപ്തമാക്കി. പ്രിന്റുചെയ്യുമ്പോൾ <ph name="PRODUCT_NAME" /> എന്നതിനെ ബൈപാസ് ചെയ്യുന്ന പ്ലഗിന്നുകളിൽ നിന്നും പ്രിന്റു ചെയ്യുന്നത് ഇപ്പോഴും സാദ്ധ്യമാണ്. ഉദാഹരണത്തിന്, കോൺടെക്സ്റ്റ് മെനുവിൽ പ്രിന്റ് ഓപ്ഷനുകളുള്ള ചില ഫ്ലാഷ് അപ്ലിക്കേഷനുകൾ, അവ ഈ നയത്തിൽ ഉൾപ്പെടുന്നില്ല.</translation> <translation id="2518231489509538392">ഓഡിയോ പ്ലേചെയ്യുന്നത് അനുവദിക്കുക</translation> -<translation id="2521581787935130926">ബുക്ക്മാർക്ക് ബാറിൽ അപ്ലിക്കേഷനുകളുടെ കുറുക്കുവഴി കാണിക്കുക</translation> +<translation id="2521581787935130926">ബുക്ക്മാർക്ക് ബാറിൽ ആപ്പ് കുറുക്കുവഴി കാണിക്കുക</translation> <translation id="2529700525201305165"><ph name="PRODUCT_NAME" />-ൽ സൈൻ ഇൻ ചെയ്യാൻ അനുവദിച്ച ഉപയോക്താക്കളെ നിയന്ത്രിക്കുക.</translation> <translation id="2529880111512635313">ഉപയോക്തൃ ശ്രദ്ധയോടെ ഇൻസ്റ്റാൾ ചെയ്ത ആപ്സിന്റെയും വിപുലീകരണങ്ങളുടെയും ലിസ്റ്റ് കോൺഫിഗർ ചെയ്യുക</translation> <translation id="253135976343875019">AC പവറിൽ പ്രവർത്തിക്കുമ്പോഴുള്ള നിഷ്ക്രിയ മുന്നറിയിപ്പ് കാലതാമസം</translation> @@ -687,7 +688,7 @@ ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഡാറ്റ കംപ്രഷൻ പ്രോക്സി സവിശേഷത ഉപയോഗിക്കണോ വേണ്ടയോ എന്നത് തിരഞ്ഞെടുക്കാനായി ഉപയോക്താവിന് അത് ലഭ്യമാകും.</translation> <translation id="257788512393330403">ഓരോ ആറ് മണിക്കൂറിലും പാസ്വേഡ് നൽകേണ്ടതുണ്ട്.</translation> -<translation id="2587719089023392205"><ph name="PRODUCT_NAME" />-നെ സ്ഥിര ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> +<translation id="2587719089023392205"><ph name="PRODUCT_NAME" />-നെ ഡിഫോൾട്ട് ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> <translation id="2592091433672667839">റീട്ടെയ്ൽ മോഡിലെ സൈൻ-ഇൻ സ്ക്രീനിൽ സ്ക്രീൻ സേവർ ദൃശ്യമാകുന്നതിന് മുമ്പുള്ള നിഷ്ക്രിയത്വത്തിന്റെ സമയദൈർഘ്യം</translation> <translation id="2592162121850992309">ഈ നയം 'ശരി' എന്നതായി സജ്ജമാക്കുകയോ, സജ്ജമാക്കാതെ വിടുകയോ ചെയ്യുകയാണെങ്കിൽ, ചില GPU ഫീച്ചർ ബ്ലാക്ക്ലിസ്റ്റുചെയ്യുന്നില്ലെങ്കിൽ, ഹാർഡ്വെയർ ആക്സിലറേഷൻ പ്രവർത്തനക്ഷമമാക്കും. @@ -729,6 +730,11 @@ Google-ന്റെ തിരയൽ URL ഇനിപ്പറയുന്നതായി വ്യക്തമാക്കാം: <ph name="GOOGLE_SEARCH_URL" />. 'DefaultSearchProviderEnabled' പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുമ്പോൾ ഈ ഓപ്ഷൻ സജ്ജമാക്കിയിരിക്കണം, മാത്രമല്ല ഈ സാഹചര്യത്തിൽ മാത്രമേ ഇത് പരിഗണിക്കുകയുമുള്ളൂ.</translation> +<translation id="2659019163577049044">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഫോണുകളിലെയും Chromebook-കളിലെയും എസ്എംഎസ് സന്ദേശങ്ങൾ തമ്മിൽ സമന്വയിപ്പിക്കാനായി അവരുടെ ഉപകരണങ്ങൾ സജ്ജീകരിക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കും. ഈ നയം അനുവദിക്കുകയാണെങ്കിൽ, സജ്ജീകരണ ഫ്ലോ പൂർത്തിയാക്കി, ഉപയോക്താക്കൾ ഈ ഫീച്ചർ സ്പഷ്ടമായി തിരഞ്ഞെടുക്കണം എന്ന് ശ്രദ്ധിക്കുക. ഒരിക്കൽ സജ്ജീകരണ ഫ്ലോ പൂർത്തിയായാൽ, അവരുടെ Chromebook-കളിൽ എസ്എംഎസ് സന്ദേശങ്ങൾ അയയ്ക്കാനും സ്വീകരിക്കാനും ഉപയോക്താക്കൾക്കാവും. + + ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, എസ്എംഎസ് സമന്വയം സജ്ജീകരിക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കില്ല. + + ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, നിയന്ത്രിക്കുന്ന ഉപയോക്താക്കൾക്ക് ഡിഫോൾട്ട് അനുവദിക്കില്ല, നിയന്ത്രിക്കാത്ത ഉപയോക്താക്കൾക്ക് ഇത് അനുവദിക്കും.</translation> <translation id="2660846099862559570">ഒരിക്കലും പ്രോക്സി ഉപയോഗിക്കരുത്</translation> <translation id="267596348720209223">തിരയൽ ദാതാവ് പിന്തുണയ്ക്കുന്ന പ്രതീക എൻകോഡിംഗ് വ്യക്തമാക്കുന്നു. എൻകോഡിംഗുകൾ UTF-8, GB2312, ISO-8859-1 എന്നിങ്ങനെയുള്ള കോഡ് പേജ് നാമങ്ങളാണ്. നൽകുന്നതിനനുസരിച്ച് അവ ശ്രമിക്കും. @@ -803,7 +809,6 @@ നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുന്നുവെങ്കിലോ ഒരു മൂല്യം സജ്ജമാക്കുന്നില്ലെങ്കിലോ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക ഏറ്റവും സമീപകാലത്ത് ഉപയോഗിച്ച പ്രിന്ററാണ്. നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നുവെങ്കിൽ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക OS സിസ്റ്റം ഡിഫോൾട്ട് പ്രിന്ററാണ്.</translation> -<translation id="2867699958489427143">OS പതിപ്പ് ടാർഗറ്റിനെക്കാൾ പുതിയതാണെങ്കിൽ ടാർഗറ്റ് പതിപ്പിലേക്ക് തിരികെ പോയി തുടരുക. പ്രോസസ് ചെയ്യുന്നതിനിടെ ഒരു പൂർണ്ണ powerwash ചെയ്യുക.</translation> <translation id="2872961005593481000">അടയ്ക്കുക</translation> <translation id="2874209944580848064">Android ആപ്സിനെ പിന്തുണയ്ക്കുന്ന <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്കുള്ള കുറിപ്പ്:</translation> <translation id="2877225735001246144">Kerberos പ്രാമാണീകരണം നടന്നുകൊണ്ടിരിക്കുമ്പോള് CNAME ലുക്കപ്പ് അപ്രാപ്തമാക്കുക</translation> @@ -933,11 +938,11 @@ ഈ നയം തെറ്റ് എന്നതായി സജ്ജമാക്കുമ്പോൾ അന്തർനിർമ്മിതമായ DNS ക്ലയന്റ് ഒരിക്കലും ഉപയോഗിക്കുകയില്ല. ഈ നയം സജ്ജമാക്കാതെയിരിക്കുമ്പോൾ chrome://flags എഡിറ്റുചെയ്യുന്നതിലൂടെയോ കമാന്റ്-ലൈൻ ഫ്ലാഗ് വ്യക്തമാക്കുന്നതിലൂടെയോ ഉപയോക്താക്കൾക്ക് അന്തർനിർമ്മിത DNS ക്ലയന്റ് ഉപയോഗിക്കപ്പെടുമോ എന്നത് മാറ്റാൻ കഴിയും.</translation> -<translation id="3214164532079860003">നിലവിലെ സ്ഥിരസ്ഥിതി ബ്രൗസർ പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിന്നും ഹോം പേജ് ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. +<translation id="3214164532079860003">പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നും ഹോം പേജ് ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. - അപ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഹോം പേജ് ഇംപോർട്ട് ചെയ്യില്ല. + പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഹോം പേജ് ഇംപോർട്ട് ചെയ്യപ്പെടില്ല. - ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ അല്ലെങ്കിൽ ഇംപോർട്ട് ചെയ്യൽ സ്വയമേവ സംഭവിക്കേണ്ടതുണ്ടോ എന്ന് ഉപയോക്താവിനോട് ചോദിച്ചേക്കാം.</translation> + ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ എന്ന് ഉപയോക്താവിനോട് ചോദിക്കുകയോ അല്ലെങ്കിൽ സ്വമേധയാലുള്ള ഇംപോർട്ട് ചെയ്യലോ നടന്നേക്കാം.</translation> <translation id="3219421230122020860">ആൾമാറാട്ട മോഡ് ലഭ്യമാണ്</translation> <translation id="3220624000494482595">നയം <ph name="TRUE" /> എന്ന് സജ്ജമാക്കിയിരിക്കുകയാണെങ്കിൽ പോലും കിയോസ്ക് അപ്ലിക്കേഷൻ ഒരു Android ആപ്പാണെങ്കിൽ, ഇതിന് <ph name="PRODUCT_OS_NAME" /> പതിപ്പിൽ നിയന്ത്രണം ഉണ്ടായിരിക്കില്ല.</translation> <translation id="3236046242843493070">വിപുലീകരണം, അപ്ലിക്കേഷൻ, ഉപയോക്തൃ സ്ക്രിപ്റ്റ് ഇൻസ്റ്റാളുകൾ എന്നിവ അനുവദിക്കുന്നതിനുള്ള URL പാറ്റേണുകൾ</translation> @@ -981,7 +986,7 @@ ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, 'DefaultCookiesSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, അല്ലെങ്കിൽ ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ എല്ലാ സൈറ്റുകൾക്കും ആഗോള ഡിഫോൾട്ട് മൂല്യം ഉപയോഗിക്കും. 'CookiesBlockedForUrls,' 'CookiesSessionOnlyForUrls' എന്നീ നയങ്ങളും കാണുക. ഈ നയങ്ങൾക്കിടയിൽ വൈരുദ്ധ്യമുള്ള URL പാറ്റേണുകൾ ഉണ്ടാവാൻ പാടില്ലെന്ന് ശ്രദ്ധിക്കുക - ഏത് നയത്തിനാണ് മുൻഗണന ലഭിക്കുക എന്ന് വ്യക്തമാക്കിയിട്ടില്ല.</translation> -<translation id="3381968327636295719">സ്ഥിരസ്ഥിതിയായി ഹോസ്റ്റ് ബ്രൌസര് ഉപയോഗിക്കുക</translation> +<translation id="3381968327636295719">ഡിഫോൾട്ടായി ഹോസ്റ്റ് ബ്രൗസർ ഉപയോഗിക്കുക</translation> <translation id="3414260318408232239">ഈ നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ <ph name="PRODUCT_NAME" /> ഏറ്റവും പഴയ ഡിഫോൾട്ട് പതിപ്പായ TLS 1.0. ഉപയോഗിക്കുന്നു. അല്ലെങ്കിൽ ഇത് ഇനിപ്പറയുന്ന മൂല്യങ്ങളിൽ ഒന്നിലേക്ക് സജ്ജീകരിക്കപ്പെട്ടേക്കാം: "tls1", "tls1.1" അല്ലെങ്കിൽ "tls1.2". സജ്ജീകരിച്ച ശേഷം, <ph name="PRODUCT_NAME" /> നിർദ്ദിഷ്ടമാക്കിയ പതിപ്പിന് മുമ്പുള്ള SSL/TLS പതിപ്പുകൾ ഉപയോഗിക്കില്ല. തിരിച്ചറിയാനാവാത്ത മൂല്യം അവഗണിക്കപ്പെടും.</translation> @@ -1080,7 +1085,6 @@ <translation id="3715569262675717862">ക്ലയൻറ് സർട്ടിഫിക്കറ്റുകൾ അടിസ്ഥാനമാക്കിയുള്ള പരിശോധിച്ചുറപ്പിക്കൽ</translation> <translation id="3734995764843493369">എല്ലാ ദിവസവും പാസ്വേഡ് നൽകേണ്ടതുണ്ട് (24 മണിക്കൂർ)</translation> <translation id="3736879847913515635">ഉപയോക്തൃ മാനേജറിൽ വ്യക്തിയെ ചേർക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക</translation> -<translation id="3737544779868348650">ഉപകരണ നെറ്റ്വർക്ക് ഹോസ്റ്റുനാമം</translation> <translation id="3746590506846867985"> സൈൻ ഇൻ സ്ക്രീനിന് ഈ നയം ബാധകമാണ്. ഉപയോക്തൃ സെഷന് ബാധകമായ <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> നയവും കാണുക. ഇരു നയങ്ങളും സമാന മൂല്യത്തിൽ സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ഉപയോക്തൃ നയം മുഖേന വ്യക്തമാക്കിയിരിക്കുന്ന മൂല്യം ബാധകമാക്കപ്പെടുന്ന സമയത്ത്, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുമ്പോൾ കാലതാമസം നേരിട്ടേക്കാം. @@ -1126,13 +1130,13 @@ "EnableMediaRouter" നയം തെറ്റ് എന്ന് സജ്ജമാക്കിയിരിക്കുകയാണെങ്കിൽ, ഈ നയത്തിന്റെ മൂല്യം പ്രാബല്യത്തിൽ വരാത്തതിനാൽ ടൂൾബാർ ഐക്കൺ ദൃശ്യമാക്കില്ല.</translation> <translation id="3788662722837364290">ഉപയോക്താവ് നിഷ്ക്രിയമാകുമ്പോഴുള്ള പവർ മാനേജുമെന്റ് ക്രമീകരണങ്ങൾ</translation> -<translation id="3793095274466276777"><ph name="PRODUCT_NAME" />-ല് സ്ഥിരസ്ഥിതി ബ്രൌസര് ചെക്കുകള് കോണ്ഫിഗര് ചെയ്യുന്നു, ഒപ്പം ഉപയോക്താക്കളെ അവ മാറ്റുന്നതില് നിന്ന് തടയുന്നു. +<translation id="3793095274466276777"><ph name="PRODUCT_NAME" />-ൽ ഡിഫോൾട്ട് ബ്രൗസർ പരിശോധനകൾ കോൺഫിഗർ ചെയ്ത് അവ മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുന്നു. - നിങ്ങള് ഈ ക്രമീകരണം പ്രാപ്തമാക്കിയാല്, സ്ഥിരസ്ഥിതി ബ്രൌസറാണോ <ph name="PRODUCT_NAME" /> എന്ന് തുടങ്ങുന്ന സമയത്തുതന്നെ എപ്പോഴും അത് പരിശോധിക്കും, കഴിയുമെങ്കില് സ്ഥിരസ്ഥിതി ബ്രൌസറായി അത് സ്വയം രജിസ്റ്റര് ചെയ്യും. + ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ആരംഭത്തിൽ <ph name="PRODUCT_NAME" /> എല്ലായ്പ്പോഴും ഇത് ഡിഫോൾട്ട് ബ്രൗസറാണോയെന്നത് പരിശോധിച്ച് സാധ്യമെങ്കിൽ സ്വയം യാന്ത്രികമായി രജിസ്റ്റർ ചെയ്യും. - നിങ്ങള് ഈ ക്രമീകരണം അപ്രാപ്തമാക്കിയാല്, സ്ഥിരസ്ഥിതി ബ്രൌസറാണോ <ph name="PRODUCT_NAME" /> എന്ന് ഒരിക്കലുമത് പരിശോധിക്കില്ല, ഈ ഓപ്ഷന് ക്രമീകരിക്കാനുള്ള ഉപയോക്തൃ നിയന്ത്രണങ്ങള് അപ്രാപ്തമാക്കും. + ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഇത് ഡിഫോൾട്ട് ബ്രൗസറാണോയെന്നത് <ph name="PRODUCT_NAME" /> ഒരിക്കലും പരിശോധിക്കില്ല, അത് ഈ ഓപ്ഷനായുള്ള ഉപയോക്തൃ നിയന്ത്രണങ്ങളെ പ്രവർത്തനരഹിതമാക്കും. - ഈ ക്രമീകരണം ക്രമീകരിച്ചിട്ടില്ല എങ്കില്, ഇത് സ്ഥിരസ്ഥിതി ബ്രൌസര് ആണോ അല്ലയോ എന്നും സ്ഥിരസ്ഥിതി ബ്രൌസര് അല്ലാത്ത സാഹചര്യത്തില് ഉപയോക്തൃ നോട്ടിഫിക്കേഷനുകള് കാണിക്കണോ വേണ്ടയോ എന്നും തീരുമാനിക്കാന് ഉപയോക്താവിനെ <ph name="PRODUCT_NAME" /> അനുവദിക്കും.</translation> + ഈ ക്രമീകരണം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, ഇത് ഡിഫോൾട്ട് ബ്രൗസറാണോയെന്നതും അല്ലാത്തപ്പോൾ ഉപയോക്തൃ അറിയിപ്പുകൾ കാണിക്കേണ്ടതുണ്ടോയെന്നതും നിയന്ത്രിക്കാൻ <ph name="PRODUCT_NAME" /> ഉപയോക്താവിനെ അനുവദിക്കും.</translation> <translation id="379602782757302612">ഉപയോക്താക്കൾക്ക് ഏതൊക്കെ വിപുലീകരണങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയില്ല എന്ന് വ്യക്തമാക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു. മുമ്പുതന്നെ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള വിപുലീകരണങ്ങൾ, കരിമ്പട്ടികയിൽ ചേർക്കപ്പെട്ടിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവിന് പ്രവർത്തനക്ഷമമാക്കാൻ സാധിക്കാത്ത തരത്തിൽ അവ പ്രവർത്തനരഹിതമാക്കപ്പെടും. കരിമ്പട്ടികയിൽ ചേർക്കപ്പെട്ടതിനാൽ ഒരിക്കൽ പ്രവർത്തനരഹിതമായ ഒരു വിപുലീകരണം, കരിമ്പട്ടികയിൽ നിന്ന് നീക്കംചെയ്യപ്പെട്ടാൽ, സ്വമേധയാ അത് വീണ്ടും പ്രവർത്തനക്ഷമമാകും. കരിമ്പട്ടിക മൂല്യം '*' ആണ് എന്നതിനർത്ഥം, വൈറ്റ്ലിസ്റ്റിൽ സ്പഷ്ടമായി ലിസ്റ്റ് ചെയ്യാത്ത പക്ഷം, എല്ലാ വിപുലീകരണങ്ങളും കരിമ്പട്ടികയിൽ ഉൾപ്പെടുത്തുമെന്നതാണ്. @@ -1202,6 +1206,7 @@ ഓരോ ലിസ്റ്റ് എൻട്രിയിലും 'extension-id' ഫീൽഡിലെ വിപുലീകരണ ID ഉൾപ്പെടുന്ന ഒരു നിഘണ്ഡുവും 'update-url' ഫീൽഡിലെ അതിന്റെ അപ്ഡേറ്റ് URL-ഉം അടങ്ങിയിരിക്കുന്നു.</translation> <translation id="3874773863217952418">'തിരയാൻ ടാപ്പ് ചെയ്യുക' പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3877517141460819966">സംയോജിപ്പിക്കപ്പെട്ട രണ്ടാം ഫാക്ടർ പരിശോധിപ്പിച്ചുറപ്പിക്കൽ മോഡ്</translation> +<translation id="3879208481373875102">നിർബന്ധിതമായി ഇൻസ്റ്റാൾ ചെയ്ത വെബ് ആപ്പുകളുടെ ലിസ്റ്റ് കോൺഫിഗർ ചെയ്യുക</translation> <translation id="388237772682176890">SPDY/3.1 പിന്തുണ നീക്കംചെയ്തതിനാൽ ഈ നയം M53-ൽ അവസാനിപ്പിച്ച്, M54-ൽ നിന്ന് നീക്കംചെയ്തു. <ph name="PRODUCT_NAME" /> എന്നതിലെ SPDY പ്രോട്ടോക്കോളിന്റെ ഉപയോഗം പ്രവർത്തനരഹിതമാക്കുന്നു. @@ -1337,7 +1342,7 @@ നയ മൂല്യം സെക്കൻഡുകളിൽ വ്യക്തമാക്കണം. മൂല്യങ്ങൾ കുറഞ്ഞത് 3600 ആയി സംയോജിപ്പിച്ചിരിക്കുന്നു (ഒരു മണിക്കൂർ).</translation> <translation id="4203879074082863035">വൈറ്റ്ലിസ്റ്റിൽ ഉള്ള പ്രിന്ററുകൾ മാത്രമാണ് ഉപയോക്താക്കളെ കാണിക്കുന്നത്</translation> -<translation id="420512303455129789">ഹോസ്റ്റിലേക്കുള്ള ആക്സസ്സ് അനുവദിക്കുകയോ (true) തടയുകയോ (false) ചെയ്യേണ്ടതുണ്ടോയെന്ന് വ്യക്തമാക്കുന്ന ഒരു ബൂളിയൻ ഫ്ലാഗിലേയ്ക്ക് നിഘണ്ടു ഹോസ്റ്റ്നെയിമുകൾ മാപ്പുചെയ്യുന്നു. +<translation id="420512303455129789">ഹോസ്റ്റിലേക്കുള്ള ആക്സസ്സ് അനുവദിക്കണോ (ശരി) ബ്ലോക്ക് ചെയ്യണോ (തെറ്റ്) എന്ന് വ്യക്തമാക്കുന്ന ഒരു ബുലിയൻ ഫ്ലാഗിലേക്ക്, URL-കൾ മാപ്പ് ചെയ്യുന്ന നിഘണ്ടു. ഈ നയം <ph name="PRODUCT_NAME" />-ന്റെ ആന്തരിക ഉപയോഗത്തിന് മാത്രമുള്ളതാണ്.</translation> <translation id="4224610387358583899">സ്ക്രീൻ ലോക്കുചെയ്യൽ കാലതാമസസമയം</translation> @@ -1420,11 +1425,11 @@ ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ OS അപ്ഗ്രേഡിനുശേഷം ബ്രൗസർ ആദ്യ സമാരംഭിക്കലിൽ വീണ്ടും സ്വാഗത പേജ് കാണിക്കില്ല.</translation> <translation id="4418726081189202489">ഈ നയം "false" എന്ന് സജ്ജീകരിക്കുന്നത്, കൃത്യമായ ടൈംസ്റ്റാമ്പ് വീണ്ടെടുക്കാൻ ഇടയ്ക്കിടെ Google സെർവറിലേക്ക് ചോദ്യങ്ങൾ അയയ്ക്കുന്നതിൽ നിന്ന് <ph name="PRODUCT_NAME" /> എന്നതിനെ തടയുന്നു. ഈ ചോദ്യങ്ങൾ 'True' എന്ന് സജ്ജീകരിക്കുകയാണെങ്കിലോ അല്ലെങ്കിൽ ഒന്നും സജ്ജീകരിക്കാതിരിക്കുകയാണെങ്കിലോ ചോദ്യങ്ങൾ പ്രവർത്തനക്ഷമമാക്കപ്പെടും.</translation> <translation id="4423597592074154136">പ്രോക്സി ക്രമീകരണങ്ങള് കരകൃതമായി ക്രമീകരിക്കുക</translation> -<translation id="4429220551923452215">ബുക്ക്മാർക്ക് ബാറിലെ അപ്ലിക്കേഷൻ കുറുക്കുവഴികൾ പ്രവർത്തനക്ഷമമാക്കുന്നു അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുന്നു. +<translation id="4429220551923452215">ബുക്ക്മാർക്ക് ബാറിലെ ആപ്പ് കുറുക്കുവഴികൾ പ്രവർത്തനക്ഷമമാക്കുകയോ പ്രവർത്തനരഹിതമാക്കുകയോ ചെയ്യുന്നു. - ഈ നയം സജ്ജമാക്കിയില്ലെങ്കിൽ, ബുക്ക്മാർക്ക് ബാർ സന്ദർഭ മെനുവിൽ നിന്ന് അപ്ലിക്കേഷനുകൾ കാണിക്കാനോ മറയ്ക്കാനോ ഉപയോക്താവിന് തിരഞ്ഞെടുക്കാം. + ഈ നയം സജ്ജമാക്കിയില്ലെങ്കിൽ, ബുക്ക്മാർക്ക് ബാർ സന്ദർഭ മെനുവിൽ ആപ്പ് കുറുക്കുവഴികൾ കാണിക്കണോ മറയ്ക്കണോയെന്ന് ഉപയോക്താവിന് തിരഞ്ഞെടുക്കാം. - ഈ നയം കോൺഫിഗർ ചെയ്തുവെങ്കിൽ, ഉപയോക്താവിന് ഇത് മാറ്റാനാകില്ല, ഒപ്പം അപ്ലിക്കേഷനുകളുടെ കുറുക്കുവഴികൾ എപ്പോഴും കാണിക്കും അല്ലെങ്കിൽ ഒരിക്കലും കാണിക്കില്ല.</translation> + ഈ നയം കോൺഫിഗർ ചെയ്തുവെങ്കിൽ, ഉപയോക്താവിന് ഇത് മാറ്റാനാകില്ല, കൂടാതെ ആപ്പ് കുറുക്കുവഴികൾ എപ്പോഴും കാണിക്കുകയോ അല്ലെങ്കിൽ ഒരിക്കലും കാണിക്കാതിരിക്കുകയോ ചെയ്തേക്കാം.</translation> <translation id="4432762137771104529">സുരക്ഷിത ബ്രൗസിംഗിന്റെ വിപുലീകൃത റിപ്പോർട്ടിംഗ് പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="443454694385851356">ലെഗസി (സുരക്ഷിതമല്ലാത്തത്)</translation> <translation id="443665821428652897">ബ്രൗസർ ഷട്ട് ഡൗൺ ചെയ്യുമ്പോൾ സൈറ്റ് ഡാറ്റ മായ്ക്കുക (ഒഴിവാക്കിയത്)</translation> @@ -1488,6 +1493,10 @@ സാധ്യമായ ക്രമീകരണത്തിന്റെയും ഈ നയത്തിന്റെ ഘടനയുടെയും പൂർണ്ണ വിവരത്തിന് https://www.chromium.org/administrators/policy-list-3/extension-settings-full സന്ദർശിക്കുക </translation> <translation id="4554651132977135445">ഉപയോക്തൃ നയം ലൂപ്പ്ബാക്ക് പ്രോസസ്സ് ചെയ്യൽ മോഡ്</translation> +<translation id="4554841826517980623">നെറ്റ്വർക്കിലെ പങ്കിടലുകൾ കണ്ടെത്താൻ, <ph name="PRODUCT_NAME" />-ന് ഉള്ള നെറ്റ്വർക്ക് ഫയൽ പങ്കിടൽ ഫീച്ചർ <ph name="NETBIOS_PROTOCOL" /> ഉപയോഗിക്കണോ എന്നത് ഈ നയം നിയന്ത്രിക്കുന്നു. + നയം 'ട്രൂ' ആയി സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, നെറ്റ്വർക്കിലെ പങ്കിടലുകൾ കണ്ടെത്താൻ, പങ്കിടൽ കണ്ടെത്തൽ <ph name="NETBIOS_PROTOCOL" /> പ്രോട്ടോക്കോൾ ഉപയോഗിക്കും. + നയം 'ഫാൾസ്' ആയി സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, പങ്കിടലുകൾ കണ്ടെത്താൻ, പങ്കിടൽ കണ്ടെത്തൽ <ph name="NETBIOS_PROTOCOL" /> പ്രോട്ടോക്കോൾ ഉപയോഗിക്കില്ല. + നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, എന്റർപ്രൈസ് നിയന്ത്രിക്കുന്ന ഉപയോക്താക്കൾക്ക് ഡിഫോൾട്ട് പ്രവർത്തനരഹിതമാവുകയും നിയന്ത്രിക്കാത്ത ഉപയോക്താക്കൾക്ക് പ്രവർത്തനക്ഷമമാവുകയും ചെയ്യും.</translation> <translation id="4555850956567117258">ഉപയോക്താവിനായി വിദൂര അറ്റസ്റ്റേഷൻ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="4557134566541205630">സ്ഥിര തിരയൽ ദാതാവിന്റെ പുതിയ ടാബ് പേജ് URL</translation> <translation id="4567137030726189378">ഡെവലപ്പർ ടൂളുകളുടെ ഉപയോഗം അനുവദിക്കുക</translation> @@ -1632,24 +1641,22 @@ <translation id="4962262530309732070">ഈ നയം 'ശരി' എന്ന് സജ്ജമാക്കുകയോ കോൺഫിഗർചെയ്യാതിരിക്കുകയോ ആണെങ്കിൽ, ഉപയോക്തൃ മാനേജറിൽ നിന്ന് വ്യക്തിയെ ചേർക്കാൻ <ph name="PRODUCT_NAME" /> അനുവദിക്കും. ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്തൃ മാനേജറിൽ നിന്ന് പുതിയ പ്രൊഫൈലുകൾ സൃഷ്ടിക്കാൻ <ph name="PRODUCT_NAME" /> അനുവദിക്കില്ല.</translation> -<translation id="4971529314808359013">സൈറ്റ് ഒരു സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥിക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_NAME" /> സ്വയമേവ ഒരു ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുന്നതിനായി സൈറ്റുകളെ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്റ്റ് സൂചിപ്പിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. +<translation id="4971529314808359013">സൈറ്റ് ഒരു സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥിക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_NAME" /> സ്വമേധയാ ഒരു ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുന്നതിനായി സൈറ്റുകളെ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്റ്റ് സൂചിപ്പിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. - മൂല്യം സ്ട്രിംഗിഫൈ ചെയ്ത JSON നിഘണ്ടുക്കളുടെ ഒരു അറേ ആയിരിക്കണം. ഓരോ നിഘണ്ടുവും { "pattern": "$URL_PATTERN", "filter" : $FILTER } എന്ന രൂപത്തിലായിരിക്കണം, അതിൽ $URL_PATTERN ഒരു ഉള്ളടക്ക ക്രമീകരണ പാറ്റേൺ ആണ്. ഏത് ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെയാണ് ബ്രൗസർ സ്വയമേവ തിരഞ്ഞെടുക്കുന്നതെന്ന് $FILTER നിയന്ത്രിക്കുന്നു. ഫിൽട്ടറിനെ ആശ്രയിക്കാതെ, സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥനയുമായി പൊരുത്തപ്പെടുന്ന സർട്ടിഫിക്കറ്റുകളെ മാത്രം തിരഞ്ഞെടുക്കും. $FILTER എന്നത് { "ISSUER": { "CN": "$ISSUER_CN" } } രീതിയിലാണെങ്കിൽ, CommonName $ISSUER_CN ഉള്ള ഒരു സർട്ടിഫിക്കറ്റ് നൽകുന്ന ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെ മാത്രമേ കൂടുതലായി തിരഞ്ഞെടുക്കൂ. $FILTER ശൂന്യ {} നിഘണ്ടുവാണെങ്കിൽ, ക്ലയന്റ് സർട്ടിഫിക്കറ്റിന്റെ തിരഞ്ഞെടുക്കലിനെ കൂടുതലായി നിയന്ത്രിക്കുന്നതല്ല. + മൂല്യം സ്ട്രിംഗിഫൈ ചെയ്ത JSON നിഘണ്ടുക്കളുടെ ഒരു അറേ ആയിരിക്കണം. ഓരോ നിഘണ്ടുവും { "pattern": "$URL_PATTERN", "filter" : $FILTER } എന്ന രൂപത്തിലായിരിക്കണം, അതിൽ $URL_PATTERN ഒരു ഉള്ളടക്ക ക്രമീകരണ പാറ്റേൺ ആണ്. ഏത് ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെയാണ് ബ്രൗസർ സ്വമേധയാ തിരഞ്ഞെടുക്കുന്നതെന്ന് $FILTER നിയന്ത്രിക്കുന്നു. ഫിൽട്ടറിനെ ആശ്രയിക്കാതെ, സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥനയുമായി പൊരുത്തപ്പെടുന്ന സർട്ടിഫിക്കറ്റുകളെ മാത്രം തിരഞ്ഞെടുക്കും. $FILTER എന്നത് { "ISSUER": { "CN": "$ISSUER_CN" } } രീതിയിലാണെങ്കിൽ, CommonName $ISSUER_CN ഉള്ള ഒരു സർട്ടിഫിക്കറ്റ് നൽകുന്ന ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെ മാത്രമേ കൂടുതലായി തിരഞ്ഞെടുക്കൂ. $FILTER ശൂന്യ {} നിഘണ്ടുവാണെങ്കിൽ, ക്ലയന്റ് സർട്ടിഫിക്കറ്റിന്റെ തിരഞ്ഞെടുക്കലിനെ കൂടുതലായി നിയന്ത്രിക്കുന്നതല്ല. - ഈ നയത്തെ സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഒരു സൈറ്റിനായും സ്വയമേവയുള്ള തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം നടത്തുന്നതല്ല.</translation> + ഈ നയത്തെ സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഒരു സൈറ്റിനായും സ്വമേധാ തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം നടത്തുന്നതല്ല.</translation> <translation id="4978405676361550165">"OffHours" പോളിസി സജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, നിശ്ചിത സമയ ഇടവേളകളിൽ നിർദ്ദിഷ്ട ഉപകരണ നയങ്ങൾ അവഗണിക്കപ്പെടും (ഈ നയങ്ങളുടെ ഡിഫോൾട്ട് ക്രമീകരണം ഉപയോഗിക്കുക). "OffHours" കാലയളവ് ആരംഭിക്കുകയോ അവസാനിക്കുകയോ ചെയ്യുമ്പോൾ Chrome വീണ്ടും എല്ലാ ഇവന്റിലും ഉപകരണ നയങ്ങൾ ബാധകമാക്കും. "OffHours" സമയം അവസാനിക്കുമ്പോഴും ഉപകരണ നയ ക്രമീകരണം മാറുമ്പോഴും (ഉദാഹരണത്തിന്, അനുവദനീയമല്ലാത്ത അക്കൗണ്ട് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യുമ്പോൾ) ഉപയോക്താവിനെ അറിയിക്കുകയും നിർബന്ധിതമായി സൈൻ ഔട്ട് ആക്കുകയും ചെയ്യുന്നു.</translation> <translation id="4980635395568992380">ഡാറ്റാ തരം:</translation> <translation id="4983201894483989687">കാലാവധി തീര്ന്ന പ്ലഗിനുകള് പ്രവര്ത്തിപ്പിക്കാന് അനുവദിക്കുക</translation> <translation id="4988291787868618635">നിഷ്ക്രിയ കാലതാമസമാകുമ്പോൾ നടത്തേണ്ട പ്രവർത്തനം</translation> <translation id="4995548127349206948">NTLMv2 പരിശോധിച്ചുറപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടോ എന്ന്.</translation> <translation id="5047604665028708335">ഉള്ളടക്ക പാക്കുകളുടെ പുറത്തുള്ള സൈറ്റുകളിലേക്ക് ആക്സസ്സ് അനുവദിക്കുക</translation> -<translation id="5052081091120171147">നിലവിലെ സ്ഥിരസ്ഥിതി ബ്രൗസർ പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിന്നും ബ്രൗസിംഗ് ചരിത്രം ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയം ഇംപോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. +<translation id="5052081091120171147">പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നും ബ്രൗസിംഗ് ചരിത്രം ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയം ഇംപോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. - അപ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ബ്രൗസിംഗ് ചരിത്രം ഒന്നുംതന്നെ ഇംപോർട്ട് ചെയ്യില്ല. + പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ബ്രൗസിംഗ് ചരിത്രം ഒന്നും തന്നെ ഇംപോർട്ട് ചെയ്യില്ല. - ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ അല്ലെങ്കിൽ ഇംപോർട്ട് ചെയ്യൽ - -സ്വയമേവ സംഭവിക്കേണ്ടതുണ്ടോ എന്ന് ഉപയോക്താവിനോട് ആവശ്യപ്പെട്ടേക്കാം.</translation> + ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ എന്ന് ഉപയോക്താവിനോട് ചോദിക്കുകയോ അല്ലെങ്കിൽ സ്വമേധയാ ഇംപോർട്ട് ചെയ്യലോ സംഭവിച്ചേക്കാം.</translation> <translation id="5056708224511062314">സ്ക്രീൻ മാഗ്നിഫയർ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="5058573563327660283">സ്വമേധയാലുള്ള ക്ലീൻ അപ്പിനിടെ ഡിസ്കിൽ, ഇടമുണ്ടാക്കാൻ ഉപയോഗിക്കുന്ന സ്ട്രാറ്റജി, തിരഞ്ഞെടുക്കുക (ഒഴിവാക്കി).</translation> <translation id="5067143124345820993">ലോഗിൻ ഉപയോക്താവിന്റെ വൈറ്റ് ലിസ്റ്റ്</translation> @@ -1707,9 +1714,9 @@ ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, ഇത് പ്രാപ്തമാക്കും പക്ഷെ ഉപയോക്താവിന് ഇത് മാറ്റാൻ കഴിയും.</translation> <translation id="5196805177499964601">ഡെവലപ്പർ മോഡ് തടയുക. - ഈ നയം True ആയി സജ്ജമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> എന്നത് ഉപകരണത്തെ ഡെവലപ്പർ മോഡിലേക്ക് ബൂട്ടുചെയ്യുന്നതിൽ നിന്ന് തടയും. ഡെവലപ്പർ സ്വിച്ച് ഓണാക്കുമ്പോൾ സിസ്റ്റം ബൂട്ട് ചെയ്യാൻ നിരസിക്കുകയും ഒരു പിശക് സ്ക്രീൻ കാണിക്കുകയും ചെയ്യും. + ഈ നയം 'ശരി' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> എന്നത് ഉപകരണത്തെ ഡെവലപ്പർ മോഡിലേക്ക് ബൂട്ട് ചെയ്യുന്നതിൽ നിന്ന് തടയും. ഡെവലപ്പർ സ്വിച്ച് ഓണാക്കുമ്പോൾ സിസ്റ്റം ബൂട്ട് ചെയ്യാൻ നിരസിക്കുകയും ഒരു പിശക് സ്ക്രീൻ കാണിക്കുകയും ചെയ്യും. - ഈ നയം സജ്ജമാക്കിയത് മാറ്റുകയാണെങ്കിലോ False ആയി സജ്ജമാക്കുകയാണെങ്കിലോ, ഡെവലപ്പർ മോഡ് ഉപകരണത്തിനായി തുടർന്നും ലഭിക്കും.</translation> + ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ 'തെറ്റ്' ആയി സജ്ജമാക്കുകയാണെങ്കിലോ, ഡെവലപ്പർ മോഡ് ഉപകരണത്തിനായി തുടർന്നും ലഭിക്കും.</translation> <translation id="520403427390290017">CPU, ഏറെക്കാലമായി ഉപയോഗിക്കാതിരുന്ന റൺ ചെയ്യുന്ന ടാബുകളുമായി ബന്ധപ്പെട്ട മെമ്മറി എന്നിവ ആദ്യം ത്രോട്ടിൽ ചെയ്തും തുടർന്ന് ഫ്രീസ് ചെയ്തും അവസാനമായി റദ്ദാക്കിയും 'ടാബ് ലൈഫ്സൈക്കിളുകൾ' ഫീച്ചർ വീണ്ടെടുക്കുന്നു. ഈ നയം തെറ്റ് ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, 'ടാബ് ലൈഫ്സൈക്കിളുകൾ' പ്രവർത്തനരഹിതമായിരിക്കും, എല്ലാ ടാബുകളും സാധാരണ രീതിയിൽ റൺ ചെയ്യും. @@ -1777,9 +1784,9 @@ <translation id="5365946944967967336">ഉപകരണബാറില് ഹോം ബട്ടണ് കാണിക്കുക</translation> <translation id="5366745336748853475">സൈറ്റ് ഒരു സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥിക്കുകയാണെങ്കിൽ, SAML ഫ്ലോ ഹോസ്റ്റ് ചെയ്യുന്ന ഫ്രെയിമിലെ സൈൻ ഇൻ സ്ക്രീനിൽ ഒരു ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് സ്വമേധയാ തിരഞ്ഞെടുക്കുന്നതിന് സൈറ്റുകൾ വ്യക്തമാക്കാൻ URL പാറ്റേണുകളുടെ ലിസ്റ്റ് നിർദ്ദേശിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. SAML IdP-യ്ക്ക് സമർപ്പിക്കേണ്ട, ഉപകരണത്തിൽ ഉടനീളം പ്രാബല്യമുള്ള സർട്ടിഫിക്കറ്റ് കോൺഫിഗർ ചെയ്യുക എന്നതാണ് ഒരു ഉദാഹരണ ഉപയോഗം. - മൂല്യം, സ്ട്രിംഗിഫൈ ചെയ്ത JSON നിഘണ്ടുക്കളുടെ ഒരു അറേ ആയിരിക്കണം. ഓരോ നിഘണ്ടുവും { "pattern": "$URL_PATTERN", "filter" : $FILTER } എന്ന രൂപത്തിലായിരിക്കണം, അതിൽ $URL_PATTERN ഒരു ഉള്ളടക്ക ക്രമീകരണ പാറ്റേൺ ആണ്. ഏത് ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെയാണ് ബ്രൗസർ സ്വയമേവ തിരഞ്ഞെടുക്കുന്നതെന്ന് $FILTER നിയന്ത്രിക്കുന്നു. ഫിൽട്ടറിനെ ആശ്രയിക്കാതെ, സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥനയുമായി പൊരുത്തപ്പെടുന്ന സർട്ടിഫിക്കറ്റുകളെ മാത്രം തിരഞ്ഞെടുക്കും. $FILTER എന്നത് { "ISSUER": { "CN": "$ISSUER_CN" } } രീതിയിലാണെങ്കിൽ, CommonName $ISSUER_CN ഉള്ള ഒരു സർട്ടിഫിക്കറ്റ് നൽകുന്ന ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെ മാത്രമേ കൂടുതലായി തിരഞ്ഞെടുക്കൂ. $FILTER ശൂന്യ {} നിഘണ്ടുവാണെങ്കിൽ, ക്ലയന്റ് സർട്ടിഫിക്കറ്റിന്റെ തിരഞ്ഞെടുക്കലിനെ കൂടുതലായി നിയന്ത്രിക്കുന്നതല്ല. + മൂല്യം, സ്ട്രിംഗിഫൈ ചെയ്ത JSON നിഘണ്ടുക്കളുടെ ഒരു അറേ ആയിരിക്കണം. ഓരോ നിഘണ്ടുവും { "pattern": "$URL_PATTERN", "filter" : $FILTER } എന്ന രൂപത്തിലായിരിക്കണം, അതിൽ $URL_PATTERN ഒരു ഉള്ളടക്ക ക്രമീകരണ പാറ്റേൺ ആണ്. ഏത് ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെയാണ് ബ്രൗസർ സ്വമേധയാ തിരഞ്ഞെടുക്കുന്നതെന്ന് $FILTER നിയന്ത്രിക്കുന്നു. ഫിൽട്ടറിനെ ആശ്രയിക്കാതെ, സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥനയുമായി പൊരുത്തപ്പെടുന്ന സർട്ടിഫിക്കറ്റുകളെ മാത്രം തിരഞ്ഞെടുക്കും. $FILTER എന്നത് { "ISSUER": { "CN": "$ISSUER_CN" } } രീതിയിലാണെങ്കിൽ, CommonName $ISSUER_CN ഉള്ള ഒരു സർട്ടിഫിക്കറ്റ് നൽകുന്ന ക്ലയന്റ് സർട്ടിഫിക്കറ്റുകളെ മാത്രമേ കൂടുതലായി തിരഞ്ഞെടുക്കൂ. $FILTER ശൂന്യ {} നിഘണ്ടുവാണെങ്കിൽ, ക്ലയന്റ് സർട്ടിഫിക്കറ്റിന്റെ തിരഞ്ഞെടുക്കലിനെ കൂടുതലായി നിയന്ത്രിക്കുന്നതല്ല. - ഈ നയത്തെ സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഒരു സൈറ്റിനായും സ്വമേധയായുള്ള തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം നടത്തുന്നതല്ല.</translation> + ഈ നയത്തെ സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഒരു സൈറ്റിനായും സ്വമേധയായുള്ള തിരഞ്ഞെടുക്കൽ പ്രവർത്തനം നടക്കുന്നതല്ല.</translation> <translation id="5366977351895725771">false എന്നതായി സജ്ജമാക്കുകയാണെങ്കിൽ, ഈ ഉപയോക്താവ് മുഖേന സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവിനെ സൃഷ്ടിക്കൽ പ്രവർത്തനരഹിതമാകും. നിലവിലുള്ള സൂപ്പർവൈസുചെയ്ത ഉപയോക്താക്കളെല്ലാം തുടർന്നും ലഭ്യമാകും. true എന്നതായി സജ്ജമാക്കുകയോ കോൺഫിഗർ ചെയ്യാതിരിക്കുകയോ ആണെങ്കിൽ, ഈ ഉപയോക്താവിന് സൂപ്പർവൈസുചെയ്ത ഉപയോക്താക്കളെ സൃഷ്ടിക്കാനും നിയന്ത്രിക്കാനും കഴിയും.</translation> @@ -1807,11 +1814,11 @@ ഈ നയം പ്രവർത്തനരഹിതമായിരിക്കുമ്പോൾ, ഉപയോക്താവിനോട് ഒരിക്കലും ആവശ്യപ്പെടില്ല ഒപ്പം AudioCaptureAllowedUrls-കളിൽ കോൺഫിഗർ ചെയ്ത URL-കൾക്ക് മാത്രമേ വീഡിയോ ലഭ്യമാകൂ. എല്ലാ തരത്തിലുമുള്ള ഓഡിയോ ഇൻപുട്ടുകൾക്കും ഈ നയം ബാധകമാണ്, അന്തർനിർമ്മിത മൈക്രോഫോണിന് മാത്രം നയം ബാധകമല്ല.</translation> -<translation id="5423001109873148185">നിലവിലെ സ്ഥിരസ്ഥിതി ബ്രൗസർ പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിന്നും തിരയൽ എഞ്ചിനുകൾ ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. +<translation id="5423001109873148185">പ്രവർത്തനക്ഷമമാണെങ്കിൽ, നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നും തിരയൽ എഞ്ചിനുകൾ ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. - അപ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, തിരയൽ എഞ്ചിൻ ഇംപോർട്ട് ചെയ്യില്ല. + പ്രവർത്തനരഹിതമാണെങ്കിൽ, തിരയൽ എഞ്ചിൻ ഇംപോർട്ട് ചെയ്യില്ല. - ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ അല്ലെങ്കിൽ ഇംപോർട്ട് ചെയ്യൽ സ്വയമേവ സംഭവിക്കേണ്ടതുണ്ടോ എന്ന് ഉപയോക്താവിനോട് ചോദിച്ചേക്കാം.</translation> + ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ എന്ന് ഉപയോക്താവിനോട് ചോദിച്ചേക്കാം. അല്ലെങ്കിൽ സ്വമേധയാലുളള ഇംപോർട്ട് ചെയ്യലോ സംഭവിച്ചേക്കാം.</translation> <translation id="5423197884968724595">Android WebView നിയന്ത്രണത്തിന്റെ പേര്:</translation> <translation id="5437733496511628148">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നത് ഡൊമെയ്നുകളിൽ നിന്നുമുള്ളതല്ലാത്ത, ബ്രൗസറിന്റെ വിലാസ ബാറിൽ നിന്നുമുള്ള വെബ് പേജ് ഘടകങ്ങൾ ഉപയോഗിച്ച് കുക്കികളെ തടയുന്നു. @@ -1821,8 +1828,8 @@ <translation id="5442026853063570579">ഈ നയം Android ഡെവലപ്പർ ഓപ്ഷനുകളിലേക്കുള്ള ആക്സസിനെയും നിയന്ത്രിക്കുന്നു. ഈ നയം 'DeveloperToolsDisallowed' (മൂല്യം 2) എന്നായി സജ്ജീകരിക്കുന്നുവെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഡെവലപ്പർ ഓപ്ഷനുകൾ ആക്സസ് ചെയ്യാനാവില്ല. ഈ നയം മറ്റൊരു മൂല്യത്തിലേക്ക് സജ്ജീകരിക്കുക്കയോ ഒന്നും സജ്ജീകരിക്കാതെ വിടുകയോ ചെയ്താൽ Android ക്രമീകരണ ആപ്പിലെ ബിൽഡ് നമ്പറിൽ ഏഴ് തവണ ടാപ്പ് ചെയ്ത്, ഉപയോക്താക്കൾക്ക് ഡെവലപ്പർ ഓപ്ഷനുകൾ ആക്സസ് ചെയ്യാനാകും.</translation> <translation id="5447306928176905178">റിപ്പോർട്ടിംഗ് മെമ്മറി വിവരം (JS ബൃഹത് വലുപ്പം) പേജിൽ പ്രവർത്തനക്ഷമമാക്കുന്നു (ഒഴിവാക്കിയത്)</translation> <translation id="5457065417344056871">ബ്രൗസറിൽ അതിഥിമോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation> -<translation id="5457924070961220141"><ph name="PRODUCT_FRAME_NAME" /> ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ സ്ഥിരസ്ഥിതി HTML റെൻഡറർ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. - ഈ നയം സജ്ജമാക്കാതെ ഹോസ്റ്റ് ബ്രൗസറിന് റെൻഡറിംഗ് നടത്താൻ അനുവദിക്കുമ്പോൾ സ്ഥിരസ്ഥിതി ക്രമീകരണം ഉപയോഗിക്കപ്പെടും, പക്ഷെ നിങ്ങൾക്കിത് ഓപ്ഷണലായി മറികടക്കാനാകും, കൂടാതെ സ്ഥിരസ്ഥിതിയായി <ph name="PRODUCT_FRAME_NAME" /> റെൻഡർ HTML പേജുകൾ ഉണ്ടാകും.</translation> +<translation id="5457924070961220141"><ph name="PRODUCT_FRAME_NAME" /> ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുമ്പോൾ ഡിഫോൾട്ട് HTML റെൻഡറർ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. + ഈ നയം സജ്ജമാക്കാതെ വിടുമ്പോഴുള്ള ഡിഫോൾട്ട് ക്രമീകരണം ഹോസ്റ്റ് ബ്രൗസറിന് റെൻഡറിംഗ് നടത്താൻ അനുവദിക്കുന്നുവെന്നതാണ്. പക്ഷെ നിങ്ങൾക്കിത് ഓപ്ഷണലായി മറികടക്കാനാകും, കൂടാതെ ഡിഫോൾട്ടായി HTML പേജുകൾ <ph name="PRODUCT_FRAME_NAME" />-ന് റെൻഡർ ചെയ്യാനാകും.</translation> <translation id="5464816904705580310">നിയന്ത്രിത ഉപയോക്താക്കൾക്കുള്ള കോൺഫിഗർ ക്രമീകരണങ്ങൾ.</translation> <translation id="546726650689747237">AC പവറിൽ പ്രവർത്തിക്കുമ്പോൾ സ്ക്രീൻ തെളിച്ചം കുറയുന്നതിന്റെ കാലതാമസം</translation> <translation id="5469825884154817306">ഈ സൈറ്റുകളില് ഇമേജ് തടയുക</translation> @@ -1844,7 +1851,7 @@ ഈ നയത്തിന്റെ മൂല്യം സജ്ജമാക്കുകയും അത് 0 അല്ലാതിരിക്കുകയും ചെയ്യുകയാണെങ്കിൽ വ്യക്തമാക്കിയ കാലാവധിയുടെ നിഷ്ക്രിയ സമയം കഴിയുമ്പോൾ, നിലവിൽ ലോഗിൻ ചെയ്തിരിക്കുന്ന ഡെമോ ഉപയോക്താവ് സ്വയമേവ ലോഗ് ഔട്ടാകും. നയത്തിന്റെ മൂല്യം മില്ലിസെക്കന്റിൽ വ്യക്തമാക്കേണ്ടതാണ്.</translation> -<translation id="5511702823008968136">ബുക്ക്മാര്ക്ക് ബാര് പ്രാപ്തമാക്കുക</translation> +<translation id="5511702823008968136">ബുക്ക്മാര്ക്ക് ബാര് പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="5512418063782665071">ഹോം പേജ് URL</translation> <translation id="551639594034811656">അപ്ഡേറ്റ് ആദ്യം കണ്ടെത്തിയ ദിവസം മുതലുള്ള ഓരോ ആഴ്ചയിലും അപ്ഡേറ്റ് ചെയ്യാനുള്ള, OU-വിലെ <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങളുടെ ഒരു ഭാഗത്തെ നിർവചിക്കുന്ന ശതമാനങ്ങളുടെ ഒരു ലിസ്റ്റിനെ ഈ നയം നിർവചിക്കുന്നു. അപ്ഡേറ്റ് പ്രസിദ്ധീകരിച്ച് അൽപ്പസമയത്തിന് ശേഷമാവും ഉപകരണം അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുക എന്നതിനാൽ, അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം അത് പ്രസിദ്ധീകരിച്ചതിന് ശേഷമുള്ളതായിരിക്കും. @@ -1913,7 +1920,7 @@ <translation id="5630352020869108293">അവസാന സെഷൻ പുനഃസ്ഥാപിക്കുക</translation> <translation id="5645779841392247734">ഈ സൈറ്റുകളില് കുക്കികള് അനുവദിക്കുക</translation> <translation id="5693469654327063861">ഡാറ്റ മൈഗ്രേഷൻ അനുവദിക്കുക</translation> -<translation id="5694594914843889579">ഈ നയം ശരിയെന്ന് സജ്ജമാക്കിയിരിക്കുമ്പോൾ, ഫയൽ ബ്രൗസറിൽ എക്സ്റ്റേണൽ സ്റ്റോറേജ് ലഭ്യമാകില്ല. +<translation id="5694594914843889579">ഈ നയം ശരി എന്ന് സജ്ജമാക്കിയിരിക്കുമ്പോൾ, ഫയൽ ബ്രൗസറിൽ എക്സ്റ്റേണൽ സ്റ്റോറേജ് ലഭ്യമാകില്ല. ഈ നയം എല്ലാ തരത്തിലുമുള്ള സ്റ്റോറേജ് മീഡിയയ്ക്കും ബാധകമാണ്. ഉദാഹരണത്തിന്: USB ഫ്ലാഷ് ഡ്രൈവുകൾ, എക്സ്റ്റേണൽ ഹാർഡ് ഡ്രൈവുകൾ, SD-യും മറ്റ് മെമ്മറികാർഡുകളും, ഓപ്റ്റിക്കൽ സ്റ്റോറേജ് എന്നിവ. ഇന്റേണൽ സ്റ്റോറേജിന് ബാധകമല്ലാത്തതിനാൽ, ഡൗൺലോഡ് ഫോൾഡറിൽ സംരക്ഷിച്ച ഫയലുകൾ തുടർന്നും ആക്സസ് ചെയ്യാനാവും. Google ഡ്രൈവിനും ഈ നയം ബാധകമല്ല. @@ -1927,7 +1934,7 @@ ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ false എന്നായി സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിലോ, <ph name="PRODUCT_NAME" /> നിലവിലുള്ള ഓൺലൈൻ അസാധുവാക്കൽ പരിശോധനാ ക്രമീകരണങ്ങൾ ഉപയോഗിക്കും.</translation> <translation id="5728154254076636808"><ph name="PRODUCT_NAME" /> പ്രൊഫൈൽ ഡാറ്റയുടെ റോമിംഗ് പകർപ്പുകൾ സൃഷ്ടിക്കാൻ അനുവദിക്കുക</translation> -<translation id="5732972008943405952">ആദ്യമായി റൺ ചെയ്യുമ്പോൾ സ്ഥിര ബ്രൗസറിൽ നിന്നും ഓട്ടോഫിൽ ഫോം ഇമ്പോർട്ടുചെയ്യുക</translation> +<translation id="5732972008943405952">ആദ്യമായി റൺ ചെയ്യുമ്പോൾ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നും ഓട്ടോഫിൽ ഫോം ഇമ്പോർട്ട് ചെയ്യുക</translation> <translation id="5741810844420698449">ഈ നയം സജ്ജമാക്കിയാൽ, ഉപയോക്താവ് ലിഡ് അടയ്ക്കുമ്പോൾ <ph name="PRODUCT_OS_NAME" /> ചെയ്യേണ്ട പ്രവർത്തനം വ്യക്തമാക്കുന്നു. ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, താൽക്കാലികമായി നിർത്തിയ സ്ഥിര പ്രവർത്തനം നടപ്പിലാക്കും. @@ -1984,6 +1991,7 @@ ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ആദ്യമായി ലോഗിൻ സ്ക്രീൻ ദൃശ്യമാകുമ്പോൾ സംഭാഷണ ഫീഡ്ബാക്ക് പ്രവർത്തനരഹിതമാകും. ഉപയോക്താക്കൾക്ക് ഏതുസമയത്തും സംഭാഷണ ഫീഡ്ബാക്ക് പ്രവർത്തനക്ഷമമാക്കാനോ പ്രവർത്തനരഹിതമാക്കാനോ കഴിയും, ഒപ്പം ലോഗിൻ സ്ക്രീനിൽ ഉപയോക്താക്കൾക്കിടയിൽ അതിന്റെ നില തുടരുകയും ചെയ്യും.</translation> <translation id="5868414965372171132">ഉപയോക്തൃ-തല നെറ്റ്വർക്ക് കോൺഫിഗറേഷൻ</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> എന്നതിലൂടെ, നെറ്റ്വർക്ക് ഫയൽ പങ്കിടൽ കണ്ടെത്തുന്നത് നിയന്ത്രിക്കുന്നു</translation> <translation id="5883015257301027298">കുക്കികള്ക്കായുള്ള സ്ഥിരസ്ഥിതി ക്രമീകരണം</translation> <translation id="5887414688706570295">TalkGadget പ്രിഫിക്സ് കോൺഫിഗർ ചെയ്യുന്നത്, വിദൂര ആക്സസ്സ് ഹോസ്റ്റുകൾ ഉപയോഗിക്കുകയും ഇത് മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. @@ -2134,11 +2142,11 @@ ഈ ക്രമീകരണത്തെ സജ്ജമാക്കാതെ വിടുകയാണെങ്കിലോ 'ശരി' എന്ന് സജ്ജമാക്കുകയാണെങ്കിലോ, ഉപകരണത്തിൽ ഒരു ഉപയോക്താവ് സജീവമാകുമ്പോൾ എൻറോൾ ചെയ്ത ഉപകരണങ്ങൾ സമയ കാലയളവ് റിപ്പോർട്ടുചെയ്യും. ഈ ക്രമീകരണത്തെ 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപകരണ പ്രവർത്തന സമയങ്ങൾ റെക്കോർഡുചെയ്യുകയോ റിപ്പോർട്ടുചെയ്യുകയോ ഇല്ല.</translation> <translation id="6212868225782276239">ബ്ലാക്ക്ലിസ്റ്റിൽ ഉൾപ്പെടാത്ത എല്ലാ പ്രിന്ററുകളും കാണിക്കുന്നു.</translation> -<translation id="6219965209794245435">പഴയ സ്ഥിര ബ്രൗസർ പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നും ഓട്ടോഫിൽ ഫോം ഡാറ്റ ഇമ്പോർട്ടുചെയ്യാൻ ഈ നയം ആവശ്യപ്പെടും. പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയം ഇമ്പോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. +<translation id="6219965209794245435">പഴയ ഡിഫോൾട്ട് ബ്രൗസർ പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നും ഓട്ടോഫിൽ ഫോം ഡാറ്റ ഇമ്പോർട്ട് ചെയ്യാൻ ഈ നയം നിർബന്ധിക്കും. പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയം ഇമ്പോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഓട്ടോഫിൽ ഫോം ഡാറ്റ ഇമ്പോർട്ട് ചെയ്യില്ല. - സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇമ്പോർട്ട് ചെയ്യണോയെന്നു ചോദിക്കും, അല്ലെങ്കിൽ സ്വയമേവ ഇമ്പോർട്ട് ചെയ്യൽ നടക്കും.</translation> + സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇമ്പോർട്ട് ചെയ്യണോയെന്നു ഉപയോക്താവിനോട് ചോദിച്ചേക്കും, അല്ലെങ്കിൽ സ്വമേധയാ ഇമ്പോർട്ട് ചെയ്യൽ സംഭവിച്ചേക്കാം.</translation> <translation id="6224304369267200483">URL-കൾ/ഡൊമെയ്നുകൾ നേരിട്ടുള്ള സുരക്ഷ കീ അറ്റസ്റ്റേഷൻ സ്വമേധയാ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6233173491898450179">ഡൗൺലോഡ് ഡയറക്ടറി ക്രമീകരിക്കുക</translation> <translation id="6244210204546589761">തുടക്കത്തില് തന്നെ URL-കള് തുറക്കാന്</translation> @@ -2192,7 +2200,7 @@ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയാൽ, മിതമായെങ്കിലും എല്ലായ്പ്പോഴും YouTube-ലെ നിയന്ത്രിത മോഡ് പ്രവർത്തനത്തിൽ വരുത്തുന്നു. ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയോ മൂല്യം ഒന്നും സജ്ജമാക്കാതിരിക്കുകയോ ചെയ്താൽ, YouTube-ൽ നിയന്ത്രിത മോഡ് <ph name="PRODUCT_NAME" /> പ്രവർത്തനത്തിൽ വരുത്തില്ല. എങ്കിലും YouTube നയങ്ങൾ പോലുള്ള എക്സ്റ്റേണൽ നയങ്ങളെ തുടർന്നും നിയന്ത്രിത മോഡ് പ്രവർത്തനത്തിൽ വരുത്തും.</translation> -<translation id="6520802717075138474">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള തിരയൽ എഞ്ചിനുകൾ ഇംപോർട്ട് ചെയ്യുക</translation> +<translation id="6520802717075138474">ആദ്യ റൺ ചെയ്യലിൽ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുള്ള തിരയൽ എഞ്ചിനുകൾ ഇമ്പോർട്ട് ചെയ്യുക</translation> <translation id="6525955212636890608">നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയാൽ, ഉള്ളടക്ക ക്രമീകരണത്തിൽ ഫ്ലാഷ് അനുവദിക്കാൻ -- ഉപയോക്താവ് മുഖേനയോ എന്റർപ്രൈസ് നയം മുഖേനയോ -- സജ്ജീകരിച്ചിട്ടുള്ള വെബ്സൈറ്റുകളിൽ ഉൾച്ചേർത്ത എല്ലാ ഫ്ലാഷ് ഉള്ളടക്കവും, മറ്റ് ഉറവിടങ്ങളിൽ നിന്നുള്ള ഉള്ളടക്കമോ ചെറിയ ഉള്ളടക്കമോ ഉൾപ്പടെ, റൺ ചെയ്യും. ഏതൊക്കെ വെബ്സൈറ്റുകളെ ഫ്ലാഷ് റൺ ചെയ്യാൻ അനുവദിക്കണമെന്ന് നിയന്ത്രിക്കാൻ "DefaultPluginsSetting", "PluginsAllowedForUrls", "PluginsBlockedForUrls" എന്നീ നയങ്ങൾ കാണുക. @@ -2407,11 +2415,11 @@ ചില പ്രോക്സി സെർവറുകൾക്ക് ഓരോ ക്ലയന്റിനും ഒരേ സമയത്തുള്ള കണക്ഷനുകളുടെ ഉയർന്ന എണ്ണം കൈകാര്യം ചെയ്യാൻ കഴിയില്ല, ഈ നയം ഒരു കുറഞ്ഞ മൂല്യത്തിലേക്ക് ക്രമീകരിക്കുന്നതിലൂടെ ഇത് പരിഹരിക്കാൻ കഴിയും. - ഈ നയത്തിന്റെ മൂല്യം 100-ന് താഴെയും 6-ന് മുകളിലും ഒപ്പം സ്ഥിരസ്ഥിതി മൂല്യം 32-ഉം ആയിരിക്കണം. + ഈ നയത്തിന്റെ മൂല്യം 100-ന് താഴെയും 6-ന് മുകളിലും ഒപ്പം ഡിഫോൾട്ട് മൂല്യം 32-ഉം ആയിരിക്കണം. - ചില വെബ് അപ്ലിക്കേഷനുകൾ GET-കൾ ഉപയോഗിച്ച് ധാരാളം കണക്ഷനുകൾ ഉപഭോഗം ചെയ്യുന്നവയാണ്, അതിനാൽ 32-ലും താഴേയ്ക്ക് കുറയ്ക്കുന്നത് ഇത്തരം ധാരാളം വെബ് അപ്ലിക്കേഷനുകൾ തുറന്നിട്ടുണ്ടെങ്കിൽ ബ്രൗസർ നെറ്റ്വർക്കിംഗ് ഹാംഗ് ആകുന്നതിലേക്ക് നയിച്ചേക്കാം. സ്ഥിരസ്ഥിതിയിലും താഴെയായി കുറയ്ക്കുന്നത് നിങ്ങളുടെ ഉത്തരവാദിത്തത്തിൽ ആയിരിക്കും. + ചില വെബ് അപ്ലിക്കേഷനുകൾ GET-കൾ ഉപയോഗിച്ച് ധാരാളം കണക്ഷനുകൾ ഉപഭോഗം ചെയ്യുന്നവയാണ്, അതിനാൽ 32-ലും താഴേയ്ക്ക് കുറയ്ക്കുന്നത് ഇത്തരം ധാരാളം വെബ് അപ്ലിക്കേഷനുകൾ തുറന്നിട്ടുണ്ടെങ്കിൽ ബ്രൗസർ നെറ്റ്വർക്കിംഗ് ഹാംഗ് ആകുന്നതിലേക്ക് നയിച്ചേക്കാം. ഡിഫോൾട്ടിലും താഴെയായി കുറയ്ക്കുന്നത് നിങ്ങളുടെ ഉത്തരവാദിത്തത്തിൽ ആയിരിക്കും. - ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ സ്ഥിരസ്ഥിതി മൂല്യം 32 ഉപയോഗിക്കും.</translation> + ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ ഡിഫോൾട്ട് മൂല്യം 32 ഉപയോഗിക്കും.</translation> <translation id="6943577887654905793">Mac/Linux മുന്ഗണന പേര്:</translation> <translation id="69525503251220566">സ്ഥിര തിരയൽ ദാതാവിനായി പാരാമീറ്റർ, ഇമേജ് പ്രകാരമുള്ള തിരയൽ സവിശേഷത നൽകുന്നു</translation> <translation id="6956272732789158625">കീ സൃഷ്ടിക്കൽ ഉപയോഗിക്കാൻ ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation> @@ -2428,13 +2436,11 @@ 'U2F_EXTENDED' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, സംയോജിപ്പിക്കപ്പെട്ട രണ്ടാമത്തെ ഫാക്ടർ, U2F പ്രവർത്തനങ്ങളും വ്യക്തിഗത സാക്ഷ്യപ്പെടുത്തലിനുള്ള ചില വിപുലീകരണങ്ങളും നൽകും.</translation> <translation id="6997592395211691850">പ്രാദേശിക വിശ്വസനീയ ആങ്കർമാർക്ക് ഓൺലൈൻ OCSP/CRL പരിശോധനകൾ ആവശ്യമാണോയെന്നത്</translation> -<translation id="7003334574344702284">നിലവിലെ സ്ഥിരസ്ഥിതി ബ്രൗസർ പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിന്നും സംരക്ഷിത പാസ്വേഡ് ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയം ഇംപോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. +<translation id="7003334574344702284">പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ സംരക്ഷിത പാസ്വേഡ് ഇമ്പോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ ഈ നയം ഇമ്പോർട്ട് ഡയലോഗിനെയും ബാധിക്കുന്നു. - അപ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, സംരക്ഷിത പാസ്വേഡ് ഒന്നുംതന്നെ ഇംപോർട്ട് ചെയ്യില്ല. + പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, സംരക്ഷിത പാസ്വേഡ് ഒന്നുംതന്നെ ഇംപോർട്ട് ചെയ്യില്ല. - ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ അല്ലെങ്കിൽ ഇംപോർട്ട് ചെയ്യൽ - -സ്വയമേവ സംഭവിക്കേണ്ടതുണ്ടോ എന്ന് ഉപയോക്താവിനോട് ആവശ്യപ്പെട്ടേക്കാം.</translation> + സജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇമ്പോർട്ട് ചെയ്യണോ എന്ന് ഉപയോക്താവിനോട് ചോദിച്ചേക്കും, അല്ലെങ്കിൽ സ്വമേധയാ ഇമ്പോർട്ട് ചെയ്യൽ സംഭവിച്ചേക്കാം.</translation> <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> മുന്ഗണനകള്</translation> <translation id="7006788746334555276">ഉള്ളടക്ക ക്രമീകരണങ്ങള്</translation> <translation id="7007671350884342624">ഉപയോക്തൃ വിവരങ്ങൾ സൂക്ഷിക്കാൻ, <ph name="PRODUCT_NAME" /> ഉപയോഗിക്കുന്ന ഡയറക്ടറി കോൺഫിഗർ ചെയ്യുന്നു. @@ -2454,12 +2460,23 @@ ഈ ക്രമീകരണം പ്രാപ്തമാക്കി അല്ലെങ്കിൽ കോൺഫിഗർ ചെയ്തില്ലെങ്കിലും, <ph name="PRODUCT_NAME" /> അച്ചടി ഡയലോഗിൽ നിന്നും ഉപയോക്താവിന് <ph name="CLOUD_PRINT_NAME" /> എന്നതിൽ അച്ചടിക്കാൻ കഴിയും. ഈ ക്രമീകരണം അപ്രാപ്തമാക്കിയെങ്കിൽ, <ph name="PRODUCT_NAME" /> അച്ചടി ഡയലോഗ് ഉപയോക്താക്കൾക്ക് <ph name="CLOUD_PRINT_NAME" /> എന്നതിലേക്ക് അച്ചടിക്കാൻ കഴിയില്ല.</translation> -<translation id="7053678646221257043">നിലവിലെ സ്ഥിരസ്ഥിതി ബ്രൗസർ പ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിന്നും ബുക്ക്മാർക്കുകൾ ഇംപോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. +<translation id="7053678646221257043">പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, നിലവിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നും ബുക്ക്മാർക്കുകൾ ഇമ്പോർട്ട് ചെയ്യുവാൻ ഈ നയം നിർബന്ധിക്കുന്നു. - അപ്രാപ്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഹോം പേജ് ഇംപോർട്ട് ചെയ്യില്ല. + പ്രവർത്തനരഹിതമാണെങ്കിൽ, ഹോം പേജ് ഇമ്പോർട്ട് ചെയ്യില്ല. - ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇംപോർട്ട് ചെയ്യണോ അല്ലെങ്കിൽ ഇംപോർട്ട് ചെയ്യൽ സ്വയമേവ സംഭവിക്കേണ്ടതുണ്ടോ എന്ന് ഉപയോക്താവിനോട് ആവശ്യപ്പെട്ടേക്കാം.</translation> + സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇമ്പോർട്ട് ചെയ്യണോ എന്ന് ഉപയോക്താവിനോട് ചോദിച്ചേക്കാം. അല്ലെങ്കിൽ ഇംമ്പോർട്ട് ചെയ്യൽ സ്വമേധയാ സംഭവിച്ചേക്കാം.</translation> <translation id="7063895219334505671">ഈ സൈറ്റുകളില് പോപ്പപ്പ് അനുവദിക്കുക</translation> +<translation id="706568410943497889"> + നയം 'ട്രൂ' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, Google സേവനങ്ങളിൽ (ഉദാ. Google Meet) നിന്ന് WebRTC ഇവന്റ് ലോഗുകളെ ശേഖരിക്കുന്നതിനും ആ ലോഗുകൾ Google-ലേക്ക് അപ്ലോഡ് ചെയ്യുന്നതിനും <ph name="PRODUCT_NAME" /> അനുവദിക്കപ്പെടും. + + ഈ നയം 'ഫാൾസ്' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ സജ്ജീകരിക്കാതെ വിട്ടിരിക്കുന്നുവെങ്കിലോ, അത്തരം ലോഗുകളെ <ph name="PRODUCT_NAME" /> ശേഖരിച്ചേക്കില്ല അല്ലെങ്കിൽ അപ്ലോഡ് ചെയ്തേക്കില്ല. + + അയയ്ക്കുകയും സ്വീകരിക്കുകയും ചെയ്യുന്ന RTP പാക്കറ്റുകളുടെ സമയത്തെയും വലുപ്പത്തെയും കുറിച്ചുള്ള വിവരങ്ങൾ, നെറ്റ്വർക്കിലെ തിക്കും തിരക്കിനെയും കുറിച്ചുള്ള ഫീഡ്ബാക്ക്, ഓഡിയോ - വീഡിയോ ഫ്രെയിമുകളുടെ സമയത്തെയും ഗുണനിലവാരത്തെയും കുറിച്ചുള്ള മെറ്റാഡാറ്റ എന്നിവ പോലുള്ള, Chrome-ലെ ഓഡിയോ അല്ലെങ്കിൽ വീഡിയോ കോളുകളുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങൾ ഡീബഗ്ഗ് ചെയ്യുമ്പോൾ സഹായകമായ പ്രശ്നനിർണയ വിവരങ്ങൾ ഈ ലോഗുകളിൽ അടങ്ങിയിരിക്കുന്നു. ഈ ലോഗുകളിൽ, ഓഡിയോ അല്ലെങ്കിൽ വീഡിയോ കോളിൽ നിന്നുള്ള ഉള്ളടക്കം അടങ്ങിയിരിക്കില്ല. + +Hangouts അല്ലെങ്കിൽ Google Meet പോലുള്ള, Google-ന്റെ വെബ് സേവനങ്ങൾക്ക് മാത്രമേ Chrome-ന്റെ ഈ ഡാറ്റാ ശേഖരണം ട്രിഗ്ഗർ ചെയ്യാനാവൂ. + +ഈ ലോഗുകളെ, Google സേവനം സ്വയം ശേഖരിക്കുന്ന മറ്റ് ലോഗുകളുമായി, ഒരു സെഷൻ ഐഡി മുഖേന ബന്ധപ്പെടുത്തിയേക്കാം; ഇത് ഡീബഗ്ഗിംഗിനെ കൂടുതൽ എളുപ്പമുള്ളതാക്കാൻ ഉദ്ദേശിച്ചിട്ടുള്ളതാണ്. + </translation> <translation id="706669471845501145">ഡെസ്ക്ടോപ്പ് നോട്ടിഫിക്കേഷനുകള് കാണിക്കാന് എല്ലാ സൈറ്റുകളേയും അനുവദിക്കുക</translation> <translation id="7070525176564511548">ഓരോ ആഴ്ചയിലും പാസ്വേഡ് നൽകേണ്ടതുണ്ട് (168 മണിക്കൂർ)</translation> <translation id="7072208053150563108">മെഷീൻ പാസ്വേഡ് മാറ്റൽ നിരക്ക്</translation> @@ -2486,13 +2503,13 @@ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമോ പ്രവർത്തനരഹിതമോ ആക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഇത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, അൺലോക്കുചെയ്യുന്നതിന് ഒരു പാസ്വേഡ് ആവശ്യപ്പെടണോ വേണ്ടയോ എന്നത് ഉപയോക്താവിന് തിരഞ്ഞെടുക്കാനാകും.</translation> -<translation id="7115494316187648452">അവസാന ബ്രൗസർ വിൻഡോ അടച്ചിരിക്കുമ്പോൾ OS ലോഗിനിൽ <ph name="PRODUCT_NAME" /> പ്രോസസ്സ് ആരംഭിച്ചിട്ടുണ്ടോ എന്ന് നിർണ്ണയിക്കുകയും സജീവമായി നിലനിർത്തുന്നതിന്, എല്ലാ സെഷൻ കുക്കികളും ഉൾപ്പെടെ പശ്ചാത്തല ആപ്സിനെയും നിലവിലെ ബ്രൗസിംഗ് സെഷനെയും അനുവദിച്ചുകൊണ്ട്, അവസാന ബ്രൗസർ വിൻഡോ അടയ്ക്കുന്നവരെ പ്രവർത്തിക്കുകയും ചെയ്യുന്നു. പശ്ചാത്തല പ്രോസസ്സ്, സിസ്റ്റം ട്രേയിൽ ഒരു ഐക്കൺ പ്രദർശിപ്പിക്കുന്നതിനാൽ അവിടെ നിന്നുതന്നെ അടയ്ക്കാം. +<translation id="7115494316187648452">അവസാന ബ്രൗസർ വിൻഡോ അടച്ചിരിക്കുമ്പോൾ OS ലോഗിനിൽ <ph name="PRODUCT_NAME" /> പ്രോസസ്സ് ആരംഭിച്ചിട്ടുണ്ടോ എന്ന് നിർണ്ണയിക്കുകയും സജീവമായി നിലനിർത്തുന്നതിന്, എല്ലാ സെഷൻ കുക്കികളും ഉൾപ്പെടെ പശ്ചാത്തല ആപ്സിനെയും നിലവിലെ ബ്രൗസിംഗ് സെഷനെയും അനുവദിക്കുന്നു. പശ്ചാത്തല പ്രോസസ്സ്, സിസ്റ്റം ട്രേയിൽ ഒരു ഐക്കൺ പ്രദർശിപ്പിക്കുകയും അവിടെ നിന്നു തന്നെ അത് അടയ്ക്കുകയും ചെയ്യാം. - ഈ നയം 'True' ആയി സജ്ജമാക്കുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനക്ഷമമാകും എന്നാൽ പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയില്ല. + ഈ നയം 'ശരി' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനക്ഷമമാകും എന്നാൽ പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയില്ല. - ഈ നയം 'False' ആയി സജ്ജമാക്കുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനരഹിതമാകും പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയുമില്ല. + ഈ നയം തെറ്റായാണ് സജ്ജീകരിച്ചിട്ടുള്ളതെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനരഹിതമാകും പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയുമില്ല. - ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് ആദ്യം പ്രവർത്തനരഹിതമാകും, പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയും.</translation> + ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് ആദ്യം പ്രവർത്തനരഹിതമാകും, പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയും.</translation> <translation id="7123160381479171745">ഉപകരണത്തിൽ ലോഗിൻ ചെയ്യാൻ അനുമതിയുള്ള ഉപയോക്താക്കളുടെ ലിസ്റ്റ് നിർവചിക്കുന്നു. <ph name="USER_WHITELIST_ENTRY_FORMAT" /> ഫോമിലെ എൻട്രികൾ <ph name="USER_WHITELIST_ENTRY_EXAMPLE" /> പോലുള്ളതാണ്. ഒരു ഡൊമെയ്നിൽ അനിയന്ത്രിതമായി ഉപയോക്താക്കളെ അനുവദിക്കുന്നതിന്, <ph name="USER_WHITELIST_ENTRY_WILDCARD" /> ഫോം എൻട്രികൾ ഉപയോഗിക്കുക. ഈ നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, സൈൻ ഇൻ ചെയ്യുന്നതിന് ഏതുതരം ഉപയോക്താക്കളെയാണ് അനുവദിച്ചിരിക്കുന്നത് എന്നതിൽ നിയന്ത്രണങ്ങളൊന്നും ഉണ്ടാകില്ല. പുതിയ ഉപയോക്താക്കളെ സൃഷ്ടിക്കുന്നതിനായി ഇപ്പോഴും <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" /> നയം ഉചിതമായി കോൺഫിഗർ ചെയ്യേണ്ടതുണ്ടെന്ന കാര്യം ശ്രദ്ധിക്കുക.</translation> @@ -2558,7 +2575,7 @@ നഷ്ടമായ പ്ലഗിനുകളുടെ സ്വമേധയായുള്ള തിരയലും ഇൻസ്റ്റാൾ ചെയ്യലും ഇനി പ്രവർത്തിക്കില്ല.</translation> <translation id="7267809745244694722">മീഡിയ കീകൾ ഫംഗ്ഷൻ കീകളിൽ സ്ഥിരമാക്കി</translation> -<translation id="7271085005502526897">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള ഹോംപേജ് ഇംപോർട്ട് ചെയ്യുക</translation> +<translation id="7271085005502526897">ആദ്യ റൺ ചെയ്യലിൽ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുമുള്ള ഹോംപേജ് ഇമ്പോർട്ട് ചെയ്യുക</translation> <translation id="7273823081800296768">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിലോ, തുടർന്ന് കണക്റ്റുചെയ്യുന്ന സമയത്ത് ഉപയോക്താക്കൾക്ക് ക്ലയന്റുകളും ഹോസ്റ്റുകളും ജോടിയാക്കുന്നതിന് തിരഞ്ഞെടുക്കാനാകും, എല്ലായ്പ്പോഴും ഒരു PIN നൽകേണ്ടതില്ല. ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, തുടർന്ന് ഈ സവിശേഷത ലഭ്യമാകില്ല.</translation> @@ -2607,6 +2624,9 @@ <translation id="7336878834592315572">സെഷന്റെ ദൈർഘ്യത്തിനായി കുക്കികൾ നിലനിർത്തുക</translation> <translation id="7340034977315324840">ഉപകരണ പ്രവർത്തന സമയങ്ങൾ റിപ്പോർട്ടുചെയ്യുക</translation> <translation id="7343497214039883642">ഉപകരണങ്ങൾക്കായുള്ള എന്റർപ്രൈസ് പ്രിന്റർ കോൺഫിഗറേഷൻ</translation> +<translation id="7349338075015720646">ഉപയോക്തൃ ഇടപെടൽ ഇല്ലാതെ നിശബ്ദമായി ഇൻസ്റ്റാൾ ചെയ്തതും ഉപയോക്താവിന് അൺ ഇൻസ്റ്റാൾ ചെയ്യാനോ പ്രവർത്തനരഹിതമാക്കാനോ കഴിയാത്തതുമായ വെബ്സൈറ്റുകളുടെ ഒരു ലിസ്റ്റ് വ്യക്തമാക്കുന്നു. + +ഈ നയത്തിലെ ഓരോ ലിസ്റ്റ് ഇനവും രണ്ട് അംഗങ്ങൾ ഉള്ള ഒരു ഒബ്ജക്റ്റ് ആണ്: "url," "launch_container" എന്നിവ. "url" എന്നത് ഇൻസ്റ്റാൾ ചെയ്യേണ്ട വെബ് ആപ്പിന്റെ URL-ഉം "launch_container" എന്നത്, ഒരിക്കൽ ഇൻസ്റ്റാൾ ചെയ്തുകഴിഞ്ഞാൽ വെബ് ആപ്പ് എങ്ങനെയാണ് തുറക്കുക എന്ന് സൂചിപ്പിക്കാനുള്ള "വിൻഡോ" അല്ലെങ്കിൽ "ടാബ്" ആയിരിക്കണം. "launch_container" ഒഴിവാക്കിയാൽ, അത് ഒരു പ്രോഗ്രസീവ് വെബ് ആപ്പ് ആയി Chrome പരിഗണിച്ചാൽ വിൻഡോയിലും അല്ലെങ്കിൽ ടാബിലും ആപ്പ് സമാരംഭിക്കും.</translation> <translation id="7367028210010532881">ക്ഷുദ്രകരമായിരിക്കാൻ സാധ്യതയുള്ളതെന്ന് ഫ്ലാഗ് ചെയ്തിട്ടുള്ള സൈറ്റുകളിലേക്ക് ഉപയോക്താക്കൾ നാവിഗേറ്റ് ചെയ്യുമ്പോൾ സുരക്ഷിത ബ്രൗസിംഗ് സേവനം ഒരു മുന്നറിയിപ്പ് പേജ് ദൃശ്യമാക്കുന്നു. ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നതിലൂടെ, മുന്നറിയിപ്പ് പേജിൽ നിന്ന് ഏതെങ്കിലും തരത്തിൽ ക്ഷുദ്രകരമായ സൈറ്റുകളിലേക്ക് ഉപയോക്താക്കൾ പോകുന്നത് തടയുന്നു. ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിലോ, മുന്നറിയിപ്പ് ദൃശ്യമായതിനുശേഷവും ഉപയോക്താക്കൾക്ക് ഫ്ലാഗ് ചെയ്ത സൈറ്റുകളിലേക്ക് പോകാൻ കഴിയും. @@ -2664,9 +2684,9 @@ GAIA എന്ന് സജ്ജമാക്കിയെങ്കിൽ, സാധാരണ GAIA പരിശോധിച്ചുറപ്പിക്കൽ ഫ്ലോ വഴിയായിരിക്കും ലോഗിൻ ചെയ്യാനാകുക. SAML_INTERSTITIAL എന്നാണ് സജ്ജമാക്കിയിരിക്കുന്നതെങ്കിൽ, ലോഗിൻ, ഉപകരണത്തിന്റെ എൻറോൾമെന്റ് ഡൊമെയ്നിന്റെ SAML IdP വഴി ഉപയോക്താവിന് പരിശോധിച്ചുറപ്പിക്കലുമായി മുന്നോട്ട് പോകാൻ പറയുന്ന ഒരു ഇന്റർസ്റ്റീഷ്യൽ സ്ക്രീൻ കാണിക്കും അല്ലെങ്കിൽ സാധാരണ GAIA ലോഗിൻ ഫ്ലോയിലേക്ക് മടങ്ങുക.</translation> -<translation id="755951849901630953">സജ്ജീകരിക്കാത്തപ്പോഴും 'ട്രൂ' എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോഴും, <ph name="PRODUCT_NAME" /> എന്നതിലെ എല്ലാ ഘടകങ്ങളുടെയും ഘടക അപ്ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു. +<translation id="755951849901630953">സജ്ജീകരിക്കാത്തപ്പോഴും 'ശരി' എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോഴും, <ph name="PRODUCT_NAME" /> എന്നതിലെ എല്ലാ ഘടകങ്ങളുടെയും ഘടക അപ്ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു. - 'ഫാൾസ്' എന്ന് സജ്ജീകരിച്ചിരിക്കുകയാണെങ്കിൽ, ഘടകങ്ങളുടെ അപ്ഡേറ്റുകളെ പ്രവർത്തനരഹിതമാക്കും. എന്നിരുന്നാലും, ചില ഘടകങ്ങളെ ഈ നയത്തിൽ നിന്ന് ഒഴിവാക്കിയിരിക്കുന്നു: എക്സിക്യൂട്ട് ചെയ്യാനാകുന്ന കോഡ് ഉൾപ്പെട്ടിട്ടില്ലാത്തതോ ബ്രൗസറിന്റെ പ്രവർത്തനരീതിയിൽ കാര്യമായ മാറ്റം വരുത്താത്തതോ സുരക്ഷയ്ക്ക് ഒഴിച്ചുകൂടാനാവാത്തതോ ആയ ഏതെങ്കിലും ഘടകത്തിന്റെ അപ്ഡേറ്റുകളെ പ്രവർത്തനരഹിതമാക്കില്ല. + 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിരിക്കുകയാണെങ്കിൽ, ഘടകങ്ങളുടെ അപ്ഡേറ്റുകളെ പ്രവർത്തനരഹിതമാക്കും. എന്നിരുന്നാലും, ചില ഘടകങ്ങളെ ഈ നയത്തിൽ നിന്ന് ഒഴിവാക്കിയിരിക്കുന്നു: എക്സിക്യൂട്ട് ചെയ്യാനാകുന്ന കോഡ് ഉൾപ്പെട്ടിട്ടില്ലാത്തതോ ബ്രൗസറിന്റെ പ്രവർത്തനരീതിയിൽ കാര്യമായ മാറ്റം വരുത്താത്തതോ സുരക്ഷയ്ക്ക് ഒഴിച്ചുകൂടാനാവാത്തതോ ആയ ഏതെങ്കിലും ഘടകത്തിന്റെ അപ്ഡേറ്റുകളെ പ്രവർത്തനരഹിതമാക്കില്ല. അത്തരം ഘടകങ്ങളുടെ ഉദാഹരണങ്ങളിൽ സർട്ടിഫിക്കറ്റ് അസാധുവാക്കൽ ലിസ്റ്റുകളും സുരക്ഷിത ബ്രൗസിംഗ് വിവരങ്ങളും ഉൾപ്പെടുന്നു. സുരക്ഷിത ബ്രൗസിംഗിനെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് https://developers.google.com/safe-browsing കാണുക.</translation> <translation id="7566878661979235378">SAML ലോഗിൻ പരിശോധിച്ചുറപ്പിക്കൽ തരം</translation> @@ -2737,7 +2757,7 @@ ശ്രദ്ധിക്കുക: നിലവിൽ, ലോഗിൻ സ്ക്രീൻ ദൃശ്യമാക്കുമ്പോളോ കിയോസ്ക് അപ്ലിക്കേഷൻ സെഷൻ പുരോഗതിയിലായിരിക്കുമ്പോളോ മാത്രം യാന്ത്രിക റീബൂട്ടുകൾ പ്രവർത്തനക്ഷമമാകുന്നു. ഏതെങ്കിലും പ്രത്യേക തരത്തിന്റെ ഒരു സെഷൻ പുരോഗതിയിലാണോ അല്ലയോ എന്നത് പരിഗണിക്കാതെ ഭാവിയിൽ ഇത് മാറുകയും നയം എല്ലായ്പ്പോഴും ബാധകമാകുകയും ചെയ്യും.</translation> <translation id="7701341006446125684">ആപ്സ്, വിപുലീകരണങ്ങൾ എന്നിവയുടെ കാഷേ വലുപ്പം സജ്ജീകരിക്കുക (ബൈറ്റുകളിൽ)</translation> -<translation id="7709537117200051035">ഹോസ്റ്റിലേക്കുള്ള ആക്സസ്സ് അനുവദിക്കുകയോ (true) തടയുകയോ (false) ചെയ്യേണ്ടതുണ്ടോയെന്ന് വ്യക്തമാക്കുന്ന ഒരു ബൂളിയൻ ഫ്ലാഗിലേയ്ക്ക് ഒരു നിഘണ്ടു ഹോസ്റ്റ്നെയിമുകൾ മാപ്പുചെയ്യുന്നു. +<translation id="7709537117200051035">ഹോസ്റ്റിലേക്കുള്ള ആക്സസ്സ് അനുവദിക്കുകയോ (ശരി) തടയുകയോ (തെറ്റ്) ചെയ്യേണ്ടതുണ്ടോയെന്ന് വ്യക്തമാക്കുന്ന ഒരു ബുലിയൻ ഫ്ലാഗിലേയ്ക്ക് ഹോസ്റ്റ്നെയിമുകൾ മാപ്പ് ചെയ്യുന്ന നിഘണ്ടു. ഈ നയം <ph name="PRODUCT_NAME" />-ന്റെ ആന്തരിക ഉപയോഗത്തിന് മാത്രമുള്ളതാണ്.</translation> <translation id="7712109699186360774">ഒരു സൈറ്റിന് എന്റെ ക്യാമറ കൂടാതെ/അല്ലെങ്കിൽ മൈക്രോഫോൺ ആക്സസ്സുചെയ്യണമെന്നുള്ളപ്പോഴെല്ലാം ചോദിക്കുക</translation> @@ -2908,7 +2928,7 @@ നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയാൽ, സ്വമേധയാ പൂരിപ്പിക്കൽ ഉപയോക്താക്കൾക്ക് ആക്സസ് ചെയ്യാനാവില്ല. നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയോ ഒരു മൂല്യം സജ്ജമാക്കാതിരിക്കുകയോ ചെയ്താൽ, സ്വമേധയാ പൂരിപ്പിക്കൽ തുടർന്നും ഉപയോക്താവിൻറെ നിയന്ത്രണത്തിലായിരിക്കും. ഇത്, സ്വമേധയാ പൂരിപ്പിക്കൽ പ്രൊഫൈലുകൾ കോൺഫിഗർ ചെയ്യാനും അവരുടെ സ്വന്തം വിവേചനാധികാരം ഉപയോഗിച്ച്, സ്വമേധയാ പൂരിപ്പിക്കൽ ഓണാക്കാനോ ഓഫാക്കാനോ ഉപയോക്താക്കളെ അനുവദിക്കുകയും ചെയ്യും.</translation> -<translation id="8044493735196713914">ഉപകരണ ബൂട്ട് മോഡ് റിപ്പോർട്ടുചെയ്യുക</translation> +<translation id="8044493735196713914">ഉപകരണ ബൂട്ട് മോഡ് റിപ്പോർട്ട് ചെയ്യുക</translation> <translation id="8050080920415773384">നേറ്റീവ് പ്രിന്റിംഗ്</translation> <translation id="8059164285174960932">റിമോട്ട് ആക്സസ്സ് ക്ലയന്റുകൾക്കുകൾ അവരുടെ പ്രാമാണീകരണ ടോക്കൺ നേടേണ്ട URL</translation> <translation id="806280865577636339">ഈ നയം 'ശരി' ആയി സജ്ജമാക്കിയാൽ, ഉപയോഗസഹായി ഓപ്ഷനുകൾ എല്ലായ്പ്പോഴും സിസ്റ്റം ട്രേ മെനുവിൽ ദൃശ്യമാകും. @@ -2972,9 +2992,9 @@ നിങ്ങൾ ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല. ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, പ്രാഥമികമായി ഉയർന്ന ദൃശ്യ തീവ്രത മോഡ് പ്രവർത്തനരഹിതമാകുമെങ്കിലും ഉപയോക്താക്കൾക്ക് അത് ഏതുസമയത്തും പ്രവർത്തനക്ഷമമാക്കാനാകും.</translation> -<translation id="815061180603915310">ഈ നയം പ്രവർത്തനക്ഷമമാക്കിയെന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഇത് എഫിമെറൽ മോഡിലേക്ക് മാറാൻ പ്രൊഫൈലിനെ പ്രേരിപ്പിക്കും. ഈ നയത്തെ OS നയമെന്ന് (ഉദാ. Windows-ലെ GPO) വ്യക്തമാക്കുകയാണെങ്കിൽ, അത് സിസ്റ്റത്തിലെ എല്ലാ പ്രൊഫൈലിനും ബാധകമാകും; നയം ക്ലൗഡ് നയമെന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന ഒരു പ്രൊഫൈലിന് മാത്രമേ ഇത് ബാധകമാകൂ. +<translation id="815061180603915310">ഈ നയം പ്രവർത്തനക്ഷമമായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഇത് എഫിമെറൽ മോഡിലേക്ക് മാറാൻ പ്രൊഫൈലിനെ പ്രേരിപ്പിക്കും. ഈ നയത്തെ OS നയമെന്ന് (ഉദാ. Windows-ലെ GPO) വ്യക്തമാക്കുകയാണെങ്കിൽ, അത് സിസ്റ്റത്തിലെ എല്ലാ പ്രൊഫൈലിനും ബാധകമാകും; നയം ക്ലൗഡ് നയമെന്ന് സജ്ജീകരിക്കുകയാണെങ്കിൽ, ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന ഒരു പ്രൊഫൈലിന് മാത്രമേ ഇത് ബാധകമാകൂ. - ഈ മോഡിൽ, ഉപയോക്തൃ സെഷന്റെ സമയത്ത് മാത്രമേ ഡിസ്കിൽ പ്രൊഫൈൽ വിവരങ്ങൾ നിലനിൽക്കൂ. ബ്രൗസർ ചരിത്രവും വിപുലീകരണങ്ങളും അവയുടെ വിവരങ്ങളും പോലുള്ള ഫീച്ചറുകൾ, കുക്കികളും വെബ് ഡാറ്റാബേസുകളും പോലുള്ള വെബ് വിവരം എന്നിവ ബ്രൗസർ അടച്ചതിനുശേഷം സൂക്ഷിക്കുന്നതല്ല. എന്നിരുന്നാലും, ഇത് ഡിസ്ക്കിലേക്ക് ഏതെങ്കിലും ഡാറ്റ നേരിട്ട് ഡൗൺലോഡുചെയ്യുന്നതിൽ നിന്നോ പേജുകൾ സംരക്ഷിക്കുന്നതിൽ നിന്നോ അവയെ പ്രിന്റുചെയ്യുന്നതിൽ നിന്നോ ഉപയോക്താവിനെ തടയുന്നതല്ല. + ഈ മോഡിൽ, ഉപയോക്തൃ സെഷന്റെ സമയത്ത് മാത്രമേ ഡിസ്കിൽ പ്രൊഫൈൽ വിവരങ്ങൾ നിലനിൽക്കൂ. ബ്രൗസർ ചരിത്രവും വിപുലീകരണങ്ങളും അവയുടെ വിവരങ്ങളും പോലുള്ള ഫീച്ചറുകൾ, കുക്കികളും വെബ് ഡാറ്റാബേസുകളും പോലുള്ള വെബ് വിവരം എന്നിവ ബ്രൗസർ അടച്ചതിനുശേഷം സൂക്ഷിക്കുന്നതല്ല. എന്നിരുന്നാലും, ഇത് ഡിസ്ക്കിലേക്ക് ഏതെങ്കിലും ഡാറ്റ നേരിട്ട് ഡൗൺലോഡ് ചെയ്യുന്നതിൽ നിന്നോ പേജുകൾ സംരക്ഷിക്കുന്നതിൽ നിന്നോ അവയെ പ്രിന്റ് ചെയ്യുന്നതിൽ നിന്നോ ഉപയോക്താവിനെ തടയുന്നതല്ല. ഉപയോക്താവ് സമന്വയിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, സാധാരണ പ്രൊഫൈലുകൾ പോലെ ഈ എല്ലാ ഡാറ്റയും ഉപയോക്താവിന്റെ സമന്വയിപ്പിക്കൽ പ്രൊഫൈലിൽ സൂക്ഷിക്കുന്നതാണ്. നയം, ഇൻകോഗ്നിറ്റോ മോഡ് പ്രവർത്തനരഹിതമാക്കിയിട്ടില്ലെങ്കിൽ, അതും ലഭ്യമായിരിക്കും. @@ -3058,7 +3078,7 @@ ഈ നയ മൂല്യം മില്ലിസെക്കൻഡിൽ വ്യക്തമാക്കിയിരിക്കണം.</translation> <translation id="8339420913453596618">രണ്ടാം ഫാക്ടർ പ്രവർത്തനരഹിതമാക്കി</translation> -<translation id="8344454543174932833">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള ബുക്ക്മാർക്കുകൾ ഇംപോർട്ട് ചെയ്യുക</translation> +<translation id="8344454543174932833">ആദ്യ റൺ ചെയ്യലിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുമുള്ള ബുക്ക്മാർക്കുകൾ ഇമ്പോർട്ട് ചെയ്യുക</translation> <translation id="8357681633047935212">ഒരു ഉപയോക്തൃ സെഷന്റെ ദൈർഘ്യം പരിമിതപ്പെടുത്തുക</translation> <translation id="8359734107661430198">2008/09/02 എന്നതിലൂടെ ExampleDeprecatedFeature API പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="8367209241899435947">Windows-ൽ Chrome ക്ലീൻ അപ്പ് പ്രവർത്തനക്ഷമമാക്കുക</translation> @@ -3093,12 +3113,12 @@ <translation id="8465065632133292531">POST ഉപയോഗിക്കുന്ന തൽക്ഷണ URL-നായുള്ള പാരാമീറ്ററുകൾ</translation> <translation id="847472800012384958">പോപ്പപ്പുകള് കാണിക്കാന് ഒരു സൈറ്റിനേയും അനുവദിക്കരുത്</translation> <translation id="8477885780684655676">TLS 1.0</translation> -<translation id="8484458986062090479">ഹോസ്റ്റ് ബ്രൗസർ എല്ലായ്പ്പോഴും റെൻഡർ ചെയ്യുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് ഇഷ്ടാനുസൃതമാക്കുക. +<translation id="8484458986062090479">ഹോസ്റ്റ് ബ്രൗസർ എല്ലായ്പ്പോഴും റെൻഡർ ചെയ്യുന്ന URL പാറ്റേണുകളുടെ ലിസ്റ്റ് ഇഷ്ടാനുസൃതമാക്കുക. ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ട് റെൻഡറർ 'ChromeFrameRendererSettings' നയ പ്രകാരം എല്ലാ സൈറ്റുകൾക്കായും ഉപയോഗിക്കും. ഉദാഹരണ പാറ്റേണുകൾക്കായി, https://www.chromium.org/developers/how-tos/chrome-frame-getting-started കാണുക.</translation> -<translation id="8493645415242333585">ബ്രൌസര് ചരിത്രം സംരക്ഷിക്കുന്നത് അപ്രാപ്തമാക്കുക</translation> +<translation id="8493645415242333585">ബ്രൗസർ ചരിത്രം സംരക്ഷിക്കുന്നത് പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="8498293625012059298">പാസ്വേഡ് മാറ്റാനുള്ള URL കോൺഫിഗർ ചെയ്യുക (HTTP, HTTPS എന്നീ സ്കീമുകൾ മാത്രം). ബ്രൗസറിൽ ഒരു മുന്നറിയിപ്പ് കണ്ടശേഷം, അവരുടെ പാസ്വേഡ് മാറ്റാനായി പാസ്വേഡ് പരിരക്ഷാ സേവനം ഉപയോക്താക്കളെ ഈ URL-ലേക്ക് അയയ്ക്കും. ഈ പാസ്വേഡ് മാറ്റൽ പേജിലെ പുതിയ പാസ്വേഡ് ഫിംഗർപ്രിന്റ് <ph name="PRODUCT_NAME" /> ശരിയായി എടുക്കുന്നതിന്, https://www.chromium.org/developers/design-documents/create-amazing-password-forms എന്നതിലുള്ള മാർഗനിർദേശങ്ങൾ നിങ്ങളുടെ പാസ്വേഡ് മാറ്റൽ പേജ് പിന്തുടരുന്നുണ്ട് എന്ന് ഉറപ്പാക്കുക. @@ -3125,6 +3145,7 @@ ഇവിടെ "പതിപ്പ്" എന്നത് '61.0.3163.120' പോലുള്ള ഒരു കൃത്യമായ പതിപ്പോ അല്ലെങ്കിൽ '61.0' പോലുള്ള ഒരു പതിപ്പ് പ്രിഫിക്സോ ആകാം </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />-നായുള്ള സ്ഥിരസ്ഥിതി HTML റെന്ഡറര്</translation> +<translation id="8544465954173828789">എസ്എംഎസ് സന്ദേശങ്ങൾ ഫോണിൽ നിന്ന് Chromebook-ലേക്ക് സമന്വയിപ്പിക്കാൻ അനുവദിക്കുക.</translation> <translation id="8549772397068118889">ഉള്ളടക്ക പാക്കുകളുടെ പുറത്തുള്ള സൈറ്റുകൾ സന്ദർശിക്കുമ്പോൾ മുന്നറിയിപ്പ് നൽകുക</translation> <translation id="8566842294717252664">പുതിയ ടാബ് പേജിൽ നിന്നും ആപ്പ് ലോഞ്ചറിൽ നിന്നും വെബ് സ്റ്റോർ മറയ്ക്കുക</translation> <translation id="8586528890725660268">ഒരു ഉപയോക്താവിന് ഉപയോഗിക്കാൻ കഴിയാത്ത പ്രിന്ററുകളെ ഇത് വ്യക്തമാക്കുന്നു. @@ -3167,6 +3188,11 @@ ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, പാസ്വേഡ് പരിരക്ഷാ സേവനം Google പാസ്വേഡുകൾ മാത്രം പരിരക്ഷിക്കും, എന്നാൽ ഉപയോക്താവിന് ഈ ക്രമീകരണം മാറ്റാൻ കഴിയും.</translation> <translation id="8672321184841719703">ടാർഗെറ്റ് യാന്ത്രിക അപ്ഡേറ്റ് പതിപ്പ്</translation> <translation id="867410340948518937">U2F (യൂണിവേഴ്സൽ രണ്ടാം ഫാക്ടർ)</translation> +<translation id="8682611302223077049">തീരുമാനമെടുക്കാത്തൊരു അപ്ഡേറ്റ് പ്രയോഗിക്കാൻ, <ph name="PRODUCT_NAME" /> റീലോഞ്ച് ചെയ്യണമെന്നോ <ph name="PRODUCT_OS_NAME" /> ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യണമെന്നോ ഉപയോക്താക്കളെ അറിയിക്കുന്നതിനുള്ള സമയ കാലയളവ്, മില്ലിസെക്കൻഡിൽ സജ്ജീകരിക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു. + + ഈ സമയ കാലയളവിൽ, അപ്ഡേറ്റിന്റെ ആവശ്യകതയെ കുറിച്ച് ഉപയോക്താവിന് ആവർത്തിച്ച് അറിയിക്കും. <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക്, ഒരു അപ്ഗ്രേഡ് തിരിച്ചറിയപ്പെടുമ്പോൾ, സിസ്റ്റം ട്രേയിൽ ഒരു റീസ്റ്റാർട്ട് അറിയിപ്പ് ദൃശ്യമാകും. <ph name="PRODUCT_NAME" /> ബ്രൗസറുകളുടെ കാര്യത്തിൽ, അറിയിപ്പ് കാലയളവിന്റെ മൂന്നിലൊരു ഭാഗം തീർന്നുകഴിഞ്ഞാൽ, ഒരു റീലോഞ്ച് ആവശ്യമാണെന്ന് സൂചിപ്പിക്കുന്ന തരത്തിൽ ആപ്പ് മെനു മാറുന്നു. അറിയിപ്പ് കാലയളവിന്റെ മൂന്നിൽ രണ്ടുഭാഗം തീർന്നാൽ, അറിയിപ്പിന്റെ നിറം മാറുന്നു, മുഴുവൻ അറിയിപ്പ് കാലയളവും പൂർത്തിയായിക്കഴിഞ്ഞാൽ വീണ്ടും നിറം മാറും. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> നയം മുഖേന പ്രവർത്തനക്ഷമമാക്കിയിട്ടുള്ള അധിക അറിയിപ്പുകളും ഇതേ ഷെഡ്യൂൾ പിന്തുടരുന്നു. + + സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക് 345600000 മില്ലിസെക്കൻഡിന്റെയും (നാല് ദിവസം) <ph name="PRODUCT_NAME" />-ന് 604800000 മില്ലിസെക്കൻഡിന്റെയും (ഒരു ആഴ്ച) ഡിഫോൾട്ട് കാലയളവ് ഉപയോഗിക്കപ്പെടുന്നു.</translation> <translation id="8685024486845674965">പാസ്വേഡ് പുനരുപയോഗിച്ച്, പാസ്വേഡ് പരിരക്ഷ മുന്നറിയിപ്പ് ട്രിഗ്ഗര് ചെയ്തു</translation> <translation id="8693243869659262736">അന്തർനിർമ്മിത DNS ക്ലയന്റ് ഉപയോഗിക്കുക</translation> <translation id="8704831857353097849">അപ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ലിസ്റ്റ്</translation> @@ -3192,7 +3218,7 @@ <translation id="8736538322216687231">YouTube-ൽ കുറഞ്ഞ നിയന്ത്രിത മോഡ് നിർബന്ധിതമാക്കുക</translation> <translation id="8749370016497832113"><ph name="PRODUCT_NAME" />-ലെ ബ്രൗസിംഗ് ചരിത്രവും ഡൗൺലോഡ് ചരിത്രവും ഇല്ലാതാക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുകയും ഈ ക്രമീകരണങ്ങൾ മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. - ഈ നയം പ്രവർത്തനരഹിതമാക്കിയാലും, ബ്രൗസിംഗ് ചരിത്രവും ഡൗൺലോഡ് ചരിത്രവും നിലനിർത്തുമെന്ന് ഉറപ്പില്ലെന്നത് ശ്രദ്ധിക്കുക: ഉപയോക്താക്കൾക്ക് ചരിത്ര ഡാറ്റാബേസ് ഫയലുകൾ നേരിട്ട് എഡിറ്റുചെയ്യാനും ഇല്ലാതാക്കാനും കഴിയാനിടയുണ്ട്, ബ്രൗസർ സ്വയം എപ്പോൾ വേണമെങ്കിലും കുറച്ച് അല്ലെങ്കിൽ മുഴുവൻ ചരിത്രവും കാലഹരണപ്പെടുത്തുകയോ ആർക്കൈവുചെയ്യുകയോ ചെയ്യാം. + ഈ നയം പ്രവർത്തനരഹിതമാക്കിയാലും, ബ്രൗസിംഗ് ചരിത്രവും ഡൗൺലോഡ് ചരിത്രവും നിലനിർത്തുമെന്ന് ഉറപ്പില്ലെന്നത് ശ്രദ്ധിക്കുക: ഉപയോക്താക്കൾക്ക് ചരിത്ര ഡാറ്റാബേസ് ഫയലുകൾ നേരിട്ട് എഡിറ്റ് ചെയ്യാനും ഇല്ലാതാക്കാനും കഴിയാനിടയുണ്ട്, ബ്രൗസർ സ്വയം എപ്പോൾ വേണമെങ്കിലും കുറച്ച് അല്ലെങ്കിൽ മുഴുവൻ ചരിത്രവും കാലഹരണപ്പെടുത്തുകയോ ആർക്കൈവോ ചെയ്തേക്കാം. ക്രമീകരണങ്ങൾ പ്രവർത്തനക്ഷമമാക്കിയാലും ഇല്ലെങ്കിലും, ബ്രൗസിംഗ് ചരിത്രവും ഡൗൺലോഡ് ചരിത്രവും ഇല്ലാതാക്കാനാകും. @@ -3212,6 +3238,7 @@ സ്കെയിൽ ഘടകം 100% അല്ലെങ്കിൽ അതിൽ കൂടുതലായിരിക്കണം. സാധാരണ സ്ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസത്തിന്റെ മൂല്യത്തേക്കാൾ കുറവായ, അവതരണ മോഡിലെ സ്ക്രീൻ മങ്ങുന്നതിന് കാലതാമസമുണ്ടാക്കുന്ന മൂല്യങ്ങൾ അനുവദനീയമല്ല.</translation> <translation id="8798099450830957504">സ്ഥിരസ്ഥിതി</translation> +<translation id="8801680448782904838">ബ്രൗസർ റീലോഞ്ച് ചെയ്യൽ അല്ലെങ്കിൽ ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യൽ ശുപാർശ ചെയ്യുന്നു എന്നോ ആവശ്യമാണ് എന്നോ ഉപയോക്താവിനെ അറിയിക്കുക</translation> <translation id="8818173863808665831">ഉപകരണത്തിന്റെ ഭൂമിശാസ്ത്ര ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യുക.. നയം ഇതുവരെ സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ തെറ്റ് എന്ന് സജ്ജമാക്കിയെങ്കിലോ, ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യില്ല.</translation> @@ -3433,6 +3460,11 @@ ഈ നയം 'true' ആയി സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താവ് ഉപകരണം ഷട്ട് ഡൗൺ ചെയ്യുമ്പോൾ <ph name="PRODUCT_OS_NAME" /> റീബൂട്ട് ട്രിഗർ ചെയ്യും. റീബൂട്ട് ബട്ടണുകൾ കൊണ്ട് UI-യിലെ ഷട്ട് ഡൗൺ ബട്ടണുകളുടെ എല്ലാ ആവർത്തനങ്ങളും <ph name="PRODUCT_OS_NAME" /> മാറ്റി പകരംവയ്ക്കും. നയം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിലും, ഉപയോക്താവ് പവർ ബട്ടൺ ഉപയോഗിച്ച് ഉപകരണം ഷട്ട് ഡൗൺ ചെയ്യുകയാണെങ്കിൽ, ഇത് സ്വയമേവ റീബൂട്ട് ചെയ്യില്ല.</translation> <translation id="9152473318295429890">സമാന വെബ് പേജുകളുടെ സാന്ദർഭിക നിർദ്ദേശങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="9158929520101169054">ബ്രൗസറിനുള്ളിൽ ഒന്നിലധികം സൈൻ-ഇൻ അനുവദിക്കുക</translation> +<translation id="9159126470527871268">തീരുമാനമെടുക്കാത്തൊരു അപ്ഡേറ്റ് പ്രയോഗിക്കാൻ, <ph name="PRODUCT_NAME" /> റീലോഞ്ച് ചെയ്യണമെന്നോ <ph name="PRODUCT_OS_NAME" /> റീസ്റ്റാർട്ട് ചെയ്യണമെന്നോ ഉപയോക്താക്കളെ അറിയിക്കുന്നു. + + ഈ നയ ക്രമീകരണം, ബ്രൗസർ റീലോഞ്ച് ചെയ്യൽ അല്ലെങ്കിൽ ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യൽ ശുപാർശ ചെയ്യുന്നുണ്ടെന്നോ അത് ആവശ്യമാണെന്നോ ഉപയോക്താവിനെ അറിയിക്കാനുള്ള അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു. സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഇതിന്റെ മെനുവിലെ സൂക്ഷ്മമായ മാറ്റങ്ങളിലൂടെ റീലോഞ്ച് ചെയ്യൽ ആവശ്യമാണെന്ന് <ph name="PRODUCT_NAME" /> ഉപയോക്താവിനോട് സൂചിപ്പിക്കുന്നു, അതേസമയം സിസ്റ്റം ട്രേയിലെ ഒരു അറിയിപ്പിലൂടെ <ph name="PRODUCT_OS_NAME" /> ഇത്തരത്തിൽ സൂചിപ്പിക്കുന്നു. 'ശുപാർശ ചെയ്തു' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, റീലോഞ്ച് ചെയ്യൽ ശുപാർശ ചെയ്തിരിക്കുന്നതായി ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. റീലോഞ്ച് നീട്ടിവെക്കാനായി ഉപയോക്താവിന് ഈ മുന്നറിയിപ്പ് നിരാകരിക്കാനാവും. 'ആവശ്യമാണ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, അറിയിപ്പ് കാലാവധി കഴിഞ്ഞാലുടൻ, ബ്രൗസർ നിർബന്ധിത റീലോഞ്ചിന് വിധേയമാകുമെന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. ഡിഫോൾട്ടായി <ph name="PRODUCT_NAME" />-ന് ഏഴ് ദിവസവും <ph name="PRODUCT_OS_NAME" />-ന് നാല് ദിവസവും ആണ് കാലാവധി, മാത്രമല്ല <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> നയ ക്രമീകരണം വഴി ഇത് കോണ്ഫിഗര് ചെയ്തേക്കാം. + + റീലോഞ്ചിനെ/റീസ്റ്റാർട്ട് ചെയ്യലിനെ തുടർന്ന് ഉപയോക്താവിന്റെ സെഷൻ പുനഃസ്ഥാപിക്കപ്പെടും.</translation> <translation id="9165792353046089850">കണക്റ്റ് ചെയ്ത USB ഉപകരണങ്ങളിലേക്ക് വെബ്സൈറ്റുകൾക്ക് ആക്സസ് അനുവദിക്കണോ എന്ന് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ആക്സസ് പൂർണ്ണമായും ബ്ലോക്ക് ചെയ്യാം, അല്ലെങ്കിൽ വെബ്സൈറ്റിന് കണക്റ്റ് ചെയ്ത USB ഉപകരണങ്ങളിലേക്ക് ആക്സസ് ആവശ്യമുള്ളപ്പോഴെല്ലാം ഉപയോക്താവിനോട് അക്കാര്യം ചോദിക്കാം. 'WebUsbAskForUrls' നയവും 'WebUsbBlockedForUrls' നയവും ഉപയോഗിക്കുന്ന നിർദ്ദിഷ്ട URL പാറ്റേണുകൾക്ക് ഈ നയം അസാധുവാക്കാവുന്നതാണ്. @@ -3464,7 +3496,7 @@ ഉപകരണ വാൾപേപ്പർ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഉപയോക്താവിന്റെ വാൾപേപ്പർ സജ്ജമാക്കുകയാണെങ്കിൽ എന്താണ് ദൃശ്യമാക്കേണ്ടത് എന്ന് തീരുമാനിക്കുന്നത് ഉപയോക്താവിന്റെ വാൾപേപ്പർ നയമാണ്.</translation> <translation id="9217154963008402249">നെറ്റ്വർക്ക് പാക്കറ്റുകളുടെ നിരീക്ഷണ ഇടവേള</translation> <translation id="922540222991413931">വിപുലീകരണം, അപ്ലിക്കേഷൻ, ഉപയോക്തൃ സ്ക്രിപ്റ്റ് ഇൻസ്റ്റാൾ ഉറവിടങ്ങൾ എന്നിവ കോൺഫിഗർ ചെയ്യുക</translation> -<translation id="924557436754151212">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള സംരക്ഷിച്ച പാസ്വേഡുകൾ ഇംപോർട്ട് ചെയ്യുക</translation> +<translation id="924557436754151212">ആദ്യ റൺ ചെയ്യലിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുമുള്ള സംരക്ഷിച്ച പാസ്വേഡുകൾ ഇമ്പോർട്ട് ചെയ്യുക</translation> <translation id="930930237275114205"><ph name="PRODUCT_FRAME_NAME" /> ഉപയോക്തൃ ഡാറ്റ ഡയറക്ടറി സജ്ജീകരിക്കുക</translation> <translation id="943865157632139008"><ph name="PRODUCT_FRAME_NAME" /> ഇന്സ്റ്റാൾ ചെയ്യപ്പെട്ടിരിക്കുമ്പോള് ഡിഫോൾട്ട് HTML റെന്ഡറര് കോണ്ഫിഗര് ചെയ്യാന് നിങ്ങളെ അനുവദിക്കുന്നു. ഹോസ്റ്റ് ബ്രൗസറിനെ റെന്ഡര് ചെയ്യാന് അനുവദിക്കുകയാണ് ഡിഫോൾട്ട് ക്രമീകരണം ചെയ്യുന്നത്, എന്നാല് നിങ്ങള്ക്ക് വേണമെങ്കില് ഇത് അസാധുവാക്കുകയും ഡിഫോൾട്ടായി HTML പേജുകള് റെന്ഡര് ചെയ്യാന് <ph name="PRODUCT_FRAME_NAME" /> ഉപയോഗിക്കുകയും ചെയ്യാം.</translation>
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index 309bba0..83ff1f6 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -378,6 +378,7 @@ ही सेटिंग सेट न केलेली ठेवल्यास, वापरकर्ता हे कार्य वापरायचे की नाही हे ठरवू शकतो.</translation> <translation id="2006530844219044261">उर्जा व्यवस्थापन</translation> <translation id="201557587962247231">डिव्हाइस स्थिती अहवाल अपलोडची वारंवारता</translation> +<translation id="2017301949684549118">शांतपणे इंस्टॉल केल्या जाणाऱ्या वेब अॅपसाठी URL.</translation> <translation id="2018836497795982119">डिव्हाइस व्यवस्थापन सेवेकडे वापरकर्ता धोरण माहितीसाठी क्वेरी करण्यात आली तो कालावधी मिलीसेकंदात निर्दिष्ट करते. हे धोरण सेट केल्याने 3 तासांचे डीफॉल्ट मूल्य ओलांडले जाते. या धोरणासाठी वैध मूल्ये 1800000 (30 मिनिटे) ते 86400000 (1 दिवसाच्या) श्रेणीत आहेत. या श्रेणीत नसणारी कोणतीही मूल्ये अनुक्रमे सीमारेखांवर बद्ध करण्यात येतील. प्लॅटफॉर्म धोरण सूचनांचे समर्थन करत असल्यास, रिफ्रेश विलंब 24 तासांसाठी सेट केला जाईल कारण असे अपेक्षित आहे की जेव्हा धोरण बदलेल तेव्हा धोरण सूचना स्वयंचलितपणे रिफ्रेश करण्याची सक्ती केली जाईल. @@ -713,6 +714,11 @@ 'DefaultSearchProviderEnabled' धोरण सक्षम केले असते तेव्हा हा पर्याय सेट करणे आवश्यक आहे आणि केवळ याच बाबतीत तो विचारात घेतला जाईल.</translation> +<translation id="2659019163577049044">हे सेटिंग सुरू केल्यास, वापरकर्त्यांना त्यांचे फोन आणि Chromebooks मध्ये एसएमएस मेसेज सिंक करण्यासाठी त्यांची डिव्हाइस सेट करण्याची अनुमती दिली जाईल. या धोरणाची अनुमती दिली गेल्यास, वापरकर्त्यांनी सेटअप फ्लो पूर्ण करून या वैशिष्ट्याची स्पष्टपणे निवड करणे आवश्यक आहे. सेटअप फ्लो पूर्ण झाल्यावर, वापरकर्त्यांना त्यांच्या Chromebooks वर एसएमएस मेसेज पाठवता आणि मिळवता येतील. + + हे सेटिंग बंद केल्यास, वापरकर्त्यांना एसएमएस सिंकिंग सेट करण्याची अनुमती दिली जाणार नाही. + + हे धोरण सेट न केलेले ठेवल्यास, व्यवस्थापित वापरकर्त्यांसाठी डीफॉल्टला अनुमती नाही आणि व्यवस्थापित नसलेल्या वापरकर्त्यांना अनुमती आहे.</translation> <translation id="2660846099862559570">कधीही प्रॉक्सीचा वापर करु नका</translation> <translation id="267596348720209223">शोध प्रदात्याकडून समर्थित वर्ण एन्कोडिंग निर्दिष्ट करते. एन्कोडिंग या UTF-8, GB2312, आणि ISO-8859-1 सारखी कोड पृष्ठ नावे आहेत. ती दिलेल्या क्रमाने वापरुन पाहिली जातात. हे धोरण पर्यायी आहे. सेट न केल्यास, डीफॉल्ट वापरले जाईल, जे UTF-8 आहे. @@ -784,7 +790,6 @@ तुम्ही हे सेटिंग बंद केल्यास किंवा एखादी ठराविक निवड सेट न केल्यास, प्रिंट प्रीव्ह्यू, अगदी अलीकडे वापरण्यात आलेल्या प्रिंटरची डीफॉल्ट स्थान म्हणून निवड करेल. तुम्ही हे सेटिंग चालू केल्यास, प्रिंट प्रीव्ह्यू, OS सिस्टम डीफॉल्ट प्रिंटरची डीफॉल्ट स्थान म्हणून निवड करेल.</translation> -<translation id="2867699958489427143">OS आवृत्ती लक्ष्यापेक्षा नवीन असल्यास, रोल बॅक करा आणि लक्ष्य आवृत्तीवर रहा. प्रक्रियेदरम्यान संपूर्ण Powerwash करा.</translation> <translation id="2872961005593481000">बंद करा</translation> <translation id="2874209944580848064">Android अॅप्सचे समर्थन करणार्या <ph name="PRODUCT_OS_NAME" /> डिव्हाइसेेससाठी टीप:</translation> <translation id="2877225735001246144">Kerberos प्रमाणीकरण निगोशिएट करताना CNAME पाहणे अक्षम करा</translation> @@ -1071,7 +1076,6 @@ <translation id="3715569262675717862">क्लायंट प्रमाणपत्रांवर आधारित ऑथेंटिकेशन</translation> <translation id="3734995764843493369">दररोज पासवर्ड टाकणे आवश्यक आहे (24 तास).</translation> <translation id="3736879847913515635">वापरकर्ता व्यवस्थापकामध्ये व्यक्ती जोडणे सक्षम करा</translation> -<translation id="3737544779868348650">डिव्हाइस नेटवर्क होस्ट नाव</translation> <translation id="3746590506846867985"> हे धोरण साइन-इन स्क्रीनला लागू होते. कृपया वापरकर्ता सेशनला लागू होणारे <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> धोरणदेखील पहा. दोन्ही धोरणे एकाच मूल्यावर सेट करण्याची शिफारस केली जाते. मूल्ये न जुळल्यास, वापरकर्ता धोरणाने निर्दिष्ट केलेले मूल्य लागू केले जात असताना वापरकर्ता सेशन एंटर करताना विलंब होऊ शकतो. धोरण सुरू केलेले असल्यास, स्वल्पविरामाने वेगळ्या केलेल्या सूचीमधील प्रत्येक नाव दिलेली उत्पत्ती तिच्या स्वतःच्या प्रक्रियेत रन होईल. यामुळे सबडोमेननी नाव दिलेल्या उत्पत्तीदेखील आयसोलेट केल्या जातील; उदा. https://example.com/ निर्दिष्ट केल्याने https://foo.example.com/ ला https://example.com/ साइटचा भाग म्हणून आयसोलेट केले जाईल. @@ -1189,6 +1193,7 @@ प्रत्येक सूची प्रविष्टीमध्ये एक शब्दकोश असतो ज्यात 'विस्तार- आयडी ' फील्डमध्ये विस्तार आयडी आणि 'अपडेट-url' फील्डमधील त्याची अपडेट URL समाविष्ट करणे आवश्यक आहे.</translation> <translation id="3874773863217952418">शोधण्यासाठी टॅप करा सुरू करा</translation> <translation id="3877517141460819966">अंतर्गत द्वितीय घटक प्रमाणीकरण मोड</translation> +<translation id="3879208481373875102">सक्तीने इंस्टॉल केलेल्या वेब अॅप्सची सूची कॉन्फिगर करा</translation> <translation id="388237772682176890">SPDY/3.1 समर्थन काढल्याने हे धोरण M53 मध्ये बहिष्कृत केले आणि M54 मधून काढले आहे. <ph name="PRODUCT_NAME" /> मध्ये SPDY प्रोटोकॉलचा वापर अक्षम करते. @@ -1476,6 +1481,10 @@ या धोरणाच्या संपूर्ण तपशील आणि योग्य सेटिंग्ज व रचनेसाठी कृपया https://www.chromium.org/administrators/policy-list-3/extension-settings-full ला भेट द्या </translation> <translation id="4554651132977135445">वापरकर्ता धोरण लूपबॅक प्रक्रिया मोड</translation> +<translation id="4554841826517980623">हे धोरण <ph name="PRODUCT_NAME" /> साठी नेटवर्क फाइल शेअर वैशिष्ट्याने नेटवर्कवरील शेअर शोधण्यासाठी <ph name="NETBIOS_PROTOCOL" /> वापरावा का ते नियंत्रित करते. + हे धोरण सत्य वर सेट केले असल्यास, नेटवर्कवर शेअर शोधण्यासाठी शेअर शोध <ph name="NETBIOS_PROTOCOL" /> प्रोटोकॉल वापरेल. + हे धोरण असत्य वर सेट केले असल्यास, शेअर शोधण्यासाठी शेअर शोध <ph name="NETBIOS_PROTOCOL" /> प्रोटोकॉल वापरणार नाही. + धोरण सेट न केलेले ठेवल्यास, एंटरप्राइझ-व्यवस्थापित वापरकर्त्यांसाठी डीफॉल्ट बंद केले जाते आणि व्यवस्थापित न केलेल्या वापरकर्त्यांसाठी सुरू केले जाते.</translation> <translation id="4555850956567117258">वापरकर्त्यासाठी दूरस्थ अनुप्रमाणन सक्षम करा</translation> <translation id="4557134566541205630">डीफॉल्ट शोध प्रदाता नवीन टॅब पृष्ठ URL</translation> <translation id="4567137030726189378">डेव्हलपर टूलच्या वापराला अनुमती द्या</translation> @@ -1973,6 +1982,7 @@ हे धोरण सेट न करता सोडल्यास, जेव्हा प्रथम लॉगिन स्क्रीन दर्शविली जाते तेव्हा बोललेला अभिप्राय अक्षम केला जातो. वापरकर्ते कोणत्याही वेळी बोललेला अभिप्राय आणि वापरकर्त्यांमध्ये कायम असलेली लॉगिन स्क्रीनवरील त्याची स्थिती सक्षम किंवा अक्षम करू शकतात.</translation> <translation id="5868414965372171132">वापरकर्ता स्तरीय नेटवर्क कॉन्फिगरेशन</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> मार्फत नेटवर्क फाइल शेअर शोध नियंत्रित करते</translation> <translation id="5883015257301027298">डीफॉल्ट कुकीज सेटिंग</translation> <translation id="5887414688706570295">TalkGadget उपसर्ग कॉन्फिगर करते जे दूरस्थ प्रवेश होस्टद्वारे वापरले जाते आणि वापरकर्त्यास त्यास वापरण्यापासून प्रतिबंधित करते. निर्दिष्ट केल्यास, हा उपसर्ग TalkGadget करिता एक पूर्ण डोमेन तयार करण्यासाठी आधारभूत TalkGadget नावामध्ये योजला आहे. आधारभूत TalkGadget डोमेन नाव '.talkgadget.google.com' हे आहे. @@ -2434,6 +2444,18 @@ सेट न केल्यास, वापरकर्त्यास आयात करायचे की नाही ते विचारले जाईल, किंवा आयात स्वयंचलितपणे होईल.</translation> <translation id="7063895219334505671">या साइटवर पॉपअपना परवानगी द्या</translation> +<translation id="706568410943497889"> + धोरण सत्य वर सेट केले असल्यास, <ph name="PRODUCT_NAME" /> ला Google सेवांवरून (उदा. Google Meet) WebRTC इव्हेंट लॉग गोळा करण्याची आणि ते लॉग Google वर अपलोड करण्याची अनुमती दिली जाते. + + धोरण असत्य वर सेट केले असल्यास, किंवा सेट केलेले नसल्यास <ph name="PRODUCT_NAME" /> असे लॉग गोळा किंवा अपलोड करू शकत नाही. + + या लॉगमध्ये Chrome मध्ये ऑडिओ आणि व्हिडिओ कॉलमधील समस्या डिबगिंग करताना उपयुक्त असलेली निदान माहिती असते, जसे की पाठवलेल्या आणि मिळवलेल्या RTP पॅकेटची वेळ आणि आकार, नेटवर्कवरील दाटीबद्दल फीडबॅक आणि ऑडिओ व व्हिडिओ फ्रेमची वेळ आणि गुणवत्तेबद्दल मेटाडेटा. या लॉगमध्ये कॉलमधील ऑडिओ किंवा व्हिडिओ आशय नसतो. + + Chrome चे हे डेटा संकलन फक्त Google Hangouts किंवा Google +Meet यांसारख्या Google च्या वेब सेवा ट्रिगर करू शकतात. + + सेशन आयडी वापरून, Google सेवेने स्वतः गोळा केलेल्या इतर लॉगसोबत Google हे लॉग संलग्न करू शकते; डिबगिंग आणखी सोपे करणे हा याचा उद्देश आहे. + </translation> <translation id="706669471845501145">साइटना डेस्कटॉप सूचना दर्शवण्याची परवानगी द्या</translation> <translation id="7070525176564511548">प्रत्येक आठवड्याला पासवर्ड टाकणे आवश्यक आहे (168 तास)</translation> <translation id="7072208053150563108">मशीन पासवर्ड बदलण्याचा रेट</translation> @@ -2581,6 +2603,9 @@ <translation id="7336878834592315572">सत्राच्या कालावधीसाठी कुकीज ठेवा</translation> <translation id="7340034977315324840">डीव्हाइस क्रियाकलाप वेळांचा अहवाल द्या</translation> <translation id="7343497214039883642">डीव्हाइससाठी एंटरप्राइझ प्रिंटर कॉन्फिगरेशन फाइल</translation> +<translation id="7349338075015720646">शांतपणे, वापरकर्ता संवादाशिवाय आणि वापरकर्त्याला अनइंस्टॉल किंवा बंद करता येणार नाहीत अशा इंस्टॉल केलेल्या वेबसायटींची सूची निर्दिष्ट करते. + + धोरणाचा प्रत्येक सूची आयटम दोन मेंबर असलेला ऑब्जेक्ट आहे: "url" आणि "launch_container". "url" इंस्टॉल करायच्या असलेल्या वेब अॅप ची URL असली पाहिजे आणि "launch_container" वेब अॅप इंस्टॉल केल्यावर ते कसे उघडले जाईल हे निर्देशित करण्यासाठी "विंडो" किंवा "टॅब" असले पाहिजे. "launch_container" वगळल्यास, Chrome ला ते प्रगतीशील वेब अॅप आहे असे वाटल्यास अॅप विंडोमध्ये, अन्यथा टॅबमध्ये लाँच होईल.</translation> <translation id="7367028210010532881">संभाव्यतः त्रासदायक म्हणून फ्लॅग केलेल्या साइटवर जेव्हा वापरकर्ते नेव्हिगेट करतात तेव्हा सुरक्षित ब्राउझिंग सेवा एक धोक्याची सूचना असलेले पेज दाखवते. ही सेटिंग सुरू करण्यामुळे वापरकर्त्यांना धोक्याची सूचना असलेल्या पेजवरून कशाही प्रकारे त्रासदायक साइटवर पुढे जाण्यापासून रोखले जाते. ही सेटिंग बंद केली असल्यास किंवा कॉन्फिगर केली नसल्यास वापरकर्ते धोक्याची सूचना दर्शवल्यानंतर फ्लॅग केलेल्या साइटवर पुढे जाण्याचा पर्याय निवडू शकतात. @@ -3076,6 +3101,7 @@ येथे "आवृत्ती" म्हणजे '61.0.3163.120' सारखी नेमकी आवृत्ती किंवा '61.0' सारखा आवृत्ती उपसर्ग असू शकतो </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> साठी डीफॉल्ट HTML प्रस्तुतकर्ता</translation> +<translation id="8544465954173828789">एसएमएस मेसेज फोनवरून Chromebook वर सिंक करू द्या.</translation> <translation id="8549772397068118889">सामग्री पॅक बाहेरील साइटना भेट देताना चेतावणी द्या</translation> <translation id="8566842294717252664">नवीन टॅब पृष्ठ आणि अॅप लाँचरवरुन वेब स्टोअर लपवा</translation> <translation id="8586528890725660268">वापरकर्त्याला वापरता न येणारे प्रिंटर निर्दिष्ट करते. @@ -3119,6 +3145,11 @@ हे धोरण सेट न करता सोडून दिल्यास, पासवर्ड संरक्षण सेवा फक्त Google पासवर्डचे संरक्षण करेल पण वापरकर्ता हे सेटिंग बदलू शकेल.</translation> <translation id="8672321184841719703">लक्ष्य स्वयं अपडेट आवृत्ती</translation> <translation id="867410340948518937">U2F (युनिव्हर्सल सेकंड फॅक्टर)</translation> +<translation id="8682611302223077049">तुम्हाला मिलिसेकंदांमध्ये कालावधी सेट करू देते, ज्यात वापरकर्त्यांना सूचित केले जाते की <ph name="PRODUCT_NAME" /> रीलाँच केले जाणे आवश्यक आहे किंवा प्रलंबित अपडेट लागू करण्यासाठी <ph name="PRODUCT_OS_NAME" /> डिव्हाइस रीस्टार्ट केले जाणे आवश्यक आहे. + + या कालावधीत, वापरकर्त्याला अपडेट करण्याच्या गरजेबाबत वारंवार कळवले जाते. <ph name="PRODUCT_OS_NAME" /> डिव्हाइससाठी, अपग्रेड आढळल्यावर सिस्टम ट्रेमध्ये रीस्टार्ट सूचना दिसते. <ph name="PRODUCT_NAME" /> ब्राउझरसाठी, एक तृतीयांश सूचना कालावधी संपल्यावर रीलाँच आवश्यक आहे हे सूचित करण्यासाठी अॅप मेनू बदलतो. दोन तृतीयांश सूचना कालावधी संपल्यावर आणि पुन्हा संपूर्ण सूचना कालावधी संपल्यावर या सूचनेचा रंग बदलतो. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> धोरणाने सुरू केलेल्या अतिरिक्त सूचना हेच शेड्युल फॉलो करतात. + + सेट केलेले नसल्यास, <ph name="PRODUCT_OS_NAME" /> डिव्हाइससाठी ३४५६००००० मिलिसेकंद (चार दिवस) आणि <ph name="PRODUCT_NAME" /> साठी ६०४८००००० मिलिसेकंद (एक आठवडा) डीफॉल्ट कालावधी वापरला जातो.</translation> <translation id="8685024486845674965">पासवर्ड पुन्हा वापरला गेल्यामुळे पासवर्ड संरक्षण चेतावणी ट्रिगर होते</translation> <translation id="8693243869659262736">अंगभूत DNS क्लायंट वापरा</translation> <translation id="8704831857353097849">अक्षम केलेल्या प्लगइनची सूची</translation> @@ -3164,6 +3195,7 @@ हा मोजण्याचा घटक 100% किंवा अधिक असणे आवश्यक आहे. नियमित स्क्रीन मंद होण्याच्या विलंबापेक्षा लहान असलेल्या सादरीकरणातील स्क्रीन मंद होण्याचा विलंब करणारी मूल्ये अनुमत नाहीत.</translation> <translation id="8798099450830957504">डीफॉल्ट</translation> +<translation id="8801680448782904838">ब्राउझर रीलाँच किंवा डिव्हाइस रीस्टार्टची शिफारस केली आहे किंवा ते आवश्यक आहे याबाबत वापरकर्त्याला सूचित करा</translation> <translation id="8818173863808665831">डिव्हाइसच्या भौगोलिक स्थानाचा अहवाल द्या. धोरण सेट न केल्यास किंवा चुकीचे वर सेट केल्यास स्थानाचा अहवाल दिला जाणार नाही.</translation> @@ -3382,6 +3414,11 @@ हे धोरण सत्य वर सेट केल्यास, वापरकर्ता डिव्हाइस बंद करतो तेव्हा <ph name="PRODUCT_OS_NAME" /> रीबूट ट्रिगर करेल. <ph name="PRODUCT_OS_NAME" /> UI मधील बंद करण्याचे सर्व बटण रीबूट बटणांशी बदलून टाकेल. उर्जा बटण वापरून वापरकर्ता डिव्हाइस बंद करतो तेव्हा, धोरण सक्षम केले असले तरीही ते स्वयंचलितपणे रीबूट होणार नाही.</translation> <translation id="9152473318295429890">वेब पेज संबंधित संदर्भीय सूचना सुरू करा</translation> <translation id="9158929520101169054">ब्राउझरमध्ये एकाधिक साइन-इन करण्याची अनुमती द्या</translation> +<translation id="9159126470527871268">प्रलंबित अपडेट लागू करण्यासाठी <ph name="PRODUCT_NAME" /> रीलाँच करणे आवश्यक आहे किंवा <ph name="PRODUCT_OS_NAME" /> रीस्टार्ट करणे आवश्यक आहे याबाबत वापरकर्त्यांना सूचित करा. + + ब्राउझर रीलाँच किंवा डिव्हाइस रीस्टार्टची शिफारस केली जाते किंवा ते आवश्यक आहे हे वापरकर्त्याला कळवण्यासाठी हे धोरण सेटिंग सूचना सुरू करते. सेट केलेले नसल्यास, मेनूमध्ये सूक्ष्म बदल करून रीलाँच करणे आवश्यक असल्याचे <ph name="PRODUCT_NAME" /> वापरकर्त्याला सूचित करते, तर <ph name="PRODUCT_OS_NAME" /> सिस्टम ट्रेमधील सूचनेमार्फत असे सूचित करते. 'शिफारस केली जाते' वर सेट केलेले असल्यास, रीलाँचची शिफारस केली जाते अशी आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. रीलाँच पुढे ढकलण्यासाठी वापरकर्ता ही चेतावणी डिसमिस करू शकतो. 'आवश्यक' वर सेट केलेले असल्यास, सूचना कालावधी संपल्यावर ब्राउझर रीलाँच सक्तीने केले जाईल असे सूचित करणारी आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. डीफॉल्ट कालावधी <ph name="PRODUCT_NAME" /> साठी सात दिवस आणि <ph name="PRODUCT_OS_NAME" /> साठी चार दिवस आहे आणि तो <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> धोरण सेटिंगमार्फत कॉन्फिगर केला जाऊ शकतो. + + रीलाँच/रीस्टार्ट केल्यानंतर वापरकर्त्याचे सेशन रीस्टोअर केले जाते.</translation> <translation id="9165792353046089850">वेबसाइटना कनेक्ट केलेल्या USB डिव्हाइसमध्ये अॅक्सेस मिळविण्याची अनुमती द्यावी किंवा नाही ते सेट करण्याची तुम्हाला अनुमती देते. अॅक्सेस पूर्णपणे ब्लॉक केला जाऊ शकतो किंवा वेबसाइटला कनेक्ट केलेल्या USB डिव्हाइसमध्ये अॅक्सेस करायचे असताना प्रत्येक वेळी वापरकर्त्यास विचारले जाऊ शकते. 'WebUsbAskForUrls' आणि 'WebUsbBlockedForUrls' धोरणांचा वापर करून विशिष्ट URL पॅटर्नसाठी हे धोरण ओव्हरराइड केले जाऊ शकते.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index f56e4bb..031c7474 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -749,7 +749,6 @@ Jika anda melumpuhkan tetapan ini atau tidak menetapkan nilai, Pratonton Cetakan akan menggunakan pencetak yang paling baru digunakan sebagai pilihan destinasi lalai. Jika anda mendayakan tetapan ini, Pratonton Cetakan akan menggunakan pencetak lalai sistem OS sebagai pilihan destinasi lalai.</translation> -<translation id="2867699958489427143">Undur dan kekal pada versi sasaran jika versi OS lebih baharu daripada sasaran. Lakukan powerwash lengkap semasa proses.</translation> <translation id="2872961005593481000">Mematikan</translation> <translation id="2874209944580848064">Nota untuk peranti <ph name="PRODUCT_OS_NAME" /> yang menyokong apl Android:</translation> <translation id="2877225735001246144">Lumpuhkan carian CNAME apabila berunding pengesahan Kerberos</translation> @@ -994,7 +993,6 @@ <translation id="3711895659073496551">Gantung</translation> <translation id="3715569262675717862">Pengesahan berdasarkan sijil klien</translation> <translation id="3736879847913515635">Dayakan tambah orang dalam pengurus pengguna</translation> -<translation id="3737544779868348650">Nama hos rangkaian peranti</translation> <translation id="3746590506846867985"> 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/.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 78a6cda..74fcfb5 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -353,6 +353,7 @@ <translation id="199764499252435679">Componentupdates in <ph name="PRODUCT_NAME" /> inschakelen</translation> <translation id="2006530844219044261">Energiebeheer</translation> <translation id="201557587962247231">De frequentie van uploads van rapporten over de apparaatstatus</translation> +<translation id="2017301949684549118">URL's voor web-apps die op de achtergrond worden geïnstalleerd.</translation> <translation id="2018836497795982119">Hiermee wordt de periode in milliseconden gespecificeerd waarna de apparaatbeheerservice wordt gevraagd om informatie over het gebruikersbeleid. Als je dit beleid instelt, wordt de standaardwaarde van 3 uur overschreven. Geldige waarden voor dit beleid liggen tussen 1800000 (30 minuten) en 86400000 (1 dag). Alle waarden die niet binnen dit bereik vallen, worden afgerond tot de betreffende minimum- of maximumgrens. Als het platform beleidsmeldingen ondersteunt, wordt de vernieuwingsvertraging ingesteld op 24 uur omdat beleidsmeldingen naar verwachting automatisch een vernieuwing afdwingen wanneer het beleid wordt gewijzigd. @@ -660,6 +661,11 @@ De zoek-URL van Google kan worden opgegeven als: <ph name="GOOGLE_SEARCH_URL" />. Deze optie moet worden ingesteld wanneer het beleid 'DefaultSearchProviderEnabled' is ingeschakeld en wordt alleen gerespecteerd als dit het geval is.</translation> +<translation id="2659019163577049044">Als deze instelling is ingeschakeld, mogen gebruikers instellen dat sms-berichten worden gesynchroniseerd tussen hun telefoons en Chromebooks. Als dit beleid wordt toegestaan, moeten gebruikers zich expliciet aanmelden voor deze functie door een instelprocedure te voltooien. Zodra deze procedure is doorlopen, kunnen gebruikers sms-berichten verzenden en ontvangen via hun Chromebooks. + + Als deze instelling is uitgeschakeld, mogen gebruikers geen sms-synchronisatie instellen. + + Als dit beleid niet wordt ingesteld, is sms-synchronisatie standaard toegestaan voor beheerde gebruikers en niet toegestaan voor niet-beheerde gebruikers.</translation> <translation id="2660846099862559570">Nooit een proxy gebruiken</translation> <translation id="267596348720209223">Hiermee worden de tekencoderingen gespecificeerd die door de zoekprovider worden ondersteund. Deze coderingen zijn codepaginanamen zoals UTF-8, GB2312 en ISO-8859-1. Ze worden getest in de volgorde waarin ze worden opgegeven. @@ -730,7 +736,6 @@ Als je deze instelling uitschakelt of geen waarde instelt, gebruikt Afdrukvoorbeeld de laatst gebruikte printer als standaardbestemming. Als je deze instelling inschakelt, gebruikt Afdrukvoorbeeld de standaardprinter van het besturingssysteem als standaardbestemming.</translation> -<translation id="2867699958489427143">Herstel en blijf op de doelversie als de OS-versie nieuwer is dan de doelversie. Doe een volledige powerwash tijdens het proces.</translation> <translation id="2872961005593481000">Afsluiten</translation> <translation id="2874209944580848064">Opmerking voor <ph name="PRODUCT_OS_NAME" />-apparaten die Android-apps ondersteunen:</translation> <translation id="2877225735001246144">CNAME-lookup uitschakelen bij het verwerken van Kerberos-authenticatie</translation> @@ -975,7 +980,6 @@ <translation id="3711895659073496551">Onderbreken</translation> <translation id="3715569262675717862">Verificatie op basis van clientcertificaten</translation> <translation id="3736879847913515635">'Persoon toevoegen' inschakelen in gebruikersbeheer</translation> -<translation id="3737544779868348650">Hostnaam van apparaat in netwerk</translation> <translation id="3746590506846867985"> Dit beleid is van toepassing op het inlogscherm. Zie ook het beleid <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, dat van toepassing is op de gebruikerssessie. Het is raadzaam beide beleidsregels op dezelfde waarde in te stellen. Als de waarden niet overeenkomen, kan dit een vertraging veroorzaken bij het openen van een gebruikerssessie terwijl de waarde wordt toegepast die in het gebruikersbeleid is opgegeven. Als het beleid is ingeschakeld, wordt elk van de benoemde herkomsten (origins) 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/. @@ -1090,6 +1094,7 @@ Elke lijstvermelding bevat een woordenboek dat de extensie-ID moet bevatten in het veld 'Extensie-ID' en de update-URL in het veld 'Update-URL'.</translation> <translation id="3874773863217952418">'Tikken om te zoeken' inschakelen</translation> <translation id="3877517141460819966">Geïntegreerde modus voor authenticatie met twee factoren</translation> +<translation id="3879208481373875102">Lijst met afgedwongen geïnstalleerde web-apps instellen</translation> <translation id="388237772682176890">Dit beleid is beëindigd in M53 en is verwijderd in M54, omdat de ondersteuning voor SPDY/3.1 is verwijderd. Hiermee wordt het gebruik van het SPDY-protocol in <ph name="PRODUCT_NAME" /> uitgeschakeld. @@ -1332,6 +1337,10 @@ Ga naar https://www.chromium.org/administrators/policy-list-3/extension-settings-full voor een volledige beschrijving van de mogelijke instellingen en de structuur van dit beleid. </translation> <translation id="4554651132977135445">Loopback-verwerkingsmodus voor gebruikersbeleid</translation> +<translation id="4554841826517980623">Dit beleid bepaalt of de functie 'Network File Shares' voor <ph name="PRODUCT_NAME" /> het <ph name="NETBIOS_PROTOCOL" />-protocol moet gebruiken om shares te detecteren in het netwerk. + Als dit beleid is ingesteld op 'True' (Waar), wordt voor de detectie van shares in het netwerk gebruikgemaakt van het <ph name="NETBIOS_PROTOCOL" />-protocol. + Als dit beleid is ingesteld op 'False' (Onwaar), wordt voor de detectie van shares geen gebruik gemaakt van het <ph name="NETBIOS_PROTOCOL" />-protocol. + Als het beleid niet wordt ingesteld, is de functie standaard uitgeschakeld voor gebruikers die op ondernemingsniveau worden beheerd en ingeschakeld voor niet-beheerde gebruikers.</translation> <translation id="4555850956567117258">Externe bevestiging van gebruiker inschakelen</translation> <translation id="4557134566541205630">URL van standaard zoekprovider voor nieuwe tabbladpagina</translation> <translation id="4567137030726189378">Het gebruik van de hulpprogramma's voor ontwikkelaars toestaan</translation> @@ -1752,6 +1761,7 @@ Als je het beleid niet instelt, wordt gesproken feedback uitgeschakeld wanneer het inlogscherm voor het eerst wordt weergegeven. Gebruikers kunnen gesproken feedback op elk moment in- of uitschakelen en de status op het inlogscherm is permanent tussen gebruikers.</translation> <translation id="5868414965372171132">Netwerkconfiguratie op gebruikersniveau</translation> +<translation id="5879014913445067283">Bepaalt de detectiemethode van 'Network File Shares' via <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Standaardinstelling voor cookies</translation> <translation id="5887414688706570295">Hiermee configureer je het voorvoegsel voor het TalkGadget dat wordt gebruikt door hosts voor externe toegang en voorkom je dat gebruikers dit wijzigen. @@ -2203,6 +2213,17 @@ Als dit beleid niet wordt ingesteld, kan de gebruiker worden gevraagd of deze wil importeren, of wordt er automatisch geïmporteerd.</translation> <translation id="7063895219334505671">Pop-ups toestaan op deze sites</translation> +<translation id="706568410943497889"> + Als het beleid is ingesteld op 'True' (Waar), mag <ph name="PRODUCT_NAME" /> WebRTC-gebeurtenislogboeken verzamelen van Google-services (zoals Google Meet) en deze logboeken uploaden naar Google. + + Als het beleid is ingesteld op 'False' (Onwaar) of niet wordt ingesteld, mag <ph name="PRODUCT_NAME" /> deze logboeken niet verzamelen of uploaden. + + Deze logboeken bevatten diagnostische informatie die handig is voor het oplossen van problemen met audio- of videogesprekken in Chrome. Deze informatie betreft bijvoorbeeld het tijdstip en de grootte van verzonden en ontvangen RTP-pakketten, feedback over overbelasting van het netwerk en metadata over de duur en kwaliteit van audio- en videoframes. Deze logboeken bevatten geen audio of video van het gesprek. + + Chrome verzamelt deze gegevens alleen als Chrome wordt getriggerd door webservices van Google, zoals Google Hangouts of Google Meet. + + Google mag deze logboeken aan de hand van de sessie-ID koppelen aan andere logboeken die door de Google-service zelf zijn verzameld. Het doel hiervan is dat fouten makkelijker kunnen worden opgelost. + </translation> <translation id="706669471845501145">Sites toestaan bureaubladmeldingen weer te geven</translation> <translation id="7072208053150563108">Wijzigingsfrequentie van computerwachtwoord</translation> <translation id="7074513465313721551">Stel de lijst met domeinen in die door Safe Browsing worden vertrouwd. Dit betekent het volgende: @@ -2336,6 +2357,9 @@ <translation id="7336878834592315572">Cookies bewaren voor de duur van de sessie</translation> <translation id="7340034977315324840">Tijdsduur van apparaatgebruik melden</translation> <translation id="7343497214039883642">Configuratiebestand voor zakelijke printers voor apparaten</translation> +<translation id="7349338075015720646">Specificeert een lijst met websites die op de achtergrond worden geïnstalleerd zonder interactie van de gebruiker en die niet kunnen worden verwijderd of uitgeschakeld door de gebruiker. + + Elk item op de lijst van het beleid is een tweeledig object, bestaande uit 'url' en 'launch_container'. 'url' moet de URL van de te installeren web-app zijn en 'launch_container' moet 'window' of 'tab' zijn om aan te duiden hoe de web-app na de installatie wordt geopend. Als 'launch_container' wordt weggelaten, wordt de app geopend in een venster indien Chrome de app als progressieve web-app beschouwt en op een tabblad indien de app niet als progressieve web-app wordt beschouwd.</translation> <translation id="7367028210010532881">De service Safe Browsing geeft een waarschuwingspagina weer wanneer gebruikers naar sites gaan die als potentieel schadelijk zijn gemarkeerd. Als je deze instelling inschakelt, voorkom je dat gebruikers vanaf de waarschuwingspagina toch doorgaan naar de schadelijke site. Als deze instelling is uitgeschakeld of niet is geconfigureerd, kunnen gebruikers ervoor kiezen door te gaan naar de gemarkeerde site nadat de waarschuwing is weergegeven. @@ -2793,6 +2817,7 @@ 'Versie' kan hier een exacte versie zijn, zoals '61.0.3163.120', of een versievoorvoegsel, zoals '61.0'. </translation> <translation id="8544375438507658205">Standaard HTML-renderer voor <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Toestaan dat sms-berichten worden gesynchroniseerd tussen telefoon en Chromebook.</translation> <translation id="8549772397068118889">Waarschuwen als sites worden bezocht die zich niet in de inhoudspakketten bevinden</translation> <translation id="8566842294717252664">De Web Store verbergen op de pagina 'Nieuw tabblad' en in de App Launcher</translation> <translation id="8586528890725660268">Hiermee worden de printers gespecificeerd die een gebruiker niet kan gebruiken. @@ -2837,6 +2862,11 @@ Als dit beleid niet is ingesteld, beschermt de wachtwoordbeveiligingsservice alleen Google-wachtwoorden, maar kan de gebruiker deze instelling wijzigen.</translation> <translation id="8672321184841719703">Doelversie voor automatische updates</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Hiermee kun je een periode in milliseconden instellen waarin aan gebruikers wordt gemeld dat <ph name="PRODUCT_NAME" /> of een <ph name="PRODUCT_OS_NAME" />-apparaat opnieuw moet worden opgestart om een beschikbare update toe te passen. + + Gedurende deze periode wordt de gebruiker herhaaldelijk geïnformeerd over het belang van de update. Op <ph name="PRODUCT_OS_NAME" />-apparaten wordt een melding dat opnieuw moet worden opgestart, weergegeven in het systeemvak zodra er een upgrade wordt gedetecteerd. In <ph name="PRODUCT_NAME" />-browsers wordt nadat een derde van de meldingstijd is verstreken, in het app-menu aangegeven dat opnieuw moet worden opgestart. Deze melding verandert van kleur zodra twee derde van de meldingsperiode is verstreken en nogmaals wanneer de volledige meldingsperiode is verstreken. De extra meldingen die worden geactiveerd door het beleid <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, volgen dezelfde planning. + + Als dit beleid niet is ingesteld, wordt een standaardperiode van 345.600.000 milliseconden (vier dagen) gebruikt voor <ph name="PRODUCT_OS_NAME" />-apparaten en 604.800.000 milliseconden (één week) voor <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Waarschuwing voor wachtwoordbeveiliging wordt geactiveerd bij hergebruik van een wachtwoord</translation> <translation id="8693243869659262736">Ingebouwde DNS-client gebruiken</translation> <translation id="8704831857353097849">Lijst met uitgeschakelde plug-ins</translation> @@ -2881,6 +2911,7 @@ De schaalfactor moet 100% of meer zijn. Waarden waarmee de inactieve vertraging in presentatiemodus korter wordt dan de normale inactieve vertraging, zijn niet toegestaan.</translation> <translation id="8798099450830957504">Standaard</translation> +<translation id="8801680448782904838">Een gebruiker laten weten dat het aanbevolen of vereist is om de browser of het apparaat opnieuw op te starten</translation> <translation id="8818173863808665831">De geografische locatie van het apparaat rapporteren. Als het beleid niet is ingesteld of is ingesteld op 'False', wordt de locatie niet gerapporteerd.</translation> @@ -3046,6 +3077,11 @@ Als dit beleid wordt ingesteld op 'waar', activeert <ph name="PRODUCT_OS_NAME" /> een herstart wanneer de gebruiker het apparaat afsluit. <ph name="PRODUCT_OS_NAME" /> vervangt alle instanties van afsluitknoppen in de gebruikersinterface door herstartknoppen. Als de gebruiker het apparaat afsluit met de aan/uit-knop, wordt het apparaat niet automatisch opnieuw opgestart, ook niet wanneer het beleid is ingeschakeld.</translation> <translation id="9152473318295429890">Contextuele suggesties van gerelateerde webpagina's inschakelen</translation> <translation id="9158929520101169054">Toegang tot meerdere accounts toestaan in de browser</translation> +<translation id="9159126470527871268">Hiermee laat je gebruikers weten dat <ph name="PRODUCT_NAME" /> of <ph name="PRODUCT_OS_NAME" /> opnieuw moet worden opgestart om een beschikbare update toe te passen. + + Met deze beleidsinstelling worden meldingen ingeschakeld waarmee de gebruiker wordt gevraagd of aangeraden om de browser of het apparaat opnieuw op te starten. Als dit beleid niet is ingesteld, laat <ph name="PRODUCT_NAME" /> de gebruiker via kleine wijzigingen in het menu weten dat opnieuw moet worden opgestart. Voor <ph name="PRODUCT_OS_NAME" /> wordt deze melding weergegeven in het systeemvak. Als dit beleid is ingesteld op Aanbevolen, wordt er een herhaalde waarschuwing weergegeven om de gebruiker te laten weten dat opnieuw opstarten wordt aanbevolen. De gebruiker kan deze waarschuwing negeren om de actie uit te stellen. Als dit is ingesteld op Vereist, wordt er een herhaalde waarschuwing weergegeven om de gebruiker te laten weten dat de browser automatisch opnieuw wordt opgestart zodra de meldingsperiode is verstreken. De standaardperiode is zeven dagen voor <ph name="PRODUCT_NAME" /> en vier dagen voor <ph name="PRODUCT_OS_NAME" /> en kan worden aangepast via de beleidsinstelling <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + De sessie van de gebruiker wordt hersteld zodra opnieuw is opgestart.</translation> <translation id="9165792353046089850">Hiermee kun je instellen of websites toegang mogen krijgen tot aangesloten USB-apparaten. De toegang kan volledig worden geblokkeerd of de gebruiker kan elke keer om toestemming worden gevraagd wanneer een website toegang wil hebben tot aangesloten USB-apparaten. Dit beleid kan worden overschreven voor bepaalde URL-patronen door gebruik te maken van de beleidsregels WebUsbAskForUrls en WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index b3e46c88..07c672a1 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -346,6 +346,7 @@ <translation id="199764499252435679">Aktivér komponentoppdateringer i <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Strømstyring</translation> <translation id="201557587962247231">Frekvensen for opplasting av statusrapporter for enheter</translation> +<translation id="2017301949684549118">Nettadresser for nettprogrammer som skal installeres gjennom stum installasjon.</translation> <translation id="2018836497795982119">Angir perioden i millisekunder for når tjenesten for enhetsbehandling skal spørres om brukerinnstillinger. Hvis du angir denne regelen, overstyres standardverdien på tre timer. Gyldige verdier for denne regelen er i området mellom 1800000 (30 minutter) og 86400000 (1 dag). Eventuelle verdier som ikke er i dette området, blir endret til den respektive grensen. Hvis plattformen støtter varsler om brudd på reglene, angis forsinkelsen for ny innlasting til 24 timer, fordi det forventes at varsler om brudd på reglene fremtvinger ny innlasting automatisk når regelen endres. @@ -652,6 +653,11 @@ Googles nettadresse for søk kan spesifiseres slik: <ph name="GOOGLE_SEARCH_URL" />. Dette alternativet må spesifiseres når regelen DefaultSearchProviderEnabled er slått på. Hvis ikke ignoreres det.</translation> +<translation id="2659019163577049044">Hvis denne innstillingen er slått på, kan brukere konfigurere enhetene sine til å synkronisere SMS-er mellom telefoner og Chromebook. Merk at hvis dette er tillatt, må brukere uttrykkelig velge denne funksjonen ved å fullføre en konfigureringsprosess. Når konfigureringsprosessen er fullført, kan brukere sende og motta SMS-er på Chromebook. + + Hvis denne innstillingen er slått av, kan ikke brukere konfigurere SMS-synkronisering. + + Hvis denne regelen ikke er angitt, er dette ikke tillatt som standard for administrerte brukere, og tillatt for ikke-administrerte brukere.</translation> <translation id="2660846099862559570">Aldri bruk mellomtjener</translation> <translation id="267596348720209223">Angir tegnkodingen som støttes av søkeleverandøren. Kodingene er kodesidenavn som UTF-8, GB2312 og ISO-8859-1. De prøves i oppgitt rekkefølge. @@ -722,7 +728,6 @@ Hvis du deaktiverer denne innstillingen eller ikke angir noen verdi, brukes skriveren som ble brukt sist, som standard destinasjonsvalg i forhåndsvisningen for utskrifter. Hvis du aktiverer denne innstillingen, brukes skriveren som er standard for OS-et, som standard destinasjonsvalg.</translation> -<translation id="2867699958489427143">Rull tilbake til og bli på målversjonen hvis OS-versjonen er nyere enn målet. Utfør en fullstendig powerwash i løpet av prosessen.</translation> <translation id="2872961005593481000">Slå av</translation> <translation id="2874209944580848064">Merknad for <ph name="PRODUCT_OS_NAME" />-enheter som støtter Android-apper:</translation> <translation id="2877225735001246144">Deaktiver CNAME-oppslag under forhandling om Kerberos-godkjenning</translation> @@ -959,7 +964,6 @@ <translation id="3711895659073496551">Suspender</translation> <translation id="3715569262675717862">Autentisering basert på klientsertifikater</translation> <translation id="3736879847913515635">Slå på «Legg til person» i brukeradministreringen</translation> -<translation id="3737544779868348650">Vertsnavn for enheten på nettverket</translation> <translation id="3746590506846867985"> Denne regelen gjelder for påloggingsskjermen. Se også <ph name="ISOLATE_ORIGINS_POLICY_NAME" />-regelen, 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 @@ -1070,6 +1074,7 @@ Hver oppføring på listen inneholder en ordliste som må inkludere utvidelse-ID-en i feltet for utvidelse-ID samt dets oppdateringsnettadresse i feltet for oppdateringsnettadresse.</translation> <translation id="3874773863217952418">Slå på Trykk for å søke</translation> <translation id="3877517141460819966">Modus for integrert tofaktor-autentisering</translation> +<translation id="3879208481373875102">Konfigurer en liste over administratorinstallerte nettprogrammer</translation> <translation id="388237772682176890">Denne regelen ble avviklet i M53 og fjernet i M54, fordi støtten for SPDY/3.1 ble fjernet. Slår av bruken av SPDY-protokollen i <ph name="PRODUCT_NAME" />. @@ -1314,6 +1319,10 @@ For å få en fullstendig beskrivelse over mulige innstilinger samt strukturen i denne regelen, gå til https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Behandlingsmodus for tilbakekobling av brukerinnstillinger</translation> +<translation id="4554841826517980623">Denne regelen kontrollerer om funksjonen for fildeling på nettverket for <ph name="PRODUCT_NAME" /> skal bruke <ph name="NETBIOS_PROTOCOL" /> for å finne delte filer på nettverket. + Når denne regelen er satt til sann (true), brukes <ph name="NETBIOS_PROTOCOL" />-protokollen til å finne delinger på nettverket. + Når denne regelen er satt til usann (false), kan ikke <ph name="NETBIOS_PROTOCOL" />-protokollen brukes til å finne delinger. + Hvis denne regelen ikke er angitt, er den som standard slått av for bedriftsadministrerte brukere, og slått på for ikke-administrerte brukere.</translation> <translation id="4555850956567117258">Slå på ekstern attestasjon for brukeren</translation> <translation id="4557134566541205630">Nettadresse for ny fane for standard søkeleverandør</translation> <translation id="4567137030726189378">Tillat bruk av utviklerverktøy</translation> @@ -1731,6 +1740,7 @@ Hvis innstillingen ikke angis, deaktiveres muntlig tilbakemelding når påloggingssiden vises for første gang. Brukere kan aktivere eller deaktivere muntlig tilbakemelding når som helst, og dens status på påloggingssiden forblir den samme mellom brukere.</translation> <translation id="5868414965372171132">Nettverkskonfigurasjon på brukernivå</translation> +<translation id="5879014913445067283">Kontrollerer funn av fildelinger på nettverket via <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Standardinnstilling for informasjonskapsler</translation> <translation id="5887414688706570295">Konfigurerer TalkGadget-prefikset som skal brukes av verter med ekstern adgang, og forhindrer brukere fra å endre det. @@ -2188,6 +2198,17 @@ Hvis denne innstillingen er deaktivert, kan ikke brukerne sende utskrift tl <ph name="CLOUD_PRINT_NAME" /> fra <ph name="PRODUCT_NAME" />-utskriftsdialogen</translation> <translation id="7053678646221257043">Denne retningslinjen fremtvinger import av bokmerker fra gjeldende standard nettleser, hvis den er aktivert. Hvis den er aktivert, påvirker denne retningslinjen også importeringsdialogen. Hvis den er deaktivert, kan det hende brukeren blir spurt om vedkommende vil importere, eller så kan importen skje automatisk.</translation> <translation id="7063895219334505671">Tillat forgrunnsvindu på disse nettstedene</translation> +<translation id="706568410943497889"> + Hvis regelen er satt til sann (true), kan <ph name="PRODUCT_NAME" /> samle inn WebRTC-aktivitetslogger fra Google-tjenester (f.eks. Google Meet) og laste opp disse loggene til Google. + + Hvis denne regelen er satt til usann (false) eller ikke er angitt, kan ikke <ph name="PRODUCT_NAME" /> samle inn eller laste opp slike logger. + + Disse loggene inneholder diagnostikkinformasjon som er nyttig ved feilsøking av problemer med lyd- eller videoanrop i Chrome, for eksempel tidspunkt for og størrelse på sendte og mottatte RTP-pakker, tilbakemelding om overbelastning av nettverket samt metadata om tid og kvalitet for lyd- og videorammer. Loggene inneholder ikke lyd- eller videoinnhold fra samtaler. + + Denne datainnsamlingen av Chrome kan kun bli utløst av Googles nettjenester, for eksempel Google Hangouts eller Google Meet. + + Google kan knytte disse loggene, via en økt-ID, sammen med andre logger som er samlet inn av Google-tjenesten, for å gjøre feilsøking enklere. + </translation> <translation id="706669471845501145">Tillat nettsteder å vise varsler på skrivebordet</translation> <translation id="7072208053150563108">Endringsfrekvens for maskinpassord</translation> <translation id="7074513465313721551">Konfigurer listen over domener som Safe Browsing skal stole på. Dette betyr at @@ -2321,6 +2342,9 @@ <translation id="7336878834592315572">Behold informasjonskapsler så lenge økten varer</translation> <translation id="7340034977315324840">Rapportering av aktivitetstider for enhet</translation> <translation id="7343497214039883642">Konfigurasjonsfil for enheter på bedriftsskriver</translation> +<translation id="7349338075015720646">Spesifiserer en liste over nettsteder som er installert gjennom stum installasjon (uten brukerinteraksjon), og som brukere ikke kan avinstallere eller slå av. + + Hvert element på regellisten er et objekt med to medlemmer: «url» og «launch_container». «url» bør være nettadressen for nettprogrammet som skal installeres, og «launch_container» bør være enten «window» (vindu) eller «tab» (fane) for å avgjøre hvordan nettprogrammet skal åpnes når det er installert. Hvis «launch_container» ikke er oppført, åpnes programmet i et vindu hvis Chrome anser det som et progressivt nettprogram. Hvis ikke åpnes det i en fane.</translation> <translation id="7367028210010532881">Safe Browsing-tjenesten viser en advarselsside når brukere navigerer til nettsteder som er merket som potensielt skadelige. Hvis du slår på denne innstillingen, kan ikke brukerne ignorere advarselssiden og gå videre til det skadelige nettstedet. Hvis denne innstillingen er slått av eller ikke er konfigurert, kan brukerne velge å gå videre til det rapporterte nettstedet etter å ha sett advarselen. @@ -2784,6 +2808,7 @@ «Version» her kan enten være et eksakt versjonsnummer som «61.0.3163.120» eller et versjonsprefiks som «61.0». </translation> <translation id="8544375438507658205">Standard gjengivelse av HTML for <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Tillat synkronisering av SMS-er fra telefon til Chromebook.</translation> <translation id="8549772397068118889">Varsle ved besøk på nettsteder som ikke inngår i innholdspakker</translation> <translation id="8566842294717252664">Skjul nettbutikken fra nye faner og appvelgeren</translation> <translation id="8586528890725660268">Angir skriverne som en bruker ikke kan bruke. @@ -2828,6 +2853,11 @@ Hvis regelen ikke er angitt, beskytter passordbeskyttelsestjenesten bare Google-passord, men brukeren kan endre denne innstillingen.</translation> <translation id="8672321184841719703">Målversjon for automatiske oppdateringer</translation> <translation id="867410340948518937">Universal tofaktor-autentisering (U2F)</translation> +<translation id="8682611302223077049">Du kan spesifisere tidsperioden (i millisekunder) før brukere blir varslet om at <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" /> må startes på nytt på grunn av en ventende oppdatering. + + I denne tidsperioden blir brukeren gjentatte ganger informert om at oppdateringen må installeres. For <ph name="PRODUCT_OS_NAME" />-enheter vises omstartvarsler i systemfeltet når en oppdatering er tilgjengelig. For <ph name="PRODUCT_NAME" />-nettlesere endres appmenyen for å indikere at en omstart er nødvendig, etter at en tredjedel av varslingsprosessen er fullført. Dette varselet endrer farge når to tredjedeler av varslingsprosessen er fullført, og igjen når varslingsperioden er over fullstendig. Andre varsler som slås på av <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-regelen, følger den samme tidsplanen. + + Hvis denne regelen ikke er angitt, brukes standardperioden på 345 600 000 millisekunder (fire dager) for <ph name="PRODUCT_OS_NAME" />-enheter og 604 800 000 millisekunder (én uke) for <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Advarselen om passordbeskyttelse utløses ved gjenbruk av passord</translation> <translation id="8693243869659262736">Bruk innebygd DNS-klient</translation> <translation id="8704831857353097849">Liste over deaktiverte programtillegg</translation> @@ -2868,6 +2898,7 @@ Skaleringsfaktoren må være på minst 100 %. Det er ikke tillatt med verdier som gjør inaktivitetsforsinkelsen i presentasjonsmodus kortere enn den er ved vanlig bruk.</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8801680448782904838">Varsle en bruker om at nettleseren eller enheten bør eller må startes på nytt</translation> <translation id="8818173863808665831">Rapportering av enhetens geografiske posisjon. Hvis denne innstillingen ikke er angitt, eller er satt til «false», blir ikke posisjonen rapportert.</translation> @@ -3016,6 +3047,11 @@ Hvis denne regelen settes til sann, gjør <ph name="PRODUCT_OS_NAME" /> at enhetene starter på nytt når brukerne slår dem av. Alle «slå av»-knappene i <ph name="PRODUCT_OS_NAME" />-brukergrensesnittet blir byttet ut med «start på nytt»-knapper. Hvis brukerne slår av enhetene med den fysiske av/på-knappen, starter de ikke på nytt – selv om regelen er slått på.</translation> <translation id="9152473318295429890">Aktiver kontekstavhengige forslag for lignende nettsider</translation> <translation id="9158929520101169054">Tillat multipålogging i nettleseren</translation> +<translation id="9159126470527871268">Varsle brukere om at <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" /> må startes på nytt på grunn av en ventende oppdatering. + + Med denne regelen aktiveres varsler for å informere brukeren om at nettleseren eller enheten bør eller må startes på nytt. Hvis regelen ikke er angitt, varsler <ph name="PRODUCT_NAME" /> brukeren om at det er nødvendig med en omstart ved hjelp av diskrete endringer i menyen, mens <ph name="PRODUCT_OS_NAME" /> varsler om omstart gjennom et varsel i systemfeltet. Hvis regelen er angitt som «Recommended» (anbefalt), ser brukeren en gjentakende advarsel om at en omstart er anbefalt. Brukeren kan avvise advarselen for å utsette omstarten. Hvis regelen er angitt som «Required» (obligatorisk), ser brukeren en gjentakende advarsel om at en tvungen omstart utføres når varselperioden er utløpt. Denne perioden er som standard syv dager for <ph name="PRODUCT_NAME" /> og fire dager for <ph name="PRODUCT_OS_NAME" />, og kan konfigureres via regelen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Brukerens økt gjenopprettes etter omstarten.</translation> <translation id="9165792353046089850">Gjør det mulig å velge om nettsteder kan få tilgang til tilkoblede USB-enheter. Tilgangen kan blokkeres helt, eller brukeren kan bli spurt hver gang et nettsted vil ha tilgang til tilkoblede USB-enheter. Denne regelen kan overstyres for spesifikke nettadressemønstre ved hjelp av WebUsbAskForUrls- og WebUsbBlockedForUrls-reglene.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index ffb04ec..5d2ddd4 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -350,6 +350,7 @@ <translation id="199764499252435679">Włącz aktualizacje komponentów w: <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Zarządzanie energią</translation> <translation id="201557587962247231">Częstotliwość pobierania raportów o stanie urządzenia</translation> +<translation id="2017301949684549118">Adresy URL aplikacji internetowych do zainstalowania po cichu.</translation> <translation id="2018836497795982119">Określa, co ile milisekund do usługi zarządzania urządzeniami będzie wysyłane zapytanie o zasady dotyczące użytkowników. Skonfigurowanie tej zasady powoduje zastąpienie wartości domyślnej 3 godzin. Dozwolone są wartości od 1 800 000 (30 minut) do 86 400 000 (1 dzień). Wartości spoza tego zakresu zostaną sprowadzone do odpowiedniej wartości granicznej. Jeśli platforma obsługuje powiadomienia o naruszeniu zasad, czas odświeżania będzie ustawiony na 24 godziny, ponieważ powiadomienia te powinny automatycznie wymuszać odświeżenie po każdej zmianie zasad. @@ -653,6 +654,11 @@ URL wyszukiwania Google to: <ph name="GOOGLE_SEARCH_URL" />. Ta opcja musi być ustawiona w przypadku włączenia zasady „DefaultSearchProviderEnabled” i tylko wtedy będzie egzekwowana.</translation> +<translation id="2659019163577049044">Jeśli to ustawienie jest włączone, użytkownicy będą mogli włączyć synchronizację SMS-ów między telefonem a Chromebookiem. Jeśli jest to dozwolone, użytkownicy muszą włączyć ją samodzielnie, wykonując proces konfiguracji. Po ukończeniu procesu konfiguracji użytkownicy mogą wysyłać i odbierać SMS-y na swoich Chromebookach. + + Jeśli to ustawienie jest wyłączone, użytkownicy nie będą mogli skonfigurować synchronizacji SMS-ów. + + Jeśli ta zasada pozostanie nieskonfigurowana, synchronizacja SMS-ów będzie domyślnie niedozwolona dla użytkowników zarządzanych i dozwolona dla niezarządzanych.</translation> <translation id="2660846099862559570">Nigdy nie używaj serwera proxy</translation> <translation id="267596348720209223">Pozwala określić kodowania znaków obsługiwane przez dostawcę wyszukiwania. Kodowania są określane za pomocą nazw stron kodowych, np. UTF-8, GB2312 czy ISO-8859-1. Są stosowane w podanej kolejności. Ta zasada jest opcjonalna. Jeśli nie zostanie skonfigurowana, będzie używana wartość domyślna, czyli UTF-8. Zasada ta jest stosowana tylko przy włączonej zasadzie „DefaultSearchProviderEnabled”.</translation> <translation id="268577405881275241">Włącz serwer proxy kompresowania danych</translation> @@ -719,7 +725,6 @@ Jeśli wyłączysz to ustawienie lub pozostawisz je puste, w podglądzie wydruku zostanie wybrana ostatnio użyta drukarka. Jeśli włączysz to ustawienie, w podglądzie wydruku zostanie wybrana domyślna drukarka systemowa.</translation> -<translation id="2867699958489427143">Cofnięcie i pozostawienie docelowej wersji systemu operacyjnego, jeśli zainstalowana jest wersja nowsza niż docelowa. W trakcie tego procesu zostanie wykonana pełna procedura Powerwash.</translation> <translation id="2872961005593481000">Wyłącz</translation> <translation id="2874209944580848064">Uwaga dotycząca urządzeń z <ph name="PRODUCT_OS_NAME" /> obsługujących aplikacje na Androida:</translation> <translation id="2877225735001246144">Wyłącz wyszukiwanie rekordu CNAME podczas negocjowania uwierzytelniania Kerberos</translation> @@ -957,7 +962,6 @@ <translation id="3711895659073496551">Wstrzymaj</translation> <translation id="3715569262675717862">Uwierzytelnianie na podstawie certyfikatów klienta</translation> <translation id="3736879847913515635">Włączanie dodawania osób w menedżerze użytkowników</translation> -<translation id="3737544779868348650">Sieciowa nazwa hosta urządzenia</translation> <translation id="3746590506846867985"> 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/ @@ -1061,6 +1065,7 @@ Każda pozycja listy zawiera słownik, w którym obowiązkowe pola „extension-id” i „update-url” muszą zawierać odpowiednio identyfikator rozszerzenia i adres URL aktualizacji.</translation> <translation id="3874773863217952418">Włącz funkcję Kliknij, by wyszukać</translation> <translation id="3877517141460819966">Tryb zintegrowanego uwierzytelniania dwuskładnikowego</translation> +<translation id="3879208481373875102">Skonfiguruj listę aplikacji internetowych, których instalacja jest wymuszana</translation> <translation id="388237772682176890">Ta zasada jest wycofywana w wersji M53 i usunięta w wersji M54 z powodu usunięcia obsługi SPDY/3.1. Wyłącza protokół SPDY w <ph name="PRODUCT_NAME" />. @@ -1304,6 +1309,10 @@ Pełny opis dostępnych ustawień i struktury tej zasady można znaleźć na stronie https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Tryb przetwarzania w pętli zasad dotyczących użytkowników</translation> +<translation id="4554841826517980623">Ta zasada określa, czy funkcja sieciowych magazynów plików w <ph name="PRODUCT_NAME" /> ma używać <ph name="NETBIOS_PROTOCOL" /> do wykrywania udziałów w sieci. + Gdy zasada ma wartość prawda, udziały w sieci będą wykrywane przy użyciu protokołu <ph name="NETBIOS_PROTOCOL" />. + Gdy zasada ma wartość fałsz, udziały w sieci nie będą wykrywane przy użyciu protokołu <ph name="NETBIOS_PROTOCOL" />. + Jeśli zasada pozostanie nieskonfigurowana, będzie domyślnie wyłączona dla użytkowników zarządzanych przez firmę i włączona dla użytkowników niezarządzanych.</translation> <translation id="4555850956567117258">Włącz zaświadczanie zdalne dla użytkownika</translation> <translation id="4557134566541205630">URL strony nowej karty domyślnego dostawcy wyszukiwania</translation> <translation id="4567137030726189378">Zezwól na używanie narzędzi dla programistów</translation> @@ -1693,6 +1702,7 @@ Jeśli zasada pozostanie nieustawiona, po pierwszym wyświetleniu ekranu logowania potwierdzenia głosowe są wyłączone. Użytkownicy mogą je w każdej chwili włączyć lub wyłączyć i ich stan na ekranie logowania jest trwały dla wszystkich użytkowników.</translation> <translation id="5868414965372171132">Konfiguracja sieci na poziomie użytkownika</translation> +<translation id="5879014913445067283">Kontroluje wykrywanie sieciowych magazynów plików za pomocą <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Domyślne ustawienie plików cookie</translation> <translation id="5887414688706570295">Konfiguruje przedrostek gadżetu TalkGadget, który będzie używany przez hosty zdalnego dostępu, i uniemożliwia użytkownikom jego zmianę. @@ -2124,6 +2134,17 @@ <translation id="7049373494483449255">Pozwala <ph name="PRODUCT_NAME" /> przesyłać dokumenty do <ph name="CLOUD_PRINT_NAME" /> w celu wydrukowania. UWAGA: to ustawienie wpływa tylko na obsługę <ph name="CLOUD_PRINT_NAME" /> w <ph name="PRODUCT_NAME" />. Nie uniemożliwia użytkownikom drukowania za pośrednictwem innych witryn. W przypadku włączenia lub nieskonfigurowania tego ustawienia, użytkownicy będą mogli drukować w <ph name="CLOUD_PRINT_NAME" /> z okna drukowania w <ph name="PRODUCT_NAME" />. Jeśli to ustawienie zostanie wyłączone, użytkownicy nie będą mogli drukować za pomocą <ph name="CLOUD_PRINT_NAME" /> w oknie drukowania przeglądarki <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">Po włączeniu tej zasady wymuszany jest import zakładek z bieżącej przeglądarki domyślnej. Włączenie zasady ma również wpływ na opcje w oknie dialogowym importowania. W przypadku jej wyłączenia zakładki nie są importowane. Jeśli zasada nie jest skonfigurowana, użytkownik może zostać zapytany, czy zakładki mają zostać zaimportowane lub operacja ta zostanie wykonana automatycznie.</translation> <translation id="7063895219334505671">Zezwalaj na wyskakujące okienka w tych witrynach</translation> +<translation id="706568410943497889"> + Jeśli zasada ma wartość prawda, <ph name="PRODUCT_NAME" /> może zbierać dzienniki zdarzeń WebRTC z usług Google (np. Google Meet) i przesyłać je do Google. + + Jeśli zasada ma wartość fałsz lub jest nieskonfigurowana, <ph name="PRODUCT_NAME" /> nie może zbierać ani przesyłać takich dzienników. + + Te dzienniki zawierają informacje diagnostyczne przydatne podczas debugowania problemów z rozmowami audio i wideo w Chrome, między innymi czas i wielkość wysłanych i odebranych pakietów RTP, informacje zwrotne o obciążeniu sieci oraz metadane o czasie i jakości ramek audio i wideo. Dzienniki nie zawierają treści audio ani wideo rozmów. + + Zbieranie tych danych przez Chrome może być uruchomione tylko przez usługi internetowe Google, takie jak Google Hangouts czy Google Meet. + + Google może powiązać te dzienniki za pomocą identyfikatora sesji z innymi dziennikami zebranymi przez same usługi Google – ma to na celu ułatwienie debugowania. + </translation> <translation id="706669471845501145">Zezwalaj witrynom na pokazywanie powiadomień na pulpicie</translation> <translation id="7072208053150563108">Częstotliwość zmieniania hasła komputera</translation> <translation id="7074513465313721551">Pozwala skonfigurować listę domen, którym będzie ufać Bezpieczne przeglądanie. Działanie zasady: @@ -2258,6 +2279,9 @@ <translation id="7336878834592315572">Zachowaj pliki cookie na czas trwania sesji</translation> <translation id="7340034977315324840">Zgłoś godziny aktywności urządzenia</translation> <translation id="7343497214039883642">Plik konfiguracji drukarek firmowych dla urządzeń</translation> +<translation id="7349338075015720646">Określa listę witryn internetowych instalowanych po cichu, bez interakcji z użytkownikiem, których użytkownik nie może odinstalować ani wyłączyć. + + Każda pozycja na liście jest obiektem o dwóch składowych: „url” i „launch_container”. „url” to URL aplikacji internetowej do zainstalowania, a „launch_container” może mieć wartość „window” (okno) lub „tab” (karta) wskazującą sposób otwierania zainstalowanej aplikacji. Jeśli element „launch_container” zostanie pominięty, aplikacja będzie otwierana w oknie, o ile Chrome uzna ją za progresywną aplikację internetową, a w przeciwnym razie na karcie.</translation> <translation id="7367028210010532881">Funkcja Bezpieczne przeglądanie wyświetla ostrzeżenie, gdy użytkownik chce wejść na stronę oznaczoną jako potencjalnie szkodliwa. Jeśli włączysz to ustawienie, użytkownicy nie będą mogli przechodzić ze strony ostrzeżenia na strony szkodliwe. Jeśli nie skonfigurujesz tego ustawienia lub je wyłączysz, użytkownicy będą mogli wybrać, czy chcą przejść ze strony ostrzeżenia na stronę oznaczoną jako szkodliwa. @@ -2715,6 +2739,7 @@ „Wersja” może być określona dokładnym numerem wersji, np. „61.0.3163.120”, lub prefiksem, np. „61.0”. </translation> <translation id="8544375438507658205">Domyślny mechanizm renderowania HTML wtyczki <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Zezwól na synchronizację SMS-ów między telefonem a Chromebookiem.</translation> <translation id="8549772397068118889">Ostrzegaj przy odwiedzaniu witryn spoza pakietów treści</translation> <translation id="8566842294717252664">Ukryj Chrome Web Store na stronie Nowa karta i w menu z aplikacjami</translation> <translation id="8586528890725660268">Określa drukarki, z których użytkownik nie może korzystać. @@ -2760,6 +2785,11 @@ Jeśli zasada nie jest skonfigurowana, usługa ochrony haseł będzie chronić tylko hasła do kont Google, a użytkownik może zmienić to ustawienie.</translation> <translation id="8672321184841719703">Wersja docelowa automatycznych aktualizacji</translation> <translation id="867410340948518937">U2F (Uniwersalne uwierzytelnianie dwuskładnikowe)</translation> +<translation id="8682611302223077049">Umożliwia określenie czasu (w milisekundach), przez który użytkownicy będą powiadamiani o konieczności ponownego uruchomienia <ph name="PRODUCT_NAME" /> lub urządzenia z <ph name="PRODUCT_OS_NAME" /> w celu zainstalowania oczekującej aktualizacji. + + Przez ten czas użytkownik będzie wciąż informowany o konieczności aktualizacji. Na urządzeniach z <ph name="PRODUCT_OS_NAME" /> po wykryciu aktualizacji powiadomienie o konieczności ponownego uruchomienia będzie wyświetlane w obszarze powiadomień. W przeglądarkach <ph name="PRODUCT_NAME" /> po upływie jednej trzeciej okresu powiadamiania zmieni się menu aplikacji. Powiadomienie zmieni kolor po upływie dwóch trzecich okresu powiadamiania i ponownie po upływie całego tego okresu. Dodatkowe powiadomienia, które włącza zasada <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, mają ten sam harmonogram. + + Jeśli zasada nie jest skonfigurowana, na urządzeniach z <ph name="PRODUCT_OS_NAME" /> stosowany jest domyślny czas 345 600 000 milisekund (cztery dni), a w <ph name="PRODUCT_NAME" /> – 604 800 000 milisekund (tydzień).</translation> <translation id="8685024486845674965">Ostrzeżenie dotyczące ochrony hasłem jest wyzwalane przez użycie tego samego hasła w innym miejscu</translation> <translation id="8693243869659262736">Użyj wbudowanego klienta DNS</translation> <translation id="8704831857353097849">Lista wyłączonych wtyczek</translation> @@ -2796,6 +2826,7 @@ Współczynnik skalowania musi wynosić co najmniej 100%. Wartości, przy których opóźnienie przyciemnienia ekranu w trybie prezentacji byłoby krótsze od standardowego opóźnienia tego rodzaju, są niedozwolone.</translation> <translation id="8798099450830957504">Domyślny</translation> +<translation id="8801680448782904838">Powiadamiaj użytkownika o tym, że zalecane lub wymagane jest ponowne uruchomienie przeglądarki lub urządzenia</translation> <translation id="8818173863808665831">Zgłoś lokalizację geograficzną urządzenia. Jeśli ta zasada nie jest ustawiona lub jest ustawiona na wartość nieprawdziwą, lokalizacja nie będzie zgłaszana.</translation> @@ -2945,6 +2976,11 @@ Jeśli zasada będzie włączona, <ph name="PRODUCT_OS_NAME" /> wymusi ponowne uruchomienie urządzenia, gdy użytkownik spróbuje je wyłączyć. <ph name="PRODUCT_OS_NAME" /> zastąpi wszystkie wystąpienia przycisku wyłączania w interfejsie użytkownika przyciskami ponownego uruchomienia. Urządzenie nie uruchomi się ponownie niezależnie od ustawienia tej zasady, jeśli użytkownik wyłączy je za pomocą przycisku zasilania.</translation> <translation id="9152473318295429890">Włącz kontekstowe proponowanie powiązanych stron</translation> <translation id="9158929520101169054">Zezwól na wielokrotne logowanie w przeglądarce</translation> +<translation id="9159126470527871268">Powiadamiaj użytkowników, że konieczne jest ponowne uruchomienie <ph name="PRODUCT_NAME" /> lub urządzenia z <ph name="PRODUCT_OS_NAME" /> w celu zainstalowania oczekującej aktualizacji. + + Ta zasada włącza powiadomienia informujące użytkownika, że zalecane lub wymagane jest ponowne uruchomienie przeglądarki lub urządzenia. Jeśli ta zasada nie jest skonfigurowana, <ph name="PRODUCT_NAME" /> informuje użytkownika o potrzebie ponownego uruchomienia za pomocą subtelnych zmian w swoim menu, a <ph name="PRODUCT_OS_NAME" /> informuje o tym za pomocą powiadomienia w obszarze powiadomień. Jeśli wybrano ustawienie „Zalecane”, użytkownikowi będzie pokazywane powtarzające się ostrzeżenie o tym, że zalecane jest ponowne uruchomienie przeglądarki. Użytkownik może zamknąć to powiadomienie, by odłożyć ponownie uruchomienie na później. Jeśli wybrano ustawienie „Wymagane”, użytkownikowi będzie pokazywane powtarzające się ostrzeżenie o tym, że po upływie okresu powiadamiania zostanie wymuszone ponowne uruchomienie przeglądarki. Okres domyślny to siedem dni w przypadku <ph name="PRODUCT_NAME" /> i cztery dni w przypadku <ph name="PRODUCT_OS_NAME" />. Okres można skonfigurować za pomocą zasady <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Po ponownym uruchomieniu zostanie przywrócona sesja użytkownika.</translation> <translation id="9165792353046089850">Pozwala określić, czy witryny mogą uzyskać dostęp do podłączonych urządzeń USB. Dostęp może być całkowicie zablokowany lub użytkownik może być pytany za każdym razem, gdy strona chce użyć takiego urządzenia. Ta zasada może zostać zastąpiona dla określonych wzorców adresów URL za pomocą zasad „WebUsbAskForUrls” i „WebUsbBlockedForUrls”.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 97c505a6..4c5ebba 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -347,6 +347,7 @@ <translation id="199764499252435679">Ativar atualizações de componentes no <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gerenciamento de energia</translation> <translation id="201557587962247231">Frequência de uploads de relatórios de status do dispositivo</translation> +<translation id="2017301949684549118">URLs para instalar apps da Web silenciosamente.</translation> <translation id="2018836497795982119">Especifica o período em milissegundos em que o serviço de gerenciamento de dispositivos é consultado para o recebimento de informações sobre a política do usuário. A definição dessa política modifica o valor padrão de três horas. Os valores válidos para essa política compreendem o período entre 1.800.000 (30 minutos) e 86.400.000 (1 dia). Todos os valores que não estiverem nesse período serão fixados no respectivo limite. Se a plataforma for compatível com as notificações sobre políticas, o atraso de atualização será definido para 24 horas, pois espera-se que as notificações sobre políticas forcem uma atualização automaticamente sempre que política for alterada. @@ -647,6 +648,11 @@ O URL de pesquisa do Google pode ser especificado como: <ph name="GOOGLE_SEARCH_URL" />. Esta opção deve ser definida quando a política "DefaultSearchProviderEnabled" estiver ativada e será respeitada somente se este for o caso.</translation> +<translation id="2659019163577049044">Se esta configuração estiver ativada, os usuários poderão configurar os dispositivos para sincronizar mensagens SMS entre os smartphones e Chromebooks deles. Se esta política for permitida, os usuários precisarão aceitar explicitamente esse recurso concluindo um fluxo de configuração. Após a conclusão desse fluxo, eles poderão enviar e receber mensagens SMS no Chromebook. + + Se esta configuração estiver desativada, os usuários não terão permissão para configurar a sincronização de SMS. + + Se esta política não for definida, o padrão será "não permitido" para usuários gerenciados e "permitido" para usuários não gerenciados.</translation> <translation id="2660846099862559570">Nunca usar um proxy</translation> <translation id="267596348720209223">Especifica a codificação de caracteres suportados pelo mecanismo de pesquisa. Codificações são nomes de código da página como UTF-8, GB2312 e ISO-8859-1. Eles são testados na ordem fornecida. Esta política é opcional. Se não for definida, será utilizado o padrão, UTF-8. Esta política só é respeitada se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> <translation id="268577405881275241">Ativar o recurso de proxy de compactação de dados</translation> @@ -713,7 +719,6 @@ Se você desativar essa configuração ou não inserir um valor, a Visualização de impressão utilizará a impressora usada mais recentemente como a escolha padrão. Se você ativar essa configuração, a Visualização de impressão utilizará a impressora padrão do sistema operacional como a escolha padrão.</translation> -<translation id="2867699958489427143">Faça a reversão e permaneça na versão de destino se a versão do SO for mais recente que a de destino. Faça um Powerwash completo durante o processo.</translation> <translation id="2872961005593481000">Encerrar</translation> <translation id="2874209944580848064">Observação para dispositivos <ph name="PRODUCT_OS_NAME" /> compatíveis com apps Android:</translation> <translation id="2877225735001246144">Desativar consulta CNAME ao negociar a autenticação do Kerberos</translation> @@ -950,7 +955,6 @@ <translation id="3711895659073496551">Suspender</translation> <translation id="3715569262675717862">Autenticação baseada em certificados do cliente</translation> <translation id="3736879847913515635">Ativar adição de uma pessoa no gerenciador de usuários</translation> -<translation id="3737544779868348650">Nome de host da rede do dispositivo</translation> <translation id="3746590506846867985"> Esta política se aplica à tela de login. Consulte também a política <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, que se aplica à sessão do usuário. É recomendado definir as duas políticas com o mesmo valor. Se os valores não coincidirem, poderá haver um atraso ao iniciar uma sessão do usuário enquanto o valor especificado pela política do usuário estiver sendo aplicado. Se a política estiver 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, a especificação de https://example.com/ também isolará https://foo.example.com/ como parte do site https://example.com/. @@ -1057,6 +1061,7 @@ Cada entrada da lista contém um dicionário que deve incluir a identificação de extensão no campo 'extensão-id', e o URL de atualização no campo 'update-url'.</translation> <translation id="3874773863217952418">Ativar "Tocar para pesquisar"</translation> <translation id="3877517141460819966">Modo de autenticação de segundo fator integrado</translation> +<translation id="3879208481373875102">Configura a lista de apps da Web de instalação forçada</translation> <translation id="388237772682176890">O uso dessa política foi suspenso no M53 e removido no M54, porque a compatibilidade com o SPDY/3.1 foi removida. Desativa o uso do protocolo SPDY no <ph name="PRODUCT_NAME" />. @@ -1290,6 +1295,10 @@ Para ver uma descrição de configurações e estruturas possíveis desta política, visite https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Modo de processamento loopback da política do usuário</translation> +<translation id="4554841826517980623">Esta política controla se o recurso "Compartilhamentos de arquivos de rede" do <ph name="PRODUCT_NAME" /> usará o <ph name="NETBIOS_PROTOCOL" /> para encontrar compartilhamentos na rede. + Quando esta política estiver definida como Verdadeira, a detecção de compartilhamentos usará o protocolo <ph name="NETBIOS_PROTOCOL" /> para encontrar compartilhamentos na rede. + Quando esta política estiver definida como Falsa, a detecção de compartilhamentos não usará o protocolo <ph name="NETBIOS_PROTOCOL" /> para encontrar compartilhamentos. + Quando a política não estiver definida, o padrão será "desativado" para usuários gerenciados por empresa e "ativado" para usuários não gerenciados.</translation> <translation id="4555850956567117258">Ativar declaração remota para o usuário</translation> <translation id="4557134566541205630">URL da página "Nova guia" do provedor de pesquisa padrão</translation> <translation id="4567137030726189378">Permite o uso das Ferramentas para Desenvolvedores</translation> @@ -1679,6 +1688,7 @@ Se esta política não for definida, o feedback falado será desativado quando a tela de login for exibida pela primeira vez. Os usuários podem ativar ou desativar o feedback falado a qualquer momento e seu status na tela de login continuará entre os usuários.</translation> <translation id="5868414965372171132">Configuração de rede em nível do usuário</translation> +<translation id="5879014913445067283">Controla a detecção de compartilhamentos de arquivos de rede por meio do <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Configuração de cookies padrão</translation> <translation id="5887414688706570295">Configura o prefixo TalkGadget que será usado pelos hosts de acesso remoto e impede os usuários de alterá-lo. @@ -2119,6 +2129,17 @@ <translation id="7049373494483449255">Permite que <ph name="PRODUCT_NAME" /> envie documentos a <ph name="CLOUD_PRINT_NAME" /> para impressão. OBSERVAÇÃO: isto só afeta o suporte do <ph name="CLOUD_PRINT_NAME" /> no <ph name="PRODUCT_NAME" />. Isto não impede que usuários enviem trabalhos de impressão em websites. Se esta configuração for ativada ou não configurada, os usuários podem imprimir no <ph name="CLOUD_PRINT_NAME" /> a partir da caixa de diálogo de impressão do <ph name="PRODUCT_NAME" />. Se esta configuração for desativada, os usuários não poderão imprimir no <ph name="CLOUD_PRINT_NAME" /> a partir da caixa de diálogo de impressão do <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Se ativada, esta política força a importação dos favoritos a partir do navegador padrão atual. Se ativada, esta política também afeta a caixa de diálogo de importação. Se desativada, nenhum favorito é importado. Se não for definida, o usuário pode ser solicitado a responder se deseja importar ou a importação pode ocorrer automaticamente.</translation> <translation id="7063895219334505671">Permitir pop-ups nestes sites</translation> +<translation id="706568410943497889"> + Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> poderá coletar logs de eventos WebRTC dos serviços do Google (por exemplo, Google Meet) e fazer upload desses registros para o Google. + + Se a política for definida como falsa ou não for definida, o <ph name="PRODUCT_NAME" /> não poderá coletar nem fazer upload desses registros. + + Esses registros contêm informações de diagnóstico importantes ao depurar problemas com chamadas de áudio ou videochamadas no Chrome, como o horário e o tamanho de pacotes RTP enviados e recebidos, feedback sobre congestionamento na rede e metadados sobre o horário e a qualidade de frames de áudio e vídeo. Esses registros não possuem conteúdo de áudio ou vídeo da chamada. + + Essa coleta de dados feita pelo Chrome só pode ser acionada pelos serviços da Web do Google, como o Hangouts ou o Google Meet. + + Por meio de um código de sessão, o Google pode associar esses registros com outros coletados pelo próprio serviço do Google, com a finalidade de facilitar a depuração. + </translation> <translation id="706669471845501145">Permitir que os sites exibam notificações da área de trabalho</translation> <translation id="7072208053150563108">Taxa de alteração da senha da máquina</translation> <translation id="7074513465313721551">Configure a lista de domínios em que o recurso Navegação segura confiará. Isso significa que: @@ -2250,6 +2271,9 @@ <translation id="7336878834592315572">Manter cookies enquanto durar a sessão</translation> <translation id="7340034977315324840">Informar horário das atividades do dispositivo</translation> <translation id="7343497214039883642">Arquivo de configuração de impressora empresarial para dispositivos</translation> +<translation id="7349338075015720646">Especifica uma lista de sites instalados silenciosamente sem a interação do usuário e que não podem ser desinstalados nem desativados pelo usuário. + + Cada item da lista da política é um objeto com dois membros: "url" e "launch_container". "url" é o URL do app da Web a ser instalado, e "launch_container" é a "janela" ou "guia" para indicar como o app da Web será aberto depois de instalado. Se "launch_container" for omitido, o app será aberto em uma janela se o Chrome o considerar um Progressive Web App. Caso contrário, será aberto em uma guia.</translation> <translation id="7367028210010532881">O serviço Navegação segura mostra uma página de aviso quando os usuários navegam em sites que são sinalizados como potencialmente mal-intencionados. A ativação desta configuração impede que os usuários prossigam de qualquer forma da página de aviso para esse site. Se esta configuração for desativada ou não for configurada, os usuários poderão optar por prosseguir para o site sinalizado após o aviso ser exibido. @@ -2697,6 +2721,7 @@ Aqui, "versão" pode ser uma versão exata como "61.0.3163.120" ou um prefixo de versão, como "61.0" </translation> <translation id="8544375438507658205">Renderizador padrão de HTML para o <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Permite a sincronização de mensagens SMS do smartphone com o Chromebook.</translation> <translation id="8549772397068118889">Avisar ao visitar sites fora de pacotes de conteúdo</translation> <translation id="8566842294717252664">Ocultar a loja on-line da página "Nova guia" e do Acesso rápido aos apps</translation> <translation id="8586528890725660268">Especifica as impressoras que um usuário não pode usar. @@ -2741,6 +2766,11 @@ Se esta política não for definida, o serviço de proteção de senhas protegerá apenas as senhas do Google, mas o usuário poderá alterar essa configuração.</translation> <translation id="8672321184841719703">Versão de atualização automática de destino</translation> <translation id="867410340948518937">Segundo fator universal (U2F, na sigla em inglês)</translation> +<translation id="8682611302223077049">Permite definir um período em milésimos de segundo em que os usuários são notificados de que o <ph name="PRODUCT_NAME" /> ou um dispositivo do <ph name="PRODUCT_OS_NAME" /> precisa ser reiniciado para aplicar uma atualização pendente. + + Nesse período, o usuário será informado várias vezes sobre a necessidade de atualização. Para dispositivos <ph name="PRODUCT_OS_NAME" />, uma notificação de reinicialização é exibida na bandeja do sistema quando um upgrade é detectado. Para navegadores do <ph name="PRODUCT_NAME" />, o menu de apps muda para indicar que uma reinicialização é necessária após o decorrer de um terço do período de notificação. Essa notificação muda de cor após dois terços do período de notificação e mais uma vez quando todo o período de notificação é concluído. As outras notificações ativadas pela política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seguem essa mesma programação. + + Se a política não for definida, o período padrão de 345.600.000 milésimos de segundo (quatro dias) será usado para dispositivos <ph name="PRODUCT_OS_NAME" />, e o de 604.800.000 milésimos de segundo (uma semana) será usado para o <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">O aviso de proteção de senha é acionado pela reutilização da senha</translation> <translation id="8693243869659262736">Usar cliente DNS integrado</translation> <translation id="8704831857353097849">Lista de plug-ins desativados</translation> @@ -2777,6 +2807,7 @@ O fator de escala deve ser de 100% ou mais. Não são permitidos valores que tornam o intervalo de escurecimento da tela no modo de apresentação menor do que o intervalo de escurecimento regular da tela.</translation> <translation id="8798099450830957504">Padrão</translation> +<translation id="8801680448782904838">Notifica um usuário de que a reinicialização do navegador ou do dispositivo é recomendada ou obrigatória</translation> <translation id="8818173863808665831">Informar a localização geográfica do dispositivo. Se a política não for configurada, ou for configurada como falsa, o local não será informado.</translation> @@ -2933,6 +2964,11 @@ Se esta política é definida como "true", o <ph name="PRODUCT_OS_NAME" /> aciona uma reinicialização quando o usuário desliga o dispositivo. O <ph name="PRODUCT_OS_NAME" /> substitui todas as ocorrências de botões de desligamento da interface de usuário por botões de reinicialização. Se o usuário desliga o dispositivo no botão liga/desliga, ele não é reinicializado automaticamente, mesmo que a política esteja ativa.</translation> <translation id="9152473318295429890">Ativa sugestões contextuais de páginas da Web relacionadas</translation> <translation id="9158929520101169054">Permitir login múltiplo no navegador</translation> +<translation id="9159126470527871268">Notifica os usuários de que é preciso reiniciar o <ph name="PRODUCT_NAME" /> ou o <ph name="PRODUCT_OS_NAME" /> para aplicar uma atualização pendente. + + A configuração desta política ativa notificações para informar o usuário de que a reinicialização do navegador ou do dispositivo é recomendada ou obrigatória. Se a política não for definida, o <ph name="PRODUCT_NAME" /> indicará para o usuário que a reinicialização é necessária por meio de pequenas alterações no menu dele, enquanto o <ph name="PRODUCT_OS_NAME" /> indicará isso por meio de uma notificação na bandeja do sistema. Se a política for definida como "Recomendada", um aviso recorrente será exibido para o usuário, informando que a reinicialização é recomendada. O usuário pode dispensar esse aviso para adiar a reinicialização. Se a política for definida como "Obrigatória", um aviso recorrente será exibido para o usuário, indicando que a reinicialização do navegador será forçada assim que o período de notificação terminar. O período padrão é de sete dias para o <ph name="PRODUCT_NAME" /> e de quatro dias para o <ph name="PRODUCT_OS_NAME" />. Também é possível configurar esse período por meio da definição da política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + A sessão do usuário é restaurada após a reinicialização.</translation> <translation id="9165792353046089850">Permite definir se os sites podem ter acesso aos dispositivos USB conectados. O acesso pode ser completamente bloqueado, ou uma pergunta será feita ao usuário toda vez que um site solicitar acesso a dispositivos USB conectados. Esta política pode ser substituída por padrões de URL específicos por meio das políticas "WebUsbAskForUrls" e "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 70c541e..d07fa73 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -356,6 +356,7 @@ <translation id="199764499252435679">Ativar as atualizações de componentes no <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestão de energia</translation> <translation id="201557587962247231">Frequência de carregamentos de relatórios de estado do dispositivo</translation> +<translation id="2017301949684549118">URLs para a instalação silenciosa de aplicações Web.</translation> <translation id="2018836497795982119">Especifica o período em milissegundos no qual o serviço de gestão de dispositivos é consultado quanto a informações da Política do Utilizador. A definição desta política substitui o valor predefinido de 3 horas. Os valores válidos para esta política encontram-se no intervalo de 1 800 000 (30 minutos) a 86 400 000 (1 dia). Quaisquer valores que não se encontrem neste intervalo são ajustados para o respetivo limite. Se a plataforma suportar notificações sobre políticas, o atraso de atualização é definido para 24 horas porque é esperado que as notificações sobre políticas forcem uma atualização automaticamente, sempre que a política sofrer alterações. @@ -665,6 +666,11 @@ O URL de pesquisa do Google pode ser especificado como <ph name="GOOGLE_SEARCH_URL" />. Esta opção tem de estar definida quando a política "DefaultSearchProviderEnabled" estiver ativada e apenas é aplicada nestas condições.</translation> +<translation id="2659019163577049044">Se esta definição for ativada, os utilizadores podem configurar os respetivos dispositivos para sincronizarem mensagens SMS entre o telemóvel e o Chromebook. Tenha em conta que, caso esta política seja permitida, os utilizadores têm de ativar a funcionalidade explicitamente mediante a conclusão de um fluxo de configuração. Após a conclusão desse fluxo, os utilizadores podem enviar e receber mensagens SMS nos respetivos Chromebooks. + + Se esta definição for desativada, os utilizadores não podem configurar a sincronização de SMS. + + Se esta política não for definida, a predefinição é não permitida para os utilizadores geridos e permitida para os utilizadores não geridos.</translation> <translation id="2660846099862559570">Nunca utilizar proxy</translation> <translation id="267596348720209223">Especifica as codificações de caracteres suportadas pelo fornecedor de pesquisas. As codificações são nomes de páginas de códigos, como UTF-8, GB2312 e ISO-8859-1, e são selecionadas por esta ordem. Esta política é opcional. Se não for definida, a codificação predefinida será UTF-8. Esta política aplica-se apenas se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> <translation id="268577405881275241">Ativar a funcionalidade proxy de compressão de dados</translation> @@ -730,7 +736,6 @@ Se desativar esta definição ou não definir um valor, a Pré-visualização de impressão utiliza a impressora utilizada mais recentemente como a escolha de destino predefinida. Se ativar esta definição, a Pré-visualização de impressão utiliza a impressora predefinida do SO como a escolha de destino predefinida.</translation> -<translation id="2867699958489427143">Reverta e continue a utilizar a versão de destino se a versão do SO for mais recente do que a de destino. Efetue um Powerwash completo durante o processo.</translation> <translation id="2872961005593481000">Encerrar</translation> <translation id="2874209944580848064">Nota para os dispositivos <ph name="PRODUCT_OS_NAME" /> compatíveis com aplicações para Android:</translation> <translation id="2877225735001246144">Desativar a procura de CNAME ao negociar a autenticação Kerberos</translation> @@ -969,7 +974,6 @@ <translation id="3711895659073496551">Suspenso</translation> <translation id="3715569262675717862">Autenticação baseada em certificados de cliente</translation> <translation id="3736879847913515635">Ativar a opção para adicionar uma pessoa no gestor de utilizadores</translation> -<translation id="3737544779868348650">Nome do anfitrião da rede do dispositivo</translation> <translation id="3746590506846867985"> 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 para o mesmo valor. Se os valores não coincidirem, 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/, também fará com que https://foo.example.com/ seja isolado como parte integrante do site https://example.com/. @@ -1076,6 +1080,7 @@ Cada entrada da lista contém um dicionário que tem de incluir o ID da extensão no campo "extension-id" e o respetivo URL de atualização no campo "update-url".</translation> <translation id="3874773863217952418">Ativar Tocar para pesquisar</translation> <translation id="3877517141460819966">Modo de autenticação do fator duplo integrado</translation> +<translation id="3879208481373875102">Configurar lista de aplicações Web de instalação forçada</translation> <translation id="388237772682176890">Esta política foi descontinuada no M53 e removida no M54, uma vez que a compatibilidade com o SPDY/3.1 foi removida. Desativa a utilização do protocolo SPDY no <ph name="PRODUCT_NAME" />. @@ -1309,6 +1314,10 @@ Para obter uma descrição completa das definições possíveis e da estrutura desta política, aceda a https://www.chromium.org/administrators/policy-list-3/extension-settings-full. </translation> <translation id="4554651132977135445">Modo de processamento de loopback da Política do Utilizador.</translation> +<translation id="4554841826517980623">Esta política controla se a funcionalidade Partilhas de ficheiros na rede do <ph name="PRODUCT_NAME" /> devem utilizar o <ph name="NETBIOS_PROTOCOL" /> para detetar partilhas na rede. + Se esta política estiver definida como Verdadeira, a deteção de partilhas utiliza o protocolo <ph name="NETBIOS_PROTOCOL" /> para detetar partilhas na rede. + Se esta política estiver definida como Falsa, a deteção de partilhas não vai utilizar o protocolo <ph name="NETBIOS_PROTOCOL" /> para detetar partilhas. + Se a política não for definida, a predefinição é desativada para utilizadores geridos pela empresa e ativada para utilizadores não geridos.</translation> <translation id="4555850956567117258">Permitir a comprovação remota para o utilizador</translation> <translation id="4557134566541205630">URL da página Novo separador do motor de pesquisa predefinido</translation> <translation id="4567137030726189378">Permite a utilização das Ferramentas para programadores.</translation> @@ -1703,6 +1712,7 @@ Se esta política não for definida, as respostas faladas são desativadas quando o ecrã de início de sessão é mostrado pela primeira vez. Os utilizadores podem ativar ou desativar as respostas faladas a qualquer momento e o estado desta funcionalidade no ecrã de início de sessão persiste entre utilizadores.</translation> <translation id="5868414965372171132">Configuração de rede ao nível do utilizador</translation> +<translation id="5879014913445067283">Controla a deteção de Partilha de ficheiros na rede através de <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Definição de cookies predefinida</translation> <translation id="5887414688706570295">Configura o prefixo do TalkGadget a ser utilizado por anfitriões de acesso remoto e evita que os utilizadores o alterem. @@ -2144,6 +2154,17 @@ <translation id="7049373494483449255">Permite que o <ph name="PRODUCT_NAME" /> envie documentos para o <ph name="CLOUD_PRINT_NAME" /> para impressão. NOTA: isto apenas afeta o suporte do <ph name="CLOUD_PRINT_NAME" /> no <ph name="PRODUCT_NAME" />. Não impede que os utilizadores enviem tarefas de impressão a partir de Web sites. Se esta definição estiver ativada ou não estiver configurada, os utilizadores poderão imprimir para o <ph name="CLOUD_PRINT_NAME" /> a partir da caixa de diálogo de impressão do <ph name="PRODUCT_NAME" />. Se esta definição estiver desativada, os utilizadores não poderão imprimir para o <ph name="CLOUD_PRINT_NAME" /> a partir da caixa de diálogo de impressão do <ph name="PRODUCT_NAME" />.</translation> <translation id="7053678646221257043">Se esta política estiver ativada, força a importação de marcadores a partir do navegador predefinido atual e também afeta a caixa de diálogo de importação. Se estiver desativada, não serão importados quaisquer marcadores. Se não estiver definida, o utilizador poderá ser questionado se pretende importá-los ou a importação poderá ocorrer automaticamente.</translation> <translation id="7063895219334505671">Permitir pop-ups nestes sites</translation> +<translation id="706568410943497889"> + Se a definição for definida como verdadeira, o <ph name="PRODUCT_NAME" /> tem autorização para recolher registos de eventos WebRTC dos serviços Google (por exemplo, do Google Meet) e carregar esses registos para o Google. + + Se a política for definida como falsa ou não for definida, o <ph name="PRODUCT_NAME" /> não pode recolher nem carregar esses registos. + + Estes registos contêm informações de diagnóstico que são úteis para depurar problemas em chamadas de áudio ou videochamadas no Chrome, como, por exemplo, a hora e o tamanho dos pacotes RTP enviados e recebidos, feedback sobre congestionamentos na rede e metadados sobre a hora e a qualidade dos frames de áudio e vídeo. Estes registos não incluem conteúdos de áudio ou vídeo das chamadas. + + Esta recolha de dados por parte do Chrome só pode ser acionada pelos serviços Google na Web, como o Google Hangouts ou o Google Meet. + + O Google poderá associar estes registos, mediante um ID de sessão, a outros registos que o próprio serviço Google recolha, o que tem como objetivo facilitar a depuração. + </translation> <translation id="706669471845501145">Permitir que os sites mostrem notificações do ambiente de trabalho</translation> <translation id="7072208053150563108">Taxa de alteração da palavra-passe da máquina</translation> <translation id="7074513465313721551">Configure a lista de domínios em que a Navegação segura irá confiar. Isto significa que: @@ -2275,6 +2296,9 @@ <translation id="7336878834592315572">Manter cookies durante toda a sessão</translation> <translation id="7340034977315324840">Comunicar períodos de atividade do aparelho</translation> <translation id="7343497214039883642">Ficheiro de configuração de impressoras empresariais para dispositivos</translation> +<translation id="7349338075015720646">Especifica uma lista de Websites que são instalados silenciosamente, sem interação do utilizador, e que não podem ser desinstalados nem desativados pelo utilizador. + + Cada item de lista da política é um objeto com dois membros: "url" e "launch_container". "url" deve ser o URL da aplicação Web que vai ser instalada e "launch_container" deve ser "window" ("janela") ou "tab" ("separador") para indicar de que forma é que a aplicação Web vai ser aberta depois da instalação. Se "launch_container" for omitido, a aplicação é aberta numa janela se o Chrome a considerar uma Progressive Web App; caso contrário, é aberta num separador.</translation> <translation id="7367028210010532881">O serviço de Navegação segura apresenta uma página de aviso quando os utilizadores navegam para sites sinalizados como potencialmente maliciosos. A ativação desta definição impede que os utilizadores prossigam da página de aviso para o site com conteúdo malicioso. Se esta definição estiver desativada ou não estiver configurada, os utilizadores podem optar por prosseguir para o site sinalizado após a apresentação do aviso. @@ -2729,6 +2753,7 @@ Aqui, "Versão" pode ser uma versão exata, como "61.0.3163.120" ou um prefixo de versão, como "61.0". </translation> <translation id="8544375438507658205">Processador de HTML predefinido para <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Permitir a sincronização de mensagens SMS do telemóvel com o Chromebook.</translation> <translation id="8549772397068118889">Avisar quando estiver a visitar sites fora dos pacotes de conteúdo</translation> <translation id="8566842294717252664">Ocultar a Web Store da página Novo separador e do iniciador de aplicações</translation> <translation id="8586528890725660268">Especifica as impressoras que não estão disponíveis para um utilizador. @@ -2773,6 +2798,11 @@ Se esta política não for definida, o serviço de proteção por palavra-passe apenas protege as palavras-passe Google, mas o utilizador pode alterar esta definição.</translation> <translation id="8672321184841719703">Versão de Atualização Automática de Destino</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Permite-lhe definir o período de tempo, em milissegundos, ao longo do qual os utilizadores são notificados de que o <ph name="PRODUCT_NAME" /> tem de ser reiniciado ou que um dispositivo <ph name="PRODUCT_OS_NAME" /> tem de ser reiniciado para aplicar uma atualização pendente. + + Ao longo deste período de tempo, o utilizador é informado, repetidamente, de que é necessária uma atualização. Relativamente aos dispositivos <ph name="PRODUCT_OS_NAME" />, é apresentada uma notificação de reinício no tabuleiro do sistema quando é detetada uma atualização. Quanto aos navegadores do <ph name="PRODUCT_NAME" />, o menu da aplicação muda e passa a indicar que é necessário reiniciar assim que for ultrapassado um terço do período de notificação. A cor da notificação muda quando forem ultrapassados dois terços do período de notificação e volta a mudar quando o período terminar. As outras notificações que a política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ativa seguem este mesmo horário. + + Se não for definida, é utilizado o período predefinido de 345600000 milissegundos (quatro dias) para os dispositivos <ph name="PRODUCT_OS_NAME" /> e de 604800000 milissegundos (uma semana) para <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">O aviso de proteção por palavra-passe é acionado pela reutilização da palavra-passe.</translation> <translation id="8693243869659262736">Utilizar cliente DNS incorporado</translation> <translation id="8704831857353097849">Lista de plug-ins desativados</translation> @@ -2809,6 +2839,7 @@ O fator de escala deve ser de 100% ou mais. Não são permitidos valores que façam com que o atraso de esbatimento do ecrã no modo de apresentação seja mais curto do que o atraso de esbatimento do ecrã normal.</translation> <translation id="8798099450830957504">Predefinição</translation> +<translation id="8801680448782904838">Notificar um utilizador de que é recomendado ou necessário reiniciar o navegador ou o dispositivo</translation> <translation id="8818173863808665831">Comunique a localização geográfica do dispositivo. Se a política não estiver definida, ou estiver definida como falsa, a localização não será comunicada.</translation> @@ -2968,6 +2999,11 @@ Se esta política estiver definida como verdadeira, o <ph name="PRODUCT_OS_NAME" /> aciona um reinício quando o utilizador encerrar o dispositivo. O <ph name="PRODUCT_OS_NAME" /> substitui todas as ocorrências de botões de encerramento na IU por botões de reinício. Se o utilizador encerrar o dispositivo através do botão ligar/desligar, este não reinicia automaticamente, mesmo que a política esteja ativada.</translation> <translation id="9152473318295429890">Ativar sugestões contextuais de páginas Web relacionadas</translation> <translation id="9158929520101169054">Permitir o início de sessão integrado no navegador</translation> +<translation id="9159126470527871268">Notifique os utilizadores de que o <ph name="PRODUCT_NAME" /> tem de ser reiniciado ou que o <ph name="PRODUCT_OS_NAME" /> tem de ser reiniciado para aplicar uma atualização pendente. + + A definição desta política ativa notificações para informar o utilizador de que é recomendado ou necessário reiniciar um navegador ou um dispositivo. Se não for definida, o <ph name="PRODUCT_NAME" /> indica ao utilizador que é necessário reiniciar através de subtis mudanças nos respetivos menus, ao passo que o <ph name="PRODUCT_OS_NAME" /> indica essa mesma necessidade através de uma notificação no tabuleiro do sistema. Se for definida como "Recomendada", é mostrado um aviso recorrente ao utilizador, a dizer que o reinício é necessário. O utilizador pode ignorar esse aviso para adiar o reinício. Se for definida como "Obrigatória", é mostrado um aviso recorrente ao utilizador a indicar que o reinício do navegador vai ser forçado quando o período de notificação for ultrapassado. O período predefinido são sete dias para o <ph name="PRODUCT_NAME" /> e quatro dias para o <ph name="PRODUCT_OS_NAME" />, o qual pode ser configurado através de definição da política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + A sessão do utilizador é reiniciada após o reinício.</translation> <translation id="9165792353046089850">Permite definir se os Websites podem aceder a dispositivos USB ligados. O acesso pode ser totalmente bloqueado ou pode ser efetuado um pedido ao utilizador sempre que um Website pretender aceder a dispositivos USB ligados. Esta política pode ser substituída para padrões de URL específicos ao utilizar as políticas "WebUsbAskForUrls" e "WebUsbBlockedForUrls".
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 569a4b39..46e631e5 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -340,6 +340,7 @@ <translation id="199764499252435679">Permite actualizările componentelor în <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Gestionarea consumului de energie</translation> <translation id="201557587962247231">Frecvența de încărcare a raportului privind starea dispozitivului</translation> +<translation id="2017301949684549118">Adresele URL pentru aplicațiile web de instalat silențios.</translation> <translation id="2018836497795982119">Specifică intervalul (în milisecunde) la care serviciului de gestionare a dispozitivelor i se solicită informații legate de politica privind utilizatorii. Setarea acestei politici înlocuiește valoarea prestabilită de 3 ore. Valorile valide pentru această politică se află în intervalul 1800000 (30 de minute) – 86400000 (1 zi). Toate valorile care nu se află în acest interval vor fi fixate în limitele respective. Dacă platforma acceptă notificări privind politica, întârzierea actualizării va fi setată la 24 de ore, deoarece se așteaptă ca notificările privind politica să forțeze automat o actualizare ori de câte ori politica se modifică. @@ -644,6 +645,11 @@ Adresa URL pentru căutarea Google poate fi specificată ca: <ph name="GOOGLE_SEARCH_URL" />. Această opțiune trebuie setată dacă politica „DefaultSearchProviderEnabled” este activată și va fi urmată numai în acest caz.</translation> +<translation id="2659019163577049044">Dacă această setare este activată, utilizatorii își vor putea configura dispozitivele să sincronizeze mesajele SMS între telefoane și Chromebookuri. Dacă politica este permisă, utilizatorii trebuie să opteze explicit pentru această funcție, prin parcurgerea unui flux de configurare. După finalizarea acestuia, utilizatorii vor putea să trimită și să primească mesaje SMS pe Chromebookuri. + + Dacă această setare este dezactivată, utilizatorii nu vor avea permisiunea să configureze sincronizarea SMS-urilor. + + Dacă politica nu este configurată, în mod prestabilit, permisiunea nu este acordată utilizatorilor gestionați de companie și este acordată utilizatorilor care nu sunt gestionați.</translation> <translation id="2660846099862559570">Nu utiliza niciodată un proxy</translation> <translation id="267596348720209223">Specifică codificările de caractere acceptate de furnizorul de căutare. Codificările reprezintă nume ale paginilor cu coduri cum ar fi UTF-8, GB2312 și ISO-8859-1. Acestea sunt încercate în ordinea furnizată. Politica este opțională. Dacă nu este setată, va fi utilizată codificarea standard, care este UTF-8. Această politică este urmată numai în cazul în care este activată politica „DefaultSearchProviderEnabled”.</translation> <translation id="268577405881275241">Activează funcția proxy de comprimare a datelor</translation> @@ -710,7 +716,6 @@ Dacă dezactivezi această setare sau nu setezi o valoare, funcția Previzualizare înainte de printare va utiliza imprimanta folosită cel mai recent ca opțiune de destinație prestabilită. Dacă activezi această setare, funcția Previzualizare înainte de printare va folosi imprimanta prestabilită pentru sistemul de operare ca opțiune de destinație prestabilită.</translation> -<translation id="2867699958489427143">Revino și rămâi la versiunea țintă dacă versiunea SO este mai nouă decât ținta. Efectuează un Powerwash complet în timpul procesului.</translation> <translation id="2872961005593481000">Închide</translation> <translation id="2874209944580848064">Notă pentru dispozitivele <ph name="PRODUCT_OS_NAME" /> care acceptă aplicațiile Android:</translation> <translation id="2877225735001246144">Dezactivează căutarea CNAME la negocierea autentificării pentru Kerberos</translation> @@ -949,7 +954,6 @@ <translation id="3711895659073496551">Suspendați</translation> <translation id="3715569262675717862">Autentificare pe baza certificatelor de client</translation> <translation id="3736879847913515635">Activează adăugarea de persoane în managerul de utilizatori</translation> -<translation id="3737544779868348650">Numele de gazdă al rețelei dispozitivului</translation> <translation id="3746590506846867985"> 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. Aceasta va izola și originile denumite după subdomenii; de exemplu, specificarea https://example.com/ va cauza și izolarea https://foo.example.com/ ca parte a site-ului https://example.com/. @@ -1062,6 +1066,7 @@ Fiecare intrare din listă conține un dicționar care trebuie să includă codul extensiei în câmpul „extension-id”, precum și adresa URL pentru actualizare în câmpul „update-url”.</translation> <translation id="3874773863217952418">Activează funcția Atinge pentru a căuta</translation> <translation id="3877517141460819966">Modul integrat de autentificare cu doi factori</translation> +<translation id="3879208481373875102">Configurează lista aplicațiilor web cu instalare automată</translation> <translation id="388237772682176890">Politica nu mai este dezvoltată în M53 și a fost eliminată din M54, deoarece compatibilitatea cu SPDY/3.1 a fost eliminată. Dezactivează folosirea protocolului SPDY în <ph name="PRODUCT_NAME" />. @@ -1295,6 +1300,10 @@ Pentru o descriere completă a setărilor posibile și a structurii acestei politici, accesează https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Modul de procesare loopback conform politicii privind utilizatorii</translation> +<translation id="4554841826517980623">Această politică stabilește dacă funcția Dispozitive de stocare în rețea pentru <ph name="PRODUCT_NAME" /> trebuie să folosească <ph name="NETBIOS_PROTOCOL" /> pentru a descoperi elementele la care se permite accesul în rețea. + Când politica este activată, descoperirea elementelor la care se permite accesul va folosi protocolul <ph name="NETBIOS_PROTOCOL" /> pentru a descoperi elementele la care se permite accesul în rețea. + Când politica este dezactivată, descoperirea elementelor la care se permite accesul nu va folosi protocolul <ph name="NETBIOS_PROTOCOL" /> pentru a descoperi elementele la care se permite accesul. + Dacă politica nu este configurată, opțiunea prestabilită este dezactivată pentru utilizatorii gestionați de întreprindere și activată pentru utilizatorii negestionați.</translation> <translation id="4555850956567117258">Activați atestarea la distanță pentru utilizator</translation> <translation id="4557134566541205630">Adresa URL pentru pagina Filă nouă a furnizorului de căutare prestabilit</translation> <translation id="4567137030726189378">Permite folosirea Instrumentelor pentru dezvoltatori</translation> @@ -1693,6 +1702,7 @@ Dacă această politică nu este configurată, feedbackul vocal este dezactivat la afișarea inițială a ecranului de conectare. Utilizatorii pot oricând să activeze sau să dezactiveze feedbackul vocal, iar starea sa pe ecranul de conectare persistă de la un utilizator la altul.</translation> <translation id="5868414965372171132">Configurație de rețea la nivel de utilizator</translation> +<translation id="5879014913445067283">Controlează descoperirea elementelor la care se permite accesul din rețea prin <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Setări prestabilite cu privire la cookie-uri</translation> <translation id="5887414688706570295">Configurează prefixul TalkGadget care va fi utilizat de gazdele de acces la distanță și nu le permite utilizatorilor să-l modifice. @@ -2132,6 +2142,17 @@ <translation id="7049373494483449255">Permite <ph name="PRODUCT_NAME" /> să trimită documente la <ph name="CLOUD_PRINT_NAME" /> pentru printare. NOTĂ: această politică afectează numai compatibilitatea <ph name="CLOUD_PRINT_NAME" /> din <ph name="PRODUCT_NAME" />. Politica nu împiedică utilizatorii să trimită activități de printare pe site-urile web. Dacă această setare este activată sau nu este configurată, utilizatorii pot printa prin <ph name="CLOUD_PRINT_NAME" /> din fereastra de dialog pentru printare aflată în <ph name="PRODUCT_NAME" />. Dacă această setare este dezactivată, utilizatorii nu pot printa prin <ph name="CLOUD_PRINT_NAME" /> din fereastra de dialog pentru printare aflată în <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Dacă este activată, această politică forțează importarea marcajelor din browserul prestabilit. Dacă este activată, această politică afectează, de asemenea, caseta de dialog de importare. Dacă este dezactivată, marcajele nu sunt importate. Dacă nu este setată, utilizatorul poate fi întrebat dacă dorește importarea sau aceasta poate avea loc în mod automat.</translation> <translation id="7063895219334505671">Permite ferestre pop-up de pe aceste site-uri</translation> +<translation id="706568410943497889"> + Dacă politica este activată, <ph name="PRODUCT_NAME" /> poate să colecteze jurnale de evenimente WebRTC din serviciile Google (de exemplu, Google Meet) și să le încarce pe Google. + + Dacă politica este dezactivată sau nu este configurată, <ph name="PRODUCT_NAME" /> nu poate colecta sau încărca astfel de jurnale. + + Aceste jurnale conțin informații de diagnosticare utile la remedierea problemelor cu apelurile audio sau video din Chrome, precum ora și dimensiunea pachetelor RTP trimite și primite, feedback privind congestionarea rețelei și metadate despre ora și calitatea cadrelor audio și video. Jurnalele nu conțin înregistrări audio sau video din apel. + + Această colectare a datelor de către Chrome poate fi declanșată numai de serviciile web Google, precum Google Hangouts sau Google Meet. + + Google poate asocia aceste jurnale, prin intermediul unui ID de sesiune, cu alte jurnale colectate chiar de serviciile Google. Astfel, se poate simplifica remedierea erorilor. + </translation> <translation id="706669471845501145">Permite site-urilor să afișeze notificări pe desktop</translation> <translation id="7072208053150563108">Frecvența de schimbare a parolelor de computer</translation> <translation id="7074513465313721551">Configurează lista de domenii în care Navigarea sigură va avea încredere. Aceasta înseamnă că: @@ -2263,6 +2284,9 @@ <translation id="7336878834592315572">Păstrați cookie-urile pe durata sesiunii</translation> <translation id="7340034977315324840">Raportați perioadele de activitate ale dispozitivului</translation> <translation id="7343497214039883642">Fișierul de configurare a imprimantelor companiei pentru dispozitive</translation> +<translation id="7349338075015720646">Specifică o listă cu site-uri care sunt instalate silențios, fără intervenția utilizatorului și care nu pot fi dezinstalate sau dezactivate de utilizator. + + Fiecare element din lista politicii este un obiect cu două componente: „url” și „launch_container”. „url” trebuie să fie adresa URL a aplicației web de instalat, iar „launch_container” trebuie să fie „window” sau „tab” pentru a indica modul în care va fi deschisă aplicația web după instalare. Dacă se omite „launch_container”, aplicația se va lansa într-o fereastră dacă Chrome o consideră a fi o aplicație web progresivă și într-o filă în caz contrar.</translation> <translation id="7367028210010532881">Serviciul Navigare sigură afișează o pagină de avertisment când utilizatorii navighează pe site-uri semnalate ca fiind potențial dăunătoare. Dacă activezi această setare, utilizatorii nu vor putea să navigheze mai departe de pe pagina de avertisment pe site-ul dăunător. Dacă setarea este dezactivată sau nu este configurată, utilizatorii pot alege să acceseze site-ul semnalat după ce li se afișează avertismentul. @@ -2712,6 +2736,7 @@ Aici, „Versiune” poate însemna o versiune exactă, cum ar fi „61.0.3163.120”, sau un prefix de versiune, cum ar fi „61.0” </translation> <translation id="8544375438507658205">Motor de redare HTML prestabilit pentru <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Permite sincronizarea mesajelor SMS de pe telefon pe Chromebook.</translation> <translation id="8549772397068118889">Avertisment la accesarea site-urilor din afara pachetelor de conținut</translation> <translation id="8566842294717252664">Ascunde magazinul web în pagina Filă nouă și în lansatorul de aplicații</translation> <translation id="8586528890725660268">Specifică imprimantele pe care nu le poate folosi un utilizator. @@ -2756,6 +2781,11 @@ Dacă această politică nu este configurată, serviciul de protecție a parolei va proteja doar parolele Google, dar utilizatorul va putea modifica această setare.</translation> <translation id="8672321184841719703">Versiune țintă pentru actualizări automate</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Îți permite să setezi perioada, în milisecunde, în care utilizatorii sunt informați că <ph name="PRODUCT_NAME" /> trebuie relansat sau că un dispozitiv <ph name="PRODUCT_OS_NAME" /> trebuie repornit pentru a aplica o actualizare în așteptare. + + În această perioadă, utilizatorul va fi informat în mod repetat despre necesitatea unei actualizări. Pentru dispozitivele <ph name="PRODUCT_OS_NAME" />, notificarea privind repornirea apare în bara de sistem atunci când se detectează un upgrade. Pentru browserele <ph name="PRODUCT_NAME" />, meniul aplicației se modifică, indicând faptul că este necesară o relansare după expirarea unei treimi din perioada de notificare. Această notificare își schimbă culoarea după expirarea a două treimi din perioada de notificare și încă o dată, după încheierea întregii perioade de notificare. Notificările suplimentare activate de politica <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> urmează același program. + + Dacă nu este configurată, se aplică o perioadă prestabilită de 345.600.000 milisecunde (patru zile) pentru dispozitivele <ph name="PRODUCT_OS_NAME" /> și 604.800.000 milisecunde (o săptămână) pentru <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Avertismentul privind protecția prin parolă este declanșat de refolosirea parolei</translation> <translation id="8693243869659262736">Utilizați clientul DNS integrat</translation> <translation id="8704831857353097849">Lista pluginurilor dezactivate</translation> @@ -2792,6 +2822,7 @@ Factorul de ajustare trebuie să fie de minimum 100 %. Valorile prin care intervalul până la reducerea luminozității ecranului în modul de prezentare ar deveni mai scurt decât intervalul obișnuit până la reducerea luminozității ecranului nu sunt permise.</translation> <translation id="8798099450830957504">Prestabilit</translation> +<translation id="8801680448782904838">Notifică utilizatorul că relansarea browserului sau repornirea dispozitivului este recomandată sau necesară</translation> <translation id="8818173863808665831">Raportează locația geografică a dispozitivului. Dacă politica nu este setată sau nu este activată, locația nu va fi raportată.</translation> @@ -2935,6 +2966,11 @@ Dacă această politică este activată, <ph name="PRODUCT_OS_NAME" /> va declanșa o repornire când utilizatorul închide dispozitivul. <ph name="PRODUCT_OS_NAME" /> înlocuiește toate aparițiile butoanelor de închidere din interfața de utilizare cu butoane de repornire. Dacă utilizatorul închide dispozitivul folosind butonul de pornire, acesta nu va reporni automat, chiar dacă politica este activată.</translation> <translation id="9152473318295429890">Activează sugestiile contextuale ale paginilor web asociate</translation> <translation id="9158929520101169054">Permite conectarea multiplă în browser</translation> +<translation id="9159126470527871268">Notifică utilizatorul că <ph name="PRODUCT_NAME" /> trebuie relansat sau <ph name="PRODUCT_OS_NAME" /> trebuie repornit pentru aplicarea unei actualizări în așteptare. + + Setarea acestei politici activează notificările care informează utilizatorul că este recomandată sau necesară relansarea browserului sau repornirea utilizatorului. Dacă politica nu este setată, <ph name="PRODUCT_NAME" /> îi arată utilizatorului că este necesară o relansare prin schimbări subtile aduse meniului, în timp ce <ph name="PRODUCT_OS_NAME" /> indică acest lucru printr-o notificare în bara de sistem. Dacă politica este setată la „Recomandat”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea este recomandată. Utilizatorul poate să respingă avertizarea pentru a amâna relansarea. Dacă politica este setată la „Obligatoriu”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea browserului va fi obligatorie după încheierea perioadei de notificare. În mod prestabilit, această perioadă este de șapte zile pentru <ph name="PRODUCT_NAME" /> și patru zile pentru <ph name="PRODUCT_OS_NAME" /> și poate fi configurată prin setarea politicii <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Sesiunea utilizatorului este restabilită după relansare/repornire.</translation> <translation id="9165792353046089850">Îți permite să stabilești dacă site-urile primesc acces la dispozitivele USB conectate. Accesul poate fi blocat complet sau utilizatorul poate fi întrebat de fiecare dată când un site dorește să primească acces la dispozitivele USB conectate. Această politică poate fi înlocuită pentru anumite șabloane de adrese URL prin aplicarea politicilor „WebUsbAskForUrls” și „WebUsbBlockedForUrls”.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 354df79..e552faac 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -335,6 +335,7 @@ <translation id="199764499252435679">Разрешить обновление компонентов <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Управление питанием</translation> <translation id="201557587962247231">Частота загрузки отчетов об устройствах</translation> +<translation id="2017301949684549118">URL автоматически устанавливаемых веб-приложений</translation> <translation id="2018836497795982119">Задает периодичность в миллисекундах, с которой в службу управления устройством направляются запросы о политике пользователя. Установка этого правила переопределяет значение по умолчанию, равное 3 часам. Допустимые значения: от 1 800 000 (30 минут) до 86 400 000 (1 день). Любые значения, выходящие за пределы этого диапазона, будут приведены к соответствующей предельной величине. Если платформа поддерживает уведомления о политиках, то значение будет установлено на 24 часа, потому что при уведомлениях автоматически должен отправляться запрос обновления, если политики были изменены. @@ -635,6 +636,11 @@ Чтобы назначить Google поисковой системой по умолчанию, введите следующий URL: <ph name="GOOGLE_SEARCH_URL" />. Правило действует только в том случае, если включено правило DefaultSearchProviderEnabled.</translation> +<translation id="2659019163577049044">Если этот параметр включен, пользователи смогут синхронизировать SMS на своих телефонах и устройствах Chromebook. Им нужно включить эту функцию в процессе настройки устройства. Тогда пользователи смогут отправлять и получать SMS на устройстве Chromebook. + + Если параметр отключен, пользователи не смогут синхронизировать SMS. + + Если правило не настроено, по умолчанию синхронизация будет отключена для управляемых профилей и включена для остальных.</translation> <translation id="2660846099862559570">Никогда не использовать прокси-сервер</translation> <translation id="267596348720209223">Задает кодировку текста, поддерживаемую поисковой системой. Кодировки – это названия кодовых страниц, например UTF-8, GB2312 или ISO-8859-1. Они применяются в том порядке, в котором перечислены. Это правило необязательно: если оно не настроено, по умолчанию используется кодировка UTF-8. Оно действует, только если активно правило DefaultSearchProviderEnabled.</translation> <translation id="268577405881275241">Использовать прокси-сервер для сжатия данных</translation> @@ -701,7 +707,6 @@ Если это правило отключено или не настроено, все задания печати, открытые в режиме предварительного просмотра, будут по умолчанию отправляться на последний выбранный принтер. Если правило настроено, задания печати, открытые в режиме предварительного просмотра, будут отправляться на системный принтер по умолчанию.</translation> -<translation id="2867699958489427143">Вернуться к целевой версии и оставаться на ней, если установлена более поздняя версия ОС. В процессе запустить функцию Full Powerwash.</translation> <translation id="2872961005593481000">Завершить работу</translation> <translation id="2874209944580848064">Примечание для устройств на платформе <ph name="PRODUCT_OS_NAME" />, поддерживающих приложения Android.</translation> <translation id="2877225735001246144">Отключить поиск записи CNAME при запросе на аутентификацию Kerberos</translation> @@ -936,7 +941,6 @@ <translation id="3711895659073496551">Спящий режим</translation> <translation id="3715569262675717862">Аутентификация на основе сертификатов клиента</translation> <translation id="3736879847913515635">Разрешить добавлять людей через диспетчер пользователей</translation> -<translation id="3737544779868348650">Имя хоста устройства</translation> <translation id="3746590506846867985"> Правило регулирует настройки экрана входа. Ознакомьтесь также с правилом <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, которое задает настройки для сеанса пользователя. Для этих правил рекомендуется выбирать одинаковые значения. Если значения не совпадают, при начале сеанса могут возникать задержки, вызванные применением пользовательских параметров. Если правило включено, то для каждого отделенного запятой сайта из списка запускается отдельный процесс. При этом сайты изолируются по субдоменам. Например, если указать домен https://example.com/, будет также изолирован субдомен https://foo.example.com/, являющийся частью сайта https://example.com/. @@ -1043,6 +1047,7 @@ Каждая запись списка содержит словарь, в поле extension-id которого должен быть указан идентификатор расширения, а в поле update-url – URL обновления.</translation> <translation id="3874773863217952418">Включить быстрый поиск</translation> <translation id="3877517141460819966">Встроенный режим двухэтапной аутентификации</translation> +<translation id="3879208481373875102">Настройка списка принудительно устанавливаемых веб-приложений</translation> <translation id="388237772682176890">Это правило перестало поддерживаться в M53 и было удалено в M54 вследствие отключения поддержки SPDY/3.1. Запрещает использование протокола SPDY в <ph name="PRODUCT_NAME" />. @@ -1277,6 +1282,10 @@ Чтобы просмотреть полное описание и структуру правила, перейдите по ссылке https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Режим кольцевой проверки правил для пользователей</translation> +<translation id="4554841826517980623">Это правило определяет, будет ли функция совместного доступа к файлам сервиса <ph name="PRODUCT_NAME" /> использовать протокол <ph name="NETBIOS_PROTOCOL" /> для обнаружения файлов в сети. + Если задано значение True, протокол <ph name="NETBIOS_PROTOCOL" /> будет использоваться. + Если задано значение False, протокол <ph name="NETBIOS_PROTOCOL" /> не будет использоваться. + Если правило не настроено, оно будет по умолчанию считаться выключенным для корпоративных профилей и включенным для остальных.</translation> <translation id="4555850956567117258">Включает удаленное подтверждение данных пользователем</translation> <translation id="4557134566541205630">Показ URL страницы быстрого доступа в поисковой системе по умолчанию</translation> <translation id="4567137030726189378">Разрешить использование Инструментов разработчика</translation> @@ -1669,6 +1678,7 @@ Если значение правила не задано, при первом переходе на экран входа функция озвучивания действий будет отключена. Пользователи могут ее в любое время включить и отключить, а ее статус будет виден всем пользователям на экране входа.</translation> <translation id="5868414965372171132">Конфигурация сети на уровне пользователя</translation> +<translation id="5879014913445067283">Функция совместного доступа к файлам: поиск через протокол <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Настройки файлов cookie по умолчанию</translation> <translation id="5887414688706570295">Настраивает префикс TalkGadget для хостов удаленного доступа и запрещает пользователям его менять. @@ -2105,6 +2115,17 @@ <translation id="7049373494483449255">Разрешает <ph name="PRODUCT_NAME" /> передавать задания печати на виртуальный принтер <ph name="CLOUD_PRINT_NAME" />. ОБРАТИТЕ ВНИМАНИЕ: это правило относится только к поддержке <ph name="CLOUD_PRINT_NAME" /> в <ph name="PRODUCT_NAME" /> и не запрещает пользователям отправлять на печать документы с сайтов. Если этот параметр включен или не задан, пользователи могут отправлять документы на <ph name="CLOUD_PRINT_NAME" /> из диалогового окна печати <ph name="PRODUCT_NAME" />. Если он отключен, отправлять документы на <ph name="CLOUD_PRINT_NAME" /> из диалогового окна печати <ph name="PRODUCT_NAME" /> нельзя.</translation> <translation id="7053678646221257043">Это правило импортирует закладки из текущего браузера по умолчанию и меняет поведение диалогового окна импорта. Если оно отключено, закладки не импортируются, а если оно не настроено, импорт может быть выполнен автоматически или пользователю может быть предложено импортировать закладки.</translation> <translation id="7063895219334505671">Разрешить всплывающие окна на этих сайтах</translation> +<translation id="706568410943497889"> + Если задано значение True, <ph name="PRODUCT_NAME" /> сможет собирать журналы событий WebRTC из сервисов Google (например, Google Meet) и загружать их в Google. + + Если задано значение False или правило не настроено, <ph name="PRODUCT_NAME" /> не сможет собирать и загружать эти журналы. + + В журналах содержится такая информация, как размер отправленных и полученных пакетов RTP, время их отправки и получения, данные о перегрузке сети, а также метаданные о продолжительности и качестве аудио и видео. Такая информация полезна для отладки звонков и видеовстреч в Chrome. В журналах нет самого аудио- или видеоконтента. + + Сбор данных могут запустить только такие веб-сервисы Google, как Hangouts и Meet. + + Для упрощения отладки эти журналы могут быть связаны с журналами самих сервисов Google с помощью идентификатора сеанса. + </translation> <translation id="706669471845501145">Разрешить сайтам показывать уведомления</translation> <translation id="7072208053150563108">Частота смены пароля на устройстве</translation> <translation id="7074513465313721551">Настройте список доверенных доменов для режима безопасного просмотра. @@ -2234,6 +2255,9 @@ <translation id="7336878834592315572">Хранить файлы cookie до конца сеанса</translation> <translation id="7340034977315324840">Сообщать о продолжительности работы устройства</translation> <translation id="7343497214039883642">Файл конфигурации принтеров для устройств компании</translation> +<translation id="7349338075015720646">Определяет список веб-сайтов, которые будут установлены в фоновом режиме без участия пользователя и которые нельзя удалить или отключить. + + Каждый пункт правила представляет собой объект, состоящий из двух частей: url и launch_container. Элемент url – это URL устанавливаемого веб-приложения, а launch_container принимает значения "window" или "tab" (определяет, как откроется приложение после установки: в окне или во вкладке). Если значение launch_container не указано, приложение откроется в новом окне, если Chrome определит его как современное веб-приложение. В противном случае приложение откроется во вкладке.</translation> <translation id="7367028210010532881">Безопасный просмотр показывает предупреждение, если пользователь пытается перейти на потенциально опасный сайт. Если включить этот параметр, пользователи не смогут переходить на сайты, для которых появляются такие предупреждения. Если этот параметр отключен или не настроен, пользователи могут сами решать, переходить ли на потенциально опасные сайты. @@ -2683,6 +2707,7 @@ Может указываться точная версия, например 61.0.3163.120, или префикс, например 61.0. </translation> <translation id="8544375438507658205">Средство обработки HTML в <ph name="PRODUCT_FRAME_NAME" /> по умолчанию</translation> +<translation id="8544465954173828789">Разрешить синхронизацию SMS на телефоне и устройстве Chromebook</translation> <translation id="8549772397068118889">Предупреждать о переходе на сайт, не включенный в пакет контента</translation> <translation id="8566842294717252664">Удалить интернет-магазин со страницы быстрого доступа и панели запуска приложений</translation> <translation id="8586528890725660268">Определяет принтеры, с которыми не может работать пользователь. @@ -2727,6 +2752,11 @@ Если значение не установлено, предупреждение от службы защиты паролей появляется при повторном вводе пароля Google на фишинговом сайте, но пользователь может изменить эту настройку самостоятельно.</translation> <translation id="8672321184841719703">Выбор версии автообновления</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Позволяет установить период в миллисекундах, в течение которого пользователь будет получать уведомления о том, что для установки обновления нужно перезапустить браузер <ph name="PRODUCT_NAME" /> или устройство <ph name="PRODUCT_OS_NAME" />. + + На устройстве <ph name="PRODUCT_OS_NAME" /> уведомления о необходимости перезапуска появляются в области уведомлений сразу после того, как получена информация об обновлении. В браузере <ph name="PRODUCT_NAME" /> меню изменяется по истечении трети заданного периода. Уведомление меняет цвет по истечении двух третей периода и в конце периода. Дополнительные уведомления, которые регулируются правилом <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, появляются по такой же схеме. + + Если правило не настроено, используется период по умолчанию: 345 600 000 миллисекунд (четыре дня) для устройств <ph name="PRODUCT_OS_NAME" /> и 604 800 000 миллисекунд (одна неделя) для браузера <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Предупреждение от защиты паролем срабатывает при повторном использовании пароля</translation> <translation id="8693243869659262736">Встроенный клиент DNS</translation> <translation id="8704831857353097849">Список отключенных плагинов</translation> @@ -2763,6 +2793,7 @@ Значение коэффициента должно составлять не менее 100%. Задержка затемнения в режиме презентации должна быть больше аналогичного значения для стандартного режима.</translation> <translation id="8798099450830957504">По умолчанию</translation> +<translation id="8801680448782904838">Уведомлять пользователя о том, что рекомендуется или требуется перезапустить браузер или устройство</translation> <translation id="8818173863808665831">Отправка сведений о географическом местоположении устройства. Если это правило не настроено или настроено неверно, данные о местоположении не отправляются.</translation> @@ -2914,6 +2945,11 @@ Если вы выберете значение True, <ph name="PRODUCT_OS_NAME" /> будет перезагружать устройство вместо выключения. В интерфейсе <ph name="PRODUCT_OS_NAME" /> все кнопки выключения будут заменены кнопками перезагрузки. Однако если пользователь нажмет кнопку питания, устройство не перезагрузится автоматически, даже если правило настроено.</translation> <translation id="9152473318295429890">Правило определяет, увидит ли пользователь предложения похожих веб-страниц</translation> <translation id="9158929520101169054">Разрешить вход в несколько аккаунтов в браузере</translation> +<translation id="9159126470527871268">Уведомляет пользователя о том, что для установки обновления необходимо перезапустить браузер <ph name="PRODUCT_NAME" /> или устройство <ph name="PRODUCT_OS_NAME" />. + + Это правило регулирует уведомления о том, что рекомендуется или необходимо перезапустить браузер или устройство. Если правило не настроено, узнать о необходимости перезапуска можно по небольшим изменениям в меню <ph name="PRODUCT_NAME" />, тогда как на устройстве <ph name="PRODUCT_OS_NAME" /> для этого используются уведомления. Если задано значение "Рекомендуется", пользователь будет получать уведомления, но действие можно откладывать. Если задано значение "Требуется", пользователь будет получать предупреждение о том, что браузер перезапустится автоматически, когда истечет срок показа уведомлений. По умолчанию он равен семи дням для браузера <ph name="PRODUCT_NAME" /> и четырем дням для устройств <ph name="PRODUCT_OS_NAME" />. Срок можно изменить в настройках правила <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + После перезапуска сеанс пользователя восстанавливается.</translation> <translation id="9165792353046089850">Позволяет установить правила доступа к подключенным USB-устройствам для сайтов. В зависимости от выбранных настроек доступ блокируется полностью или запрашивается при каждой попытке подключиться к USB-устройству. Это правило может не действовать для некоторых шаблонов URL, использующих правила WebUsbAskForUrls и WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index a20cc908..d3573aec 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -334,6 +334,7 @@ <translation id="199764499252435679">Povoliť aktualizácie komponentov v prehliadači <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Správa možností napájania</translation> <translation id="201557587962247231">Frekvencia nahrávania hlásení stavu zariadenia</translation> +<translation id="2017301949684549118">Adresy weboých aplikácií využijú tichú inštaláciu.</translation> <translation id="2018836497795982119">Určuje interval (v ms), v ktorom budú službe správy zariadenia odosielané žiadosti o informácie o pravidlách pre používateľov. Nastavením tohto pravidla bude prepísaná predvolená hodnota 3 hodiny. Platné hodnoty pre toto pravidlo sa pohybujú v rozmedzí od 1800000 (30 minút) do 86400000 (1 deň). Hodnoty mimo daného rozsahu budú upravené na príslušnú medznú hodnotu. Ak platforma podporuje upozornenia na pravidlá, oneskorenie obnovenia bude nastavené na 24 hodín, pretože sa očakáva, že upozornenia na pravidlá vynútia automatické obnovenie po každej zmene pravidiel. @@ -641,6 +642,11 @@ Webovú adresu vyhľadávania Google je možné špecifikovať ako: <ph name="GOOGLE_SEARCH_URL" />. Táto možnosť musí byť nastavená v prípade, že je povolené pravidlo DefaultSearchProviderEnabled, a bude uplatnená len v takom prípade.</translation> +<translation id="2659019163577049044">Ak toto nastavenie povolíte, používatelia budú môcť nastaviť svoje zariadenia tak, aby synchronizovali správy SMS medzi telefónmi a Chromebookmi. Upozorňujeme, že ak je toto pravidlo povolené, používatelia sa musia špeciálne zaregistrovať na používanie tejto funkcie dokončením procesu nastavenia. Po jeho dokončení budú môcť vo svojich Chromebookoch odosielať a prijímať správy SMS. + + Ak toto nastavenie zakážete, používatelia nebudú môcť nastaviť synchronizovanie správ SMS. + + Ak ho nenastavíte, predvolene bude táto funkcia zakázaná pre spravovaných používateľov a povolená pre nespravovaných používateľov.</translation> <translation id="2660846099862559570">Nikdy nepoužívať server proxy</translation> <translation id="267596348720209223">Určuje kódovanie znakov podporovaných poskytovateľom vyhľadávania. Kódovania sú kódové stránky, napríklad UTF-8, GB2312 alebo ISO-8859-1. Budú vyskúšané v uvedenom poradí. @@ -711,7 +717,6 @@ Ak toto nastavenie zakážete alebo nenastavíte žiadnu hodnotu, Ukážka tlače bude používať poslednú použitú tlačiareň ako predvolenú cieľovú možnosť. Ak povolíte toto zariadenie, Ukážka tlače bude používať predvolenú tlačiareň operačného systému OS ako predvolenú cieľovú možnosť.</translation> -<translation id="2867699958489427143">Vrátiť sa späť na cieľovú verziu a používať ju, ak je verzia operačného systému novšia ako cieľová. V priebehu procesu sa vykoná kompletné obnovenie Powerwash.</translation> <translation id="2872961005593481000">Vypnúť</translation> <translation id="2874209944580848064">Poznámka pre zariadenia so systémom <ph name="PRODUCT_OS_NAME" />, ktoré podporujú aplikácie pre Android:</translation> <translation id="2877225735001246144">Zakázať hľadanie záznamov CNAME pri absolvovaní overenia Kerberos</translation> @@ -955,7 +960,6 @@ <translation id="3711895659073496551">Režim spánku</translation> <translation id="3715569262675717862">Overenie totožnosti na základe certifikátov klienta</translation> <translation id="3736879847913515635">Povoliť pridanie osoby pomocou správcu používateľov</translation> -<translation id="3737544779868348650">Názov hostiteľa zariadenia v sieti</translation> <translation id="3746590506846867985"> Tieto pravidlá platia 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é 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/. @@ -1064,6 +1068,7 @@ Každý záznam v zozname obsahuje adresár, ktorý musí zahŕňať ID rozšírenia v poli „extension-id“ a jeho webovú adresu pre aktualizácie v poli „update-url“.</translation> <translation id="3874773863217952418">Povoliť vyhľadávanie klepnutím</translation> <translation id="3877517141460819966">Režim integrovaného druhého faktora overenia totožnosti</translation> +<translation id="3879208481373875102">Konfigurovať zoznam webových aplikácií nainštalovaných pravidlom</translation> <translation id="388237772682176890">Podpora tohto pravidla bola ukončená vo verzii M53. Toto pravidlo bolo odstránené vo verzii M54, pretože bola ukončená podpora protokolu SPDY/3.1. Umožňuje zakázať protokol SPDY v prehliadači <ph name="PRODUCT_NAME" />. @@ -1307,6 +1312,10 @@ Úplný popis možných nastavení a štruktúry tohto pravidla nájdete na adrese https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Režim spracovania slučky pravidiel pre používateľov</translation> +<translation id="4554841826517980623">Toto pravidlo riadi, či by mala funkcia zdieľania súborov v sieti pre <ph name="PRODUCT_NAME" /> použiť <ph name="NETBIOS_PROTOCOL" /> na objavenie zdieľaných položiek v sieti. + Keď toto pravidlo nastavíte na hodnotu true, objavovanie zdieľaných položiek bude zisťovať zdieľané položky v sieti pomocou protokolu <ph name="NETBIOS_PROTOCOL" />. + Keď ho nastavíte na hodnotu false, objavovanie zdieľaných položiek nebude na zisťovanie zdieľaných položiek používať protokol <ph name="NETBIOS_PROTOCOL" />. + Ak toto pravidlo nenastavíte, predvolene bude zakázané pre používateľov spravovaných podnikom a povolené pre nespravovaných používateľov.</translation> <translation id="4555850956567117258">Povoliť pre používateľa vzdialené overenie</translation> <translation id="4557134566541205630">Predvolená webová adresa stránky novej karty poskytovateľa vyhľadávania</translation> <translation id="4567137030726189378">Povoliť používanie nástrojov pre vývojárov</translation> @@ -1729,6 +1738,7 @@ Ak toto pravidlo ponecháte nenastavené, bude hlasová odozva pri prvom zobrazení prihlasovacej obrazovky zakázaná. Používatelia budú môcť hlasovú odozvu kedykoľvek povoliť alebo zakázať a jej stav na prihlasovacej obrazovke sa zachová aj po zmene používateľov.</translation> <translation id="5868414965372171132">Konfigurácia siete na úrovni používateľa</translation> +<translation id="5879014913445067283">Riadi objavovanie zdieľaných súborov v sieti pomocou <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Predvolené nastavenie súborov cookie</translation> <translation id="5887414688706570295">Konfiguruje predponu TalkGadget, ktorú budú používať hostitelia vzdialeného prístupu, a bráni používateľom, aby ju zmenili. @@ -2190,6 +2200,17 @@ Ak nie je nastavené, môže sa používateľovi zobraziť výzva, či chce domovskú stránku importovať alebo či má import prebehnúť automaticky.</translation> <translation id="7063895219334505671">Povoliť na týchto weboch kontextové okná</translation> +<translation id="706568410943497889"> + Ak toto pravidlo nastavíte na hodnotu true, <ph name="PRODUCT_NAME" /> môže zhromažďovať denníky udalostí WebRTC zo služieb Googlu (napríklad Google Meet) a nahrávať ich do Googlu. + + Ak ho nastavíte na hodnotu false alebo ho ponecháte nenastavené, <ph name="PRODUCT_NAME" /> nemôže zhromažďovať tieto denníky ani ich nahrávať. + + Tieto denníky obsahujú diagnostické informácie, ktoré sú užitočné pri ladení problémov s audiohovormi alebo videohovormi v Chrome, ako sú napríklad čas a veľkosť odoslaných a prijatých balíkov RTP, spätnú väzbu týkajúcu sa preťaženia siete a metadáta o čase a kvalite zvuku a snímok videa. Nezahŕňajú zvukový obsah ani videoobsah hovoru. + + Zhromažďovanie týchto dát sa dá spustiť iba pomocou webových služieb Googlu, ako je napríklad Google Hangouts alebo Google Meet. + + Google môže tieto denníky na základe identifikátora relácie priradiť k iným denníkom zhromaždeným príslušnou službou Google. Ide o zamýšľané správanie, ktoré má uľahčiť ladenie. + </translation> <translation id="706669471845501145">Povoliť webovým stránkam zobrazovať upozornenia na pracovnej ploche</translation> <translation id="7072208053150563108">Frekvencia zmeny hesla zariadenia</translation> <translation id="7074513465313721551">Konfiguruje zoznam domén, ktorým bude Bezpečné prehliadanie dôverovať. Znamená to: @@ -2323,6 +2344,9 @@ <translation id="7336878834592315572">Uchovať súbory cookie počas trvania relácie</translation> <translation id="7340034977315324840">Hlásiť časy aktivity zariadenia</translation> <translation id="7343497214039883642">Konfiguračný súbor podnikovej tlačiarne pre zariadenia</translation> +<translation id="7349338075015720646">Určuje zoznam webov inštalovaných na pozadí, bez interakcie s používateľom a ktoré používateľ nemôže odinštalovať ani deaktivovať. + + Jednotlivé položky zoznamu v danom pravidle sú objekty pozostávajúce z dvoch častí: „url“ a „launch_container“. „url“ by mala byť adresa webovej aplikácie, ktorá sa má nainštalovať, a „launch_container“ by malo byť „window“ (okno) alebo „tab“ (karta) (teda podoba, v akej sa webová aplikácia po inštalácii otvorí). Ak časť „launch_container“ vynecháte, aplikácia sa spustí v okne, keď ju Chrome bude považovať za progresívnu webovú aplikáciu. Inak sa zobrazí ako karta.</translation> <translation id="7367028210010532881">Keď používateľ prejde na weby, ktoré sú nahlásené ako potenciálne škodlivé, služba Bezpečné prehliadanie zobrazí stránku s upozornením. Povolenie tohto nastavenia zabráni používateľom pokračovať zo stránky s upozornením na škodlivý web. Ak je toto nastavenie zakázané alebo ak nie je nakonfigurované, používatelia môžu pokračovať na nahlásený web aj po zobrazení upozornenia. @@ -2782,6 +2806,7 @@ V tomto prípade znamená výraz „verzia“ buď presnú verziu, ako napríklad 61.0.3163.120, alebo predponu verzie, napríklad 61.0. </translation> <translation id="8544375438507658205">Predvolený vykresľovací modul HTML pre doplnok <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Povoliť synchronizáciu správ SMS z telefónu do Chromebooku</translation> <translation id="8549772397068118889">Upozorniť na návštevu stránky, ktorá je mimo balíkov obsahu</translation> <translation id="8566842294717252664">Skryť internetový obchod zo stránky na novej karte a zo spúšťača aplikácií</translation> <translation id="8586528890725660268">Umožňuje určiť tlačiarne, ktoré používateľ nemá k dispozícii. @@ -2826,6 +2851,11 @@ Ak toto pravidlo nenastavíte, služba ochrany heslom bude chrániť iba heslá Google. Používateľ však bude môcť toto nastavenie zmeniť.</translation> <translation id="8672321184841719703">Cieľová verzia automatickej aktualizácie</translation> <translation id="867410340948518937">U2F (univerzálny druhý faktor)</translation> +<translation id="8682611302223077049">Umožňuje nastaviť časové obdobie v milisekundách, po uplynutí ktorého budú používatelia upozornení, že <ph name="PRODUCT_NAME" /> sa musí znova spustiť alebo že zariadenie <ph name="PRODUCT_OS_NAME" /> musí byť reštartované, aby sa použila čakajúca aktualizácia. + + V priebehu tohto časového obdobia bude používateľ opakovane informovaný o potrebe aktualizácie. V zariadeniach <ph name="PRODUCT_OS_NAME" /> sa po zistení inovácie objaví na paneli úloh systému upozornenie na reštartovanie. V prípade prehliadačov <ph name="PRODUCT_NAME" /> sa po uplynutí jednej tretiny časového obdobia upozornenia zmení ponuka aplikácie, ktorá označuje potrebu opätovného spustenia. Farba upozornenia sa zmení po uplynutí dvoch tretín obdobia a znova po uplynutí celého obdobia. Ďalšie upozornenia povolené pravidlom <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> sa po uplynutí jednej tretiny časového obdobia upozornenia zmení ponuka aplikácie, ktorá označuje potrebu opätovného spustenia. Farba upozornenia sa zmení po uplynutí dvoch tretín obdobia a znova po uplynutí celého obdobia. Ďalšie upozornenia povolené pravidlom. + + Ak pravidlo nenastavíte, použije sa predvolené obdobie 345 600 000 milisekúnd (štyri dni) pre zariadenia <ph name="PRODUCT_OS_NAME" /> a 604 800 000 milisekúnd (jeden týždeň) pre prehliadače. <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Upozornenie ochrany heslom sa spúšťa po opätovnom použití hesla</translation> <translation id="8693243869659262736">Použiť vstavaného klienta DNS</translation> <translation id="8704831857353097849">Zoznam zakázaných doplnkov</translation> @@ -2870,6 +2900,7 @@ Škálovací faktor musí mať hodnotu aspoň 100 %. Hodnoty, ktoré by oneskorenie stmavenia obrazovky v režime prezentácie skrátili na dobu kratšiu ako je bežné oneskorenie stmavenia obrazovky, nie sú povolené.</translation> <translation id="8798099450830957504">Predvolené</translation> +<translation id="8801680448782904838">Upozorňovať používateľa, že sa odporúča alebo vyžaduje opätovné reštartovanie prehliadača</translation> <translation id="8818173863808665831">Nahlási geografickú polohu zariadenia. Ak toto pravidlo nie je nastavené alebo je nastavené na hodnotu false, poloha sa nahlasovať nebude.</translation> @@ -3021,6 +3052,11 @@ Ak toto pravidlo nastavíte na možnosť True, systém <ph name="PRODUCT_OS_NAME" /> spustí reštart, keď používateľ vypne zariadenie. <ph name="PRODUCT_OS_NAME" /> nahradí v používateľskom rozhraní všetky výskyty tlačidiel na vypnutie tlačidlami na reštartovanie. Ak teda používateľ vypne zariadenie pomocou vypínača, automaticky sa nereštartuje, a to ani vtedy, keď je toto pravidlo povolené.</translation> <translation id="9152473318295429890">Povoliť kontextové návrhy súvisiacich webových stránok</translation> <translation id="9158929520101169054">Povoliť viacnásobné prihlásenie v rámci prehliadača</translation> +<translation id="9159126470527871268">Umožňuje používateľov upozorniť, že <ph name="PRODUCT_NAME" /> musia znova spustiť alebo <ph name="PRODUCT_OS_NAME" /> reštartovať, aby sa použila čakajúca aktualizácia. + + Toto nastavenie pravidla aktivuje upozornenia, ktoré informujú používateľa o tom, že sa odporúča alebo vyžaduje opätovné spustenie prehliadača alebo reštartovanie zariadenia. Ak ho nenastavíte, <ph name="PRODUCT_NAME" /> upozorní používateľa prostredníctvom nenápadných zmien v ponuke, že sa vyžaduje opätovné spustenie, pričom <ph name="PRODUCT_OS_NAME" /> to oznámi upozornením v oblasti oznámení.Ak je nastavené na možnosť Recommended (Odporúčané), používateľovi sa bude zobrazovať opakované upozornenie na to, že sa odporúča opätovné spustenie. Používateľ môže toto upozornenie zrušiť a opätovné spustenie tak odmietnuť. Ak je nastavené na možnosť Required (Vyžadované), používateľovi sa zobrazí opakované upozornenie, že po vypršaní obdobia upozornenia sa vynúti opätovné spustenie prehliadača. Predvolené obdobie je sedem dní pre <ph name="PRODUCT_NAME" /> a štyri dni pre <ph name="PRODUCT_OS_NAME" />. Je možné ho nakonfigurovať prostredníctvom nastavenia pravidla <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Relácia používateľa sa po opätovnom spustení alebo reštartovaní obnoví.</translation> <translation id="9165792353046089850">Umožňuje nastaviť, či môžu weby získať prístup k pripojeným zariadeniam USB. Prístup môže byť úplne zablokovaný alebo je možné používateľa požiadať, keď chce web získať prístup k pripojeným zariadeniam USB. Toto pravidlo môžte prepísať v prípade konkrétnych vzorov webových adries pomocou pravidiel WebUsbAskForUrls a WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index bc3f01d..8ad4674 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -521,7 +521,7 @@ Za naprave, ki jih upravlja Active Directory, ta pravilnik podpira razširitev <ph name="MACHINE_NAME_VARIABLE" /> na ime naprave za Active Directory ali njegov podniz. Če je ime naprave na primer <ph name="MACHINE_NAME_EXAMPLE" />, potem <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zamenjajo 4 znaki po 6. mestu, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Položaj temelji na ničli. </translation> <translation id="2294382669900758280">Predvajanje videoposnetkov v aplikacijah za Android se ne upošteva, tudi če je ta pravilnik nastavljen na <ph name="TRUE" />.</translation> -<translation id="2298647742290373702">Konfiguriranje privzete strani »Nov zavihek« v brskalniku <ph name="PRODUCT_NAME" />.</translation> +<translation id="2298647742290373702">Konfiguriranje privzetega novega zavihka s povezavami v brskalniku <ph name="PRODUCT_NAME" />.</translation> <translation id="2299220924812062390">Določi seznam omogočenih vtičnikov</translation> <translation id="2303795211377219696">Omogočanje samodejnega izpolnjevanja za kreditne kartice</translation> <translation id="2309390639296060546">Privzeta nastavitev geolokacije</translation> @@ -688,7 +688,7 @@ <translation id="268577405881275241">Omogoči funkcijo stiskanja podatkov v strežniku proxy</translation> <translation id="2693108589792503178">Konfigurirajte URL za spremembo gesla.</translation> <translation id="2731627323327011390">Onemogočanje uporabe potrdil sistema <ph name="PRODUCT_OS_NAME" /> aplikacijam ARC</translation> -<translation id="2742843273354638707">Skrivanje aplikacije Spletna trgovina Chrome in povezave v nogi na strani »Nov zavihek« in v zaganjalniku aplikacij v sistemu <ph name="PRODUCT_OS_NAME" />. +<translation id="2742843273354638707">Skrivanje aplikacije Spletna trgovina Chrome in povezave v nogi na novem zavihku s povezavami in v zaganjalniku aplikacij v sistemu <ph name="PRODUCT_OS_NAME" />. Če je ta pravilnik nastavljen na »True«, so ikone skrite. @@ -749,7 +749,6 @@ Če onemogočite to nastavitev ali ne nastavite vrednosti, predogled tiskanja kot privzeti cilj uporabi nazadnje uporabljeni tiskalnik. Če omogočite to nastavitev, predogled tiskanja kot privzeti cilj uporabi privzeti tiskalnik operacijskega sistema.</translation> -<translation id="2867699958489427143">Povrnite in ostanite na ciljni različici, če je različica operacijskega sistema novejša kot ciljna. Med postopkom izvede popoln Powerwash.</translation> <translation id="2872961005593481000">Zaustavitev</translation> <translation id="2874209944580848064">Opomba glede naprav s sistemom <ph name="PRODUCT_OS_NAME" />, ki podpirajo aplikacije za Android:</translation> <translation id="2877225735001246144">Onemogoči iskanje CNAME pri pogajanju o preverjanju pristnosti Kerberos</translation> @@ -994,7 +993,6 @@ <translation id="3711895659073496551">Prekinitev</translation> <translation id="3715569262675717862">Preverjanje pristnosti glede na potrdila odjemalca</translation> <translation id="3736879847913515635">Omogočanje dodajanja oseb v upravitelju uporabnikov</translation> -<translation id="3737544779868348650">Ime gostitelja omrežja naprave</translation> <translation id="3746590506846867985"> 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 uveljavlja vrednost, ki jo določa uporabniški pravilnik. Če je pravilnik omogočen, se bo vsak naveden izvor @@ -1198,7 +1196,7 @@ Če ta pravilnik ni konfiguriran, <ph name="PRODUCT_NAME" /> uporablja privzeto najvišjo različico. Sicer bo nastavljen na eno od teh vrednosti: »tls1.2« ali »tls1.3«. Če je nastavljen, <ph name="PRODUCT_NAME" /> ne bo uporabljal različic protokolov SSL/TLS, višjih od navedene različice. Neprepoznane vrednosti bodo prezrte.</translation> -<translation id="4121350739760194865">Onemogoči prikaz oglasov za programe na strani »Nov zavihek«.</translation> +<translation id="4121350739760194865">Onemogoči prikaz oglasov za aplikacije na novem zavihku s povezavami.</translation> <translation id="412697421478384751">Omogoči uporabnikom nastavitev šibkih kod PIN za kodo PIN za zaklenjen zaslon.</translation> <translation id="4138655880188755661">Časovna omejitev</translation> <translation id="4157003184375321727">Pošiljanje podatkov o različici operacijskega sistema in vdelane programske opreme</translation> @@ -1322,7 +1320,7 @@ Če tega pravilnika ne nastavite, lahko uporabnik izbere, ali bo gumb za domačo stran prikazan.</translation> <translation id="4483649828988077221">Onemogoči samodejno posodabljanje</translation> -<translation id="4485425108474077672">Konfiguriranje URL-ja strani »Nov zavihek«</translation> +<translation id="4485425108474077672">Konfiguriranje URL-ja novega zavihka s povezavami</translation> <translation id="4492287494009043413">Onemogoči ustvarjanje posnetkov zaslona</translation> <translation id="450537894712826981">Nastavi velikost predpomnilnika, ki ga bo izdelek <ph name="PRODUCT_NAME" /> uporabljal za shranjevanje predpomnjenih predstavnostnih datotek na disku. @@ -2135,7 +2133,7 @@ Podatki o pomnilniku se vseeno pošiljajo strani, ne glede na vrednost možnosti, vendar se poslane vrednosti kvantizirajo in je hitrost posodobitev iz varnostnih razlogov omejena. Če želite sprotne natančne podatke, uporabite orodja, kot je Telemetry.</translation> -<translation id="6894178810167845842">URL strani »Nov zavihek«</translation> +<translation id="6894178810167845842">URL novega zavihka s povezavami</translation> <translation id="6899705656741990703">Samodejno zaznavanje nastavitev proxyja</translation> <translation id="6903814433019432303">Ta pravilnik je aktiven samo v maloprodajnem načinu. @@ -2358,9 +2356,9 @@ Ta pravilnik velja le, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation> <translation id="7302043767260300182">Časovni zamik zaklepa zaslona, če se napaja iz električnega omrežja</translation> -<translation id="7311458740754205918">Če je ta pravilnik omogočen ali ni nastavljen, bodo na strani »Nov zavihek« morda prikazani predlogi vsebine na podlagi uporabnikove zgodovine brskanja, zanimanj ali lokacije. +<translation id="7311458740754205918">Če je ta pravilnik omogočen ali ni nastavljen, bodo na novem zavihku s povezavami morda prikazani predlogi vsebine na podlagi uporabnikove zgodovine brskanja, zanimanj ali lokacije. - Če je ta pravilni onemogočen, samodejno ustvarjeni predlogi vsebine ne bodo prikazani na strani »Nov zavihek«.</translation> + Če je ta pravilni onemogočen, samodejno ustvarjeni predlogi vsebine na novem zavihku s povezavami ne bodo prikazani.</translation> <translation id="7323896582714668701">Dodatni parametri ukazne vrstice za <ph name="PRODUCT_NAME" /></translation> <translation id="7326394567531622570">Podobno Wipe (vrednost 2), vendar poskuša ohraniti žetone za prijavo, da se uporabniku ni treba prijaviti znova.</translation> <translation id="7329842439428490522">Določa trajanje uporabnikove nedejavnosti, po preteku katere se zaslon izklopi, če se napaja iz akumulatorja. @@ -2375,9 +2373,9 @@ <translation id="7329968046053403405">Določa vrsto računov, ki jih ponuja aplikacija za preverjanje pristnosti za Android, ki podpira preverjanje pristnosti z razširitvijo <ph name="HTTP_NEGOTIATE" /> (npr. preverjanje pristnosti Kerberos). Ti podatki bi morali biti na voljo od ponudnika aplikacije za preverjanje pristnosti. Več informacij je na voljo na https://goo.gl/hajyfN. Če ni določena nobena nastavitev, je v Androidu onemogočeno preverjanje pristnosti z razširitvijo <ph name="HTTP_NEGOTIATE" />.</translation> -<translation id="7331962793961469250">Ko je pravilnik nastavljen na »True«, se promocije za programe iz Spletne trgovine Chrome ne bodo prikazale na strani novega zavihka. +<translation id="7331962793961469250">Ko je pravilnik nastavljen na »True«, se promocije za aplikacije iz Spletne trgovine Chrome ne bodo prikazale na novem zavihku s povezavami. - Če to možnost nastavite na »False« ali je ne nastavite, se bodo promocije za programe iz Spletne trgovine Chrome prikazovale na strani novega zavihka</translation> + Če to možnost nastavite na »False« ali je ne nastavite, se bodo promocije za aplikacije iz Spletne trgovine Chrome prikazovale na novem zavihku s povezavami.</translation> <translation id="7332963785317884918">Ta pravilnik je zastarel. Sistem <ph name="PRODUCT_OS_NAME" /> bo vedno uporabljal strategijo čiščenja »RemoveLRU«. Nadzira delovanje samodejnega čiščenja v napravah s sistemom <ph name="PRODUCT_OS_NAME" />. Samodejno čiščenje sprosti prostor na disku in se sproži, ko količina nezasedenega prostora na disku doseže kritično raven. @@ -2532,7 +2530,7 @@ Če je ta nastavitev omogočena, mora uporabnik pri dostopu do gostitelja navesti veljavno kodo v dveh korakih. Če je ta nastavitev onemogočena ali ni nastavljena, koda v dveh korakih ne bo omogočena in uporabljeno bo privzeto vedenje z uporabo uporabniško določenega PIN-a.</translation> -<translation id="7750991880413385988">Odpri stran »Nov zavihek«</translation> +<translation id="7750991880413385988">Odpri nov zavihek s povezavami</translation> <translation id="7754704193130578113">Pred prenosom vprašaj, kam želim shraniti vsako datoteko</translation> <translation id="7761446981238915769">Konfiguriranje seznama nameščenih aplikacij na zaslonu za prijavo</translation> <translation id="7761526206824804472">Nastavi enega ali več priporočenih jezikov za javne seje, kar uporabnikom omogoča preprosto izbiro enega od teh jezikov. @@ -2554,7 +2552,7 @@ <translation id="7763479091692861127"> Vrste povezav, ki so dovoljene za uporabo za posodobitve operacijskega sistema. Posodobitve operacijskega sistema lahko zaradi svoje velikosti zelo obremenijo povezavo in lahko prinesejo dodatne stroške. Zato trenutno niso omogočene za vrste povezave, ki štejejo za drage; trenutno so to WiMax, Bluetooth in prenos podatkov v mobilnem omrežju. Prepoznani identifikatorji vrste povezav so »ethernet«, »wifi«, »wimax«, »bluetooth« in »cellular«.</translation> -<translation id="7763614521440615342">Prikaz predlogov vsebine na strani »Nov zavihek«</translation> +<translation id="7763614521440615342">Prikaz predlogov vsebine na novem zavihku s povezavami</translation> <translation id="7774768074957326919">Uporaba sistemskih nastavitev proxyja</translation> <translation id="7775831859772431793">Tu lahko določite URL strežnika proxy. @@ -2564,7 +2562,7 @@ Več o drugih možnostih in podrobnejše primere najdete na: <ph name="PROXY_HELP_URL" /></translation> -<translation id="7781069478569868053">Stran »Nov zavihek«</translation> +<translation id="7781069478569868053">Nov zavihek s povezavami</translation> <translation id="7788511847830146438">Za profil</translation> <translation id="7788872453000173219"> Oglejte si nastavitev pravilnika IsolateOrigins, če želite izkoristiti prednosti obeh funkcij, 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. @@ -2812,7 +2810,7 @@ <translation id="8424255554404582727">Nastavitev privzetega sukanja zaslona, ki se znova uveljavi pri vsakem vnovičnem zagonu</translation> <translation id="8426231401662877819">Sukanje zaslona v smeri urnega kazalca za 90 stopinj</translation> <translation id="8433423491036718210">Konfigurirajte seznam URL-jev prijave za poslovna okolja, pri katerih naj zaščitna storitev zajame prstni odtis gesla.</translation> -<translation id="8451988835943702790">Uporabi stran za nov zavihek kot domačo stran</translation> +<translation id="8451988835943702790">Uporabi nov zavihek s povezavami kot domačo stran</translation> <translation id="8459216513698220096">Določa, ali in kako je obdelan uporabniški pravilnik iz predmeta pravilnika skupine računalnika. Če je pravilnik nastavljen na »Default« ali ni nastavljen, je uporabniški pravilnik prebran samo iz predmetov pravilnika skupine uporabnika (predmeti pravilnika skupine računalnika so prezrti). @@ -2857,7 +2855,7 @@ <translation id="8544375438507658205">Privzeti upodabljalnik HTML-ja za <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8544465954173828789">Dovolitev sinhroniziranja sporočil SMS med telefonom in Chromebookom.</translation> <translation id="8549772397068118889">Opozori pri odpiranju spletnih mest zunaj paketov vsebine</translation> -<translation id="8566842294717252664">Skrivanje spletne trgovine na strani »Nov zavihek« in v zaganjalniku aplikacij</translation> +<translation id="8566842294717252664">Skrivanje spletne trgovine na novem zavihku s povezavami in v zaganjalniku aplikacij</translation> <translation id="8586528890725660268">Določa tiskalnike, ki jih uporabnik ne more uporabljati. Ta pravilnik se uporablja samo, če je za pravilnik <ph name="BULK_PRINTERS_ACCESS_MODE" /> izbrana možnost <ph name="PRINTERS_BLACKLIST" />. @@ -2958,7 +2956,7 @@ <translation id="8825782996899863372">Opozorilo zaščite z geslom sproži vnovična uporaba gesla na spletnem mestu z lažnim predstavljanjem</translation> <translation id="8828766846428537606">Nastavi privzeto domačo stran za <ph name="PRODUCT_NAME" /> in prepreči, da bi jo uporabniki spreminjali. - Nastavitve domače strani uporabnika so popolnoma zaklenjene, če nastavite, da je stran z novim zavihkom domača stran oziroma izberete URL za domačo stran. Če ne navedete URL-ja domače strani, bo lahko uporabnik z ukazom »chrome://newtab« še vedno nastavil, da je domača stran stran z novim zavihkom.</translation> + Nastavitve domače strani uporabnika so popolnoma zaklenjene, če nastavite, da je domača stran nov zavihek s povezavami oziroma izberete URL za domačo stran. Če ne navedete URL-ja domače strani, bo lahko uporabnik z ukazom »chrome://newtab« še vedno nastavil, da je domača stran nov zavihek s povezavami.</translation> <translation id="8833109046074170275">Preverjanje pristnosti prek običajne prijave GAIA</translation> <translation id="8838303810937202360"><ph name="PRODUCT_OS_NAME" /> predpomni aplikacije in razširitve za namestitev za več uporabnikov posamezne naprave, tako jih ni treba prenašati znova za posameznega uporabnika. Če ta pravilnik ni nastavljen ali je vrednost nižja od 1 MB, bo sistem <ph name="PRODUCT_OS_NAME" /> uporabil privzeto velikost predpomnilnika.</translation>
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 9aa00080..2e9e6fe 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -358,6 +358,7 @@ <translation id="199764499252435679">Омогућавају ажурирање компоненти у производу <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Управљање енергијом</translation> <translation id="201557587962247231">Учесталост отпремања извештаја о статусу уређаја</translation> +<translation id="2017301949684549118">URL-ови за веб-апликације које ће бити неприметно инсталиране.</translation> <translation id="2018836497795982119">Наводе период у милисекундама током којег се од услуге за управљање уређајем траже информације о смерницама за корисника. Подешавањем ових смерница замењује се подразумевана вредност од 3 сата. Важеће вредности за ове смернице су у опсегу од 1.800.000 (30 минута) до 86.400.000 (1 дан). Све вредности које нису у овом опсегу биће прилагођене да би се уклопиле у одговарајуће ограничење. Ако платформа подржава обавештења о смерницама, кашњење освежавања ће бити подешено на 24 сата зато што се очекује да обавештења о смерницама принудно покрену освежавање аутоматски када год се смернице промене. @@ -670,6 +671,11 @@ URL Google-ове претраге може да буде наведен као: <ph name="GOOGLE_SEARCH_URL" />. Ова опција мора да се подеси када су омогућене смернице „DefaultSearchProviderEnabled“ и примењиваће се само ако је то случај.</translation> +<translation id="2659019163577049044">Ако је ово подешавање омогућено, корисницима ће бити дозвољено да подесе уређаје за синхронизацију SMS-ова између телефона и Chromebooks-ова. Имајте у виду да корисници морају посебно да омогуће ову функцију у току подешавања ако је ова смерница дозвољена. Када доврше подешавање, корисници ће моћи да шаљу и примају SMS-ове на Chromebook-овима. + + Ако је ово подешавање онемогућено, корисницима неће бити дозвољено да подесе синхронизацију SMS-ова. + + Ако ова смерница није подешена, то подразумевано није дозвољено корисницима којима се управља, а дозвољено је корисницима којима се не управља.</translation> <translation id="2660846099862559570">Никада не користи прокси</translation> <translation id="267596348720209223">Наводи кодирања знакова које подржава добављач претраге. Кодирања су називи страница кодова, као што су UTF-8, GB2312 и ISO-8859-1. Испробавају се у наведеном редоследу. @@ -740,7 +746,6 @@ Ако онемогућите ово подешавање или не подесите вредност, Преглед пре штампања ће изабрати последњи коришћени штампач као подразумевану дестинацију. Ако омогућите ово подешавање, Преглед пре штампања ће изабрати подразумевани штампач оперативног система као подразумевану дестинацију.</translation> -<translation id="2867699958489427143">Врати на циљану верзију и остани на њој ако је верзија ОС-а новија од циљане. Обави потпуни Powerwash током процеса.</translation> <translation id="2872961005593481000">Искључи</translation> <translation id="2874209944580848064">Напомена за <ph name="PRODUCT_OS_NAME" /> уређаје који подржавају Android апликације:</translation> <translation id="2877225735001246144">Онемогући тражење CNAME-а при преговарању о Kerberos провери аутентичности</translation> @@ -985,7 +990,6 @@ <translation id="3711895659073496551">Искључи</translation> <translation id="3715569262675717862">Потврда идентитета заснована на сертификатима клијента</translation> <translation id="3736879847913515635">Омогући додавање особа у менаџер корисника</translation> -<translation id="3737544779868348650">Име хоста мреже уређаја</translation> <translation id="3746590506846867985"> Ове смернице се односе на екран за пријављивање. Погледајте и смернице <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, које се односе на корисничку сесију. Препоручује се да обе смернице подесите на исту вредност. Ако се вредности не подударају, може да дође до одлагања када улазите у корисничку сесију док се примењује вредност наведена у смерницама за корисника. Ако омогућите ове смернице, сваки именовани извор на листи вредности раздвојених зарезима покреће се у сопственом процесу. Ово изолује и изворе које именују поддомени. На пример, ако наведете https://example.com/, то доводи и до изолације адресе https://foo.example.com/ као дела сајта https://example.com/. @@ -1094,6 +1098,7 @@ Сваки унос на листи садржи речник који мора да садржи ИД додатка у пољу „ИД додатка“ и URL адресу за ажурирање у пољу „URL адреса за ажурирање“.</translation> <translation id="3874773863217952418">Омогући функцију „Додирните за претрагу“</translation> <translation id="3877517141460819966">Интегрисана двострука потврда идентитета</translation> +<translation id="3879208481373875102">Конфигурише листу принудно инсталираних веб-апликација</translation> <translation id="388237772682176890">Ове смернице су застареле у верзији M53 и уклоњене су из верзије M54 јер је подршка за SPDY/3.1 завршена. Онемогућавају коришћење SPDY протокола у <ph name="PRODUCT_NAME" />-у. @@ -1337,6 +1342,10 @@ Потпун опис могућих подешавања и структурe ових смерница потражите на https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Режим за обраду унутрашње повратне функције</translation> +<translation id="4554841826517980623">Ова смерница контролише да ли функција дељења датотека у мрежи за <ph name="PRODUCT_NAME" /> треба да користи <ph name="NETBIOS_PROTOCOL" /> за откривање дељења у мрежи. + Када је ова смерница подешена на вредност Тачно, за откривање дељења ће се користити протокол <ph name="NETBIOS_PROTOCOL" /> у мрежи. + Када је ова смерница подешена на вредност Нетачно, за откривање дељења неће се користити протокол <ph name="NETBIOS_PROTOCOL" />. + Ако ова смерница није подешена, то је подразумевано онемогућено за кориснике којима управља предузеће, а омогућено је за кориснике којима не управља предузеће.</translation> <translation id="4555850956567117258">Омогућавање даљинске потврде за корисника</translation> <translation id="4557134566541205630">URL странице Нова картица подразумеваног добављача претраге</translation> <translation id="4567137030726189378">Омогућава употребу алатки за програмере</translation> @@ -1759,6 +1768,7 @@ Ако не подесите ове смернице, говорне повратне информације ће бити онемогућене када се екран за пријављивање прикаже по први пут. Корисници ће моћи да омогуће или онемогуће говорне повратне информације у било ком тренутку и њихов статус на екрану за пријављивање ће бити трајан за кориснике.</translation> <translation id="5868414965372171132">Конфигурација мреже на нивоу корисника</translation> +<translation id="5879014913445067283">Контролише дељење датотека у мрежи преко протокола <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Подразумевано подешавање за колачиће</translation> <translation id="5887414688706570295">Конфигурише TalkGadget префикс који ће користити хостови са даљинским приступом и спречава кориснике да га промене. @@ -2214,6 +2224,17 @@ Ако нису подешене, корисник ће можда бити упитан да ли жели да их увезе или се увоз аутоматски одвија.</translation> <translation id="7063895219334505671">Дозволи искачуће прозоре на овим сајтовима</translation> +<translation id="706568410943497889"> + Ако је ова смерница подешена на вредност Тачно, <ph name="PRODUCT_NAME" /> може да прикупља WebRTC евиденције догађаја из Google услуга (нпр. Google Meet) и отпрема их на Google. + + Ако је ова смерница подешена на вредност Нетачно или није подешена, <ph name="PRODUCT_NAME" /> не може да прикупља нити отпрема те евиденције. + + Те евиденције садрже дијагностичке информације орисне при отклањању грешака са аудио и видео позивима у Chrome-у, попут времена слања и примања RTP пакета и њихове величине, повратних информација о закрчењима на мрежи и метаподатака о времену и квалитету аудио и видео оквира. Те евиденције не обухватају аудио или видео садржај позива. + + Ову колекцију Chrome података можете да покренете само помоћу Google веб-услуга, као што је Google Hangouts или Google Meet. + + Помоћу ИД-а сесије Google може да повезује те евиденције са другим евиденцијама прикупљеним помоћу саме услуге Google. На тај начин отклањање грешака постаје лакше. + </translation> <translation id="706669471845501145">Дозволи сајтовима да приказују обавештења на рачунару</translation> <translation id="7072208053150563108">Стопа мењања лозинке уређаја</translation> <translation id="7074513465313721551">Конфигурише листу домена које ће Безбедно прегледање сматрати поузданим. Ово значи следеће: @@ -2346,6 +2367,9 @@ <translation id="7336878834592315572">Чувај колачиће током трајања сесије</translation> <translation id="7340034977315324840">Пријављивање времена активности на уређају</translation> <translation id="7343497214039883642">Датотека за конфигурацију штампача за уређаје предузећа</translation> +<translation id="7349338075015720646">Наводи листу веб-сајтова који су неприметно инсталирани, без интеракције корисника, и које корисник не може да деинсталира или онемогући. + + Свака ставка смернице представља објекат са два члана: „url“ и „launch_container“. „url“ треба да буде URL веб-апликације која се инсталира, а „launch_container“ треба да буде „window“ или „tab“ да би се означило како ће се веб-апликација отварати када буде инсталирана. Ако је атрибут „launch_container“ изостављен, апликација ће се покретати у прозору ако Chrome утврди да је у питању прогресивна веб-апликација, а у супротном ће се отварати на картици.</translation> <translation id="7367028210010532881">Услуга Безбедно прегледање приказује страницу са упозорењем када се корисници крећу до сајтова који су обележени као потенцијално злонамерни. Ако онемогућите ово подешавање или га не конфигуришете, корисници могу да наставе до обележеног сајта после приказивања упозорења. @@ -2822,6 +2846,7 @@ „Верзија“ овде може да значи или тачну верзију, као што је „61.0.3163.120“, или префикс верзије, као што је „61.0“ </translation> <translation id="8544375438507658205">Подразумевани HTML приказивач за <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Дозвољава да се SMS-ови синхронизују између телефона и Chromebook-а.</translation> <translation id="8549772397068118889">Упозори ме када посећујем сајтове изван пакета садржаја</translation> <translation id="8566842294717252664">Сакриј веб-продавницу са странице Нова картица и у Покретачу апликација</translation> <translation id="8586528890725660268">Наводе штампаче које корисник не може да користи. @@ -2866,6 +2891,11 @@ Ако не подесите ове смернице, упозорење за заштиту лозинком ће се покренути када корисници користе Google лозинке на сајтовима са „пецањем“, али корисник може то да промени.</translation> <translation id="8672321184841719703">Циљана верзија Аутоматских ажурирања</translation> <translation id="867410340948518937">U2F (Universal Second Factor – универзални други фактор)</translation> +<translation id="8682611302223077049">Омогућава подешавање временског периода, у милисекундама, током ког корисници добијају обавештење да морају поново да покрену <ph name="PRODUCT_NAME" /> или да рестартују <ph name="PRODUCT_OS_NAME" /> уређај да би применили ажурирање на чекању. + + Током овог временског периода корисник редовно добија обавештења о потребном ажурирању. На <ph name="PRODUCT_OS_NAME" /> уређајима обавештење о рестартовању се појављује на системској палети када се открије надоградња. У <ph name="PRODUCT_NAME" /> прегледачима се по истеку једне трећине периода за приказ обавештења мења мени апликације да би се указало на то да је потребно поновно покретање. Ово обавештење мења боју када прође половина периода за приказ обавештења и још једном када прође читав тај период. Додатна обавештења која омогући смерница <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> прате исти распоред. + + Ако смерница није подешена, користи се подразумевани период од 345.600.000 милисекунди (четири дана) за <ph name="PRODUCT_OS_NAME" /> уређаје и 604.800.000 милисекунди (недељу дана) за прегледаче <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Покретач упозорења за заштиту лозинком се активира када се лозинка поново користи</translation> <translation id="8693243869659262736">Коришћење уграђеног DNS клијента</translation> <translation id="8704831857353097849">Листа онемогућених додатних компоненти</translation> @@ -2910,6 +2940,7 @@ Фактор промена мора да буде 100% или већи. Вредности које би скратиле време до замрачивања екрана у режиму презентације у односу на уобичајено време до замрачивања екрана нису дозвољене.</translation> <translation id="8798099450830957504">Подразумевано</translation> +<translation id="8801680448782904838">Обавештава корисника да се препоручује или захтева поновно покретање прегледача или уређаја</translation> <translation id="8818173863808665831">Пријавите географску локацију уређаја. Ако смернице не буду подешене или буду подешене на Нетачно, локација неће бити пријављена.</translation> @@ -3073,6 +3104,11 @@ Ако подесите ове смернице на Тачно, <ph name="PRODUCT_OS_NAME" /> ће покретати рестартовање када корисник искључује уређај. <ph name="PRODUCT_OS_NAME" /> замењује сву дугмад за искључивање у корисничком интерфејсу дугмадима за рестартовање. Ако корисник искључује уређај помоћу дугмета за напајање, уређај се неће аутоматски рестартовати чак и ако су смернице омогућене.</translation> <translation id="9152473318295429890">Омогућавају контекстуалне предлоге сродних веб-страница</translation> <translation id="9158929520101169054">Дозвољавају вишеструко пријављивање у оквиру прегледача</translation> +<translation id="9159126470527871268">Обавештава корисника да <ph name="PRODUCT_NAME" /> мора да се поново покрене или да <ph name="PRODUCT_OS_NAME" /> мора да се рестартује да би се применило ажурирање на чекању. + + Ово подешавање смернице омогућава обавештавање корисника да се препоручује или је потребно поновно покретање прегледача или рестартовање уређаја. Ако није подешена, <ph name="PRODUCT_NAME" /> указује кориснику незнатним променама менија да је поновно покретање потребно, док <ph name="PRODUCT_OS_NAME" /> на то указује помоћу обавештења у системској палети. Ако се изабере подешавање „Препоручено“, кориснику ће се приказивати упозорење да се препоручује поновно покретање. Корисник може да одбаци ово упозорење да би одложио поновно покретање. Ако се изабере подешавање „Обавезно“, кориснику ће се приказивати упозорење да ће се прегледач принудно поново покренути када истекне период за обавештење. Подразумевано трајање тог периода је седам дана за <ph name="PRODUCT_NAME" /> и четири дана за <ph name="PRODUCT_OS_NAME" /> може да се конфигурише преко подешавања смернице <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Корисникова сесија се обнавља после поновног покретања/рестартовања.</translation> <translation id="9165792353046089850">Омогућавају вам да подесите да ли је веб-сајтовима дозвољено да добијају приступ повезаним USB уређајима. Приступ може да буде потпуно блокиран, а можемо и да питамо корисника сваки пут када веб-сајт тражи да добије приступ повезаним USB уређајима. Ове смернице могу да се занемаре за конкретне URL шаблоне помоћу смерница „WebUsbAskForUrls“ и „WebUsbBlockedForUrls“.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index b80ef00..ae5d1ca 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -359,6 +359,7 @@ <translation id="199764499252435679">Aktivera komponentuppdateringar i <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Energibesparing (DPMS)</translation> <translation id="201557587962247231">Frekvens för antal uppladdningar av statusrapport för enhet</translation> +<translation id="2017301949684549118">Webbadresser till webbappar som ska installeras obemärkt</translation> <translation id="2018836497795982119">Anger en tid i millisekunder för hur ofta enhetshanteringstjänsten tillfrågas om användarpolicyinformation. När denna policy har ställts in åsidosätts standardvärdet tre timmar. Giltiga värden är från 1800000 (30 minuter) till 86400000 (en dag). Värden utanför intervallet ändras till närmaste gräns. Om plattformen stöder policymeddelanden används 24 timmar som uppdateringsfördröjning, eftersom uppdateringar då sker automatiskt så fort policyn förändras. @@ -672,6 +673,11 @@ Googles sökadress kan anges så här: <ph name="GOOGLE_SEARCH_URL" />. Alternativet måste anges om principen DefaultSearchProviderEnabled är aktiverad och används bara om så är fallet.</translation> +<translation id="2659019163577049044">Om inställningen är aktiverad tillåts användare att konfigurera sina enheter så att sms synkroniseras mellan deras mobiler och Chromebook-enheter. Observera att om principen är tillåten måste användare uttryckligen välja att delta genom att slutföra ett konfigurationsflöde. Användaren kan skicka och ta emot sms på sin Chromebook när konfigurationsflödet har slutförts. + + Om inställningen är inaktiverad tillåts inte användare att konfigurera synkronisering för sms. + + Om principen inte anges tillåts som standard inte hanterade användare att använda funktionen medan användare som inte hanteras får göra det.</translation> <translation id="2660846099862559570">Använd aldrig en proxy</translation> <translation id="267596348720209223">Policyn anger vilka teckenkodningar som stöds av sökleverantören. Kodningar är kodsidenamn som UTF-8, GB2312 och ISO-8859-1. De testas i den ordning som de anges. @@ -742,7 +748,6 @@ Om du inaktiverar den här inställningen eller inte anger något värde används den senast använda skrivaren som standardval för Förhandsgranskning. Om du aktiverar den här inställningen används operativsystemets standardskrivare som standardval för Förhandsgranskning.</translation> -<translation id="2867699958489427143">Återställ till målversionen om operativsystemet är nyare än målversionen. Utför en komplett powerwash under processen.</translation> <translation id="2872961005593481000">Stäng av</translation> <translation id="2874209944580848064">Tänk på detta för <ph name="PRODUCT_OS_NAME" />-enheter som stöder Android-appar:</translation> <translation id="2877225735001246144">Inaktivera CNAME-sökning när Kerberos-autentisering kontrolleras</translation> @@ -987,7 +992,6 @@ <translation id="3711895659073496551">Stäng av</translation> <translation id="3715569262675717862">Autentisering utifrån klientcertifikat</translation> <translation id="3736879847913515635">Gör att en person kan läggas till i användarhanteraren</translation> -<translation id="3737544779868348650">Värdnamn för enhetsnätverk</translation> <translation id="3746590506846867985"> Den här principen gäller inloggningsskärmen. Se även principen <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, som gäller för användarsessionen. Vi rekommenderar att samma värde anges för båda principerna. Om värdena inte stämmer överens kan det uppstå en fördröjning när en användarsession startas medan användarprincipens inställning 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/. @@ -1102,6 +1106,7 @@ Varje post i listan innehåller en ordbok som måste innehålla tilläggets ID i fältet extension-id och dess uppdateringsadress i fältet update-url.</translation> <translation id="3874773863217952418">Aktivera Tryck för att söka</translation> <translation id="3877517141460819966">Läget för integrerad tvåfaktorsautentisering</translation> +<translation id="3879208481373875102">Konfigurera listan över tvångsinstallerade webbappar</translation> <translation id="388237772682176890">Den här principen har fasats ut i M53 och tagits bort från M54, eftersom stödet för SPDY/3.1 har tagits bort. Inaktiverar användning av SPDY-protokollet i <ph name="PRODUCT_NAME" />. @@ -1345,6 +1350,10 @@ Du hittar en fullständig beskrivning av möjliga inställningar och strukturen för principen på https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Behandlingsläge för användarprincip-loopback</translation> +<translation id="4554841826517980623">Principen styr om funktionen Network File Share i <ph name="PRODUCT_NAME" /> ska använda <ph name="NETBIOS_PROTOCOL" /> för att registrera delningar i nätverket. + Om principen är inställd på Sant används protokollet <ph name="NETBIOS_PROTOCOL" /> för att registrera delningar i nätverket. + Om principen är inställd på Falskt används inte protokollet <ph name="NETBIOS_PROTOCOL" /> för att registrera delningar i nätverket. + Om principen inte ställs in är den inaktiverad för företagshanterade användare och aktiverad för användare som inte hanteras som standard.</translation> <translation id="4555850956567117258">Aktivera fjärrattestering för användaren</translation> <translation id="4557134566541205630">Webbadress för standardsökleverantören av ny fliksida</translation> <translation id="4567137030726189378">Tillåt användning av utvecklarverktygen</translation> @@ -1769,6 +1778,7 @@ Om den här principen inte anges är talad feedback inaktiverad första gången som inloggningsskärmen visas. Användarna kan aktivera eller inaktivera talad feedback när som helst och funktionens status på inloggningsskärmen sparas.</translation> <translation id="5868414965372171132">Nätverkskonfiguration på användarnivå</translation> +<translation id="5879014913445067283">Styr registrering med Network File Share via <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Standardinställning för cookies</translation> <translation id="5887414688706570295">Konfigurerar prefixet TalkGadget som kommer att användas av fjärråtkomstvärdar och förhindrar att användare ändrar det. @@ -2231,6 +2241,17 @@ Om policyn inte har angetts kan användaren få välja om importen ska göras, eller så utförs importen automatiskt.</translation> <translation id="7063895219334505671">Tillåt popup-fönster på dessa webbplatser</translation> +<translation id="706568410943497889"> + Om principen är inställd på Sant får <ph name="PRODUCT_NAME" /> behörighet att samla in WebRTC-händelseloggar från Googles tjänster (t.ex. Google Meet) och ladda upp loggarna till Google. + + Om principen är inställd på Falskt eller inte angiven får <ph name="PRODUCT_NAME" /> inte samla in eller ladda upp sådana loggar. + + Loggarna innehåller diagnostisk information som är användbar vid felsökning av problem med ljud- eller videosamtal i Chrome, till exempel när RTP-paket skickades och togs emot och hur stora de var, feedback om överbelastning i nätverket och metadata om ljud och bildramars längd och kvalitet. Loggarna innehåller inte ljud eller video från själva samtalet. + + Datainsamlingen kan bara aktiveras av Googles webbtjänster som Google Hangouts eller Google Meet. + + Google kan koppla loggarna via ett sessions-id till andra loggar som samlats in av Google-tjänsten. Detta är avsiktligt för att underlätta felsökningen. + </translation> <translation id="706669471845501145">Tillåt att webbplatser visar aviseringar på skrivbordet</translation> <translation id="7072208053150563108">Ändringsfrekvens för datorns lösenord</translation> <translation id="7074513465313721551">Konfigurera listan över domäner som Säker webbsökning litar på. Detta innebär: @@ -2363,6 +2384,9 @@ <translation id="7336878834592315572">Behåll cookies under hela sessionen</translation> <translation id="7340034977315324840">Rapportera aktivitetstider för enhet</translation> <translation id="7343497214039883642">Skivarkonfigurationsfil för företagsenheter</translation> +<translation id="7349338075015720646">Anger en lista över webbplatser som installeras obemärkt utan att användaren gör något, och som användaren inte kan avinstallera eller inaktivera. + + Varje post i principens listan är ett objekt med två medlemmar: "url" och "launch_container". "url" bör vara webbadressen till webbappen som ska installeras och "launch_container" ska anges antingen som "window" eller "tab" för att visa hur webbappen ska öppnas när den har installerats. Om "launch_container" utelämnas öppnas appen i ett fönster om den anses vara en progressiv webbapp i Chrome och på en flik i annat fall.</translation> <translation id="7367028210010532881">Med tjänsten Säker webbsökning visas en varningssida när användare navigerar till webbplatser som flaggats som skadliga. Om du aktiverar inställningen kan användare inte fortsätta från varningssidan till den skadliga webbplatsen. Om inställningen inaktiveras eller inte konfigureras kan användare välja att fortsätta från den flaggade webbplatsen efter att varningen har visats. @@ -2824,6 +2848,7 @@ Versionen kan vara ett exakt versionsnummer som 61.0.3163.120 eller ett versionsprefix som 61.0. </translation> <translation id="8544375438507658205">HTML-standardrenderare för <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Tillåt att sms synkroniseras från mobilen till Chromebook.</translation> <translation id="8549772397068118889">Varna när du besöker webbplatser utanför innehållspaket</translation> <translation id="8566842294717252664">Dölj webbutiken från sidan ny flik och startprogrammet för appar</translation> <translation id="8586528890725660268">Anger skrivare som inte får användas. @@ -2868,6 +2893,11 @@ Om principen har lämnats utan inställning skyddas endast lösenord på Google av lösenordsskyddet, men användaren kan ändra inställningen.</translation> <translation id="8672321184841719703">Målversion för automatisk uppdatering</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">Gör att du kan ställa in i millisekunder under hur lång tid in som användare aviseras om att <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" />-enheten måste startas om när en uppdatering väntar. + + Under den tiden visas upprepade uppmaningar att starta om för användaren. På <ph name="PRODUCT_OS_NAME" />-enheter visas en avisering om att starta om i systemfältet när en uppgradering har upptäckts. I <ph name="PRODUCT_NAME" />-webbläsare ändras appmenyn för att visa att en omstart behövs när en tredjedel av tidsperioden har gått. Aviseringen byter färg när två tredjedelar av tidsperioden har gått och igen när tidsperioden har löpt ut. För ytterligare aviseringar som aktiveras med principen <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> används samma schema. + + Om principen inte ställs in används som standard tidsperioden 345 600 000 millisekunder (fyra dagar) för <ph name="PRODUCT_OS_NAME" />-enheter och 604 800 000 millisekunder (en vecka) för <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Lösenordsskyddets varningar utlöses av att lösenordet återanvänds</translation> <translation id="8693243869659262736">Använd en inbyggd DNS-klient</translation> <translation id="8704831857353097849">Lista med inaktiverade plugin-program</translation> @@ -2912,6 +2942,7 @@ Skalningsfaktorn måste vara 100 % eller mer. Värden som skulle göra fördröjningen av skärmdämpningen i presentationsläge kortare än den vanliga fördröjningen tillåts inte.</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8801680448782904838">Meddela användaren att webbläsaren eller enheten bör eller måste startas om</translation> <translation id="8818173863808665831">Rapportera enhetens geografiska plats. Om policyn inte är inställd eller inte är aktiverad rapporteras inte platsen.</translation> @@ -3076,6 +3107,11 @@ Om policyn är inställd på sant utlöser <ph name="PRODUCT_OS_NAME" /> en omstart när användaren stänger av enheten. <ph name="PRODUCT_OS_NAME" /> ersätter alla förekomster av avstängningsknappar i gränssnittet med omstartsknappar. Om användaren stänger av enheten med strömbrytaren startas den inte om automatiskt även om policyn är aktiverad.</translation> <translation id="9152473318295429890">Aktivera innehållsbaserade förslag för relaterade webbsidor</translation> <translation id="9158929520101169054">Aktivera multiinloggning i webbläsaren</translation> +<translation id="9159126470527871268">Meddela användarna att <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" /> måste startas om eftersom en uppdatering väntar. + + Med den här principen kan användaren få en avisering om att webbläsaren eller enheten bör eller måste startas om. Om principen inte ställs in framgår det av en diskret ändring i menyn i <ph name="PRODUCT_NAME" /> att omstart krävs medan en avisering visas i systemfältet för <ph name="PRODUCT_OS_NAME" />.Med inställningen Rekommenderas visas ett återkommande meddelande för användaren att en omstart rekommenderas. Användaren kan ignorera meddelandet och skjuta upp omstarten. Med inställningen Krävs visas ett återkommande meddelande om att webbläsaren kommer att startas om efter en viss tid. Tidsperioden är sju dagar för <ph name="PRODUCT_NAME" /> och fyra dagar för <ph name="PRODUCT_OS_NAME" /> som standard. Den kan konfigureras via inställningarna för principen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Användarens session återställs efter omstarten.</translation> <translation id="9165792353046089850">Låter dig ange om webbplatser får åtkomst till anslutna USB-enheter. Åtkomsten kan blockeras helt eller så kan användaren bli tillfrågad varje gång en webbplats begär åtkomst till anslutna USB-enheter. Den här principen kan åsidosättas för enskilda webbadressmönster med principerna WebUsbAskForUrls och WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index dcf3b1d5..576d916 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -334,6 +334,7 @@ <translation id="199764499252435679">Ruhusu masasisho ya vipengele katika <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Usimamizi wa nishati</translation> <translation id="201557587962247231">Idadi ya upakiaji wa ripoti ya hali ya kifaa</translation> +<translation id="2017301949684549118">URL za Programu za Wavuti zitakazosakinishwa kwa njia fiche.</translation> <translation id="2018836497795982119">Hubainisha kipindi kwa kipimo cha milisekunde ambapo huduma ya kudhibiti kifaa huulizwa maelezo ya sera ya mtumiaji Kuweka sera hii hubatilisha thamani chaguomsingi ya saa 3. Thamani sahihi za sera hii ziko kuanzia 1800000 (dakika 30) hadi 86400000 (siku 1). Thamani zozote ambazo hazipo katika masafa haya zitawekwa katika mpaka husika. Ikiwa mfumo unatumia arifa za sera, ucheleweshwaji wa kuonyesha upya utawekwa kuwa saa 24 kwa sababu unatarajiwa kwamba arifa za sera zitalazimisha kuonyesha upya kiotomatiki wakati wowote ambao sera itabadilika. @@ -638,6 +639,11 @@ URL ya utafutaji wa Google inaweza kubanishwa kuwa: <ph name="GOOGLE_SEARCH_URL" />. Lazima chaguo hili liwekwe wakati sera ya 'DefaultSearchProviderEnabled' imewashwa na itazingatiwa tu hali hii ikitimizwa.</translation> +<translation id="2659019163577049044">Kama mipangilio hii imewashwa, watumiaji wataruhusiwa kuweka mipangilio kwenye vifaa vyao ili wasawazishe ujumbe wa SMS kati ya simu na Chromebook zao. Kumbuka kwamba ikiwa sera hii itaruhusiwa, ni sharti watumiaji wajijumuishe waziwazi kwenye kipengele hiki kwa kukamilisha utaratibu wa kuweka mipangilio. Pindi utaratibu wa kuweka mipangilio utakamilika, watumiaji wataweza kutuma na kupokea SMS kwenye Chromebook zao. + + Ikiwa mipangilio hii imezimwa, watumiaji hawataruhusiwa kuweka mipangilio ya kusawazisha SMS. + + Ikiwa sera hii haitawekwa, hali chaguomsingi haitaruhusiwa kwa watumiaji wanaosimamiwa lakini itaruhusiwa kwa watumiaji wasiosimamiwa.</translation> <translation id="2660846099862559570">Usitumie proksi kamwe</translation> <translation id="267596348720209223">Inabainisha usimbaji wa vibambo unaohimiliwa na kitoaji cha utafutaji. Usimbaji ni majini ya ukurasa msimbo kama UTF-8, GB2312, na ISO-8859-1. Yanajaribiwa katika mpangilio uliotolewa. @@ -708,7 +714,6 @@ Ukiizima mipangilio hii au usipoweka thamani, Onyesho la Kuchungulia la Printa litatumia printa iliyotumika hivi majuzi zaidi kama uteuzi chaguomsingi. Ukiiwasha mipangilio hii, Onyesho la Kuchungulia la Printa litatumia printa chaguomsingi ya mfumo wa uendeshaji kama uteuzi chaguomsingi.</translation> -<translation id="2867699958489427143">Rejesha na uendelee kutumia toleo lengwa ikiwa toleo la Mfumo wa Uendeshaji ni jipya zaidi kuliko toleo lengwa. Tekeleza Powerwash kamili wakati wa mchakato huu.</translation> <translation id="2872961005593481000">Zima</translation> <translation id="2874209944580848064">Kidokezo kwa vifaa vya <ph name="PRODUCT_OS_NAME" /> vinavyotumia programu za Android:</translation> <translation id="2877225735001246144">Lemaza kidokezo cha CNAME unapohawilisha uthibitishaji wa Kerberos</translation> @@ -954,7 +959,6 @@ <translation id="3711895659073496551">Sitisha</translation> <translation id="3715569262675717862">Uthibitishaji kulingana na vyeti vya kiteja</translation> <translation id="3736879847913515635">Washa kipengele cha kuongeza wasifu katika kidhibiti cha mtumiaji</translation> -<translation id="3737544779868348650">Jina la mpangishaji wa mtandao unaotumika kwenye kifaa</translation> <translation id="3746590506846867985"> Sera hii inatumika kwenye skrini unayotumia kuingia katika akaunti. Tafadhali angalia pia sera ya <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ambayo inatumiwa katika kipindi cha mtumiaji. Tunapendekeza uweke sera zote kuwa thamani sawa. Kama thamani hazilingani, ucheleweshaji huenda ukatokea wakati kipindi cha mtumiaji kinawekwa huku thamani inayobainishwa na sera ya mtumiaji ikitumika. Ikiwa sera imewashwa, kila chanzo ulichotaja katika orodha inayotenganishwa kwa @@ -1071,6 +1075,7 @@ Kila ingizo la orodha lina kamusi ambayo ni lazima ijumuishe Kitambulisho cha kirefusho katika uga wa 'kitambulisho cha kirefusho', na URL sasishi yake katika uga wa 'url-sasishi'.</translation> <translation id="3874773863217952418">Washa kipengele cha Gusa ili Utafute</translation> <translation id="3877517141460819966">Hali ya uthibitishaji wa hatua mbili iliyowekwa</translation> +<translation id="3879208481373875102">Weka mipangilio ya orodha ya Programu za Wavuti zilizosakinishwa kwa lazima</translation> <translation id="388237772682176890">Sera imeacha kufanya kazi katika M53 na imeondolewa katika M54, kwa sababu matumizi ya SPDY/3.1 yameondolewa. Huzima matumizi ya itifaki ya SPDY katika <ph name="PRODUCT_NAME" />. @@ -1311,6 +1316,10 @@ Kwa maelezo kamili ya mipangilio inayoweza kutumika na muundo wa sera hii tafadhali tembelea https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Hali ya uchakataji unaojirudia wa sera ya mtumiaji</translation> +<translation id="4554841826517980623">Sera hii inadhibiti iwapo kipengele cha Faili za Kushiriki kwenye Mtandao cha <ph name="PRODUCT_NAME" /> kinapaswa kitumie <ph name="NETBIOS_PROTOCOL" /> ili kugundua faili zinazoshirikiwa kwenye mtandao wako. + Wakati sera hii imewekwa kuwa Ndivyo, kipengele cha kugundua faili za kushiriki kitatumia itifaki ya <ph name="NETBIOS_PROTOCOL" /> ili kugundua faili zinazoshirikiwa kwenye mtandao. + Sera hii inapowekwa kuwa Sivyo, kipengele cha kugundua faili za kushiriki hakitatumia itifaki ya <ph name="NETBIOS_PROTOCOL" /> ili kugundua faili zinazoshirikiwa kwenye mtandao. + Ikiwa sera hii haijawekwa, hali chaguomsingi huzimwa kwa watumiaji wanaosimamiwa kibiashara na kuwashwa kwa watumiaji wasiosimamiwa.</translation> <translation id="4555850956567117258">Washa usahihishaji wa mbali kwa mtumiaji</translation> <translation id="4557134566541205630">Mtoa huduma ya utafutaji chaguomsingi ya URL ya ukurasa wa kichupo kipya</translation> <translation id="4567137030726189378">Ruhusu utumiaji wa Zana za Wasanidi Programu</translation> @@ -1726,6 +1735,7 @@ Ukiweka sera hii, watumiaji wanaweza kuipuuza kwa muda kwa kuwasha au kuzima maoni yaliyotamkwa. Hata hivyo, uchaguzi wa mtumiaji sio wa kuendelea na chaguomsingi hurejeshwa tena wakati wowote skrini ya kuingia katika akaunti inapoonekana upya au mtumiaji anaposalia kama hafanyi kitu kwenye skrini ya kuingia katika akaunti kwa dakika moja. Iwapo sera hii itawachwa bila kuwekwa, maoni yaliyotamkwa yatazimwa skrini ya kuingia katika akaunti itakapoonyeshwa kwanza. Watumiaji wanaweza kuwasha au kuzima maoni yaliyosemwa wakati wowote na hali yake kwenye skrini ya kuingia katika akaunti itakatalia kati ya watumiaji.</translation> <translation id="5868414965372171132">Usanidi mtandao wa kiwango cha mtumiaji</translation> +<translation id="5879014913445067283">Hudhibiti ugunduzi wa Faili ya Kushiriki kwenye Mtandao kupitia <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Mpangilio wa vidakuzi chaguomsingi</translation> <translation id="5887414688706570295">Inasanidi kiambishi awali cha TalkGadget ambacho kitatumiwa na mpangishaji wa ufikivu wa mbali na huzuia watumiaji kukibadilisha. @@ -2186,6 +2196,17 @@ Ikiwa hii haitawekwa, huenda mtumiaji akaulizwa aingize alamisho, au huenda zikaingizwa kiotomatiki.</translation> <translation id="7063895219334505671">Ruhusu ibukizi kwenye tovuti hizi</translation> +<translation id="706568410943497889"> + Kama sera imewekwa kuwa ndivyo, <ph name="PRODUCT_NAME" /> huruhusiwa kukusanya kumbukumbu za matukio ya WebRTC kutoka huduma za Google (kwa mfano, Google Meet) na kupakia kumbukumbu hizo kwenye Google. + + Kama sera imewekwa kuwa sivyo au haijawekwa, huenda <ph name="PRODUCT_NAME" /> haitakusanya wala kupakia kumbukumbu hizi. + + Kumbukumbu hizi hujumuisha maelezo ya utambuzi ambayo yanasaidia kutatua matatizo ya simu za sauti au video katika Chrome, kama vile wakatI na ukubwa wa vifurushi vya RTP vinavyotumwa na kupokelewa, maoni kuhusu msongamano kwenye mtandao na metadata kuhusu wakati na ubora wa fremu za sauti na video. Kumbukumbu hizi hazijumuishi maudhui ya simu ya sauti wala ya video. + + Ukusanyaji wa data hii kwa kutumia Chrome unaweza kuanzishwa tu na huduma za wavuti za Google, kama vile Google Hangouts au Google Meet. + + Huenda Google ikahusisha kumbukumbu hizi na kumbukumbu zingine ambazo hukusanywa na huduma ya Google yenyewe kupitia kitambulisho cha kipindi; hali hii inanuia kurahisisha shughuli ya utatuzi. + </translation> <translation id="706669471845501145">Ruhusu tovuti kuonyesha arifa za eneo-kazi</translation> <translation id="7072208053150563108">Kasi ya kubadilisha nenosiri kwenye mashine</translation> <translation id="7074513465313721551">Weka mipangilio ya orodha za vikoa ambavyo kipengele cha Kuvinjari Salama kinaamini. Hii inamaanisha: @@ -2318,6 +2339,9 @@ <translation id="7336878834592315572">Weka vidakuzi katika muda wa kipindi</translation> <translation id="7340034977315324840">Ripoti muda wa shughuli za kifaa</translation> <translation id="7343497214039883642">Faili za mipangilio ya printa ya biashara kwenye vifaa</translation> +<translation id="7349338075015720646">Hubainisha orodha ya tovuti ambazo zinasakinishwa kwa njia fiche, bila kuhusisha mtumiaji, na ambazo haziwezi kuondolewa wala kuzimwa na mtumiaji. + + Kila orodha ya vipengee vya sera ina sehemu mbili: "url" na "launch_container". Ni sharti "url" iwe URL ya programu ya wavuti ili isakinishwe na ni sharti "launch_container" iwe aidha "dirisha" au "kichupo" ili kuashiria jinsi Programu ya Wavuti itafunguliwa baada ya kusakinishwa. Kama "launch_container" haipo, programu itafunguka katika dirisha ikiwa Chrome itaibanisha kama Programu ya Wavuti Inayoendelea na vinginevyo katika kichupo.</translation> <translation id="7367028210010532881">Huduma ya Kuvinjari Salama huonyesha ukurasa wenye onyo wakati watumiaji wanavinjari tovuti ambazo zimeripotiwa kuwa zinaweza kuwa hasidi. Kuwasha mipangilio hii kunawazuia watumiaji wasifikie tovuti hasidi baada ya kuona ukurasa wenye onyo. Ikiwa mipangilio hii itazimwa au haitawekwa basi watumiaji wataweza kuchagua kuenda kwenye tovuti iliyoripotiwa baada ya kuonyeshwa onyo. @@ -2761,6 +2785,7 @@ Katika hali hii "Toleo" linaweza kuwa toleo halisi kama vile toleo la '61.0.3163.120' au kiambishi cha toleo, kama vile '61.0' </translation> <translation id="8544375438507658205">Kionyeshi chaguo-msngi cha HTML kwa<ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Ruhusu Ujumbe wa SMS kusawazishwa kutoka simu hadi Chromebook.</translation> <translation id="8549772397068118889">Tahadharisha ninapotembelea tovuti zilizo nje ya vifurushi vya maudhui</translation> <translation id="8566842294717252664">Ficha duka la wavuti kwenye ukurasa mpya wa kichupo na kifungua programu cha Chrome</translation> <translation id="8586528890725660268">Hubainisha printa ambazo mtumiaji hawezi kutumia. @@ -2804,6 +2829,11 @@ Iwapo sera hii haijawekwa, huduma ya ulinzi wa nenosiri italinda tu manenosiri ya Google lakini mtumiaji ataweza kubadilisha mipangilio hii.</translation> <translation id="8672321184841719703">Toleo Lengwa la Kusasisha Otomatiki</translation> <translation id="867410340948518937">U2F (Uthibitishaji Jumla wa Hatua Mbili)</translation> +<translation id="8682611302223077049">Hukuruhusu uweke kipindi katika milisekunde, ambapo watumiaji wanaarifiwa kwamba <ph name="PRODUCT_NAME" /> lazima ifunguliwe upya au kifaa cha <ph name="PRODUCT_OS_NAME" /> lazima kizimwe kisha kiwashwe ili kukamilisha kuweka sasisho. + + Katika kipindi hiki, mtumiaji ataarifiwa mara kwa mara kuhusu haja ya kusasisha. Kwa vifaa vya <ph name="PRODUCT_OS_NAME" />, arifa ya itakayokutaka uzime kisha uwashe kifaa itaonekana katika ubao wa aikoni wakati sasisho litatambuliwa. Kwa vivinjari vya <ph name="PRODUCT_NAME" />, mabadiliko ya menyu ya programu ya kuashiria kuwa unahitaji kufungua programu upya yanahitajika baada ya thuluthi ya kipindi cha arifa kuisha. Rangi ya arifa hizi itabadilika baada ya thuluthi mbili za kipindi cha kutoa arifa kuisha na itabadilika tena kipindi kamili cha arifa kitakapokwisha. Arifa za ziada zitakazowashwa na sera ya <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> zitafuata ratiba ii hii. + + Kama hujaweka kipindi, kipindi chaguomsingi cha milisekunde 345600000 (siku nne) itatumika kwa vifaa vya <ph name="PRODUCT_OS_NAME" /> na milisekunde 604800000 (wiki moja) itatumika kwa <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Ilani ya ulinzi wa nenosiri husababishwa na hatua ya kutumia tena nenosiri lile lile</translation> <translation id="8693243869659262736">Tumia DNS teja ya kijenzi cha ndani</translation> <translation id="8704831857353097849">Orodha ya programu jalizi zilizolemazwa</translation> @@ -2848,6 +2878,7 @@ Kama sera hii haijawekwa, mfumo wa kipimo cha msingi kitatumika. Mfumo wa kipimo lazima uwe 100% au zaidi. Thamani zitakazofupisha kuchelewa kwa mwangaza wa skrini katika hali ya wasilisho kuliko kuchelewa kwa mwangaza wa skrini ya kawaida hazitaruhusiwa.</translation> <translation id="8798099450830957504">Chaguomsingi</translation> +<translation id="8801680448782904838">Imwarifu mtumiaji kwamba anashauriwa au anatakiwa afungue upya kivinjari au azime kisha awashe kifaa</translation> <translation id="8818173863808665831">Ripoti eneo la jografia ya kifaa. Ikiwa sera haitawekwa, au imewekwa kwenye Sivyo, eneo halitaripotiwa.</translation> @@ -3002,6 +3033,11 @@ Sera hii ikiwekwa kuwa ndivyo, <ph name="PRODUCT_OS_NAME" /> itaanzisha kuwasha tena mtumiaji anapozima kifaa. <ph name="PRODUCT_OS_NAME" /> huchukua nafasi ya matukio yote ya vitufe vya kuzima katika kiolesura kwa kutumia vitufe vya kuzima. Mtumiaji akizima kifaa akitumia kitufe cha kuwasha/kuzima, hakitawasha tena kiotomatiki, hata kama sera imewashwa.</translation> <translation id="9152473318295429890">Washa mapendekezo ya muktadha wa kurasa za wavuti husika</translation> <translation id="9158929520101169054">Ruhusu Kuingia katika Akaunt Nyingi katika Kivinjari</translation> +<translation id="9159126470527871268">Iwaarifu watumiaji kwamba ni sharti <ph name="PRODUCT_NAME" /> ifunguliwe upya au ni sharti wazime kisha wawashe <ph name="PRODUCT_OS_NAME" /> ili wakamilishe kuweka sasisho. + + Mipanglilio hii ya sera huwasha arifa ili kumwarifu mtumiaji kwamba anashauriwa au anatakiwa afungue upya kivinjari au azime kisha awashe kifaa. Kama sera hii haijawekwa, <ph name="PRODUCT_NAME" /> itamwashiria mtumiai kwamba anahitaji kufungua kivinjari upya kupitia mabadiliko machache kwenye menyu yake ilhali <ph name="PRODUCT_OS_NAME" /> itaashiria hali hii kupitia arifa kwenye ubao wa aikoni. Kama imewekwa kuwa 'Inapendekezwa', onyo linalojirudia litaonyeshwa kwa mtumiaji kwamba anashauriwa afungue upya. Mtumiaji anaweza kuondoa onyo hili kwa kuahirisha mchakato wa kufungua upya. Kama imewekwa kuwa 'Inahitajika' onyo linalojirudia litaonyeshwa kwa mtumiaji kuashiria kwamba kivinjari kitafunguliwa upya kwa lazima baada ya kipindi cha onyo kuisha. Kipindi chaguomsingi ni siku saba kwa <ph name="PRODUCT_NAME" /> na siku nne kwa <ph name="PRODUCT_OS_NAME" />, na inaweza kuwekewa mipangilio kupitia ya sera ya <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Kipindi cha mtumiaji kitarejeshwa baada ya kufunguliwa au kuanzishwa upya.</translation> <translation id="9165792353046089850">Hukuruhusu ubaini ikiwa tovuti zinaruhusiwa kupata idhini ya kufikia vifaa vya USB vilivyounganishwa. Idhini ya ufikiaji inaweza kuzuiwa kabisa, au mtumiaji anaweza kuulizwa kila wakati atoe adhini tovuti inapotaka kufikia vifaa vya USB vilivyounganishwa. Sera hii inaweza kubatilishwa katika ruwaza mahususi ya URL kupitia sera za 'WebUsbAskForUrls' na 'WebUsbBlockedForUrls'.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 628a2d4..ea91ed7 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -28,9 +28,9 @@ <translation id="1062011392452772310">சாதனத்திற்கான தொலைநிலைச் சான்றொப்பத்தை இயக்கு</translation> <translation id="1062407476771304334">மாற்றியமை</translation> <translation id="1079801999187584280">டெவெலப்பர் கருவிகளின் பயன்பாட்டை அனுமதிக்காதே</translation> -<translation id="1093082332347834239">இந்தக் கொள்கையை இயக்கினால், தொலைநிலை உதவி ஹோஸ்ட்டானது <ph name="UIACCESS_PERMISSION_NAME" /> அனுமதிகளைக் கொண்ட செயல்முறையில் இயங்கும். இது தொலைநிலைப் பயனர்களை அகப் பயனரின் டெஸ்க்டாப்பில் உயர்நிலைச் சாளரங்களை அணுக அனுமதிக்கும். +<translation id="1093082332347834239">இந்த அமைப்பை இயக்கினால், தொலைநிலை உதவி ஹோஸ்ட்டானது <ph name="UIACCESS_PERMISSION_NAME" /> அனுமதிகளைக் கொண்ட செயல்முறையில் இயங்கும். இது பயனரின் டெஸ்க்டாப்பில் உயர்நிலைச் சாளரங்களை அணுக தொலைநிலைப் பயனர்களை அனுமதிக்கும். - இந்தக் கொள்கை முடக்கப்பட்டாலோ அல்லது உள்ளமைக்கப்படவில்லை என்றாலோ, தொலைநிலை உதவி ஹோஸ்ட்டானது பயனரின் சூழலில் இயங்கும், தொலைநிலைப் பயனர்களால் டெஸ்க்டாப்பில் உயர்நிலைச் சாளரங்களை அணுக முடியாது.</translation> + இந்த அமைப்பு முடக்கப்பட்டாலோ உள்ளமைக்கப்படவில்லை என்றாலோ, தொலைநிலை உதவி ஹோஸ்ட்டானது பயனரின் சூழலிலேயே இயங்கும். தொலைநிலைப் பயனர்களால் டெஸ்க்டாப்பில் உயர்நிலைச் சாளரங்களை அணுக முடியாது.</translation> <translation id="1096105751829466145">இயல்புநிலை தேடல் வழங்குநர்</translation> <translation id="1099282607296956954">ஒவ்வொரு தளத்திலும் தளத்தைத் தனிப்படுத்தும் அம்சத்தை இயக்கு</translation> <translation id="1100570158310952027"> @@ -99,7 +99,7 @@ அளவு காரணி 100% அல்லது அதற்கு அதிகமாக இருக்க வேண்டும்.</translation> <translation id="131353325527891113">உள்நுழைவு திரையில் பயனர்பெயர்களைக் காண்பி</translation> -<translation id="1327466551276625742">ஆஃப்லைனில் இருக்கும்போது பிணைய உள்ளமைவுத் தூண்டலை இயக்கு</translation> +<translation id="1327466551276625742">ஆஃப்லைனில் இருக்கும்போது நெட்வொர்க் உள்ளமைவுத் தூண்டலை இயக்கு</translation> <translation id="1330145147221172764">திரை விசைப்பலகை இயக்கு</translation> <translation id="13356285923490863">கொள்கைப் பெயர்</translation> <translation id="1352174694615491349">கிளையண்ட் சான்றிதழ்கள் பயன்பாட்டில் இருக்கும்போது, இந்தக் கொள்கையானது HTTP/2 இணைப்பு ஒன்றிணைதலை அனுமதிக்கும். ஒன்றிணைப்பதற்காக, சாத்தியமுள்ள புதிய இணைப்பின் ஹோஸ்ட்பெயர், தற்போதுள்ள இணைப்பின் ஹோஸ்ட்பெயர் ஆகிய இரண்டுமே இந்தக் கொள்கை விளக்கும் ஒன்று அல்லது பல பேட்டர்ன்களுடன் பொருந்த வேண்டும். இந்தக் கொள்கையானது URLBlacklist வடிப்பான் வடிவமைப்பைப் பயன்படுத்துகின்ற ஹோஸ்ட்டுகளின் ஒரு பட்டியலாகும்: "example.com" ஆனது "example.com" மற்றும் அனைத்து உள்களங்களுடன் பொருந்துகிறது (எ.கா. "sub.example.com"), அதே சமயத்தில் ".example.net" ஆனது "example.net" உடன் முழுதாகப் பொருந்துகிறது. @@ -126,7 +126,7 @@ <translation id="1397855852561539316">இயல்புநிலை தேடல் வழங்குநர் பரிந்துரை URL</translation> <translation id="1426410128494586442">ஆம்</translation> <translation id="1427655258943162134">ப்ராக்ஸி சேவையகத்தின் முகவரி அல்லது URL</translation> -<translation id="1435659902881071157">சாதன-நிலை பிணைய உள்ளமைவு</translation> +<translation id="1435659902881071157">சாதன-நிலை நெட்வொர்க் உள்ளமைவு</translation> <translation id="1438739959477268107">இயல்புநிலை விசை உருவாக்க அமைப்பு</translation> <translation id="1454846751303307294">JavaScript ஐ இயக்க அனுமதிக்காத, தளங்களைக் குறிப்பிடும் url முறைகளின் பட்டியலை அமைக்க உங்களை அனுமதிக்கிறது. இந்தக் கொள்கையை அமைக்காமல் விட்டால், ஒட்டுமொத்த இயல்புநிலை மதிப்பு, 'DefaultJavaScriptSetting' கொள்கை அமைக்கப்பட்டால், அதிலிருந்து அல்லது மற்றொரு வகையில் பயனரின் தனிப்பட்ட உள்ளமைவிலிருந்து எல்லா தளங்களுக்கும் பயன்படுத்தப்படும்.</translation> <translation id="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" /> கிளையன்ட்டுகள்):</translation> @@ -181,7 +181,7 @@ <translation id="1514888685242892912"><ph name="PRODUCT_NAME" />ஐ இயக்கும்</translation> <translation id="1522425503138261032">பயனரின் நிஜ இருப்பிடத்தை தடமறிவதற்கு தளங்களை அனுமதி</translation> <translation id="152657506688053119">இயல்புநிலை தேடல் வழங்குநருக்கான மாற்று URLகளின் பட்டியல்</translation> -<translation id="1530812829012954197">ஹோஸ்ட் உலாவியில் எப்போதும் பின்வரும் URL களவடிவங்களை ரெண்டர் செய்க</translation> +<translation id="1530812829012954197">ஹோஸ்ட் உலாவியில் பின்வரும் URL பேட்டர்ன்களை எப்போதும் ரெண்டர் செய்க</translation> <translation id="1553684822621013552">இந்தக் கொள்கையை true என அமைத்தால், பயனருக்கு ARC இயக்கப்படும் (கூடுதல் கொள்கை அமைப்புகள் சோதனைகளுக்கு உட்படும் - நடப்பு பயனர் அமர்வில் குறுகியகால பயன்முறை அல்லது பல உள்நுழைவு இயக்கப்பட்டால், ARC @@ -189,7 +189,7 @@ இந்த அமைப்பு முடக்கப்பட்டால் அல்லது உள்ளமைக்கப்படாவிட்டால், நிறுவனப் பயனர்கள் ARCஐப் பயன்படுத்த முடியாது.</translation> -<translation id="1561424797596341174">தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத்திருத்தப் பதிப்புகளை கொள்கை மேலெழுதும்</translation> +<translation id="1561424797596341174">கொள்கையானது தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத் திருத்தப் பதிப்புகளை மேலெழுதும்</translation> <translation id="1561967320164410511">தனிப்பட்ட சான்றொப்பத்திற்கான U2F மற்றும் நீட்டிப்புகள்</translation> <translation id="1574554504290354326">இந்த அமைப்பு தடுக்கப்பட்டுள்ளது. அதற்குப் பதிலாக, SafeBrowsingExtendedReportingEnabledஐப் பயன்படுத்தவும். SafeBrowsingExtendedReportingEnabledஐ இயக்குவது அல்லது முடக்குவது என்பது SafeBrowsingExtendedReportingOptInAllowedஐ "தவறு" என அமைப்பதற்குச் சமமாகும். @@ -220,7 +220,7 @@ எச்சரிக்கை: <ph name="PRODUCT_OS_NAME" /> பதிப்பின் கட்டுப்பாட்டை கியோஸ்க் பயன்பாட்டிற்கு வழங்க வேண்டாம் எனப் பரிந்துரைக்கிறோம். ஏனெனில், சாதனமானது மென்பொருள் புதுப்பிப்புகளையும் முக்கியமான பாதுகாப்புத் திருத்தங்களையும் பெறுவதை இது தடுக்கக்கூடும். <ph name="PRODUCT_OS_NAME" /> பதிப்பின் கட்டுப்பாட்டை வழங்கினால், பயனர்களுக்கு சிக்கல்கள் ஏற்படலாம்.</translation> <translation id="1675002386741412210">இவற்றில் ஆதரிக்கப்படுகிறது:</translation> <translation id="1679420586049708690">தானியங்கு உள்நுழைவிற்கான பொது அமர்வு</translation> -<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> சாதனத்தில் பயன்படுத்துவதற்கு எல்லா பயனருக்கும் புஷிங் நெட்வொர்க் உள்ளமைவை அனுமதிக்கிறது. நெட்வொர்க் உள்ளமைவு என்பது <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடராகும்</translation> +<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> சாதனத்தைப் பயன்படுத்தும் அனைவருக்கும் நெட்வொர்க் உள்ளமைவைக் கொடுக்க அனுமதிக்கிறது. இந்த நெட்வொர்க் உள்ளமைவு <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடராகும்</translation> <translation id="1708496595873025510">மாறுபாடுகளின் ஸீடை பெறுவதில் கட்டுப்பாட்டை அமைக்கவும்</translation> <translation id="172374442286684480">எல்லா தளங்களும் அகத் தரவை அமைக்க அனுமதிக்கவும்</translation> <translation id="1734716591049455502">தொலைநிலை அணுகல் விருப்பங்களை உள்ளமை</translation> @@ -322,9 +322,9 @@ <translation id="1962273523772270623">WebRTC நிகழ்வுப் பதிவுகளை Google சேவைகளிலிருந்து சேகரிக்க அனுமதிக்கும்</translation> <translation id="1964634611280150550">மறைநிலைப் பயன்முறை முடக்கப்பட்டது</translation> <translation id="1964802606569741174">Android YouTube பயன்பாட்டில் இந்தக் கொள்கை எந்த மாற்றத்தையும் ஏற்படுத்தாது. YouTube இல் பாதுகாப்புப் பயன்முறையைச் செயல்படுத்த வேண்டும் எனில், Android YouTube பயன்பாட்டை நிறுவுவது அனுமதிக்கப்படாது.</translation> -<translation id="1969212217917526199">தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத்திருத்தப் பதிப்புகளின் கொள்கைகளை மேலெழுதும். +<translation id="1969212217917526199">தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத் திருத்தப் பதிப்புகளின் கொள்கைகளை மேலெழுதும். - மதிப்பானது கொள்கை மதிப்புப் பிணைப்புகளில் கொள்கைப் பெயரின் JSON அகராதியாகப் பிரிக்கப்படும் .</translation> + மதிப்பானது கொள்கை மதிப்புப் பிணைப்புகளுக்கான கொள்கைப் பெயரின் JSON அகராதியாகப் பாகுபடுத்தப்படும்.</translation> <translation id="1969808853498848952">அங்கீகாரம் தேவைப்படும் செருகுநிரல்களை எப்போதும் இயக்கும் (தடுக்கப்பட்டுள்ளது)</translation> <translation id="1988371335297483117"><ph name="PRODUCT_OS_NAME" /> இல் தானியங்கு புதுப்பிப்பு தரவுகளை HTTPS க்குப் பதிலாக HTTP வழியாகப் பதிவிறக்கலாம். இது HTTP பதிவிறக்கங்களின் வெளிப்படையான HTTP தற்காலிகச் சேமிப்பை அனுமதிக்கிறது. @@ -332,6 +332,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> இல் கூறுகள் தொடர்பான புதுப்பிப்புகளை இயக்கும்</translation> <translation id="2006530844219044261">ஆற்றல் நிர்வாகம்</translation> <translation id="201557587962247231">சாதனத்தின் நிலை அறிக்கை ஏற்றப்படும் கால இடைவெளி</translation> +<translation id="2017301949684549118">இணைய ஆப்ஸின் URLகள் மௌனமாக நிறுவப்பட வேண்டும்.</translation> <translation id="2018836497795982119">பயனர் கொள்கை தகவலை சாதன மேலாண்மை சேவை வினவும் சூழல்களில், காலத்தை மில்லிவினாடிகளில் குறிப்பிடும். இந்தக் கொள்கையை அமைத்தால், இயல்புமதிப்பான 3 மணிநேரத்தை மீறி இது செயல்படும். இந்தக் கொள்கைக்கான செல்லுபடியாகும் மதிப்புகள்: 1800000 (30 நிமிடங்கள்) முதல் 86400000 (1 நாள்) வரை. இந்த வரம்பில் இல்லாத எந்த மதிப்பும், செல்லுபடியாகும் மதிப்பின்படி மாற்றப்படும். இயங்குதளம் கொள்கை அறிவிப்புகளை ஆதரித்தால், புதுப்பிப்பிற்கான தாமதம் 24 மணிநேரமாக அமைக்கப்படும். ஏனெனில் பாலிசி மாற்றங்கள் ஏற்படும் போதெல்லாம், பாலிசி அறிவிப்புகள் தானாகவே புதுப்பிக்கும் என எதிர்பார்க்கப்படுகிறது. @@ -555,11 +556,11 @@ https://www.chromium.org/administrators/url-blacklist-filter-format இன் படி ஒரு URL வடிவமைக்கப்படும். இருப்பினும், திட்டம், போர்ட் அல்லது பாதையைச் சாராமல் வழங்கப்பட்டுள்ள ஹோஸ்ட்பெயரின் சான்றிதழ்கள் சரியானவையாக இருந்தால், URL இன் ஹோஸ்ட்பெயர் பகுதி மட்டுமே கவனத்தில் கொள்ளப்படும். வைல்டுகார்டு ஹோஸ்ட்கள் ஆதரிக்கப்படாது. இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், சான்றிதழ் வெளிப்படைத்தன்மை கொள்கைக்கு இணங்க சான்றிதழ் வெளிப்படைத்தன்மை மூலம் வெளியிடப்படாத எந்தவொரு சான்றிதழும் நம்பகமற்றதாகக் கருதப்படும்.</translation> -<translation id="2488010520405124654">ஆஃப்லைனில் இருக்கும்போது பிணைய உள்ளமைவுத் தூண்டலை இயக்கு. +<translation id="2488010520405124654">ஆஃப்லைனில் இருக்கும்போது நெட்வொர்க் உள்ளமைவுத் தூண்டலை இயக்கு. - இந்தக் கொள்கை அமைக்கப்படாமலிருந்தால் அல்லது சரி என அமைக்கப்பட்டிருந்தால், மேலும் சாதனத்தின் அகக் கணக்கு உடனடி தன்னியக்க உள்நுழைவுக்காக உள்ளமைக்கப்பட்டிருந்தால் மற்றும் சாதனத்தில் இணையத்திற்கான அணுகல் இல்லையென்றால், <ph name="PRODUCT_OS_NAME" /> ஆனது பிணைய உள்ளமைவுத் தூண்டலைக் காண்பிக்கும். + இந்தக் கொள்கை அமைக்கப்படாமலோ 'சரி' என அமைக்கப்பட்டோ இருந்து, சாதனத்தின் அகக் கணக்கு உடனடி தன்னியக்க உள்நுழைவுக்காக உள்ளமைக்கப்பட்டிருந்து, சாதனத்தில் இணைய அணுகலும் இல்லையென்று இருந்தால், <ph name="PRODUCT_OS_NAME" /> ஆனது நெட்வொர்க் உள்ளமைவுத் தூண்டலைக் காண்பிக்கும். - இந்தக் கொள்கை தவறு என அமைக்கப்பட்டிருந்தால், பிணைய உள்ளமைவு தூண்டுதலுக்குப் பதிலாகப் பிழைச் செய்தி காண்பிக்கப்படும்.</translation> + இந்தக் கொள்கை தவறு என அமைக்கப்பட்டிருந்தால், நெட்வொர்க் உள்ளமைவு தூண்டுதலுக்குப் பதிலாகப் பிழைச் செய்தி காண்பிக்கப்படும்.</translation> <translation id="2498238926436517902">அடுக்கை எப்போதும் தானாக மறை</translation> <translation id="2514328368635166290">இயல்புநிலை தேடல் வழங்குநருக்குப் பிடித்த ஐகான் URL ஐக் குறிக்கிறது. இது விருப்பத்தேர்வாக உள்ளது. இது அமைக்கவில்லையென்றால், தேடல் வழங்குநருக்கு ஐகான் வழங்கப்படாது. 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால், இந்தக் கொள்கை மதிப்பிற்குரியதாக மட்டுமே உள்ளது.</translation> <translation id="2516600974234263142"><ph name="PRODUCT_NAME" /> இல் அச்சிடலை செயலாக்குகிறது மேலும் இந்த அமைப்பைப் பயனர் மாற்றுவதிலிருந்து தடுக்கிறது. @@ -629,6 +630,11 @@ Google இன் தேடல் URL ஆனது பின்வருமாறு குறிப்பிடப்படலாம்: <ph name="GOOGLE_SEARCH_URL" />. 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால், இந்த விருப்பம் கண்டிப்பாக அமைக்கப்பட வேண்டும், மேலும் இந்தச் சூழலில் மட்டும் பயன்படுத்தப்படும்.</translation> +<translation id="2659019163577049044">இந்த அமைப்பு இயக்கப்பட்டால், பயனர்கள் தங்களுடைய ஃபோன்களுக்கும் Chromebookகளுக்கும் இடையே SMS மெசேஜ்களை ஒத்திசைப்பதற்கு தங்கள் சாதனங்களை அமைக்க அனுமதிக்கப்படுவார்கள். இந்தக் கொள்கை அனுமதிக்கப்பட்டால், பயனர்கள் இந்த அம்சத்தை முழுமையாகப் பெறுவதற்கு, அமைவுச் செயல்முறை ஒன்றை முடிக்க வேண்டும். அமைவுச் செயல்முறை முடிந்த பின்னர், பயனர்கள் தங்களுடைய Chromebookகளிலிருந்து SMS மெசேஜ்களை அனுப்பவும் பெறவும் முடியும். + + இந்த அமைப்பு முடக்கப்பட்டால், பயனர்கள் SMS ஒத்திசைவை அமைக்க அனுமதிக்கப்பட மாட்டார்கள். + + இந்தக் கொள்கை அமைக்காமல் விடப்பட்டால், இயல்பில் மேற்கூறிய அம்சத்தைப் பயன்படுத்த நிர்வகிக்கப்படும் பயனர்கள் அனுமதிக்கப்பட மாட்டார்கள், நிர்வகிக்கப்படாத பயனர்கள் அனுமதிக்கப்படுவார்கள்.</translation> <translation id="2660846099862559570">ப்ராக்ஸியை எப்போதும் பயன்படுத்த வேண்டாம்</translation> <translation id="267596348720209223">தேடல் வழங்குநரால் எழுத்துக் குறியாக்கங்கள் ஆதரவளிப்பதைக் குறிப்பிடுகிறது. குறியாக்கங்கள், UTF-8, GB2312 மற்றும் ISO-8859-1 போன்ற பக்கப் பெயர்களால் குறிப்பிடப்படும். அவை, வழங்கப்பட்டுள்ள வரிசையில் முயற்சிக்கின்றன. இந்தக் கொள்கை, விருப்பத்தேர்வுக்குரியது. அது அமைக்கப்படவில்லை எனில், இயல்புநிலையான UTF-8 பயன்படுத்தப்படும். 'DefaultSearchProviderEnabled' செயலாக்கப்பட்டுள்ளதெனில் மட்டுமே, இந்தக் கொள்கை ஆதரிக்கப்படும்.</translation> <translation id="268577405881275241">தரவு சுருக்க ப்ராக்ஸி அம்சத்தை இயக்கு</translation> @@ -672,11 +678,11 @@ கொள்கை "தவறு" என அமைக்கப்பட்டால், பயனர்கள் தங்கள் சொந்த இயல்புப் பிரிண்டர்களைச் சேர்க்கவும் உள்ளமைக்கவும் முடியாது. அத்துடன், இதற்கு முன் உள்ளமைத்த இயல்புப் பிரிண்டர்களைப் பயன்படுத்தி அச்சிடவும் முடியாது. </translation> <translation id="2805707493867224476">பாப்-அப்களைக் காண்பிக்க அனைத்து தளங்களையும் அனுமதி</translation> -<translation id="2808013382476173118">தொலைநிலை கிளையன்ட்கள் இந்தக் கணினிக்கு இணைப்பை நிறுவ முயற்சிக்கும்போது, STUN சேவையகங்களின் பயன்பாட்டை இயக்குகிறது. +<translation id="2808013382476173118">தொலைநிலை கிளையன்ட்கள் இந்தச் சாதனத்துடன் இணைப்பை நிறுவ முயலும்போது, STUN சேவையகங்களின் பயன்பாட்டை இயக்குகிறது. - இந்த அமைப்பு இயக்கப்பட்டால், தொலைநிலை கிளையன்ட்கள் ஃபயர்வாலால் வேறுபடுத்தப்பட்டிருப்பினும், அவை இந்தக் கணினிகளுக்கான இணைப்பைக் கண்டுபிடித்து இணைக்கலாம். + இந்த அமைப்பு இயக்கப்பட்டால், தொலைநிலை கிளையன்ட்கள் ஃபயர்வாலால் பிரிக்கப்பட்டிருப்பினும் இந்தச் சாதனங்களுக்கான இணைப்பைக் கண்டுபிடித்து இணைக்கலாம். - இந்த அமைப்பு முடக்கப்பட்டு, ஃபயர்வாலால் வெளிச்செல்லும் UDP இணைப்புகள் வடிக்கப்பட்டுள்ளதெனில், இந்தக் கணினி, அக நெட்வொர்க்கில் கிளையன்டின் கணினியிலிருந்து மட்டும் இனைப்புகளை அனுமதிக்கும். + இந்த அமைப்பு முடக்கப்பட்டு, ஃபயர்வாலால் வெளிச்செல்லும் UDP இணைப்புகள் வடிக்கப்பட்டிருந்தால், இந்தச் சாதனம் அக நெட்வொர்க்கில் உள்ள கிளையன்ட் சாதனங்களிலிருந்து மட்டுமே இணைப்புகளை அனுமதிக்கும். இந்தக் கொள்கையை அமைக்காமல் விட்டால், அமைப்பு இயக்கப்படும்.</translation> <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> கிளையன்ட்டுகளுக்கான Windows பதிவக இருப்பிடம்:</translation> @@ -695,12 +701,11 @@ இந்த அமைப்பை முடக்கினால் அல்லது மதிப்பை அமைக்காமல் இருந்தால், அச்சு மாதிரிக்காட்சியானது இயல்பான இலக்கிடத் தேர்வாக, மிகச் சமீபத்தில் பயன்படுத்திய பிரிண்டரைப் பயன்படுத்தும். இந்த அமைப்பை இயக்கினால், அச்சு மாதிரிக்காட்சியானது இயல்பு இலக்கிடத் தேர்வாக, OS அமைப்பின் இயல்புப் பிரிண்டரைப் பயன்படுத்தும்.</translation> -<translation id="2867699958489427143">OS பதிப்பானது இலக்கை விடப் புதியதாக இருந்தால், இலக்குப் பதிப்புக்கு மீண்டமைந்து, அதிலேயே இருக்கவும். செயலாக்கத்தின்போது, முழுமையான பவர்வாஷ் செய்யவும்.</translation> <translation id="2872961005593481000">நிறுத்து</translation> <translation id="2874209944580848064">Android பயன்பாடுகளை ஆதரிக்கும் <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கான குறிப்பு:</translation> <translation id="2877225735001246144">Kerberos அங்கீகரிப்புடன் பரிமாற்றம் செய்யப்படும்போது, CNAME பார்வையிடலை முடக்கவும்</translation> <translation id="2893546967669465276">நிர்வகிப்புச் சேவையகத்திற்கு முறைமைப் பதிவுகளை அனுப்பும்</translation> -<translation id="2899002520262095963">இந்தக் கொள்கை மூலம் அமைத்த நெட்வொர்க் உள்ளமைவுகளையும் CA சான்றிதழ்களையும் Android பயன்பாடுகளால் பயன்படுத்த முடியும், ஆனால் சில உள்ளமைவு விருப்பங்களை அணுக முடியாது.</translation> +<translation id="2899002520262095963">இந்தக் கொள்கை மூலம் அமைத்த நெட்வொர்க் உள்ளமைவுகளையும் CA சான்றிதழ்களையும் Android ஆப்ஸால் பயன்படுத்த முடியும். ஆனால் சில உள்ளமைவு விருப்பங்களை அணுக முடியாது.</translation> <translation id="290002216614278247">கிளையண்ட் வழங்கியுள்ள நேரம் அல்லது அந்த நாளுக்கான பயன்பாட்டு வரம்பின் அடிப்படையில் பயனரின் அமர்வைப் பூட்ட உங்களை அனுமதிக்கும். பயனரின் அமர்வைப் பூட்ட வேண்டிய தினசரிக் காலவரம்பை |time_window_limit| குறிப்பிடுகிறது. வாரத்தின் ஒவ்வொரு நாளுக்கும் ஒரே ஒரு விதியை மட்டும் அமைப்பதை ஆதரிக்கிறோம் என்பதால், |entries| வரிசையானது அளவில் 0-7 வரை மாறுபடக்கூடும். |starts_at| மற்றும் |ends_at| ஆகியவை முறையே காலவரம்பின் தொடக்கத்தையும் முடிவையும் குறிக்கின்றன; |starts_at|ஐ விட |ends_at| குறைவாக இருந்தால், |time_limit_window| அடுத்த நாள் முடிவடையும் என்று பொருள். |last_updated_millis| என்பது UTC நேரமுத்திரைக்காக இந்த உள்ளீடு கடைசியாகப் புதுப்பிக்கப்பட்ட நேரத்தைக் குறிக்கிறது, நேரமுத்திரை ஒரு முழு எண்ணாக இருக்க முடியாது என்பதால் அது வார்த்தை வடிவில் அனுப்பப்படும். @@ -932,7 +937,6 @@ <translation id="3711895659073496551">இடைநிறுத்தப்பட்டது</translation> <translation id="3715569262675717862">கிளையன்ட் சான்றிதழ்களின் அடிப்படையில் அங்கீகரிப்பு</translation> <translation id="3736879847913515635">பயனர் நிர்வாகியில் பயனரைச் சேர்ப்பதை இயக்கு</translation> -<translation id="3737544779868348650">சாதன நெட்வொர்க் ஹோஸ்ட்பெயர்</translation> <translation id="3746590506846867985"> இந்தக் கொள்கை உள்நுழைவுத் திரைக்குப் பொருந்தும். பயனர் அமர்வுக்குப் பொருந்தும் <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> கொள்கையையும் பார்க்கவும். இரண்டு கொள்கைகளையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரண்டு மதிப்புகளும் பொருந்தவில்லை எனில், பயனர் கொள்கையால் குறிப்பிடப்படும் மதிப்பு பயன்படுத்தப்படும். அப்போது பயனர் அமர்வில் உள்நுழையும் போது தாமதம் ஏற்படக்கூடும். கொள்கை இயக்கப்பட்டிருந்தால், காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியலில் குறிப்பிடப்பட்டுள்ள ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையை இயக்கும். இது துணை டொமைன்களின்படியும் தளங்களைத் தனிப்படுத்தும். எ.கா. https://example.com/ எனக் குறிப்பிட்டால், https://example.com/ தளத்தின் ஒரு பகுதியாக https://foo.example.com/ எனும் தளமும் தனிப்படுத்தப்படும். @@ -1045,6 +1049,7 @@ ஒவ்வொரு பட்டியல் உள்ளீடானது 'extension-id' புலத்தில் நீட்டிப்பு ஐடியையும், 'update-url' புலத்தில் அதன் புதுப்பிப்பு URL ஐயும் இணைத்துள்ள அகராதியைக் கொண்டுள்ளது.</translation> <translation id="3874773863217952418">தேடுவதற்குத் தட்டு என்பதை இயக்கவும்</translation> <translation id="3877517141460819966">ஒருங்கிணைக்கப்பட்ட இரண்டாம் படி அங்கீகாரப் பயன்முறை</translation> +<translation id="3879208481373875102">கட்டாயப்படுத்தி நிறுவப்பட்ட இணைய ஆப்ஸின் பட்டியலை உள்ளமைக்கும்</translation> <translation id="388237772682176890">SPDY/3.1 ஆதரவை அகற்றியுள்ளதால், இந்தக் கொள்கையானது M53 இல் தடுக்கப்பட்டுள்ளது, M54 இல் அகற்றப்பட்டுள்ளது. <ph name="PRODUCT_NAME" /> இல் SPDY நெறிமுறையைப் பயன்படுத்துவதைத் தடுக்கும். @@ -1073,7 +1078,7 @@ சேவையகத்தை அனுமதிக்கவும், நெட்வொர்க் பாக்கெட்டுகளை மேலாண்மை சேவையகத்திற்கு அனுப்பும். இந்தக் கொள்கையை "சரி" என அமைத்தால், கண்காணிக்கப்படும் நெட்வொர்க் பாக்கெட்டுகள் (<ph name="HEARTBEATS_TERM" /> என அழைக்கப்படுபவை) அனுப்பப்படும். - இந்தக் கொள்கையை "தவறு" என அமைத்தால் அல்லது அமைக்கவில்லை எனில், பாக்கெட்டுகள் எவையும் அனுப்பப்படாது.</translation> + இந்தக் கொள்கையை "தவறு" என அமைத்தாலோ அமைக்காமல் விட்டாலோ, பாக்கெட்டுகள் எவையும் அனுப்பப்படாது.</translation> <translation id="3950239119790560549">நேரக் கட்டுப்பாடுகளைப் புதுப்பிக்கும்</translation> <translation id="3958586912393694012">Smart Lockஐப் பயன்படுத்துவதை அனுமதிக்கும்</translation> <translation id="3963602271515417124">சரி என அமைத்தால், சாதனத்திற்கான தொலைநிலைச் சான்றளிப்பு அனுமதிக்கப்படுவதோடு, தானாகவே சான்றிதழ் உருவாக்கப்பட்டு சாதன நிர்வாகச் சேவையகத்தில் பதிவேற்றப்படும். @@ -1172,7 +1177,7 @@ கொள்கையின் மதிப்பானது வினாடிகளில் குறிப்பிடப்படும். மதிப்புகள் குறைந்தது 3600 (ஒரு மணிநேரம்) க்கு அமைக்கப்படும்.</translation> <translation id="4203879074082863035">ஏற்புப் பட்டியலில் உள்ள பிரிண்டர்கள் மட்டுமே பயனர்களுக்குக் காட்டப்படும்</translation> -<translation id="420512303455129789">ஹோஸ்டுக்கான அணுகலை அனுமதிக்க வேண்டுமா (சரி) அல்லது தடுக்க வேண்டுமா (தவறு) என்பதைக் குறிப்பிடும் பூலியன் கொடிக்கு, URLகளை அகராதி பொருத்துகிறது. +<translation id="420512303455129789">ஹோஸ்ட்டுக்கான அணுகலை அனுமதிக்க வேண்டுமா (சரி) அல்லது தடுக்க வேண்டுமா (தவறு) என்பதைக் குறிப்பிடும் பூலியன் கொடிக்கு, URLகளைப் பொருத்தும் அகராதி. இந்தக் கொள்கையானது <ph name="PRODUCT_NAME" /> இன் அகப் பயன்பாட்டுக்கானது.</translation> <translation id="4224610387358583899">திரையைப் பூட்டுவதன் தாமதங்கள்</translation> @@ -1236,7 +1241,7 @@ <translation id="4360826270668210664">இந்தக் கொள்கை அமைக்கப்பட்டால், இணைப்பை வழங்குவதற்காக, இந்த URLலில் இருந்து அங்கீகார டோக்கனைப் பெறுமாறு அங்கீகரிக்கும் கிளையண்ட்களை தொலைநிலை அணுகல் ஹோஸ்ட் கோரும். இதை RemoteAccessHostTokenValidationUrl கொள்கையுடன் சேர்த்துப் பயன்படுத்த வேண்டும். இந்த அம்சம் தற்போது சேவையகத் தரப்பில் முடக்கப்பட்டுள்ளது.</translation> -<translation id="436581050240847513">சாதனத்தின் பிணைய இடைமுகங்களை அறிக்கையிடு</translation> +<translation id="436581050240847513">சாதனத்தின் நெட்வொர்க் இடைமுகங்களை அறிக்கையிடு</translation> <translation id="4372704773119750918">பல சுயவிவரத்தின் (முதன்மை அல்லது இரண்டாம் நிலை) பங்குதாரராக நிறுவனப் பயனரை அனுமதிக்காதே</translation> <translation id="4377599627073874279">அனைத்துப் படங்களையும் காண்பிக்க, அனைத்து தளங்களையும் அனுமதி</translation> <translation id="437791893267799639">கொள்கை அமைக்கப்படவில்லை, தரவு நகர்த்துதலையும் ARCஐயும் அனுமதிக்காதே</translation> @@ -1305,6 +1310,10 @@ இந்தக் கொள்கையின் முழு விளக்கம் தொடர்பான சாத்தியமான அமைப்புகள் மற்றும் கட்டமைப்பிற்கு https://www.chromium.org/administrators/policy-list-3/extension-settings-fullஐப் பார்வையிடவும் </translation> <translation id="4554651132977135445">பயனர் கொள்கை லூப்பேக் செயலாக்கப் பயன்முறை</translation> +<translation id="4554841826517980623">இந்தக் கொள்கை, <ph name="PRODUCT_NAME" />க்கான ‘நெட்வொர்க் கோப்புப் பகிர்வுகள்’ அம்சமானது நெட்வொர்க்கில் பகிரப்படுபவற்றைக் கண்டறிவதற்கு, <ph name="NETBIOS_PROTOCOL" /> நெறிமுறையைப் பயன்படுத்துவதா என்பதைக் கட்டுப்படுத்தும். + இந்தக் கொள்கை ‘சரி’ என அமைக்கப்பட்டால், நெட்வொர்க்கில் பகிரப்படுபவற்றைக் கண்டறிவதற்காக, ‘பகிர்வுக் கண்டறிதல்’ அம்சம் <ph name="NETBIOS_PROTOCOL" /> நெறிமுறையைப் பயன்படுத்தும். + இந்தக் கொள்கை ‘தவறு’ என அமைக்கப்பட்டால், நெட்வொர்க்கில் பகிரப்படுபவற்றைக் கண்டறிவதற்காக, ‘பகிர்வுக் கண்டறிதல்’ அம்சம் <ph name="NETBIOS_PROTOCOL" /> நெறிமுறையைப் பயன்படுத்தாது. + இந்தக் கொள்கை அமைக்காமல் விடப்பட்டால், இயல்பில் மேற்கூறிய அம்சம் நிறுவனத்தால் நிர்வகிக்கப்படும் பயனர்களுக்கு முடக்கப்படும், நிர்வகிக்கப்படாத பயனர்களுக்கு இயக்கப்படும்.</translation> <translation id="4555850956567117258">பயனருக்கான தொலைநிலைச் சான்றொப்பத்தை இயக்கு</translation> <translation id="4557134566541205630">இயல்புநிலைத் தேடல் வழங்குநர் புதிய தாவல் பக்க URL</translation> <translation id="4567137030726189378">டெவெலப்பர் கருவிகளின் பயன்பாட்டை அனுமதி</translation> @@ -1479,7 +1488,7 @@ இந்தக் கொள்கையை அமைக்கவில்லையெனில், இயல்புநிலை கட்டளை வரி பயன்படுத்தப்படும்.</translation> <translation id="5159469559091666409">கண்காணிக்கும் நெட்வொர்க் பாக்கெட்டுகள் அனுப்பப்படும் கால இடைவெளி. இது மில்லிவினாடிகளில் குறிப்பிடப்படும். - இந்தக் கொள்கையை அமைக்கவில்லை எனில், இயல்புநிலைக் கால இடைவெளி 3 நிமிடங்களாகும். குறைந்தபட்சக் + இந்தக் கொள்கையை அமைக்கவில்லை எனில், இயல்புநிலைக் கால இடைவெளி 3 நிமிடங்களாக இருக்கும். குறைந்தபட்சக் கால இடைவெளி 30 வினாடிகளும், அதிகபட்சக் கால இடைவெளி 24 மணிநேரமும் ஆகும் - இந்த வரம்பில் இல்லாத மதிப்புகள், இந்த வரம்பிற்கு மாற்றியமைக்கப்படும்.</translation> <translation id="5163002264923337812">பழைய இணையம் சார்ந்த உள்நுழைவை இயக்கும்</translation> @@ -1541,7 +1550,7 @@ கொள்கையின் மதிப்பானது மில்லிவினாடிகளில் குறிப்பிடப்படும். மதிப்புகளானது செயலற்றநிலையின் தாமதத்திற்கு குறைவாகவோ அல்லது சமமாகவோ பிணைக்கப்பட்டிருக்கும்.</translation> <translation id="5307432759655324440">மறைநிலைப் பயன்முறை கிடைக்கும்நிலை</translation> -<translation id="5318185076587284965">தொலைநிலை அணுகல் ஹோஸ்டினால் தொடர் சேவையகங்களின் பயன்பாட்டை இயக்கவும்</translation> +<translation id="5318185076587284965">தொலைநிலை அணுகல் ஹோஸ்ட் தொடர் சேவையகங்களைப் பயன்படுத்துவதை இயக்கவும்</translation> <translation id="5323128137188992869"><ph name="PRODUCT_NAME" />ஐப் பயன்படுத்தி, சாதனத்திற்கு உள்ளடக்கத்தை அனுப்ப அனுமதிக்கும். இந்தக் கொள்கையைத் தவறு என அமைத்தால், பயனர்களால் அவர்களது சாதனத்திற்கு உள்ளடக்கத்தை அனுப்ப முடியாது. இந்தக் கொள்கையைச் சரி என அமைத்தால், பயனர்களால் உள்ளடக்கத்தை அனுப்ப முடியும். இந்தக் கொள்கையை அமைக்கவில்லை எனில், பதிவுசெய்த Chrome OS சாதனங்களுக்கு உள்ளடக்கத்தை அனுப்ப, பயனர்கள் அனுமதிக்கப்படமாட்டார்கள். ஆனால், பதிவுசெய்யாத சாதனங்களுக்கு அனுப்ப அனுமதிக்கப்படுவார்கள்.</translation> @@ -1565,11 +1574,11 @@ 'சரி' என அமைக்கப்பட்டால், நிலைத் தகவல் அறிக்கையிடப்படும். Android பயன்பாடுகள் இயக்கப்பட்டிருந்தால் மட்டுமே, இந்தக் கொள்கை பயன்படுத்தப்படும்.</translation> -<translation id="5395271912574071439">இணைப்பானது செயலில் இருக்கும்போது தொலைநிலை அணுகல் ஹோஸ்ட்டுகளின் வழங்குதலைச் செயல்படுத்தும். +<translation id="5395271912574071439">ஒரு இணைப்பு செயலில் இருக்கும்போது தொலைநிலை அணுகல் ஹோஸ்ட்களுக்குத் திரையிடும். இந்த அமைப்பு இயக்கப்பட்டால், தொலைநிலை இணைப்பானது செயலில் இருக்கும்போது ஹோஸ்ட்களின் நிஜ உள்ளீட்டு மற்றும் வெளியீட்டு சாதனங்கள் முடக்கப்படும். - இந்த அமைப்பு முடக்கப்பட்டால் அல்லது அமைக்கப்படாமல் இருந்தால், அக மற்றும் தொலைநிலை பயனர்கள் இதைப் பகிரும்போது ஹோஸ்ட்டுடன் தொடர்புகொள்ள முடியும்.</translation> + இந்த அமைப்பு முடக்கப்பட்டாலோ அமைக்கப்படாமல் இருந்தாலோ, ஹோஸ்ட் பகிரப்படும் போது அக மற்றும் தொலைநிலைப் பயனர்கள் அதனுடன் தொடர்புகொள்ள முடியும்.</translation> <translation id="5405289061476885481"><ph name="PRODUCT_OS_NAME" /> உள்நுழைவுத் திரையில் அனுமதிக்கப்படும் விசைப்பலகைத் தளவமைப்புகளை உள்ளமைக்கும். இந்தக் கொள்கை, உள்ளீட்டு முறை அடையாளங்காட்டிகளின் பட்டியலாக அமைக்கப்பட்டால், வழங்கிய உள்ளீட்டுப் பயன்முறைகள் உள்நுழைவுத் திரையில் கிடைக்கும். முதலில் வழங்கிய உள்ளீட்டு முறையானது முன்கூட்டியே தேர்ந்தெடுக்கப்பட்டிருக்கும். உள்நுழைவுத் திரையில் பயனர் பாட் ஃபோகஸ் செய்துக் கொண்டிருக்கும் போது, இந்தக் கொள்கை வழங்கும் உள்ளீட்டு முறைகளுடன் சேர்த்து பயனர் கடைசியாகப் பயன்படுத்திய உள்ளீட்டு முறையும் கிடைக்கும். இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், உள்நுழைவுத் திரை காட்டப்படும் மொழியிலிருந்து உள்நுழைவுத் திரையில் உள்ளீட்டு முறைகள் பெறப்படும். தவறான உள்ளீட்டு முறை அடையாளங்காட்டிகள் உள்ள மதிப்புகள் புறக்கணிக்கப்படும்.</translation> @@ -1578,7 +1587,8 @@ <translation id="5442026853063570579">Android டெவெலப்பர் விருப்பங்களுக்கான அணுகலையும் இந்தக் கொள்கை கட்டுப்படுத்தும். இந்தக் கொள்கையை 'DeveloperToolsDisallowed' (மதிப்பு 2) என அமைத்தால், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியாது. இந்தக் கொள்கையை வேறொரு மதிப்பில் அமைத்தாலோ அல்லது அமைக்காமல் விட்டாலோ, Android அமைப்புகள் பயன்பாட்டில் இருக்கும் பதிப்பு எண்ணை ஏழு முறை தட்டுவதன் மூலம், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியும்.</translation> <translation id="5447306928176905178">பக்கத்திற்கு (நீக்கப்பட்டது) நினைவகத் தகவலை அறிக்கையிடுவதை (JS ஹீப் அளவு) இயக்கு</translation> <translation id="5457065417344056871">உலாவியில் விருந்தினர் பயன்முறையை இயக்கும்</translation> -<translation id="5457924070961220141"><ph name="PRODUCT_FRAME_NAME" /> நிறுவியிருக்கும்போது, இயல்புநிலை HTML தொகுத்தலை உள்ளமைக்க உங்களை அனுமதிக்கிறது. தொகுத்தலுக்கு ஹோஸ்ட் உலாவியை அனுமதிக்க, இந்தக் கொள்கை அமைக்காமல் விலகியிருக்கும்போது, இயல்புநிலை அமைப்பு பயன்படுத்தப்படுகிறது. ஆனால், நீங்கள் இதை மேலெழுதலாம், இயல்புநிலை மூலம் <ph name="PRODUCT_FRAME_NAME" /> தொகுப்பு HTML பக்கங்களைப் பெறலாம்.</translation> +<translation id="5457924070961220141"><ph name="PRODUCT_FRAME_NAME" /> நிறுவியிருக்கும்போது, இயல்புநிலை HTML ரென்டரரை உள்ளமைக்க உங்களை அனுமதிக்கிறது. + இந்தக் கொள்கை அமைக்கப்படாமல் இருக்கும்போது இயல்புநிலையாக ஹோஸ்ட் உலாவியே ரென்டரிங் செய்ய அனுமதிக்கப்படுகிறது. ஆனால், நீங்கள் விரும்பினால் இதை மேலெழுதி இயல்புநிலையாக <ph name="PRODUCT_FRAME_NAME" /> மூலம் HTML பக்கங்களை ரென்டர் செய்ய வைக்கலாம்.</translation> <translation id="5464816904705580310">நிர்வகிக்கப்படும் பயனர்களுக்கான அமைப்புகளை உள்ளமை.</translation> <translation id="546726650689747237">AC சக்தியில் இயங்கும்போது திரை மங்கல் தாமதமாகும்</translation> <translation id="5469825884154817306">இந்த தளங்களில் படங்களை தடு</translation> @@ -1700,23 +1710,24 @@ இந்தக் கொள்கையை நீங்கள் அமைத்தால், பேச்சுவடிவ கருத்தை இயக்குவது அல்லது முடக்குவதன் மூலம் பயனர்கள் தற்காலிகமாக இதை மேலெழுதலாம். எனினும், பயனரின் விருப்பம் நிலையானது இல்லை என்பதால், உள்நுழைவுத் திரை புதிதாக காண்பிக்கப்படும்போதும் அல்லது உள்நுழைவுத் திரையில் பயனர் ஒரு நிமிடம் செயலற்ற நிலையில் இருக்கும்போதும் இயல்புநிலை மீட்டமைக்கப்படும். இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், உள்நுழைவுத் திரை முதலில் காண்பிக்கப்படும்போது பேச்சுவடிவ கருத்து முடக்கப்படும். உள்நுழைவுத் திரையில் பயனர்கள் எந்த நேரத்திலும் பேச்சுவடிவ கருத்தையும் அதன் நிலையையும் இயக்கலாம் அல்லது முடக்கலாம், இது பயனர்களுக்கு இடையில் நிலையானது.</translation> -<translation id="5868414965372171132">பயனர்-நிலை பிணைய உள்ளமைவு</translation> +<translation id="5868414965372171132">பயனர்-நிலை நெட்வொர்க் உள்ளமைவு</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> வழியாகச் செய்யப்படும் நெட்வொர்க் கோப்புப் பகிர்வுக் கண்டறிதலைக் கட்டுப்படுத்தும்</translation> <translation id="5883015257301027298">இயல்புநிலை குக்கீகள் அமைப்பு</translation> -<translation id="5887414688706570295">ஹோஸ்ட்களின் தொலைநிலை அணுகலுக்குப் பயன்படுத்தப்படும் TalkGadget முன்னொட்டை உள்ளமைக்கும், மேலும் பயனர்கள் அதை மாற்றுவதிலிருந்து தடுக்கும். +<translation id="5887414688706570295">தொலைநிலை அணுகல் ஹோஸ்ட்கள் பயன்படுத்தும் TalkGadget முன்னொட்டை உள்ளமைத்து, பயனர்கள் அதை மாற்ற இயலாதவாறு அமைக்கும். - குறிப்பிட்டிருந்தால், TalkGadget க்கான முழுமையான களப் பெயரை உருவாக்க இந்த முன்னொட்டு TalkGadget இன் அடிப்படையில் சேர்க்கப்படும். '.talkgadget.google.com' என்பது அடிப்படை TalkGadget களப் பெயராகும். + குறிப்பிட்டிருந்தால், TalkGadgetடுக்கான முழுமையான டொமைன் பெயரை உருவாக்க இந்த முன்னொட்டு TalkGadget என்ற பெயரின் முன் சேர்க்கப்படும். '.talkgadget.google.com' என்பது அடிப்படை TalkGadget டொமைன் பெயராகும். - இந்த அமைப்பு இயக்கப்பட்டால், TalkGadget ஐ ஹோஸ்ட் அணுகும்போது இயல்புநிலை களப் பெயருக்குப் பதிலாக தனிப்பயன் களப் பெயரைப் பயன்படுத்தும். + இந்த அமைப்பு இயக்கப்பட்டால், TalkGadgetடை ஹோஸ்ட் அணுகும்போது இயல்புநிலை டொமைன் பெயருக்குப் பதிலாகத் தனிப்பயன் டொமைன் பெயரைப் பயன்படுத்தும். - இந்த அமைப்பு முடக்கப்பட்டால் அல்லது அமைக்கப்படாமல் இருந்தால், எல்லா ஹோஸ்ட்டுகளுக்கும் இயல்புநிலை TalkGadget களப் பெயர் ('chromoting-host.talkgadget.google.com') பயன்படுத்தப்படும். + இந்த அமைப்பு முடக்கப்பட்டாலோ அமைக்கப்படாமல் இருந்தாலோ, எல்லா ஹோஸ்ட்களுக்கும் இயல்புநிலை TalkGadget டொமைன் பெயர் ('chromoting-host.talkgadget.google.com') பயன்படுத்தப்படும். - இந்தக் கொள்கை அமைப்பால் தொலைநிலை அணுகலுடைய கிளையன்ட்கள் பாதிக்கப்படமாட்டாது. TalkGadget ஐ அணுக அவை எப்போதும் 'chromoting-client.talkgadget.google.com' ஐப் பயன்படுத்தும்.</translation> + இந்தக் கொள்கை அமைப்பால் தொலைநிலை அணுகல் கிளையன்ட்கள் பாதிக்கப்படாது. TalkGadgetடை அணுக அவை எப்போதும் 'chromoting-client.talkgadget.google.com' என்பதையே பயன்படுத்தும்.</translation> <translation id="5893553533827140852">இந்த அமைப்பு இயக்கப்பட்டிருந்தால், தொலைநிலை ஹோஸ்ட் இணைப்பில் gnubby அங்கீகரிப்புக் கோரிக்கைகள் ப்ராக்ஸி செய்யப்படும். - இந்த அமைப்பு முடக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படாமல் இருந்தால், gnubby அங்கீகரிப்புக் கோரிக்கைகள் ப்ராக்ஸி செய்யப்படாது.</translation> + இந்த அமைப்பு முடக்கப்பட்டிருந்தாலோ உள்ளமைக்கப்படாமல் இருந்தாலோ, gnubby அங்கீகரிப்புக் கோரிக்கைகள் ப்ராக்ஸி செய்யப்படாது.</translation> <translation id="5898486742390981550">பல பயனர்கள் உள்நுழைந்திருக்கும் போது, முதன்மைப் பயனர் மட்டுமே Android பயன்பாடுகளைப் பயன்படுத்த முடியும்.</translation> -<translation id="5906199912611534122">நெட்வொர்க் நெருக்குதலை இயக்க அல்லது முடக்க அனுமதிக்கும். - இது எல்லாப் பயனர்களுக்கும், சாதனத்தில் இருக்கும் எல்லா இடைமுகங்களுக்கும் பொருந்தும். அமைத்ததும், கொள்கையை முடக்கு +<translation id="5906199912611534122">நெட்வொர்க் நெருக்குதலை இயக்கவும் முடக்கவும் அனுமதிக்கும். + இது எல்லாப் பயனர்களுக்கும், சாதனத்தில் இருக்கும் எல்லா இடைமுகங்களுக்கும் பொருந்தும். ஒரு முறை அமைத்ததும், 'கொள்கையை முடக்கு' என அமைக்கும் வரை, நெருக்குதல் தொடரும். ‘தவறு’ என அமைத்தால், நெருக்குதல் இருக்காது. @@ -2089,7 +2100,7 @@ <ph name="MS_AD_NAME" /> டொமைனில் சேர்க்கப்படாத Windows நேர்வுகளில் இந்தக் கொள்கை இருக்காது. </translation> <translation id="6922884955650325312"><ph name="FLASH_PLUGIN_NAME" /> செருகுநிரலைத் தடு</translation> -<translation id="6923366716660828830">இயல்புநிலை தேடல் வழங்குநரின் பெயரைக் குறிப்பிடுகிறது. இதை அமைக்காமல் அல்லது வெறுமையாக விட்டால், தேடல் URL ஆல் குறிப்பிடப்பட்ட ஹோஸ்ட் பெயர் பயன்படுத்தப்படும். 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டால், இந்தக் கொள்கை பரிசீலனைக்கு மட்டுமே இருக்கும்.</translation> +<translation id="6923366716660828830">இயல்புநிலை தேடல் வழங்குநரின் பெயரைக் குறிப்பிடுகிறது. இதை அமைக்காமலோ வெறுமையாகவோ விட்டால், தேடல் URLலால் குறிப்பிடப்பட்ட ஹோஸ்ட் பெயர் பயன்படுத்தப்படும். 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டால் மட்டுமே இந்தக் கொள்கை பரிசீலிக்கப்படும்.</translation> <translation id="6931242315485576290">Google உடன் தரவை ஒத்திசைப்பதை முடக்கு</translation> <translation id="6936894225179401731">ப்ராக்ஸி சேவையகத்துடன் ஒரே நேரத்தில் இணைக்கப்படும் இணைப்புகளின் அதிகபட்ச எண்ணிக்கையைக் குறிக்கிறது. @@ -2133,6 +2144,17 @@ <translation id="7049373494483449255">அச்சிடுவதற்கு <ph name="CLOUD_PRINT_NAME" /> இல் ஆவணங்களைச் சமர்ப்பிக்க <ph name="PRODUCT_NAME" /> ஐ இயக்குகிறது. <ph name="PRODUCT_NAME" /> இல் <ph name="CLOUD_PRINT_NAME" /> ஐ ஆதரித்தால் மட்டுமே இது நிகழும். வலைத்தளங்களில் அச்சுப் பணிகளை சமர்ப்பிப்பதிலிருந்து பயனர்களை அது தடுக்காது. இந்த அமைப்பு இயக்கப்பட்டால் அல்லது உள்ளமைக்கப்படாவிட்டால், <ph name="PRODUCT_NAME" /> அச்சு உரையாடலிலிருந்து <ph name="CLOUD_PRINT_NAME" /> இல் பயனர்கள் அச்சிடலாம். இந்த அமைப்பு முடக்கப்பட்டால், <ph name="PRODUCT_NAME" /> அச்சு உரையாடலிலிருந்து <ph name="CLOUD_PRINT_NAME" /> இல் பயனர்கள் அச்சிட முடியாது.</translation> <translation id="7053678646221257043">தற்போதைய இயல்புநிலை உலாவி, இயக்கத்தில் இருந்தால், புக்மார்க்குகளை இறக்குமதி செய்ய, இந்தக் கொள்கை தூண்டுகிறது. இயக்கப்பட்டால், இந்தக் கொள்கையானது இறக்குமதி உரையாடலை மேலும் பாதிக்கும். முடக்கப்பட்டால், புக்மார்க்குகள் இறக்குமதி செய்யப்படாது. இது அமைக்கப்படவில்லை எனில், இறக்குமதி செய்யலாமா என பயனரிடம் கேட்கப்படும் அல்லது தானாக இறக்குமதியாகும்.</translation> <translation id="7063895219334505671">இந்த தளங்களில் பாப்அப்களை அனுமதி</translation> +<translation id="706568410943497889"> + இந்தக் கொள்கையைச் ‘சரி’ என அமைத்தால், Google சேவைகளிலிருந்து (எ.கா Google Meet) WebRTC நிகழ்வுப் பதிவுகளைச் சேகரித்து, அவற்றை Googleளுக்குப் பதிவேற்ற <ph name="PRODUCT_NAME" />க்கு அனுமதியளிக்கப்படும். + + இந்தக் கொள்கையைத் ‘தவறு’ என அமைத்தாலோ அமைக்காமலேயே விட்டாலோ, அத்தகைய பதிவுகளைச் சேகரிக்கவோ பதிவேற்றவோ <ph name="PRODUCT_NAME" />க்கு அனுமதி இருக்காது. + + இந்தப் பதிவுகளில் RTP பாக்கெட்டுகள் அனுப்பப்பட்ட மற்றும் பெறப்பட்ட நேரம், அவற்றின் அளவு, நெட்வொர்க்கிலுள்ள நெரிசலைப் பற்றிய கருத்து, ஆடியோ மற்றும் வீடியோ ஃப்ரேம்களின் நேரத்தையும் தரத்தையும் பற்றிய மீத்தரவு போன்ற, Chromeமில் ஆடியோ அல்லது வீடியோ அழைப்புகள் குறித்த சிக்கல்களைப் பிழைத்திருத்துவதற்கு உதவக்கூடிய பகுப்பாய்வுத் தகவல்கள் இருக்கும். + + இந்தத் தரவுச் சேகரிப்பை Google Hangouts அல்லது Google Meet போன்ற Googleளின் இணையச் சேவைகள் மட்டுமே செயல்படுத்த முடியும். + + அமர்வு ஐடி மூலமாக, Google சேவையால் சேகரிக்கப்பட்ட பிற பதிவுகளுடன் Google இந்தப் பதிவுகளைத் தொடர்புபடுத்தலாம்; இது பிழைத்திருத்தத்தை எளிதாக்குவதற்காகச் செய்யப்படுகிறது. + </translation> <translation id="706669471845501145">டெஸ்க்டாப் அறிவிக்கைகளை காண்பிக்க தளங்களை அனுமதி</translation> <translation id="7072208053150563108">சாதனக் கடவுச்சொல் மாற்றத்தின் கால இடைவேளை</translation> <translation id="7074513465313721551">பாதுகாப்பான உலாவல் நம்பும் டொமைன்களின் பட்டியலை உள்ளமைக்கவும். அப்படி என்றால்: @@ -2265,6 +2287,9 @@ <translation id="7336878834592315572">அமர்வு காலத்திற்கான குக்கீகளை வைத்திரு</translation> <translation id="7340034977315324840">சாதனத்தின் செயல்பாட்டு நேரங்களை அறிக்கையிடவும்</translation> <translation id="7343497214039883642">சாதனங்களுக்கான நிறுவனப் பிரிண்டரின் உள்ளமைவுக் கோப்பு</translation> +<translation id="7349338075015720646">இது பயனரின் பங்களிப்பு இல்லாமல் தானாக நிறுவப்படும் இணையதளங்களின் பட்டியலைக் குறிப்பிடுகிறது, இவற்றைப் பயனரால் நிறுவல் நீக்கவோ முடக்கவோ முடியாது. + + கொள்கையின் ஒவ்வொரு பட்டியல் உருப்படியும் "url" மற்றும் "launch_container" ஆகிய இரண்டு உறுப்புகளைக் கொண்ட ஒரு பொருளைக் கொண்டிருக்கும். "url" என்பது நிறுவப்பட வேண்டிய இணைய ஆப்ஸின் URLலைக் கொண்டிருக்கும், "launch_container" என்பது, இணைய ஆப்ஸ் நிறுவப்பட்டவுடன் அது "சாளரம்" அல்லது "தாவல்", இவற்றில் எதில் திறக்கப்பட வேண்டும் என்பதைக் குறிக்கும். "launch_container" என்பதைக் குறிப்பிடாமல் விட்டால், அது ‘நவீன இணைய ஆப்ஸாக’ இருந்தால் Chrome அதை ஒரு சாளரத்தில் திறக்கும், இல்லையெனில் ஒரு தாவலில் திறக்கும்.</translation> <translation id="7367028210010532881">தீங்குவிளைவிப்பதற்குச் சாத்தியமுள்ளதாகப் புகாரளிக்கப்பட்ட தளங்களுக்குப் பயனர்கள் செல்லும் போது, பாதுகாப்பான உலாவல் சேவையானது எச்சரிக்கைப் பக்கத்தைக் காட்டும். இந்த அமைப்பை இயக்கினால், பயனர்கள் எச்சரிக்கைப் பக்கத்திலிருந்து தீங்கு விளைவிக்கக்கூடிய தளத்திற்குச் செல்வதற்கான 'எப்படியேனும் செல்' எனும் விருப்பத்தை முடக்கும். இந்த அமைப்பு முடக்கப்பட்டாலோ அல்லது உள்ளமைக்கப்படாமல் இருந்தாலோ, எச்சரிக்கை காட்டப்பட்ட பின்பு, பயனர்கள் புகாரளிக்கப்பட்ட தளத்திற்குச் செல்லலாமா அல்லது வேண்டாமா என்பதைத் தேர்வுசெய்துகொள்ளலாம். @@ -2384,7 +2409,7 @@ குறிப்பு: தற்போது, உள்நுழைவுத் திரை காண்பிக்கப்படும்போதும் அல்லது கியோஸ்க் பயன்பாட்டின் அமர்வு செயலில் இருக்கும்போதும் மட்டுமே தானியங்கு மறுதொடக்கங்கள் இயக்கப்படும். இது எதிர்காலத்தில் மாற்றப்படும், ஆனால் குறிப்பிட்ட வகையிலான அமர்வு செயலில் இருந்தாலும் அல்லது இல்லை என்றாலும் கொள்கை எப்போதும் பயன்படுத்தப்படும்.</translation> <translation id="7701341006446125684">பயன்பாடுகளுக்கும் நீட்டிப்புகளுக்கும் தற்காலிகச் சேமிப்பு அளவை அமைக்கும் (பைட்களில்)</translation> -<translation id="7709537117200051035">ஹோஸ்டுக்கான அணுகலை அனுமதிக்க வேண்டுமா (சரி) அல்லது தடுக்க வேண்டுமா (தவறு) என்பதைக் குறிப்பிடும் பூலியன் கொடிக்கான, அகராதியைப் பொருத்தும் ஹோஸ்ட்பெயர்கள். +<translation id="7709537117200051035">ஹோஸ்ட்டுக்கான அணுகலை அனுமதிக்க வேண்டுமா (சரி) அல்லது தடுக்க வேண்டுமா (தவறு) என்பதைக் குறிப்பிடும் பூலியன் கொடிக்கான பொருந்தும் ஹோஸ்ட்பெயர்களின் அகராதி. இந்தக் கொள்கை <ph name="PRODUCT_NAME" /> இன் அகப் பயன்பாட்டிற்கானது.</translation> <translation id="7712109699186360774">கேமரா மற்றும்/அல்லது மைக்ரோஃபோனை தளம் அணுக விரும்பும் ஒவ்வொரு முறையும் கேள்</translation> @@ -2398,11 +2423,11 @@ இந்தக் கொள்கையானது HTTP/0.9 இல் ஏற்கனவே இருக்கும் சேவையகங்களை மாற்றுவதற்கான வாய்ப்பை நிறுவனங்களுக்கு வழங்குகிறது. இந்தக் கொள்கை எதிர்காலத்தில் அகற்றப்படும். இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், வழக்கத்திற்கு மாறான போர்ட்டுகளில் HTTP/0.9 முடக்கப்படும்.</translation> -<translation id="7749402620209366169">பயனர் சார்ந்த PIN க்குப் பதிலாக ஹோஸ்ட்களின் தொலைநிலை அணுகலுக்கு இரு-காரணி அங்கீகாரத்தைச் செயல்படுத்தும். +<translation id="7749402620209366169">பயனர் குறிப்பிடும் PINனுக்குப் பதிலாகத் தொலைநிலை அணுகல் ஹோஸ்ட்களுக்கு இருபடி அங்கீகாரத்தைச் செயல்படுத்தும். - இந்த அமைப்பு இயக்கப்பட்டால், பயனர்கள் ஹோஸ்ட்டை அணுகும்போது சரியான இரு-காரணி குறியீட்டை வழங்க வேண்டும். + இந்த அமைப்பு இயக்கப்பட்டால், பயனர்கள் ஹோஸ்ட்டை அணுகும்போது சரியான இருபடிக் குறியீட்டை வழங்க வேண்டும். - இந்த அமைப்பு முடக்கப்பட்டாலோ அமைக்கப்படாமல் இருந்தாலோ இரு-காரணி இயக்கப்படாது, மேலும் இயல்புநிலை செயல்பாடான பயனர் சார்ந்த PIN பயன்படுத்தப்படும்.</translation> + இந்த அமைப்பு முடக்கப்பட்டாலோ அமைக்கப்படாமல் இருந்தாலோ இருபடி இயக்கப்படாது, மேலும் இயல்புநிலை செயல்பாடான பயனர் குறிப்பிடும் PIN பயன்படுத்தப்படும்.</translation> <translation id="7750991880413385988">புதிய தாவல் பக்கத்தைத் திற</translation> <translation id="7754704193130578113">பதிவிறக்கும் முன் ஒவ்வொரு கோப்பையும் எங்கு சேமிக்க வேண்டும் எனக் கேட்கவும்</translation> <translation id="7761446981238915769">உள்நுழைவுத் திரையில், நிறுவிய பயன்பாடுகளின் பட்டியலை உள்ளமை</translation> @@ -2518,7 +2543,12 @@ </translation> <translation id="7953256619080733119">நிர்வகித்த பயனர் கைமுறை விதிவிலக்கு ஹோஸ்ட்கள்</translation> <translation id="7961779417826583251">லெகஸி சான்றிதழ் அங்கீகரிப்பாளர்களின் பட்டியலுக்குச் சான்றிதழ் வெளிப்படைத்தன்மை செயலாக்கத்தை முடக்கு</translation> -<translation id="7974114691960514888">இந்தக் கொள்கை, இனி ஆதரவளிக்கப்படாது. தொலைநிலை பயனகத்துடன் இணைக்கும்போது, STUN மற்றும் அதனுடன் தொடர்புடைய சேவையகங்களின் பயன்பாட்டைச் செயலாக்குகிறது. இந்த அமைப்பு செயல்படுத்தப்பட்டால், ஃபயர்வாலால் தனிப்படுத்தப்பட்டிருந்தாலும், இந்த கணினியானது தொலைநிலை ஹோஸ்ட் கணினிகளைக் கண்டறிந்து அதனுடன் இணைய முடியும். இந்த அமைப்பு முடக்கப்பட்டு, வெளிச்செல்லும் UDP இணைப்புகளால் ஃபயர்வாலால் வடிகட்டப்பட்டால், அக பிணையத்திற்குள் மட்டுமே, ஹோஸ்ட் கணினிகளுடன் இணைக்கப்படும்.</translation> +<translation id="7974114691960514888">இந்தக் கொள்கை, இனி ஆதரவளிக்கப்படாது. + தொலைநிலை கிளையன்ட்டுடன் இணைக்கும்போது STUN மற்றும் தொடர் சேவையகங்களின் பயன்பாட்டை இயக்குகிறது. + + இந்த அமைப்பு இயக்கப்பட்டால், ஃபயர்வாலால் பிரிக்கப்பட்டிருந்தாலும், இந்தக் கம்ப்யூட்டரால் தொலைநிலை ஹோஸ்ட் கம்ப்யூட்டர்களைக் கண்டறிந்து அவற்றுடன் இணைய முடியும். + + இந்த அமைப்பு முடக்கப்பட்டு, வெளிச்செல்லும் UDP இணைப்புகள் ஃபயர்வாலால் வடிகட்டப்பட்டால், அக நெட்வொர்க்குக்குள் இருக்கும் ஹோஸ்ட் கம்ப்யூட்டர்களுடன் மட்டுமே இந்தக் கம்ப்யூட்டர் இணைய முடியும்.</translation> <translation id="7976157349247117979"><ph name="PRODUCT_NAME" /> இலக்கின் பெயர்</translation> <translation id="7980227303582973781">சிறப்புக் கட்டுப்பாடுகள் எதுவுமில்லை</translation> <translation id="7985242821674907985"><ph name="PRODUCT_NAME" /></translation> @@ -2567,7 +2597,7 @@ கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும். மதிப்புகள் செயலற்ற நிலைக்குக் குறைவாக அல்லது சமமாக இருக்குமாறு அமைக்கப்படும்.</translation> <translation id="8140204717286305802">வகைகள் மற்றும் வன்பொருள் முகவரிகளுடன் கூடிய நெட்வொர்க் இடைமுகங்களின் பட்டியலைச் சேவையகத்துக்கு அறிக்கையிடவும். - கொள்கை தவறு என அமைக்கப்பட்டிருந்தால், இடைமுகத்தின் பட்டியல் அறிக்கையிடப்படாது.</translation> + கொள்கை 'தவறு' என அமைக்கப்பட்டிருந்தால், இடைமுகத்தின் பட்டியல் அறிக்கையிடப்படாது.</translation> <translation id="8141795997560411818">பயனர் Android Google இயக்ககப் பயன்பாட்டைப் பயன்படுத்துவதை, இந்தக் கொள்கை தடுக்காது. Google இயக்ககத்திற்கான அணுகலைத் தடுக்க விரும்பினால், நீங்கள் Android Google இயக்ககப் பயன்பாட்டை நிறுவுவதையும் அனுமதிக்கக்கூடாது.</translation> <translation id="8146727383888924340">Chrome OS பதிவுசெய்தல் மூலம் சலுகைகளைப் பெற பயனர்களை அனுமதிக்கவும்</translation> <translation id="8148785525797916822">தற்போது ஆதரிக்கப்படாத கணினியில் அல்லது இயக்க முறைமையில் <ph name="PRODUCT_NAME" /> இயங்கும் போது தோன்றும் எச்சரிக்கையை முடக்கும்.</translation> @@ -2675,11 +2705,11 @@ <translation id="8465065632133292531">POST ஐப் பயன்படுத்தும் உடனடி URL க்கான அளவுருக்கள்</translation> <translation id="847472800012384958">பாப்-அப்களைக் காண்பிக்க எந்த தளத்தையும் அனுமதிக்காதே</translation> <translation id="8477885780684655676">TLS 1.0</translation> -<translation id="8484458986062090479">ஹோஸ்ட் உலாவியால் எப்போதும் வழங்கப்பட வேண்டிய URL வடிவங்களின் பட்டியலைத் தனிப்பயனாக்கும். +<translation id="8484458986062090479">ஹோஸ்ட் உலாவியால் எப்போதும் ரென்டர் செய்யப்பட வேண்டிய URL பேட்டர்ன்களின் பட்டியலைத் தனிப்பயனாக்கும். - இந்தக் கொள்கை அமைக்கப்படாவிட்டால் 'ChromeFrameRendererSettings' கொள்கையால் குறிப்பிடப்பட்டுள்ளபடி எல்லா தளங்களுக்கும் இயல்புநிலை வழங்கியானது பயன்படுத்தப்படும். + இந்தக் கொள்கை அமைக்கப்படாவிட்டால் 'ChromeFrameRendererSettings' கொள்கையால் குறிப்பிடப்பட்டுள்ளபடி எல்லா தளங்களுக்கும் இயல்புநிலை ரென்டரர் பயன்படுத்தப்படும். - வடிவங்களின் எடுத்துக்காட்டுகளுக்கு https://www.chromium.org/developers/how-tos/chrome-frame-getting-started என்கிற முகவரியைப் பார்க்கவும்.</translation> + பேட்டர்ன்களின் எடுத்துக்காட்டுகளுக்கு https://www.chromium.org/developers/how-tos/chrome-frame-getting-started என்கிற முகவரியைப் பார்க்கவும்.</translation> <translation id="8493645415242333585">உலாவி வரலாற்றை சேமிப்பதை முடக்கு</translation> <translation id="8498293625012059298">கடவுச்சொல்லை மாற்றுவதற்கான URLலை உள்ளமைக்கும் (HTTP மற்றும் HTTPS ஸ்கீம்களில் மட்டும்). கடவுச்சொல் பாதுகாப்புச் சேவையானது, உலாவியில் பயனர்கள் ஒரு எச்சரிக்கையைப் பார்த்தபிறகு தங்களுடைய கடவுச்சொல்லை மாற்ற, அவர்களை இந்த URLலுக்கு அனுப்பும். கடவுச்சொல்லை மாற்றும் இந்தப் பக்கத்தில் புதிய கடவுச்சொல் கைரேகையை <ph name="PRODUCT_NAME" /> சரியாகப் படம்பிடிப்பதற்கு, கடவுச்சொல்லை மாற்றும் பக்கம் https://www.chromium.org/developers/design-documents/create-amazing-password-forms என்பதிலுள்ள வழிமுறைகளைப் பின்பற்றுவதை உறுதிசெய்யவும். @@ -2707,6 +2737,7 @@ இங்கே "பதிப்பு" என்பது '61.0.3163.120' போன்ற ஒரே பதிப்பாகவோ அல்லது '61.0' போன்ற பதிப்பு முன்னொட்டாகவோ இருக்கலாம் </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> க்கான, இயல்புநிலை HTML ரெண்டரர்</translation> +<translation id="8544465954173828789">SMS மெசேஜ்களை ஃபோனிலிருந்து Chromebookக்கு ஒத்திசைப்பதை அனுமதிக்கும்.</translation> <translation id="8549772397068118889">உள்ளடக்கத் தொகுப்புகளுக்கு வெளியே உள்ள தளங்களைப் பார்வையிடும்போது எச்சரிக்கை செய்</translation> <translation id="8566842294717252664">புதிய தாவல் பக்கம் மற்றும் பயன்பாட்டுத் துவக்கியில் இணைய அங்காடியை மறை</translation> <translation id="8586528890725660268">பயனர் பயன்படுத்த முடியாத பிரிண்டர்களைக் குறிப்பிடும். @@ -2751,6 +2782,11 @@ இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், கடவுச்சொல் பாதுகாப்புச் சேவையானது Google கடவுச்சொற்களை மட்டும் பாதுகாக்கும், எனினும் பயனரால் இந்த அமைப்பை மாற்ற முடியும்.</translation> <translation id="8672321184841719703">இலக்கு தானியங்கு புதுப்பித்தல் பதிப்பு</translation> <translation id="867410340948518937">U2F (யூனிவர்செல் செகண்ட் ஃபேக்டர்)</translation> +<translation id="8682611302223077049">இது மில்லிவினாடிகளில் ஒரு காலகட்டத்தை அமைக்க அனுமதிக்கும், இந்தக் காலகட்டத்தில் <ph name="PRODUCT_NAME" />ஐ மீண்டும் தொடங்குவதற்கோ, நிலுவையிலுள்ள ஒரு புதுப்பிப்பைப் பயன்படுத்துவதற்கு <ph name="PRODUCT_OS_NAME" /> சாதனத்தை மீண்டும் தொடங்குவதற்கோ பயனருக்கு அறிவுறுத்தப்படும். + + இந்தக் காலகட்டத்தில், புதுப்பிப்பு தேவை என்பதைப் பற்றி பயனருக்குத் தொடர்ச்சியாகத் தெரிவிக்கப்படும். <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கு, ஒரு புதுப்பிப்பு கண்டறியப்படும்போது, முறைமைத் தட்டில் சாதனத்தை மீண்டும் தொடங்குமாறு அறிவுறுத்தும் அறிவிப்பு தோன்றும். <ph name="PRODUCT_NAME" /> உலாவிகளுக்கு, குறிப்பிடப்பட்டுள்ள காலகட்டத்தில் மூன்றில் ஒருபங்கு நேரம் முடிந்தவுடன், உலாவியை மீண்டும் தொடங்கவேண்டும் என்பதைச் சுட்டிக்காட்டும் வகையில் ஆப்ஸ் மெனு மாறும். காலகட்டத்தில் மூன்றில் இரண்டு பங்கு நேரம் முடிந்தவுடன் இந்த அறிவிப்பின் நிறம் மாறும். அறிவிப்புக் காலம் முழுமையாக முடிந்தவுடன் மீண்டும் நிறம் மாறும். <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> கொள்கையால் இயக்கப்பட்ட கூடுதல் அறிவிப்புகளும் இதே கால அட்டவணையைப் பயன்படுத்தும். + + அமைக்காமல் விடப்பட்டால், இயல்பாக <ph name="PRODUCT_OS_NAME" /> சாதனங்களுக்கு 345600000 மில்லிவினாடிகள் (நான்கு நாட்கள்) காலகட்டமும் <ph name="PRODUCT_NAME" />க்கு 604800000 மில்லிவினாடிகள் (ஒரு வாரம்) காலகட்டமும் பயன்படுத்தப்படும்.</translation> <translation id="8685024486845674965">கடவுச்சொல் பாதுகாப்புச் சேவையின் எச்சரிக்கையானது, கடவுச்சொல் மீண்டும் பயன்படுத்தப்பட்டால் தூண்டப்படும்</translation> <translation id="8693243869659262736">உள்ளிணைந்த DNS க்ளையன்ட்டைப் பயன்படுத்தவும்</translation> <translation id="8704831857353097849">முடக்கப்பட்ட செருகுநிரல்களின் பட்டியல்</translation> @@ -2787,11 +2823,12 @@ அளவு காரணி 100% அல்லது அதற்கு அதிகமாக இருக்க வேண்டும். விளக்கக்காட்சிப் பயன்முறையில் மங்கல் தாமதத்தை உருவாக்கும் மதிப்புகள் வழக்கமான மங்கல் தாமதத்தை விட குறைவாக இருந்தால் அனுமதிக்கப்படாது.</translation> <translation id="8798099450830957504">இயல்புநிலை</translation> +<translation id="8801680448782904838">உலாவியை அல்லது சாதனத்தை மீண்டும் தொடங்குவதற்குப் பரிந்துரைக்கப்படுகிறது அல்லது மீண்டும் தொடங்க வேண்டும் என்று பயனருக்கு அறிவிக்கும்</translation> <translation id="8818173863808665831">சாதனத்தின் புவியியல் இருப்பிடத்தைப் புகாரளி. கொள்கை அமைக்கப்படாமலோ அல்லது தவறாகவோ அமைக்கப்பட்டிருந்தாலோ, இருப்பிடம் புகாரளிக்கப்படாது.</translation> -<translation id="8818768076343557335">செல்லுலார் அல்லாத எந்த நெட்வொர்க்கிலும் நெட்வொர்க் செயல்பாடுகளை யூகி. - (50 இல் தடுக்கப்பட்டது, 52 இல் அகற்றப்பட்டது. 52க்குப் பின், மதிப்பானது 1 ஆக அமைக்கப்பட்டால், அது 0 ஆகக் கருதப்படும் - எந்த நெட்வொர்க் இணைப்பிலும் நெட்வொர்க் செயல்பாடுகளை யூகி.)</translation> +<translation id="8818768076343557335">மொபைல் அல்லாத எந்த நெட்வொர்க்கிலும் நெட்வொர்க் செயல்பாடுகளை யூகி. + (50ல் தடுக்கப்பட்டு, 52ல் அகற்றப்பட்டது. 52க்குப் பின், மதிப்பானது 1 என்று அமைக்கப்பட்டால், அது 0 என்று கருதப்படும் - எந்த நெட்வொர்க் இணைப்பிலும் நெட்வொர்க் செயல்பாடுகளை யூகி.)</translation> <translation id="8825782996899863372">கடவுச்சொல் பாதுகாப்புச் சேவையின் எச்சரிக்கையானது, ஃபிஷிங் பக்கத்தில் கடவுச்சொல் மீண்டும் பயன்படுத்தப்பட்டால் தூண்டப்படும்</translation> <translation id="8828766846428537606"><ph name="PRODUCT_NAME" /> இல் இயல்புநிலை முகப்பு பக்கத்தை உள்ளமைத்து, பயனர்கள் அதை மாற்றுவதைத் தடுக்கும். @@ -2924,7 +2961,7 @@ கொள்கை அமைக்கப்படாமல் இருந்தால், உள்நுழைவுத் திரையில் பயனரைக் குறிப்பிடும் தோற்றப் படத்தைப் பயனர் தேர்வுசெய்யலாம்.</translation> <translation id="9035964157729712237">தடுப்புப் பட்டியலில் இருந்து, விலக்குவதற்கான நீட்டிப்பு IDகள்</translation> -<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> சாதனத்தில் பயன்படுத்துவதற்கு ஒரு பயனருக்கு புஷிங் நெட்வொர்க் உள்ளமைவை அனுமதிக்கிறது. நெட்வொர்க் உள்ளமைவு என்பது <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்பு தொடர் ஆகும்.</translation> +<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> சாதனத்தில் பயன்படுத்துவதற்கு ஒவ்வொரு பயனருக்குமாக நெட்வொர்க் உள்ளமைவை வழங்க அனுமதிக்கிறது. நெட்வொர்க் உள்ளமைவு என்பது <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடர் ஆகும்.</translation> <translation id="9084985621503260744">வீடியோ செயல்பாடு, சக்தி மேலாண்மையைப் பாதிக்குமா என்பதைக் குறிப்பிடவும்</translation> <translation id="9088433379343318874">கண்காணிக்கப்படும் பயனருக்கான உள்ளடக்க வழங்குநரை இயக்கு</translation> <translation id="9088444059179765143">தானாக நேரமண்டலத்தைக் கண்டறிதல் முறையை உள்ளமை</translation> @@ -2964,6 +3001,11 @@ இந்தக் கொள்கை true என அமைக்கப்பட்டால், சாதனத்தைப் பயனர் இயக்க நிறுத்தம் செய்யும்போது, மறுதொடக்கத்தை <ph name="PRODUCT_OS_NAME" /> செயல்படுத்தும். UI இல் உள்ள எல்லா இயக்க நிறுத்தப் பொத்தான்களையும், மறுதொடக்கப் பொத்தான்களாக <ph name="PRODUCT_OS_NAME" /> மாற்றியமைக்கும். பவர் பொத்தானைப் பயன்படுத்திச் சாதனத்தைப் பயனர் இயக்க நிறுத்தம் செய்யும் போது, கொள்கை இயக்கப்பட்டிருந்தாலும் சாதனம் தானாக மறுதொடக்கமாகாது.</translation> <translation id="9152473318295429890">தொடர்புடைய இணையப் பக்கங்களின் சூழல்சார்ந்த பரிந்துரைகளை இயக்கும்</translation> <translation id="9158929520101169054">உலாவிக்குள் பல உள்நுழைவை அனுமதி</translation> +<translation id="9159126470527871268">நிலுவையிலுள்ள ஒரு புதுப்பிப்பைப் பயன்படுத்துவதற்காக, <ph name="PRODUCT_NAME" /> அல்லது <ph name="PRODUCT_OS_NAME" />ஐ மீண்டும் தொடங்க வேண்டும் என்று பயனர்களுக்கு அறிவிக்கும். + + இந்தக் கொள்கை அமைப்பு மூலம், உலாவியை அல்லது சாதனத்தை மீண்டும் தொடங்குவதற்குப் பரிந்துரைக்கப்படுகிறது அல்லது புதுப்பிக்க வேண்டும் என்று பயனருக்குத் தெரிவிக்கும் அறிவிப்புகளை இயக்கலாம். இது அமைக்கப்படாவிட்டால், மெனுவில் செய்யப்படும் சிறியளவிலான மாற்றங்கள் மூலம், அதை மீண்டும் தொடங்க வேண்டும் என்று <ph name="PRODUCT_NAME" /> பயனருக்குச் சுட்டிக்காட்டும். <ph name="PRODUCT_OS_NAME" /> இந்த அறிவிப்பை முறைமைத் தட்டில் காண்பிக்கும். இந்தக் கொள்கை ‘பரிந்துரைக்கப்படுகிறது’ என்பதற்கு அமைக்கப்பட்டால், ‘மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது’ என்று பயனருக்கு தொடர்ச்சியாக ஓர் எச்சரிக்கைக் காண்பிக்கப்படும். பயனர் இந்த எச்சரிக்கையை நிராகரிப்பதன் மூலம் மீண்டும் தொடங்குவதை ஒத்திவைக்கலாம். இந்தக் கொள்கை ‘தேவை’ என்பதற்கு அமைக்கப்பட்டால், அறிவிப்புக் காலம் முடிந்தவுடன் உலாவி கட்டாயமாக மீண்டும் தொடங்கப்படும் என்பதைச் சுட்டிக்காட்டும் ஓர் எச்சரிக்கை, தொடர்ச்சியாகப் பயனருக்குக் காண்பிக்கப்படும். மறுதொடக்கம் செய்வதற்கான இயல்புக் காலகட்டம் <ph name="PRODUCT_NAME" />க்கு ஏழு நாட்களாகவும், <ph name="PRODUCT_OS_NAME" />க்கு நான்கு நாட்களாகவும் இருக்கும். இந்தக் காலகட்டத்தை <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> கொள்கை அமைப்பில் உள்ளமைக்கலாம். + + மறுதொடக்கம் செய்த பின்னர், பயனரின் அமர்வு மீட்டெடுக்கப்படும்.</translation> <translation id="9165792353046089850">இணைக்கப்பட்டுள்ள USB சாதனங்களுக்கான அணுகலைப் பெறுவதற்கு, இணையதளங்களை அனுமதிக்கலாமா அல்லது வேண்டாமா என்பதை அமைக்க உதவுகிறது. அணுகலை முழுமையாகத் தடுக்கலாம் அல்லது இணையதளமானது இணைக்கப்பட்டுள்ள USB சாதனங்களை அணுக விரும்பும் ஒவ்வொரு முறையும் பயனரிடம் கேட்கலாம். WebUsbAskForUrls', 'WebUsbBlockedForUrls' கொள்கைகளைப் பயன்படுத்தும் குறிப்பிட்ட URL பேட்டர்ன்களுக்காக இந்தக் கொள்கை மேலெழுதப்படலாம்.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 362cab2..1daf362 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -402,6 +402,7 @@ ఈ సెట్టింగ్ సెట్ చేయకుండా వదిలేస్తే వినియోగదారు ఈ ఫంక్షన్ను ఉపయోగించాలా వద్దా అని నిర్ణయించుకోగలరు.</translation> <translation id="2006530844219044261">శక్తి నిర్వహణ</translation> <translation id="201557587962247231">పరికర స్థితి నివేదిక అప్లోడ్ల తరచుదనం</translation> +<translation id="2017301949684549118">వెబ్ యాప్ల కోసం URLలు నిశ్శబ్దంగా ఇన్స్టాల్ చేయబడతాయి.</translation> <translation id="2018836497795982119">వినియోగదారు విధాన సమాచారం కోసం పరికర నిర్వహణ సేవ ప్రశ్న సమయ వ్యవధిని మిల్లీ సెకన్లలో పేర్కొంటుంది. ఈ విధానాన్ని సెట్ చేయడం వలన 3 గంటల డిఫాల్ట్ విలువ భర్తీ చేయబడుతుంది. ఈ విధానానికి సంబంధించి చెల్లుబాటు అయ్యే విలువల పరిధి 1800000 (30 నిమిషాలు) నుండి 86400000 (1 రోజు) వరకు ఉంది. ఈ పరిధిలో లేని విలువలు ఏవైనా సమీపంలోని పరిధికి పరిమితం చేయబడతాయి. ప్లాట్ఫారమ్ విధాన నోటిఫికేషన్లకు మద్దతిచ్చే పక్షంలో, రిఫ్రెష్ జాప్యం 24 గంటలకు సెట్ చేయబడుతుంది, ఎందుకంటే విధానంలో మార్పులు జరిగినప్పుడు విధాన నోటిఫికేషన్లు నిర్బంధంగా స్వయంచాలిత రిఫ్రెష్ చేయడానికి అవకాశం ఉంటుంది. @@ -422,7 +423,7 @@ ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, మొత్తం నాలుగు స్కీమ్లు ఉపయోగించబడతాయి.</translation> <translation id="2067011586099792101">కంటెంట్ ప్యాక్లకు వెలుపల ఉన్న సైట్లకు ప్రాప్యతను బ్లాక్ చేయండి</translation> <translation id="2073552873076775140"><ph name="PRODUCT_NAME" />కి సైన్ ఇన్ చేయడానికి అనుమతించండి</translation> -<translation id="2077129598763517140">హార్డ్వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation> +<translation id="2077129598763517140">హార్డ్వేర్ వేగవృద్ధి అందుబాటులో ఉన్నప్పుడు, దానిని ఉపయోగించు</translation> <translation id="2077273864382355561">బ్యాటరీ శక్తితో అమలవుతున్నప్పుడు స్క్రీన్ ఆపివేత ఆలస్యం</translation> <translation id="2082205219176343977">పరికరం కోసం అనుమతించబడిన కనిష్ట Chrome వెర్షన్ని కాన్ఫిగర్ చేయండి.</translation> <translation id="209586405398070749">స్టేబుల్ ఛానెల్</translation> @@ -744,6 +745,11 @@ Google శోధన URLను ఇలా పేర్కొనవచ్చు: <ph name="GOOGLE_SEARCH_URL" />. 'DefaultSearchProviderEnabled' విధానాన్ని ప్రారంభించినప్పుడు, ఈ ఎంపికను తప్పనిసరిగా సెట్ చేయాలి, ఇది ఈ సందర్భంలో మాత్రమే పరిగణించబడుతుంది.</translation> +<translation id="2659019163577049044">ఈ సెట్టింగ్ ప్రారంభించబడితే, వినియోగదారులు వారి SMS సందేశాలను వారి ఫోన్లు మరియు Chromebookల మధ్య సమకాలీకరించేలా వారి పరికరాలను సెటప్ చేయడానికి అనుమతించబడతారు. ఈ విధానం అనుమతించబడితే, వినియోగదారులు ప్రత్యేకంగా ఈ ఫీచర్ను ఎంచుకోవడం ద్వారా సెటప్ విధానాన్ని పూర్తి చేయాల్సి ఉంటుంది. ఒకసారి సెటప్ విధానం పూర్తయిన తర్వాత, వినియోగదారులు వారి Chromebookలలో SMS సందేశాలను పంపగలుగుతారు మరియు అందుకోగలుగుతారు. + + ఈ సెట్టింగ్ నిలిపివేయబడితే, వినియోగదారులు SMS సమకాలీకరణను సెటప్ చేయడానికి అనుమతించబడరు. + + ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, డిఫాల్ట్ ప్రకారం నిర్వహిత వినియోగదారులకు నిరాకరించబడుతుంది మరియు నిర్వహించబడని వినియోగదారులకు అనుమతించబడుతుంది.</translation> <translation id="2660846099862559570">ఇప్పటి వరకు ప్రాక్సీని ఉపయోగించలేదా</translation> <translation id="267596348720209223">శోధన ప్రొవైడర్ ద్వారా మద్దతు గల అక్షర ఎన్కోడింగ్లను పేర్కొంటుంది. ఎన్కోడింగ్లు అంటే UTF-8 GB2312 మరియు ISO-8859-1 వంటి కోడ్ పేజీ పేర్లు. అవి అందించబడిన క్రమంలో ప్రయత్నించబడతాయి. ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, UTF-8 డిఫాల్ట్ ఉపయోగించబడుతుంది. ఈ విధానం కేవలం 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడితే పరిగణించబడుతుంది.</translation> <translation id="2682697254900811431"><ph name="PRODUCT_NAME" /> గురించి వినియోగం మరియు క్రాష్-సంబంధిత డేటాను అజ్ఞాతంగా Googleకి నివేదించడాన్ని ప్రారంభిస్తుంది మరియు ఈ సెట్టింగ్ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది. @@ -825,7 +831,6 @@ మీరు ఈ సెట్టింగ్ను నిలిపివేస్తే లేదా విలువను సెట్ చేయకపోతే, ప్రింట్ పరిదృశ్యం అత్యంత ఇటీవల ఉపయోగించిన ప్రింటర్ను డిఫాల్ట్ గమ్యస్థాన ఎంపికగా ఉపయోగిస్తుంది. మీరు ఈ సెట్టింగ్ను ప్రారంభిస్తే, ప్రింట్ పరిదృశ్యం OS సిస్టమ్ డిఫాల్ట్ ప్రింటర్ను డిఫాల్ట్ గమ్యస్థాన ఎంపికగా ఉపయోగిస్తుంది.</translation> -<translation id="2867699958489427143">OS వెర్షన్, లక్ష్యం కన్నా కొత్తదైతే, ఉపసంహరించండి మరియు లక్ష్య వెర్షన్లోనే ఉండండి. ప్రాసెస్ సమయంలో పూర్తి పవర్వాష్ చేయండి.</translation> <translation id="2872961005593481000">షట్ డౌన్ చెయ్యండి</translation> <translation id="2874209944580848064">Android అనువర్తనాలకు మద్దతు ఇచ్చే <ph name="PRODUCT_OS_NAME" /> పరికరాల కోసం గమనిక:</translation> <translation id="2877225735001246144">Kerberos అధికారాన్ని చర్చించినపుడు CNAME లుక్అప్ని ఆపివేయి</translation> @@ -1097,7 +1102,6 @@ <translation id="3715569262675717862">క్లయింట్ సర్టిఫికెట్ల ఆధారంగా ప్రమాణీకరణ</translation> <translation id="3734995764843493369">పాస్వర్డ్ నమోదు ప్రతి రోజు (24 గంటలకు) అవసరమవుతుంది</translation> <translation id="3736879847913515635">వినియోగదారు నిర్వాహికిలో వ్యక్తిని జోడించు ఎంపికను ప్రారంభించండి</translation> -<translation id="3737544779868348650">పరికర నెట్వర్క్ హోస్ట్పేరు</translation> <translation id="3746590506846867985"> ఈ విధానం సైన్-ఇన్ స్క్రీన్కు వర్తిస్తుంది. దయచేసి వినియోగదారు సెషన్కు వర్తించే <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> విధానాన్ని కూడా చూడండి. రెండు విధానాలను ఒకే విలువకు సెట్ చేయాల్సిందిగా సిఫార్సు చేయడమైనది. విలువలు సరిపోలకపోతే, వినియోగదారు సెషన్లోకి ప్రవేశించేటప్పుడు, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువని వర్తింపజేయడం వల్ల ఆలస్యం జరగవచ్చు విధానం ప్రారంభించబడినట్లయితే, కామాతో వేరు చేసిన జాబితాలో పేర్కొనే ప్రతి ఒక్క ప్రారంభ స్థానంలో దాని స్వంత ప్రక్రియ అమలు చేయబడుతుంది. ఇది ఉపడొమైన్లతో పేర్కొనబడిన మూలాలను కూడా వేరు చేస్తుంది; ఉదా. https://example.com/ను నిర్దిష్టంగా పేర్కొన్నప్పుడు https://foo.example.com/ కూడా https://example.com/ సైట్లో భాగంగా వేరు చేయబడుతుంది. @@ -1214,6 +1218,7 @@ ప్రతి జాబితా నమోదు 'extension-id' ఫీల్డ్లో పొడిగింపు ID మరియు 'update-url' ఫీల్డ్లో దీని నవీకరణ url ఉన్న నిఘంటువును కలిగి ఉండాలి.</translation> <translation id="3874773863217952418">వెతకడానికి నొక్కండి ఫీచర్ను ప్రారంభించండి</translation> <translation id="3877517141460819966">ఏకీకృత రెండవ కారక ప్రమాణీకరణ మోడ్</translation> +<translation id="3879208481373875102">నిర్బంధంగా ఇన్స్టాల్ చేసిన వెబ్ యాప్ల జాబితాను కాన్ఫిగర్ చేయండి</translation> <translation id="388237772682176890">ఈ విధానానికి SPDY/3.1 మద్దతు తీసివేసినందున M53లో నిలిపివేయబడింది మరియు M54లో తీసివేయబడింది. <ph name="PRODUCT_NAME" />లో SPDY ప్రోటోకాల్ వినియోగాన్ని నిలిపివేస్తుంది. @@ -1508,6 +1513,10 @@ ఈ విధానం యొక్క సంభావ్య సెట్టింగ్లు మరియు నిర్మాణం యొక్క పూర్తి వివరణ కోసం దయచేసి https://www.chromium.org/administrators/policy-list-3/extension-settings-fullని సందర్శించండి </translation> <translation id="4554651132977135445">వినియోగదారు విధానం లూప్బ్యాక్ ప్రాసెసింగ్ మోడ్</translation> +<translation id="4554841826517980623">నెట్వర్క్లో షేర్లను కనుగొనడానికి <ph name="PRODUCT_NAME" /> కోసం <ph name="NETBIOS_PROTOCOL" /> నెట్వర్క్ ఫైల్ షేర్లు ఫీచర్ను ఉపయోగించాలో లేదో ఈ విధానం నియంత్రిస్తుంది. + ఈ విధానం ఒప్పుకు సెట్ చేయబడినప్పుడు, నెట్వర్క్లో షేర్లను కనుగొనడానికి షేర్ ఆచూకీ శోధన <ph name="NETBIOS_PROTOCOL" /> ప్రోటోకాల్ను ఉపయోగిస్తుంది. + ఈ విధానం తప్పుకు సెట్ చేయబడినపుడు, షేర్లు కనుగొనడానికి షేర్ ఆచూకీ శోధన <ph name="NETBIOS_PROTOCOL" /> ప్రోటోకాల్ను ఉపయోగించదు. + ఒకవేళ విధానం సెట్ చేయకుండా వదిలేస్తే, డిఫాల్ట్ ప్రకారం ఎంటర్ప్రైజ్ నిర్వహిత వినియోగదారులకు నిలిపివేయబడుతుంది మరియు నిర్వహిత వినియోగదారులు కాని వారికి ప్రారంభించబడుతుంది.</translation> <translation id="4555850956567117258">వినియోగదారు కోసం రిమోట్ ధృవీకరణను ప్రారంభించండి</translation> <translation id="4557134566541205630">డిఫాల్ట్ శోధన ప్రదాత కొత్త ట్యాబ్ పేజీ URL</translation> <translation id="4567137030726189378">డెవలపర్ సాధనాల వినియోగాన్ని అనుమతించండి</translation> @@ -2026,6 +2035,7 @@ ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, లాగిన్ స్క్రీన్ మొదట చూపబడినప్పుడు చదివి వినిపించే అభిప్రాయం నిలిపివేయబడుతుంది. వినియోగదారులు ఎప్పుడైనా చదివి వినిపించే అభిప్రాయాన్ని ప్రారంభించవచ్చు లేదా నిలిపివేయవచ్చు మరియు లాగిన్ స్క్రీన్లో దాని స్థితి వినియోగదారుల మధ్య అలాగే కొనసాగుతుంది.</translation> <translation id="5868414965372171132">వినియోగదారు-స్థాయి నెట్వర్క్ కాన్ఫిగరేషన్</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> ద్వారా నెట్వర్క్ ఫైల్ షేర్ ఆచూకీ శోధనను నియంత్రిస్తుంది</translation> <translation id="5883015257301027298">డిఫాల్ట్ కుక్కీల సెట్టింగ్</translation> <translation id="5887414688706570295">రిమోట్ ప్రాప్యత హోస్ట్లు ఉపయోగించే TalkGadget ఆదిప్రత్యయాన్ని కాన్ఫిగర్ చేస్తుంది మరియు వినియోగదారులు దీన్ని మార్చకుండా నిరోధిస్తుంది. @@ -2343,7 +2353,7 @@ ఈ సెట్టింగ్ <ph name="PRODUCT_NAME" />లో సైన్-ఇన్ చేసేందుకు తోడ్పడేందుకు, డిఫాల్ట్ బ్రౌజర్గా ఎంచుకునేందుకు లేదా ఉత్పాదన ఫీచర్లు వారికి వివరించే స్వాగత పేజీల ప్రదర్శనను నియంత్రిస్తుంది.</translation> <translation id="6766216162565713893">సమీప బ్లూటూత్ పరికరానికి ప్రాప్యతను మంజూరు చేయడం కోసం వినియోగదారుని అడగటానికి సైట్లను అనుమతించండి</translation> <translation id="6770454900105963262">సక్రియ కియోస్క్ సెషన్ల గురించి సమాచారాన్ని నివేదిస్తుంది</translation> -<translation id="6786747875388722282">పొడిగింపులు</translation> +<translation id="6786747875388722282">ఎక్స్టెన్షన్లు</translation> <translation id="6786967369487349613">రోమింగ్ ప్రొఫైల్ డైరెక్టరీని సెట్ చేయండి</translation> <translation id="6810445994095397827">ఈ సైట్లలో JavaScriptని బ్లాక్ చెయ్యి</translation> <translation id="681446116407619279">మద్దతిచ్చే ప్రామాణీకరణ పథకాలు</translation> @@ -2487,6 +2497,17 @@ <translation id="7049373494483449255">ముద్రణ కోసం <ph name="CLOUD_PRINT_NAME" />కు పత్రాలను సమర్పించడానికి <ph name="PRODUCT_NAME" />ను ప్రారంభిస్తుంది. గమనిక: ఇది <ph name="PRODUCT_NAME" />లో <ph name="CLOUD_PRINT_NAME" /> మద్దతును మాత్రమే ప్రభావితం చేస్తుంది. ఇది వెబ్ సైట్లలో ముద్రణ పనులను సమర్పించడానికి లేకుండా వినియోగదారులను నిరోధించదు. ఈ సెట్టింగ్ ప్రారంభించబడినా లేదా కాన్ఫిగర్ చేయబడకపోయినా, వినియోగదారులు <ph name="PRODUCT_NAME" /> ముద్రణ డైలాగ్ నుండి <ph name="CLOUD_PRINT_NAME" />కు ముద్రించవచ్చు. ఈ సెట్టింగ్ ఆపివేస్తే, వినియోగదారులు <ph name="PRODUCT_NAME" /> ముద్రణ డైలాగ్ నుండి <ph name="CLOUD_PRINT_NAME" />కు ముద్రించలేరు</translation> <translation id="7053678646221257043">ఈ విధానం ప్రారంభించబడి ఉంటే ప్రస్తుత డిఫాల్ట్ బ్రౌజర్ నుండి బుక్మార్క్లు దిగుమతి చేయబడాలని నిర్బంధిస్తుంది. ప్రారంభించబడి ఉంటే, దిగుమతి డైలాగ్ను ఈ విధానం కూడా ప్రభావితం చేస్తుంది. ఆపివేయబడి ఉంటే, బుక్మార్క్లు దిగుమతి చేయబడవు. ఇది సెట్ చేయకపోతే, దిగుమతి చేయడానికి వినియోగదారు అడగబడవచ్చు లేదా స్వయంచాలకంగా దిగుమతి కావచ్చు.</translation> <translation id="7063895219334505671">ఈ సైట్లలో పాప్అప్లని అనుమతించు</translation> +<translation id="706568410943497889"> + ఒకవేళ విధానం ఒప్పుకు సెట్ చేయబడితే, Google సేవల (ఉదా. Google Meet) నుండి WebRTC ఈవెంట్ లాగ్లను సేకరించడానికి మరియు ఆ లాగ్లను Googleలో అప్లోడ్ చేయడానికి <ph name="PRODUCT_NAME" /> అనుమతించబడుతుంది. + + ఒకవేళ విధానం తప్పుకు సెట్ చేయబడితే లేదా సెట్ చేయకుండా వదిలేస్తే, అలాంటి లాగ్లను <ph name="PRODUCT_NAME" /> సేకరించకపోవచ్చు లేదా అప్లోడ్ చేయకపోవచ్చు. + + Chromeలోని ఆడియో, వీడియో కాల్ సమస్యలను డీబగ్ చేస్తున్నప్పుడు సహాయం కోసం పంపిన మరియు అందుకున్న RTP ప్యాకెట్ల సమయం మరియు పరిమాణం, నెట్వర్క్లో రద్దీ గురించిన అభిప్రాయం మరియు ఆడియో, వీడియో ఫ్రేమ్ల సమయం మరియు నాణ్యత గురించి మెటాడేటా లాంటి సమస్య విశ్లేషణ సమాచారం ఈ లాగ్లలో ఉంటుంది. ఈ లాగ్లలో కాల్ సంబంధిత ఆడియో లేదా వీడియో కంటెంట్లు ఉండవు. + + Chrome ద్వారా ఈ డేటా సేకరణ Google Hangouts లేదా Google Meet లాంటి Google వెబ్ సేవల ద్వారా మాత్రమే సక్రియం చేయబడుతుంది. + + Google ఈ లాగ్లను సెషన్ ID లాంటి వాటి ఆధారంగా Google సేవ ద్వారానే సేకరించిన ఇతర లాగ్లతో అనుబంధించవచ్చు; డీబగ్గింగ్ సులభం చేయడానికి ఇది ఉద్దేశించబడింది. + </translation> <translation id="706669471845501145">డెస్క్టాప్ ప్రకటనలని చూపించడానికి సైట్లను అనుమతించు</translation> <translation id="7070525176564511548">ప్రతి వారం (168 గంటలకు) పాస్వర్డ్ నమోదు చేయడం అవసరం</translation> <translation id="7072208053150563108">మెషీన్ పాస్వర్డ్ మార్చు రేట్</translation> @@ -2635,6 +2656,9 @@ <translation id="7336878834592315572">సెషన్ వ్యవధి కోసం కుక్కీలను ఉంచడం</translation> <translation id="7340034977315324840">పరికరం కార్యాచరణ సమయాలను నివేదించండి</translation> <translation id="7343497214039883642">పరికరాల కోసం ఎంటర్ప్రైజ్ ప్రింటర్ కాన్ఫిగరేషన్ ఫైల్</translation> +<translation id="7349338075015720646">వినియోగదారుని ప్రమేయం లేకుండా నిశ్శబ్దంగా ఇన్స్టాల్ అయిన వెబ్సైట్ల జాబితాను పేర్కొంటుంది, అలాగే వీటిని వినియోగదారు అన్ఇన్స్టాల్ చేయలేరు లేదా నిలిపివేయలేరు. + + విధానంలోని ప్రతి జాబితా అంశం రెండు అంశాలతో కూడిన ఆబ్జెక్ట్లాగా ఉంటుంది: "url" మరియు "launch_container". "url" అనేది ఇన్స్టాల్ చేయాల్సిన వెబ్ యాప్ URL మరియు "launch_container" అనేది, ఇన్స్టాల్ చేయబడిన తర్వాత వెబ్ యాప్ ఎలా తెరవాలో సూచించే “విండో” గానీ లేదా “ట్యాబ్" గానీ అయి ఉంటుంది. ఒకవేళ "launch_container" వదిలేయబడితే, అది ప్రోగ్రెసివ్ యాప్ అని Chrome పరిగణిస్తే, యాప్ విండోలో లేదంటే ట్యాబ్లో ప్రారంభించబడుతుంది.</translation> <translation id="7367028210010532881">సంభావ్యంగా హానికరమైనవిగా ఫ్లాగ్ చేయబడిన సైట్లకు వినియోగదారులు నావిగేట్ చేసినప్పుడు సురక్షిత బ్రౌజింగ్ సేవ ఒక హెచ్చరిక పేజీని చూపుతుంది. ఈ సెట్టింగ్ని ప్రారంభించినట్లయితే, వినియోగదారులు ఏదేమైనా హెచ్చరిక పేజీ నుండి హానికరమైన సైట్కు కొనసాగకుండా అడ్డుకోబడతారు. ఈ సెట్టింగ్ నిలిపివేయబడితే లేదా కాన్ఫిగర్ చేయబడకుంటే, హెచ్చరిక చూపబడిన తర్వాత ఫ్లాగ్ చేయబడిన సైట్కు వెళ్లడానికి వినియోగదారులు అనుతించబడతారు. @@ -3169,6 +3193,7 @@ ఇక్కడ "వెర్షన్" అంటే '61.0.3163.120' వంటి ఖచ్చితమైన వెర్షన్ కావచ్చు లేదా '61.0' వంటి వెర్షన్ ఆది ప్రత్యయం కావచ్చు </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> కోసం డిఫాల్ట్ HTML అందింపుదారు</translation> +<translation id="8544465954173828789">ఫోన్ నుండి Chromebookకు సమకాలీకరించాల్సిన SMS సందేశాలను అనుమతిస్తుంది.</translation> <translation id="8549772397068118889">కంటెంట్ ప్యాక్లకు వెలుపల ఉన్న సైట్లను సందర్శించేటప్పుడు హెచ్చరించు</translation> <translation id="8566842294717252664">కొత్త ట్యాబ్ పేజీ మరియు అనువర్తన లాంచర్ నుండి వెబ్ స్టోర్ను దాస్తుంది</translation> <translation id="8586528890725660268">వినియోగదారు ఉపయోగించకూడని ప్రింటర్లను పేర్కొంటుంది. @@ -3213,6 +3238,11 @@ ఈ విధానాన్ని సెట్ చేయకపోయినట్లయితే, పాస్వర్డ్ రక్షణ సేవ Google పాస్వర్డ్లకు మాత్రమే రక్షణ కల్పిస్తుంది, కానీ వినియోగదారు ఈ సెట్టింగ్ని మార్చుకోగలరు .</translation> <translation id="8672321184841719703">లక్ష్య స్వీయ నవీకరణ సంస్కరణ</translation> <translation id="867410340948518937">U2F (సార్వజనీన రెండవ కారకం)</translation> +<translation id="8682611302223077049">పెండింగ్లోని అప్డేట్ని అమలు చేయడం కోసం <ph name="PRODUCT_NAME" />ని రీలాంచ్ చేయాల్సిన లేదా <ph name="PRODUCT_OS_NAME" /> పరికరాన్ని పునఃప్రారంభించాల్సిన సంగతి వినియోగదారులకు ఎంత సమయ వ్యవధిలో గుర్తు చేయాలో, మిల్లీసెకన్లలో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. + + ఈ సమయ వ్యవధి తర్వాత, అప్డేట్ కోసం వినియోగదారుకి పదేపదే తెలియజేయబడుతుంది. <ph name="PRODUCT_OS_NAME" /> పరికరాల కోసం, అప్గ్రేడ్ గుర్తించినప్పుడు, సిస్టమ్ ట్రేలో పునఃప్రారంభ నోటిఫికేషన్ కనబడుతుంది. <ph name="PRODUCT_NAME" /> బ్రౌజర్ల కోసం, నోటిఫికేషన్ సమయంలో మూడవ వంతు పూర్తయిన తర్వాత రీలాంచ్ అవసరమని సూచించేలా యాప్ మెనూ మారుతుంది. నోటిఫికేషన్ సమయంలో రెండు వంతులు పూర్తయిన తర్వాత మరియు మళ్ళీ నోటిఫికేషన్ సమయం మొత్తం పూర్తయిన తర్వాత ఈ నోటిఫికేషన్ రంగు మారుతుంది. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> విధానం ద్వారా ప్రారంభించబడిన అదనపు నోటిఫికేషన్లు ఈ షెడ్యూల్ను అనుసరిస్తాయి. + + సెట్ చేయకపోతే, డిఫాల్ట్ సమయం 345600000 మిల్లీసెకన్లు (నాలుగు రోజులు) <ph name="PRODUCT_OS_NAME" /> పరికరాల కోసం, అలాగే 604800000 మిల్లీసెకన్లు (ఒక వారం) <ph name="PRODUCT_NAME" /> కోసం ఉపయోగించబడుతుంది.</translation> <translation id="8685024486845674965">పాస్వర్డ్ని తిరిగి ఉపయోగించినప్పుడు పాస్వర్డ్ రక్షణ హెచ్చరిక సక్రియం చేయబడుతుంది</translation> <translation id="8693243869659262736">అంతర్నిర్మిత DNS క్లయింట్ను ఉపయోగించండి</translation> <translation id="8704831857353097849">ఆపివేయబడిన ప్లగ్ఇన్ల జాబితా</translation> @@ -3250,6 +3280,7 @@ లెక్కింపు కారకం తప్పనిసరిగా 100% లేదా అంతకంటే ఎక్కువగా ఉండాలి. ప్రెజెంటేషన్ మోడ్లో సాధారణ స్క్రీన్ కాంతివిహీనత ఆలస్యం కంటే ముందుగా అమలయ్యే స్క్రీన్ కాంతివిహీనత ఆలస్య విలువలు అనుమతించబడవు.</translation> <translation id="8798099450830957504">డిఫాల్ట్</translation> +<translation id="8801680448782904838">బ్రౌజర్ రీలాంచ్ లేదా పరికరం పునఃప్రారంభం సిఫార్సు చేస్తున్నట్లు లేదా అవసరమని వినియోగదారుకు తెలియజేస్తుంది</translation> <translation id="8818173863808665831">పరికరం యొక్క భౌగోళిక సంస్కరణను నివేదించండి. విధానాన్ని సెట్ చేయకున్నా లేదా తప్పుకు సెట్ చేసినా, స్థానం నివేదించబడదు.</translation> @@ -3485,6 +3516,11 @@ ఈ విధానాన్ని ఒప్పుకు సెట్ చేస్తే, వినియోగదారు పరికరాన్ని షట్ డౌన్ చేసినప్పుడు <ph name="PRODUCT_OS_NAME" /> రీబూట్ను ట్రిగ్గర్ చేస్తుంది. <ph name="PRODUCT_OS_NAME" /> UIలో అన్ని సందర్భాల్లో కనిపించే షట్డౌన్ బటన్లను రీబూట్ బటన్లతో భర్తీ చేస్తుంది. వినియోగదారు పవర్ బటన్ను ఉపయోగించి పరికరాన్ని షట్ డౌన్ చేస్తే, విధానం ప్రారంభించబడి ఉన్నప్పటికీ స్వయంచాలకంగా రీబూట్ కాదు.</translation> <translation id="9152473318295429890">సంబంధిత వెబ్ పేజీల యొక్క సందర్భోచిత సూచనలను ప్రారంభించండి</translation> <translation id="9158929520101169054">బ్రౌజర్లో బహుళ సైన్-ఇన్లకు అనుమతించండి</translation> +<translation id="9159126470527871268">పెండింగ్లోని అప్డేట్ని అమలు చేయడం కోసం <ph name="PRODUCT_NAME" /> రీలాంచ్ చేయాలని లేదా <ph name="PRODUCT_OS_NAME" /> పునఃప్రారంభించాలని వినియోగదారులకు తెలియజేస్తుంది. + + ఈ విధానం సెట్టింగ్ బ్రౌజర్ రీలాంచ్ లేదా పరికరం పునఃప్రారంభం సిఫార్సు చేస్తున్నట్లు లేదా అవసరమన్నట్లు వినియోగదారుకు తెలియజేయడం కోసం నోటిఫికేషన్లను ప్రారంభిస్తుంది. సెట్ చేయకపోతే, దాని మెనూకు సూక్ష్మ మార్పుల ద్వారా రీలాంచ్ అవసరమని <ph name="PRODUCT_NAME" /> వినియోగదారుకు సూచిస్తుంది, దానిని సిస్టమ్ ట్రేలో నోటిఫికేషన్ ద్వారా <ph name="PRODUCT_OS_NAME" /> సూచిస్తుంది. ‘సిఫార్సు చేయబడింది’ అని సెట్ చేస్తే, రీలాంచ్ సిఫార్సు చేయబడిందని వినియోగదారుకు పునరావృతమయ్యే హెచ్చరిక చూపించబడుతుంది. రీలాంచ్ను వాయిదా వేయడానికి వినియోగదారు ఈ హెచ్చరికను విస్మరించవచ్చు. ‘అవసరం’ అని సెట్ చేస్తే, నోటిఫికేషన్ సమయం దాటిన తర్వాత బ్రౌజర్ రీలాంచ్ తప్పనిసరి అని సూచిస్తూ వినియోగదారుకు పునరావృతమయ్యే హెచ్చరిక చూపించబడుతుంది. డిఫాల్ట్ సమయం <ph name="PRODUCT_NAME" /> కోసం ఏడు రోజులు మరియు <ph name="PRODUCT_OS_NAME" /> కోసం నాలుగు రోజులు మరియు <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> విధానం సెట్టింగ్ ద్వారా కాన్ఫిగర్ చేయవచ్చు. + + రీలాంచ్/పునఃప్రారంభం తర్వాత వివియోగదారు సెషన్ పునరుద్ధరించబడుతుంది.</translation> <translation id="9165792353046089850">కనెక్ట్ చేయబడిన USB పరికరాలకు యాక్సెస్ని పొందడానికి వెబ్సైట్లను అనుమతించాలో లేదో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. యాక్సెస్ని పూర్తిగా బ్లాక్ చేయవచ్చు లేదా కనెక్ట్ చేయబడిన USB పరికరాల యొక్క యాక్సెస్ వెబ్సైట్కి అవసరమైన ప్రతిసారీ వినియోగదారుని అడగవచ్చు. 'WebUsbAskForUrls' మరియు 'WebUsbBlockedForUrls' విధానాలను ఉపయోగించి నిర్దిష్ట URL నమూనాల కోసం ఈ విధానాన్ని భర్తీ చేయవచ్చు.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 26a98480..fb35322b 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -346,6 +346,7 @@ <translation id="199764499252435679">เปิดใช้การอัปเดตคอมโพเนนต์ใน <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">การจัดการพลังงาน</translation> <translation id="201557587962247231">ความถี่ในการอัปโหลดรายงานสถานะของอุปกรณ์</translation> +<translation id="2017301949684549118">URL ของเว็บแอปที่จะติดตั้งแบบเงียบ</translation> <translation id="2018836497795982119">ระบุระยะเวลาเป็นมิลลิวินาทีที่ใช้ในการสอบถามข้อมูลนโยบายผู้ใช้จากบริการจัดการอุปกรณ์ การตั้งค่านโยบายนี้จะลบล้างค่าเริ่มต้นซึ่งอยู่ที่ 3 ชั่วโมง ค่าที่ใช้ได้สำหรับนโยบายนี้ต้องอยู่ในช่วงตั้งแต่ 1800000 (30 นาที) ถึง 86400000 (1 วัน) ค่าใดๆ ที่ไม่อยู่ในช่วงนี้จะถูกจำกัดตามขอบเขตที่เกี่ยวข้อง หากแพลตฟอร์มสนับสนุนการแจ้งเตือนตามนโยบาย การหน่วงเวลาการรีเฟรชจะตั้งค่าเป็น 24 ชั่วโมงเพราะคาดการณ์ว่าการแจ้งเตือนตามนโยบายจะบังคับให้รีเฟรชโดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนนโยบาย @@ -645,6 +646,11 @@ URL การค้นหาของ Google สามารถระบุเป็น: <ph name="GOOGLE_SEARCH_URL" />. นโยบายนี้จะต้องมีการตั้งค่าเมื่อมีการเปิดใช้นโยบาย "DefaultSearchProviderEnabled" และจะมีการใช้งานเฉพาะในกรณีนี้เท่านั้น</translation> +<translation id="2659019163577049044">หากเปิดใช้การตั้งค่านี้ ผู้ใช้จะตั้งค่าอุปกรณ์เพื่อซิงค์ข้อความ SMS ระหว่างโทรศัทพ์กับ Chromebook ได้ โปรดทราบว่าหากอนุญาตให้มีนโยบายนี้ ผู้ใช้ต้องเลือกใช้ฟีเจอร์นี้อย่างชัดเจนด้วยการทำตามขั้นตอนการตั้งค่าจนสมบูรณ์ เมื่อเสร็จแล้ว ผู้ใช้จะส่งและรับข้อความ SMS ใน Chromebook ได้ + + หากปิดใช้การตั้งค่านี้ ผู้ใช้จะตั้งค่าการซิงค์ SMS ไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะไม่อนุญาตให้ใช้ค่าเริ่มต้นสำหรับผู้ใช้ที่มีการจัดการ แต่จะอนุญาตสำหรับผู้ใช้ที่ไม่มีการจัดการ</translation> <translation id="2660846099862559570">ไม่ใช้พร็อกซี</translation> <translation id="267596348720209223">กำหนดการเข้ารหัสตัวอักษรที่สนับสนุนโดยผู้ให้บริการการค้นหา การเข้ารหัสหมายถึงชื่อหน้ารหัสอย่างเช่น UTF-8, GB2312 และ ISO-8859-1 โดยมีการนำมาใช้ตามลำดับที่ให้มา นโยบายนี้เป็นทางเลือก หากไม่ตั้งค่าไว้ จะมีการใช้ค่าเริ่มต้นซึ่งก็คือ UTF-8 นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย "DefaultSearchProviderEnabled" เท่านั้น</translation> <translation id="268577405881275241">เปิดใช้ฟีเจอร์พร็อกซีการบีบอัดข้อมูล</translation> @@ -710,7 +716,6 @@ หากคุณปิดใช้การตั้งค่านี้หรือไม่กำหนดค่า หน้าตัวอย่างก่อนพิมพ์จะใช้เครื่องพิมพ์ที่ใช้งานล่าสุดเป็นทางเลือกปลายทางเริ่มต้น หากคุณเปิดใช้การตั้งค่านี้ หน้าตัวอย่างก่อนพิมพ์จะใช้เครื่องพิมพ์เริ่มต้นของระบบปฏิบัติการเป็นทางเลือกปลายทางเริ่มต้น</translation> -<translation id="2867699958489427143">ย้อนกลับไปใช้เวอร์ชันเป้าหมายและใช้เวอร์ชันเป้าหมายเสมอหากใช้ระบบปฏิบัติการเวอร์ชันที่ใหม่กว่า ทำ Powerwash เต็มรูปแบบในขั้นตอนนี้</translation> <translation id="2872961005593481000">ปิด</translation> <translation id="2874209944580848064">หมายเหตุสำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ที่รองรับแอป Android:</translation> <translation id="2877225735001246144">ปิดใช้งานการค้นหา CNAME เมื่อมีการเจรจาตรวจสอบสิทธิ์ Kerberos</translation> @@ -949,7 +954,6 @@ <translation id="3711895659073496551">ระงับการใช้งาน</translation> <translation id="3715569262675717862">การตรวจสอบสิทธิ์ที่ใช้ใบรับรองไคลเอ็นต์</translation> <translation id="3736879847913515635">เปิดใช้การเพิ่มบุคคลในการจัดการผู้ใช้</translation> -<translation id="3737544779868348650">ชื่อโฮสต์ของเครือข่ายอุปกรณ์</translation> <translation id="3746590506846867985"> นโยบายนี้ใช้กับหน้าจอลงชื่อเข้าใช้ โปรดดูเพิ่มเติมที่นโยบาย <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ซึ่งใช้กับเซสชันของผู้ใช้ ขอแนะนำให้ตั้งทั้ง 2 นโยบายเป็นค่าเดียวกัน ค่าที่ไม่ตรงกันอาจทำให้เกิดความล่าช้าเมื่อเข้าสู่เซสชันผู้ใช้ขณะที่ใช้ค่าตามนโยบายผู้ใช้ หากเปิดใช้นโยบาย ต้นทางแต่ละแห่งที่มีชื่อในรายการที่คั่นด้วยจุลภาคจะทำงานในโปรเซสของตัวเอง และยังเป็นการแยกต้นทางที่ตั้งชื่อตามโดเมนย่อย เช่น การระบุ https://example.com/ จะแยก https://foo.example.com/ ด้วย เนื่องจากเป็นส่วนหนึ่งของเว็บไซต์ https://example.com/ @@ -1056,6 +1060,7 @@ แต่ละรายการจะมีพจนานุกรมที่ต้องมี ID ส่วนขยายในฟิลด์ "extension-id" และ URL การอัปเดตในฟิลด์ "update-url"</translation> <translation id="3874773863217952418">เปิดใช้การแตะเพื่อค้นหา</translation> <translation id="3877517141460819966">โหมดการตรวจสอบสิทธิ์จากปัจจัยที่สองที่ผสานรวม</translation> +<translation id="3879208481373875102">กำหนดค่ารายการเว็บแอปที่บังคับติดตั้งแล้ว</translation> <translation id="388237772682176890">นโยบายนี้เลิกใช้งานใน M53 และนำออกจาก M54 เนื่องจากไม่มีการสนับสนุน SPDY/3.1 อีกต่อไป ปิดใช้โปรโตคอล SPDY ใน <ph name="PRODUCT_NAME" /> @@ -1284,6 +1289,10 @@ หากต้องการดูคำอธิบายแบบเต็มของการตั้งค่าที่เป็นไปได้และโครงสร้างของนโยบายนี้ โปรดไปที่ https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">โหมดประมวลผล Loopback ของนโยบายด้านผู้ใช้</translation> +<translation id="4554841826517980623">นโยบายนี้ใช้กำหนดว่าฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายของ <ph name="PRODUCT_NAME" /> ควรใช้<ph name="NETBIOS_PROTOCOL" /> เพื่อค้นหาการแชร์ในเครือข่ายหรือไม่ + เมื่อตั้งค่านโยบายนี้เป็น "จริง" การค้นหาการแชร์จะใช้โปรโตคอล<ph name="NETBIOS_PROTOCOL" /> เพื่อค้นหาการแชร์ในเครือข่าย + เมื่อตั้งค่านโยบายนี้เป็น "เท็จ" การค้นหาการแชร์จะไม่ใช้โปรโตคอล<ph name="NETBIOS_PROTOCOL" /> เพื่อค้นหาการแชร์ + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้ค่าเริ่มต้นสำหรับผู้ใช้ที่จัดการโดยองค์กร แต่จะเปิดใช้สำหรับผู้ใช้ที่ไม่มีการจัดการ</translation> <translation id="4555850956567117258">เปิดใช้งานการยืนยันระยะไกลสำหรับผู้ใช้</translation> <translation id="4557134566541205630">URL หน้าแท็บใหม่ของผู้ให้บริการการค้นหาเริ่มต้น</translation> <translation id="4567137030726189378">อนุญาตการใช้งานเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation> @@ -1677,6 +1686,7 @@ หากนโยบายนี้ไม่ได้มีการตั้งค่า เสียงพูดตอบรับจะถูกปิดใช้งานเมื่อหน้าจอการเข้าสู่ระบบแสดงเป็นครั้งแรก ผู้ใช้สามารถเปิดหรือปิดใช้งานเสียงพูดตอบรับได้ตลอดเวลา และสถานะของเสียงพูดตอบรับบนหน้าจอการเข้าสู่ระบบจะยังคงอยู่ระหว่างผู้ใช้</translation> <translation id="5868414965372171132">การกำหนดค่าเครือข่ายระดับผู้ใช้</translation> +<translation id="5879014913445067283">ควบคุมการค้นหาพื้นที่แชร์ไฟล์ของเครือข่ายผ่าน <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">การตั้งค่าคุกกี้เริ่มต้น</translation> <translation id="5887414688706570295">กำหนดค่าส่วนนำหน้าของ TalkGadget ที่จะถูกใช้โดยโฮสต์การเข้าถึงระยะไกลและป้องกันไม่ให้ผู้ใช้ทำการเปลี่ยนแปลง @@ -2117,6 +2127,17 @@ <translation id="7049373494483449255">เปิดใช้งาน <ph name="PRODUCT_NAME" /> ให้ทำการส่งเอกสารไปยัง <ph name="CLOUD_PRINT_NAME" /> สำหรับการพิมพ์ หมายเหตุ: นโยบายนี้มีผลเฉพาะกับการสนับสนุน <ph name="CLOUD_PRINT_NAME" /> ใน <ph name="PRODUCT_NAME" /> โดยไม่ได้ป้องกันผู้ใช้จากการส่งงานพิมพ์บนเว็บไซต์ หากการตั้งค่านี้เปิดใช้งานหรือไม่ได้กำหนดค่า ผู้ใช้จะสามารถพิมพ์ไป <ph name="CLOUD_PRINT_NAME" /> จากช่องโต้ตอบการพิมพ์ของ <ph name="PRODUCT_NAME" /> หากการตั้งค่านี้ถูกปิดใช้งาน ผู้ใช้ไม่สามารถพิมพ์ไป <ph name="CLOUD_PRINT_NAME" /> จากช่องโต้ตอบการพิมพ์ของ <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">นโยบายนี้บังคับให้นำเข้าบุ๊กมาร์กจากเบราว์เซอร์เริ่มต้นปัจจุบันหากมีการเปิดใช้งาน หากเปิดใช้งาน นโยบายนี้ยังมีผลต่อข้อความโต้ตอบการนำเข้าด้วย หากปิดใช้งาน จะไม่มีการนำเข้าบุ๊กมาร์ก หากไม่มีการตั้งค่าไว้ ผู้ใช้อาจจะได้รับคำถามว่าจะนำเข้าหรือไม่ หรือการนำเข้าอาจเกิดขึ้นโดยอัตโนมัติ</translation> <translation id="7063895219334505671">อนุญาตให้แสดงป๊อปอัปบนไซต์เหล่านี้</translation> +<translation id="706568410943497889"> + หากตั้งค่านโยบายเป็น "จริง" <ph name="PRODUCT_NAME" /> จะได้รับอนุญาตให้รวบรวมบันทึกเหตุการณ์ WebRTC จากบริการของ Google (เช่น Google Meet) และอัปโหลดบันทึกไปยัง Google + + หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า <ph name="PRODUCT_NAME" /> จะรวบรวมหรืออัปโหลดบันทึกเช่นนี้ไม่ได้ + + บันทึกเหล่านี้มีข้อมูลการวินิจฉัยซึ่งเป็นประโยชน์เมื่อแก้ไขข้อบกพร่องเกี่ยวกับการโทรด้วยเสียงหรือการโทรแบบวิดีโอคอลใน Chrome เช่น เวลาและขนาดของแพ็กเก็ต RTP ที่ส่งและได้รับ ผลป้อนกลับเกี่ยวกับความคับคั่งในเครือข่าย ตลอดจนข้อมูลเมตาเกี่ยวกับระยะเวลาและคุณภาพของเสียงและเฟรมของวิดีโอ บันทึกเหล่านี้ไม่มีเนื้อหาเสียงหรือวิดีโอจากการโทร + + มีเฉพาะบริการผ่านเว็บของ Google อย่างเช่น Google Hangouts หรือ Google Meet ที่จะเรียกใช้การรวบรวมข้อมูลนี้ได้ + + Google อาจเชื่อมโยงบันทึกเหล่านี้ (โดยใช้รหัสเซสชัน) กับบันทึกอื่นๆ ที่บริการของ Google รวบรวมไว้เอง โดยมีจุดประสงค์เพื่อให้แก้ไขข้อบกพร่องได้ง่ายขึ้น + </translation> <translation id="706669471845501145">อนุญาตให้ไซต์แสดงการแจ้งเตือนของเดสก์ท็อป</translation> <translation id="7072208053150563108">อัตราการเปลี่ยนรหัสผ่านโดยเครื่อง</translation> <translation id="7074513465313721551">กำหนดค่ารายการโดเมนที่ Safe Browsing จะเชื่อถือซึ่งหมายถึง @@ -2248,6 +2269,9 @@ <translation id="7336878834592315572">เก็บคุกกี้ไว้ในระหว่างช่วงเวลาของเซสชัน</translation> <translation id="7340034977315324840">รายงานจำนวนครั้งของกิจกรรมบนอุปกรณ์</translation> <translation id="7343497214039883642">ไฟล์การกำหนดค่าเครื่องพิมพ์องค์กรสำหรับอุปกรณ์</translation> +<translation id="7349338075015720646">ระบุรายชื่อเว็บไซต์ที่ติดตั้งแบบเงียบ (ผู้ใช้ไม่ต้องดำเนินการ) ซึ่งผู้ใช้ถอนการติดตั้งหรือปิดใช้ไม่ได้ + + รายการแต่ละรายการในนโยบายคือออบเจ็กต์ที่มีสมาชิก 2 อย่างคือ "url" และ "launch_container" โดย "url" ควรเป็น URL ของเว็บแอปที่จะติดตั้งและ "launch_container" ควรเป็น "หน้าต่าง" หรือ "แท็บ" ซึ่งแสดงลักษณะที่เว็บแอปนั้นจะเปิดขึ้นเมื่อติดตั้งแล้ว หากไม่ระบุ "launch_container" แอปจะเปิดขึ้นในหน้าต่างในกรณีที่ Chrome พิจารณาว่าเป็น Progressive Web App และเปิดในแท็บหากพิจารณาว่าเป็นอย่างอื่น</translation> <translation id="7367028210010532881">บริการ Safe Browsing จะแสดงหน้าคำเตือนเมื่อผู้ใช้กำลังไปยังเว็บไซต์ที่ถูกแจ้งว่าอาจเป็นอันตราย การเปิดใช้การตั้งค่านี้จะป้องกันไม่ให้ผู้ใช้ดำเนินการต่อจากหน้าคำเตือนไปยังเว็บไซต์ที่เป็นอันตราย หากปิดใช้การตั้งค่านี้หรือไม่ได้กำหนดค่าไว้ ผู้ใช้จะเลือกไปต่อยังเว็บไซต์ที่ถูกแจ้งหลังจากเห็นคำเตือนได้ @@ -2704,6 +2728,7 @@ ในที่นี้ "เวอร์ชัน" เป็นได้ทั้งเวอร์ชันที่เจาะจงอย่าง "61.0.3163.120" หรือเลขนำหน้าเวอร์ชันอย่าง "61.0" ก็ได้ </translation> <translation id="8544375438507658205">โปรแกรมแสดง HTML เริ่มต้นสำหรับ <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">อนุญาตให้ซิงค์ข้อความ SMS จากโทรศัพท์ไปยัง Chromebook</translation> <translation id="8549772397068118889">เตือนเมื่อไปที่เว็บไซต์ภายนอกชุดเนื้อหา</translation> <translation id="8566842294717252664">ซ่อนเว็บสโตร์จากหน้าแท็บใหม่และเครื่องเรียกใช้งานแอป</translation> <translation id="8586528890725660268">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานไม่ได้ @@ -2748,6 +2773,11 @@ หากไม่ได้ตั้งค่านโยบายนี้ บริการปกป้องรหัสผ่านจะปกป้องเฉพาะรหัสผ่าน Google แต่ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้</translation> <translation id="8672321184841719703">กำหนดเป้าหมายรุ่นที่อัปเดตอัตโนมัติ</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> +<translation id="8682611302223077049">อนุญาตให้คุณตั้งค่าระยะเวลา (หน่วยเป็นมิลลิวินาที) ที่จะแสดงการแจ้งเตือนให้ผู้ใช้ทราบว่าต้องเปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่หรือต้องรีสตาร์ทอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> เพื่อนำอัปเดตที่รอดำเนินการไปใช้ + + ระหว่างช่วงเวลานี้ ผู้ใช้จะได้รับการแจ้งเตือนอยู่เรื่อยๆ ว่าต้องอัปเดต สำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> การแจ้งเตือนให้รีสตาร์ทจะปรากฏในถาดระบบเมื่อพบการอัปเกรด สำหรับเบราว์เซอร์ <ph name="PRODUCT_NAME" /> เมนูแอปจะเปลี่ยนไปเพื่อบ่งชี้ว่าผู้ใช้ต้องเปิดเบราว์เซอร์ขึ้นมาใหม่เมื่อระยะเวลาแจ้งเตือนผ่านไป 1 ใน 3 จากนั้น การแจ้งเตือนจะเปลี่ยนสีเมื่อระยะเวลาแจ้งเตือนผ่านไป 2 ใน 3 ของระยะเวลาทั้งหมด และเปลี่ยนสีอีกครั้งเมื่อการแจ้งเตือนครบกำหนด การแจ้งเตือนอื่นๆ ที่เปิดใช้โดยนโยบาย <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> จะเป็นไปตามกำหนดเวลานี้ + + หากไม่ได้ตั้งค่า ระบบจะใช้ระยะเวลาเริ่มต้นที่ 345,600,000 มิลลิวินาที (4 วัน) สำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> และ 604,800,000 มิลลิวินาที (1 สัปดาห์) สำหรับ <ph name="PRODUCT_NAME" /></translation> <translation id="8685024486845674965">เรียกใช้การแจ้งเตือนการป้องกันด้วยรหัสผ่านเมื่อมีการใช้รหัสผ่านซ้ำ</translation> <translation id="8693243869659262736">ใช้ไคลเอ็นต์ DNS ในตัว</translation> <translation id="8704831857353097849">รายการปลั๊กอินที่ปิดใช้งาน</translation> @@ -2784,6 +2814,7 @@ แฟกเตอร์การปรับระดับต้องเป็น 100% หรือมากกว่า ไม่อนุญาตให้ใช้ค่าที่จะทำให้การหน่วงเวลาการสลัวหน้าจอในโหมดการนำเสนอสั้นกว่าการหน่วงเวลาการสลัวหน้าจอปกติ</translation> <translation id="8798099450830957504">ค่าเริ่มต้น</translation> +<translation id="8801680448782904838">แจ้งผู้ใช้ว่าควรหรือจำเป็นต้องเปิดเบราว์เซอร์ขึ้นมาใหม่หรือรีสตาร์ทอุปกรณ์</translation> <translation id="8818173863808665831">รายงานตำแหน่งทางภูมิศาสตร์ของอุปกรณ์ หากไม่ได้ตั้งค่านโยบายนี้เอาไว้ หรือตั้งค่าเป็นเท็จ ตำแหน่งจะไม่ถูกรายงาน</translation> @@ -2940,6 +2971,10 @@ หากนโยบายตั้งค่าเป็น True <ph name="PRODUCT_OS_NAME" /> จะทริกเกอร์การเริ่มอุปกรณ์ใหม่เมื่อผู้ใช้ปิดอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> จะแทนรายการปุ่มปิดทั้งหมดใน UI ด้วยปุ่มเริ่มต้นใหม่ หากผู้ใช้ปิดอุปกรณ์ด้วยปุ่มเปิด/ปิด เครื่องจะไม่เริ่มต้นใหม่โดยอัตโนมัติ แม้ว่าจะเปิดใช้นโยบายก็ตาม</translation> <translation id="9152473318295429890">เปิดใช้คำแนะนำตามบริบทของหน้าเว็บที่เกี่ยวข้อง</translation> <translation id="9158929520101169054">อนุญาตการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชีในเบราว์เซอร์</translation> +<translation id="9159126470527871268">แจ้งให้ผู้ใช้ทราบว่าต้องเปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่หรือต้องรีสตาร์ท <ph name="PRODUCT_OS_NAME" /> เพื่อนำอัปเดตที่รอดำเนินการไปใช้ + + การตั้งค่านโยบายนี้จะเปิดใช้การแจ้งเตือนที่จะบอกว่าผู้ใช้ควรหรือจำเป็นต้องเปิดเบราว์เซอร์ขึ้นมาใหม่หรือรีสตาร์ทอุปกรณ์ หากไม่ได้ตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> จะแจ้งผู้ใช้ว่าจำเป็นต้องมีการเปิดขึ้นมาใหม่ผ่านการเปลี่ยนแปลงเพียงเล็กน้อยในเมนู ส่วน <ph name="PRODUCT_OS_NAME" /> จะแจ้งข้อความเช่นนี้ผ่านการแจ้งเตือนในถาดระบบ หากตั้งค่าเป็น "แนะนำ" ระบบจะแสดงคำเตือนที่เกิดซ้ำแก่ผู้ใช้ว่าขอแนะนำให้เปิดขึ้นมาใหม่ ผู้ใช้ปิดคำเตือนนี้เพื่อเลื่อนการเปิดใหม่ได้ หากตั้งค่าเป็น "จำเป็น" ระบบจะแสดงคำเตือนที่เกิดซ้ำแก่ผู้ใช้ว่าจะมีการบังคับเปิดเบราว์เซอร์ใหม่หลังจากสิ้นสุดระยะการแจ้งเตือน โดยค่าเริ่มต้น ระยะเวลาดังกล่าวคือ 7 วันสำหรับ <ph name="PRODUCT_NAME" /> และ 4 วันสำหรับ <ph name="PRODUCT_OS_NAME" /> แต่คุณกำหนดค่าผ่านการตั้งค่านโยบาย <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ได้ + ระบบจะคืนค่าเซสชันของผู้ใช้หลังการเปิดใหม่/รีสตาร์ท</translation> <translation id="9165792353046089850">ให้คุณกำหนดว่าจะอนุญาตให้เว็บไซต์ต่างๆ เข้าถึงอุปกรณ์ USB ที่เชื่อมต่ออยู่ไหม คุณจะบล็อกการเข้าถึงโดยสิ้นเชิง หรือให้เว็บไซต์ขออนุญาตจากผู้ใช้ทุกครั้งที่ต้องการเข้าถึงอุปกรณ์ USB ที่เชื่อมต่ออยู่ก็ได้ คุณลบล้างนโยบายนี้สำหรับรูปแบบ URL บางรูปแบบได้โดยใช้นโยบาย "WebUsbAskForUrls" และ "WebUsbBlockedForUrls"
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 0cf03de..935028a 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -344,6 +344,7 @@ <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> ürününde bileşen güncellemelerini etkinleştir</translation> <translation id="2006530844219044261">Güç yönetimi</translation> <translation id="201557587962247231">Cihaz durumu raporlarının yüklenme sıklığı</translation> +<translation id="2017301949684549118">Web Uygulamalarının URL'leri sessizce yüklenir.</translation> <translation id="2018836497795982119">Cihaz yönetim hizmetinin, kullanıcı politikası bilgileri için sorgulanma süresini milisaniye olarak belirtir. Bu politika ayarlandığında varsayılan değer (3 saat) geçersiz olur. Bu politika için geçerli değerler 1800000 (30 dakika) ile 86400000 (1 gün) aralığındadır. Bu aralıkta bulunmayan değerler ilgili sınıra çekilir. Politika değiştiğinde politika bildirimlerinin otomatik olarak bir yenilemeyi zorlaması beklendiğinden, platform politika bildirimlerini destekliyorsa yenileme gecikmesi 24 saate ayarlanır. @@ -654,6 +655,11 @@ Google'ın arama URL'si şu şekilde belirtilebilir: <ph name="GOOGLE_SEARCH_URL" /> , "DefaultSearchProviderEnabled" politikası etkinleştirildiğinde bu seçenek ayarlanmalıdır ve yalnızca bu durumda uygulanır.</translation> +<translation id="2659019163577049044">Bu ayar etkinleştirilirse kullanıcıların cihazlarını kurarak telefonları ve Chromebook'ları arasında SMS mesajlarını senkronize etmelerine izin verilir. Bu politikaya izin verilirse kullanıcıların bir kurulum akışını tamamlayarak bu özelliği açık bir şekilde etkinleştirmeleri gerekeceğini unutmayın. Kurulum akışı tamamlandıktan sonra, kullanıcılar kendi Chromebook'larından SMS mesajları gönderip alabilirler. + + Bu ayar devre dışı bırakılırsa kullanıcıların SMS senkronizasyonunu kurmasına izin verilmez. + + Bu politika ayarlanmadan bırakılırsa varsayılan değer, yönetilen kullanıcılara izin verilmemesi ve yönetilmeyen kullanıcılara izin verilmesi şeklindedir.</translation> <translation id="2660846099862559570">Hiçbir zaman proxy kullanma</translation> <translation id="267596348720209223">Arama sağlayıcısı tarafından desteklenen karakter kodlamalarını belirtir. Kodlamalar, UTF-8, GB2312 ve ISO-8859-1 gibi kod sayfası adlarıdır. Bunlar, sağlandıkları sırada denenirler. @@ -724,7 +730,6 @@ Bu ayarı devre dışı bırakır veya bir değer ayarlamazsanız Baskı Önizleme, varsayılan seçenek olarak en son kullanılan yazıcıyı kullanır. Bu ayarı etkinleştirirseniz Baskı Önizleme, varsayılan hedef seçenek olarak işletim sisteminin varsayılan yazıcısını kullanır.</translation> -<translation id="2867699958489427143">OS sürümü hedeften daha yeniyse sürümü geri alıp hedef sürümde kalır. Bu süreçte tam bir powerwash işlemi gerçekleştirir.</translation> <translation id="2872961005593481000">Kapat</translation> <translation id="2874209944580848064">Android uygulamalarını destekleyen <ph name="PRODUCT_OS_NAME" /> cihazlarına ilişkin not:</translation> <translation id="2877225735001246144">Kerberos kimlik doğrulaması anlaşmasını yaparken CNAME aramasını devre dışı bırak</translation> @@ -966,7 +971,6 @@ <translation id="3711895659073496551">Askıya al</translation> <translation id="3715569262675717862">İstemci sertifikalarına dayalı kimlik doğrulama</translation> <translation id="3736879847913515635">Kullanıcı yöneticisinde kişi eklemeyi etkinleştir</translation> -<translation id="3737544779868348650">Cihaz ağı ana makine adı</translation> <translation id="3746590506846867985"> 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ı oturumuna giriş sırasında kullanıcı politikası tarafından belirtilen değer uygulanırken gecikme olabilir. Bu politika etkinleştirilirse 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. @@ -1072,6 +1076,7 @@ Her bir liste girişi, 'extension-id' alanında uzantı kimliği ve 'update-url' alanında güncelleme URL'si bulunması gereken bir sözlük içerir.</translation> <translation id="3874773863217952418">Dokun ve Ara'yı Etkinleştir</translation> <translation id="3877517141460819966">Entegre iki etmenli kimlik doğrulama modu</translation> +<translation id="3879208481373875102">Zorunlu yüklenmiş Web Uygulamaları listesini yapılandır</translation> <translation id="388237772682176890">SPDY/3.1 desteği kaldırıldığı için bu politika M53 sürümünde kullanımdan kaldırılmış ve M54 sürümünde üründen çıkarılmıştır. <ph name="PRODUCT_NAME" /> ürününde SPDY protokolünün kullanımını devre dışı bırakır. @@ -1316,6 +1321,10 @@ Bu politikanın mümkün olan tüm ayarları ve yapısıyla ilgili tam açıklama için lütfen https://www.chromium.org/administrators/policy-list-3/extension-settings-full adresini ziyaret edin. </translation> <translation id="4554651132977135445">Kullanıcı politikası geri döngü işleme modu</translation> +<translation id="4554841826517980623">Bu politika, <ph name="PRODUCT_NAME" /> için Ağ Üzerinde Dosya Paylaşımı özelliğinin ağdaki paylaşımları keşfetmek için <ph name="NETBIOS_PROTOCOL" /> protokolünü kullanıp kullanamayacağını kontrol eder. + Bu politika True (Doğru) değerine ayarlandığında, paylaşım keşfi işlevi ağdaki paylaşımları keşfetmek için <ph name="NETBIOS_PROTOCOL" /> protokolünü kullanır. + Bu politika False (Yanlış) değerine ayarlandığında, paylaşım keşfi işlevi paylaşımları keşfetmek için <ph name="NETBIOS_PROTOCOL" /> protokolünü kullanmaz. + Politika ayarlanmadan bırakılırsa varsayılan değer, kurumsal olarak yönetilen kullanıcılar için politikanın devre dışı bırakılması ve yönetilmeyen kullanıcılar için etkinleştirilmesi şeklinde olur.</translation> <translation id="4555850956567117258">Kullanıcı için uzaktan doğrulamayı etkinleştir</translation> <translation id="4557134566541205630">Varsayılan arama sağlayıcısı yeni sekme sayfası URL'si</translation> <translation id="4567137030726189378">Geliştirici Araçları'nın kullanımına izin verir</translation> @@ -1736,6 +1745,7 @@ Bu politika ayarlanmadan bırakılırsa, giriş ekranı ilk kez gösterildiğinde sesli geri bildirim devre dışıdır. Kullanıcılar sesli geri bildirimi her zaman etkinleştirebilir veya devre dışı bırakabilir ve sesli geri bildirimin giriş ekranındaki durumu kullanıcılar arasında kalıcıdır.</translation> <translation id="5868414965372171132">Kullanıcı düzeyi ağ yapılandırması</translation> +<translation id="5879014913445067283"><ph name="NETBIOS_NAME" /> aracılığıyla Ağ Üzerinde Dosya Paylaşımı keşfini kontrol et</translation> <translation id="5883015257301027298">Varsayılan çerezler ayarı</translation> <translation id="5887414688706570295">Uzaktan erişim ana makineleri tarafından kullanılacak olan TalkGadget önekini yapılandırır ve kullanıcıların bunu değiştirmesini önler. @@ -2197,6 +2207,17 @@ Ayarlanmazsa, kullanıcıdan içe aktarma işlemini gerçekleştirmesi istenebilir veya içe aktarma otomatik olarak gerçekleşebilir.</translation> <translation id="7063895219334505671">Bu sitelerde pop-up'lara izin ver</translation> +<translation id="706568410943497889"> + Bu politika doğru (true) değerine ayarlanırsa, <ph name="PRODUCT_NAME" /> ürünün Google hizmetlerinden (ör. Google Meet) WebRTC etkinlik günlüklerini toplamasına ve bu günlükleri Google'a yüklemesine izin verilir. + + Bu politika yanlış (false) değerine ayarlanır veya ayarlanmadan bırakılırsa, <ph name="PRODUCT_NAME" /> ürünü bu tür günlükleri toplayamaz veya yükleyemez. + + Bu günlükler, Chrome'daki sesli veya görüntülü çağrılarla ilgili, gönderilen ve alınan RTP paketlerinin saati ve boyutu, ağdaki tıkanmayla ilgili geri bildirim ve ses ve video karelerinin zamanı ve kalitesiyle ilgili meta veriler gibi sorunların ayıklanmasında yararlı olacak teşhis bilgilerini içerir. + + Chrome'un gerçekleştirdiği bu veri toplama işlemi yalnızca Google Hangouts veya Google Meet gibi bir Google web hizmeti tarafından tetiklenebilir. + + Google bu günlükleri bir oturum kimliği aracılığıyla, Google hizmetinin kendisi tarafından toplanan diğer günlüklerle ilişkilendirebilir; bu özellikle, hata ayıklamayı kolaylaştırmak amaçlanmıştır. + </translation> <translation id="706669471845501145">Sitelerin masaüstü bildirimi göstermesine izin ver</translation> <translation id="7072208053150563108">Makine şifresi değişim hızı</translation> <translation id="7074513465313721551">Güvenli Tarama'nın güveneceği alanların listesini yapılandırın. Bunun anlamı şudur: @@ -2328,6 +2349,9 @@ <translation id="7336878834592315572">Oturum süresince çerezleri tutma</translation> <translation id="7340034977315324840">Cihaz etkinlik zamanlarını rapor et</translation> <translation id="7343497214039883642">Cihazlar için kurumsal yazıcı yapılandırma dosyası</translation> +<translation id="7349338075015720646">Kullanıcı etkileşimi olmadan, sessizce yüklenen ve kullanıcı tarafından yüklemesi kaldırılamayan veya devre dışı bırakılamayan web sitelerinin bir listesini belirtir. + + Politikanın her liste öğesi, iki üyeli bir nesnedir: "url" ve "launch_container". "url", yüklenecek web uygulamasının URL'si olmalı ve "launch_container", Web Uygulamasının yüklendikten sonra nasıl açılacağını belirtmek için "window" veya "tab" değerini almalıdır. "launch_container" değeri ihmal edilirse ve Chrome, uygulamayı bir Progresif Web Uygulaması olarak değerlendirirse uygulama bir pencerede; aksi halde, bir sekmede başlar.</translation> <translation id="7367028210010532881">Güvenli Tarama hizmeti, kullanıcıların, kötü amaçlı kod yükleme potansiyeli olduğu işaretlenmiş sitelere gitmesi durumunda bir uyarı sayfası görüntüler. Bu ayar etkinleştirildiğinde kullanıcılar uyarı sayfasından zararlı siteye geçemezler. Bu ayar devre dışı bırakılırsa veya yapılandırılmazsa uyarı görüntülendikten sonra kullanıcılar devam ederek işaretli siteyi ziyaret edebilirler. @@ -2789,6 +2813,7 @@ Buradaki "Sürüm" değeri, "61.0.3163.120" gibi kesin bir sürüm düzeyi veya "61.0" gibi bir sürüm öneki olabilir. </translation> <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> için varsayılan HTML oluşturucusu</translation> +<translation id="8544465954173828789">SMS Mesajlarının telefondan Chromebook'a senkronize edilmesine izin ver</translation> <translation id="8549772397068118889">İçerik paketlerinin dışındaki siteleri ziyaret ederken uyar</translation> <translation id="8566842294717252664">Yeni sekme sayfasında ve uygulama başlatıcıda web mağazasını gizle</translation> <translation id="8586528890725660268">Bir kullanıcının kullanamayacağı yazıcıları belirtir. @@ -2838,6 +2863,11 @@ Bu politikanın ayarlanmadan bırakılması halinde şifre koruma hizmeti yalnızca Google şifrelerini korur ancak kullanıcı bu ayarı değiştirebilir.</translation> <translation id="8672321184841719703">Hedef Otomatik Güncelleme Sürümü</translation> <translation id="867410340948518937">U2F (Evrensel İkinci Faktör)</translation> +<translation id="8682611302223077049">Beklemedeki bir güncellemenin uygulanması için <ph name="PRODUCT_NAME" /> ürününün veya bir <ph name="PRODUCT_OS_NAME" /> cihazının yeniden başlatılması gerektiği konusunda kullanıcıların bilgilendirileceği dönemi milisaniye cinsinden ayarlamanıza olanak tanır. + + Bu dönem boyunca, kullanıcı güncelleme gereksinimi konusunda tekrarlanan bir şekilde bilgilendirilir. <ph name="PRODUCT_OS_NAME" /> cihazlarda, yeni sürüme geçme olanağı tespit edildiğinde sistem tepsisinde bir yeniden başlatma bildirimi görüntülenir. <ph name="PRODUCT_NAME" /> tarayıcılarda, yeniden başlatmanın gerektiğini belirtmek için bildirim döneminin üçte biri geçtikten sonra uygulama menüsü değişir. Bu bildirimin rengi, bildirim döneminin üçte ikisi ve tam bildirim dönemi sona erdikten sonra değişir. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> politikasıyla etkinleştirilen ek bildirimler bu programa uyar. + + Bu değer ayarlanmazsa <ph name="PRODUCT_OS_NAME" /> cihazlarda varsayılan dönem için 345600000 milisaniye (dört gün) ve <ph name="PRODUCT_NAME" /> için 604800000 milisaniye (bir hafta) değerleri kullanılır.</translation> <translation id="8685024486845674965">Şifre koruma uyarısı, şifre yeniden kullanımıyla tetiklendi</translation> <translation id="8693243869659262736">Dahili DNS istemcisini kullan</translation> <translation id="8704831857353097849">Devre dışı bırakılmış eklentilerin listesi</translation> @@ -2882,6 +2912,7 @@ Ölçekleme faktörü %100 veya daha fazla olmalıdır. Sunum modunda ekran kararma gecikmesini normal ekran kararma gecikmesine göre daha da kısaltacak değerlere izin verilmez.</translation> <translation id="8798099450830957504">Varsayılan</translation> +<translation id="8801680448782904838">Kullanıcıya tarayıcının veya cihazın yeniden başlatılmasının önerildiğini ya da gerektiğini bildir</translation> <translation id="8818173863808665831">Cihazın coğrafi konumunu bildirin. Bu politika ayarlanmazsa veya yanlış seçeneğine ayarlanırsa konum bildirilmez.</translation> @@ -3029,6 +3060,11 @@ Bu politika doğru seçeneğine ayarlanırsa, kullanıcı cihazı kapattığında <ph name="PRODUCT_OS_NAME" />, yeniden başlatma işlemi tetikler. <ph name="PRODUCT_OS_NAME" />, kullanıcı arayüzündeki tüm kapatma düğmelerini yeniden başlatma düğmeleriyle değiştirir. Kullanıcı güç düğmesini kullanarak cihazı kapatırsa, politika etkinleştirilmiş olsa dahi cihaz otomatik olarak yeniden başlatılmaz.</translation> <translation id="9152473318295429890">İlişkili web sayfalarının bağlam önerilerini etkinleştir</translation> <translation id="9158929520101169054">Tarayıcıda Çoklu Oturum Açmaya İzin Ver</translation> +<translation id="9159126470527871268">Kullanıcılara, bekleyen bir güncellemeyi uygulamak için <ph name="PRODUCT_NAME" /> uygulamasının veya <ph name="PRODUCT_OS_NAME" /> cihazının yeniden başlatılması gerektiğini bildirin. + + Bu politika ayarı, kullanıcıya tarayıcının veya cihazın yeniden başlatılmasının önerildiği ya da gerektiği bilgisini verecek bildirimleri etkinleştirir. Bir değer ayarlanmazsa <ph name="PRODUCT_NAME" />, menüsündeki küçük değişiklikler aracılığıyla kullanıcıya uygulamanın yeniden başlatılması gerektiğini belirtir. Diğer yandan <ph name="PRODUCT_OS_NAME" />, sistem tepsisinde bir bildirim aracılığıyla böyle bir gerekliliği bildirir. "Önerilen" seçeneği ayarlanırsa, kullanıcıya uygulamayı yeniden başlatmasının önerildiği yinelenen bir uyarı ile bildirilir. Kullanıcı, yeniden başlatmayı ertelemek için bu uyarıyı kapatabilir. "Zorunlu" değeri ayarlanırsa kullanıcıya, bildirim dönemi geçtikten sonra tarayıcının yeniden başlatılmasının zorlanacağını belirten yinelenen bir uyarı gösterilir. Varsayılan dönem <ph name="PRODUCT_NAME" /> için yedi gün, <ph name="PRODUCT_OS_NAME" /> için dört gündür ve <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> politika ayarı aracılığıyla yapılandırılabilir. + + Yeniden başlatmanın ardından kullanıcı oturumu yeniden açılır.</translation> <translation id="9165792353046089850">Web sitelerinin bağlı USB cihazlarına erişim sağlamalarına izin verilip verilmeyeceğini ayarlamanıza olanak tanır. Erişim tamamıyla engellenebilir veya bir web sitesinin bağlı USB cihazlarına erişim sağlamak istediği her defasında, kullanıcıya onay verip vermediği sorulabilir. Bu politika "WebUsbAskForUrls" ve "WebUsbBlockedForUrls" politikaları kullanılarak belirli URL kalıpları için geçersiz kılınabilir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 0f4f44dbd..9984314b 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -354,6 +354,7 @@ <translation id="199764499252435679">Увімкнути оновлення компонентів у <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Керування живленням</translation> <translation id="201557587962247231">Частота завантаження звіту про статус пристрою</translation> +<translation id="2017301949684549118">URL-адреси веб-додатків для фонового встановлення.</translation> <translation id="2018836497795982119">Указує період (у мілісекундах), упродовж якого в службу керування пристроєм надсилається запит щодо інформації про правила для користувача. Якщо це правило налаштовано, замінюється значення за умовчанням (3 години). Дійсні значення для цього правила – у діапазоні від 1 800 000 (30 хвилин) до 86 400 000 (1 день). Значення, які не входять у цей діапазон, прив’язуються до відповідної межі. Якщо платформа підтримує сповіщення про порушення правил, оновлення затримуватимуться на 24 години, оскільки очікується, що через ці сповіщення оновлення відбуватиметься автоматично, щоразу коли змінюється правило. @@ -657,6 +658,11 @@ Можна вказати таку URL-адресу результатів миттєвого пошуку Google: <ph name="GOOGLE_SEARCH_URL" />. Цей параметр потрібно налаштовувати, коли ввімкнено правило DefaultSearchProviderEnabled. Він застосовується лише в цьому випадку.</translation> +<translation id="2659019163577049044">Якщо це налаштування ввімкнено, користувачі зможуть синхронізувати SMS-повідомлення між телефонами й пристроями Chromebook. Зауважте: якщо це правило дозволено, користувачі мають явно ввімкнути цю функцію, налаштувавши її. Після цього вони зможуть надсилати й отримувати SMS-повідомлення на пристроях Chromebook. + + Якщо це налаштування вимкнено, користувачі не зможуть налаштувати синхронізацію SMS. + + Якщо це правило не налаштовано, його зможуть застосовувати лише користувачі, якими не керує адміністратор.</translation> <translation id="2660846099862559570">Ніколи не використовувати проксі-сервер</translation> <translation id="267596348720209223">Указує системи кодування символів, які підтримуються пошуковою службою. Системи кодування – це назви сторінок кодів, як-от UTF-8, GB2312 та ISO-8859-1. Вони використовуються по порядку. Це правило не обов’язкове. Якщо його не встановлено, використовується значення за умовчанням, тобто UTF-8. Це правило застосовується, лише коли ввімкнено правило "DefaultSearchProviderEnabled".</translation> <translation id="268577405881275241">Увімкнути проксі-сервер стиснення даних</translation> @@ -723,7 +729,6 @@ Якщо це правило вимкнено або не налаштовано, у режимі попереднього перегляду друку за умовчанням використовуватиметься останній використаний принтер. Якщо це правило ввімкнено, у режимі попереднього перегляду друку використовуватиметься принтер операційної системи за умовчанням.</translation> -<translation id="2867699958489427143">Відкочуватися до цільової версії та використовувати її, якщо версія ОС новіша. Під час процедури виконується Powerwash.</translation> <translation id="2872961005593481000">Завершити роботу</translation> <translation id="2874209944580848064">Примітка для пристроїв <ph name="PRODUCT_OS_NAME" />, які підтримують додатки Android.</translation> <translation id="2877225735001246144">Вимкнути пошук CNAME під час узгодження автентифікації за протоколом Kerberos</translation> @@ -960,7 +965,6 @@ <translation id="3711895659073496551">Призупинити</translation> <translation id="3715569262675717862">Автентифікація на основі сертифікатів клієнта</translation> <translation id="3736879847913515635">Додавати користувачів у диспетчері користувачів</translation> -<translation id="3737544779868348650">Ім’я хосту мережі пристрою</translation> <translation id="3746590506846867985"> Це правило діє для екрана входу. Також перегляньте правило <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, яке застосовується до сеансу користувача. Радимо вибрати однакове значення для обох правил. Інакше сеанс користувача може починатись із затримкою, оскільки застосовуватиметься значення, указане в політиці користувача. Якщо це правило ввімкнено, кожне джерело в списку значень, відокремлених комами, відкривається окремо. Також ізолюються джерела з іменами субдоменів. Наприклад, якщо вказати https://example.com/, буде ізольовано https://foo.example.com/ як частину сайту https://example.com/. @@ -1067,6 +1071,7 @@ Кожен запис списку містить словник, у який мають входити ідентифікатор розширення в полі "extension-id" й URL-адреса оновлення в полі "update-url".</translation> <translation id="3874773863217952418">Увімкнути функцію "Торкніться, щоб шукати"</translation> <translation id="3877517141460819966">Вбудовано режим двофакторної автентифікації</translation> +<translation id="3879208481373875102">Налаштувати список примусово встановлених веб-додатків</translation> <translation id="388237772682176890">Це правило не діє у версії M53 та видалено у версії M54, оскільки підтримку протоколу SPDY/3.1 припинено. Вимикає використання протоколу SPDY у продукті <ph name="PRODUCT_NAME" />. @@ -1298,6 +1303,10 @@ Повний опис можливих параметрів і структури цього правила можна переглянути на сторінці https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Режим обробки зациклення політики користувача</translation> +<translation id="4554841826517980623">Це правило визначає, чи функція спільних мережевих файлів у службі <ph name="PRODUCT_NAME" /> має використовувати <ph name="NETBIOS_PROTOCOL" />, щоб виявляти обмін файлами в мережі. + Якщо для цього правила вибрано значення true, функція використовуватиме протокол <ph name="NETBIOS_PROTOCOL" />, щоб виявляти обмін файлами в мережі. + Якщо для цього правила вибрано значення false, функція не використовуватиме протокол <ph name="NETBIOS_PROTOCOL" />, щоб виявляти обмін файлами в мережі. + Якщо це правило не налаштовано, його зможуть застосовувати лише користувачі, якими не керує адміністратор.</translation> <translation id="4555850956567117258">Вмикає віддалене підтвердження даних для користувача</translation> <translation id="4557134566541205630">URL-адреса сторінки нової вкладки пошукової системи за умовчанням</translation> <translation id="4567137030726189378">Дозволяє використання Інструментів розробника</translation> @@ -1692,6 +1701,7 @@ Якщо це правило не встановлено, голосові підказки вимикаються під час першої появи екрана входу. Користувачі можуть вмикати чи вимикати голосові підказки будь-коли, і такий вибір на екрані входу буде чинним для всіх користувачів.</translation> <translation id="5868414965372171132">Налаштування мережі на рівні користувача</translation> +<translation id="5879014913445067283">Керувати виявленням спільних мережевих файлів через <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Налаштування файлів cookie за умовчанням</translation> <translation id="5887414688706570295">Налаштовує префікс TalkGadget, який використовується хостами віддаленого доступу, і не дозволяє користувачам змінювати його. @@ -2125,6 +2135,17 @@ <translation id="7049373494483449255">Дозволяє <ph name="PRODUCT_NAME" /> надсилати документи в службу <ph name="CLOUD_PRINT_NAME" /> для друку. ПРИМІТКА. Це впливає лише на підтримку <ph name="CLOUD_PRINT_NAME" /> у <ph name="PRODUCT_NAME" />. Це не забороняє користувачам надсилати завдання друку на веб-сайтах. Якщо це налаштування ввімкнено чи не встановлено, користувачі можуть друкувати в службі <ph name="CLOUD_PRINT_NAME" /> з діалогового вікна друку в <ph name="PRODUCT_NAME" />. Якщо це налаштування вимкнено, користувачі можуть друкувати в службі <ph name="CLOUD_PRINT_NAME" /> з діалогового вікна друку в <ph name="PRODUCT_NAME" /></translation> <translation id="7053678646221257043">Якщо це правило ввімкнено, закладки імпортуються з поточного веб-переглядача за умовчанням. Якщо його ввімкнено, це правило також впливає на діалогове вікно імпортування. Якщо вимкнено, закладки не імпортуються. Якщо це правило не встановлено, користувач отримує запит на імпортування або імпортування розпочинається автоматично.</translation> <translation id="7063895219334505671">Дозволити спливаючі вікна на цих сайтах</translation> +<translation id="706568410943497889"> + Якщо для правила встановлено значення true, служба <ph name="PRODUCT_NAME" /> може збирати журнали подій WebRTC із сервісів Google (як-от Google Meet) і завантажувати їх у Google. + + Якщо для правила вибрано значення false або його не налаштовано, <ph name="PRODUCT_NAME" /> не може збирати й завантажувати такі журнали. + + Ці журнали містять діагностичні дані, які допомагають вирішити проблеми з аудіо- й відеовикликами в Chrome, як-от час надсилання й отримання пакетів RTP та їх розмір, відгуки про перевантаження мережі й метадані про час і якість фреймів аудіо та відео. Аудіо- й відеовміст викликів не включається в журнали. + + Збір цих даних у Chrome можуть активувати лише веб-сервіси Google, як-от Google Hangouts або Google Meet. + + Google може пов’язувати ці журнали за допомогою ідентифікатора сеансу з іншими журналами, зібраними сервісом Google, щоб спростити налагодження. + </translation> <translation id="706669471845501145">Дозволяти сайтам показувати сповіщення на робочому столі</translation> <translation id="7072208053150563108">Швидкість зміни пароля пристрою</translation> <translation id="7074513465313721551">Налаштовує список надійних доменів для Безпечного перегляду. Це означає: @@ -2256,6 +2277,9 @@ <translation id="7336878834592315572">Зберігати файли cookie впродовж сеансу</translation> <translation id="7340034977315324840">Повідомляти про періоди активності пристрою</translation> <translation id="7343497214039883642">Файл конфігурації принтерів пристроїв підприємства</translation> +<translation id="7349338075015720646">Визначає список веб-сайтів, які встановлюються фоново, без дій із боку користувача. Користувач не може видалити або вимкнути їх. + + Кожен елемент списку правила – це об’єкт із двома частинами: url і launch_container. url – це URL-адреса веб-додатка для встановлення, а для launch_container потрібно вказати значення window або tab, щоб визначити, як веб-додаток відкриватиметься після встановлення. Коли launch_container опущено, додаток запускатиметься у вікні, якщо Chrome розпізнає його як прогресивний веб-додаток, а в іншому випадку – у вкладці.</translation> <translation id="7367028210010532881">Служба Безпечний перегляд показує сторінку застереження, коли користувачі переходять на сайти, які вважаються потенційно шкідливими. Якщо цей параметр увімкнено, користувачі не можуть переходити зі сторінки застереження на шкідливий сайт. Якщо цей параметр вимкнено або не налаштовано, користувачі можуть вибрати, чи переходити після показу застереження на потенційно шкідливий сайт. @@ -2710,6 +2734,7 @@ Тут "версія" може означати точний номер (як-от "61.0.3163.120") або префікс версії (як-от "'61.0"). </translation> <translation id="8544375438507658205">Відтворення у форматі HTML за умовчанням для <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Синхронізувати SMS-повідомлення на телефоні з Chromebook.</translation> <translation id="8549772397068118889">Попереджає про відвідування сайтів, які не входять у пакети вмісту</translation> <translation id="8566842294717252664">Ховати значок веб-магазину на сторінці нової вкладки та на панелі запуску додатків</translation> <translation id="8586528890725660268">Указує принтери, недоступні для користувачів. @@ -2753,6 +2778,11 @@ Якщо це правило не налаштовано, служба захисту паролів працюватиме лише для паролів Google. Цей параметр можна змінити.</translation> <translation id="8672321184841719703">Цільова версія автоматичного оновлення</translation> <translation id="867410340948518937">U2F (універсальний другий фактор)</translation> +<translation id="8682611302223077049">Дає змогу встановити період часу (у мілісекундах), протягом якого користувачі бачитимуть сповіщення про те, що потрібно перезапустити службу <ph name="PRODUCT_NAME" /> або перезавантажити пристрій <ph name="PRODUCT_OS_NAME" />, щоб застосувати оновлення, яке очікує на розгляд. + + Протягом цього часу користувач регулярно отримуватиме сповіщення щодо необхідності оновлення. На пристроях <ph name="PRODUCT_OS_NAME" /> сповіщення щодо перезавантаження з’являтиметься на панелі завдань, коли буде виявлено оновлення. У веб-переглядачах <ph name="PRODUCT_NAME" /> змінюється меню додатків, щоб повідомити про необхідність перезапуску, коли минає третина часу для оновлення. Коли минає дві третини вказаного часу, сповіщення змінює колір, а потім ще раз, коли час закінчується. Додаткові сповіщення, які вмикає правило <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, працюють так само. + + Якщо час не налаштовано, використовується період за умовчанням – 345 600 000 мілісекунд (чотири дні) для пристроїв <ph name="PRODUCT_OS_NAME" /> і 604 800 000 мілісекунд (один тиждень) для служби <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Застереження про захист паролем активується під час повторного введення пароля</translation> <translation id="8693243869659262736">Використовувати вдубований клієнт DNS</translation> <translation id="8704831857353097849">Список вимкнених плагінів</translation> @@ -2789,6 +2819,7 @@ Коефіцієнт масштабування має становити 100% або більше. Значення, які викликають меншу затримку затемнення екрана у режимі презентації, ніж звичайна затримка, не дозволяються.</translation> <translation id="8798099450830957504">За умовчанням</translation> +<translation id="8801680448782904838">Сповіщати користувача про рекомендований чи обов’язковий перезапуск веб-переглядача або пристрою</translation> <translation id="8818173863808665831">Повідомляє географічне місцезнаходження пристрою. Якщо це правило не встановлено чи його значення встановлено як "false", місцезнаходження не повідомлятиметься.</translation> @@ -2945,6 +2976,11 @@ Якщо вибрано значення "true", <ph name="PRODUCT_OS_NAME" /> перезапускатиме пристрій, коли користувач намагатиметься його вимкнути. <ph name="PRODUCT_OS_NAME" /> замінює всі кнопки вимкнення в інтерфейсі на кнопки перезавантаження. Якщо користувач вимкне пристрій за допомогою кнопки живлення, пристрій не перезавантажиться, навіть якщо правило ввімкнено.</translation> <translation id="9152473318295429890">Вмикає контекстні пропозиції пов’язаних веб-сторінок</translation> <translation id="9158929520101169054">Дозволити паралельний вхід у веб-переглядачі</translation> +<translation id="9159126470527871268">Повідомляти користувачів, що потрібно перезапустити службу <ph name="PRODUCT_NAME" /> або перезавантажити <ph name="PRODUCT_OS_NAME" />, щоб застосувати оновлення, яке очікує на розгляд. + + Це правило дає змогу надсилати користувачеві сповіщення щодо рекомендованого чи обов’язкового перезапуску веб-переглядача або перезавантаження пристрою. Якщо правило не налаштовано, служба <ph name="PRODUCT_NAME" /> повідомляє користувачеві про необхідність перезапуску за допомогою незначних змін у своєму меню, а <ph name="PRODUCT_OS_NAME" /> – через сповіщення на панелі завдань. Якщо для правила вибрано значення "Рекомендовано" (Recommended), користувач регулярно бачитиме застереження з рекомендацією перезапуску. Його можна закрити, щоб відкласти перезапуск. Якщо для правила вибрано значення "Обов’язково" (Required), користувач регулярно бачитиме застереження про те, що веб-переглядач примусово перезапуститься, щойно вказаний у сповіщенні період закінчиться. За умовчанням цей термін триває сім днів для служби <ph name="PRODUCT_NAME" /> і чотири дні для <ph name="PRODUCT_OS_NAME" />. Його можна налаштувати за допомогою правила <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Після перезапуску сеанс користувача відновлюється.</translation> <translation id="9165792353046089850">Дозволяє вказувати, чи можуть веб-сайти отримувати доступ до підключених пристроїв USB. Його можна заблокувати повністю або запитувати користувача щоразу, коли веб-сайт просить про доступ до підключених пристроїв USB. Для певних шаблонів URL-адрес це правило можна замінювати правилами WebUsbAskForUrls і WebUsbBlockedForUrls.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 0a989d2..44c1214 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -353,6 +353,7 @@ <translation id="199764499252435679">Cho phép cập nhật thành phần trong <ph name="PRODUCT_NAME" /></translation> <translation id="2006530844219044261">Quản lý nguồn</translation> <translation id="201557587962247231">Tần suất tải lên báo cáo trạng thái thiết bị</translation> +<translation id="2017301949684549118">URL dùng để cài đặt tự động Ứng dụng web.</translation> <translation id="2018836497795982119">Chỉ định khoảng thời gian tính bằng mili giây mà dịch vụ quản lý thiết bị được truy vấn về thông tin chính sách người dùng. Đặt chính sách này sẽ ghi đè giá trị mặc định là 3 giờ. Các giá trị hợp lệ dành cho chính sách này nằm trong khoảng từ 1800000 (30 phút) tới 86400000 (1 ngày). Mọi giá trị không nằm trong khoảng này sẽ được giới hạn ở mức tương ứng. Nếu nền tảng hỗ trợ thông báo chính sách, độ trễ làm mới sẽ được đặt thành 24 giờ vì thông báo chính sách được kỳ vọng sẽ buộc làm mới tự động bất cứ khi nào chính sách thay đổi. @@ -671,6 +672,11 @@ Có thể chỉ định URL tìm kiếm của Google dưới dạng: <ph name="GOOGLE_SEARCH_URL" />. Phải đặt tùy chọn này khi chính sách 'DefaultSearchProviderEnabled' được bật và sẽ chỉ được áp dụng nếu chính sách này được bật.</translation> +<translation id="2659019163577049044">Nếu bật mục cài đặt này, người dùng sẽ được phép thiết lập thiết bị của mình để đồng bộ hóa tin nhắn SMS giữa điện thoại và Chromebook. Hãy lưu ý rằng nếu cho phép chính sách này, người dùng phải chắc chắn bật tính năng này bằng cách hoàn tất quy trình thiết lập. Sau khi thiết lập xong, người dùng có thể gửi và nhận tin nhắn SMS trên Chromebook. + + Nếu tắt mục cài đặt này, người dùng sẽ không được phép thiết lập tính năng đồng bộ hóa SMS. + + Nếu không đặt chính sách này, chế độ mặc định sẽ là không được phép đối với người dùng được quản lý và được phép đối với người dùng không được quản lý.</translation> <translation id="2660846099862559570">Không bao giờ sử dụng proxy</translation> <translation id="267596348720209223">Chỉ định các mã hóa ký tự được nhà cung cấp dịch vụ tìm kiếm hỗ trợ. Mã hóa là các tên trang mã như UTF-8, GB2312 và ISO-8859-1. Các mã này được thử theo thứ tự cung cấp. @@ -742,7 +748,6 @@ Nếu bạn tắt cài đặt này hoặc không đặt giá trị, tính năng Xem trước bản in sẽ chọn máy in đã sử dụng gần đây nhất làm máy in mặc định. Nếu bạn bật cài đặt này, tính năng Xem trước bản in sẽ chọn máy in có sẵn trong hệ điều hành làm máy in mặc định.</translation> -<translation id="2867699958489427143">Khôi phục và sử dụng phiên bản đích nếu phiên bản hệ điều hành mới hơn phiên bản đích. Thực hiện powerwash đầy đủ trong quá trình này.</translation> <translation id="2872961005593481000">Tắt</translation> <translation id="2874209944580848064">Lưu ý dành cho thiết bị <ph name="PRODUCT_OS_NAME" /> hỗ trợ ứng dụng Android:</translation> <translation id="2877225735001246144">Tắt tra cứu CNAME khi thỏa thuận xác thực Kerberos</translation> @@ -986,7 +991,6 @@ <translation id="3711895659073496551">Tạm ngừng</translation> <translation id="3715569262675717862">Xác thực dựa trên chứng chỉ ứng dụng khách</translation> <translation id="3736879847913515635">Cho phép thêm người trong trình quản lý người dùng</translation> -<translation id="3737544779868348650">Tên máy chủ của mạng thiết bị</translation> <translation id="3746590506846867985"> Chính sách này áp dụng cho màn hình đăng nhập. Vui lòng xem thêm 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 về cùng một giá trị. Nếu các giá trị 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. 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. Việc này cũng sẽ cô lập 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ô lập vì là một phần của trang web https://example.com/. @@ -1095,6 +1099,7 @@ Mỗi mục nhập trong danh sách chứa một từ điển. Từ điển này phải bao gồm ID tiện ích trong trường 'extension-id' và URL cập nhật trong trường 'update-url'.</translation> <translation id="3874773863217952418">Bật tính năng Nhấn để tìm kiếm</translation> <translation id="3877517141460819966">Chế độ xác thực hai yếu tố tích hợp</translation> +<translation id="3879208481373875102">Định cấu hình danh sách Ứng dụng web bắt buộc cài đặt</translation> <translation id="388237772682176890">Chính sách này không được dùng trong M53 nữa và bị xóa trong M54, vì hỗ trợ của SPDY/3.1 đã bị xóa. Không cho phép sử dụng giao thức SPDY trong <ph name="PRODUCT_NAME" />. @@ -1337,6 +1342,10 @@ Để biết mô tả đầy đủ về các cài đặt có thể thực hiện được và cấu trúc của chính sách này, vui lòng truy cập vào https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">Chế độ xử lý vòng lặp trở lại của chính sách người dùng</translation> +<translation id="4554841826517980623">Chính sách này kiểm soát việc tính năng Chia sẻ tệp trong mạng dành cho <ph name="PRODUCT_NAME" /> có phải dùng <ph name="NETBIOS_PROTOCOL" /> để phát hiện các mục chia sẻ trên mạng hay không. + Nếu đặt chính sách này thành True, tính năng phát hiện chia sẻ sẽ dùng giao thức <ph name="NETBIOS_PROTOCOL" /> để phát hiện các mục chia sẻ trên mạng. + Nếu đặt chính sách này thành False, tính năng phát hiện chia sẻ sẽ không dùng giao thức <ph name="NETBIOS_PROTOCOL" /> để phát hiện các mục chia sẻ trên mạng. + Nếu không đặt chính sách này, chế độ mặc định sẽ là tắt đối với người dùng do doanh nghiệp quản lý và bật đối với người dùng không được quản lý.</translation> <translation id="4555850956567117258">Cho phép chứng thực từ xa cho người dùng</translation> <translation id="4557134566541205630">URL trang tab mới của nhà cung cấp dịch vụ tìm kiếm mặc định</translation> <translation id="4567137030726189378">Cho phép sử dụng Công cụ dành cho nhà phát triển</translation> @@ -1761,6 +1770,7 @@ Nếu không đặt chính sách này, phản hồi bằng giọng nói bị tắt khi màn hình đăng nhập hiển thị lần đầu. Người dùng có thể bật hoặc tắt phản hồi bằng giọng nói bất cứ lúc nào và trạng thái của tính năng này trên màn hình đăng nhập được duy trì giữa những người dùng.</translation> <translation id="5868414965372171132">Cấu hình mạng ở mức người dùng</translation> +<translation id="5879014913445067283">Kiểm soát tính năng phát hiện Chia sẻ tệp trong mạng thông qua <ph name="NETBIOS_NAME" /></translation> <translation id="5883015257301027298">Cài đặt cookie mặc định</translation> <translation id="5887414688706570295">Định cấu hình tiền tố TalkGadget sẽ được máy chủ truy cập từ xa sử dụng và ngăn người dùng thay đổi tiền tố này. @@ -2221,6 +2231,17 @@ Nếu không thiết lập chính sách này, người dùng có thể được hỏi có nhập hay không hoặc quá trình nhập có thể diễn ra tự động.</translation> <translation id="7063895219334505671">Cho phép cửa sổ bật lên trên các trang web này</translation> +<translation id="706568410943497889"> + Nếu đặt chính sách này thành true, thì <ph name="PRODUCT_NAME" /> được phép thu thập nhật ký sự kiện WebRTC từ các dịch vụ của Google (ví dụ như Google Meet) và tải các nhật ký đó lên Google. + + Nếu đặt chính sách này thành false hoặc không đặt, thì <ph name="PRODUCT_NAME" /> có thể sẽ không thu thập cũng như tải các nhật ký đó lên. + + Các nhật ký này chứa thông tin chẩn đoán hữu ích khi gỡ lỗi sự cố về cuộc gọi âm thanh hoặc video trên Chrome, chẳng hạn như thời gian và kích thước gói RTP gửi đi và nhận được, phản hồi về tình trạng nghẽn mạng cũng như siêu dữ liệu về thời gian và chất lượng của khung video và âm thanh. Các nhật ký này không chứa nội dung âm thanh hoặc video của cuộc gọi. + + Chỉ các dịch vụ web của Google, chẳng hạn như Google Hangouts hoặc Google Meet, mới có thể kích hoạt chức năng thu thập dữ liệu này trên Chrome. + + Thông qua ID phiên, Google có thể liên kết các nhật ký này với các nhật ký khác do dịch vụ của Google tự thu thập, nhằm giúp quá trình gỡ lỗi trở nên dễ dàng hơn. + </translation> <translation id="706669471845501145">Cho phép các trang web hiển thị thông báo trên màn hình</translation> <translation id="7072208053150563108">Tần suất thay đổi mật khẩu máy</translation> <translation id="7074513465313721551">Định cấu hình danh sách các miền mà tính năng Duyệt web an toàn sẽ tin tưởng. Điều này có nghĩa là: @@ -2352,6 +2373,9 @@ <translation id="7336878834592315572">Lưu giữ cookie trong thời hạn phiên</translation> <translation id="7340034977315324840">Báo cáo thời gian hoạt động của thiết bị</translation> <translation id="7343497214039883642">Tệp cấu hình máy dành cho in doanh nghiệp cho các thiết bị</translation> +<translation id="7349338075015720646">Xác định danh sách các trang web được cài đặt tự động mà không cần sự can thiệp của người dùng và các trang web mà người dùng không thể gỡ cài đặt cũng như tắt. + + Mỗi mục danh sách của chính sách này là một đối tượng chứa hai thành phần: "url" và "launch_container". "url" phải là URL của ứng dụng web cần cài đặt và "launch_container" phải là "cửa sổ" hoặc "tab" để xác định cách mở Ứng dụng web sau khi cài đặt. Khi thiếu phần "launch_container", ứng dụng sẽ chạy trong cửa sổ nếu Chrome cho rằng đây là Ứng dụng web tiến bộ, nếu không thì ứng dụng sẽ chạy trong tab.</translation> <translation id="7367028210010532881">Dịch vụ Duyệt web an toàn hiển thị trang cảnh báo khi người dùng chuyển đến các trang web được gắn cờ là có thể độc hại. Việc bật mục cài đặt này sẽ ngăn người dùng vẫn tiếp tục truy cập vào trang web độc hại từ trang cảnh báo. Nếu bạn đã tắt hoặc chưa định cấu hình mục cài đặt này, thì người dùng sẽ có thể chọn tiếp tục truy cập vào trang web bị gắn cờ sau khi cảnh báo hiển thị. @@ -2807,6 +2831,7 @@ Ở đây, "Phiên bản" có thể là phiên bản chính xác như '61.0.3163.120' hoặc tiền tố của phiên bản như '61.0' </translation> <translation id="8544375438507658205">Trình hiển thị HTML mặc định dành cho <ph name="PRODUCT_FRAME_NAME" /></translation> +<translation id="8544465954173828789">Cho phép đồng bộ hóa Tin nhắn SMS từ điện thoại sang Chromebook.</translation> <translation id="8549772397068118889">Cảnh báo khi truy cập vào các trang web nằm ngoài gói nội dung</translation> <translation id="8566842294717252664">Ẩn cửa hàng trực tuyến khỏi trang tab mới và trình chạy ứng dụng</translation> <translation id="8586528890725660268">Chỉ định các máy in mà người dùng không thể sử dụng. @@ -2851,6 +2876,11 @@ Nếu bạn không đặt chính sách này, thì dịch vụ bảo vệ mật khẩu sẽ chỉ bảo vệ mật khẩu của Google nhưng người dùng có thể thay đổi tùy chọn cài đặt này.</translation> <translation id="8672321184841719703">Phiên bản cập nhật tự động đích</translation> <translation id="867410340948518937">U2F (Hai yếu tố chung)</translation> +<translation id="8682611302223077049">Cho phép đặt khoảng thời gian tính bằng mili giây mà người dùng nhận được thông báo phải chạy lại <ph name="PRODUCT_NAME" /> hoặc khởi động lại thiết bị chạy <ph name="PRODUCT_OS_NAME" /> để áp dụng bản cập nhật đang chờ xử lý. + + Trong khoảng thời gian này, người dùng sẽ được nhắc lại nhiều lần về việc cần phải cập nhật. Đối với các thiết bị chạy <ph name="PRODUCT_OS_NAME" />, thông báo khởi động lại sẽ xuất hiện trong khay hệ thống khi phát hiện có bản nâng cấp. Đối với các trình duyệt <ph name="PRODUCT_NAME" />, menu ứng dụng sẽ thay đổi để cho thấy cần chạy lại sau khi hết một phần ba thời gian thông báo. Thông báo này sẽ đổi màu khi hết hai phần ba thời gian thông báo và đổi màu một lần nữa khi hết toàn bộ thời gian thông báo. Các thông báo bổ sung được bật theo chính sách <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> cũng tuân theo lịch biểu này. + + Nếu người dùng không đặt chính sách thì khoảng thời gian mặc định là 345600000 mili giây (bốn ngày) đối với thiết bị chạy <ph name="PRODUCT_OS_NAME" /> và 604800000 mili giây (một tuần) đối với <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Cảnh báo bảo vệ mật khẩu được kích hoạt bằng cách sử dụng lại mật khẩu</translation> <translation id="8693243869659262736">Sử dụng máy khách DNS tích hợp</translation> <translation id="8704831857353097849">Danh sách plugin bị tắt</translation> @@ -2895,6 +2925,7 @@ Hệ số tỷ lệ phải từ 100% trở lên. Không cho phép các giá trị làm cho độ trễ mờ màn hình trong chế độ bản trình bày ngắn hơn độ trễ mờ màn hình thông thường.</translation> <translation id="8798099450830957504">Mặc định</translation> +<translation id="8801680448782904838">Thông báo cho người dùng biết họ cần hoặc bắt buộc phải chạy lại trình duyệt hoặc khởi động lại thiết bị</translation> <translation id="8818173863808665831">Báo cáo vị trí địa lý của thiết bị. Nếu chính sách này không được đặt hoặc được đặt thành false, vị trí sẽ không được báo cáo.</translation> @@ -3058,6 +3089,11 @@ Nếu chính sách này được đặt thành true, <ph name="PRODUCT_OS_NAME" /> sẽ kích hoạt khởi động lại khi người dùng tắt thiết bị. <ph name="PRODUCT_OS_NAME" /> sẽ thay thế tất cả số lần xuất hiện nút tắt trong Giao diện người dùng bằng nút khởi động lại. Nếu người dùng tắt thiết bị bằng nút nguồn thì thiết bị đó sẽ không tự động khởi động lại ngay cả khi đã bật chính sách.</translation> <translation id="9152473318295429890">Bật nội dung đề xuất theo ngữ cảnh của các trang web liên quan</translation> <translation id="9158929520101169054">Cho phép đăng nhập nhiều tài khoản trong trình duyệt</translation> +<translation id="9159126470527871268">Thông báo cho người dùng biết phải chạy lại <ph name="PRODUCT_NAME" /> hoặc khởi động lại <ph name="PRODUCT_OS_NAME" /> để áp dụng bản cập nhật đang chờ xử lý. + + Tùy chọn cài đặt chính sách này sẽ bật thông báo nhắc nhở người dùng rằng họ cần hoặc bắt buộc phải chạy lại trình duyệt hoặc khởi động lại thiết bị. Nếu người dùng không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ cho người dùng biết rằng họ cần chạy lại thông qua các thay đổi nhỏ đối với menu của sản phẩm, trong khi <ph name="PRODUCT_OS_NAME" /> cho biết điều đó thông qua thông báo trong khay hệ thống. Nếu người dùng đặt chính sách thành 'Đề xuất', một cảnh báo lặp lại sẽ hiển thị cho người dùng biết rằng họ cần chạy lại. Người dùng có thể bỏ qua cảnh báo này để hoãn việc chạy lại. Nếu người dùng đặt chính sách thành 'Bắt buộc', một cảnh báo lặp lại sẽ hiển thị cho người dùng biết rằng họ bắt buộc phải chạy lại trình duyệt sau khi hết khoảng thời gian thông báo. Khoảng thời gian này mặc định là 7 ngày đối với <ph name="PRODUCT_NAME" /> và 4 ngày đối với <ph name="PRODUCT_OS_NAME" /> và có thể định cấu hình thông qua cài đặt chính sách <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />. + + Phiên của người dùng sẽ được khôi phục sau khi chạy lại/khởi động.</translation> <translation id="9165792353046089850">Cho phép bạn đặt liệu có cho phép trang web truy cập vào các thiết bị USB đã kết nối hay không. Quyền truy cập có thể bị chặn hoàn toàn hoặc người dùng có thể được hỏi mỗi khi trang web muốn truy cập vào các thiết bị USB đã kết nối. Có thể ghi đè chính sách này cho các mẫu URL cụ thể bằng chính sách 'WebUsbAskForUrls' và 'WebUsbBlockedForUrls'.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 063b19d..392ceb7 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -323,6 +323,7 @@ <translation id="199764499252435679">允许更新 <ph name="PRODUCT_NAME" /> 中的组件</translation> <translation id="2006530844219044261">电源管理</translation> <translation id="201557587962247231">设备状态报告的上传频率</translation> +<translation id="2017301949684549118">要静默安装的网络应用的网址。</translation> <translation id="2018836497795982119">指定向设备管理服务查询用户政策信息的周期(以毫秒为单位)。 设置此政策将会覆盖默认值(3 小时)。此政策的有效值范围为 1800000(30 分钟)至 86400000(1 天)。低于 1800000 的值将被调整为 1800000,高于 86400000 的值将被调整为 86400000。如果平台支持政策通知,刷新延迟时间将被设为 24 小时,这是因为只要政策发生变化,政策通知应该会自动强制进行刷新。 @@ -610,6 +611,11 @@ 您可以按以下格式指定 Google 的搜索网址:<ph name="GOOGLE_SEARCH_URL" />。 “DefaultSearchProviderEnabled”政策处于启用状态时,必须设置此选项,并且只有在这种情况下此选项才能发挥作用。</translation> +<translation id="2659019163577049044">如果此设置处于启用状态,用户将能够设置他们的设备,以便在手机和 Chromebook 之间同步短信。请注意:此政策处于启用状态时,如果用户想要使用短信同步功能,必须完成一个设置流程,以便明确选择启用这项功能。设置流程完成后,用户将能够在 Chromebook 上收发短信。 + + 如果此设置处于停用状态,用户将不能设置短信同步功能。 + + 如果此政策未设置,默认情况下,受管理用户将不能使用短信同步功能,不受管理的用户则可以。</translation> <translation id="2660846099862559570">从不使用代理</translation> <translation id="267596348720209223">指定搜索服务提供商支持的字符编码。编码是指类似于 UTF-8、GB2312 和 ISO-8859-1 的代码页名称,并按此顺序进行尝试。此政策是可选的,如果未设置,将使用默认值 UTF-8。要实施此政策,必须先启用“DefaultSearchProviderEnabled”政策。</translation> <translation id="268577405881275241">启用数据压缩代理功能</translation> @@ -676,7 +682,6 @@ 如果您停用此设置或不为其指定任何值,打印预览便会将最近使用过的打印机用作默认目标选项。 如果您启用此设置,打印预览则会将操作系统默认打印机用作默认目标选项。</translation> -<translation id="2867699958489427143">如果操作系统版本比目标版本新,则回滚到并持续使用目标版本。在此过程中,请执行完整的 Powerwash 操作。</translation> <translation id="2872961005593481000">关机</translation> <translation id="2874209944580848064">针对支持 Android 应用的 <ph name="PRODUCT_OS_NAME" />设备的注意事项:</translation> <translation id="2877225735001246144">在协商 Kerberos 身份验证时停用 CNAME 查找</translation> @@ -909,7 +914,6 @@ <translation id="3711895659073496551">暂停</translation> <translation id="3715569262675717862">基于客户端证书的身份验证</translation> <translation id="3736879847913515635">允许通过用户管理器添加用户</translation> -<translation id="3737544779868348650">设备网络主机名</translation> <translation id="3746590506846867985"> 此政策适用于登录屏幕。另请参阅适用于用户会话的 <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> 政策。我们建议您将这两项政策设为相同的值。如果这两项政策的值不一致,系统在进入用户会话时,在应用由用户政策指定的值的过程中,便可能会出现延迟。 如果启用了此政策,则以英文逗号分隔的列表中指定的每个来源都会在自己的进程中运行。这也会隔离以子网域命名的来源;例如,指定 https://example.com/ 也会导致 https://foo.example.com/ 被隔离(作为 https://example.com/ 网站的一部分)。 @@ -1012,6 +1016,7 @@ 每个列表条目都包含一个字典,其“extension-id”字段必须包含扩展程序 ID,而其“update-url”字段必须包含更新网址。</translation> <translation id="3874773863217952418">启用“点按搜索”</translation> <translation id="3877517141460819966">集成的双重身份验证模式</translation> +<translation id="3879208481373875102">配置强制安装的网络应用的列表</translation> <translation id="388237772682176890">我们在 M53 中弃用了此政策,并在 M54 中移除了此政策(因为 SPDY/3.1 已不再受支持)。 禁止在 <ph name="PRODUCT_NAME" /> 中使用 SPDY 协议。 @@ -1244,6 +1249,10 @@ 若想全面了解此政策的可能设置和结构,请访问 https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">用户政策环回处理模式</translation> +<translation id="4554841826517980623">此政策用于控制适用于 <ph name="PRODUCT_NAME" />的网络文件共享功能是否应使用“<ph name="NETBIOS_PROTOCOL" />”来搜索网络上的共享文件。 + 如果此政策设为 true,共享文件发现功能将使用“<ph name="NETBIOS_PROTOCOL" />”协议搜索网络上的共享文件。 + 如果此政策设为 false,共享文件发现功能将不使用“<ph name="NETBIOS_PROTOCOL" />”协议来搜索共享文件。 + 如果此政策未设置,默认情况下,系统会对受企业管理的用户停用此政策,并对不受管理的用户启用此政策。</translation> <translation id="4555850956567117258">为该用户启用远程认证</translation> <translation id="4557134566541205630">默认搜索服务提供商新标签页网址</translation> <translation id="4567137030726189378">允许使用开发者工具</translation> @@ -1634,6 +1643,7 @@ 如果未设置此政策,则登录屏幕初次显示时会停用语音反馈。用户可以随时启用或停用语音反馈,并且其在登录屏幕上的启用或停用状态对各用户均有效。</translation> <translation id="5868414965372171132">用户级网络配置</translation> +<translation id="5879014913445067283">控制网络文件共享功能是否通过“<ph name="NETBIOS_NAME" />”来搜索共享文件</translation> <translation id="5883015257301027298">默认 Cookie 设置</translation> <translation id="5887414688706570295">配置供远程访问主机使用的 TalkGadget 前缀,并禁止用户更改此设置。 @@ -2064,6 +2074,17 @@ <translation id="7049373494483449255">允许 <ph name="PRODUCT_NAME" />将文档提交到 <ph name="CLOUD_PRINT_NAME" />进行打印。请注意:这只会影响 <ph name="PRODUCT_NAME" />中的 <ph name="CLOUD_PRINT_NAME" />支持,并不会禁止用户在网站上提交打印作业。如果启用或未配置此设置,用户就可以通过 <ph name="PRODUCT_NAME" />的打印对话框使用 <ph name="CLOUD_PRINT_NAME" />进行打印。如果停用此设置,用户就无法通过 <ph name="PRODUCT_NAME" />的打印对话框使用 <ph name="CLOUD_PRINT_NAME" />进行打印。</translation> <translation id="7053678646221257043">如果启用此政策,就会强制从当前默认浏览器导入书签,还会影响导入对话框。如果停用此政策,就不会导入书签。如果未设置此政策,系统就会询问用户是否导入书签,或者系统自动进行导入。</translation> <translation id="7063895219334505671">在这些网站上允许弹出式窗口</translation> +<translation id="706568410943497889"> + 如果此政策设为 true,<ph name="PRODUCT_NAME" /> 便可以从 Google 服务(例如 Google Meet)收集 WebRTC 事件日志,并将这些日志上传到 Google。 + + 如果此政策设为 false 或未设置,<ph name="PRODUCT_NAME" /> 将不能收集或上传此类日志。 + + 这些日志中包含一些诊断信息,例如 RTP 数据包的收发时间和大小、网络拥堵情况反馈,以及与语音和视频帧的时间和质量相关的元数据。在调试 Chrome 中的语音或视频通话问题时,这些信息非常有用。这些日志不包含通话的语音或视频内容。 + + 这项由 Chrome 进行的数据收集操作只能由 Google 的网络服务(例如 Google 环聊或 Google Meet)触发。 + + Google 可能会通过会话 ID 将这些日志与 Google 服务自身收集的其他日志相关联,以便更轻松地进行调试。 + </translation> <translation id="706669471845501145">允许网站显示桌面通知</translation> <translation id="7072208053150563108">设备密码更改率</translation> <translation id="7074513465313721551">配置安全浏览功能将会信任的一系列网域。这意味着: @@ -2195,6 +2216,9 @@ <translation id="7336878834592315572">在会话期间保留 Cookie</translation> <translation id="7340034977315324840">报告设备活动时间</translation> <translation id="7343497214039883642">设备的企业打印机配置文件</translation> +<translation id="7349338075015720646">以列表形式指定在无需用户干预的情况下静默安装的网站,用户无法卸载或停用这些网站。 + + 此政策的每个列表项都是一个包含以下两个成员的对象:“url”和“launch_container”。“url”应该是要安装的网络应用的网址,“launch_container”应该是“窗口”或“标签页”(用于指示网络应用在安装后的打开方式)。如果省略“launch_container”,当应用被 Chrome 视为渐进式网页应用时,将在窗口中启动,否则将在标签页中打开。</translation> <translation id="7367028210010532881">当用户访问被标记为可能存在恶意内容的网站时,安全浏览功能会显示警告页面。如果此设置处于启用状态,用户在看到警告页面后将无法再继续访问相应的恶意网站。 如果此设置处于停用状态或未配置,用户在看到警告后可以继续访问被标记为可能存在恶意内容的网站。 @@ -2631,6 +2655,7 @@ 这里的“版本”既可以是确切的版本(例如“61.0.3163.120”),也可以是版本前缀(例如“61.0”)。 </translation> <translation id="8544375438507658205">默认 HTML 呈现器为“<ph name="PRODUCT_FRAME_NAME" />”</translation> +<translation id="8544465954173828789">允许将短信从手机同步到 Chromebook。</translation> <translation id="8549772397068118889">访问非内容包内的网站时发出警告</translation> <translation id="8566842294717252664">在“打开新的标签页”页面和应用启动器中不显示网上应用店</translation> <translation id="8586528890725660268">指定用户无法使用的打印机。 @@ -2675,6 +2700,11 @@ 如果未设置此政策,那么密码保护服务仅会保护 Google 密码,但用户将能够更改此设置。</translation> <translation id="8672321184841719703">目标自动更新版本</translation> <translation id="867410340948518937">U2F(通用第二重因素)</translation> +<translation id="8682611302223077049">可让您设置一个时间段(以毫秒为单位),在该时间段内,如果必须重新启动 <ph name="PRODUCT_NAME" /> 或必须重启 <ph name="PRODUCT_OS_NAME" />设备以应用待应用的更新,则用户将会收到通知。 + + 在该时间段内,如果需要更新,系统将反复通知用户。对于 <ph name="PRODUCT_OS_NAME" />设备,当系统检测到待应用的升级时,会在系统任务栏中显示重启通知。对于 <ph name="PRODUCT_NAME" /> 浏览器,应用菜单会在通知时间段过去三分之一后立即发生变化,以指示需要重新启动浏览器。此通知会在通知时间段过去三分之二后立即改变颜色,并会在整个通知时间段过后再次立即改变颜色。由 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策启用的其他通知也会遵循这一时间表。 + + 如果此政策未设置,对于 <ph name="PRODUCT_OS_NAME" />设备,系统会使用 345600000 毫秒(4 天)的默认通知时间段,对于 <ph name="PRODUCT_NAME" />,则会使用 604800000 毫秒(1 周)的默认通知时间段。</translation> <translation id="8685024486845674965">重复使用密码可触发密码保护服务警告功能</translation> <translation id="8693243869659262736">使用内置 DNS 客户端</translation> <translation id="8704831857353097849">已停用插件的列表</translation> @@ -2711,6 +2741,7 @@ 调整因子不得小于 100%。所设置的值不得使演示模式下的屏幕变暗延迟时间短于常规屏幕变暗延迟时间。</translation> <translation id="8798099450830957504">默认</translation> +<translation id="8801680448782904838">系统建议或要求重新启动浏览器或重启设备时,通知用户</translation> <translation id="8818173863808665831">报告设备的地理位置。 如果未设置此政策或将其设为 false,系统将不会报告相关位置。</translation> @@ -2848,6 +2879,11 @@ 如果此政策设为 true,<ph name="PRODUCT_OS_NAME" />会在用户关闭设备时触发重新启动操作。<ph name="PRODUCT_OS_NAME" />会将界面中的所有关机按钮替换为重新启动按钮。如果用户通过电源按钮关闭设备,设备将不会自动重新启动,即使启用了此政策也是如此。</translation> <translation id="9152473318295429890">允许根据上下文建议相关的网页</translation> <translation id="9158929520101169054">允许在同一浏览器中登录多个帐号</translation> +<translation id="9159126470527871268">必须重新启动 <ph name="PRODUCT_NAME" /> 或必须重启 <ph name="PRODUCT_OS_NAME" />以应用待应用的更新时,通知用户。 + + 此政策设置用于启用通知功能,以便在系统建议或要求重新启动浏览器或重启设备时,通知用户。如果此政策未设置,当需要重新启动时,<ph name="PRODUCT_NAME" /> 会通过菜单的细微变化来提示用户,而 <ph name="PRODUCT_OS_NAME" />则会通过系统任务栏中的通知来提示用户。如果此政策设为“推荐”,当建议重新启动浏览器时,系统将会显示周期性警告。用户可以关闭该警告来推迟重新启动。如果此政策设为“必需”,系统将会显示周期性警告,以便让用户知道系统将于通知时间段过后立即强制重新启动浏览器。对于 <ph name="PRODUCT_NAME" />,通知时间段会默认设为 7 天,对于 <ph name="PRODUCT_OS_NAME" />,则会默认设为 4 天,不过可以通过 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策设置进行配置。 + + 浏览器重新启动/设备重启后,将会恢复用户会话。</translation> <translation id="9165792353046089850">让您能够设置是否允许网站访问所连接的 USB 设备。您可以完全禁止所有网站访问此类设备,也可以要求所有网站必须征得用户同意才能访问此类设备。 您可以使用“WebUsbAskForUrls”和“WebUsbBlockedForUrls”政策为特定网址格式替换此政策。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index c04b652..96c042e 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -44,7 +44,7 @@ 如要進一步瞭解安全內容,請參閱 https://www.w3.org/TR/secure-contexts/。 </translation> -<translation id="1117535567637097036">處理 Android 調用請求時,系統不會使用透過這項政策設定的通訊協定處理常式。</translation> +<translation id="1117535567637097036">處理 Android 意圖時,系統不會使用透過這項政策設定的通訊協定處理常式。</translation> <translation id="1118093128235245168">允許網站要求使用者授權存取已連線的 USB 裝置</translation> <translation id="1128903365609589950">設定 <ph name="PRODUCT_NAME" /> 在磁碟中儲存快取檔案時所使用的目錄。 @@ -338,6 +338,7 @@ <translation id="199764499252435679">允許更新 <ph name="PRODUCT_NAME" /> 的元件</translation> <translation id="2006530844219044261">電源管理</translation> <translation id="201557587962247231">裝置狀態報告上傳頻率</translation> +<translation id="2017301949684549118">以無訊息方式安裝的網路應用程式網址。</translation> <translation id="2018836497795982119">指定向裝置管理服務查詢使用者政策資訊的時間 (以毫秒為單位)。 設定這項政策會覆寫預設值 (3 小時)。這項政策的有效值範圍是 1800000 (30 分鐘) 到 86400000 (1 天)。超出範圍的值一律會自動調整為上限值或下限值。如果平台支援政策通知,由於政策通知通常會在政策變更時自動強制更新,所以更新延遲時間會設為 24 小時。 @@ -640,6 +641,11 @@ 您可以使用以下格式指定 Google 的搜尋網址:<ph name="GOOGLE_SEARCH_URL" />。 啟用「DefaultSearchProviderEnabled」政策時必須設定這個選項,系統也只會在這種情況下遵循這項政策。</translation> +<translation id="2659019163577049044">如果你啟用這項設定,使用者就可以自行設定裝置,讓簡訊在手機和 Chromebook 上保持同步。請注意,如果你允許這項政策,使用者必須完成設定流程來明確選擇啟用這項功能。設定流程完成後,使用者就可以在自己的 Chromebook 上收發簡訊。 + + 如果你停用這項設定,使用者將無法設置簡訊同步功能。 + + 如未設定這項政策,在預設情況下,受管理的使用者無法使用這項功能,未受管理的使用者則可使用這項功能。</translation> <translation id="2660846099862559570">永不使用 Proxy</translation> <translation id="267596348720209223">指定搜尋引擎支援的字元編碼。編碼就是 UTF-8、GB2312 和 ISO-8859-1 等字碼頁名稱。系統會以提供的順序來測試。這項政策是選擇性的,如果未設定,預設會使用的是 UTF-8。只有在啟用「DefaultSearchProviderEnabled」政策時,系統才會遵循這項政策。</translation> <translation id="268577405881275241">啟用資料壓縮 Proxy 功能</translation> @@ -706,7 +712,6 @@ 如果停用這項設定或未設定值,預覽列印會以最近使用的印表機做為預設目的地選擇。 如果啟用這項設定,預覽列印會使用作業系統預設印表機做為預設目的地選擇。</translation> -<translation id="2867699958489427143">如果作業系統比目標版本還新,則復原並維持在目標版本,並在作業過程中執行完整的 Powerwash。</translation> <translation id="2872961005593481000">關閉</translation> <translation id="2874209944580848064">支援 Android 裝置的 <ph name="PRODUCT_OS_NAME" />裝置注意事項:</translation> <translation id="2877225735001246144">在交涉 Kerberos 驗證時,停用 CNAME 查詢</translation> @@ -944,7 +949,6 @@ <translation id="3711895659073496551">暫停</translation> <translation id="3715569262675717862">根據用戶端憑證進行驗證</translation> <translation id="3736879847913515635">允許在使用者管理工具中新增使用者</translation> -<translation id="3737544779868348650">裝置網路主機名稱</translation> <translation id="3746590506846867985"> 這項政策適用於登入畫面。另請查看適用於使用者工作階段的 <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> 政策。建議你為這兩項政策設定相同的值。如果兩者的值不相符,在套用使用者政策指定的值的情況下,進入使用者工作階段時可能會發生延遲情況。 如果啟用這項政策,逗號分隔的清單中的已命名來源就會以獨立程序執行。這也會隔離使用子網域名稱的來源;例如,指定 https://example.com/ 也會造成 https://foo.example.com/ 遭到隔離,因為後者同樣屬於 https://example.com/ 網站。 @@ -1050,6 +1054,7 @@ 每個清單項目都含有目錄,其中的「extension-id」欄位必須包含擴充功能 ID,且「update-url」欄位必須包含更新網址。</translation> <translation id="3874773863217952418">啟用輕觸搜尋</translation> <translation id="3877517141460819966">整合式雙重驗證模式</translation> +<translation id="3879208481373875102">設定強制安裝的網路應用程式清單</translation> <translation id="388237772682176890">自 M53 起我們已淘汰這項政策,至 M54 則移除了這項政策 (因為我們已不再支援 SPDY/3.1)。 停用 <ph name="PRODUCT_NAME" /> 的 SPDY 通訊協定。 @@ -1283,6 +1288,10 @@ 如需可用設定和本政策結構的完整說明,請造訪 https://www.chromium.org/administrators/policy-list-3/extension-settings-full </translation> <translation id="4554651132977135445">使用者政策回送處理模式</translation> +<translation id="4554841826517980623">這項政策可控管是否要允許 <ph name="PRODUCT_NAME" />的網路檔案共用功能使用 <ph name="NETBIOS_PROTOCOL" /> 搜尋網路上的共用項目。 + 將這項政策設為 True 時,共用項目搜尋功能會使用 <ph name="NETBIOS_PROTOCOL" /> 通訊協定在網路上搜尋共用項目。 + 將這項政策設為 False 時,共用項目搜尋功能不會使用 <ph name="NETBIOS_PROTOCOL" /> 通訊協定搜尋共用項目。 + 如未設定這項政策,在預設情況下,系統會為受企業管理的使用者停用這項政策,並為未受管理的使用者啟用這項政策。</translation> <translation id="4555850956567117258">為使用者啟用遠端認證機制</translation> <translation id="4557134566541205630">預設搜尋引擎新分頁網址</translation> <translation id="4567137030726189378">允許使用開發人員工具</translation> @@ -1677,6 +1686,7 @@ 如果你未設定這項政策,則系統會在初次顯示登入畫面時停用互動朗讀。使用者隨時都可以啟用或停用互動朗讀,而互動朗讀在登入畫面的狀態則視使用者的選擇而定 (均為永久性)。</translation> <translation id="5868414965372171132">使用者層級網路設定</translation> +<translation id="5879014913445067283">控制網路檔案共用功能是否透過 <ph name="NETBIOS_NAME" /> 搜尋檔案</translation> <translation id="5883015257301027298">預設 Cookie 設定</translation> <translation id="5887414688706570295">設定遠端存取主機所要使用的 TalkGadget 前置詞,並且防止使用者變更這項設定。 @@ -2117,6 +2127,17 @@ <translation id="7049373494483449255">啟用「<ph name="PRODUCT_NAME" />」將文件提交至「<ph name="CLOUD_PRINT_NAME" />」列印。注意:這只會影響可支援「<ph name="PRODUCT_NAME" />」的「<ph name="CLOUD_PRINT_NAME" />」,但無法禁止使用者提交至網站上的列印工作。如果啟用或尚未設定這項設定,使用者可以從「<ph name="PRODUCT_NAME" />」列印對話方塊中使用「<ph name="CLOUD_PRINT_NAME" />」進行列印。如果停用這項設定,使用者則無法從「<ph name="PRODUCT_NAME" />」列印對話方塊中使用「<ph name="CLOUD_PRINT_NAME" />」進行列印。</translation> <translation id="7053678646221257043">如果啟用的話,這項政策會強迫系統從目前預設的瀏覽器匯入書籤,並且會影響匯入對話方塊。如果停用的話,系統不會匯入任何書籤。如果未設定的話,系統會自動匯入書籤,或詢問使用者是否要匯入書籤。</translation> <translation id="7063895219334505671">允許這些網站的彈出式視窗</translation> +<translation id="706568410943497889"> + 如果將這項政策設為 True,<ph name="PRODUCT_NAME" /> 就能從 Google 服務 (例如 Google Meet) 收集 WebRTC 事件記錄,並將這些記錄上傳至 Google。 + + 如果將這項政策設為 False 或不予設定,<ph name="PRODUCT_NAME" /> 就可能不會收集或上傳這類記錄。 + + 這些記錄包含有助於偵錯 Chrome 語音或視訊通話問題的診斷資訊,例如收發 RTP 封包的時間和大小、網路壅塞情形回報、關於語音及視訊畫格的時間和品質等中繼資料,但不包含通話的語音和視訊內容。 + + Chrome 這項資料收集作業只能由 Google 的網路服務觸發,例如 Google Hangouts 或 Google Meet。 + + Google 可能會依照工作階段 ID 將這些記錄和 Google 服務本身收集的其他記錄建立關聯,目的是簡化偵錯作業。 + </translation> <translation id="706669471845501145">允許網站顯示桌面通知</translation> <translation id="7072208053150563108">裝置密碼變更頻率</translation> <translation id="7074513465313721551">設定安全瀏覽功能將信任的網域清單。也就是說: @@ -2248,6 +2269,9 @@ <translation id="7336878834592315572">在工作階段期間保留 Cookie</translation> <translation id="7340034977315324840">回報裝置活動時間</translation> <translation id="7343497214039883642">裝置專用企業印表機設定檔</translation> +<translation id="7349338075015720646">指定以無訊息方式安裝 (使用者無需操作) 的網站清單 (使用者無法解除安裝或停用這些網站)。 + + 這項政策的每個清單項目都是一個物件,由「url」和「launch_container」組成。「url」應為要安裝的網路應用程式的網址,「launch_container」則應為「window」(視窗) 或「tab」(分頁),是用於指定網路應用程式安裝後要採用的開啟方式。如果省略「launch_container」,且 Chrome 判斷該網路應用程式為漸進式網路應用程式,將會在視窗中開啟;若 Chrome 判斷不是漸進式網路應用程式,則會在分頁中開啟。</translation> <translation id="7367028210010532881">當使用者瀏覽遭檢舉為有惡意風險的網站時,「安全瀏覽」服務會顯示警告網頁。如果啟用這項設定,就能防止使用者略過警告網頁並繼續前往惡意網站。 如果停用這項設定或未進行設定,則使用者可以選擇在系統顯示警告之後,繼續前往遭檢舉的網站。 @@ -2690,6 +2714,7 @@ 指定「版本」時,可以提供確切的版本號碼 (例如「61.0.3163.120」),也可以提供版本的前置字串 (例如「61.0」)。 </translation> <translation id="8544375438507658205">預設 <ph name="PRODUCT_FRAME_NAME" /> 的 HTML 轉譯器</translation> +<translation id="8544465954173828789">允許將簡訊從手機同步至 Chromebook。</translation> <translation id="8549772397068118889">瀏覽內容套件以外的網站時顯示警告</translation> <translation id="8566842294717252664">在新分頁和應用程式啟動畫面中隱藏線上應用程式商店</translation> <translation id="8586528890725660268">指定哪些印表機是禁止使用的。 @@ -2734,6 +2759,11 @@ 如果未設定這項政策,密碼保護服務就只會保護 Google 密碼,但使用者可以變更這項設定。</translation> <translation id="8672321184841719703">指定目標的自動更新版本</translation> <translation id="867410340948518937">U2F (通用雙重驗證)</translation> +<translation id="8682611302223077049">可設定時間範圍 (以毫秒為單位),系統會在這段時間內通知使用者必須重新啟動 <ph name="PRODUCT_NAME" /> 或 <ph name="PRODUCT_OS_NAME" />裝置,才能套用未安裝的更新。 + + 在你設定的時間範圍內,使用者會持續收到更新通知。在 <ph name="PRODUCT_OS_NAME" />裝置上,當系統偵測到升級時,會在系統匣中顯示重新啟動通知。在 <ph name="PRODUCT_NAME" /> 瀏覽器中,當通知時間過了三分之一後,應用程式選單會有所變更,表示瀏覽器需要重新啟動。這項通知會在時間過了三分之二後變更顏色,並於時間過完後再次變色。由 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策啟用的其他瀏覽器通知也會按照同樣的時間安排發生變更。 + + 如果不設定,<ph name="PRODUCT_OS_NAME" />裝置的預設通知時間為 345600000 毫秒 (四天),<ph name="PRODUCT_NAME" /> 的預設通知時間則為 604800000 毫秒 (一週)。</translation> <translation id="8685024486845674965">密碼遭到重複使用時,會觸發密碼保護警告</translation> <translation id="8693243869659262736">使用內建的 DNS 用戶端</translation> <translation id="8704831857353097849">停用的外掛程式清單</translation> @@ -2770,6 +2800,7 @@ 比例因數必須為 100% 以上的值。如果該值會使簡報模式中的調暗延遲時間比一般調暗延遲時間更短,就無法予以採用。</translation> <translation id="8798099450830957504">預設</translation> +<translation id="8801680448782904838">透過通知建議或要求使用者重新啟動瀏覽器或裝置</translation> <translation id="8818173863808665831">回報裝置的地理位置。 如果未設定這項政策,或將其設定為 False,系統將不會回報位置。</translation> @@ -2912,6 +2943,11 @@ 如果將這項政策設為 True,<ph name="PRODUCT_OS_NAME" /> 會在使用者關閉裝置時觸發重新啟動程序。此外,<ph name="PRODUCT_OS_NAME" /> 會將使用者介面中的所有關機按鈕改成重新啟動按鈕。如果使用者使用電源按鈕關閉裝置,即使您已啟用這項政策,裝置仍然不會自動重新啟動。</translation> <translation id="9152473318295429890">允許根據目前網頁內容建議相關的網頁</translation> <translation id="9158929520101169054">允許在瀏覽器中使用多帳戶登入功能</translation> +<translation id="9159126470527871268">通知使用者必須重新啟動 <ph name="PRODUCT_NAME" /> 或 <ph name="PRODUCT_OS_NAME" />才能套用未安裝的更新。 + + 這項政策可啟用通知,藉此建議或要求使用者重新啟動瀏覽器或裝置。如果不予設定,<ph name="PRODUCT_NAME" /> 會以細微的選單變更讓使用者知道瀏覽器需要重新啟動,<ph name="PRODUCT_OS_NAME" />則會在系統匣中顯示這類通知。如果設為「Recommended」(建議),瀏覽器會定期顯示警告,建議使用者重新啟動。如果使用者不想立即重新啟動,可以自行關閉這項警告。如果設為「Required」(必要),瀏覽器會定期顯示警告,告知使用者瀏覽器將於通知期過後強制重新啟動。<ph name="PRODUCT_NAME" /> 的通知期預設為七天,<ph name="PRODUCT_OS_NAME" />的通知期則預設為四天,可透過 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策設定加以設定。 + + 使用者的工作階段會在重新啟動後恢復。</translation> <translation id="9165792353046089850">讓你設定是否允許網站存取已連線的 USB 裝置。你可以禁止所有網站存取 USB 裝置,也可以要求網站一律需要經過使用者同意才能存取這類裝置。 你可以使用「WebUsbAskForUrls」和「WebUsbBlockedForUrls」政策,針對特定網址模式覆寫這項政策。
diff --git a/components/previews/content/previews_hints.cc b/components/previews/content/previews_hints.cc index 8925472a..1a1368a 100644 --- a/components/previews/content/previews_hints.cc +++ b/components/previews/content/previews_hints.cc
@@ -219,7 +219,7 @@ // Cache hints that have PageHints. if (ShouldProcessPageHints() && !hint.page_hints().empty()) { - UMA_HISTOGRAM_COUNTS("ResourceLoadingHints.ResourceHints.ProcessedCount", + UMA_HISTOGRAM_COUNTS("ResourceLoadingHints.PageHints.ProcessedCount", hint.page_hints().size()); hints->initial_hints_.push_back(hint); }
diff --git a/components/previews/content/previews_optimization_guide_unittest.cc b/components/previews/content/previews_optimization_guide_unittest.cc index e5d47d48..31464c3 100644 --- a/components/previews/content/previews_optimization_guide_unittest.cc +++ b/components/previews/content/previews_optimization_guide_unittest.cc
@@ -656,7 +656,7 @@ RunUntilIdle(); histogram_tester.ExpectUniqueSample( - "ResourceLoadingHints.ResourceHints.ProcessedCount", 2, 1); + "ResourceLoadingHints.PageHints.ProcessedCount", 2, 1); // Verify loaded hint data for www.somedomain.org EXPECT_EQ(GURL("https://www.somedomain.org/news/football"),
diff --git a/components/rappor/BUILD.gn b/components/rappor/BUILD.gn index 8a0dfea..6ba841b7 100644 --- a/components/rappor/BUILD.gn +++ b/components/rappor/BUILD.gn
@@ -2,9 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/jumbo.gni") import("//testing/test.gni") -static_library("rappor") { +jumbo_static_library("rappor") { sources = [ "bloom_filter.cc", "bloom_filter.h", @@ -48,7 +49,7 @@ ] } -static_library("rappor_recorder") { +jumbo_static_library("rappor_recorder") { sources = [ "rappor_recorder_impl.cc", "rappor_recorder_impl.h", @@ -65,7 +66,7 @@ ] } -static_library("test_support") { +jumbo_static_library("test_support") { testonly = true sources = [ "test_log_uploader.cc", @@ -83,7 +84,7 @@ ] } -source_set("unit_tests") { +jumbo_source_set("unit_tests") { testonly = true sources = [ "bloom_filter_unittest.cc",
diff --git a/components/rappor/public/BUILD.gn b/components/rappor/public/BUILD.gn index 7e766c61..97b109e 100644 --- a/components/rappor/public/BUILD.gn +++ b/components/rappor/public/BUILD.gn
@@ -2,7 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("public") { +import("//build/config/jumbo.gni") + +jumbo_source_set("public") { sources = [ "rappor_parameters.h", "rappor_service.h",
diff --git a/components/rappor/rappor_metric_unittest.cc b/components/rappor/rappor_metric_unittest.cc index 44c918b..938f9bb 100644 --- a/components/rappor/rappor_metric_unittest.cc +++ b/components/rappor/rappor_metric_unittest.cc
@@ -12,7 +12,7 @@ namespace rappor { -const RapporParameters kTestRapporParameters = { +const RapporParameters kRapporMetricTestParameters = { 1 /* Num cohorts */, 16 /* Bloom filter size bytes */, 4 /* Bloom filter hash count */, @@ -22,13 +22,13 @@ // Check for basic syntax and use. TEST(RapporMetricTest, BasicMetric) { - RapporMetric testMetric("MyRappor", kTestRapporParameters, 0); + RapporMetric testMetric("MyRappor", kRapporMetricTestParameters, 0); testMetric.AddSample("Bar"); EXPECT_EQ(0x80, testMetric.bytes()[1]); } TEST(RapporMetricTest, GetReport) { - RapporMetric metric("MyRappor", kTestRapporParameters, 0); + RapporMetric metric("MyRappor", kRapporMetricTestParameters, 0); const ByteVector report = metric.GetReport( HmacByteVectorGenerator::GenerateEntropyInput());
diff --git a/components/rappor/sampler_unittest.cc b/components/rappor/sampler_unittest.cc index 9953c190..a97a7b56 100644 --- a/components/rappor/sampler_unittest.cc +++ b/components/rappor/sampler_unittest.cc
@@ -14,17 +14,15 @@ namespace rappor { -const RapporParameters kTestRapporParameters = { - 1 /* Num cohorts */, - 1 /* Bloom filter size bytes */, - 4 /* Bloom filter hash count */, - NORMAL_NOISE /* Noise level */, +const RapporParameters kRapporSamplerTestParameters = { + 1 /* Num cohorts */, 1 /* Bloom filter size bytes */, + 4 /* Bloom filter hash count */, NORMAL_NOISE /* Noise level */, UMA_RAPPOR_GROUP /* Recording group (not used) */}; class TestSamplerFactory { public: static std::unique_ptr<Sample> CreateSample() { - return std::unique_ptr<Sample>(new Sample(0, kTestRapporParameters)); + return std::unique_ptr<Sample>(new Sample(0, kRapporSamplerTestParameters)); } };
diff --git a/components/rappor/test_rappor_service.h b/components/rappor/test_rappor_service.h index 9e0552fc..ee3060a 100644 --- a/components/rappor/test_rappor_service.h +++ b/components/rappor/test_rappor_service.h
@@ -98,7 +98,7 @@ TestingPrefServiceSimple* test_prefs() { return &test_prefs_; } - TestLogUploader* test_uploader() { return test_uploader_; } + rappor::TestLogUploader* test_uploader() { return test_uploader_; } base::TimeDelta next_rotation() { return next_rotation_; } @@ -126,7 +126,7 @@ TestingPrefServiceSimple test_prefs_; // Holds a weak ref to the uploader_ object. - TestLogUploader* test_uploader_; + rappor::TestLogUploader* test_uploader_; // The last scheduled log rotation. base::TimeDelta next_rotation_;
diff --git a/components/resources/components_resources.grd b/components/resources/components_resources.grd index d3789ba..b1359f56 100644 --- a/components/resources/components_resources.grd +++ b/components/resources/components_resources.grd
@@ -19,6 +19,7 @@ <if expr="is_win"> <part file="nux_email.grdp" /> <part file="nux_google_apps.grdp" /> + <part file="nux_set_as_default.grdp" /> </if> <part file="offline_pages_resources.grdp" /> <part file="password_manager_internals_resources.grdp" />
diff --git a/components/resources/nux_set_as_default.grdp b/components/resources/nux_set_as_default.grdp new file mode 100644 index 0000000..e37a8fd --- /dev/null +++ b/components/resources/nux_set_as_default.grdp
@@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <include name="IDR_NUX_SET_AS_DEFAULT_HTML" file="../nux/set_as_default/resources/nux_set_as_default.html" type="BINDATA" /> + <include name="IDR_NUX_SET_AS_DEFAULT_JS" file="../nux/set_as_default/resources/nux_set_as_default.js" type="BINDATA" /> + <include name="IDR_NUX_SET_AS_DEFAULT_PROXY_HTML" file="../nux/set_as_default/resources/nux_set_as_default_proxy.html" type="BINDATA" /> + <include name="IDR_NUX_SET_AS_DEFAULT_PROXY_JS" file="../nux/set_as_default/resources/nux_set_as_default_proxy.js" type="BINDATA" /> +</grit-part>
diff --git a/components/signin/core/browser/account_reconcilor.cc b/components/signin/core/browser/account_reconcilor.cc index 32bb8216..0b86894b 100644 --- a/components/signin/core/browser/account_reconcilor.cc +++ b/components/signin/core/browser/account_reconcilor.cc
@@ -30,6 +30,9 @@ using signin::AccountReconcilorDelegate; +const base::Feature kUseMultiloginEndpoint{"UseMultiloginEndpoint", + base::FEATURE_DISABLED_BY_DEFAULT}; + namespace { class AccountEqualToFunc { @@ -648,6 +651,20 @@ #endif } +void AccountReconcilor::OnSetAccountsInCookieCompleted( + const GoogleServiceAuthError& error) { + VLOG(1) << "AccountReconcilor::OnSetAccountsInCookieCompleted: " + << "Error was " << error.ToString(); + if (is_reconcile_started_) { + if (error.state() != GoogleServiceAuthError::State::NONE && + !error_during_last_reconcile_.IsPersistentError()) { + error_during_last_reconcile_ = error; + } + CalculateIfReconcileIsDone(); + ScheduleStartReconcileIfChromeAccountsChanged(); + } +} + void AccountReconcilor::OnAddAccountToCookieCompleted( const std::string& account_id, const GoogleServiceAuthError& error) {
diff --git a/components/signin/core/browser/account_reconcilor.h b/components/signin/core/browser/account_reconcilor.h index b9af2d5..878d4b2 100644 --- a/components/signin/core/browser/account_reconcilor.h +++ b/components/signin/core/browser/account_reconcilor.h
@@ -27,6 +27,10 @@ #include "google_apis/gaia/google_service_auth_error.h" #include "google_apis/gaia/oauth2_token_service.h" +// Enables committed error pages instead of transient navigation entries for +// SSL interstitial error pages (i.e. certificate errors). +extern const base::Feature kUseMultiloginEndpoint; + namespace signin { class AccountReconcilorDelegate; } @@ -226,6 +230,8 @@ void OnAddAccountToCookieCompleted( const std::string& account_id, const GoogleServiceAuthError& error) override; + void OnSetAccountsInCookieCompleted( + const GoogleServiceAuthError& error) override; void OnGaiaAccountsInCookieUpdated( const std::vector<gaia::ListedAccount>& accounts, const std::vector<gaia::ListedAccount>& signed_out_accounts,
diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc index f102c75..26525d6 100644 --- a/components/signin/core/browser/account_tracker_service.cc +++ b/components/signin/core/browser/account_tracker_service.cc
@@ -571,7 +571,11 @@ } } } else { - DCHECK_EQ(GetMigrationState(), MIGRATION_NOT_STARTED); + // ChromeOS running on Linux and Linux share the preferences, so the + // migration may have been performed on Linux. Reset the migration + // state to ensure that the same code path is used whether ChromeOS + // is running on Linux on a dev build or on real ChromeOS device. + SetMigrationState(MIGRATION_NOT_STARTED); } DCHECK(GetMigrationState() != MIGRATION_DONE || IsMigrationDone());
diff --git a/components/signin/core/browser/account_tracker_service_unittest.cc b/components/signin/core/browser/account_tracker_service_unittest.cc index 5e1b409..fba578a9 100644 --- a/components/signin/core/browser/account_tracker_service_unittest.cc +++ b/components/signin/core/browser/account_tracker_service_unittest.cc
@@ -10,7 +10,6 @@ #include "base/auto_reset.h" #include "base/files/scoped_temp_dir.h" #include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_task_environment.h" #include "build/build_config.h" @@ -954,9 +953,9 @@ ListPrefUpdate update(prefs(), AccountTrackerService::kAccountInfoPref); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", email_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); update->Append(std::move(dict)); } @@ -980,9 +979,9 @@ service_flags->Append(std::make_unique<base::Value>("uca")); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", email_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); dict->SetList("service_flags", std::move(service_flags)); update->Append(std::move(dict)); } @@ -1009,15 +1008,15 @@ ListPrefUpdate update(prefs(), AccountTrackerService::kAccountInfoPref); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", email_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); update->Append(std::move(dict)); dict.reset(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_beta)); - dict->SetString("email", base::UTF8ToUTF16(email_beta)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_beta)); + dict->SetString("account_id", email_beta); + dict->SetString("email", email_beta); + dict->SetString("gaia", gaia_beta); update->Append(std::move(dict)); } @@ -1057,15 +1056,15 @@ ListPrefUpdate update(prefs(), AccountTrackerService::kAccountInfoPref); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", email_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); update->Append(std::move(dict)); dict.reset(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_beta)); - dict->SetString("email", base::UTF8ToUTF16(email_beta)); - dict->SetString("gaia", base::UTF8ToUTF16(std::string())); + dict->SetString("account_id", email_beta); + dict->SetString("email", email_beta); + dict->SetString("gaia", ""); update->Append(std::move(dict)); } @@ -1105,22 +1104,22 @@ ListPrefUpdate update(prefs(), AccountTrackerService::kAccountInfoPref); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", email_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); update->Append(std::move(dict)); dict.reset(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(email_beta)); - dict->SetString("email", base::UTF8ToUTF16(email_beta)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_beta)); + dict->SetString("account_id", email_beta); + dict->SetString("email", email_beta); + dict->SetString("gaia", gaia_beta); update->Append(std::move(dict)); // Succeed miggrated account. dict.reset(new base::DictionaryValue()); - dict->SetString("account_id", base::UTF8ToUTF16(gaia_alpha)); - dict->SetString("email", base::UTF8ToUTF16(email_alpha)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_alpha)); + dict->SetString("account_id", gaia_alpha); + dict->SetString("email", email_alpha); + dict->SetString("gaia", gaia_alpha); update->Append(std::move(dict)); }
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacade.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacade.java index 7a997dd..93fc386 100644 --- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacade.java +++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacade.java
@@ -92,7 +92,7 @@ new CachedMetrics.TimesHistogramSample( "Signin.AndroidPopulateAccountCacheWaitingTime", TimeUnit.MILLISECONDS); - private int mUpdateTasksCounter = 0; + private int mUpdateTasksCounter; private final ArrayList<Runnable> mCallbacksWaitingForPendingUpdates = new ArrayList<>(); /**
diff --git a/components/signin/core/browser/gaia_cookie_manager_service.cc b/components/signin/core/browser/gaia_cookie_manager_service.cc index e6c2a74..ce01f1f 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service.cc +++ b/components/signin/core/browser/gaia_cookie_manager_service.cc
@@ -24,6 +24,7 @@ #include "google_apis/gaia/gaia_constants.h" #include "google_apis/gaia/gaia_urls.h" #include "google_apis/gaia/oauth2_token_service.h" +#include "mojo/public/cpp/bindings/callback_helpers.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -365,7 +366,8 @@ // initialized so it is acceptable to use of this // |GaiaCookieManagerService| as the time when the profile is loaded. profile_load_time_(base::Time::Now()), - list_accounts_request_counter_(0) { + list_accounts_request_counter_(0), + weak_ptr_factory_(this) { DCHECK(!source_.empty()); } @@ -679,6 +681,12 @@ observer.OnAddAccountToCookieCompleted(account_id, error); } +void GaiaCookieManagerService::SignalSetAccountsComplete( + const GoogleServiceAuthError& error) { + for (auto& observer : observer_list_) + observer.OnSetAccountsInCookieCompleted(error); +} + void GaiaCookieManagerService::OnUbertokenSuccess( const std::string& uber_token) { DCHECK(requests_.front().request_type() == @@ -789,12 +797,10 @@ void GaiaCookieManagerService::OnOAuthMultiloginFailure( const GoogleServiceAuthError& error) { - VLOG(1) << "Failed Multilogin " + VLOG(1) << "Failed Multilogin for accounts: " << base::JoinString(requests_.front().account_ids(), " ") << " error=" << error.ToString(); - access_tokens_.clear(); - token_requests_.clear(); - HandleNextRequest(); + OnSetAccountsFinished(error); } void GaiaCookieManagerService::OnListAccountsSuccess(const std::string& data) { @@ -958,13 +964,51 @@ gaia_auth_fetcher_->StartListAccounts(); } +void GaiaCookieManagerService::OnSetAccountsFinished( + const GoogleServiceAuthError& error) { + access_tokens_.clear(); + token_requests_.clear(); + cookies_to_set_.clear(); + HandleNextRequest(); + SignalSetAccountsComplete(error); +} + +void GaiaCookieManagerService::OnCookieSet(const std::string& cookie_name, + const std::string& cookie_domain, + bool success) { + cookies_to_set_.erase(std::make_pair(cookie_name, cookie_domain)); + if (!success) { + VLOG(1) << "Failed to set cookie " << cookie_name + << " for domain=" << cookie_domain << "."; + } + if (cookies_to_set_.empty()) + OnSetAccountsFinished(GoogleServiceAuthError::AuthErrorNone()); +} + void GaiaCookieManagerService::StartSettingCookies( const OAuthMultiloginResult& result) { network::mojom::CookieManager* cookie_manager = signin_client_->GetCookieManager(); - for (net::CanonicalCookie& cookie : result.cookies()) { - cookie_manager->SetCanonicalCookie(cookie, true, true, base::DoNothing()); + DCHECK(cookies_to_set_.empty()); + + const std::vector<net::CanonicalCookie>& cookies = result.cookies(); + + for (const net::CanonicalCookie& cookie : cookies) { + const auto& inserted = + cookies_to_set_.insert(std::make_pair(cookie.Name(), cookie.Domain())); + if (inserted.second) { + base::OnceCallback<void(bool success)> callback = base::Bind( + &GaiaCookieManagerService::OnCookieSet, + weak_ptr_factory_.GetWeakPtr(), cookie.Name(), cookie.Domain()); + // It is assumed that OnCookieSet() is not run synchronously. + cookie_manager->SetCanonicalCookie( + cookie, true, true, + mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(callback), + false)); + } else + LOG(ERROR) << "Duplicate cookie found: " << cookie.Name() << " " + << cookie.Domain(); } }
diff --git a/components/signin/core/browser/gaia_cookie_manager_service.h b/components/signin/core/browser/gaia_cookie_manager_service.h index 32fe8f5..8a8cd8f3 100644 --- a/components/signin/core/browser/gaia_cookie_manager_service.h +++ b/components/signin/core/browser/gaia_cookie_manager_service.h
@@ -14,6 +14,7 @@ #include "base/containers/circular_deque.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/timer/timer.h" #include "components/signin/core/browser/signin_client.h" @@ -99,6 +100,12 @@ const std::string& account_id, const GoogleServiceAuthError& error) {} + // Called whenever setting cookies is completed. If |error| is equal to + // GoogleServiceAuthError::AuthErrorNone() then the call succeeded although + // there still might be some cookies that failed to be set. + virtual void OnSetAccountsInCookieCompleted( + const GoogleServiceAuthError& error) {} + // Called whenever a logout is completed. If |error| is equal to // GoogleServiceAuthError::AuthErrorNone() then the logout succeeded. virtual void OnLogOutAccountsFromCookieCompleted( @@ -239,6 +246,9 @@ void SignalComplete(const std::string& account_id, const GoogleServiceAuthError& error); + // Call observers when setting accounts in cookie completes. + void SignalSetAccountsComplete(const GoogleServiceAuthError& error); + // Returns true of there are pending log ins or outs. bool is_running() const { return requests_.size() > 0; } @@ -297,6 +307,14 @@ void OnLogOutSuccess() override; void OnLogOutFailure(const GoogleServiceAuthError& error) override; + // Final call in the Setting accounts in cookie procedure. + void OnSetAccountsFinished(const GoogleServiceAuthError& error); + + // Callback for CookieManager::SetCanonicalCookie. + void OnCookieSet(const std::string& cookie_name, + const std::string& cookie_domain, + bool success); + // Helper method for AddAccountToCookie* methods. void AddAccountToCookieInternal(const std::string& account_id, const std::string& source); @@ -360,6 +378,10 @@ // The access token that can be used to prime the UberToken fetch. std::string access_token_; + // List of pairs (cookie name and cookie domain) that have to be set in + // cookie jar. + std::set<std::pair<std::string, std::string>> cookies_to_set_; + // Connection to the CookieManager that signals when the GAIA cookies change. mojo::Binding<network::mojom::CookieChangeListener> cookie_listener_binding_; @@ -391,6 +413,8 @@ // Counter for list account requests. int list_accounts_request_counter_; + base::WeakPtrFactory<GaiaCookieManagerService> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(GaiaCookieManagerService); };
diff --git a/components/signin/core/browser/signin_manager_unittest.cc b/components/signin/core/browser/signin_manager_unittest.cc index e84be48d..c47fefa 100644 --- a/components/signin/core/browser/signin_manager_unittest.cc +++ b/components/signin/core/browser/signin_manager_unittest.cc
@@ -13,7 +13,6 @@ #include "base/compiler_specific.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" @@ -508,9 +507,9 @@ AccountTrackerService::kAccountInfoPref); update->Clear(); auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email)); - dict->SetString("email", base::UTF8ToUTF16(email)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id)); + dict->SetString("account_id", email); + dict->SetString("email", email); + dict->SetString("gaia", gaia_id); update->Append(std::move(dict)); account_tracker()->Shutdown(); @@ -538,9 +537,9 @@ AccountTrackerService::kAccountInfoPref); update->Clear(); auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email)); - dict->SetString("email", base::UTF8ToUTF16(email)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id)); + dict->SetString("account_id", email); + dict->SetString("email", email); + dict->SetString("gaia", gaia_id); update->Append(std::move(dict)); account_tracker()->Shutdown(); @@ -568,9 +567,9 @@ AccountTrackerService::kAccountInfoPref); update->Clear(); auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetString("account_id", base::UTF8ToUTF16(email)); - dict->SetString("email", base::UTF8ToUTF16(email)); - dict->SetString("gaia", base::UTF8ToUTF16(gaia_id)); + dict->SetString("account_id", email); + dict->SetString("email", email); + dict->SetString("gaia", gaia_id); update->Append(std::move(dict)); account_tracker()->Shutdown();
diff --git a/components/signin/ios/OWNERS b/components/signin/ios/OWNERS index d45210b..eaea771 100644 --- a/components/signin/ios/OWNERS +++ b/components/signin/ios/OWNERS
@@ -1,4 +1,4 @@ -bzanotti@chromium.org +jlebel@chromium.org msarda@chromium.org # COMPONENT: Services>SignIn
diff --git a/components/signin/ios/browser/BUILD.gn b/components/signin/ios/browser/BUILD.gn index 5cfba4c0..9a5285b7 100644 --- a/components/signin/ios/browser/BUILD.gn +++ b/components/signin/ios/browser/BUILD.gn
@@ -22,7 +22,6 @@ deps = [ ":active_state_manager", - "//base", "//components/content_settings/core/browser", "//components/google/core/browser", "//components/keyed_service/core",
diff --git a/components/signin/ios/browser/oauth2_token_service_observer_bridge.h b/components/signin/ios/browser/oauth2_token_service_observer_bridge.h index 425a9b3e..a168fac 100644 --- a/components/signin/ios/browser/oauth2_token_service_observer_bridge.h +++ b/components/signin/ios/browser/oauth2_token_service_observer_bridge.h
@@ -7,7 +7,6 @@ #import <Foundation/Foundation.h> -#import "base/ios/weak_nsobject.h" #include "base/macros.h" #include "google_apis/gaia/oauth2_token_service.h" @@ -50,7 +49,7 @@ private: OAuth2TokenService* token_service_; // weak - base::WeakNSProtocol<id<OAuth2TokenServiceObserverBridgeDelegate>> delegate_; + __weak id<OAuth2TokenServiceObserverBridgeDelegate> delegate_; DISALLOW_COPY_AND_ASSIGN(OAuth2TokenServiceObserverBridge); };
diff --git a/components/strings/components_chromium_strings_ta.xtb b/components/strings/components_chromium_strings_ta.xtb index 6fe23f7..5f51edf6 100644 --- a/components/strings/components_chromium_strings_ta.xtb +++ b/components/strings/components_chromium_strings_ta.xtb
@@ -16,8 +16,8 @@ > LAN அமைப்புகள் என்பதற்குச் சென்று, "உங்கள் LAN க்கு பிராக்சி சர்வரைப் பயன்படுத்தவும்" என்ற தேர்வுப்பெட்டியைத் தேர்வுநீக்கவும்.</translation> -<translation id="48558539577516920">தீச்சுவர் அல்லது வைரஸ் தடுப்பு - அமைப்புகளில் நெட்வொர்க்கை அணுக Chromiumஐ அனுமதிக்கவும்.</translation> +<translation id="48558539577516920">ஃபயர்வால் அல்லது வைரஸ் தடுப்பு அமைப்புகளில் + நெட்வொர்க்கை அணுக Chromiumமை அனுமதிக்கவும்.</translation> <translation id="580822234363523061">Chromium மெனு> <ph name="SETTINGS_TITLE" /> > @@ -32,7 +32,7 @@ <ph name="ADVANCED_TITLE" /> என்பதற்குச் சென்று, "<ph name="NO_PREFETCH_DESCRIPTION" />" என்பதைத் தேர்வுநீக்கம் செய்யவும். இது சிக்கலைத் தீர்க்கவில்லை எனில், மேம்பட்ட செயல்திறனுக்கு இந்த விருப்பத்தை மீண்டும் தேர்ந்தெடுக்கும்படி பரிந்துரைக்கிறோம்.</translation> -<translation id="8187289872471304532">பயன்பாடுகள் > முறைமை விருப்பத்தேர்வுகள் > பிணையம் > மேம்பட்டவை > பிராக்சிகள் - என்பதற்குச் சென்று, தேர்ந்தெடுக்கப்பட்டுள்ள பிராக்சிகளைத் தேர்வுநீக்கவும்.</translation> +<translation id="8187289872471304532">'ஆப்ஸ் > சிஸ்டம் விருப்பத்தேர்வுகள் > நெட்வொர்க் > மேம்பட்டவை > பிராக்ஸிகள்' + என்பதற்குச் சென்று தேர்ந்தெடுக்கப்பட்டுள்ள பிராக்ஸிகளைத் தேர்வுநீக்கவும்.</translation> <translation id="8684913864886094367">Chromium சரியாக நிறுத்தப்படவில்லை.</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_google_chrome_strings_ta.xtb b/components/strings/components_google_chrome_strings_ta.xtb index e4caed1..4a3890c1 100644 --- a/components/strings/components_google_chrome_strings_ta.xtb +++ b/components/strings/components_google_chrome_strings_ta.xtb
@@ -7,8 +7,8 @@ <translation id="2874156562296220396"><ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" />ஓபன் சோர்ஸ் திட்டப்பணி மற்றும் <ph name="BEGIN_LINK_OSS" />ஓபன் சோர்ஸ் மென்பொருள்<ph name="END_LINK_OSS" /> இவற்றால் Google Chrome ஐ உருவாக்குவது சாத்தியமானது.</translation> <translation id="3140883423282498090">அடுத்த முறை Google Chrome ஐ மீண்டும் தொடங்கியவுடன் உங்கள் மாற்றங்கள் செயல்படும்.</translation> <translation id="3444832043240812445">நீங்கள் <ph name="BEGIN_LINK" />செயலிழப்பு புகாரளித்தலை இயக்கியிருந்தால்<ph name="END_LINK" /> மட்டுமே, இந்தப் பக்கம் உங்களுடைய சமீபத்திய செயலிழப்புகளைப் பற்றிய தகவல்களைக் காண்பிக்கும்.</translation> -<translation id="3875312571075912821">தீச்சுவர் அல்லது வைரஸ் தடுப்பு - அமைப்புகளில் நெட்வொர்க்கை அணுக Chromeஐ அனுமதிக்கவும்.</translation> +<translation id="3875312571075912821">ஃபயர்வால் அல்லது வைரஸ் தடுப்பு அமைப்புகளில் + நெட்வொர்க்கை அணுக Chromeமை அனுமதிக்கவும்.</translation> <translation id="4010643444566880169">Chrome OS அதன் துவக்கநிலை அமைவை நிறைவுசெய்யவில்லை.</translation> <translation id="4853578032408195113">பாதுகாப்பான Google Chrome பக்கத்தைப் பார்க்கிறீர்கள்</translation> <translation id="6011049234605203654">Chrome மெனு > @@ -33,6 +33,6 @@ > LAN அமைப்புகள் என்பதற்குச் சென்று, "உங்கள் LAN க்குப் பிராக்சி சர்வரை பயன்படுத்தவும்" என்பதைத் தேர்வுநீக்கவும்.</translation> -<translation id="8187289872471304532">பயன்பாடுகள் > முறைமை விருப்பத்தேர்வுகள் > பிணையம் > மேம்பட்டவை > பிராக்சிகள் - என்பதற்குச் சென்று, தேர்ந்தெடுக்கப்பட்டுள்ள பிராக்சிகளைத் தேர்வுநீக்கவும்.</translation> +<translation id="8187289872471304532">'ஆப்ஸ் > சிஸ்டம் விருப்பத்தேர்வுகள் > நெட்வொர்க் > மேம்பட்டவை > பிராக்ஸிகள்' + என்பதற்குச் சென்று தேர்ந்தெடுக்கப்பட்டுள்ள பிராக்ஸிகளைத் தேர்வுநீக்கவும்.</translation> </translationbundle> \ No newline at end of file
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 343ec95..955cf637 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -421,6 +421,7 @@ <translation id="3778403066972421603">ይህን ካርድ በእርስዎ የGoogle መለያ እና በዚህ መሣሪያ ላይ ማስቀመጥ ይፈልጋሉ?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">በ<ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> ላይ የአገልግሎት ጊዜው ያበቃል</translation> +<translation id="3807873520724684969">ጎጂ ይዘት ታግዷል።</translation> <translation id="382518646247711829">ተኪ አገልጋይ የሚጠቀሙ ከሆኑ...</translation> <translation id="3828924085048779000">ባዶ የይለፍ ሐረግ አይፈቀድም።</translation> <translation id="385051799172605136">ተመለስ</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">እርምጃዎች</translation> <translation id="4958444002117714549">ዝርዝሩን ዘርጋ</translation> <translation id="4974590756084640048">ማስጠንቀቂያዎችን ዳግም አንቃ</translation> +<translation id="4988217478422488391">ለነገሮች መስመር ላይ ለመክፈል ይበልጥ የፈጠነ ያደርገዋል</translation> <translation id="4989809363548539747">ይህ ተሰኪ አይደገፍም</translation> <translation id="5002932099480077015">የነቃ እንደሆነ Chrome ለበለጠ ፈጣን ቅጽ አሞላል ሲባል በዚህ መሳሪያ ላይ ያለው የካርድዎን ቅጂ ያከማቻል።</translation> <translation id="5018422839182700155">ይህን ገጽ መክፈት አልተቻለም</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&አርትዕን ድገም</translation> <translation id="5481076368049295676">ይህ ይዘት በእርስዎ መሣሪያ ላይ መረጃዎን የሚሰርቅ ወይም የሚሰርዝ አደገኛ ሶፍትዌርን ለመጫን ሊሞክር ይችል ይሆናል። <ph name="BEGIN_LINK" />የሆነው ሆኖ አሳይ<ph name="END_LINK" /></translation> <translation id="54817484435770891">የሚሰራ አድራሻ ያስገቡ</translation> +<translation id="5490432419156082418">አድራሻዎች እና ተጨማሪ</translation> <translation id="5492298309214877701">በኩባንያ፣ በድርጅት ወይም በትምህርት ቤት ውስጠ መረብ ውስጥ ያለው ይህ ጣቢያ እንደ ውጫዊ የድር ጣቢያ ተመሳሳይ ዩአርኤል አለው። <ph name="LINE_BREAK" /> የእርስዎን የስርዓት አስተዳዳሪ ለማነጋገር ይሞክሩ።</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 ጥቅም ላይ ያለ}one{# ጥቅም ላይ ያለ}other{# ጥቅም ላይ}}</translation> <translation id="5922853866070715753">በቃ ሊያልቅ ነው</translation> <translation id="5939518447894949180">ዳግም አስጀምር</translation> +<translation id="5951495562196540101">በሸማች መለያ መመዝገብ አይቻልም (የጥቅል ፈቃድ ይገኛል)።</translation> <translation id="5967592137238574583">የዕውቂያ መረጃን ያርትዑ</translation> <translation id="5967867314010545767">ከታሪክ አስወግድ</translation> <translation id="5975083100439434680">አሳንስ</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">ይህ ከአብዛኛዎቹ የድር ጣቢያዎች ዘግቶ ያስወጣዎታል።</translation> <translation id="8437238597147034694">&ውሰድን ቀልብስ</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 ክሬዲት ካርድ}one{# ክሬዲት ካርዶች}other{# ክሬዲት ካርዶች}}</translation> +<translation id="8473863474539038330">አድራሻዎች እና ተጨማሪ</translation> <translation id="8483780878231876732">ከእርስዎ የGoogle መለያ ካርዶችን ለመጠቀም ወደ Chrome በመለያ ይግቡ</translation> <translation id="8488350697529856933">የሚመለከተው ለ</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ምላሽ ለመስጠት ከልክ በላይ ረዥም ጊዜ ወስዷል።</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">የካርድ ዝርዝሮችዎን ለማዘመን የ<ph name="CREDIT_CARD" /> ማብቂያ ቀን እና CVC ያስገቡ። ካረጋገጡ በኋላ የGoogle Payments ካርድ ዝርዝሮችዎ ለዚህ ጣቢያ ይጋራል።</translation> <translation id="8957210676456822347">የተያዥ መግቢያ ፈቀዳ</translation> <translation id="8971063699422889582">የአገልጋይ እውቅና ማረጋገጫ ጊዜው አልፎበታል።</translation> +<translation id="8975012916872825179">እንደ ስልክ ቁጥሮች፣ ኢሜይል አድራሻዎች እና የመላኪያ አድራሻዎች ያሉ መረጃዎችን ያካትታል</translation> <translation id="8978053250194585037">Google የጥንቃቄ አሰሳ በቅርቡ በ<ph name="SITE" /> ላይ <ph name="BEGIN_LINK" />ማስገር አግኝቷል<ph name="END_LINK" />። የማስገር ጣቢያዎች እርስዎን ለማታለል ሌሎች ድር ጣቢያዎች እንደሆኑ ያስመስላሉ።</translation> <translation id="8983003182662520383">Google Payን የሚጠቀሙ የመክፈያ ዘዴዎች እና አድራሻዎች</translation> <translation id="8987927404178983737">ወር</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">ቅጽን አጽዳ</translation> <translation id="939736085109172342">አዲስ ዓቃፊ</translation> <translation id="951104842009476243">ተቀባይነት ያላቸው የዴቢት እና የቅድመ-ክፍያ ካርዶች</translation> +<translation id="962484866189421427">ይህ ይዘት የሆነ ሌላ ነገር እንደሆኑ የሚያስመስሉ አጭበርባሪ መተግበሪያዎችን ወይም እርስዎን ለመከታተል ጥቅም ላይ ሊውል የሚችል ውሂብን የሚሰበስቡ መተግበሪያዎችን ለመጫን ሊሞክር ይችል ይሆናል። <ph name="BEGIN_LINK" />የሆነው ሆኖ አሳይ<ph name="END_LINK" /></translation> <translation id="969892804517981540">ይፋ ግንባታ</translation> <translation id="973773823069644502">የማድረሻ አድራሻ ያክሉ</translation> <translation id="975560348586398090">{COUNT,plural, =0{ምንም}=1{1 ንጥል}one{# ንጥሎች}other{# ንጥሎች}}</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 9d57330..a931a43 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">هل تريد حفظ هذه البطاقة في حسابك في Google وعلى هذا الجهاز؟</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">تنتهي في <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">تم حظر المحتوى الضار.</translation> <translation id="382518646247711829">إذا كنت تستخدم خادمًا وكيلاً...</translation> <translation id="3828924085048779000">غير مسموح باستخدام عبارة مرور فارغة.</translation> <translation id="385051799172605136">الرجوع إلى الوراء</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">إجراءات</translation> <translation id="4958444002117714549">توسيع القائمة</translation> <translation id="4974590756084640048">إعادة تفعيل التحذيرات</translation> +<translation id="4988217478422488391">دفع ثمن المشتريات على الإنترنت بشكلِ أسرع</translation> <translation id="4989809363548539747">هذا المكوِّن الإضافي غير مدعوم</translation> <translation id="5002932099480077015">إذا تم التمكين، سيخزن Chrome نسخة من بطاقتك على هذا الجهاز لملء النموذج بشكل أسرع.</translation> <translation id="5018422839182700155">يتعذّر فتح هذه الصفحة</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">إعادة الت&حرير</translation> <translation id="5481076368049295676">قد يحاول هذا المحتوى تثبيت برامج خطيرة على جهازك تسرق معلوماتك أو تحذفها. <ph name="BEGIN_LINK" />عرض على أي حال<ph name="END_LINK" /></translation> <translation id="54817484435770891">إضافة عنوان صالح</translation> +<translation id="5490432419156082418">العناوين والمزيد</translation> <translation id="5492298309214877701">يكون لموقع الويب هذا على الشبكة الداخلية للشركة أو المؤسسة أو المدرسة نفس عنوان URL لأحد مواقع الويب الخارجية. <ph name="LINE_BREAK" /> حاول الاتصال بمشرف النظام.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 قيد الاستخدام}zero{# قيد الاستخدام}two{# قيد الاستخدام}few{# قيد الاستخدام}many{# قيد الاستخدام}other{# قيد الاستخدام}}</translation> <translation id="5922853866070715753">أوشكْت على الانتهاء.</translation> <translation id="5939518447894949180">إعادة</translation> +<translation id="5951495562196540101">لا يمكن التسجيل في حساب المستهلك (الترخيص المجمّع متوفّر).</translation> <translation id="5967592137238574583">تعديل معلومات الاتصال</translation> <translation id="5967867314010545767">إزالة من السجل</translation> <translation id="5975083100439434680">تصغير</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">سيؤدي هذا إلى خروجك من معظم مواقع الويب.</translation> <translation id="8437238597147034694">تراجع عن ال&نقل</translation> <translation id="8466379296835108687">{COUNT,plural, =1{بطاقة ائتمان واحدة}zero{# بطاقة ائتمان}two{بطاقتا ائتمان (#)}few{# بطاقات ائتمان}many{# بطاقة ائتمان}other{# بطاقة ائتمان}}</translation> +<translation id="8473863474539038330">العناوين والمزيد</translation> <translation id="8483780878231876732">لاستخدام البطاقات من حسابك في Google، يُرجى تسجيل الدخول إلى Chrome</translation> <translation id="8488350697529856933">تنطبق على</translation> <translation id="8498891568109133222">استغرق <ph name="HOST_NAME" /> وقتًا أطول مما يجب للاستجابة.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">أدخل تاريخ انتهاء الصلاحية ورمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" /> لتحديث تفاصيل بطاقتك. وبعد التأكيد، ستتم مشاركة تفاصيل البطاقة من حساب دفعات Google مع هذا الموقع.</translation> <translation id="8957210676456822347">تفويض المدخل المقيد</translation> <translation id="8971063699422889582">انتهت صلاحية شهادة الخادم.</translation> +<translation id="8975012916872825179">تضمين معلومات مثل أرقام الهواتف وعناوين البريد الإلكتروني وعناوين الشحن</translation> <translation id="8978053250194585037">رصد التصفح الآمن من Google عن وجود <ph name="BEGIN_LINK" />تصيّد احتيالي<ph name="END_LINK" /> مؤخرًا على موقع <ph name="SITE" />، إذ تتظاهر مواقع التصيد الاحتيالي بكونها مواقع ويب أخرى لخداعك.</translation> <translation id="8983003182662520383">طرق الدفع والعناوين باستخدام Google Pay</translation> <translation id="8987927404178983737">شهر</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">محو النموذج</translation> <translation id="939736085109172342">مجلد جديد</translation> <translation id="951104842009476243">بطاقات السحب الآلي وبطاقات الدفع المسبق المقبولة</translation> +<translation id="962484866189421427">قد يحاول هذا المحتوى تثبيت تطبيقات مضللة تدعي أنها شيء آخر أو تجمع بيانات قد تُستخدم لتتبعك. <ph name="BEGIN_LINK" />العرض على أي حال<ph name="END_LINK" /></translation> <translation id="969892804517981540">البنية الرسمية</translation> <translation id="973773823069644502">إضافة عنوان التسليم للمستخدم</translation> <translation id="975560348586398090">{COUNT,plural, =0{بدون}=1{عنصر واحد}two{عنصران (#)}few{# عناصر}many{# عنصرًا}other{# عنصر}}</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 5c3681e..e968af5 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Искате ли тази карта да се запази на устройството и в профила ви в Google?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Изтича на <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Блокирано бе вредно съдържание.</translation> <translation id="382518646247711829">Ако използвате прокси сървър...</translation> <translation id="3828924085048779000">Не може пропускът да не се попълни.</translation> <translation id="385051799172605136">Назад</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Действия</translation> <translation id="4958444002117714549">Разгъване на списъка</translation> <translation id="4974590756084640048">Повторно активиране на предупрежденията</translation> +<translation id="4988217478422488391">Ускорява плащанията ви онлайн</translation> <translation id="4989809363548539747">Тази приставка не се поддържа</translation> <translation id="5002932099480077015">Ако настройката е активирана, копие на картата ви ще се съхранява в Chrome на това устройство с цел по-бързо попълване на формуляри.</translation> <translation id="5018422839182700155">Тази страница не може да се отвори</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Възстановяване на редактирането</translation> <translation id="5481076368049295676">Въпросното съдържание може да се опита да инсталира опасен софтуер на устройството ви, който да открадне или изтрие информацията ви. <ph name="BEGIN_LINK" />Показване въпреки това<ph name="END_LINK" /></translation> <translation id="54817484435770891">Добавяне на валиден адрес</translation> +<translation id="5490432419156082418">Адреси и др.</translation> <translation id="5492298309214877701">Този интранет сайт на фирмата, организацията или училището има същия URL адрес като на външен уебсайт. <ph name="LINE_BREAK" /> Опитайте да се свържете със системния си администратор.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Използва се 1}other{Използват се #}}</translation> <translation id="5922853866070715753">Почти готово</translation> <translation id="5939518447894949180">Нулиране</translation> +<translation id="5951495562196540101">Не е възможно регистриране с профил на потребител (налице е лиценз в пакет).</translation> <translation id="5967592137238574583">Редактиране на информацията за връзка</translation> <translation id="5967867314010545767">Премахване от историята</translation> <translation id="5975083100439434680">Намаляване на мащаба</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Ще излезете от повечето уебсайтове.</translation> <translation id="8437238597147034694">&Отмяна на преместването</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 кредитна карта}other{# кредитни карти}}</translation> +<translation id="8473863474539038330">Адреси и др.</translation> <translation id="8483780878231876732">За да използвате картите от профила си в Google, влезте в Chrome</translation> <translation id="8488350697529856933">Прилага се към</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> не отговаря твърде дълго време.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Въведете датата на валидност и кода за проверка за <ph name="CREDIT_CARD" />, за да актуализирате данните за картата си. След като я потвърдите, данните за нея от профила ви в Google Payments ще бъдат споделени с този сайт.</translation> <translation id="8957210676456822347">Упълномощаване в портал за удостоверяване</translation> <translation id="8971063699422889582">Сертификатът на сървъра е с изтекла валидност.</translation> +<translation id="8975012916872825179">Включва информация като телефонни номера, имейл адреси и адреси за доставка</translation> <translation id="8978053250194585037">Google Безопасно сърфиране наскоро <ph name="BEGIN_LINK" />откри фишинг<ph name="END_LINK" /> на <ph name="SITE" />. Сайтовете за фишинг се представят за други уебсайтове с цел да ви подведат.</translation> <translation id="8983003182662520383">Начини на плащане и адреси посредством Google Pay</translation> <translation id="8987927404178983737">Месец</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">ИЗЧИСТВАНЕ НА ФОРМУЛЯРА</translation> <translation id="939736085109172342">Нова папка</translation> <translation id="951104842009476243">Приемани дебитни и предплатени карти</translation> +<translation id="962484866189421427">Въпросното съдържание може да се опита да инсталира измамни приложения, които се представят за нещо друго или събират данни, които може да се използват за проследяването ви. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="969892804517981540">Официално издание</translation> <translation id="973773823069644502">Добавяне на адрес за бърза доставка</translation> <translation id="975560348586398090">{COUNT,plural, =0{Няма}=1{1 елемент}other{# елемента}}</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 593a41d..a5cdea2 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Vols desar aquesta targeta al teu compte de Google i en aquest dispositiu?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Data de caducitat: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">S'ha bloquejat contingut perjudicial.</translation> <translation id="382518646247711829">Si feu servir un servidor intermediari...</translation> <translation id="3828924085048779000">Les frases de contrasenya no poder estar buides.</translation> <translation id="385051799172605136">Enrere</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Accions</translation> <translation id="4958444002117714549">Desplega la llista</translation> <translation id="4974590756084640048">Torna a activar els advertiments</translation> +<translation id="4988217478422488391">Agilitza el pagament de les compres en línia</translation> <translation id="4989809363548539747">Aquest connector no és compatible</translation> <translation id="5002932099480077015">Si s'activa, Chrome emmagatzemarà una còpia de la targeta en aquest dispositiu per agilitzar l'emplenament de formularis.</translation> <translation id="5018422839182700155">No es pot obrir aquesta pàgina</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Refés la modificació</translation> <translation id="5481076368049295676">Aquest contingut pot provar d'instal·lar programari maliciós al teu dispositiu per suprimir-ne informació o robar-te'n. <ph name="BEGIN_LINK" />Mostra igualment<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Afegeix una adreça vàlida</translation> +<translation id="5490432419156082418">Adreces i més</translation> <translation id="5492298309214877701">Aquest lloc de la intranet de l'empresa, l'organització o el centre educatiu té el mateix URL que un lloc web extern. <ph name="LINE_BREAK" /> Proveu de contactar amb l'administrador del sistema.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en ús}other{# en ús}}</translation> <translation id="5922853866070715753">Ja queda poc</translation> <translation id="5939518447894949180">Restableix</translation> +<translation id="5951495562196540101">El dispositiu no es pot inscriure amb un compte de consumidor (llicència empaquetada disponible).</translation> <translation id="5967592137238574583">Edita la informació de contacte</translation> <translation id="5967867314010545767">Elimina de l'historial</translation> <translation id="5975083100439434680">Redueix</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Amb aquesta acció es tancarà la sessió a la majoria de llocs web.</translation> <translation id="8437238597147034694">&Desfés el moviment</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 targeta de crèdit}other{# targetes de crèdit}}</translation> +<translation id="8473863474539038330">Adreces i més</translation> <translation id="8483780878231876732">Per poder utilitzar targetes del teu compte de Google, inicia la sessió a Chrome</translation> <translation id="8488350697529856933">Objectiu d'aplicació</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ha tardat massa a respondre.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Introdueix la data de caducitat i el CVC de la targeta <ph name="CREDIT_CARD" /> per actualitzar-ne els detalls. Un cop confirmada, els detalls de la targeta del compte de pagaments de Google es compartiran amb aquest lloc web.</translation> <translation id="8957210676456822347">Autorització de portals captius</translation> <translation id="8971063699422889582">El certificat del servidor ha caducat.</translation> +<translation id="8975012916872825179">Inclou informació com ara números de telèfon, adreces electròniques i adreces d'enviament</translation> <translation id="8978053250194585037">Navegació segura de Google ha <ph name="BEGIN_LINK" />detectat recentment activitat de pesca<ph name="END_LINK" /> a <ph name="SITE" />. Els llocs web de pesca es fan passar per altres llocs web per enganyar-te.</translation> <translation id="8983003182662520383">Formes de pagament i adreces que fan servir Google Pay</translation> <translation id="8987927404178983737">Mes</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">ESBORRA EL FORMULARI</translation> <translation id="939736085109172342">Carpeta nova</translation> <translation id="951104842009476243">Targetes de dèbit i de prepagament acceptades</translation> +<translation id="962484866189421427">Pot ser que aquest contingut provi d'instal·lar aplicacions enganyoses que es facin passar per d'altres o que recullin dades que podrien utilitzar-se per fer un seguiment de la teva activitat. <ph name="BEGIN_LINK" />Mostra igualment<ph name="END_LINK" /></translation> <translation id="969892804517981540">Muntatge oficial</translation> <translation id="973773823069644502">Afegeix una adreça d'entrega</translation> <translation id="975560348586398090">{COUNT,plural, =0{Cap}=1{1 element}other{# elements}}</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index d7c3cef..5e2246c 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -418,6 +418,7 @@ <translation id="3778403066972421603">Chcete tuto kartu uložit do svého účtu Google a do tohoto zařízení?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Platnost do: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Byl zablokován škodlivý obsah.</translation> <translation id="382518646247711829">Pokud používáte proxy server...</translation> <translation id="3828924085048779000">Prázdná heslová fráze není povolena.</translation> <translation id="385051799172605136">Zpět</translation> @@ -574,6 +575,7 @@ <translation id="495170559598752135">Akce</translation> <translation id="4958444002117714549">Rozbalit seznam</translation> <translation id="4974590756084640048">Znovu zapnout upozornění</translation> +<translation id="4988217478422488391">Urychluje placení za nákupy na internetu</translation> <translation id="4989809363548539747">Tento plugin není podporován</translation> <translation id="5002932099480077015">Pokud je tato možnost aktivována, Chrome do zařízení uloží kopii karty za účelem rychlejšího vyplňování formulářů.</translation> <translation id="5018422839182700155">Tuto stránku nelze otevřít</translation> @@ -653,6 +655,7 @@ <translation id="5470861586879999274">&Opakovat úpravy</translation> <translation id="5481076368049295676">Tento obsah by vám do zařízení mohl zkusit nainstalovat nebezpečný software, který odcizuje nebo maže informace. <ph name="BEGIN_LINK" />Přesto zobrazit<ph name="END_LINK" /></translation> <translation id="54817484435770891">Přidejte platnou adresu</translation> +<translation id="5490432419156082418">Adresy a další</translation> <translation id="5492298309214877701">Tato stránka v intranetu společnosti, organizace nebo školy má stejnou adresu URL jako externí web. <ph name="LINE_BREAK" /> Kontaktujte administrátora systému.</translation> @@ -716,6 +719,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Používá se 1}few{Používají se #}many{Používá se #}other{Používá se #}}</translation> <translation id="5922853866070715753">Téměř dokončeno</translation> <translation id="5939518447894949180">Resetovat</translation> +<translation id="5951495562196540101">Pomocí běžného uživatelského účtu se nelze zaregistrovat (je k dispozici licence v balíčku).</translation> <translation id="5967592137238574583">Úprava kontaktních údajů</translation> <translation id="5967867314010545767">Odstranit z historie</translation> <translation id="5975083100439434680">Oddálit</translation> @@ -1059,6 +1063,7 @@ <translation id="8433057134996913067">Budete odhlášeni z většiny webů.</translation> <translation id="8437238597147034694">&Vrátit přesunutí zpět</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 platební karta}few{# platební karty}many{# platební karty}other{# platebních karet}}</translation> +<translation id="8473863474539038330">Adresy a další</translation> <translation id="8483780878231876732">Chcete-li používat karty z účtu Google, přihlaste se do Chromu.</translation> <translation id="8488350697529856933">Platí pro</translation> <translation id="8498891568109133222">Odpověď webu <ph name="HOST_NAME" /> trvala příliš dlouho.</translation> @@ -1119,6 +1124,7 @@ <translation id="8952525071319348207">Chcete-li aktualizovat údaje o kartě, zadejte datum vypršení platnosti a kód CVC karty <ph name="CREDIT_CARD" />. Po ověření budou údaje o kartě z vašeho účtu Google Payments poskytnuty tomuto webu.</translation> <translation id="8957210676456822347">Autorizace captive portálu</translation> <translation id="8971063699422889582">Platnost certifikátu serveru vypršela.</translation> +<translation id="8975012916872825179">Zahrnuje informace jako telefonní čísla, e-mailové adresy a dodací adresy</translation> <translation id="8978053250194585037">Služba Bezpečné prohlížení Google nedávno na webu <ph name="SITE" /> <ph name="BEGIN_LINK" />zjistila phishing<ph name="END_LINK" />. Phishingové weby se vás snaží oklamat tím, že se vydávají za jiné weby.</translation> <translation id="8983003182662520383">Platební metody a adresy pomocí služby Google Pay</translation> <translation id="8987927404178983737">Měsíc</translation> @@ -1167,6 +1173,7 @@ <translation id="935608979562296692">VYMAZAT FORMULÁŘ</translation> <translation id="939736085109172342">Nová složka</translation> <translation id="951104842009476243">Přijímané debetní a předplacené karty</translation> +<translation id="962484866189421427">Tento obsah by se mohl pokusit instalovat klamavé aplikace, které se vydávají za něco jiného nebo shromažďují data ke sledování vaší aktivity. <ph name="BEGIN_LINK" />Přesto zobrazit<ph name="END_LINK" /></translation> <translation id="969892804517981540">Oficiální sestavení</translation> <translation id="973773823069644502">Přidat adresu doručení</translation> <translation id="975560348586398090">{COUNT,plural, =0{Žádné}=1{1 položka}few{# položky}many{# položky}other{# položek}}</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index bd0c064e..ff769551 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Vil du gemme dette kort på din Google-konto og på denne enhed?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Udløber <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Skadeligt indhold blokeres.</translation> <translation id="382518646247711829">Hvis du bruger en proxyserver...</translation> <translation id="3828924085048779000">Tomme adgangssætninger er ikke tilladt.</translation> <translation id="385051799172605136">Tilbage</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Handlinger</translation> <translation id="4958444002117714549">Udvid liste</translation> <translation id="4974590756084640048">Genaktiver advarsler</translation> +<translation id="4988217478422488391">Gør det hurtigere at betale for ting online</translation> <translation id="4989809363548539747">Dette plugin understøttes ikke</translation> <translation id="5002932099480077015">Hvis denne indstilling er slået til, gemmer Chrome en kopi af dit kort på denne enhed for at gøre det hurtigere at udfylde formularer.</translation> <translation id="5018422839182700155">Denne side kan ikke åbnes</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Annuller fortryd redigering</translation> <translation id="5481076368049295676">Dette indhold forsøger muligvis at installere farlig software på din enhed, der kan stjæle eller slette dine oplysninger. <ph name="BEGIN_LINK" />Vis alligevel<ph name="END_LINK" /></translation> <translation id="54817484435770891">Tilføj gyldig adresse</translation> +<translation id="5490432419156082418">Adresser og meget mere</translation> <translation id="5492298309214877701">Dette website på virksomhedens, organisationens eller skolens intranet har samme webadresse som et eksternt website. <ph name="LINE_BREAK" /> Prøv at kontakte din systemadministrator.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 i brug}one{# i brug}other{# i brug}}</translation> <translation id="5922853866070715753">Næsten færdig</translation> <translation id="5939518447894949180">Nulstil</translation> +<translation id="5951495562196540101">Det er ikke muligt at tilmelde sig med en forbrugerkonto (pakket licens er tilgængelig).</translation> <translation id="5967592137238574583">Rediger kontaktoplysninger</translation> <translation id="5967867314010545767">Fjern fra historik</translation> <translation id="5975083100439434680">Zoom ud</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Dette logger dig ud af de fleste websites.</translation> <translation id="8437238597147034694">&Fortryd flytning</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kreditkort}one{# kreditkort}other{# kreditkort}}</translation> +<translation id="8473863474539038330">Adresser og meget mere</translation> <translation id="8483780878231876732">Hvis du vil bruge kort fra din Google-konto, skal du logge ind i Chrome</translation> <translation id="8488350697529856933">Gælder for</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> var for lang tid om at svare.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Opdater dine kortoplysninger ved at indtaste udløbsdatoen og kontrolkoden for <ph name="CREDIT_CARD" />. Når du bekræfter, deles kortoplysningerne på din konto i Google Payments med dette website.</translation> <translation id="8957210676456822347">Godkendelse af captive portal</translation> <translation id="8971063699422889582">Serverens certifikat er udløbet.</translation> +<translation id="8975012916872825179">Omfatter oplysninger såsom telefonnumre, mailadresser og leveringsadresser</translation> <translation id="8978053250194585037">Google Beskyttet browsing <ph name="BEGIN_LINK" />registrerede phishing<ph name="END_LINK" /> på <ph name="SITE" /> for nylig. Phishing-websites udgiver sig for at være andre websites med det formål at narre dig.</translation> <translation id="8983003182662520383">Betalingsmetoder og adresser, der bruger Google Pay</translation> <translation id="8987927404178983737">Måned</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">RYD FORMULAREN</translation> <translation id="939736085109172342">Ny mappe</translation> <translation id="951104842009476243">Accepterede betalingskort og forudbetalte kort</translation> +<translation id="962484866189421427">Dette indhold kan forsøge at installere vildledende apps, der foregiver at være noget andet, eller som indsamler data, der kan anvendes til at overvåge dig. <ph name="BEGIN_LINK" />Vis alligevel<ph name="END_LINK" /></translation> <translation id="969892804517981540">Officiel version</translation> <translation id="973773823069644502">Tilføj leveringsadresse</translation> <translation id="975560348586398090">{COUNT,plural, =0{Ingen}=1{1 element}one{# element}other{# elementer}}</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 7c46d6f..b3638eda 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -421,6 +421,7 @@ <translation id="3778403066972421603">Möchten Sie diese Karte in Ihrem Google-Konto und auf diesem Gerät speichern?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Ablaufdatum: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Schädliche Inhalte blockiert.</translation> <translation id="382518646247711829">Falls Sie einen Proxyserver verwenden...</translation> <translation id="3828924085048779000">Eine leere Passphrase ist nicht zulässig.</translation> <translation id="385051799172605136">Zurück</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">Aktionen</translation> <translation id="4958444002117714549">Liste einblenden</translation> <translation id="4974590756084640048">Warnmeldungen wieder aktivieren</translation> +<translation id="4988217478422488391">Beschleunigt die Onlinezahlung</translation> <translation id="4989809363548539747">Dieses Plug-in wird nicht unterstützt</translation> <translation id="5002932099480077015">Wenn diese Funktion aktiviert ist, speichert Chrome eine Kopie Ihrer Karte auf diesem Gerät, um ein Ausfüllen von Formularen zu beschleunigen.</translation> <translation id="5018422839182700155">Diese Seite kann nicht geöffnet werden</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&Bearbeiten wiederholen</translation> <translation id="5481076368049295676">Diese Inhalte versuchen möglicherweise, gefährliche Software auf Ihrem Gerät zu installieren, durch die Ihre Informationen gestohlen oder gelöscht werden. <ph name="BEGIN_LINK" />Trotzdem anzeigen<ph name="END_LINK" /></translation> <translation id="54817484435770891">Gültige Adresse hinzufügen</translation> +<translation id="5490432419156082418">AutoFill-Einstellungen</translation> <translation id="5492298309214877701">Diese Website im Intranet des Unternehmens, der Organisation oder der Schule hat die gleiche URL wie eine externe Website. <ph name="LINE_BREAK" /> Wenden Sie sich an Ihren Systemadministrator.</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 wird verwendet}other{# werden verwendet}}</translation> <translation id="5922853866070715753">Fast fertig</translation> <translation id="5939518447894949180">Zurücksetzen</translation> +<translation id="5951495562196540101">Registrierung mit Kundenkonto nicht möglich (Paketlizenz verfügbar).</translation> <translation id="5967592137238574583">Kontaktdaten bearbeiten</translation> <translation id="5967867314010545767">Aus Verlauf entfernen</translation> <translation id="5975083100439434680">Verkleinern</translation> @@ -928,7 +932,7 @@ <translation id="7542995811387359312">Die Funktion zur automatischen Ausfüllung der Kreditkartendaten ist deaktiviert, da dieses Formular keine sichere Verbindung nutzt.</translation> <translation id="7543525346216957623">Frag deine Eltern</translation> <translation id="7548892272833184391">Verbindungsfehler beheben</translation> -<translation id="7549584377607005141">Damit diese Webseite richtig angezeigt wird, werden die Daten benötigt, die Sie zuvor eingegeben haben. Sie können diese Daten erneut senden, dabei werden jedoch sämtliche Aktionen wiederholt, die zuvor durch diese Seite ausgeführt wurden.</translation> +<translation id="7549584377607005141">Damit diese Webseite richtig angezeigt wird, werden die Daten benötigt, die Sie vorher eingegeben haben. Sie können diese Daten noch einmal senden, dabei werden jedoch sämtliche Aktionen wiederholt, die vorher durch diese Seite ausgeführt wurden.</translation> <translation id="7552846755917812628">Probieren Sie folgende Tipps aus:</translation> <translation id="7554791636758816595">Neuer Tab</translation> <translation id="7564049878696755256">Sie könnten den Zugriff auf Ihr <ph name="ORG_NAME" />-Konto verlieren oder zum Opfer von Identitätsdiebstahl werden. Chrome empfiehlt Ihnen, Ihr Passwort jetzt zu ändern.</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Dadurch werden Sie von den meisten Websites abgemeldet.</translation> <translation id="8437238597147034694">&Verschieben rückgängig machen</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 Kreditkarte}other{# Kreditkarten}}</translation> +<translation id="8473863474539038330">AutoFill-Einstellungen</translation> <translation id="8483780878231876732">Melden Sie sich in Chrome an, um in Ihrem Google-Konto gespeicherte Kreditkarten zu verwenden</translation> <translation id="8488350697529856933">Gilt für</translation> <translation id="8498891568109133222">Die Antwort von <ph name="HOST_NAME" /> hat zu lange gedauert.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Geben Sie das Ablaufdatum und den CVC für <ph name="CREDIT_CARD" /> ein, um Ihre Kartendetails zu aktualisieren. Nach erfolgter Bestätigung werden die Kartendetails Ihres Google Payments-Kontos an diese Website weitergegeben.</translation> <translation id="8957210676456822347">Erfassungsportal-Autorisierung</translation> <translation id="8971063699422889582">Das Serverzertifikat ist abgelaufen.</translation> +<translation id="8975012916872825179">Enthält Informationen wie Telefonnummern, E-Mail-Adressen und Lieferadressen</translation> <translation id="8978053250194585037">Google Safe Browsing hat kürzlich <ph name="BEGIN_LINK" />Phishingaktivitäten<ph name="END_LINK" /> auf <ph name="SITE" /> festgestellt. Phishingwebsites geben sich als andere Websites aus, um Sie zu täuschen.</translation> <translation id="8983003182662520383">Bei Google Pay gespeicherte Zahlungsmethoden und Adressen</translation> <translation id="8987927404178983737">Monat</translation> @@ -1159,7 +1165,7 @@ <translation id="9148507642005240123">&Bearbeiten rückgängig machen</translation> <translation id="9154194610265714752">Aktualisiert</translation> <translation id="9157595877708044936">Einrichtung läuft...</translation> -<translation id="9168814207360376865">Ermöglicht Websites zu überprüfen, ob Sie eine Zahlungsmethode gespeichert haben</translation> +<translation id="9168814207360376865">Websites die Abfrage gespeicherter Zahlungsmethoden erlauben</translation> <translation id="9169664750068251925">Auf dieser Website immer blockieren</translation> <translation id="9170848237812810038">&Rückgängig</translation> <translation id="9171296965991013597">App schließen?</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">Formular leeren</translation> <translation id="939736085109172342">Neuer Ordner</translation> <translation id="951104842009476243">Akzeptierte Debit- und Prepaidkarten</translation> +<translation id="962484866189421427">Dieser Inhalt könnte betrügerische Apps installieren, die scheinbar einem anderen Zweck dienen oder Daten erfassen, um Sie auszuspionieren. <ph name="BEGIN_LINK" />Trotzdem zeigen<ph name="END_LINK" /></translation> <translation id="969892804517981540">Offizieller Build</translation> <translation id="973773823069644502">Lieferadresse hinzufügen</translation> <translation id="975560348586398090">{COUNT,plural, =0{Keine}=1{1 Eintrag}other{# Einträge}}</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 19d8c3e..32ac820c 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Θέλετε να αποθηκεύσετε αυτήν την κάρτα στον Λογαριασμό σας Google και σε αυτήν τη συσκευή;</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Λήγει <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Το επιβλαβές περιεχόμενο αποκλείστηκε.</translation> <translation id="382518646247711829">Εάν χρησιμοποιείτε διακομιστή μεσολάβησης…</translation> <translation id="3828924085048779000">Δεν επιτρέπεται να είναι κενή η φράση πρόσβασης.</translation> <translation id="385051799172605136">Πίσω</translation> @@ -579,6 +580,7 @@ <translation id="495170559598752135">Ενέργειες</translation> <translation id="4958444002117714549">Ανάπτυξη λίστας</translation> <translation id="4974590756084640048">Επανενεργοποίηση προειδοποιήσεων</translation> +<translation id="4988217478422488391">Κάνει τη διαδικασία των πληρωμών στο διαδίκτυο πιο γρήγορη</translation> <translation id="4989809363548539747">Αυτή η προσθήκη δεν υποστηρίζεται</translation> <translation id="5002932099480077015">Εάν ενεργοποιηθεί, το Chrome θα αποθηκεύσει ένα αντίγραφο της κάρτας σας σε αυτήν τη συσκευή για ταχύτερη συμπλήρωση φορμών.</translation> <translation id="5018422839182700155">Δεν είναι δυνατό το άνοιγμα αυτής της σελίδας</translation> @@ -658,6 +660,7 @@ <translation id="5470861586879999274">&Επανάληψη επεξεργασίας</translation> <translation id="5481076368049295676">Αυτό το περιεχόμενο μπορεί να προσπαθήσει να εγκαταστήσει επικίνδυνο λογισμικό στη συσκευή σας το οποίο κλέβει ή διαγράφει τα στοιχεία σας. <ph name="BEGIN_LINK" />Εμφάνιση ούτως ή άλλως<ph name="END_LINK" /></translation> <translation id="54817484435770891">Προσθήκη έγκυρης διεύθυνσης</translation> +<translation id="5490432419156082418">Διευθύνσεις και άλλα</translation> <translation id="5492298309214877701">Αυτός ο ιστότοπος που βρίσκεται στο εσωτερικό δίκτυο της εταιρείας, του οργανισμού ή του σχολείου έχει το ίδιο URL με έναν εξωτερικό ιστότοπο. <ph name="LINE_BREAK" /> Δοκιμάστε να επικοινωνήσετε με το διαχειριστή δικτύου σας.</translation> @@ -721,6 +724,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 σε χρήση}other{# σε χρήση}}</translation> <translation id="5922853866070715753">Σχεδόν ολοκληρώθηκε</translation> <translation id="5939518447894949180">Επαναφορά</translation> +<translation id="5951495562196540101">Δεν είναι δυνατή η εγγραφή με λογαριασμό καταναλωτή (διατίθεται συμπιεσμένη άδεια).</translation> <translation id="5967592137238574583">Επεξεργασία στοιχείων επικοινωνίας</translation> <translation id="5967867314010545767">Κατάργηση από το ιστορικό</translation> <translation id="5975083100439434680">Σμίκρυνση</translation> @@ -1066,6 +1070,7 @@ <translation id="8433057134996913067">Αυτή η ενέργεια θα σας αποσυνδέσει από τους περισσότερους ιστότοπους.</translation> <translation id="8437238597147034694">&Αναίρεση μετακίνησης</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 πιστωτική κάρτα}other{# πιστωτικές κάρτες}}</translation> +<translation id="8473863474539038330">Διευθύνσεις και άλλα</translation> <translation id="8483780878231876732">Για να χρησιμοποιήσετε κάρτες από τον Λογαριασμό σας Google, συνδεθείτε στο Chrome</translation> <translation id="8488350697529856933">Ισχύει για</translation> <translation id="8498891568109133222">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> άργησε πολύ να ανταποκριθεί.</translation> @@ -1126,6 +1131,7 @@ <translation id="8952525071319348207">Καταχωρίστε την ημερομηνία λήξης και τον κωδικό CVC για την πιστωτική κάρτα <ph name="CREDIT_CARD" />, προκειμένου να ενημερώσετε τα στοιχεία της κάρτας σας. Μετά την επιβεβαίωση, τα στοιχεία της κάρτας από τον λογαριασμό πληρωμών Google θα κοινοποιηθούν σε αυτόν τον ιστότοπο.</translation> <translation id="8957210676456822347">Εξουσιοδότηση πύλης υποδοχής</translation> <translation id="8971063699422889582">Το πιστοποιητικό του διακομιστή έχει λήξει.</translation> +<translation id="8975012916872825179">Περιλαμβάνει πληροφορίες, όπως αριθμούς τηλεφώνου, διευθύνσεις ηλεκτρονικού ταχυδρομείου και διευθύνσεις αποστολής</translation> <translation id="8978053250194585037">Πρόσφατα, η Ασφαλής περιήγηση Google <ph name="BEGIN_LINK" />εντόπισε εκδηλώσεις ηλεκτρονικού ψαρέματος (phishing)<ph name="END_LINK" /> στον ιστότοπο <ph name="SITE" />. Οι ιστότοποι ηλεκτρονικού ψαρέματος (phishing) παρουσιάζονται ψευδώς σαν άλλου τύπου ιστότοποι, για να σας εξαπατήσουν.</translation> <translation id="8983003182662520383">Τρόποι πληρωμής και διευθύνσεις που χρησιμοποιούν το Google Pay</translation> <translation id="8987927404178983737">Μήνας</translation> @@ -1174,6 +1180,7 @@ <translation id="935608979562296692">ΔΙΑΓΡΑΦΗ ΦΟΡΜΑΣ</translation> <translation id="939736085109172342">Νέος φάκελος</translation> <translation id="951104842009476243">Αποδεκτές χρεωστικές και προπληρωμένες κάρτες</translation> +<translation id="962484866189421427">Αυτό το περιεχόμενο μπορεί να επιχειρήσει να εγκαταστήσει παραπλανητικές εφαρμογές που προσποιούνται ότι είναι κάτι άλλο ή συλλέγουν δεδομένα τα οποία μπορεί να χρησιμοποιηθούν για την παρακολούθησή σας. <ph name="BEGIN_LINK" />Να εμφανίζεται ούτως ή άλλως<ph name="END_LINK" /></translation> <translation id="969892804517981540">Επίσημη έκδοση</translation> <translation id="973773823069644502">Προσθήκη διεύθυνσης παράδοσης</translation> <translation id="975560348586398090">{COUNT,plural, =0{Κανένα}=1{1 στοιχείο}other{# στοιχεία}}</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 2dc644a1..daa7434 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">¿Quieres guardar esta tarjeta en tu cuenta de Google y en este dispositivo?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Vencimiento: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Contenido dañino bloqueado.</translation> <translation id="382518646247711829">Si utilizas un servidor proxy...</translation> <translation id="3828924085048779000">La frase de contraseña no puede estar vacía.</translation> <translation id="385051799172605136">Atrás</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Acciones</translation> <translation id="4958444002117714549">Expandir lista</translation> <translation id="4974590756084640048">Volver a habilitar advertencias</translation> +<translation id="4988217478422488391">Te permite pagar online más rápido</translation> <translation id="4989809363548539747">Este complemento no es compatible</translation> <translation id="5002932099480077015">Si se habilita esta opción, Chrome guardará una copia de tu tarjeta en este dispositivo para rellenar la información más rápido.</translation> <translation id="5018422839182700155">No se puede abrir esta página</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Rehacer edición</translation> <translation id="5481076368049295676">Es posible que este contenido intente instalar software peligroso que robe o elimine tu información en el dispositivo. <ph name="BEGIN_LINK" />Mostrar de todos modos<ph name="END_LINK" /></translation> <translation id="54817484435770891">Añadir dirección válida</translation> +<translation id="5490432419156082418">Direcciones y más</translation> <translation id="5492298309214877701">Este sitio web de la intranet del centro educativo, de la organización o de la empresa tiene la misma URL que un sitio web externo. <ph name="LINE_BREAK" /> Ponte en contacto con el administrador del sistema.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en uso}other{# en uso}}</translation> <translation id="5922853866070715753">Casi hemos acabado</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5951495562196540101">No te puedes registrar con una cuenta de consumidor (licencia empaquetada disponible).</translation> <translation id="5967592137238574583">Edita la información de contacto</translation> <translation id="5967867314010545767">Eliminar del historial</translation> <translation id="5975083100439434680">Reducir</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Con esta opción, tu sesión se cerrará en la mayoría de sitios web.</translation> <translation id="8437238597147034694">&Deshacer movimiento</translation> <translation id="8466379296835108687">{COUNT,plural, =1{Una tarjeta de crédito}other{# tarjetas de crédito}}</translation> +<translation id="8473863474539038330">Direcciones y más</translation> <translation id="8483780878231876732">Inicia sesión en Chrome para utilizar tarjetas de tu cuenta de Google</translation> <translation id="8488350697529856933">Aplicable a</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ha tardado demasiado tiempo en responder.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Introduce la fecha de vencimiento y el CVC de <ph name="CREDIT_CARD" /> para actualizar la información de tu tarjeta. Una vez que confirmes esta acción, la información de la tarjeta de tu cuenta de pagos de Google se compartirá con este sitio web.</translation> <translation id="8957210676456822347">Autorización de portal cautivo</translation> <translation id="8971063699422889582">El certificado del servidor ha caducado.</translation> +<translation id="8975012916872825179">Incluye información como números de teléfono, direcciones de correo electrónico y direcciones de envío</translation> <translation id="8978053250194585037">La función Navegación Segura de Google <ph name="BEGIN_LINK" />ha detectado phishing<ph name="END_LINK" /> en <ph name="SITE" />. Los sitios web de phishing suplantan la identidad de otros sitios web para engañarte.</translation> <translation id="8983003182662520383">Métodos de pago y direcciones con Google Pay</translation> <translation id="8987927404178983737">Mes</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">BORRAR FORMULARIO</translation> <translation id="939736085109172342">Nueva carpeta</translation> <translation id="951104842009476243">Tarjetas prepago y de débito aceptadas</translation> +<translation id="962484866189421427">Este contenido podría intentar instalar aplicaciones engañosas que se hagan pasar por otra persona o recojan datos que podrían usarse para realizar un seguimiento de tu actividad. <ph name="BEGIN_LINK" />Mostrar de todos modos<ph name="END_LINK" /></translation> <translation id="969892804517981540">Build oficial</translation> <translation id="973773823069644502">Añadir dirección de entrega</translation> <translation id="975560348586398090">{COUNT,plural, =0{Ninguno}=1{1 elemento}other{# elementos}}</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 6a4fac24..14c9b8c87 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Kas soovite selle kaardi salvestada oma Google'i kontole ja sellesse seadmesse?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Aegub: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Kahjulik sisu on blokeeritud.</translation> <translation id="382518646247711829">Kui kasutate puhverserverit ...</translation> <translation id="3828924085048779000">Tühi parool ei ole lubatud.</translation> <translation id="385051799172605136">Tagasi</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Toimingud</translation> <translation id="4958444002117714549">Laienda loendit</translation> <translation id="4974590756084640048">Luba hoiatused uuesti</translation> +<translation id="4988217478422488391">Võimaldab veebis kiiremini maksta</translation> <translation id="4989809363548539747">Seda pistikprogrammi ei toetata</translation> <translation id="5002932099480077015">Kui see on lubatud, salvestab Chrome teie kaardi koopia vormide kiiremini täitmiseks sellesse seadmesse.</translation> <translation id="5018422839182700155">Seda lehte ei saa avada</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Muuda uuesti</translation> <translation id="5481076368049295676">See sisu võib üritada installida teie seadmesse ohtlikku tarkvara, mis varastab või kustutab teie teavet. <ph name="BEGIN_LINK" />Kuva ikkagi<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Sisestage sobiv aadress</translation> +<translation id="5490432419156082418">Aadressid ja muu</translation> <translation id="5492298309214877701">Sellel ettevõtte, organisatsiooni või kooli intranetis oleval saidil on sama URL mis välisel veebisaidil. <ph name="LINE_BREAK" /> Võtke ühendust süsteemiadministraatoriga.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 on kasutusel}other{# on kasutusel}}</translation> <translation id="5922853866070715753">Peaaegu valmis</translation> <translation id="5939518447894949180">Lähtesta</translation> +<translation id="5951495562196540101">Tarbijakontoga ei saa registreeruda (paketipõhine litsents on saadaval).</translation> <translation id="5967592137238574583">Kontaktteabe muutmine</translation> <translation id="5967867314010545767">Eemalda ajaloost</translation> <translation id="5975083100439434680">Suumib välja</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">See logib teid välja enamikult veebisaitidelt.</translation> <translation id="8437238597147034694">&Võta teisaldamine tagasi</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 krediitkaart}other{# krediitkaarti}}</translation> +<translation id="8473863474539038330">Aadressid ja muu</translation> <translation id="8483780878231876732">Google'i konto kaartide kasutamiseks logige sisse Chrome'i</translation> <translation id="8488350697529856933">Kehtib:</translation> <translation id="8498891568109133222">Hostil <ph name="HOST_NAME" /> kulus vastamiseks liiga kaua aega.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Kaardi üksikasjade värskendamiseks sisestage krediitkaardi <ph name="CREDIT_CARD" /> aegumiskuupäev ja CVC. Kui selle kinnitate, jagatakse teie Google Paymentsi konto kaardi üksikasju selle saidiga.</translation> <translation id="8957210676456822347">Kontrollportaali volitamine</translation> <translation id="8971063699422889582">Serveri sertifikaat on aegunud.</translation> +<translation id="8975012916872825179">Hõlmab näiteks telefoninumbreid, e-posti ja postiaadresse</translation> <translation id="8978053250194585037">Google'i ohutu sirvimise funktsioon <ph name="BEGIN_LINK" />tuvastas hiljuti andmepüügi<ph name="END_LINK" /> saidil <ph name="SITE" />. Andmepüügisaidid teesklevad teie petmiseks, et tegemist on teise saidiga.</translation> <translation id="8983003182662520383">Makseviisid ja aadressid, mis kasutavad teenust Google Pay</translation> <translation id="8987927404178983737">kuu</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">TÜHJENDA VORM</translation> <translation id="939736085109172342">Uus kaust</translation> <translation id="951104842009476243">Aktsepteeritavad ettemakstud ja deebetkaardid</translation> +<translation id="962484866189421427">Sisu võib üritada installida petlikke rakendusi, mis esinevad millegi muuna või koguda andmeid, mida saab kasutada teie jälgimiseks. <ph name="BEGIN_LINK" />Kuva siiski<ph name="END_LINK" /></translation> <translation id="969892804517981540">Ametlik järk</translation> <translation id="973773823069644502">Lisage kohaletoimetamisaadress</translation> <translation id="975560348586398090">{COUNT,plural, =0{Ühtegi}=1{1 üksus}other{# üksust}}</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 95fca9a..c9c2a370 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">آیا میخواهید این کارت در حساب Google شما و این دستگاه ذخیره شود؟</translation> <translation id="3783418713923659662">مسترکارت</translation> <translation id="3787705759683870569">تاریخ انقضا <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">محتوای مضر مسدود شد.</translation> <translation id="382518646247711829">اگر از سرور پراکسی استفاده میکنید...</translation> <translation id="3828924085048779000">عبارت عبور خالی مجاز نیست.</translation> <translation id="385051799172605136">بازگشت</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">کنشها</translation> <translation id="4958444002117714549">بزرگ کردن فهرست</translation> <translation id="4974590756084640048">فعال کردن مجدد اخطارها</translation> +<translation id="4988217478422488391">کمک میکند پرداختهای آنلاین سریعتر انجام شود</translation> <translation id="4989809363548539747">این افزایه پشتیبانی نمیشود</translation> <translation id="5002932099480077015">اگر فعال شود، Chrome یک کپی از کارت شما را برای پرکردن سریعتر فرم در این دستگاه ذخیره میکند.</translation> <translation id="5018422839182700155">این صفحه نمیتواند باز شود</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&انجام مجدد ویرایش</translation> <translation id="5481076368049295676">شاید این محتوا تلاش کند نرمافزار خطرناکی در دستگاهتان نصب کند که اطلاعاتتان را به سرقت برد یا حذف کند. <ph name="BEGIN_LINK" />درهرصورت نمایش داده شود<ph name="END_LINK" /></translation> <translation id="54817484435770891">نشانی معتبری اضافه کنید</translation> +<translation id="5490432419156082418">نشانیها و سایر موارد</translation> <translation id="5492298309214877701">نشانی وب این سایت در اینترانت شرکت، سازمان یا محل تحصیل با نشانی وب یک وبسایت خارجی یکسان است. <ph name="LINE_BREAK" /> با سرپرست سیستم تماس بگیرید.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{۱ کوکی درحال استفاده}one{# کوکی درحال استفاده}other{# کوکی درحال استفاده}}</translation> <translation id="5922853866070715753">تقريباً تمام است</translation> <translation id="5939518447894949180">بازنشانی</translation> +<translation id="5951495562196540101">نمیتوان با حساب مصرفکننده ثبتنام کرد (مجوز بستهبندی دردسترس است).</translation> <translation id="5967592137238574583">ویرایش اطلاعات تماس</translation> <translation id="5967867314010545767">حذف از سابقه</translation> <translation id="5975083100439434680">کوچک نمایی</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">با این کار از سیستم بیشتر وبسایتها خارج میشوید.</translation> <translation id="8437238597147034694">&واگرد انتقال</translation> <translation id="8466379296835108687">{COUNT,plural, =1{۱ کارت اعتباری}one{# کارت اعتباری}other{# کارت اعتباری}}</translation> +<translation id="8473863474539038330">نشانیها و سایر موارد</translation> <translation id="8483780878231876732">برای استفاده از کارتها از حساب Google خود، به سیستم Chrome وارد شوید</translation> <translation id="8488350697529856933">اعمال برای</translation> <translation id="8498891568109133222">پاسخ <ph name="HOST_NAME" /> بیش از حد طول کشیده است.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">برای بهروزرسانی جزئیات کارتتان، تاریخ انقضا و CVC کارت <ph name="CREDIT_CARD" /> را وارد کنید. بعد از تأیید، جزئیات کارت از حساب «پرداختهای Google» با این سایت همرسانی میشود.</translation> <translation id="8957210676456822347">مجوز پورتال محدود</translation> <translation id="8971063699422889582">گواهی سرور منقضی شده است.</translation> +<translation id="8975012916872825179">شامل اطلاعاتی مانند شماره تلفن، نشانی ایمیل و نشانی تحویل کالا میشود</translation> <translation id="8978053250194585037">Google Safe Browsing اخیراً در <ph name="SITE" />، <ph name="BEGIN_LINK" />فیشینگ شناسایی کرده است<ph name="END_LINK" />. سایتهای فیشینگ وانمود میکنند وبسایتهای دیگری هستند تا شما را فریب دهند.</translation> <translation id="8983003182662520383">روشهای پرداخت و نشانیهای مورداستفاده در Google Pay</translation> <translation id="8987927404178983737">ماه</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">پاک کردن فرم</translation> <translation id="939736085109172342">پوشهٔ جدید</translation> <translation id="951104842009476243">کارتهای نقدی و پیشپرداخت قابلقبول</translation> +<translation id="962484866189421427">این محتوا ممکن است برنامههای فریبدهندهای نصب کند که وانمود میکنند برنامه دیگری هستند یا اینکه دادههایی برای ردیابی شما جمعآوری میکنند. <ph name="BEGIN_LINK" />درهرصورت نشان داده شود<ph name="END_LINK" /></translation> <translation id="969892804517981540">ساخت رسمی</translation> <translation id="973773823069644502">افزودن نشانی ارسال</translation> <translation id="975560348586398090">{COUNT,plural, =0{هیچکدام}=1{۱ مورد}one{# مورد}other{# مورد}}</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 9d176fa4..0a351d5 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Gusto mo bang i-save ang card na ito sa iyong Google Account at sa device na ito?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Mag-e-expire sa <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Na-block ang mapaminsalang content.</translation> <translation id="382518646247711829">Kung gumagamit ka ng proxy server...</translation> <translation id="3828924085048779000">Hindi pinapayagan ang walang laman na passphrase.</translation> <translation id="385051799172605136">Bumalik</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Mga Pagkilos</translation> <translation id="4958444002117714549">Palawakin ang listahan</translation> <translation id="4974590756084640048">Muling i-enable ang mga babala</translation> +<translation id="4988217478422488391">Mas pinapabilis ang pagbabayad para sa mga bagay online</translation> <translation id="4989809363548539747">Hindi sinusuportahan ang plugin na ito</translation> <translation id="5002932099480077015">Kung naka-enable, mag-iimbak ang Chrome ng kopya ng iyong card sa device na ito para sa mas mabilis na pagsagot sa form.</translation> <translation id="5018422839182700155">Hindi mabuksan ang page na ito</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Gawing muli ang pag-e-edit</translation> <translation id="5481076368049295676">Maaaring subukan ng content na ito na mag-install ng mapanganib na software sa iyong device na magnanakaw o magde-delete ng impormasyon mo. <ph name="BEGIN_LINK" />Ipakita pa rin<ph name="END_LINK" /></translation> <translation id="54817484435770891">Magdagdag ng wastong address</translation> +<translation id="5490432419156082418">Mga Address at Higit Pa</translation> <translation id="5492298309214877701">Ang URL ng site na ito sa intranet ng kumpanya, organisasyon o paaralan ay kapareho ng URL ng isang external na website. <ph name="LINE_BREAK" /> Subukang makipag-ugnayan sa iyong system administrator.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 ang ginagamit}one{# ang ginagamit}other{# ang ginagamit}}</translation> <translation id="5922853866070715753">Malapit nang matapos</translation> <translation id="5939518447894949180">I-reset</translation> +<translation id="5951495562196540101">Hindi maka-enroll gamit ang account ng consumer (may available na naka-package na lisensya).</translation> <translation id="5967592137238574583">I-edit ang Impormasyon ng Contact</translation> <translation id="5967867314010545767">Alisin sa history</translation> <translation id="5975083100439434680">Mag-zoom out</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Masa-sign out ka sa karamihan ng mga website.</translation> <translation id="8437238597147034694">&I-undo ang paglilipat</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 credit card}one{# credit card}other{# na credit card}}</translation> +<translation id="8473863474539038330">Mga address at higit pa</translation> <translation id="8483780878231876732">Upang gumamit ng mga card mula sa iyong Google Account, mag-sign in sa Chrome</translation> <translation id="8488350697529856933">Nalalapat sa</translation> <translation id="8498891568109133222">Masyadong matagal bago nakatugon ang <ph name="HOST_NAME" />.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Ilagay ang petsa ng pag-expire at CVC para sa <ph name="CREDIT_CARD" /> upang i-update ang mga detalye ng iyong card. Pagkatapos mong magkumpirma, ibabahagi sa site na ito ang mga detalye ng card mula sa iyong Google Payments account.</translation> <translation id="8957210676456822347">Pagpapahintulot sa Captive Portal</translation> <translation id="8971063699422889582">Nag-expire na ang certificate ng server.</translation> +<translation id="8975012916872825179">May kasamang impormasyon tulad ng mga numero ng telepono, email address, at address sa pagpapadala</translation> <translation id="8978053250194585037">May <ph name="BEGIN_LINK" />na-detect na phishing<ph name="END_LINK" /> sa <ph name="SITE" /> kamakailan ang Ligtas na Pag-browse sa Google. Nagpapanggap ang mga phishing site bilang ibang website upang linlangin ka.</translation> <translation id="8983003182662520383">Mga Paraan ng Pagbabayad at Address Gamit ang Google Pay</translation> <translation id="8987927404178983737">Buwan</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">CLEAR FORM</translation> <translation id="939736085109172342">Bagong folder</translation> <translation id="951104842009476243">Mga Tinatanggap na Debit at Prepaid Card</translation> +<translation id="962484866189421427">Maaaring subukan ng content na itong mag-install ng mga mapanlinlang na app na nagpapanggap na ibang bagay o nangongolekta ng data na maaaring gamitin para subaybayan ka. <ph name="BEGIN_LINK" />Ipakita pa rin<ph name="END_LINK" /></translation> <translation id="969892804517981540">Official Build</translation> <translation id="973773823069644502">Magdagdag ng Address sa Paghahatid</translation> <translation id="975560348586398090">{COUNT,plural, =0{Wala}=1{1 item}one{# item}other{# na item}}</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 45474609c..f4268dad 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -305,7 +305,7 @@ <translation id="3010559122411665027">Entrée de la liste "<ph name="ENTRY_INDEX" />" : <ph name="ERROR" /></translation> <translation id="301521992641321250">Bloquée automatiquement</translation> <translation id="3024663005179499861">Type de règle incorrect.</translation> -<translation id="3037605927509011580">Aie aie aie</translation> +<translation id="3037605927509011580">Aïe aïe aïe</translation> <translation id="3041612393474885105">Informations relatives au certificat</translation> <translation id="3064966200440839136">En payant via une application externe, vous allez quitter le mode navigation privée. Voulez-vous continuer ?</translation> <translation id="3083099961703215236">{COUNT,plural, =0{Aucun}=1{1 mot de passe}one{# mot de passe}other{# mots de passe}}</translation> @@ -422,6 +422,7 @@ <translation id="3778403066972421603">Voulez-vous enregistrer cette carte dans votre compte Google et sur cet appareil ?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expire en <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Contenu malveillant bloqué.</translation> <translation id="382518646247711829">Si vous utilisez un serveur proxy…</translation> <translation id="3828924085048779000">La phrase secrète est obligatoire.</translation> <translation id="385051799172605136">Retour</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Actions</translation> <translation id="4958444002117714549">Développer la liste</translation> <translation id="4974590756084640048">Réactiver les avertissements</translation> +<translation id="4988217478422488391">Payez vos achats en ligne plus rapidement</translation> <translation id="4989809363548539747">Ce plug-in n'est pas compatible.</translation> <translation id="5002932099480077015">Si cette option est activée, Chrome enregistre une copie de votre carte sur cet appareil pour vous permettre de remplir plus rapidement les formulaires.</translation> <translation id="5018422839182700155">Impossible d'ouvrir cette page</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Rétablir la modification</translation> <translation id="5481076368049295676">Ce contenu peut essayer d'installer un logiciel dangereux sur votre appareil pour dérober ou supprimer vos informations. <ph name="BEGIN_LINK" />Je souhaite y accéder malgré tout.<ph name="END_LINK" /></translation> <translation id="54817484435770891">Ajouter une adresse valide</translation> +<translation id="5490432419156082418">Adresses et autres</translation> <translation id="5492298309214877701">Ce site situé sur l'intranet de l'entreprise, de l'organisation ou de l'établissement scolaire possède la même URL qu'un site Web externe. <ph name="LINE_BREAK" /> Essayez de contacter votre administrateur système.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en cours d'utilisation}one{# en cours d'utilisation}other{# en cours d'utilisation}}</translation> <translation id="5922853866070715753">Vous avez presque terminé !</translation> <translation id="5939518447894949180">Réinitialiser</translation> +<translation id="5951495562196540101">Impossible d'enregistrer votre appareil avec un compte personnel (licence empaquetée disponible).</translation> <translation id="5967592137238574583">Modifier les coordonnées</translation> <translation id="5967867314010545767">Supprimer de l'historique</translation> <translation id="5975083100439434680">Zoom arrière</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Vous serez déconnecté de la plupart des sites.</translation> <translation id="8437238597147034694">&Annuler le déplacement</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 carte de paiement}one{# carte de paiement}other{# cartes de paiement}}</translation> +<translation id="8473863474539038330">Adresses et autres</translation> <translation id="8483780878231876732">Pour utiliser les cartes de votre compte Google, connectez-vous à Chrome.</translation> <translation id="8488350697529856933">S'applique à</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> a mis trop de temps à répondre.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Saisissez la date d'expiration et le code CVC de la carte <ph name="CREDIT_CARD" /> pour mettre à jour les informations relatives à celle-ci. Une fois la validation effectuée, les informations relatives à la carte de votre compte Google Payments seront partagées avec ce site.</translation> <translation id="8957210676456822347">Autorisation du portail captif</translation> <translation id="8971063699422889582">Le certificat du serveur a expiré.</translation> +<translation id="8975012916872825179">Y compris les numéros de téléphone, les adresses e-mail et les adresses de livraison</translation> <translation id="8978053250194585037">La fonctionnalité de navigation sécurisée Google a récemment permis de <ph name="BEGIN_LINK" />détecter une tentative d'hameçonnage<ph name="END_LINK" /> sur le site <ph name="SITE" />. Un site d'hameçonnage se présente comme un site légitime dans le but de vous tromper.</translation> <translation id="8983003182662520383">Modes de paiement et adresses utilisés dans Google Pay</translation> <translation id="8987927404178983737">Mois</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">EFFACER LE FORMULAIRE</translation> <translation id="939736085109172342">Nouveau dossier</translation> <translation id="951104842009476243">Cartes de débit et cartes prépayées acceptées</translation> +<translation id="962484866189421427">Ce contenu peut essayer d'installer des applications trompeuses se faisant passer pour d'autres, ou de collecter des données afin de vous surveiller. <ph name="BEGIN_LINK" />Je souhaite y accéder malgré tout.<ph name="END_LINK" /></translation> <translation id="969892804517981540">Build officiel</translation> <translation id="973773823069644502">Ajouter une adresse d'expédition</translation> <translation id="975560348586398090">{COUNT,plural, =0{Aucun}=1{1 élément}one{# élément}other{# éléments}}</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 7718c26..50d193dc 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -416,6 +416,7 @@ <translation id="3778403066972421603">શું તમે આ કાર્ડને તમારા Google એકાઉન્ટ અને આ ડિવાઇસ પર સાચવવા માગો છો?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> માં સમાપ્ત થાય છે</translation> +<translation id="3807873520724684969">નુકસાનકારક કન્ટેન્ટ બ્લૉક કર્યુ.</translation> <translation id="382518646247711829">જો તમે કોઈ પ્રોક્સી સર્વરનો ઉપયોગ કરો છો...</translation> <translation id="3828924085048779000">ખાલી પાસફ્રેઝને અનુમતિ નથી. </translation> <translation id="385051799172605136">પાછળ</translation> @@ -570,6 +571,7 @@ <translation id="495170559598752135">ક્રિયાઓ</translation> <translation id="4958444002117714549">સૂચિ વિસ્તૃત કરો</translation> <translation id="4974590756084640048">ચેતવણીઓ ફરીથી સક્ષમ કરો</translation> +<translation id="4988217478422488391">વસ્તુઓની ઑનલાઇન ચુકવણી કરવાનું ઝડપી બનાવે છે</translation> <translation id="4989809363548539747">આ પ્લગ-ઇન સમર્થિત નથી</translation> <translation id="5002932099480077015">જો સક્ષમ કરેલું હોય, તો ઝડપથી ફોર્મ ભરવા માટે Chrome આ ઉપકરણ પર તમારા કાર્ડની એક કૉપિ સંગ્રહશે.</translation> <translation id="5018422839182700155">આ પૃષ્ઠ ખોલી શકતાં નથી</translation> @@ -647,6 +649,7 @@ <translation id="5470861586879999274">&સંપાદિત કરવું ફરી કરો</translation> <translation id="5481076368049295676">આ કન્ટેન્ટ કદાચ તમારા ડિવાઇસ પર જોખમકારક સૉફ્ટવેર ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરી શકે છે કે જે તમારી માહિતીની ચોરી કરે અથવા કાઢી નાખે છે. <ph name="BEGIN_LINK" />છતાં પણ બતાવો<ph name="END_LINK" /></translation> <translation id="54817484435770891">માન્ય સરનામું ઉમેરો</translation> +<translation id="5490432419156082418">સરનામા અને વધુ</translation> <translation id="5492298309214877701">કંપની, સંસ્થા અથવા શાળા ઇન્ટ્રાનેટ પર આ સાઇટ બાહ્ય વેબસાઇટ જેવું જ URL ધરાવે છે. <ph name="LINE_BREAK" /> તમારા સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરવાનો પ્રયાસ કરો.</translation> @@ -709,6 +712,7 @@ <translation id="5908541034548427511"><ph name="TYPE_1" /> (સમન્વયિત)</translation> <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 ઉપયોગમાં છે}one{# ઉપયોગમાં છે}other{# ઉપયોગમાં છે}}</translation> <translation id="5939518447894949180">રીસેટ કરો</translation> +<translation id="5951495562196540101">ઉપભોક્તા એકાઉન્ટ સાથે નોંધણી કરાવી શકાતી નથી (પૅકેજમાં લાઇસન્સ ઉપલબ્ધ છે).</translation> <translation id="5967592137238574583">સંપર્ક માહિતીમાં ફેરફાર કરો</translation> <translation id="5967867314010545767">ઇતિહાસમાંથી દૂર કરો</translation> <translation id="5975083100439434680">ઝૂમ ઘટાડો</translation> @@ -1045,6 +1049,7 @@ <translation id="8433057134996913067">આ તમને મોટાભાગની વેબસાઇટ્સમાંથી સાઇન આઉટ કરશે.</translation> <translation id="8437238597147034694">&ખસેડવું પૂર્વવત્ કરો</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 ક્રેડિટ કાર્ડ}one{# ક્રેડિટ કાર્ડ}other{# ક્રેડિટ કાર્ડ}}</translation> +<translation id="8473863474539038330">સરનામા અને વધુ</translation> <translation id="8483780878231876732">તમારા Google એકાઉન્ટમાંથી કાર્ડ્સનો ઉપયોગ કરવા માટે, Chrome માં સાઇન ઇન કરો</translation> <translation id="8488350697529856933">આમને લાગુ</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> એ પ્રતિસાદ આપવા માટે ઘણો સમય લીધો.</translation> @@ -1101,6 +1106,7 @@ <translation id="8952525071319348207">તમારા કાર્ડની વિગતોને અપડેટ કરવા માટે <ph name="CREDIT_CARD" />ની સમાપ્તિ તારીખ અને CVC દાખલ કરો. તમે પુષ્ટિ કરી લો પછી, આ સાઇટ સાથે તમારા Google Payments એકાઉન્ટમાંથી કાર્ડની વિગતો શેર કરવામાં આવશે.</translation> <translation id="8957210676456822347">કૅપ્ટિવ પોર્ટલ અધિકૃતતા</translation> <translation id="8971063699422889582">સર્વરના પ્રમાણપત્રની સમયસીમા સમાપ્ત થઈ છે.</translation> +<translation id="8975012916872825179">ફોન નંબર, ઇમેઇલ ઍડ્રેસ અને શિપિંગ સરનામા જેવી માહિતીનો સમાવેશ છે</translation> <translation id="8978053250194585037">Google Safe Browsingને <ph name="SITE" /> પર તાજેતરમાં <ph name="BEGIN_LINK" />ફિશિંગ થયાનું જાણવા મળ્યું છે<ph name="END_LINK" />. ફિશિંગ વેબસાઇટ તમને છેતરવા માટે અન્ય વેબસાઇટ હોવાનો ઢોંગ કરે છે.</translation> <translation id="8983003182662520383">Google Payનો ઉપયોગ કરતી ચુકવણી પદ્ધતિઓ અને ઍડ્રેસ</translation> <translation id="8987927404178983737">મહિનો</translation> @@ -1149,6 +1155,7 @@ <translation id="935608979562296692">ફોર્મ સાફ કરો</translation> <translation id="939736085109172342">નવું ફોલ્ડર</translation> <translation id="951104842009476243">સ્વીકૃત ડેબિટ અને પ્રિપેઇડ કાર્ડ</translation> +<translation id="962484866189421427">આ કન્ટેન્ટ કદાચ ભ્રામક ઍપ ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરે છે કે જે પોતાની ખોટી ઓળખ આપે છે અથવા તમને ટ્રૅક કરવા માટે ઉપયોગમાં લઈ શકાય તેવો ડેટા મેળવે છે. <ph name="BEGIN_LINK" />તો પણ બતાવો<ph name="END_LINK" /></translation> <translation id="969892804517981540">આધિકારિક બિલ્ડ</translation> <translation id="973773823069644502">વિતરણ માટેનું સરનામું ઉમેરો</translation> <translation id="975560348586398090">{COUNT,plural, =0{કોઈ નહીં}=1{1 આઇટમ}one{# આઇટમ}other{# આઇટમ}}</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 421e958..fadf5d3 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -63,7 +63,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />अपनी कुकी साफ़ करके देखें<ph name="END_LINK" /></translation> <translation id="1314614906530272393">चुना गया सत्र मौजूद नहीं है.</translation> <translation id="1323433172918577554">और दिखाएं</translation> -<translation id="132390688737681464">पतों की जानकारी सेव करें और भरें</translation> +<translation id="132390688737681464">पतों की जानकारी सेव करें और फ़ॉर्म में भरें</translation> <translation id="1333989956347591814">आपकी गतिविधि <ph name="BEGIN_EMPHASIS" />अभी भी इन्हें दिखाई दे सकती है<ph name="END_EMPHASIS" />: <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />जिन वेबसाइट पर आप जाते हैं @@ -112,7 +112,7 @@ <translation id="1645368109819982629">असमर्थित प्रोटोकॉल</translation> <translation id="1655462015569774233">{1,plural, =1{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा कल समाप्त हो गई थी. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पेज को रीफ्रेश करना चाहिए.}one{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पेज को रीफ्रेश करना चाहिए.}other{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पेज को रीफ्रेश करना चाहिए.}}</translation> <translation id="1656489000284462475">पिकअप</translation> -<translation id="1662550410081243962">भुगतान के तरीके सेव करें और भरें</translation> +<translation id="1662550410081243962">भुगतान के तरीके सेव करें और जानकारी भरें</translation> <translation id="1663943134801823270">कार्ड और पते Chrome से मिलते हैं. आप उन्हें <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में प्रबंधित कर सकते हैं.</translation> <translation id="1676269943528358898">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Google Chrome ने इस बार <ph name="SITE" /> से कनेक्ट करने का प्रयास किया, तो वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने का प्रयास कर रहा हो या किसी वाई-फ़ाई प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया हो. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Google Chrome ने कनेक्शन को रोक दिया था.</translation> <translation id="168841957122794586">सर्वर प्रमाणपत्र में कमज़ोर क्रिप्टोग्राफ़िक कुंजी है.</translation> @@ -198,7 +198,7 @@ <translation id="225207911366869382">यह मान इस नीति के लिए हटा दिया गया है.</translation> <translation id="2262243747453050782">HTTP गड़बड़ी</translation> <translation id="2270484714375784793">फ़ोन नंबर</translation> -<translation id="2283340219607151381">पतों की जानकारी सेव करें और भरें</translation> +<translation id="2283340219607151381">पतों की जानकारी सेव करें और फ़ॉर्म में भरें</translation> <translation id="2292556288342944218">आपका इंटरनेट कनेक्शन अवरुद्ध है</translation> <translation id="2316887270356262533">1 MB से भी कम जगह खाली करता है. जब आप अगली बार विज़िट करेंगे तो, कुछ साइटें और धीमे लोड हो सकती हैं.</translation> <translation id="2317259163369394535"><ph name="DOMAIN" /> के लिए उपयोगकर्ता नाम और पासवर्ड आवश्यक है.</translation> @@ -422,6 +422,7 @@ <translation id="3778403066972421603">क्या आप इस कार्ड को अपने Google खाते में और इस डिवाइस पर सहेजना चाहते हैं?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> में खत्म होगा</translation> +<translation id="3807873520724684969">खतरनाक सामग्री ब्लॉक की गई.</translation> <translation id="382518646247711829">यदि आप प्रॉक्सी सर्वर का उपयोग करते हैं...</translation> <translation id="3828924085048779000">खाली पासफ़्रेज़ की अनुमति नहीं है.</translation> <translation id="385051799172605136">वापस</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">क्रियाएं</translation> <translation id="4958444002117714549">सूची विस्तृत करें</translation> <translation id="4974590756084640048">चेतावनियां फिर से सक्षम करें</translation> +<translation id="4988217478422488391">चीज़ों का ऑनलाइन भुगतान तेज़ी से करने में मदद करता है</translation> <translation id="4989809363548539747">यह प्लग इन समर्थित नहीं है</translation> <translation id="5002932099480077015">यदि सक्षम किया हुआ हो, तो Chrome फ़ॉर्म को तेज़ी से भरने के लिए इस डिवाइस पर आपके कार्ड की एक प्रति संग्रहित करेगा.</translation> <translation id="5018422839182700155">यह पेज खुल नहीं पा रहा है</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&संपादित करना फिर से करें</translation> <translation id="5481076368049295676">यह सामग्री आपके डिवाइस पर ऐसा खतरनाक सॉफ़्टवेयर इंस्टॉल करने की कोशिश कर सकती है जो आपकी जानकारी चुरा सकता है या उसे हटा सकता है. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation> <translation id="54817484435770891">मान्य पता जोड़ें</translation> +<translation id="5490432419156082418">पते, और भी बहुत कुछ</translation> <translation id="5492298309214877701">किसी कंपनी, संगठन या स्कूल के इंट्रानेट पर इस साइट का URL एक बाहरी वेबसाइट जैसा है. <ph name="LINE_BREAK" /> अपने सिस्टम एडमिन से संपर्क करने की कोशिश करें.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 उपयोग में है}one{# उपयोग में हैं}other{# उपयोग में हैं}}</translation> <translation id="5922853866070715753">करीब-करीब हो गया है</translation> <translation id="5939518447894949180">रीसेट करें</translation> +<translation id="5951495562196540101">उपभोक्ता खाते (पैकेज किया गया लाइसेंस मौजूद है) के साथ नामांकन नहीं कर सकते.</translation> <translation id="5967592137238574583">संपर्क जानकारी में बदलाव करें</translation> <translation id="5967867314010545767">इतिहास से निकालें</translation> <translation id="5975083100439434680">ज़ूम आउट</translation> @@ -831,7 +835,7 @@ <translation id="6897140037006041989">उपयोगकर्ता एजेंट</translation> <translation id="6903319715792422884">'सुरक्षित ब्राउज़िंग' को बेहतर बनाने में मदद करने के लिए Google को कुछ <ph name="BEGIN_WHITEPAPER_LINK" />'सिस्टम जानकारी' और 'पेज सामग्री'<ph name="END_WHITEPAPER_LINK" /> भेजें. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="6915804003454593391">उपयोगकर्ता:</translation> -<translation id="6944692733090228304">आपने एक ऐसी साइट पर अपना पासवर्ड डाला है जिसे <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> प्रबंधित नहीं करता है. अपने खाते को सुरक्षित रखने के लिए, दूसरे ऐप्लिकेशन और साइटों पर अपने पासवर्ड का दोबारा इस्तेमाल नहीं करें.</translation> +<translation id="6944692733090228304">आपने एक ऐसी साइट पर अपना पासवर्ड डाला है जिसे <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> प्रबंधित नहीं करता है. अपने खाते को सुरक्षित रखने के लिए, दूसरे ऐप्लिकेशन और साइटों पर अपने पासवर्ड का दोबारा इस्तेमाल न करें.</translation> <translation id="6945221475159498467">चुनें</translation> <translation id="6948701128805548767">पिकअप के तरीके और ज़रूरतें देखने के लिए, कोई पता चुनें</translation> <translation id="6949872517221025916">पासवर्ड रीसेट करें</translation> @@ -1065,12 +1069,13 @@ <translation id="8433057134996913067">इससे आप अधिकांश वेबसाइट से प्रस्थान कर जाएंगे.</translation> <translation id="8437238597147034694">&ले जाना वापस लाएं</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 क्रेडिट कार्ड}one{# क्रेडिट कार्ड}other{# क्रेडिट कार्ड}}</translation> +<translation id="8473863474539038330">पते वगैरह</translation> <translation id="8483780878231876732">कार्ड का उपयोग अपने Google खाते से करने के लिए, Chrome में प्रवेश करें</translation> <translation id="8488350697529856933">इस पर लागू होती है</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> को लोड होने में बहुत ज़्यादा समय लगा.</translation> <translation id="8503559462189395349">Chrome पासवर्ड</translation> <translation id="8503813439785031346">उपयोगकर्ता नाम</translation> -<translation id="8508648098325802031">खोज अाइकॉन</translation> +<translation id="8508648098325802031">सर्च अाइकॉन</translation> <translation id="8543181531796978784">आप <ph name="BEGIN_ERROR_LINK" />पहचान संबंधी समस्या की रिपोर्ट<ph name="END_ERROR_LINK" /> कर सकते हैं या अगर आप अपनी सुरक्षा संबंधी जोखिमों को समझते हैं तो, <ph name="BEGIN_LINK" />इस असुरक्षित साइट पर जा<ph name="END_LINK" /> सकते हैं.</translation> <translation id="8543556556237226809">प्रश्न पूछना चाहते हैं? तो उस व्यक्ति से संपर्क करें जो आपकी प्रोफ़ाइल की निगरानी करता है.</translation> <translation id="8553075262323480129">अनुवाद विफल हो गया क्योंकि पेज की भाषा निर्धारित नहीं की जा सकी.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">अपने कार्ड के विवरण अपडेट करने के लिए <ph name="CREDIT_CARD" /> के खत्म होने की तारीख और कार्ड वेरीफ़िकेशन कोड (सीवीसी) डालें. आपकी ओर से पुष्टि होने के बाद, आपके Google Payments खाते में मौजूद कार्ड के विवरण इस साइट से शेयर किए जाएंगे.</translation> <translation id="8957210676456822347">कैप्टिव पोर्टल प्राधिकरण</translation> <translation id="8971063699422889582">सर्वर के प्रमाणपत्र की समय-सीमा समाप्त हो चुकी है.</translation> +<translation id="8975012916872825179">फ़ोन नंबर, ईमेल पते और शिपिंग पते जैसी जानकारी शामिल है</translation> <translation id="8978053250194585037">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />फ़िशिंग का पता चला है<ph name="END_LINK" />. फ़िशिंग साइटें आपको भ्रमित करने के लिए अन्य वेबसाइटें होने का दिखावा करती हैं.</translation> <translation id="8983003182662520383">Google Pay का इस्तेमाल करने वाले भुगतान के तरीके और पते</translation> <translation id="8987927404178983737">माह</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">फ़ॉर्म साफ़ करें</translation> <translation id="939736085109172342">नया फ़ोल्डर</translation> <translation id="951104842009476243">स्वीकार किए जाने वाले डेबिट और प्रीपेड कार्ड</translation> +<translation id="962484866189421427">यह सामग्री ऐसे धोखा देने वाले ऐप्लिकेशन इंस्टॉल कर सकती है जो कुछ और होने का दावा करते हैं या ऐसा डेटा इकट्ठा करते हैं जिसका इस्तेमाल आप पर नज़र रखने के लिए किया जा सके. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation> <translation id="969892804517981540">आधिकारिक बिल्ड</translation> <translation id="973773823069644502">डिलीवरी का पता जोड़ें</translation> <translation id="975560348586398090">{COUNT,plural, =0{कुछ नहीं}=1{1 आइटम}one{# आइटम}other{# आइटम}}</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index bc1ac5e0..7c6eef2 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -421,6 +421,7 @@ <translation id="3778403066972421603">Želite li spremiti ovu karticu na svoj Google račun i na ovaj uređaj?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Istječe <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Blokiran je štetni sadržaj.</translation> <translation id="382518646247711829">Ako upotrebljavate proxy poslužitelj...</translation> <translation id="3828924085048779000">Prazne zaporke nisu dopuštene.</translation> <translation id="385051799172605136">Natrag</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">Radnje</translation> <translation id="4958444002117714549">Proširi popis</translation> <translation id="4974590756084640048">Ponovo omogući upozorenja</translation> +<translation id="4988217478422488391">Ubrzava plaćanje online</translation> <translation id="4989809363548539747">Taj dodatak nije podržan</translation> <translation id="5002932099480077015">Ako je to omogućeno, Chrome će pohraniti kopiju vaše kartice na ovom uređaju radi bržeg ispunjavanja obrazaca.</translation> <translation id="5018422839182700155">Stranica se ne može otvoriti</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&Ponovi uređivanje</translation> <translation id="5481076368049295676">Ovaj sadržaj može pokušati na vaš uređaj instalirati opasan softver koji krade ili briše podatke. <ph name="BEGIN_LINK" />Ipak prikaži<ph name="END_LINK" /></translation> <translation id="54817484435770891">Dodajte važeću adresu</translation> +<translation id="5490432419156082418">Adrese i više</translation> <translation id="5492298309214877701">Web-lokacija na intranetu tvrtke, organizacije ili škole ima isti URL kao i vanjska web-lokacija. <ph name="LINE_BREAK" /> Pokušajte se obratiti administratoru sustava.</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 u upotrebi}one{# u upotrebi}few{# u upotrebi}other{# u upotrebi}}</translation> <translation id="5922853866070715753">Skoro gotovo</translation> <translation id="5939518447894949180">Ponovno postavi</translation> +<translation id="5951495562196540101">Prijava s računom potrošača nije moguća (dostupna je paketna licenca).</translation> <translation id="5967592137238574583">Uredite podatke za kontakt</translation> <translation id="5967867314010545767">Ukloni iz povijesti</translation> <translation id="5975083100439434680">Smanji</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Time ćete se odjaviti s većine web-lokacija.</translation> <translation id="8437238597147034694">&Poništi premještanje</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kreditna kartica}one{# kreditna kartica}few{# kreditne kartice}other{# kreditnih kartica}}</translation> +<translation id="8473863474539038330">Adrese i više</translation> <translation id="8483780878231876732">Da biste upotrebljavali kartice sa svojeg Google računa, prijavite se na Chrome</translation> <translation id="8488350697529856933">Primjenjuje se na</translation> <translation id="8498891568109133222">Hostu <ph name="HOST_NAME" /> bilo je potrebno previše vremena za odgovor.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Unesite datum isteka i CVC za karticu <ph name="CREDIT_CARD" /> da biste ažurirali podatke o kartici. Nakon što ih potvrdite, podaci o kartici s vašeg računa na usluzi Google Payments podijelit će se s ovom web-lokacijom.</translation> <translation id="8957210676456822347">Autorizacija obaveznog portala za autentifikaciju</translation> <translation id="8971063699422889582">Istekao je certifikat poslužitelja.</translation> +<translation id="8975012916872825179">Sadrži podatke kao što su telefonski brojevi, e-adrese i adrese za dostavu</translation> <translation id="8978053250194585037">Google sigurno pregledavanje nedavno je <ph name="BEGIN_LINK" />otkrilo krađu identiteta<ph name="END_LINK" /> na web-lokaciji <ph name="SITE" />. Web-lokacije za krađu identiteta predstavljaju se kao druge web-lokacije kako bi vas prevarile.</translation> <translation id="8983003182662520383">Načini plaćanja i adrese s Google Paya</translation> <translation id="8987927404178983737">Mjesec</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">IZBRIŠI OBRAZAC</translation> <translation id="939736085109172342">Nova mapa</translation> <translation id="951104842009476243">Prihvaćene debitne i pretplatne kartice</translation> +<translation id="962484866189421427">Ovaj sadržaj može pokušati instalirati obmanjujuće aplikacije koje se pretvaraju da su nešto drugo ili prikupljaju podatke na temelju kojih vas je moguće pratiti. <ph name="BEGIN_LINK" />Ipak prikaži<ph name="END_LINK" /></translation> <translation id="969892804517981540">Službeni sastavak</translation> <translation id="973773823069644502">Dodajte adresu za isporuku</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nijedna}=1{1 stavka}one{# stavka}few{# stavke}other{# stavki}}</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index bc840aa..e9b5e24 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -420,6 +420,7 @@ <translation id="3778403066972421603">Szeretné menteni a kártyát Google-fiókjába és az eszközre?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Lejárat dátuma: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Kártékony tartalom letiltva.</translation> <translation id="382518646247711829">Ha proxyszervert használ...</translation> <translation id="3828924085048779000">Az üres összetett jelszó nem engedélyezett.</translation> <translation id="385051799172605136">Vissza</translation> @@ -576,6 +577,7 @@ <translation id="495170559598752135">Műveletek</translation> <translation id="4958444002117714549">Lista részletes nézete</translation> <translation id="4974590756084640048">Figyelmeztetések újbóli engedélyezése</translation> +<translation id="4988217478422488391">Meggyorsítja az internetes vásárlást</translation> <translation id="4989809363548539747">Ez a beépülő modul nem támogatott</translation> <translation id="5002932099480077015">Ha engedélyezi, a Chrome megőrzi a kártya másolatát ezen az eszközön a gyorsabb űrlapkitöltés érdekében.</translation> <translation id="5018422839182700155">Nem lehet megnyitni az oldalt</translation> @@ -655,6 +657,7 @@ <translation id="5470861586879999274">&Szerkesztés újra</translation> <translation id="5481076368049295676">Lehet, hogy ez a tartalom megpróbál olyan veszélyes szoftvert telepíteni az eszközre, amely ellophatja vagy törölheti az Ön adatait. <ph name="BEGIN_LINK" />Megjelenítés mindenképpen<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Érvényes címet adjon meg</translation> +<translation id="5490432419156082418">Címek és egyebek</translation> <translation id="5492298309214877701">Ennek a vállalati, szervezeti vagy iskolai intraneten található webhelynek az URL-címe megegyezik egy külső webhely URL-címével. <ph name="LINE_BREAK" /> Javasoljuk, hogy forduljon a rendszergazdához.</translation> @@ -718,6 +721,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 van használatban}other{# van használatban}}</translation> <translation id="5922853866070715753">Majdnem kész</translation> <translation id="5939518447894949180">Visszaállítás</translation> +<translation id="5951495562196540101">Fogyasztói fiókkal nem lehet regisztrálni (a csomaghoz tartozik licenc is).</translation> <translation id="5967592137238574583">Kapcsolattartási adatok szerkesztése</translation> <translation id="5967867314010545767">Eltávolítás az előzmények közül</translation> <translation id="5975083100439434680">Kicsinyítés</translation> @@ -1063,6 +1067,7 @@ <translation id="8433057134996913067">Ezzel kijelentkezik a legtöbb webhelyről.</translation> <translation id="8437238597147034694">&Áthelyezés visszavonása</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 hitelkártya}other{# hitelkártya}}</translation> +<translation id="8473863474539038330">Címek és egyebek</translation> <translation id="8483780878231876732">Jelentkezzen be a Chrome-ba, hogy használhassa a kártyákat Google-fiókjából.</translation> <translation id="8488350697529856933">A következőre érvényes</translation> <translation id="8498891568109133222">A(z) <ph name="HOST_NAME" /> túl hosszú ideje nem válaszol.</translation> @@ -1123,6 +1128,7 @@ <translation id="8952525071319348207">A(z) <ph name="CREDIT_CARD" /> kártyához tartozó CVC-kód lejárati dátumának megadásával frissítheti a kártyaadatokat. A megerősítést követően a böngésző megosztja az Ön Google Payments-fiókjából származó kártyaadatokat ezzel a webbhellyel.</translation> <translation id="8957210676456822347">Hitelesítés hitelesítési portállal</translation> <translation id="8971063699422889582">A szerver tanúsítványa lejárt.</translation> +<translation id="8975012916872825179">Olyan adatokat tartalmaz, mint a telefonszámok, az e-mail-címek és a szállítási címek</translation> <translation id="8978053250194585037">A Google Biztonságos Böngészés funkciója nemrégiben <ph name="BEGIN_LINK" />adathalászatot észlelt<ph name="END_LINK" /> a következő webhelyen: <ph name="SITE" />. Az adathalász webhelyek más webhelynek adják ki magukat, hogy félrevezessék Önt.</translation> <translation id="8983003182662520383">A Google Pay szolgáltatásban használt fizetési módok és címek</translation> <translation id="8987927404178983737">hónap</translation> @@ -1171,6 +1177,7 @@ <translation id="935608979562296692">ŰRLAP TÖRLÉSE</translation> <translation id="939736085109172342">Új mappa</translation> <translation id="951104842009476243">Elfogadott bank- és feltöltőkártyák</translation> +<translation id="962484866189421427">Ez a tartalom megtévesztő alkalmazásokat telepíthet, amelyek más alkalmazásnak tettethetik magukat, illetve az Ön nyomon követésére alkalmas adatokat gyűjthetnek. <ph name="BEGIN_LINK" />Megjelenítés mindenképpen<ph name="END_LINK" /></translation> <translation id="969892804517981540">Hivatalos verzió</translation> <translation id="973773823069644502">Kézbesítési cím hozzáadása</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nincs}=1{1 elem}other{# elem}}</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 3e25065f..dc5454d 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Ingin menyimpan kartu ini di Akun Google dan perangkat ini?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Masa berlaku <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Konten yang berbahaya diblokir.</translation> <translation id="382518646247711829">Jika Anda menggunakan server proxy...</translation> <translation id="3828924085048779000">Frasa sandi kosong tidak dibolehkan.</translation> <translation id="385051799172605136">Mundur</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Tindakan</translation> <translation id="4958444002117714549">Luaskan daftar</translation> <translation id="4974590756084640048">Aktifkan kembali peringatan</translation> +<translation id="4988217478422488391">Membuat pembayaran item secara online jadi lebih cepat</translation> <translation id="4989809363548539747">Plugin ini tidak didukung</translation> <translation id="5002932099480077015">Jika diaktifkan, Chrome akan menyimpan salinan kartu Anda di perangkat ini untuk pengisian formulir yang lebih cepat.</translation> <translation id="5018422839182700155">Tidak dapat membuka halaman ini</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Ulangi pengeditan</translation> <translation id="5481076368049295676">Konten ini mungkin mencoba menginstal software berbahaya yang mencuri atau menghapus informasi Anda di perangkat. <ph name="BEGIN_LINK" />Tetap tampilkan<ph name="END_LINK" /></translation> <translation id="54817484435770891">Tambahkan alamat yang valid</translation> +<translation id="5490432419156082418">Alamat dan Informasi Lainnya</translation> <translation id="5492298309214877701">Situs yang ada di intranet perusahaan, organisasi, atau sekolah ini memiliki URL yang sama dengan situs web eksternal. <ph name="LINE_BREAK" /> Coba hubungi administrator sistem Anda.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 terpakai}other{# terpakai}}</translation> <translation id="5922853866070715753">Hampir selesai</translation> <translation id="5939518447894949180">Setel ulang</translation> +<translation id="5951495562196540101">Tidak dapat mendaftar dengan akun konsumen (tersedia paket lisensi).</translation> <translation id="5967592137238574583">Edit Info Kontak</translation> <translation id="5967867314010545767">Hapus dari histori</translation> <translation id="5975083100439434680">Perkecil</translation> @@ -1061,6 +1065,7 @@ <translation id="8433057134996913067">Tindakan ini akan mengeluarkan Anda dari sebagian besar situs web.</translation> <translation id="8437238597147034694">&Urungkan pemindahan</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kartu kredit}other{# kartu kredit}}</translation> +<translation id="8473863474539038330">Alamat dan informasi lainnya</translation> <translation id="8483780878231876732">Untuk menggunakan kartu dari Akun Google Anda, masuk ke Chrome</translation> <translation id="8488350697529856933">Berlaku untuk</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> membutuhkan terlalu banyak waktu untuk merespons.</translation> @@ -1120,6 +1125,7 @@ <translation id="8952525071319348207">Masukkan tanggal habis masa berlaku dan CVC untuk <ph name="CREDIT_CARD" /> guna mengupdate detail kartu. Setelah mengonfirmasi, detail kartu dari akun Pembayaran Google Anda akan dibagikan dengan situs ini.</translation> <translation id="8957210676456822347">Otorisasi Portal Tawanan</translation> <translation id="8971063699422889582">Sertifikat server telah kedaluwarsa.</translation> +<translation id="8975012916872825179">Termasuk informasi seperti nomor telepon, alamat email, dan alamat pengiriman</translation> <translation id="8978053250194585037">Google Safe Browsing baru-baru ini <ph name="BEGIN_LINK" />mendeteksi phishing<ph name="END_LINK" /> di <ph name="SITE" />. Situs phishing berpura-pura menjadi situs lain untuk mengelabui Anda.</translation> <translation id="8983003182662520383">Metode Pembayaran dan Alamat yang Menggunakan Google Pay</translation> <translation id="8987927404178983737">Bulan</translation> @@ -1168,6 +1174,7 @@ <translation id="935608979562296692">HAPUS FORMULIR</translation> <translation id="939736085109172342">Folder baru</translation> <translation id="951104842009476243">Kartu Debit dan Prabayar yang Diterima</translation> +<translation id="962484866189421427">Konten ini mungkin mencoba menginstal aplikasi penipuan dengan berpura-pura menjadi sesuatu yang lain atau mengumpulkan data yang dapat digunakan untuk melacak Anda. <ph name="BEGIN_LINK" />Tampilkan saja<ph name="END_LINK" /></translation> <translation id="969892804517981540">Pembuatan Resmi</translation> <translation id="973773823069644502">Tambahkan Alamat Pengiriman</translation> <translation id="975560348586398090">{COUNT,plural, =0{Tidak ada}=1{1 item}other{# item}}</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 9f29f05b..d31e5790 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -419,6 +419,7 @@ <translation id="3778403066972421603">Vuoi salvare questa carta nel tuo account Google e su questo dispositivo?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Data di scadenza: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Contenuti dannosi bloccati.</translation> <translation id="382518646247711829">Se utilizzi un server proxy...</translation> <translation id="3828924085048779000">Non è consentita una passphrase vuota.</translation> <translation id="385051799172605136">Indietro</translation> @@ -575,6 +576,7 @@ <translation id="495170559598752135">Azioni</translation> <translation id="4958444002117714549">Espandi elenco</translation> <translation id="4974590756084640048">Riattiva avvisi</translation> +<translation id="4988217478422488391">Velocizza il pagamento per gli acquisti online</translation> <translation id="4989809363548539747">Questo plug-in non è supportato</translation> <translation id="5002932099480077015">Se questa opzione viene attivata, Chrome memorizza una copia della carta sul dispositivo per velocizzare la compilazione dei moduli.</translation> <translation id="5018422839182700155">Impossibile aprire questa pagina</translation> @@ -654,6 +656,7 @@ <translation id="5470861586879999274">&Ripeti modifica</translation> <translation id="5481076368049295676">Questi contenuti potrebbero cercare di installare sul tuo dispositivo software pericoloso che si impossessa delle tue informazioni o le elimina. <ph name="BEGIN_LINK" />Mostra comunque<ph name="END_LINK" /></translation> <translation id="54817484435770891">Aggiungi un indirizzo valido</translation> +<translation id="5490432419156082418">Indirizzi e altro</translation> <translation id="5492298309214877701">Il sito nell'Intranet dell'azienda, dell'organizzazione o della scuola ha lo stesso URL del sito web esterno. <ph name="LINE_BREAK" /> Prova a contattare l'amministratore di sistema.</translation> @@ -717,6 +720,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 in uso}other{# in uso}}</translation> <translation id="5922853866070715753">Hai quasi finito.</translation> <translation id="5939518447894949180">Ripristina</translation> +<translation id="5951495562196540101">Impossibile effettuare la registrazione con l'account consumer (è disponibile la licenza in pacchetto).</translation> <translation id="5967592137238574583">Modifica informazioni di contatto</translation> <translation id="5967867314010545767">Rimuovi da cronologia</translation> <translation id="5975083100439434680">Diminuisci lo zoom</translation> @@ -1061,6 +1065,7 @@ <translation id="8433057134996913067">In questo modo uscirai dalla maggior parte dei siti web.</translation> <translation id="8437238597147034694">&Annulla spostamento</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 carta di credito}other{# carte di credito}}</translation> +<translation id="8473863474539038330">Indirizzi e altro</translation> <translation id="8483780878231876732">Accedi a Chrome per usare le carte memorizzate nel tuo account Google</translation> <translation id="8488350697529856933">Si applica a</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ha impiegato troppo tempo a rispondere.</translation> @@ -1120,6 +1125,7 @@ <translation id="8952525071319348207">Inserisci la data di scadenza e il codice CVC della carta <ph name="CREDIT_CARD" /> per aggiornare i relativi dettagli. Dopo essere stati confermati, i dati della carta del tuo account Google Payments saranno condivisi con questo sito.</translation> <translation id="8957210676456822347">Autorizzazione Captive Portal</translation> <translation id="8971063699422889582">Il certificato del server è scaduto.</translation> +<translation id="8975012916872825179">Include informazioni come numeri di telefono, indirizzi email e indirizzi di spedizione</translation> <translation id="8978053250194585037">La funzione Google Navigazione sicura <ph name="BEGIN_LINK" />ha rilevato di recente attività di phishing<ph name="END_LINK" /> sul sito <ph name="SITE" />. I siti di phishing si spacciano per altri siti web per ingannarti.</translation> <translation id="8983003182662520383">Metodi di pagamento e indirizzi che utilizzano Google Pay</translation> <translation id="8987927404178983737">Mese</translation> @@ -1168,6 +1174,7 @@ <translation id="935608979562296692">CANCELLA MODULO</translation> <translation id="939736085109172342">Nuova cartella</translation> <translation id="951104842009476243">Carte di debito e prepagate accettate</translation> +<translation id="962484866189421427">Questi contenuti potrebbero installare app ingannevoli che si spacciano per qualcos'altro o raccolgono dati che potrebbero essere usati per monitorare la tua attività. <ph name="BEGIN_LINK" />Mostra comunque<ph name="END_LINK" /></translation> <translation id="969892804517981540">Build ufficiale</translation> <translation id="973773823069644502">Aggiungi l'indirizzo di consegna</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nessuno}=1{1 elemento}other{# elementi}}</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 384b0eb1..0f06d70 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">האם ברצונך לשמור את הכרטיס בחשבון Google שלך ובמכשיר הזה?</translation> <translation id="3783418713923659662">מאסטרקארד</translation> <translation id="3787705759683870569">תאריך תפוגה: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">תוכן מזיק נחסם.</translation> <translation id="382518646247711829">אם אתה משתמש בשרת Proxy...</translation> <translation id="3828924085048779000">אין אפשרות להשתמש במשפט-סיסמה ריק.</translation> <translation id="385051799172605136">חזור</translation> @@ -582,6 +583,7 @@ <translation id="495170559598752135">פעולות</translation> <translation id="4958444002117714549">הרחב רשימה</translation> <translation id="4974590756084640048">הפעל מחדש אזהרות</translation> +<translation id="4988217478422488391">מאפשרת תשלום מהיר יותר באינטרנט</translation> <translation id="4989809363548539747">הפלאגין הזה אינו נתמך</translation> <translation id="5002932099480077015">אם האפשרות הזו תופעל, Chrome יאחסן עותק של הכרטיס שלך במכשיר הזה למילוי מהיר יותר של טפסים.</translation> <translation id="5018422839182700155">לא ניתן לפתוח את הדף</translation> @@ -661,6 +663,7 @@ <translation id="5470861586879999274">&ביצוע מחדש של עריכה</translation> <translation id="5481076368049295676">ייתכן שהתוכן הזה מכיל אמצעים שינסו להתקין תוכנה מסוכנת, שגונבת או מוחקת את המידע שלך. <ph name="BEGIN_LINK" />הצג בכל זאת<ph name="END_LINK" /></translation> <translation id="54817484435770891">הוספה של כתובת חוקית</translation> +<translation id="5490432419156082418">כתובות ועוד</translation> <translation id="5492298309214877701">כתובת האתר הזה באינטראנט של החברה, הארגון או מוסד הלימודים, זהה לכתובת של אתר חיצוני. <ph name="LINE_BREAK" /> @@ -725,6 +728,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{אחד נמצא בשימוש}two{שניים נמצאים בשימוש}many{# נמצאים בשימוש}other{# נמצאים בשימוש}}</translation> <translation id="5922853866070715753">עוד רגע מסיימים</translation> <translation id="5939518447894949180">אפס</translation> +<translation id="5951495562196540101">אי אפשר להירשם באמצעות חשבון פרטי (יש חבילת רישיון זמינה).</translation> <translation id="5967592137238574583">עריכת הפרטים ליצירת קשר</translation> <translation id="5967867314010545767">הסר מההיסטוריה</translation> <translation id="5975083100439434680">התרחק</translation> @@ -1070,6 +1074,7 @@ <translation id="8433057134996913067">פעולה זו תוציא אותך מהחשבון ברוב האתרים.</translation> <translation id="8437238597147034694">&ביטול העברה</translation> <translation id="8466379296835108687">{COUNT,plural, =1{כרטיס אשראי אחד}two{שני כרטיסי אשראי}many{# כרטיסי אשראי}other{# כרטיסי אשראי}}</translation> +<translation id="8473863474539038330">כתובות ועוד</translation> <translation id="8483780878231876732">כדי להשתמש בכרטיסים מחשבון Google, היכנס אל Chrome</translation> <translation id="8488350697529856933">חל על</translation> <translation id="8498891568109133222">ל-<ph name="HOST_NAME" /> נדרש זמן רב מדי להגיב.</translation> @@ -1130,6 +1135,7 @@ <translation id="8952525071319348207">כדי לעדכן את פרטי הכרטיס שלך, צריך להזין את תאריך התפוגה וקוד האימות של <ph name="CREDIT_CARD" />. אחרי שנקבל ממך אישור, נשתף עם האתר הזה את פרטי הכרטיס מחשבון תשלומי Google.</translation> <translation id="8957210676456822347">הרשאת פורטל חובה</translation> <translation id="8971063699422889582">פג תוקפו של אישור השרת.</translation> +<translation id="8975012916872825179">כולל מידע כמו מספרי טלפון, כתובות אימייל וכתובות למשלוח</translation> <translation id="8978053250194585037">לאחרונה <ph name="BEGIN_LINK" />זוהה דיוג<ph name="END_LINK" /> באתר <ph name="SITE" /> על-ידי הגלישה הבטוחה של Google. אתרי דיוג מתחזים לאתרים אחרים כדי להונות אותך.</translation> <translation id="8983003182662520383">אמצעי תשלום וכתובות שנשמרו ב-Google Pay</translation> <translation id="8987927404178983737">חודש</translation> @@ -1178,6 +1184,7 @@ <translation id="935608979562296692">נקה את הטופס</translation> <translation id="939736085109172342">תיקייה חדשה</translation> <translation id="951104842009476243">כרטיסי חיוב וכרטיסים משולמים מראש שהסוחר מקבל</translation> +<translation id="962484866189421427">ייתכן שבתוכן הזה יש קוד להתקנת אפליקציות מטעות שמתחזות למשהו אחר או שאוספות נתונים המאפשרים לעקוב אחריך. <ph name="BEGIN_LINK" />אני רוצה לראות בכל זאת<ph name="END_LINK" /></translation> <translation id="969892804517981540">גירסה רשמית</translation> <translation id="973773823069644502">הוספת כתובת למסירה</translation> <translation id="975560348586398090">{COUNT,plural, =0{ללא}=1{פריט אחד}two{שני פריטים}many{# פריטים}other{# פריטים}}</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index b4f6de9..921fe4f 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">このカードを Google アカウントとこの端末に保存しますか?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">有効期限: <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">有害なコンテンツがブロックされました。</translation> <translation id="382518646247711829">プロキシ サーバーを使用している場合...</translation> <translation id="3828924085048779000">パスフレーズは必ず指定してください。</translation> <translation id="385051799172605136">戻る</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">操作</translation> <translation id="4958444002117714549">リストを展開する</translation> <translation id="4974590756084640048">警告を再度有効にする</translation> +<translation id="4988217478422488391">オンライン決済をすばやく行うことができます</translation> <translation id="4989809363548539747">このプラグインはサポートされていません</translation> <translation id="5002932099480077015">有効にすると、Chrome ではこの端末にカードのコピーが保存されます。これにより、フォームにすばやく入力できるようになります。</translation> <translation id="5018422839182700155">このページを開けません</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">編集のやり直し(&R)</translation> <translation id="5481076368049295676">アクセス先のコンテンツによって、個人情報を入手したり削除したりする危険なソフトウェアがインストールされる可能性があります。<ph name="BEGIN_LINK" />危険性を理解したうえで表示する<ph name="END_LINK" /></translation> <translation id="54817484435770891">有効なアドレスを追加</translation> +<translation id="5490432419156082418">住所やその他の情報</translation> <translation id="5492298309214877701">このサイトは企業、団体、または学校のイントラネット上にありますが、外部のウェブサイトと同じ URL が使用されています。 <ph name="LINE_BREAK" /> システム管理者にお問い合わせください。</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 個が使用中}other{# 個が使用中}}</translation> <translation id="5922853866070715753">ほぼ完了です</translation> <translation id="5939518447894949180">リセット</translation> +<translation id="5951495562196540101">一般ユーザー向けアカウントでは登録できません(ライセンス パッケージが利用可能です)。</translation> <translation id="5967592137238574583">連絡先情報の編集</translation> <translation id="5967867314010545767">履歴から削除</translation> <translation id="5975083100439434680">縮小する</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">ほとんどのウェブサイトからログアウトします。</translation> <translation id="8437238597147034694">移動の取り消し(&U)</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 件のクレジット カード}other{# 件のクレジット カード}}</translation> +<translation id="8473863474539038330">住所やその他の情報</translation> <translation id="8483780878231876732">Google アカウントに保存したカードを使用するには Chrome にログインしてください</translation> <translation id="8488350697529856933">適用先</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> からの応答時間が長すぎます。</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">カード情報を更新するには <ph name="CREDIT_CARD" /> の有効期限と CVC を入力します。確認後、Google Payments アカウントのカード情報がこのサイトと共有されます。</translation> <translation id="8957210676456822347">キャプティブ ポータル認証</translation> <translation id="8971063699422889582">サーバーの証明書の有効期限が切れています。</translation> +<translation id="8975012916872825179">電話番号、メールアドレス、配送先住所などの情報が含まれます</translation> <translation id="8978053250194585037"><ph name="SITE" /> では最近、Google セーフ ブラウジングにより、<ph name="BEGIN_LINK" />フィッシング行為が検出されました<ph name="END_LINK" />。フィッシング サイトは、他のウェブサイトになりすましてユーザーを欺こうとするサイトです。</translation> <translation id="8983003182662520383">Google Pay のお支払い方法と住所</translation> <translation id="8987927404178983737">月</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">フォームをクリア</translation> <translation id="939736085109172342">新しいフォルダ</translation> <translation id="951104842009476243">利用可能なデビットカードとプリペイド カード</translation> +<translation id="962484866189421427">このコンテンツを表示すると、詐欺的なアプリ(他のものに成りすましたり、ユーザーの追跡などに使用可能なデータを収集したりするアプリ)のインストールが試行される可能性があります。<ph name="BEGIN_LINK" />危険性を理解したうえで表示する<ph name="END_LINK" /></translation> <translation id="969892804517981540">Official Build</translation> <translation id="973773823069644502">配達先住所を追加</translation> <translation id="975560348586398090">{COUNT,plural, =0{なし}=1{1 件のアイテム}other{# 件のアイテム}}</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 0cc8f7c1..8f5f7ba 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -418,6 +418,7 @@ <translation id="3778403066972421603">ಈ ಕಾರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆ ಮತ್ತು ಈ ಸಾಧನದಲ್ಲಿ ಉಳಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">ಅವಧಿ-ಮುಕ್ತಾಯ <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">ಹಾನಿಕಾರಕ ವಿಷಯವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation> <translation id="382518646247711829">ನೀವು ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಬಳಸಿದರೆ...</translation> <translation id="3828924085048779000">ಖಾಲಿ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ.</translation> <translation id="385051799172605136">ಹಿಂದೆ</translation> @@ -574,6 +575,7 @@ <translation id="495170559598752135">ಕ್ರಿಯೆಗಳು</translation> <translation id="4958444002117714549">ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ</translation> <translation id="4974590756084640048">ಎಚ್ಚರಿಕೆಗಳನ್ನು ಮರುಸಕ್ರಿಯಗೊಳಿಸಿ</translation> +<translation id="4988217478422488391">ಇದು ಆನ್ಲೈನ್ನಲ್ಲಿ ಪಾವತಿಸುವುದನ್ನು ವೇಗವಾಗಿಸುತ್ತದೆ</translation> <translation id="4989809363548539747">ಈ ಪ್ಲಗಿನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation> <translation id="5002932099480077015">ಸಕ್ರಿಯವಾಗಿದ್ದರೆ, ವೇಗವಾಗಿ ಫಾರ್ಮ್ ಭರ್ತಿ ಮಾಡಲು Chrome ಈ ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ನ ಪ್ರತಿಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.</translation> <translation id="5018422839182700155">ಈ ಪುಟವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> @@ -652,6 +654,7 @@ <translation id="5470861586879999274">&ಸಂಪಾದಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation> <translation id="5481076368049295676">ಈ ಕಂಟೆಂಟ್ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಕದಿಯುವ ಅಥವಾ ಅಳಿಸುವ ಅಪಾಯಕಾರಿ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು. <ph name="BEGIN_LINK" />ಹೇಗಿದ್ದರೂ ತೋರಿಸಿ<ph name="END_LINK" />.</translation> <translation id="54817484435770891">ಮಾನ್ಯವಾದ ವಿಳಾಸ ಸೇರಿಸಿ</translation> +<translation id="5490432419156082418">ವಿಳಾಸಗಳು ಮತ್ತು ಇನ್ನಷ್ಟು</translation> <translation id="5492298309214877701">ಬಾಹ್ಯ ವೆಬ್ಸೈಟ್ನ URL ಅನ್ನೇ ಕಂಪನಿ, ಸಂಸ್ಥೆ ಅಥವಾ ಶಾಲೆಯ ಇಂಟ್ರಾನೆಟ್ನಲ್ಲಿನ ಈ ಸೈಟ್ ಹೊಂದಿದೆ. <ph name="LINE_BREAK" /> ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation> @@ -715,6 +718,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 ಬಳಕೆಯಲ್ಲಿದೆ}one{# ಬಳಕೆಯಲ್ಲಿದೆ}other{# ಬಳಕೆಯಲ್ಲಿದೆ}}</translation> <translation id="5922853866070715753">ಬಹುತೇಕ ಮುಗಿದಿದೆ</translation> <translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation> +<translation id="5951495562196540101">ಗ್ರಾಹಕರ ಖಾತೆಯ ಮೂಲಕ ನೋಂದಣಿ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ (ಪ್ಯಾಕೇಜ್ ಮಾಡಲಾದ ಪರವಾನಗಿ ಲಭ್ಯವಿದೆ).</translation> <translation id="5967592137238574583">ಸಂಪರ್ಕ ಮಾಹಿತಿಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="5967867314010545767">ಇತಿಹಾಸದಿಂದ ತೆಗೆದುಹಾಕಿ</translation> <translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation> @@ -1058,6 +1062,7 @@ <translation id="8433057134996913067">ಇದು ನಿಮ್ಮನ್ನು ಹೆಚ್ಚಿನ ವೆಬ್ಸೈಟ್ಗಳಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತದೆ.</translation> <translation id="8437238597147034694">&ಸರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್}one{# ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳು}other{# ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳು}}</translation> +<translation id="8473863474539038330">ವಿಳಾಸಗಳು ಮತ್ತು ಇನ್ನಷ್ಟು</translation> <translation id="8483780878231876732">ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಕಾರ್ಡ್ಗಳನ್ನು ಬಳಸಲು, Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="8488350697529856933">ಇದಕ್ಕೆ ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ</translation> <translation id="8498891568109133222">ಪ್ರತಿಕ್ರಿಯಿಸಲು <ph name="HOST_NAME" /> ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಂಡಿದೆ.</translation> @@ -1118,6 +1123,7 @@ <translation id="8952525071319348207">ನಿಮ್ಮ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು <ph name="CREDIT_CARD" /> ಗೆ ಅವಧಿ ಮುಕ್ತಾಯದ ದಿನಾಂಕ ಮತ್ತು CVC ಅನ್ನು ನಮೂದಿಸಿ. ನೀವು ಖಚಿತಪಡಿಸಿದ ನಂತರ, ನಿಮ್ಮ Google ಪಾವತಿಗಳ ಖಾತೆಯಿಂದ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ಈ ಸೈಟ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation> <translation id="8957210676456822347">ಕ್ಯಾಪ್ಟಿವ್ ಪೋರ್ಟಲ್ ದೃಢೀಕರಣ</translation> <translation id="8971063699422889582">ಸರ್ವರ್ನ ಪ್ರಕಮಾಣಪತ್ರದ ಅವಧಿ ಮುಕ್ತಾಯಗೊಂಡಿದೆ.</translation> +<translation id="8975012916872825179">ಫೋನ್ ಸಂಖ್ಯೆಗಳು, ಇಮೇಲ್ ವಿಳಾಸಗಳು ಮತ್ತು ಶಿಪ್ಪಿಂಗ್ ವಿಳಾಸಗಳಂತಹ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ</translation> <translation id="8978053250194585037">Google ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಇತ್ತೀಚೆಗೆ <ph name="SITE" /> ನಲ್ಲಿ <ph name="BEGIN_LINK" />ಫಿಶಿಂಗ್ ಪತ್ತೆಹಚ್ಚಿದೆ<ph name="END_LINK" />. ಫಿಶಿಂಗ್ ಸೈಟ್ಗಳು ನಿಮ್ಮನ್ನು ಮೋಸಗೊಳಿಸಲು ಇತರ ಸೈಟ್ಗಳಂತೆ ನಟಿಸುತ್ತವೆ.</translation> <translation id="8983003182662520383">Google Pay ಅನ್ನು ಬಳಸುವ ಪಾವತಿ ವಿಧಾನಗಳು ಮತ್ತು ವಿಳಾಸಗಳು</translation> <translation id="8987927404178983737">ತಿಂಗಳು</translation> @@ -1166,6 +1172,7 @@ <translation id="935608979562296692">ಫಾರ್ಮ್ ತೆರವುಗೊಳಿಸಿ</translation> <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation> <translation id="951104842009476243">ಸ್ವೀಕೃತ ಡೆಬಿಟ್ ಮತ್ತು ಪ್ರೀಪೇಯ್ಡ್ ಕಾರ್ಡ್ಗಳು</translation> +<translation id="962484866189421427">ಈ ವಿಷಯವು ವಂಚಕ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಬಹುದು. ಈ ಆ್ಯಪ್ಗಳು ಬೇರೆ ಯಾವುದರಂತೆಯೋ ಸೋಗು ಹಾಕುವ ಅಥವಾ ನಿಮ್ಮನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಬಳಸಬಹುದಾದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುವ ಸಾಧ್ಯತೆಯಿದೆ. <ph name="BEGIN_LINK" />ಹೇಗಿದ್ದರೂ ತೋರಿಸಿ<ph name="END_LINK" /></translation> <translation id="969892804517981540">ಅಧಿಕೃತವಾಗಿ ನಿರ್ಮಿಸಿ</translation> <translation id="973773823069644502">ವಿತರಣೆ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ</translation> <translation id="975560348586398090">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಐಟಂ}one{# ಐಟಂಗಳು}other{# ಐಟಂಗಳು}}</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index a2de5ac2..6eb4340d 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">이 카드를 Google 계정과 이 기기에 저장하시겠습니까?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">만료: <ph name="EXPIRATION_YEAR" />년 <ph name="EXPIRATION_MONTH" />월</translation> +<translation id="3807873520724684969">유해한 콘텐츠 차단됨</translation> <translation id="382518646247711829">프록시 서버를 사용하는 경우</translation> <translation id="3828924085048779000">암호를 빈 칸으로 두어서는 안 됩니다.</translation> <translation id="385051799172605136">뒤로</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">작업</translation> <translation id="4958444002117714549">펼치기 목록</translation> <translation id="4974590756084640048">경고 다시 사용</translation> +<translation id="4988217478422488391">온라인에서 더욱 빠르게 결제하세요.</translation> <translation id="4989809363548539747">이 플러그인은 지원되지 않습니다.</translation> <translation id="5002932099480077015">선택하면 Chrome에서 양식을 더 빠르게 작성할 수 있도록 이 기기에 카드 사본을 저장합니다.</translation> <translation id="5018422839182700155">이 페이지를 열 수 없음</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">수정 다시 실행(&R)</translation> <translation id="5481076368049295676">이 콘텐츠는 사용자의 정보를 도용하거나 삭제하는 위험한 소프트웨어를 기기에 설치하려 할 수도 있습니다. <ph name="BEGIN_LINK" />표시하기<ph name="END_LINK" /></translation> <translation id="54817484435770891">유효한 주소 추가</translation> +<translation id="5490432419156082418">주소 및 기타</translation> <translation id="5492298309214877701">회사, 조직, 학교 인트라넷의 해당 사이트가 외부 웹사이트와 동일한 URL을 갖고 있습니다. <ph name="LINE_BREAK" /> 시스템 관리자에게 문의하세요.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1개 사용 중}other{#개 사용 중}}</translation> <translation id="5922853866070715753">거의 완료되었습니다</translation> <translation id="5939518447894949180">초기화</translation> +<translation id="5951495562196540101">일반 계정으로 등록할 수 없습니다(패키지 라이선스 사용 가능).</translation> <translation id="5967592137238574583">연락처 정보 수정</translation> <translation id="5967867314010545767">기록에서 삭제</translation> <translation id="5975083100439434680">축소</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">이 작업을 수행하면 대부분의 웹사이트에서 로그아웃됩니다.</translation> <translation id="8437238597147034694">이동 실행 취소(&U)</translation> <translation id="8466379296835108687">{COUNT,plural, =1{신용카드 1개}other{신용카드 #개}}</translation> +<translation id="8473863474539038330">주소 및 기타</translation> <translation id="8483780878231876732">Google 계정에서 카드를 사용하려면 Chrome에 로그인하세요.</translation> <translation id="8488350697529856933">적용 대상</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" />에서 응답하는 데 시간이 너무 오래 걸립니다.</translation> @@ -1123,6 +1128,7 @@ <translation id="8952525071319348207">카드 세부정보를 업데이트하려면 <ph name="CREDIT_CARD" /> 카드의 만료일과 CVC를 입력하세요. 카드를 확인하면 Google Payments 계정의 카드 세부정보가 이 사이트와 공유됩니다.</translation> <translation id="8957210676456822347">캡티브 포털 승인</translation> <translation id="8971063699422889582">서버 인증서가 만료되었습니다.</translation> +<translation id="8975012916872825179">전화번호, 이메일 주소, 배송지 주소 등의 정보를 포함합니다.</translation> <translation id="8978053250194585037">Google 세이프 브라우징이 최근 <ph name="SITE" />에서 <ph name="BEGIN_LINK" />피싱을 감지<ph name="END_LINK" />했습니다. 피싱 사이트는 사용자를 속이기 위해 다른 웹사이트인 것처럼 가장합니다.</translation> <translation id="8983003182662520383">Google Pay에 사용되는 결제 수단 및 주소</translation> <translation id="8987927404178983737">월</translation> @@ -1171,6 +1177,7 @@ <translation id="935608979562296692">양식 지우기</translation> <translation id="939736085109172342">새 폴더</translation> <translation id="951104842009476243">사용 가능한 직불카드 및 선불카드</translation> +<translation id="962484866189421427">이 콘텐츠에서 다른 앱인 것처럼 가장하거나 사용자를 추적하는 데 사용될 수 있는 데이터를 수집하는 사기성 앱을 설치할 수도 있습니다. <ph name="BEGIN_LINK" />그래도 표시하기<ph name="END_LINK" /></translation> <translation id="969892804517981540">공식 빌드</translation> <translation id="973773823069644502">배달 주소 추가</translation> <translation id="975560348586398090">{COUNT,plural, =0{없음}=1{항목 1개}other{항목 #개}}</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index aabdfcd..30bbb2e 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -423,6 +423,7 @@ <translation id="3778403066972421603">Ar norite išsaugoti šią kortelę „Google“ paskyroje ir šiame įrenginyje?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Galiojimo laikas baigiasi <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Žalingas turinys užblokuotas.</translation> <translation id="382518646247711829">Jei naudojate tarpinį serverį…</translation> <translation id="3828924085048779000">Neleidžiama naudoti tuščios slaptafrazės.</translation> <translation id="385051799172605136">Grįžti</translation> @@ -579,6 +580,7 @@ <translation id="495170559598752135">Veiksmai</translation> <translation id="4958444002117714549">Išskleisti sąrašą</translation> <translation id="4974590756084640048">Iš naujo įgalinti įspėjimus</translation> +<translation id="4988217478422488391">Padeda greičiau sumokėti internete</translation> <translation id="4989809363548539747">Šis papildinys nepalaikomas</translation> <translation id="5002932099480077015">Jei šis nustatymas įgalintas, „Chrome“ saugos kortelės kopiją šiame įrenginyje, kad būtų galima greičiau užpildyti formas.</translation> <translation id="5018422839182700155">Negalima atidaryti šio puslapio</translation> @@ -658,6 +660,7 @@ <translation id="5470861586879999274">&Redaguoti dar kartą</translation> <translation id="5481076368049295676">Šiuo turiniu gali būti bandoma priversti jus įrenginyje įdiegti pavojingą programinę įrangą, kuri vagia arba ištrina jūsų informaciją. <ph name="BEGIN_LINK" />Rodyti vis tiek<ph name="END_LINK" /></translation> <translation id="54817484435770891">Tinkamo adreso pridėjimas</translation> +<translation id="5490432419156082418">Adresai ir dar daugiau</translation> <translation id="5492298309214877701">Šios svetainės URL įmonės, organizacijos ar mokyklos intranete toks pat kaip išorinės svetainės URL. <ph name="LINE_BREAK" /> Pabandykite susisiekti su sistemos administratoriumi.</translation> @@ -721,6 +724,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Naudojamas 1 slapukas}one{Naudojamas # slapukas}few{Naudojami # slapukai}many{Naudojama # slapuko}other{Naudojama # slapukų}}</translation> <translation id="5922853866070715753">Beveik atlikta</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> +<translation id="5951495562196540101">Nepavyko prisiregistruoti su kliento paskyra (galima įsigyti licencijos paketą).</translation> <translation id="5967592137238574583">Kontaktinės informacijos redagavimas</translation> <translation id="5967867314010545767">Pašalinti iš istorijos</translation> <translation id="5975083100439434680">Tolinti</translation> @@ -1066,6 +1070,7 @@ <translation id="8433057134996913067">Tai atlikę atsijungsite nuo daugumos svetainių.</translation> <translation id="8437238597147034694">&Anuliuoti perkėlimą</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kredito kortelė}one{# kredito kortelė}few{# kredito kortelės}many{# kredito kortelės}other{# kredito kortelių}}</translation> +<translation id="8473863474539038330">Adresai ir dar daugiau</translation> <translation id="8483780878231876732">Jei norite naudoti korteles iš „Google“ paskyros, prisijunkite prie „Chrome“</translation> <translation id="8488350697529856933">Taikoma</translation> <translation id="8498891568109133222">Per ilgai laukta <ph name="HOST_NAME" /> atsako.</translation> @@ -1126,6 +1131,7 @@ <translation id="8952525071319348207">Jei norite atnaujinti išsamią kortelės informaciją, įveskite „<ph name="CREDIT_CARD" />“ galiojimo pabaigos datą ir kortelės saugos kodą (CVC). Kai patvirtinsite, „Google“ mokamojoje paskyroje nurodyta išsami kortelės informacija bus bendrinama su šia svetaine.</translation> <translation id="8957210676456822347">Fiksuotojo portalo autorizavimas</translation> <translation id="8971063699422889582">Baigėsi serverio sertifikato galiojimo laikas.</translation> +<translation id="8975012916872825179">Įtraukiama tokia informacija kaip telefono numeriai, el. pašto adresai ir pristatymo adresai</translation> <translation id="8978053250194585037">„Google“ saugaus naršymo sistema neseniai <ph name="BEGIN_LINK" />aptiko, kad svetainėje <ph name="SITE" /> sukčiaujama<ph name="END_LINK" />. Sukčiavimo svetainės apsimeta kitomis svetainėmis, kad jus apgautų.</translation> <translation id="8983003182662520383">„Google Pay“ naudojami mokėjimo metodai ir adresai</translation> <translation id="8987927404178983737">Mėnuo</translation> @@ -1174,6 +1180,7 @@ <translation id="935608979562296692">CLEAR FORM</translation> <translation id="939736085109172342">Naujas aplankas</translation> <translation id="951104842009476243">Tinkamos debeto ir išankstinio mokėjimo kortelės</translation> +<translation id="962484866189421427">Šis turinys gali bandyti įdiegti klaidinančių programų, kurios apsimeta kitomis programomis, arba rinkti duomenis, naudojamus jums stebėti. <ph name="BEGIN_LINK" />Rodyti vis tiek<ph name="END_LINK" /></translation> <translation id="969892804517981540">Oficialiai pagaminta</translation> <translation id="973773823069644502">Pridėti pristatymo adresą</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nėra}=1{1 elementas}one{# elementas}few{# elementai}many{# elemento}other{# elementų}}</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index d45404a..7d4dacf 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -421,6 +421,7 @@ <translation id="3778403066972421603">Vai vēlaties saglabāt šo karti savā Google kontā un šajā ierīcē?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Derīguma termiņš: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Tika bloķēts kaitīgs saturs.</translation> <translation id="382518646247711829">Ja izmantojat starpniekserveri...</translation> <translation id="3828924085048779000">Tukša ieejas frāze nav atļauta.</translation> <translation id="385051799172605136">Atpakaļ</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">Darbības</translation> <translation id="4958444002117714549">Izvērst sarakstu</translation> <translation id="4974590756084640048">Atkārtoti iespējot brīdinājumus</translation> +<translation id="4988217478422488391">Paātrina pirkumu apmaksas procesu tiešsaistē</translation> <translation id="4989809363548539747">Šis spraudnis netiek atbalstīts</translation> <translation id="5002932099480077015">Iespējojot šo opciju, Chrome saglabās jūsu kartes informāciju šajā ierīcē, lai jūs varētu ātrāk aizpildīt veidlapas.</translation> <translation id="5018422839182700155">Nevar atvērt šo lapu</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&Atcelt labojuma atsaukšanu</translation> <translation id="5481076368049295676">Šis saturs jūsu ierīcē var mēģināt instalēt bīstamu programmatūru, kas var nozagt vai izdzēst jūsu informāciju. <ph name="BEGIN_LINK" />Tāpat rādīt<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Derīgas adreses pievienošana</translation> +<translation id="5490432419156082418">Adreses un citus datus</translation> <translation id="5492298309214877701">Šai vietnei uzņēmuma, organizācijas vai skolas iekštīklā ir tāds pats URL kā ārējai vietnei. <ph name="LINE_BREAK" /> Sazinieties ar sistēmas administratoru.</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 tiek lietots}zero{# tiek lietoti}one{# tiek lietots}other{# tiek lietoti}}</translation> <translation id="5922853866070715753">Gandrīz pabeigts</translation> <translation id="5939518447894949180">Atiestatīt</translation> +<translation id="5951495562196540101">Neizdevās reģistrēt, izmantojot patērētāja kontu (pieejama komplektā iekļauta licence).</translation> <translation id="5967592137238574583">Kontaktinformācijas rediģēšana</translation> <translation id="5967867314010545767">Noņemt no vēstures</translation> <translation id="5975083100439434680">Tālināt</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Šādi tiksiet izrakstīts no lielākās daļas vietņu.</translation> <translation id="8437238597147034694">&Atsaukt pārvietošanu</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kredītkarte}zero{# kredītkartes}one{# kredītkarte}other{# kredītkartes}}</translation> +<translation id="8473863474539038330">Adreses un citus datus</translation> <translation id="8483780878231876732">Lai izmantotu kartes no sava Google konta, pierakstieties pārlūkā Chrome!</translation> <translation id="8488350697529856933">Attiecas uz</translation> <translation id="8498891568109133222">Vietne <ph name="HOST_NAME" /> pārāk ilgi nereaģēja.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Lai atjauninātu kartes informāciju, ievadiet kredītkartes <ph name="CREDIT_CARD" /> derīguma termiņu un CVC kodu. Pēc apstiprināšanas kartes informācija no Google maksājumu konta tiks kopīgota ar šo vietni.</translation> <translation id="8957210676456822347">Caurlaides lapas autorizācija</translation> <translation id="8971063699422889582">Servera sertifikātam ir beidzies derīguma termiņš.</translation> +<translation id="8975012916872825179">Iekļauta tāda informācija kā tālruņa numuri, e-pasta un piegādes adreses</translation> <translation id="8978053250194585037">Google drošā pārlūkošana nesen <ph name="BEGIN_LINK" />konstatēja pikšķerēšanu<ph name="END_LINK" /> vietnē <ph name="SITE" />. Pikšķerēšanas vietnes uzdodas par citām vietnēm, lai jūs maldinātu.</translation> <translation id="8983003182662520383">Adreses un maksājumu veidi, kuros tiek izmantots pakalpojums Google Pay</translation> <translation id="8987927404178983737">Mēnesis</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">NOTĪRĪT VEIDLAPU</translation> <translation id="939736085109172342">Jauna mape</translation> <translation id="951104842009476243">Atbalstītās debetkartes un priekšapmaksas kartes</translation> +<translation id="962484866189421427">Šis saturs jūsu ierīcē var mēģināt instalēt maldinošas lietotnes, kas tiek uzdodas par cita veida saturu, vai vākt datus, kas var tikt izmantoti jūsu izsekošanai. <ph name="BEGIN_LINK" />Tāpat rādīt<ph name="END_LINK" />.</translation> <translation id="969892804517981540">Oficiālā Uzbūve</translation> <translation id="973773823069644502">Pievienot piegādes adresi</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nav}=1{1 vienums}zero{# vienumi}one{# vienums}other{# vienumi}}</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index c2f107f..68ee0f9 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -319,7 +319,7 @@ <translation id="3154506275960390542">സുരക്ഷിതമായി സമർപ്പിക്കാൻ സാധിക്കാത്ത ഒരു ഫോം ഈ പേജിൽ ഉണ്ട്. അയയ്ക്കുന്ന സമയത്ത് നിങ്ങളുടെ ഡാറ്റ മറ്റുള്ളവര്ക്ക് കാണാനാകും, അല്ലെങ്കിൽ സെർവറിലേക്ക് എത്തും മുമ്പ് ഒരു അക്രമിക്ക് പരിഷ്ക്കരിക്കാൻ കഴിയും.</translation> <translation id="3157931365184549694">പുനഃസ്ഥാപിക്കുക</translation> <translation id="3162559335345991374">നിങ്ങൾ ഉപയോഗിക്കുന്ന Wi-Fi അതിന്റെ ലോഗിൻ പേജ് സന്ദർശിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടാം.</translation> -<translation id="3167968892399408617">ആൾമാറാട്ട ടാബുകളിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ, ആൾമാറാട്ട ടാബുകൾ എല്ലാം അടച്ചതിനുശേഷം ബ്രൗസർ ചരിത്രത്തിലോ കുക്കി സ്റ്റോറിലോ തിരയൽ ചരിത്രത്തിലോ ഉണ്ടാകില്ല. നിങ്ങൾ ഡൗൺലോഡുചെയ്യുന്ന ഫയലുകളോ സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളോ എല്ലാം സൂക്ഷിക്കും.</translation> +<translation id="3167968892399408617">അദൃശ്യ ടാബുകളിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ, ആൾമാറാട്ട ടാബുകൾ എല്ലാം അടച്ചതിനുശേഷം ബ്രൗസർ ചരിത്രത്തിലോ കുക്കി സ്റ്റോറിലോ തിരയൽ ചരിത്രത്തിലോ ഉണ്ടാകില്ല. നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകളോ സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളോ എല്ലാം സൂക്ഷിക്കും.</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3174168572213147020">ഐലന്ഡ്</translation> <translation id="3176929007561373547">പ്രോക്സി സെർവർ പ്രവർത്തിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ @@ -421,6 +421,7 @@ <translation id="3778403066972421603">ഈ കാർഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിലും ഈ ഉപകരണത്തിലും സംരക്ഷിക്കണോ?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" />-ൽ അവസാനിക്കുന്നു</translation> +<translation id="3807873520724684969">ദോഷകരമായ ഉള്ളടക്കം ബ്ലോക്ക് ചെയ്തു.</translation> <translation id="382518646247711829">നിങ്ങൾ ഒരു പ്രോക്സി സെർവർ ഉപയോഗിക്കുന്നെങ്കിൽ...</translation> <translation id="3828924085048779000">ശൂന്യ പാസ്ഫ്രെയ്സ് അനുവദനീയമല്ല.</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">പ്രവര്ത്തനങ്ങള്</translation> <translation id="4958444002117714549">ലിസ്റ്റ് വിപുലീകരിക്കുക</translation> <translation id="4974590756084640048">മുന്നറിയിപ്പുകൾ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക</translation> +<translation id="4988217478422488391">ഓൺലൈനിലെ കാര്യങ്ങൾക്ക് പണമടയ്ക്കുന്നത് വേഗത്തിലാക്കുന്നു</translation> <translation id="4989809363548539747">ഈ പ്ലഗിൻ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="5002932099480077015">പ്രവർത്തനക്ഷമമാക്കിയെങ്കിൽ, വേഗത്തിൽ ഫോം പൂരിപ്പിക്കാൻ Chrome ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ കാർഡിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കും.</translation> <translation id="5018422839182700155">ഈ പേജ് തുറക്കാനായില്ല</translation> @@ -646,7 +648,7 @@ <translation id="5387961145478138773">നിങ്ങളുടെ പ്രിയപ്പെട്ട Google ആപ്പുകളിലേക്ക് വേഗത്തിൽ ആക്സസ് നേടുക</translation> <translation id="540969355065856584">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റിന് ഇപ്പോൾ സാധുതയുള്ളതല്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> <translation id="5421136146218899937">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കുക...</translation> -<translation id="5430298929874300616">ബുക്ക്മാർക്ക് നീക്കംചെയ്യുക</translation> +<translation id="5430298929874300616">ബുക്ക്മാർക്ക് നീക്കം ചെയ്യുക</translation> <translation id="5431657950005405462">നിങ്ങളുടെ ഫയൽ കണ്ടെത്തിയില്ല</translation> <translation id="5439770059721715174">"<ph name="ERROR_PATH" />" എന്നതിൽ സ്കീമ മൂല്ല്യനിർണ്ണയ പിശക്: <ph name="ERROR" /></translation> <translation id="5452270690849572955">ഈ <ph name="HOST_NAME" /> പേജ് കണ്ടെത്താനായില്ല</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&എഡിറ്റുചെയ്യുന്നത് വീണ്ടും ചെയ്യുക</translation> <translation id="5481076368049295676">ഈ ഉള്ളടക്കം, നിങ്ങളുടെ ഉപകരണത്തിൽ വിവരങ്ങൾ മോഷ്ടിക്കുകയോ ഇല്ലാതാക്കുയോ ചെയ്യുന്ന തരത്തിലുള്ള സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്യാൻ ശ്രമിച്ചേക്കാം. <ph name="BEGIN_LINK" />എന്തായാലും കാണിക്കുക<ph name="END_LINK" /></translation> <translation id="54817484435770891">ശരിയായ വിലാസം ചേർക്കുക</translation> +<translation id="5490432419156082418">വിലാസങ്ങളും മറ്റും</translation> <translation id="5492298309214877701">കമ്പനി, ഓർഗനൈസേഷൻ അല്ലെങ്കിൽ സ്കൂൾ ഇൻട്രാനെറ്റിലെ ഈ സൈറ്റിന്, ബാഹ്യ വെബ്സൈറ്റിന് സമാനമായ URL ആണുള്ളത്. <ph name="LINE_BREAK" /> നിങ്ങളുടെ സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടാൻ ശ്രമിക്കുക.</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{ഒരെണ്ണം ഉപയോഗത്തിലുണ്ട്}other{# എണ്ണം ഉപയോഗത്തിലുണ്ട്}}</translation> <translation id="5922853866070715753">ഏതാണ്ട് പൂർത്തിയായി</translation> <translation id="5939518447894949180">വീണ്ടും സജ്ജീകരിക്കുക</translation> +<translation id="5951495562196540101">ഉപയോക്തൃ അക്കൗണ്ട് ഉപയോഗിച്ച് എൻറോൾ ചെയ്യാനാവില്ല (പാക്കേജ് ചെയ്ത ലൈസൻസ് ലഭ്യമാണ്).</translation> <translation id="5967592137238574583">കോൺടാക്റ്റ് വിവരം എഡിറ്റുചെയ്യുക</translation> <translation id="5967867314010545767">ചരിത്രത്തിൽ നിന്നും നീക്കംചെയ്യുക</translation> <translation id="5975083100439434680">സൂം ഔട്ട്</translation> @@ -775,7 +779,7 @@ <translation id="6386120369904791316">{COUNT,plural, =1{മറ്റൊരു നിർദ്ദേശം}other{മറ്റ് # നിർദ്ദേശങ്ങൾ}}</translation> <translation id="6387754724289022810">അടുത്ത പ്രാവശ്യം വേഗത്തിൽ പണമടയ്ക്കാൻ, നിങ്ങളുടെ Google അക്കൗണ്ടിലും ഈ ഉപകരണത്തിലും ഈ കാർഡും ബില്ലിംഗ് വിലാസവും സംരക്ഷിക്കുക.</translation> <translation id="6397451950548600259">വെബിലേക്ക് സുരക്ഷിതമായി കണക്റ്റുചെയ്യുന്നതിൽ നിന്ന് Chrome-നെ നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ സോഫ്റ്റ്വെയർ തടയുന്നു</translation> -<translation id="6404511346730675251">ബുക്ക്മാർക്ക് എഡിറ്റുചെയ്യുക</translation> +<translation id="6404511346730675251">ബുക്ക്മാർക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="6410264514553301377"><ph name="CREDIT_CARD" />-ന്റെ കാലാവധി തീരുന്ന തീയതിയും CVC-യും നൽകുക</translation> <translation id="6414888972213066896">ഈ സൈറ്റ് സന്ദർശിക്കുന്നതിന് നിങ്ങൾ രക്ഷിതാവിനോട് അനുമതി ആവശ്യപ്പെട്ടു</translation> <translation id="6417515091412812850">സര്ട്ടിഫിക്കറ്റ് അസാധുവാക്കിയോ എന്ന് പരിശോധിക്കുന്നതിനായില്ല.</translation> @@ -1062,6 +1066,7 @@ <translation id="8433057134996913067">ഇത് നിങ്ങളെ മിക്ക വെബ്സൈറ്റുകളിൽ നിന്നും സൈൻ ഔട്ട് ചെയ്യിക്കും.</translation> <translation id="8437238597147034694">&നീക്കുന്നത് പഴയപടിയാക്കുക</translation> <translation id="8466379296835108687">{COUNT,plural, =1{ഒരു ക്രെഡിറ്റ് കാർഡ്}other{# ക്രെഡിറ്റ് കാർഡുകൾ}}</translation> +<translation id="8473863474539038330">വിലാസങ്ങളും മറ്റും</translation> <translation id="8483780878231876732">നിങ്ങളുടെ Google അക്കൗണ്ടിൽ നിന്ന് കാർഡുകൾ ഉപയോഗിക്കാൻ, Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="8488350697529856933">ഇതിന് ബാധകമാക്കുന്നു</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> പ്രതികരിക്കാൻ കൂടുതൽ സമയമെടുത്തു.</translation> @@ -1122,6 +1127,7 @@ <translation id="8952525071319348207">നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാൻ <ph name="CREDIT_CARD" /> കാർഡിന്റെ കാലാവധി തീരുന്ന തീയതിയും CVC-യും നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ Google പേയ്മെന്റ് അക്കൗണ്ടിൽ നിന്നുള്ള കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation> <translation id="8957210676456822347">ക്യാപ്റ്റീവ് പോർട്ടൽ അംഗീകരിക്കൽ</translation> <translation id="8971063699422889582">സെര്വറിന്റെ സര്ട്ടിഫിക്കറ്റ് കാലഹരണപ്പെട്ടു.</translation> +<translation id="8975012916872825179">ഫോൺ നമ്പറുകൾ, ഇമെയിൽ വിലാസങ്ങൾ, ഷിപ്പിംഗ് വിലാസങ്ങൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഉൾപ്പെടുന്നു</translation> <translation id="8978053250194585037">Google സുരക്ഷിത ബ്രൗസിംഗ് ഈയിടെ <ph name="SITE" />-ൽ <ph name="BEGIN_LINK" />ഫിഷിംഗ് കണ്ടെത്തി<ph name="END_LINK" />. നിങ്ങളെ കബളിപ്പിക്കാൻ ഫിഷിംഗ് സൈറ്റുകൾ മറ്റു വെബ്സൈറ്റുകളെന്ന നിലയിൽ ഭാവിക്കും.</translation> <translation id="8983003182662520383">Google Pay ഉപയോഗിക്കുന്ന വിലാസങ്ങളും പേയ്മെന്റ് രീതികളും</translation> <translation id="8987927404178983737">മാസം</translation> @@ -1170,6 +1176,7 @@ <translation id="935608979562296692">ഫോം മായ്ക്കുക</translation> <translation id="939736085109172342">പുതിയ ഫോള്ഡര്</translation> <translation id="951104842009476243">സ്വീകരിക്കുന്ന ഡെബിറ്റ് കാർഡുകളും പ്രീപെയ്ഡ് കാർഡുകളും</translation> +<translation id="962484866189421427">മറ്റെന്തെങ്കിലും ആണെന്ന് അവകാശപ്പെടുന്ന അല്ലെങ്കിൽ നിങ്ങളെ ട്രാക്ക് ചെയ്യാൻ ഉപയോഗിച്ചേക്കാവുന്ന ഡാറ്റ ശേഖരിക്കുന്ന, തെറ്റിദ്ധരിപ്പിക്കുന്ന ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ ഈ ഉള്ളടക്കം ശ്രമിച്ചേക്കാം. <ph name="BEGIN_LINK" />എന്തായാലും കാണിക്കുക<ph name="END_LINK" /></translation> <translation id="969892804517981540">ഔദ്യോഗിക ബില്ഡ്</translation> <translation id="973773823069644502">ഡെലിവറി നൽകേണ്ട വിലാസം ചേർക്കുക</translation> <translation id="975560348586398090">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു ഇനം}other{# ഇനങ്ങൾ}}</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index fcf83f6..6920d17 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">तुम्हाला हे कार्ड तुमच्या Google खात्यामध्ये आणि या डिव्हाइसवर सेव्ह करायचे आहे का?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">समाप्त होते: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">हानिकारक आशय ब्लॉक केला गेला.</translation> <translation id="382518646247711829">आपण प्रॉक्सी सर्व्हर वापरत असल्यास...</translation> <translation id="3828924085048779000">रिक्त सांकेतिक वाक्यांशाची परवानगी नाही.</translation> <translation id="385051799172605136">मागील</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">क्रिया</translation> <translation id="4958444002117714549">सूची विस्तृत करा</translation> <translation id="4974590756084640048">चेतावण्या पुन्हा सक्षम करा</translation> +<translation id="4988217478422488391">गोष्टींसाठी ऑनलाइन पैसे देणे आणखी जलद करते</translation> <translation id="4989809363548539747">हे प्लगिन समर्थित नाही</translation> <translation id="5002932099480077015">सक्षम केल्यास, Chrome जलदपणे फॉर्म भरण्यासाठी आपल्या कार्डची एक प्रत या डिव्हाइसवर संग्रहित करेल.</translation> <translation id="5018422839182700155">हे पृष्ठ उघडू शकत नाही</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&संपादित करा पुन्हा करा</translation> <translation id="5481076368049295676">हा आशय तुमच्या डिव्हाइसवर तुमची माहिती चोरू किंवा मिटवू शकणारे धोकादायक सॉफ्टवेअर इंस्टॉल करण्याचा कदाचित प्रयत्न करेल. <ph name="BEGIN_LINK" />तरीही दाखवा<ph name="END_LINK" /></translation> <translation id="54817484435770891">वैध पत्ता जोडा</translation> +<translation id="5490432419156082418">पत्ते आणि बरेच काही</translation> <translation id="5492298309214877701">कंपनी, संस्था किंवा शाळा इंट्रानेट वरील या साइटची URL बाह्य वेबसाइटसारखीच आहे. <ph name="LINE_BREAK" /> सिस्टम प्रशासकाशी संपर्क साधण्याचा प्रयत्न करा.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 वापरात आहे}one{# वापरात आहे}other{# वापरात आहेत}}</translation> <translation id="5922853866070715753">जवळजवळ पूर्ण झाले</translation> <translation id="5939518447894949180">रीसेट करा</translation> +<translation id="5951495562196540101">उपभोक्ता खात्याने नोंदणी करू शकत नाही (पॅकेज केलेला परवाना उपलब्ध).</translation> <translation id="5967592137238574583">संपर्क माहिती संपादित करा</translation> <translation id="5967867314010545767">इतिहासातून काढा</translation> <translation id="5975083100439434680">झूम कमी करा</translation> @@ -1066,6 +1070,7 @@ <translation id="8433057134996913067">हे आपल्याला बहुतांश वेबसाइट वरून साइन आउट करेल.</translation> <translation id="8437238597147034694">&हलवा पूर्ववत करा</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 क्रेडिट कार्ड}one{# क्रेडिट कार्ड}other{# क्रेडिट कार्ड}}</translation> +<translation id="8473863474539038330">पत्ते आणि बरेच काही</translation> <translation id="8483780878231876732">आपल्या Google खात्यावरून कार्ड वापरण्यासाठी Chrome मध्ये साइन इन करा</translation> <translation id="8488350697529856933">यावर लागू होते</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> नी प्रतिसाद देण्यात बराच वेळ घेतला.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">तुमच्या कार्डाचे तपशील अपडेट करण्यासाठी <ph name="CREDIT_CARD" /> कार्डाची मुदत संपण्याची तारीख आणि CVV टाका. तुम्ही निश्चित केल्यावर, तुमच्या Google पेमेंट खात्यावरील कार्डाचे तपशील या साइटसोबत शेअर केले जातील.</translation> <translation id="8957210676456822347">बंद पोर्टल प्राधिकृतता</translation> <translation id="8971063699422889582">सर्व्हरचे प्रमाणपत्र कालबाह्य झाले आहे.</translation> +<translation id="8975012916872825179">फोन नंबर, ईमेल अॅड्रेस आणि शिपिंग पत्ते यांसारखी माहिती समाविष्ट आहे</translation> <translation id="8978053250194585037">Google सुरक्षित ब्राउझिंगला <ph name="SITE" /> वर अलीकडे <ph name="BEGIN_LINK" />फिशिंग आढळले<ph name="END_LINK" />. तुम्हाला फसवण्यासाठी फिशिंग साइट दुसर्याच कुठल्यातरी वेबसाइट असल्याचे भासवतात.</translation> <translation id="8983003182662520383">Google Pay वापरून पेमेंट पद्धती आणि पत्ते</translation> <translation id="8987927404178983737">महिना</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">फॉर्म साफ करा</translation> <translation id="939736085109172342">नवीन फोल्डर</translation> <translation id="951104842009476243">स्वीकारली जाणारी डेबिट आणि प्रीपेड कार्डे</translation> +<translation id="962484866189421427">हा आशय काहीतरी दुसरे असण्याची बतावणी करणारी फसवी अॅप्स इंस्टॉल करण्याचा किंवा तुमचा माग ठेवण्यासाठी वापरला जाऊ शकणारा डेटा गोळा करण्याचा प्रयत्न करू शकतो. <ph name="BEGIN_LINK" />तरीही दाखवा<ph name="END_LINK" /></translation> <translation id="969892804517981540">अधिकृत बिल्ड</translation> <translation id="973773823069644502">वितरणाचा पत्ता जोडा</translation> <translation id="975560348586398090">{COUNT,plural, =0{काहीही नाही}=1{1 आयटम}one{# आयटम}other{# आयटम}}</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 0176d02..1b8a9d1 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -418,6 +418,7 @@ <translation id="3778403066972421603">Wil je deze kaart opslaan in je Google-account en op dit apparaat?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Verloopt: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Schadelijke content geblokkeerd.</translation> <translation id="382518646247711829">Als je een proxyserver gebruikt...</translation> <translation id="3828924085048779000">Een lege wachtwoordzin is niet toegestaan.</translation> <translation id="385051799172605136">Vorige</translation> @@ -574,6 +575,7 @@ <translation id="495170559598752135">Acties</translation> <translation id="4958444002117714549">Lijst uitvouwen</translation> <translation id="4974590756084640048">Waarschuwingen opnieuw inschakelen</translation> +<translation id="4988217478422488391">Hiermee kun je sneller online betalen</translation> <translation id="4989809363548539747">Deze plug-in wordt niet ondersteund</translation> <translation id="5002932099480077015">Indien ingeschakeld, slaat Chrome een kopie van je kaart op dit apparaat op zodat formulieren sneller kunnen worden ingevuld.</translation> <translation id="5018422839182700155">Kan deze pagina niet openen</translation> @@ -653,6 +655,7 @@ <translation id="5470861586879999274">&Opnieuw bewerken</translation> <translation id="5481076368049295676">Deze content probeert mogelijk gevaarlijke software op je apparaat te installeren die je gegevens steelt of verwijdert. <ph name="BEGIN_LINK" />Toch weergeven<ph name="END_LINK" /></translation> <translation id="54817484435770891">Voeg een geldig adres toe</translation> +<translation id="5490432419156082418">Adressen en meer</translation> <translation id="5492298309214877701">Deze site op het intranet van het bedrijf, de organisatie of de school heeft dezelfde URL als een externe website. <ph name="LINE_BREAK" /> Neem contact op met je systeembeheerder.</translation> @@ -716,6 +719,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 in gebruik}other{# in gebruik}}</translation> <translation id="5922853866070715753">Bijna klaar</translation> <translation id="5939518447894949180">Resetten</translation> +<translation id="5951495562196540101">Kan consumentenaccount niet inschrijven (verpakte licentie beschikbaar).</translation> <translation id="5967592137238574583">Contactgegevens bewerken</translation> <translation id="5967867314010545767">Verwijderen uit geschiedenis</translation> <translation id="5975083100439434680">Uitzoomen</translation> @@ -1060,6 +1064,7 @@ <translation id="8433057134996913067">Hiermee word je uitgelogd van de meeste websites.</translation> <translation id="8437238597147034694">&Verplaatsen ongedaan maken</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 creditcard}other{# creditcards}}</translation> +<translation id="8473863474539038330">Adressen en meer</translation> <translation id="8483780878231876732">Log in bij Chrome om kaarten uit je Google-account te gebruiken</translation> <translation id="8488350697529856933">Van toepassing op</translation> <translation id="8498891568109133222">Het duurt te lang voordat <ph name="HOST_NAME" /> reageert.</translation> @@ -1119,6 +1124,7 @@ <translation id="8952525071319348207">Geef de vervaldatum en CVC-code voor <ph name="CREDIT_CARD" /> op om je creditcardgegevens te updaten. Nadat je hebt bevestigd, worden je creditcardgegevens gedeeld met deze site.</translation> <translation id="8957210676456822347">Autorisatie van captive portal</translation> <translation id="8971063699422889582">Het servercertificaat is verlopen.</translation> +<translation id="8975012916872825179">Inclusief informatie als telefoonnummers, e-mailadressen en verzendadressen</translation> <translation id="8978053250194585037">Google Safe Browsing heeft onlangs <ph name="BEGIN_LINK" />phishing gedetecteerd<ph name="END_LINK" /> op <ph name="SITE" />. Phishingsites doen zich voor als een andere website om je te misleiden.</translation> <translation id="8983003182662520383">Betaalmethoden en adressen die Google Pay gebruiken</translation> <translation id="8987927404178983737">Maand</translation> @@ -1167,6 +1173,7 @@ <translation id="935608979562296692">FORMULIER LEEGMAKEN</translation> <translation id="939736085109172342">Nieuwe map</translation> <translation id="951104842009476243">Geaccepteerde betaalpassen en prepaidkaarten</translation> +<translation id="962484866189421427">Deze content kan mogelijk proberen misleidende apps te installeren die zich voordoen als iets anders of gegevens verzamelen die kunnen worden gebruikt om je te volgen. <ph name="BEGIN_LINK" />Toch weergeven<ph name="END_LINK" /></translation> <translation id="969892804517981540">Officiële build</translation> <translation id="973773823069644502">Afleveradres toevoegen</translation> <translation id="975560348586398090">{COUNT,plural, =0{Geen}=1{1 item}other{# items}}</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 2fe9b6e86..5028b06 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Vil du lagre dette kortet i Google-kontoen din og på denne enheten?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Utløper <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Skadelig innhold er blokkert.</translation> <translation id="382518646247711829">Hvis du bruker en mellomtjener...</translation> <translation id="3828924085048779000">Tom passordfrase er ikke tillatt.</translation> <translation id="385051799172605136">Tilbake</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Handlinger</translation> <translation id="4958444002117714549">Utvid liste</translation> <translation id="4974590756084640048">Slå på advarsler på nytt</translation> +<translation id="4988217478422488391">Gjør det raskere å betale for ting på nettet</translation> <translation id="4989809363548539747">Dette programtillegget støttes ikke</translation> <translation id="5002932099480077015">Hvis du slår på dette alternativet, lagrer Chrome en kopi av kortet ditt på denne enheten, slik at det blir raskere å fylle ut skjemaer i fremtiden.</translation> <translation id="5018422839182700155">Kan ikke åpne denne siden</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Endre likevel</translation> <translation id="5481076368049295676">Dette innholdet kan prøve å installere farlig programvare som stjeler eller sletter informasjon, på enheten din. <ph name="BEGIN_LINK" />Vis det likevel<ph name="END_LINK" /></translation> <translation id="54817484435770891">Du må angi en gyldig adresse</translation> +<translation id="5490432419156082418">Adresser med mer</translation> <translation id="5492298309214877701">Dette nettstedet på selskapets, organisasjonens eller skolens intranett har samme nettadresse som et eksternt nettsted. <ph name="LINE_BREAK" /> Prøv å kontakte systemadministratoren din.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 er i bruk}other{# er i bruk}}</translation> <translation id="5922853866070715753">Nesten ferdig</translation> <translation id="5939518447894949180">Tilbakestill</translation> +<translation id="5951495562196540101">Kan ikke registrere med en forbrukerkonto (pakkelisens er tilgjengelig).</translation> <translation id="5967592137238574583">Endre kontaktinformasjonen</translation> <translation id="5967867314010545767">Fjern fra loggen</translation> <translation id="5975083100439434680">Zoom ut</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Dette logger deg av de fleste nettsteder.</translation> <translation id="8437238597147034694">&Angre flyttingen</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kredittkort}other{# kredittkort}}</translation> +<translation id="8473863474539038330">Adresser med mer</translation> <translation id="8483780878231876732">For å bruke kredittkort du har lagret i Google-kontoen din, logg på Chrome</translation> <translation id="8488350697529856933">Gjelder for</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> brukte for lang tid på å svare.</translation> @@ -1123,6 +1128,7 @@ <translation id="8952525071319348207">Skriv inn utløpsdatoen og CVC-koden for <ph name="CREDIT_CARD" /> for å oppdatere kortinformasjonen din. Når du bekrefter, deles kortopplysningene fra Google Payments-kontoen med dette nettstedet.</translation> <translation id="8957210676456822347">Captive Portal-autorisasjon</translation> <translation id="8971063699422889582">Tjenerens sertifikat er utløpt.</translation> +<translation id="8975012916872825179">Inkluderer informasjon som telefonnumre, e-postadresser og leveringsadresser</translation> <translation id="8978053250194585037">Google Safe Browsing <ph name="BEGIN_LINK" />oppdaget nylig nettfisking<ph name="END_LINK" /> på <ph name="SITE" />. Nettsteder for nettfisking er laget for å ligne på andre nettsteder, for å prøve å lure deg.</translation> <translation id="8983003182662520383">Betalingsmåter og adresser som bruker Google Pay</translation> <translation id="8987927404178983737">Måned</translation> @@ -1171,6 +1177,7 @@ <translation id="935608979562296692">SLETT INNHOLDET I SKJEMAET</translation> <translation id="939736085109172342">Ny mappe</translation> <translation id="951104842009476243">Godkjente debetkort og forhåndsbetalte kort</translation> +<translation id="962484866189421427">Dette innholdet kan prøve å installere villedende apper som gir seg ut for å være noe annet, eller samle inn data som kan brukes til å spore deg. <ph name="BEGIN_LINK" />Vis det likevel<ph name="END_LINK" /></translation> <translation id="969892804517981540">Offisiell delversjon</translation> <translation id="973773823069644502">Legg til leveringsadresse</translation> <translation id="975560348586398090">{COUNT,plural, =0{Ingen}=1{1 element}other{# elementer}}</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index a45af8c..608d21b 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Czy chcesz zapisać tę kartę na swoim koncie Google i na tym urządzeniu?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Wygasa: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Zablokowano szkodliwe treści.</translation> <translation id="382518646247711829">Jeśli używasz serwera proxy...</translation> <translation id="3828924085048779000">Puste hasło jest niedozwolone.</translation> <translation id="385051799172605136">Wstecz</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Czynności</translation> <translation id="4958444002117714549">Rozwiń listę</translation> <translation id="4974590756084640048">Ponownie włącz ostrzeżenia</translation> +<translation id="4988217478422488391">Przyspiesza płatności online</translation> <translation id="4989809363548539747">Ta wtyczka nie jest obsługiwana</translation> <translation id="5002932099480077015">Jeśli włączysz tę opcję, Chrome zapisze kopię Twojej karty na tym urządzeniu, by umożliwić Ci szybsze wypełnianie formularzy.</translation> <translation id="5018422839182700155">Nie można otworzyć tej strony</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Ponów edycję</translation> <translation id="5481076368049295676">Te treści mogą próbować instalować na Twoim urządzeniu niebezpieczne oprogramowanie, które wykrada lub usuwa dane. <ph name="BEGIN_LINK" />Wyświetl mimo to<ph name="END_LINK" /></translation> <translation id="54817484435770891">Dodaj poprawny adres</translation> +<translation id="5490432419156082418">Adresy i ustawienia</translation> <translation id="5492298309214877701">Ta witryna w intranecie firmy, organizacji czy szkoły ma ten sam URL co zewnętrzna strona internetowa. <ph name="LINE_BREAK" /> Skontaktuj się z administratorem systemu.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{W użyciu: 1}few{W użyciu: #}many{W użyciu: #}other{W użyciu: #}}</translation> <translation id="5922853866070715753">Prawie gotowe</translation> <translation id="5939518447894949180">Resetuj</translation> +<translation id="5951495562196540101">Nie można zarejestrować się przy użyciu konta klienta (dostępna jest licencja w pakiecie).</translation> <translation id="5967592137238574583">Edytuj dane kontaktowe</translation> <translation id="5967867314010545767">Usuń z historii</translation> <translation id="5975083100439434680">Pomniejsz</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Zostaniesz wylogowany z większości stron internetowych.</translation> <translation id="8437238597147034694">&Cofnij przeniesienie</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 karta kredytowa}few{# karty kredytowe}many{# kart kredytowych}other{# karty kredytowej}}</translation> +<translation id="8473863474539038330">Adresy i ustawienia</translation> <translation id="8483780878231876732">Aby użyć kart z konta Google, zaloguj się w Chrome</translation> <translation id="8488350697529856933">Dotyczy</translation> <translation id="8498891568109133222">Serwer <ph name="HOST_NAME" /> potrzebował zbyt wiele czasu na odpowiedź.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Wpisz datę ważności i kod CVC karty <ph name="CREDIT_CARD" />, by zaktualizować jej szczegółowe dane. Po potwierdzeniu dane karty z konta Google Payments zostaną udostępnione tej stronie.</translation> <translation id="8957210676456822347">Autoryzacja portalu przechwytującego</translation> <translation id="8971063699422889582">Ważność certyfikatu serwera wygasła.</translation> +<translation id="8975012916872825179">Obejmuje numery telefonów, adresy e-mail i adresy dostawy</translation> <translation id="8978053250194585037">Bezpieczne przeglądanie Google <ph name="BEGIN_LINK" />wykryło ostatnio próbę wyłudzenia informacji<ph name="END_LINK" /> na stronie <ph name="SITE" />. Strony wyłudzające informacje udają inne strony, by Cię oszukać.</translation> <translation id="8983003182662520383">Formy płatności i adresy z Google Pay</translation> <translation id="8987927404178983737">Miesiąc</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">WYCZYŚĆ FORMULARZ</translation> <translation id="939736085109172342">Nowy folder</translation> <translation id="951104842009476243">Akceptowane karty debetowe i przedpłacone</translation> +<translation id="962484866189421427">Te treści mogą próbować zainstalować wprowadzające w błąd aplikacje, które udają, że są przeznaczone do czegoś innego niż w rzeczywistości, lub zbierają dane, na podstawie których można Cię śledzić. <ph name="BEGIN_LINK" />Pokaż mimo to<ph name="END_LINK" /></translation> <translation id="969892804517981540">Oficjalna wersja</translation> <translation id="973773823069644502">Dodaj adres dostawy</translation> <translation id="975560348586398090">{COUNT,plural, =0{Brak}=1{1 element}few{# elementy}many{# elementów}other{# elementu}}</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index c7305686..92e0adb 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Quer salvar este cartão na sua Conta do Google e neste dispositivo?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Validade: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Conteúdo nocivo bloqueado.</translation> <translation id="382518646247711829">Se você usa um servidor proxy...</translation> <translation id="3828924085048779000">Uma senha vazia não é permitida.</translation> <translation id="385051799172605136">Voltar</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Ações</translation> <translation id="4958444002117714549">Expandir lista</translation> <translation id="4974590756084640048">Reativar avisos</translation> +<translation id="4988217478422488391">Agiliza os pagamentos on-line</translation> <translation id="4989809363548539747">Este plug-in não é compatível</translation> <translation id="5002932099480077015">Se ativado, o Chrome armazenará uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> <translation id="5018422839182700155">Não é possível abrir essa página</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Refazer editar</translation> <translation id="5481076368049295676">Este conteúdo pode tentar instalar softwares perigosos no seu dispositivo que roubam ou excluem suas informações. <ph name="BEGIN_LINK" />Mostrar mesmo assim<ph name="END_LINK" /></translation> <translation id="54817484435770891">Adicionar endereço válido</translation> +<translation id="5490432419156082418">Endereços e Mais</translation> <translation id="5492298309214877701">Esse site na intranet da empresa, organização ou escola tem o mesmo URL de um website externo. <ph name="LINE_BREAK" /> Tente entrar em contato com o administrador do sistema.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 em uso}one{# em uso}other{# em uso}}</translation> <translation id="5922853866070715753">Quase pronto</translation> <translation id="5939518447894949180">Redefinir</translation> +<translation id="5951495562196540101">Não é possível fazer a inscrição com a conta pessoal (pacote de licença disponível).</translation> <translation id="5967592137238574583">Edite as Informações de Contato</translation> <translation id="5967867314010545767">Remover do histórico</translation> <translation id="5975083100439434680">Diminuir zoom</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Essa opção desconecta você da maioria dos websites.</translation> <translation id="8437238597147034694">&Desfazer mover</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 cartão de crédito}one{# cartão de crédito}other{# cartões de crédito}}</translation> +<translation id="8473863474539038330">Endereços e mais</translation> <translation id="8483780878231876732">Para usar os cards da sua Conta do Google, faça login no Google Chrome</translation> <translation id="8488350697529856933">Aplicável a</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> demorou muito para responder.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Informe a data de validade e o CVC do <ph name="CREDIT_CARD" /> para atualizar os detalhes do cartão. Depois da confirmação, os detalhes do cartão da sua conta do Google Payments serão compartilhados com esse site.</translation> <translation id="8957210676456822347">Autorização de portal cativo</translation> <translation id="8971063699422889582">O certificado do servidor expirou.</translation> +<translation id="8975012916872825179">Inclui informações como números de telefone, endereços de e-mail e endereços de entrega</translation> <translation id="8978053250194585037">Recentemente, o recurso "Navegação segura" do Google <ph name="BEGIN_LINK" />detectou phishing<ph name="END_LINK" /> em <ph name="SITE" />. Os sites de phishing fingem ser outros sites para enganar você.</translation> <translation id="8983003182662520383">Formas de pagamento e endereços que usam o Google Pay</translation> <translation id="8987927404178983737">Mês</translation> @@ -1174,6 +1180,7 @@ <translation id="935608979562296692">LIMPAR FORMULÁRIO</translation> <translation id="939736085109172342">Nova pasta</translation> <translation id="951104842009476243">Cartões de débito e pré-pagos aceitos</translation> +<translation id="962484866189421427">Este conteúdo pode tentar instalar apps enganosos que fingem ser outra coisa ou coletam dados que podem ser usados para rastrear você. <ph name="BEGIN_LINK" />Mostrar mesmo assim<ph name="END_LINK" /></translation> <translation id="969892804517981540">Versão oficial</translation> <translation id="973773823069644502">Adicionar endereço de entrega</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nenhum}=1{1 item}one{# item}other{# itens}}</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index bb5b2e7..1e33f6a4 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Pretende guardar este cartão na sua Conta Google e neste dispositivo?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expira a <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Conteúdo prejudicial bloqueado.</translation> <translation id="382518646247711829">Se utilizar um servidor de proxy...</translation> <translation id="3828924085048779000">Não é permitida uma frase de acesso vazia.</translation> <translation id="385051799172605136">Anterior</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Ações</translation> <translation id="4958444002117714549">Expandir lista</translation> <translation id="4974590756084640048">Reativar avisos</translation> +<translation id="4988217478422488391">Permite pagar itens online mais depressa</translation> <translation id="4989809363548539747">Este plug-in não é compatível</translation> <translation id="5002932099480077015">Quando esta opção está ativada, o Chrome armazena uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> <translation id="5018422839182700155">Não é possível abrir esta página</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Refazer edição</translation> <translation id="5481076368049295676">Este conteúdo pode tentar instalar software perigoso no dispositivo que rouba ou elimina as suas informações. <ph name="BEGIN_LINK" />Mostrar mesmo assim<ph name="END_LINK" /></translation> <translation id="54817484435770891">Adicionar endereço válido</translation> +<translation id="5490432419156082418">Endereços e Mais</translation> <translation id="5492298309214877701">Este site na intranet da empresa, da entidade ou da escola tem o mesmo URL que um Website externo. <ph name="LINE_BREAK" /> Experimente contactar o gestor do sistema.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 em utilização}other{# em utilização}}</translation> <translation id="5922853866070715753">Estamos quase a terminar</translation> <translation id="5939518447894949180">Repor</translation> +<translation id="5951495562196540101">Não é possível inscrever com conta de consumidor (licença em pacote disponível).</translation> <translation id="5967592137238574583">Editar informações de contacto</translation> <translation id="5967867314010545767">Remover do histórico</translation> <translation id="5975083100439434680">Reduzir</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Sites.</translation> <translation id="8437238597147034694">&Anular movimentação</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 cartão de crédito}other{# cartões de crédito}}</translation> +<translation id="8473863474539038330">Endereços e mais</translation> <translation id="8483780878231876732">Para utilizar cartões da sua Conta Google, inicie sessão no Chrome.</translation> <translation id="8488350697529856933">Aplica-se a</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> demorou demasiado tempo a responder.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Introduza a data de validade e o Código de Segurança/CVC de <ph name="CREDIT_CARD" /> para atualizar os detalhes do cartão. Depois de confirmar, os detalhes do cartão da conta do Google Payments são partilhados com este site.</translation> <translation id="8957210676456822347">Autorização de portal cativo</translation> <translation id="8971063699422889582">O certificado do servidor expirou.</translation> +<translation id="8975012916872825179">Inclui informações como números de telefone, endereços de email e moradas para envio</translation> <translation id="8978053250194585037">A Navegação segura do Google <ph name="BEGIN_LINK" />detetou phishing<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os sites de phishing simulam ser outros Websites para o enganar.</translation> <translation id="8983003182662520383">Métodos de pagamento e endereços com o Google Pay</translation> <translation id="8987927404178983737">Mês</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">LIMPAR FORMULÁRIO</translation> <translation id="939736085109172342">Nova pasta</translation> <translation id="951104842009476243">Cartões de débito e pré-pagos aceites</translation> +<translation id="962484866189421427">Este conteúdo poderá tentar instalar aplicações fraudulentas que se fazem passar por algo diferente ou que recolhem dados que podem ser utilizados para o monitorizar. <ph name="BEGIN_LINK" />Mostrar, mesmo assim<ph name="END_LINK" /></translation> <translation id="969892804517981540">Compilação oficial</translation> <translation id="973773823069644502">Adicionar endereço de entrega</translation> <translation id="975560348586398090">{COUNT,plural, =0{Nenhum}=1{1 item}other{# itens}}</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 94c2bfc..36fbb3b 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Dorești să salvezi acest card în Contul Google și pe acest dispozitiv?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expiră în <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Conținutul dăunător a fost blocat.</translation> <translation id="382518646247711829">Dacă utilizați un server proxy...</translation> <translation id="3828924085048779000">Trebuie să fie introdusă expresia de acces.</translation> <translation id="385051799172605136">Înapoi</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Acțiuni</translation> <translation id="4958444002117714549">Extindeți lista</translation> <translation id="4974590756084640048">Reactivează avertismentele</translation> +<translation id="4988217478422488391">Te ajută să plătești mai rapid online</translation> <translation id="4989809363548539747">Acest plugin nu este acceptat</translation> <translation id="5002932099480077015">Dacă este activată, Chrome va stoca o copie a cardului pe acest dispozitiv, pentru completarea mai rapidă a formularelor.</translation> <translation id="5018422839182700155">Pagina nu poate fi deschisă</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Repetați editarea</translation> <translation id="5481076368049295676">Acest conținut ar putea încerca să instaleze software periculos pe dispozitivul tău, care îți fură sau îți șterge informațiile. <ph name="BEGIN_LINK" />Afișează oricum<ph name="END_LINK" /></translation> <translation id="54817484435770891">Adaugă o adresă validă</translation> +<translation id="5490432419156082418">Adrese și altele</translation> <translation id="5492298309214877701">Acest site din rețeaua intranet a companiei, organizației sau școlii are aceeași adresă URL folosită de un site extern. <ph name="LINE_BREAK" /> Contactează administratorul sistemului.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 în uz}few{# în uz}other{# în uz}}</translation> <translation id="5922853866070715753">Aproape finalizat</translation> <translation id="5939518447894949180">Resetează</translation> +<translation id="5951495562196540101">Nu te poți înscrie cu contul de consumator (este disponibilă o licență din pachet).</translation> <translation id="5967592137238574583">Editează informațiile de contact</translation> <translation id="5967867314010545767">Eliminați din istoric</translation> <translation id="5975083100439434680">Micșorează</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Astfel, te vei deconecta de pe majoritatea site-urilor.</translation> <translation id="8437238597147034694">&Anulați mutarea</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 card de credit}few{# carduri de credit}other{# de carduri de credit}}</translation> +<translation id="8473863474539038330">Adrese și altele</translation> <translation id="8483780878231876732">Pentru a folosi cardurile din Contul Google, conectează-te la Chrome</translation> <translation id="8488350697529856933">Se aplică pentru</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> a răspuns prea târziu.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Introdu data de expirare și codul CVC pentru <ph name="CREDIT_CARD" />, pentru a actualiza detaliile cardului. După ce confirmi, acest site va avea acces la detaliile cardului tău din contul Google Payments.</translation> <translation id="8957210676456822347">Autorizarea prin portalul captiv</translation> <translation id="8971063699422889582">Certificatul serverului a expirat.</translation> +<translation id="8975012916872825179">Include informații precum numerele de telefon, adresele de e-mail și adresele de expediere</translation> <translation id="8978053250194585037">Recent, Navigarea sigură Google <ph name="BEGIN_LINK" />a detectat phishing<ph name="END_LINK" /> pe <ph name="SITE" />. Site-urile de phishing falsifică alte site-uri, pentru a te înșela.</translation> <translation id="8983003182662520383">Metodele de plată și adresele care folosesc Google Pay</translation> <translation id="8987927404178983737">Lună</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">GOLEȘTE FORMULARUL</translation> <translation id="939736085109172342">Dosar nou</translation> <translation id="951104842009476243">Carduri de debit și preplătite acceptate</translation> +<translation id="962484866189421427">Acest conținut poate încerca să instaleze aplicații înșelătoare care pretind a fi altceva sau culeg date care pot fi folosite pentru a te urmări. <ph name="BEGIN_LINK" />Afișează oricum<ph name="END_LINK" /></translation> <translation id="969892804517981540">Versiune oficială</translation> <translation id="973773823069644502">Adaugă o adresă de livrare</translation> <translation id="975560348586398090">{COUNT,plural, =0{Niciunul}=1{1 element}few{# elemente}other{# de elemente}}</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 050d476..a25a54f 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -421,6 +421,7 @@ <translation id="3778403066972421603">Хотите сохранить карту в аккаунте Google и на этом устройстве?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Срок действия: до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Опасный контент заблокирован</translation> <translation id="382518646247711829">Если вы используете прокси-сервер...</translation> <translation id="3828924085048779000">Пустые кодовые фразы запрещены.</translation> <translation id="385051799172605136">Назад</translation> @@ -577,6 +578,7 @@ <translation id="495170559598752135">Действия</translation> <translation id="4958444002117714549">Развернуть список</translation> <translation id="4974590756084640048">Снова включить предупреждения</translation> +<translation id="4988217478422488391">Вы сможете быстрее оплачивать покупки онлайн.</translation> <translation id="4989809363548539747">Плагин не поддерживается</translation> <translation id="5002932099480077015">Chrome будет хранить на этом устройстве данные карты для быстрого заполнения форм.</translation> <translation id="5018422839182700155">Не удалось открыть страницу</translation> @@ -656,6 +658,7 @@ <translation id="5470861586879999274">&Повторить изменения</translation> <translation id="5481076368049295676">Посещение этой страницы может привести к установке вредоносной программы, которая похищает или удаляет данные. <ph name="BEGIN_LINK" />Все равно продолжить<ph name="END_LINK" /></translation> <translation id="54817484435770891">Введите действительный адрес</translation> +<translation id="5490432419156082418">Адреса и другая информация</translation> <translation id="5492298309214877701">Этот сайт в интранете организации или учебного заведения имеет тот же URL, что и сайт в Интернете. <ph name="LINE_BREAK" /> Обратитесь к системному администратору.</translation> @@ -719,6 +722,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Используется 1 файл cookie}one{Используется # файл cookie}few{Используется # файла cookie}many{Используется # файлов cookie}other{Используется # файла cookie}}</translation> <translation id="5922853866070715753">Почти готово…</translation> <translation id="5939518447894949180">Сбросить</translation> +<translation id="5951495562196540101">Регистрация невозможна, так как тип аккаунта не соответствует лицензии на устройстве.</translation> <translation id="5967592137238574583">Измените контактную информацию</translation> <translation id="5967867314010545767">Удалить из истории</translation> <translation id="5975083100439434680">Уменьшить</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">На большинстве сайтов будет выполнен выход из аккаунта.</translation> <translation id="8437238597147034694">&Отменить перемещение</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 банковская карта}one{# банковская карта}few{# банковские карты}many{# банковских карт}other{# банковской карты}}</translation> +<translation id="8473863474539038330">Адреса и другая информация</translation> <translation id="8483780878231876732">Чтобы использовать карты, привязанные к аккаунту Google Account, войдите в Chrome</translation> <translation id="8488350697529856933">Объект применения</translation> <translation id="8498891568109133222">Превышено время ожидания ответа от сайта <ph name="HOST_NAME" />.</translation> @@ -1123,6 +1128,7 @@ <translation id="8952525071319348207">Введите срок окончания действия и CVC-код карты <ph name="CREDIT_CARD" />. После этого ее реквизиты из платежного аккаунта Google будут переданы сайту.</translation> <translation id="8957210676456822347">Авторизация через адаптивный портал</translation> <translation id="8971063699422889582">Сертификат сервера устарел.</translation> +<translation id="8975012916872825179">В том числе телефонные номера, адреса электронной почты и адреса доставки.</translation> <translation id="8978053250194585037">Функция "Google Безопасный просмотр" недавно <ph name="BEGIN_LINK" />обнаружила попытку фишинга<ph name="END_LINK" /> на сайте <ph name="SITE" />. Будьте внимательны! Мошенники часто создают веб-страницы, похожие на знакомые вам сайты.</translation> <translation id="8983003182662520383">Способы оплаты и адреса из Google Pay</translation> <translation id="8987927404178983737">Месяц</translation> @@ -1171,6 +1177,7 @@ <translation id="935608979562296692">ОЧИСТИТЬ ФОРМУ</translation> <translation id="939736085109172342">Новая папка</translation> <translation id="951104842009476243">Дебетовые карты и карты предоплаты, которые принимаются к оплате</translation> +<translation id="962484866189421427">Переход на эту страницу может привести к установке вредоносных приложений, маскирующихся под безопасные программы или собирающих данные, по которым вас можно отследить. <ph name="BEGIN_LINK" />Все равно продолжить<ph name="END_LINK" /></translation> <translation id="969892804517981540">Официальная сборка</translation> <translation id="973773823069644502">Добавить адрес доставки</translation> <translation id="975560348586398090">{COUNT,plural, =0{Нет}=1{1 запись}one{# запись}few{# записи}many{# записей}other{# записи}}</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 1d1e362..749580c 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -418,6 +418,7 @@ <translation id="3778403066972421603">Chcete uložiť túto kartu do svojho účtu Google a tohto zariadenia?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Platnosť vyprší <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Škodlivý obsah bol zablokovaný.</translation> <translation id="382518646247711829">Ak používate server proxy...</translation> <translation id="3828924085048779000">Prístupová fráza nemôže byť prázdna.</translation> <translation id="385051799172605136">Naspäť</translation> @@ -574,6 +575,7 @@ <translation id="495170559598752135">Akcie</translation> <translation id="4958444002117714549">Rozbaliť zoznam</translation> <translation id="4974590756084640048">Opätovne aktivovať upozornenia</translation> +<translation id="4988217478422488391">Urýchľuje online platby</translation> <translation id="4989809363548539747">Tento doplnok nie je podporovaný</translation> <translation id="5002932099480077015">Ak túto možnosť povolíte, Chrome bude uchovávať kópiu vašej karty na tomto zariadení na účely rýchlejšieho dopĺňania formulárov.</translation> <translation id="5018422839182700155">Táto stránka sa nedá otvoriť</translation> @@ -653,6 +655,7 @@ <translation id="5470861586879999274">&Znova upraviť</translation> <translation id="5481076368049295676">Tento obsah sa môže pokúsiť nainštalovať v zariadení nebezpečný softvér, ktorý ukradne alebo odstráni vaše informácie. <ph name="BEGIN_LINK" />Napriek tomu zobraziť<ph name="END_LINK" /></translation> <translation id="54817484435770891">Pridanie platnej adresy</translation> +<translation id="5490432419156082418">Adresy a ďalšie údaje</translation> <translation id="5492298309214877701">Tento web v intranete danej spoločnosti, organizácie či školy má rovnakú webovú adresu ako externý web. <ph name="LINE_BREAK" /> Skúste kontaktovať správcu systému.</translation> @@ -716,6 +719,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Používa sa 1}few{Používajú sa #}many{Používa sa #}other{Používa sa #}}</translation> <translation id="5922853866070715753">Takmer dokončené</translation> <translation id="5939518447894949180">Resetovať</translation> +<translation id="5951495562196540101">Nemôžete sa zaregistrovať spotrebiteľským účtom (k dispozícii je licencia v balíčku).</translation> <translation id="5967592137238574583">Úprava kontaktných informácií</translation> <translation id="5967867314010545767">Odstrániť z histórie</translation> <translation id="5975083100439434680">Oddialiť</translation> @@ -1060,6 +1064,7 @@ <translation id="8433057134996913067">Táto možnosť vás odhlási z väčšiny webov.</translation> <translation id="8437238597147034694">&Vrátiť späť presunutie</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kreditná karta}few{# kreditné karty}many{# kreditnej karty}other{# kreditných kariet}}</translation> +<translation id="8473863474539038330">Adresy a ďalšie údaje</translation> <translation id="8483780878231876732">Ak chcete používať karty z účtu Google, prihláste sa do Chromu</translation> <translation id="8488350697529856933">Platí pre</translation> <translation id="8498891568109133222">Web <ph name="HOST_NAME" /> príliš dlho neodpovedal.</translation> @@ -1120,6 +1125,7 @@ <translation id="8952525071319348207">Ak chcete aktualizovať podrobnosti o karte <ph name="CREDIT_CARD" />, zadajte dátum vypršania platnosti a kód CVC. Po potvrdení sa budú podrobnosti z účtu Google Payments zdieľať s týmto webom.</translation> <translation id="8957210676456822347">Autorizácia portálu na prihlásenie do siete</translation> <translation id="8971063699422889582">Platnosť certifikátu servera vypršala.</translation> +<translation id="8975012916872825179">Zahŕňa informácie, ako sú napríklad telefónne čísla, e‑maily a dodacie adresy</translation> <translation id="8978053250194585037">Funkcia Bezpečné prehliadanie Google nedávno <ph name="BEGIN_LINK" />zistila phishing<ph name="END_LINK" /> na webe <ph name="SITE" />. Phishingové stránky sa vydávajú za iné weby, aby vás oklamali.</translation> <translation id="8983003182662520383">Spôsoby platby a adresy pomocou Google Pay</translation> <translation id="8987927404178983737">Mesiac</translation> @@ -1168,6 +1174,7 @@ <translation id="935608979562296692">VYMAZAŤ FORMULÁR</translation> <translation id="939736085109172342">Nový priečinok</translation> <translation id="951104842009476243">Akceptované debetné a predplatené karty</translation> +<translation id="962484866189421427">Tento obsah sa môže pokúsiť nainštalovať klamlivé aplikácie vydávajúce sa za iné aplikácie alebo zhromažďovať údaje, ktoré sa dajú použiť na sledovanie vašej osoby. <ph name="BEGIN_LINK" />Napriek tomu zobraziť<ph name="END_LINK" /></translation> <translation id="969892804517981540">oficiálna zostava</translation> <translation id="973773823069644502">Pridať adresu doručenia</translation> <translation id="975560348586398090">{COUNT,plural, =0{Žiadne}=1{1 položka}few{# položky}many{# položky}other{# položiek}}</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 94d6de82..ef3bd838 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Да ли желите да сачувате ову картицу на Google налогу и на овом уређају?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Истиче <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Блокиран је штетан садржај.</translation> <translation id="382518646247711829">Ако користите прокси сервер...</translation> <translation id="3828924085048779000">Није дозвољено да поље за приступну фразу буде празно.</translation> <translation id="385051799172605136">Назад</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Радње</translation> <translation id="4958444002117714549">Прошири листу</translation> <translation id="4974590756084640048">Поново омогући упозорења</translation> +<translation id="4988217478422488391">Омогућава брже плаћање онлајн</translation> <translation id="4989809363548539747">Ова додатна компонента није подржана</translation> <translation id="5002932099480077015">Ако је ова опција омогућена, Chrome ће складиштити копију картице на овом уређају ради бржег попуњавања образаца.</translation> <translation id="5018422839182700155">Не можемо да отворимо ову страницу</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Понови измену</translation> <translation id="5481076368049295676">Овај садржај ће покушати да инсталира опасан софтвер на уређај који ће украсти или обрисати ваше податке. <ph name="BEGIN_LINK" />Ипак прикажи<ph name="END_LINK" /></translation> <translation id="54817484435770891">Додајте важећу адресу</translation> +<translation id="5490432419156082418">Адресе и друго</translation> <translation id="5492298309214877701">Овај сајт на интранету компаније, организације или школе има исти URL као и један спољни веб-сајт. <ph name="LINE_BREAK" /> Покушајте да се обратите администратору система.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Користи се 1}one{Користи се #}few{Користе се #}other{Користи се #}}</translation> <translation id="5922853866070715753">Скоро је готово</translation> <translation id="5939518447894949180">Ресетуј</translation> +<translation id="5951495562196540101">Регистрација корисничког налога није успела (доступна је лиценца пакета).</translation> <translation id="5967592137238574583">Измените контакт информације</translation> <translation id="5967867314010545767">Уклони из историје</translation> <translation id="5975083100439434680">Умањивање</translation> @@ -1064,6 +1068,7 @@ <translation id="8433057134996913067">Овако ћете се одјавити са већине веб-сајтова.</translation> <translation id="8437238597147034694">&Опозови премештање</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 кредитна картица}one{# кредитна картица}few{# кредитне картице}other{# кредитних картица}}</translation> +<translation id="8473863474539038330">Адресе и друго</translation> <translation id="8483780878231876732">Да бисте користили картице са Google налога, пријавите се у Chrome</translation> <translation id="8488350697529856933">Односе се на</translation> <translation id="8498891568109133222">Одговор хоста <ph name="HOST_NAME" /> је трајао предуго.</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">Унесите рок трајања и CVC за картицу <ph name="CREDIT_CARD" /> да бисте ажурирали податке о картици. Када будете потврдили, подаци о картици са налога за Google плаћања ће бити послати овом сајту.</translation> <translation id="8957210676456822347">Овлашћење на улазном порталу</translation> <translation id="8971063699422889582">Сертификат сервера је истекао.</translation> +<translation id="8975012916872825179">Обухвата информације попут бројева телефона, имејл адреса и адреса за испоруку</translation> <translation id="8978053250194585037">Google безбедно прегледање је недавно <ph name="BEGIN_LINK" />открило „пецање“<ph name="END_LINK" /> на <ph name="SITE" />. Сајтови са „пецањем“ се представљају као неки други веб-сајтови да би вас преварили.</translation> <translation id="8983003182662520383">Начини плаћања и адресе из Google Pay-а</translation> <translation id="8987927404178983737">Месец</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">ОБРИШИ ОБРАЗАЦ</translation> <translation id="939736085109172342">Нови директоријум</translation> <translation id="951104842009476243">Дебитне и припејд картице које се прихватају</translation> +<translation id="962484866189421427">Овај садржај можда покушава да инсталира обмањујуће апликације које се претварају да су нешто друго или да прикупљају податке који могу да се користе за праћење. <ph name="BEGIN_LINK" />Прикажи<ph name="END_LINK" /></translation> <translation id="969892804517981540">Званична верзија</translation> <translation id="973773823069644502">Додај адресу за доставу</translation> <translation id="975560348586398090">{COUNT,plural, =0{None}=1{1 ставка}one{# ставка}few{# ставке}other{# ставки}}</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index bce7151..6bba468 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Vill du spara det här kortet i Google-kontot och på den här enheten?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Utgångsdatum: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Skadligt innehåll har blockerats.</translation> <translation id="382518646247711829">Om du använder en proxyserver ...</translation> <translation id="3828924085048779000">Lösenfrasen får inte vara tom.</translation> <translation id="385051799172605136">Bakåt</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Åtgärder</translation> <translation id="4958444002117714549">Expandera lista</translation> <translation id="4974590756084640048">Aktivera varningar igen</translation> +<translation id="4988217478422488391">Det blir snabbare att göra betalningar online</translation> <translation id="4989809363548539747">Det här pluginprogrammet stöds inte</translation> <translation id="5002932099480077015">Om alternativet är aktiverat sparar Chrome en kopia av kortet på enheten så att det går snabbare att fylla i formulär.</translation> <translation id="5018422839182700155">Det går inte att öppna den här sidan</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Gör om Redigera</translation> <translation id="5481076368049295676">Sidan kan ha till syfte att installera farlig programvara som stjäl eller raderar information på enheten. <ph name="BEGIN_LINK" />Visa ändå<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Lägg till giltig adress</translation> +<translation id="5490432419156082418">Adresser och annat</translation> <translation id="5492298309214877701">Webbplatsen på företagets, organisationens eller skolans intranät har samma webbadress som en extern webbplats. <ph name="LINE_BREAK" /> Testa med att kontakta systemadministratören.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 används}other{# används}}</translation> <translation id="5922853866070715753">Nästan klart</translation> <translation id="5939518447894949180">Återställ</translation> +<translation id="5951495562196540101">Det går inte att registrera enheten med ett konsumentkonto (paketerad licens är tillgänglig).</translation> <translation id="5967592137238574583">Redigera kontaktuppgifter</translation> <translation id="5967867314010545767">Ta bort från historiken</translation> <translation id="5975083100439434680">Zooma ut</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Alternativet innebär att du loggas ut från de flesta webbplatser.</translation> <translation id="8437238597147034694">&Ångra Flytta</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kreditkort}other{# kreditkort}}</translation> +<translation id="8473863474539038330">Adresser och annat</translation> <translation id="8483780878231876732">Logga in i Chrome om du vill använda kort i Google-kontot</translation> <translation id="8488350697529856933">Gäller för</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> tog för lång tid på sig att svara.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Uppdatera kortinformationen genom att ange utgångsdatumet och CVC-koden för <ph name="CREDIT_CARD" />. När du bekräftar delas kortuppgifter från Google Payments-konto med webbplatsen.</translation> <translation id="8957210676456822347">Auktorisering av infångstportal</translation> <translation id="8971063699422889582">Servercertifikatet har gått ut.</translation> +<translation id="8975012916872825179">Gäller uppgifter som telefonnummer, e-postadresser och leveransadresser</translation> <translation id="8978053250194585037"><ph name="BEGIN_LINK" />Nätfiske<ph name="END_LINK" /> upptäcktes nyligen av Google Säker webbsökning på <ph name="SITE" />. Webbplatser som används för nätfiske imiterar andra webbplatser i syfte att lura dig.</translation> <translation id="8983003182662520383">Betalningsmetoder och adresser som används med Google Pay</translation> <translation id="8987927404178983737">Månad</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">RENSA FORMULÄRET</translation> <translation id="939736085109172342">Ny mapp</translation> <translation id="951104842009476243">Godkända bankkort och förbetalda kort</translation> +<translation id="962484866189421427">Bedrägliga appar som inte gör vad de påstås göra eller insamling av data som används för att spåra dig skulle kunna installeras via innehållet. <ph name="BEGIN_LINK" />Visa ändå<ph name="END_LINK" /></translation> <translation id="969892804517981540">Officiell version</translation> <translation id="973773823069644502">Lägg till leveransadress</translation> <translation id="975560348586398090">{COUNT,plural, =0{Ingen}=1{1 objekt}other{# objekt}}</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index e3255ba..e94452d 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Je, ungependa kuhifadhi kadi hii kwenye Akaunti yako ya Google na kwenye kifaa hiki?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Muda wa matumizi utakwisha <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Imezuia maudhui hatari.</translation> <translation id="382518646247711829">Ukitumia seva mbadala...</translation> <translation id="3828924085048779000">Kaulisiri tupu hairuhusiwi.</translation> <translation id="385051799172605136">Nyuma</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Vitendo</translation> <translation id="4958444002117714549">Panua orodha</translation> <translation id="4974590756084640048">Onyesha maonyo tena</translation> +<translation id="4988217478422488391">Huharakisha mchakato wa kulipia bidhaa mtandoani</translation> <translation id="4989809363548539747">Programu-jalizi hii haitumiki</translation> <translation id="5002932099480077015">Ikiwashwa, Chrome itahifadhi nakala ya kadi yako kwenye kifaa hiki kwa ajili ya kujaza fomu haraka zaidi.</translation> <translation id="5018422839182700155">Ukurasa huu haufunguki</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">Rudia kuhariri</translation> <translation id="5481076368049295676">Huenda maudhui haya yakajaribu kusakinisha programu hatari inayoiba au kufuta maelezo yaliyo kwenye kifaa chako. <ph name="BEGIN_LINK" />Onyesha tu<ph name="END_LINK" /></translation> <translation id="54817484435770891">Ongeza anwani sahihi ya barua pepe</translation> +<translation id="5490432419156082418">Anwani na Zaidi</translation> <translation id="5492298309214877701">Tovuti hii kwenye intraneti ya kampuni, shirika au shule ina URL sawa na tovuti ya nje. <ph name="LINE_BREAK" /> Jaribu kuwasiliana na msimamizi wa mfumo wako.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 kinatumika}other{ # vinatumika}}</translation> <translation id="5922853866070715753">Unakaribia kumaliza</translation> <translation id="5939518447894949180">Weka upya</translation> +<translation id="5951495562196540101">Huwezi kujiandikisha ukitumia akaunti ya mteja (leseni ya bidhaa iliyofungashwa inapatikana).</translation> <translation id="5967592137238574583">Badilisha Maelezo ya Mawasiliano</translation> <translation id="5967867314010545767">Ondoa kwenye historia</translation> <translation id="5975083100439434680">Fifiza</translation> @@ -1061,6 +1065,7 @@ <translation id="8433057134996913067">Kufanya hivyo kutakuondoa kwenye tovuti nyingi.</translation> <translation id="8437238597147034694">Tendua hatua</translation> <translation id="8466379296835108687">{COUNT,plural, =1{Kadi 1 ya mikopo}other{Kadi # za mikopo}}</translation> +<translation id="8473863474539038330">Anwani na zaidi</translation> <translation id="8483780878231876732">Ili utumie kadi kutoka kwenye Akaunti yako ya Google, ingia katika Chrome</translation> <translation id="8488350697529856933">Inatumika kwenye</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> imechukua muda mrefu kupakia.</translation> @@ -1121,6 +1126,7 @@ <translation id="8952525071319348207">Ili usasishe maelezo ya kadi yako, weka tarehe ya mwisho wa matumizi na CVC ya <ph name="CREDIT_CARD" />. Baada ya kuthibitisha, maelezo ya kadi kutoka akaunti yako ya malipo ya Google yatashirikiwa na tovuti hii.</translation> <translation id="8957210676456822347">Uidhinishaji wa Ukurasa wa Wavuti</translation> <translation id="8971063699422889582">Cheti cha seva kimechina.</translation> +<translation id="8975012916872825179">Hujumuisha maelezo kama nambari za simu, anwani za barua pepe na anwani za mahali bidhaa zitakapopelekwa</translation> <translation id="8978053250194585037">Mfumo wa Kuvinjari Salama kwenye Google umegundua <ph name="BEGIN_LINK" />jaribio la kuiba data ya binafsi<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi majuzi. Tovuti zanazoiba data ya binafsi huiga tovuti nyingine ili kukuhadaa.</translation> <translation id="8983003182662520383">Njia za Kulipa na Anwani Zinazotumia Google Pay</translation> <translation id="8987927404178983737">Mwezi</translation> @@ -1169,6 +1175,7 @@ <translation id="935608979562296692">FUTA FOMU</translation> <translation id="939736085109172342">Folda mpya</translation> <translation id="951104842009476243">Kadi za Malipo na za Kulipia Awali Zinazokubaliwa</translation> +<translation id="962484866189421427">Huenda maudhui haya yakajaribu kusakinisha programu za udanganyifu zinazojifanya kuwa kitu kingine au kukusanya data inayoweza kutumika kukufuatilia. <ph name="BEGIN_LINK" />Onyesha tu<ph name="END_LINK" /></translation> <translation id="969892804517981540">Muundo Rasmi</translation> <translation id="973773823069644502">Chagua Mahali Bidhaa Itakapopelekwa</translation> <translation id="975560348586398090">{COUNT,plural, =0{Hamna}=1{Kipengee 1}other{Vipengee #}}</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 3a759c3..c3b66f6 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -131,7 +131,7 @@ <translation id="17513872634828108">தாவல்களைத் திற</translation> <translation id="1753706481035618306">பக்க எண்</translation> <translation id="1763864636252898013">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழை உங்கள் சாதனத்தின் இயக்க முறைமை நம்பவில்லை. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> -<translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> +<translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> <translation id="1783075131180517613">உங்களின் ஒத்திசை சொற்றொடரைப் புதுப்பிக்கவும்.</translation> <translation id="1787142507584202372">உங்கள் தாவல்கள் இங்கே தோன்றும்</translation> <translation id="1791429645902722292">Google Smart Lock</translation> @@ -222,7 +222,7 @@ <translation id="2413528052993050574">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் திரும்பப்பெறப்பட்டிருக்கலாம். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> <translation id="2463739503403862330">நிரப்பு</translation> <translation id="2465655957518002998">டெலிவரி முறையைத் தேர்வு செய்</translation> -<translation id="2467694685043708798"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" /></translation> +<translation id="2467694685043708798"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" /></translation> <translation id="2479410451996844060">தவறான தேடல் URL.</translation> <translation id="2482878487686419369">அறிவிப்புகள்</translation> <translation id="2491120439723279231">சேவையகச் சான்றிதழில் பிழைகள் உள்ளன.</translation> @@ -282,7 +282,7 @@ <translation id="2856444702002559011"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> தளத்திலிருந்து ஹேக்கர்கள் உங்கள் தகவலை (எடுத்துக்காட்டாக, கடவுச்சொற்கள், செய்திகள் அல்லது கிரெடிட் கார்டுகள்) திருட முயற்சிக்கக்கூடும். <ph name="BEGIN_LEARN_MORE_LINK" />மேலும் அறிக<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="2881276955470682203">கார்டைச் சேமிக்கவா?</translation> <translation id="2903493209154104877">முகவரிகள்</translation> -<translation id="2909946352844186028">பிணைய மாற்றம் கண்டறியப்பட்டது.</translation> +<translation id="2909946352844186028">நெட்வொர்க் மாற்றம் கண்டறியப்பட்டது.</translation> <translation id="2916038427272391327">பிற நிரல்களை மூடவும்</translation> <translation id="2922350208395188000">சேவையகச் சான்றிதழை சோதிக்க முடியவில்லை.</translation> <translation id="2925673989565098301">டெலிவரி முறை</translation> @@ -299,7 +299,7 @@ <translation id="2985398929374701810">சரியான முகவரியை உள்ளிடவும்</translation> <translation id="2986368408720340940">இந்தப் பிக்அப் முறை இல்லை. வேறு முறையைப் பயன்படுத்திப் பார்க்கவும்.</translation> <translation id="2991174974383378012">இணையதளங்களுடன் பகிர்பவை</translation> -<translation id="2991571918955627853">இணையதளமானது HSTSஐப் பயன்படுத்துவதால், தற்போது <ph name="SITE" />ஐப் பார்க்க முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் பாதிப்புகளும் தற்காலிகமானவை என்பதால், இந்தப் பக்கம் பின்னர் சரியாகச் செயல்படக்கூடும்.</translation> +<translation id="2991571918955627853">இணையதளமானது HSTSஸைப் பயன்படுத்துவதால், தற்போது <ph name="SITE" />ஐப் பார்க்க முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் பாதிப்புகளும் தற்காலிகமானவை என்பதால், இந்தப் பக்கம் பின்னர் சரியாகச் செயல்படக்கூடும்.</translation> <translation id="3005723025932146533">சேமித்த நகலைக் காட்டு</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> இன் CVC எண்ணை உள்ளிடவும். உறுதிசெய்த பின்னர், உங்கள் கார்டு விவரங்கள் இந்தத் தளத்திற்குப் பகிரப்படும்.</translation> <translation id="3010559122411665027">பட்டியல் உள்ளீடு "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -322,7 +322,7 @@ <translation id="3167968892399408617">உங்கள் மறைநிலை தாவல்கள் அனைத்தையும் மூடிய பின், அவற்றில் நீங்கள் பார்த்த பக்கங்கள் உலாவியின் வரலாறு, குக்கீ சேமிப்பகம் அல்லது தேடல் வரலாற்றில் இருக்காது. நீங்கள் இறக்கிய எல்லா கோப்புகள் அல்லது உருவாக்கிய புத்தகக்குறிகள் அப்படியே இருக்கும்.</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3174168572213147020">தீவு</translation> -<translation id="3176929007561373547">பிராக்சி சர்வர் இயக்கத்தில் உள்ளது என்பதை உறுதிப்படுத்த உங்கள் பிராக்சி அமைப்புகளைச் சரிபார்க்கவும் அல்லது நெட்வொர்க் நிர்வாகியைத் தொடர்புகொள்ளவும். நீங்கள் பிராக்சி சர்வரைப் பயன்படுத்துகிறீர்கள் என்பதை நம்பவில்லை என்றால், பின்வருவதைச் செய்யவும்:<ph name="PLATFORM_TEXT" /></translation> +<translation id="3176929007561373547">ப்ராக்ஸி சர்வர் இயக்கத்தில் உள்ளது என்பதை உறுதிப்படுத்த உங்கள் ப்ராக்ஸி அமைப்புகளைச் சரிபார்க்கவும் அல்லது நெட்வொர்க் நிர்வாகியைத் தொடர்புகொள்ளவும். நீங்கள் ப்ராக்ஸி சர்வரைப் பயன்படுத்தலாம் என்பதில் நம்பிக்கை இல்லையென்றால், பின்வருவதைச் செய்யவும்:<ph name="PLATFORM_TEXT" /></translation> <translation id="3195213714973468956"><ph name="SERVER_NAME" /> இல் <ph name="PRINTER_NAME" /></translation> <translation id="320323717674993345">கட்டணம் செலுத்துவதை ரத்துசெய்</translation> <translation id="3207960819495026254">புக்மார்க் செய்யப்பட்டது</translation> @@ -393,7 +393,7 @@ <translation id="362276910939193118">முழு வரலாற்றையும் காண்பி</translation> <translation id="3623476034248543066">மதிப்பைக் காட்டு</translation> <translation id="3630155396527302611">இது நெட்வொர்க்கை அணுகுவதற்கு அனுமதிக்கப்பட்ட நிரலாக ஏற்கனவே பட்டியலிடப்பட்டிருந்தால், - இதைப் பட்டியலில் இருந்து அகற்றி, மீண்டும் சேர்ப்பதற்கு முயலவும்.</translation> + இதைப் பட்டியலில் இருந்து அகற்றிவிட்டு மீண்டும் சேர்த்துப் பார்க்கவும்.</translation> <translation id="3650584904733503804">சரிபார்ப்பு வெற்றி</translation> <translation id="3655670868607891010">இதை அடிக்கடி காண்கிறீர்கள் எனில், <ph name="HELP_LINK" /> ஐ முயற்சிக்கவும்.</translation> <translation id="3658742229777143148">மீள்திருத்தங்கள்</translation> @@ -401,7 +401,7 @@ <translation id="3678529606614285348">புதிய மறைநிலைச் சாளரத்தில் பக்கத்தைத் திறக்கவும் (Ctrl-Shift-N)</translation> <translation id="3679803492151881375"><ph name="CRASH_TIME" /> அன்று சிதைவு அறிக்கை பதிவுசெய்யப்பட்டு, <ph name="UPLOAD_TIME" /> அன்று பதிவேற்றப்பட்டது</translation> <translation id="3681007416295224113">சான்றிதழ் தகவல்</translation> -<translation id="3704162925118123524">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க், அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்க வேண்டலாம்.</translation> +<translation id="3704162925118123524">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க், அதன் உள்நுழைவுப் பக்கத்தை நீங்கள் பார்க்கக் கோரலாம்.</translation> <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">ஏற்றுகிறது…</translation> <translation id="3712624925041724820">உரிமம் முடிந்தது</translation> @@ -411,7 +411,7 @@ <translation id="372429172604983730">வைரஸ்தடுப்பு, ஃபயர்வால், இணைய வடிப்பான் அல்லது ப்ராக்ஸி மென்பொருள் உள்ளிட்ட பயன்பாடுகள் இந்தப் பிழையை ஏற்படுத்தக்கூடும்.</translation> <translation id="3736520371357197498">உங்கள் பாதுகாப்பிற்கான ஆபத்தைப் புரிந்துகொண்டால், தீங்கிழைக்கும் நிரல்கள் அகற்றப்படுவதற்கு முன் <ph name="BEGIN_LINK" />இந்தப் பாதுகாப்பற்ற தளத்தைப் பார்வையிடலாம்<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">நீங்கள் நகலெடுத்த இணைப்பு</translation> -<translation id="3744899669254331632">இணையதளம் Chromium ஆல் செயல்படுத்த முடியாத தவறான நற்சான்றுகளை அனுப்பியுள்ளதால், இப்போது <ph name="SITE" />ஐப் பார்வையிட முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமாகவே இருக்கும், சிறிதுநேரம் கழித்து இந்தப் பக்கம் சரியாகச் செயல்படலாம்.</translation> +<translation id="3744899669254331632">Chromiumமால் செயல்படுத்த முடியாத தவறான அனுமதிச் சான்றுகளை அனுப்பியுள்ளதால் இப்போது <ph name="SITE" />ஐப் பார்வையிட முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமாகவே இருக்கும், சிறிதுநேரம் கழித்து இந்தப் பக்கம் சரியாகச் செயல்படலாம்.</translation> <translation id="3748148204939282805"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> தளத்திலுள்ள ஹேக்கர்கள் மென்பொருளை நிறுவுவது அல்லது உங்கள் தனிப்பட்ட தகவலை (எடுத்துக்காட்டாக, கடவுச்சொற்கள், ஃபோன் எண்கள் அல்லது கிரெடிட் கார்டுகள்) திருடுவது போன்ற ஆபத்தான காரணங்களில் ஈடுபடக்கூடும். <ph name="BEGIN_LEARN_MORE_LINK" />மேலும் அறிக<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="375403751935624634">ஒரு சேவையகப் பிழையின் காரணமாக மொழிபெயர்ப்புத் தோல்வியடைந்தது.</translation> <translation id="3759461132968374835">உங்களிடம் சமீபத்தில் செயலிழப்புகள் எதுவும் புகாரளிக்கப்படவில்லை. செயலிழப்பு புகாரளித்தல் முடக்கப்பட்டிருந்தபோது ஏற்பட்ட செயலிழப்புகள் இங்கு காண்பிக்கப்படாது.</translation> @@ -419,6 +419,7 @@ <translation id="3778403066972421603">கார்டை உங்கள் Google கணக்கிலும் இந்தச் சாதனத்திலும் சேமிக்க விரும்புகிறீர்களா?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">காலாவதி: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">தீங்கிழைக்கும் உள்ளடக்கம் தடுக்கப்பட்டது.</translation> <translation id="382518646247711829">நீங்கள் பிராக்சி சர்வரைப் பயன்படுத்தினால்....</translation> <translation id="3828924085048779000">வெற்று கடவுச்சொற்றொடருக்கு அனுமதியில்லை.</translation> <translation id="385051799172605136">முந்தைய பக்கம்</translation> @@ -485,7 +486,7 @@ <p>பக்கத்தைப் பயன்படுத்திய பிறகு, மறக்காமல் உங்கள் வைரஸ்தடுப்பு மென்பொருளை மீண்டும் இயக்கவும்.</p> <h4>படி 5: கூடுதல் உதவி பெறுங்கள்</h4> <p>அப்போதும் பிழை வந்தால், இணையதள உரிமையாளரைத் தொடர்புகொள்ளவும்.</p></translation> -<translation id="4226937834893929579"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> +<translation id="4226937834893929579"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> <translation id="4235360514405112390">செல்லுபடியானது</translation> <translation id="4250431568374086873">இந்தத் தளத்திற்கான உங்கள் இணைப்பு, முழுப் பாதுகாப்புடன் இல்லை</translation> <translation id="4250680216510889253">இல்லை</translation> @@ -537,7 +538,7 @@ <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation> <translation id="4708268264240856090">உங்கள் இணைப்பில் தடங்கல் ஏற்பட்டது</translation> <translation id="471880041731876836">இந்தத் தளத்தைப் பார்ப்பதற்கான அனுமதி உங்களிடம் இல்லை</translation> -<translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" /></translation> +<translation id="4722547256916164131"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" /></translation> <translation id="4726672564094551039">கொள்கைகளை மீண்டும் ஏற்று</translation> <translation id="4728558894243024398">ப்ளாட்ஃபார்ம்</translation> <translation id="4736825316280949806">Chromiumஐ மீண்டும் தொடங்கவும்</translation> @@ -553,8 +554,8 @@ <translation id="4792143361752574037">அமர்வுக் கோப்புகளை அணுகும் போது சிக்கல் ஏற்பட்டது. வட்டில் சேமிப்பது தற்போது முடக்கப்பட்டுள்ளது. மீண்டும் முயல, பக்கத்தை மீண்டும் ஏற்றவும்.</translation> <translation id="4800132727771399293">காலாவதியாகும் நேரத்தையும், CVCஐயும் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்</translation> <translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> -<translation id="4807049035289105102">இணையதளமானது Google Chrome ஆல் செயல்படுத்த முடியாத சிதைந்த நற்சான்றுகளை அனுப்பியுள்ளதால், நீங்கள் இப்போது <ph name="SITE" />க்குச் செல்ல முடியாது, பொதுவாக நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமானவையே, எனவே இந்தப் பக்கம் சிறிது நேரம் கழித்து செயல்படும்.</translation> -<translation id="4813512666221746211">பிணைய பிழை</translation> +<translation id="4807049035289105102">Google Chromeமால் செயல்படுத்த முடியாத சிதைந்த அனுமதிச் சான்றுகளை அனுப்பியுள்ளதால், நீங்கள் இப்போது <ph name="SITE" />க்குச் செல்ல முடியாது. பொதுவாக, நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமானவையே. எனவே இந்தப் பக்கம் சிறிது நேரம் கழித்து செயல்படக் கூடும்.</translation> +<translation id="4813512666221746211">நெட்வொர்க் பிழை</translation> <translation id="4816492930507672669">பக்கத்தில் பொருத்து</translation> <translation id="4850886885716139402">காட்சி</translation> <translation id="4854362297993841467">இந்த டெலிவரி முறை இல்லை. வேறு முறையைப் பயன்படுத்திப் பார்க்கவும்.</translation> @@ -575,6 +576,7 @@ <translation id="495170559598752135">செயல்கள்</translation> <translation id="4958444002117714549">பட்டியலை விரி</translation> <translation id="4974590756084640048">எச்சரிக்கைகளை மீண்டும் இயக்கு</translation> +<translation id="4988217478422488391">ஆன்லைனில் விரைவாகக் கட்டணங்களைச் செலுத்தலாம்</translation> <translation id="4989809363548539747">இந்தச் செருகுநிரல் ஆதரிக்கப்படவில்லை</translation> <translation id="5002932099480077015">இயக்கப்பட்டால், விரைவாகப் படிவத்தை நிரப்ப உங்கள் கார்டின் நகலை இச்சாதனத்தில் Chrome சேமித்து வைக்கும்.</translation> <translation id="5018422839182700155">பக்கத்தைத் திறக்க முடியவில்லை</translation> @@ -654,6 +656,7 @@ <translation id="5470861586879999274">&திருத்தலை மீண்டும் செய்</translation> <translation id="5481076368049295676">உங்கள் தகவலைத் திருடும் அல்லது நீக்கும் ஆபத்தான மென்பொருளை உங்கள் சாதனத்தில் இந்த உள்ளடக்கம் நிறுவ முயலலாம். <ph name="BEGIN_LINK" />பரவாயில்லை, காட்டு<ph name="END_LINK" /></translation> <translation id="54817484435770891">சரியான முகவரியைச் சேர்க்கவும்</translation> +<translation id="5490432419156082418">முகவரிகள் மற்றும் பல</translation> <translation id="5492298309214877701">நிறுவனம், அமைப்பு அல்லது பள்ளி அக இணையத்தில் உள்ள இந்தத் தளம் வெளிப்புற இணையதளம் ஒன்றின் அதே URLஐக் கொண்டிருக்கிறது. <ph name="LINE_BREAK" /> உங்கள் முறைமை நிர்வாகியைத் தொடர்புகொள்ள முயலவும்.</translation> @@ -717,6 +720,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{ஒரு குக்கீ பயன்படுத்தப்படுகிறது}other{# குக்கீகள் பயன்படுத்தப்படுகின்றன}}</translation> <translation id="5922853866070715753">கிட்டத்தட்ட முடிந்துவிட்டது</translation> <translation id="5939518447894949180">மீட்டமை</translation> +<translation id="5951495562196540101">நுகர்வோர் கணக்கில் பதிவுசெய்ய முடியவில்லை (தொகுக்கப்பட்ட உரிமம் உள்ளது).</translation> <translation id="5967592137238574583">தொடர்புத் தகவலைத் திருத்தவும்</translation> <translation id="5967867314010545767">வரலாற்றிலிருந்து அகற்று</translation> <translation id="5975083100439434680">சிறிதாக்கு</translation> @@ -740,7 +744,7 @@ <translation id="6080696365213338172">நிர்வாகி வழங்கிய சான்றிதழைப் பயன்படுத்தி உள்ளடக்கத்தை அணுகியுள்ளீர்கள். <ph name="DOMAIN" /> க்கு நீங்கள் வழங்கிய தரவானது உங்கள் நிர்வாகியால் இடைமறிக்கப்படலாம்.</translation> <translation id="610911394827799129"><ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற முகவரியில், உங்கள் Google கணக்கிற்கான பிற வகை உலாவல் வரலாறும் இருக்கக்கூடும்</translation> <translation id="6144381551823904650">{COUNT,plural, =0{ஏதுமில்லை}=1{1 கடவுச்சொல் (ஒத்திசைத்தது)}other{# கடவுச்சொற்கள் (ஒத்திசைத்தவை)}}</translation> -<translation id="6146055958333702838">கேபிள்களைச் சரிபார்த்து, நீங்கள் பயன்படுத்தக்கூடிய ரூட்டர்கள், மோடம்கள் அல்லது பிற நெட்வொர்க் சாதனங்களை மறுதொடக்கம் செய்யவும்.</translation> +<translation id="6146055958333702838">கேபிள்களைச் சரிபார்த்து, நீங்கள் பயன்படுத்தக்கூடிய ரூட்டர்கள், மோடம்கள் அல்லது பிற நெட்வொர்க் சாதனங்களை மறுபடி தொடங்கவும்.</translation> <translation id="614940544461990577">இவற்றைச் செய்து பார்க்கவும்:</translation> <translation id="6151417162996330722">சேவை சான்றிதழ் நீண்ட செல்லுபடிக் காலத்தைக் கொண்டுள்ளது.</translation> <translation id="6157877588268064908">ஷிப்பிங் முறைகளையும் தேவைகளையும் பார்க்க, முகவரியைத் தேர்ந்தெடுக்கவும்</translation> @@ -763,7 +767,7 @@ <translation id="6290238015253830360">நீங்கள் பரிந்துரைத்த கட்டுரைகள் இங்கே தோன்றும்</translation> <translation id="6305205051461490394"><ph name="URL" />ஐ அடையமுடியவில்லை.</translation> <translation id="6321917430147971392">உங்கள் DNS அமைப்புகளைச் சரிபார்க்கவும்</translation> -<translation id="6328639280570009161">பிணைய யூகத்தை முடக்குவதற்கு முயற்சிக்கவும்</translation> +<translation id="6328639280570009161">நெட்வொர்க் யூகத்தை முடக்க முயலவும்</translation> <translation id="6328786501058569169">இது ஏமாற்றக்கூடிய தளம்</translation> <translation id="6337133576188860026"><ph name="SIZE" />க்கும் குறைவான அளவைக் காலியாக்கும். நீங்கள் அடுத்த முறை பார்வையிடும் போது, சில தளங்கள் மிகவும் மெதுவாக ஏற்றப்படலாம்.</translation> <translation id="6337534724793800597">பெயரின்படி கொள்கைகளை வடி</translation> @@ -906,7 +910,7 @@ <translation id="7437289804838430631">தொடர்புத் தகவலைச் சேர்</translation> <translation id="7441627299479586546">தவறான கொள்கைத் தலைப்பு</translation> <translation id="7444046173054089907">இந்தத் தளம் தடுக்கப்பட்டது</translation> -<translation id="7445762425076701745">நீங்கள் இணைந்துள்ள சேவையகத்தின் அடையாளத்தை முழுமையாக சரிபார்க்க முடியவில்லை. பெயர் மட்டுமே செல்லுபடியாகும் என்ற முறையைப் பயன்படுத்தி உங்கள் பிணையத்திற்குள் சேவையகத்துடன் இணைந்துள்ளீர்கள், இதன் உரிமையை ஒரு வெளிப்புற சான்றிதழ் மையம் எப்போதும் உறுதிப்படுத்த முடியாது. சில சான்றிதழ் மையங்கள், இந்தப் பெயர்களுக்கும் சான்றிதழ்களை வழங்குவார்கள் என்பதால், நீங்கள் நினைத்த வலைப்பக்கத்துடனே இணைந்துள்ளீர்கள், ஏதேனும் மோசடி தளத்துடன் இணையவில்லை என்பதை உறுதிப்படுத்த எந்த வழியும் இல்லை.</translation> +<translation id="7445762425076701745">நீங்கள் இணைந்துள்ள சேவையகத்தின் அடையாளத்தை முழுமையாகச் சரிபார்க்க முடியவில்லை. உங்கள் நெட்வொர்க்கில் மட்டுமே செல்லுபடியாகும் பெயரைப் பயன்படுத்தி சேவையகத்துடன் இணைந்துள்ளீர்கள். இதன் உரிமையை ஒரு வெளிப்புற சான்றிதழ் மையம் உறுதிப்படுத்த முடியாது. சில சான்றிதழ் மையங்கள், இந்தப் பெயர்களுக்கும் சான்றிதழ்களை வழங்கும் என்பதால், நீங்கள் நினைத்த வலைப்பக்கத்துடனே இணைந்துள்ளீர்கள் என்பதையும் ஏதேனும் மோசடி தளத்துடன் இணையவில்லை என்பதையும் உறுதிப்படுத்த எந்த வழியும் இல்லை.</translation> <translation id="7451311239929941790">இந்தச் சிக்கல் குறித்து <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" />.</translation> <translation id="7453467225369441013">பெரும்பாலான தளங்களிலிருந்து உங்களை வெளியேற்றும். உங்கள் Google கணக்கிலிருந்து வெளியேற்றாது.</translation> <translation id="7455133967321480974">முழுமையான இயல்புநிலையைப் பயன்படுத்து (தடு)</translation> @@ -1007,10 +1011,10 @@ <translation id="8079031581361219619">தளத்தை மீண்டும் ஏற்றவா?</translation> <translation id="8088680233425245692">கட்டுரையைக் காட்டுவதில் தோல்வி.</translation> <translation id="8091372947890762290">சேவையகத்தில் செயலாக்கம் நிலுவையிலுள்ளது</translation> -<translation id="8094917007353911263">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க், அதன் <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />ஐ நீங்கள் பார்க்கக் கோரலாம்.</translation> +<translation id="8094917007353911263">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க், <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ஐ நீங்கள் பார்க்கக் கோரலாம்.</translation> <translation id="8103161714697287722">கட்டண முறை</translation> <translation id="8118489163946903409">கட்டண முறை</translation> -<translation id="8127301229239896662">உங்கள் கணினி அல்லது நெட்வொர்க்கில் "<ph name="SOFTWARE_NAME" />" மென்பொருள் சரியாக உள்ளமைக்கப்படவில்லை. இந்தச் சிக்கலைச் சரிசெய்யும்படி உங்கள் ஐடி நிர்வாகியிடம் கேட்கவும்.</translation> +<translation id="8127301229239896662">உங்கள் கம்ப்யூட்டர் அல்லது நெட்வொர்க்கில் "<ph name="SOFTWARE_NAME" />" மென்பொருள் சரியாக நிறுவப்படவில்லை. இந்தச் சிக்கலைச் சரிசெய்யும்படி உங்கள் ஐடி நிர்வாகியிடம் கேட்கவும்.</translation> <translation id="8131740175452115882">உறுதிப்படுத்து</translation> <translation id="8149426793427495338">உங்கள் கணினி உறக்கநிலைக்குச் சென்றது.</translation> <translation id="8150722005171944719"><ph name="URL" /> இல் உள்ள கோப்பு படிக்கக் கூடியதாக இல்லை. அது அகற்றப்பட்டிருக்கலாம், நகர்த்தப்பட்டிருக்கலாம் அல்லது கோப்பு அனுமதிகள் அணுகலைத் தடுத்திருக்கலாம்.</translation> @@ -1035,11 +1039,11 @@ <translation id="8267698848189296333"><ph name="USERNAME" /> ஆக உள்நுழைகிறீர்கள்</translation> <translation id="8286036467436129157">உள்நுழை</translation> <translation id="8288807391153049143">சான்றிதழைக் காட்டும்</translation> -<translation id="8289355894181816810">இதன் பொருள் உங்களுக்குத் தெரியவில்லையெனில் உங்கள் பிணைய நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> +<translation id="8289355894181816810">இதன் பொருள் உங்களுக்குத் தெரியவில்லையெனில் உங்கள் நெட்வொர்க் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="8293206222192510085">புக்மார்க்கைச் சேர்</translation> <translation id="8294431847097064396">மூலம்</translation> <translation id="8298115750975731693">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் (<ph name="WIFI_NAME" />) வைஃபை, அதன் <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />ஐ நீங்கள் பார்க்கக் கோரலாம்.</translation> -<translation id="8308427013383895095">பிணைய இணைப்பில் ஒரு சிக்கல் இருப்பதால் மொழிப்பெயர்ப்பு தோல்வியடைந்தது.</translation> +<translation id="8308427013383895095">நெட்வொர்க் இணைப்பில் ஒரு சிக்கல் இருப்பதால் மொழிபெயர்ப்பு தோல்வியடைந்தது.</translation> <translation id="8311129316111205805">அமர்வை ஏற்று</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> க்கான அணுகல் மறுக்கப்பட்டது</translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -1061,6 +1065,7 @@ <translation id="8433057134996913067">இதனால் பெரும்பாலான வலைத்தளங்களில் இருந்து வெளியேற்றப்படுவீர்கள்.</translation> <translation id="8437238597147034694">&நகர்த்தலைச் செயல்தவிர்</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 கிரெடிட் கார்டு}other{# கிரெடிட் கார்டுகள்}}</translation> +<translation id="8473863474539038330">முகவரிகள் மற்றும் பல</translation> <translation id="8483780878231876732">Google கணக்கில் உள்ள கார்டுகளைப் பயன்படுத்த, Chrome இல் உள்நுழையவும்</translation> <translation id="8488350697529856933">இதற்குப் பொருந்தும்</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> பதிலளிக்க நீண்ட நேரம் எடுத்துக்கொண்டது.</translation> @@ -1110,7 +1115,7 @@ <translation id="8866481888320382733">கொள்கை அமைப்புகளை அலசுவதில் பிழை</translation> <translation id="8870413625673593573">சமீபத்தில் மூடியவை</translation> <translation id="8874824191258364635">சரியான கார்டு எண்ணை உள்ளிடவும்</translation> -<translation id="8876793034577346603">அலசுவதில் பிணைய உள்ளமைவு தோல்வி.</translation> +<translation id="8876793034577346603">நெட்வொர்க் உள்ளமைவைப் பாகுபடுத்துவதில் தோல்வி.</translation> <translation id="8891727572606052622">தவறான ப்ராக்ஸி முறை.</translation> <translation id="8903921497873541725">பெரிதாக்கு</translation> <translation id="8931333241327730545">இந்தக் கார்டை உங்கள் Google கணக்கில் சேமிக்க வேண்டுமா?</translation> @@ -1120,6 +1125,7 @@ <translation id="8952525071319348207">கார்டு விவரங்களைப் புதுப்பிக்க, <ph name="CREDIT_CARD" /> இன் காலாவதித் தேதியையும் CVC எண்ணையும் உள்ளிடவும். உறுதிசெய்த பின்னர், உங்கள் Google Payments கணக்கிலிருக்கும் கார்டு விவரங்கள் இந்தத் தளத்துடன் பகிரப்படும்.</translation> <translation id="8957210676456822347">கேப்டிவ் போர்டல் அங்கீகாரம்</translation> <translation id="8971063699422889582">சேவையகச் சான்றிதழ் காலாவதியானது.</translation> +<translation id="8975012916872825179">இதில் ஃபோன் எண்கள், மின்னஞ்சல் முகவரிகள், ஷிப்பிங் முகவரிகள் போன்ற தகவல்கள் உள்ளடங்கும்</translation> <translation id="8978053250194585037">சமீபத்தில் Google பாதுகாப்பான உலாவலானது <ph name="SITE" /> தளத்தில் <ph name="BEGIN_LINK" />ஃபிஷிங்கைக் கண்டறிந்தது<ph name="END_LINK" />. ஃபிஷிங் தளங்கள் பிற இணையதளங்களைப் போல் காண்பித்து, உங்களை ஏமாற்ற முயற்சிக்கக்கூடும்.</translation> <translation id="8983003182662520383">Google Payவைப் பயன்படுத்தும் கட்டண முறைகளும் முகவரிகளும்</translation> <translation id="8987927404178983737">மாதம்</translation> @@ -1148,7 +1154,7 @@ <translation id="9106062320799175032">பில்லிங் முகவரியைச் சேர்க்கவும்</translation> <translation id="910908805481542201">இதைச் சரிசெய்ய உதவு</translation> <translation id="9114524666733003316">கார்டை உறுதிசெய்கிறது...</translation> -<translation id="9128870381267983090">பிணையத்துடன் இணை</translation> +<translation id="9128870381267983090">நெட்வொர்க்குடன் இணையவும்</translation> <translation id="9137013805542155359">அசலைக் காண்பி</translation> <translation id="9137248913990643158">இந்தப் பயன்பாட்டைப் பயன்படுத்தும் முன், Chromeஐத் தொடங்கி உள்நுழையவும்.</translation> <translation id="9148088599418889305">ஷிப்பிங் முறையைத் தேர்வு செய்</translation> @@ -1169,6 +1175,7 @@ <translation id="935608979562296692">படிவத்தை அழி</translation> <translation id="939736085109172342">புதிய கோப்புறை</translation> <translation id="951104842009476243">ஏற்கப்படும் டெபிட் மற்றும் ப்ரீபெய்டு கார்டுகள்</translation> +<translation id="962484866189421427">இந்த உள்ளடக்கம், வேறொரு பிரபல ஆப்ஸ் போல தோற்றமளிக்கக்கூடிய அல்லது உங்களை ட்ராக் செய்யப் பயன்படுத்தக்கூடிய தரவைச் சேகரிக்கும் போலியான ஆப்ஸை நிறுவ முயலலாம். <ph name="BEGIN_LINK" />பரவாயில்லை, பக்கத்தைக் காட்டு<ph name="END_LINK" /></translation> <translation id="969892804517981540">அதிகாரப்பூர்வ கட்டமைப்பு</translation> <translation id="973773823069644502">டெலிவரி முகவரியைச் சேர்</translation> <translation id="975560348586398090">{COUNT,plural, =0{ஏதுமில்லை}=1{1 உருப்படி}other{# உருப்படிகள்}}</translation> @@ -1179,7 +1186,7 @@ <translation id="988159990683914416">டெவலப்பர் கட்டமைப்பு</translation> <translation id="989988560359834682">முகவரியைத் திருத்து</translation> <translation id="992115559265932548"><ph name="MICROSOFT_ACTIVE_DIRECTORY" /></translation> -<translation id="992432478773561401">உங்கள் கணினி அல்லது நெட்வொர்க்கில் "<ph name="SOFTWARE_NAME" />" மென்பொருள் சரியாக உள்ளமைக்கப்படவில்லை. பின்வருவனவற்றை முயற்சித்துப் பார்க்கவும்: +<translation id="992432478773561401">உங்கள் கம்ப்யூட்டர் அல்லது நெட்வொர்க்கில் "<ph name="SOFTWARE_NAME" />" மென்பொருள் சரியாக நிறுவப்படவில்லை. பின்வருவனவற்றை முயன்று பார்க்கவும்: <ul> <li>"<ph name="SOFTWARE_NAME" />" மென்பொருளை நிறுவல் நீக்கவும் அல்லது முடக்கவும்</li> <li>வேறொரு நெட்வொர்க்குடன் இணைக்கவும்</li>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 09d176b..9830511e 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">ఈ కార్డ్ని మీ Google ఖాతాకు మరియు ఈ పరికరంలో సేవ్ చేయాలనుకుంటున్నారా?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">గడువు ముగింపు <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">హానికర కంటెంట్ బ్లాక్ చేయబడింది.</translation> <translation id="382518646247711829">మీరు ప్రాక్సీ సర్వర్ను ఉపయోగిస్తే...</translation> <translation id="3828924085048779000">ఖాళీ పాస్ఫ్రేజ్ అనుమతించబడదు.</translation> <translation id="385051799172605136">వెనుకకు</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">చర్యలు</translation> <translation id="4958444002117714549">జాబితాను విస్తరించు</translation> <translation id="4974590756084640048">హెచ్చరికలను మళ్లీ ప్రారంభించు</translation> +<translation id="4988217478422488391">అంశాల కోసం ఆన్లైన్లో చెల్లించడం వేగవంతం చేస్తుంది</translation> <translation id="4989809363548539747">ఈ ప్లగిన్కు మద్దతు లేదు</translation> <translation id="5002932099480077015">ప్రారంభిస్తే, వేగవంతమైన ఫారమ్ పూరింపు కోసం Chrome ఈ పరికరంలో మీ కార్డ్ కాపీని నిల్వ చేస్తుంది.</translation> <translation id="5018422839182700155">ఈ పేజీని తెరవడం సాధ్యపడదు</translation> @@ -646,7 +648,7 @@ <translation id="5386426401304769735">ఈ సైట్ ప్రమాణపత్రం గొలుసులో SHA-1 ఉపయోగించి సంతకం చేసిన ప్రమాణపత్రం ఉంది.</translation> <translation id="5387961145478138773">మీకు ఇష్టమైన Google యాప్లకు సత్వరమే యాక్సెస్ను పొందండి</translation> <translation id="540969355065856584">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం ప్రస్తుతం చెల్లదు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడి చేసే వ్యక్తి మీ కనెక్షన్కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation> -<translation id="5421136146218899937">బ్రౌజింగ్ డేటాను క్లియర్ చెయ్యి...</translation> +<translation id="5421136146218899937">బ్రౌజింగ్ డేటాను క్లియర్ చేయి...</translation> <translation id="5430298929874300616">బుక్మార్క్ని తీసివేయి</translation> <translation id="5431657950005405462">మీ ఫైల్ కనుగొనబడలేదు</translation> <translation id="5439770059721715174">"<ph name="ERROR_PATH" />"లో స్కీమా ప్రామాణీకరణ లోపం: <ph name="ERROR" /></translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&సవరించడాన్ని పునరావృతం చేయి</translation> <translation id="5481076368049295676">ఈ కంటెంట్ మీ సమాచారాన్ని దొంగిలించగల లేదా తొలగించగల హానికరమైన సాఫ్ట్వేర్ని మీ పరికరంలో ఇన్స్టాల్ చేయడానికి ప్రయత్నించవచ్చు. <ph name="BEGIN_LINK" />ఏదేమైనా చూపు<ph name="END_LINK" /></translation> <translation id="54817484435770891">చెల్లుబాటు అయ్యే చిరునామాను జోడించండి</translation> +<translation id="5490432419156082418">చిరునామాలు మరియు మరిన్ని</translation> <translation id="5492298309214877701">కంపెనీ, సంస్థ లేదా పాఠశాల ఇంట్రానెట్లోని ఈ సైట్ బాహ్య వెబ్సైట్ కలిగి ఉన్న అదే URLని కలిగి ఉంది. <ph name="LINE_BREAK" /> మీ సిస్టమ్ నిర్వాహకుడిని సంప్రదించడానికి ప్రయత్నించండి.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 వినియోగంలో ఉంది}other{# వినియోగంలో ఉన్నాయి}}</translation> <translation id="5922853866070715753">దాదాపు పూర్తయింది</translation> <translation id="5939518447894949180">రీసెట్ చేయి</translation> +<translation id="5951495562196540101">వినియోగదారు ఖాతాతో నమోదు చేయడం సాధ్యపడదు (ప్యాకేజ్డ్ లైసెన్స్ అందుబాటులో ఉంది).</translation> <translation id="5967592137238574583">సంప్రదింపు సమాచారాన్ని సవరించండి</translation> <translation id="5967867314010545767">చరిత్ర నుండి తీసివేయి</translation> <translation id="5975083100439434680">దూరంగా జూమ్ చెయ్యి</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">దీని వలన మీరు చాలా వెబ్సైట్ల నుండి సైన్ అవుట్ చేయబడతారు.</translation> <translation id="8437238597147034694">&తరలించడాన్ని రద్దు చేయి</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 క్రెడిట్ కార్డ్}other{# క్రెడిట్ కార్డ్లు}}</translation> +<translation id="8473863474539038330">చిరునామాలు మరియు మరిన్ని</translation> <translation id="8483780878231876732">మీ Google ఖాతా నుండి కార్డ్లను ఉపయోగించేందుకు, Chromeకి సైన్ ఇన్ చేయండి</translation> <translation id="8488350697529856933">వీటికి వర్తిస్తుంది</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ప్రతిస్పందించడానికి చాలా ఎక్కువ సమయం పట్టింది.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">మీ కార్డ్ వివరాలను అప్డేట్ చేయడానికి <ph name="CREDIT_CARD" /> కార్డ్ గడువు ముగింపు తేదీ మరియు CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ Google చెల్లింపుల ఖాతా నుండి కార్డ్ వివరాలు ఈ సైట్తో షేర్ చేయబడతాయి.</translation> <translation id="8957210676456822347">క్యాప్టివ్ పోర్టల్ ప్రామాణీకరణ</translation> <translation id="8971063699422889582">సర్వర్ యొక్క ప్రమాణపత్రం గడువు ముగిసింది.</translation> +<translation id="8975012916872825179">ఫోన్ నంబర్లు, ఇమెయిల్ చిరునామాలు మరియు బట్వాడా చిరునామాలు లాంటి సమాచారం ఉంటుంది</translation> <translation id="8978053250194585037">Google సురక్షిత బ్రౌజింగ్ ఇటీవల <ph name="SITE" />లో <ph name="BEGIN_LINK" />ఫిషింగ్ని గుర్తించింది<ph name="END_LINK" />. ఫిషింగ్ సైట్లు వేరే వెబ్సైట్ల వలె ప్రవర్తించడం ద్వారా మిమ్మల్ని మాయ చేయవచ్చు.</translation> <translation id="8983003182662520383">Google Payని ఉపయోగిస్తున్న చెల్లింపు పద్ధతులు మరియు చిరునామాలు</translation> <translation id="8987927404178983737">నెల</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">ఫారమ్ను తీసివేయండి</translation> <translation id="939736085109172342">క్రొత్త ఫోల్డర్</translation> <translation id="951104842009476243">ఆమోదించే డెబిట్ మరియు ప్రీపెయిడ్ కార్డ్లు</translation> +<translation id="962484866189421427">ఈ కంటెంట్ వేరేవాటిలా కనిపించే మోసపూరిత యాప్లను ఇన్స్టాల్ చేయడానికి ప్రయత్నించవచ్చు లేదా మిమ్మల్ని ట్రాక్ చేయడానికి ఉపయోగించే డేటాని సేకరించవచ్చు. <ph name="BEGIN_LINK" />అయినప్పటికీ, చూపించు<ph name="END_LINK" /></translation> <translation id="969892804517981540">అధికారిక బిల్డ్</translation> <translation id="973773823069644502">బట్వాడా చిరునామాను జోడించండి</translation> <translation id="975560348586398090">{COUNT,plural, =0{ఏమీ లేవు}=1{1 అంశం}other{# అంశాలు}}</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index e28abbf..eb3a968 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">คุณต้องการบันทึกบัตรนี้ลงในบัญชี Google และในอุปกรณ์นี้ไหม</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">หมดอายุ <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">บล็อกเนื้อหาอันตรายแล้ว</translation> <translation id="382518646247711829">หากคุณใช้พร็อกซีเซิร์ฟเวอร์...</translation> <translation id="3828924085048779000">ข้อความรหัสผ่านต้องไม่เว้นว่างไว้</translation> <translation id="385051799172605136">กลับ</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">การทำงาน</translation> <translation id="4958444002117714549">ขยายรายการ</translation> <translation id="4974590756084640048">เปิดใช้คำเตือนอีกครั้ง</translation> +<translation id="4988217478422488391">ช่วยให้ชำระเงินออนไลน์ได้เร็วขึ้น</translation> <translation id="4989809363548539747">ไม่รองรับปลั๊กอินนี้</translation> <translation id="5002932099480077015">หากเปิดใช้ Chrome จะเก็บสำเนาการ์ดของคุณในอุปกรณ์นี้เพื่อให้การกรอกฟอร์มทำได้เร็วขึ้น</translation> <translation id="5018422839182700155">ไม่สามารถเปิดหน้านี้</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&ทำซ้ำการแก้ไข</translation> <translation id="5481076368049295676">เนื้อหานี้อาจพยายามติดตั้งซอฟต์แวร์อันตรายที่จะขโมยหรือลบข้อมูลในอุปกรณ์ของคุณ <ph name="BEGIN_LINK" />แสดงเนื้อหา<ph name="END_LINK" /></translation> <translation id="54817484435770891">เพิ่มที่อยู่ที่ถูกต้อง</translation> +<translation id="5490432419156082418">ที่อยู่และอื่นๆ</translation> <translation id="5492298309214877701">เว็บไซต์นี้บนอินทราเน็ตของบริษัท องค์กร หรือโรงเรียนมี URL เหมือนกับเว็บไซต์ภายนอก <ph name="LINE_BREAK" /> โปรดลองติดต่อผู้ดูแลระบบของคุณ</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{ใช้งานอยู่ 1 รายการ}other{ใช้งานอยู่ # รายการ}}</translation> <translation id="5922853866070715753">เกือบเสร็จแล้ว</translation> <translation id="5939518447894949180">รีเซ็ต</translation> +<translation id="5951495562196540101">ลงทะเบียนด้วยบัญชีผู้ใช้ทั่วไปไม่ได้ (มีใบอนุญาตแบบแพ็กเกจ)</translation> <translation id="5967592137238574583">แก้ไขข้อมูลติดต่อ</translation> <translation id="5967867314010545767">ลบจากประวัติการเข้าชม</translation> <translation id="5975083100439434680">ย่อ</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">วิธีนี้จะทำให้คุณออกจากระบบของเว็บไซต์ส่วนใหญ่</translation> <translation id="8437238597147034694">&เลิกทำการย้าย</translation> <translation id="8466379296835108687">{COUNT,plural, =1{บัตรเครดิต 1 ใบ}other{บัตรเครดิต # ใบ}}</translation> +<translation id="8473863474539038330">ที่อยู่และอื่นๆ</translation> <translation id="8483780878231876732">หากต้องการใช้การ์ดจากบัญชี Google ให้ลงชื่อเข้าใช้ Chrome</translation> <translation id="8488350697529856933">ใช้กับ</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ใช้เวลาตอบกลับนานเกินไป</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">ป้อนวันที่หมดอายุและ CVC สำหรับ <ph name="CREDIT_CARD" /> เพื่ออัปเดตรายละเอียดของบัตร เมื่อยืนยันแล้ว ระบบจะแชร์รายละเอียดของบัตรจากบัญชี Google Payments กับเว็บไซต์นี้</translation> <translation id="8957210676456822347">การให้สิทธิ์แคปทีฟพอร์ทัล</translation> <translation id="8971063699422889582">ใบรับรองของเซิร์ฟเวอร์หมดอายุแล้ว</translation> +<translation id="8975012916872825179">รวมข้อมูล เช่น หมายเลขโทรศัพท์ ที่อยู่อีเมล และที่อยู่สำหรับจัดส่ง</translation> <translation id="8978053250194585037">เมื่อเร็วๆ นี้ Google Safe Browsing <ph name="BEGIN_LINK" />ตรวจพบฟิชชิง<ph name="END_LINK" />ใน <ph name="SITE" /> เว็บไซต์ฟิชชิงปลอมเป็นเว็บไซต์อื่นๆ เพื่อหลอกคุณ</translation> <translation id="8983003182662520383">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation> <translation id="8987927404178983737">เดือน</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">ล้างฟอร์ม</translation> <translation id="939736085109172342">โฟลเดอร์ใหม่</translation> <translation id="951104842009476243">บัตรเดบิตและบัตรเติมเงินที่ยอมรับ</translation> +<translation id="962484866189421427">เนื้อหานี้อาจพยายามติดตั้งแอปที่หลอกลวงซึ่งปลอมเป็นเนื้อหาอย่างอื่นหรือรวบรวมข้อมูลที่อาจนำไปใช้ติดตามคุณ <ph name="BEGIN_LINK" />แสดงเนื้อหา<ph name="END_LINK" /></translation> <translation id="969892804517981540">รุ่นที่เป็นทางการ</translation> <translation id="973773823069644502">เพิ่มที่อยู่สำหรับนำส่งสินค้า</translation> <translation id="975560348586398090">{COUNT,plural, =0{ไม่มี}=1{1 รายการ}other{# รายการ}}</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 62a2132..fe6735ac 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Bu kartı Google Hesabınıza ve bu cihaza kaydetmek istiyor musunuz?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Son kullanma tarihi: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Zararlı içerik engellendi.</translation> <translation id="382518646247711829">Proxy sunucu kullanıyorsanız...</translation> <translation id="3828924085048779000">Boş parolaya izin verilmez.</translation> <translation id="385051799172605136">Geri</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">İşlemler</translation> <translation id="4958444002117714549">Listeyi genişlet</translation> <translation id="4974590756084640048">Uyarıları yeniden etkinleştir</translation> +<translation id="4988217478422488391">Online öğeler için ödeme yapmayı hızlandırır</translation> <translation id="4989809363548539747">Bu eklenti desteklenmiyor</translation> <translation id="5002932099480077015">Bu seçenek etkinleştirildiğinde Chrome, formları daha hızlı doldurmak için kartınızın bir kopyasını bu cihazda saklar.</translation> <translation id="5018422839182700155">Bu sayfa açılamıyor</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">Düzenlemeyi &yeniden yap</translation> <translation id="5481076368049295676">Bu içerik, cihazınıza bilgilerinizi çalabilecek veya silebilecek tehlikeli yazılımlar yüklemeye çalışabilir. <ph name="BEGIN_LINK" />Yine de göster<ph name="END_LINK" /></translation> <translation id="54817484435770891">Geçerli adres ekleyin</translation> +<translation id="5490432419156082418">Adresler ve Daha Fazlası</translation> <translation id="5492298309214877701">Şirket, kuruluş veya okul intranet'indeki bu site harici bir web sitesiyle aynı URL'ye sahip. <ph name="LINE_BREAK" /> Sistem yöneticinize başvurmayı deneyin.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 çerez kullanımda}other{# çerez kullanımda}}</translation> <translation id="5922853866070715753">Tamamlanmak üzere</translation> <translation id="5939518447894949180">Sıfırla</translation> +<translation id="5951495562196540101">Tüketici hesabına kaydedilemiyor (paket lisans mevcut).</translation> <translation id="5967592137238574583">İletişim Bilgilerini Düzenleyin</translation> <translation id="5967867314010545767">Geçmişten kaldır.</translation> <translation id="5975083100439434680">Uzaklaştır</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Bu işlem, çoğu web sitesinden çıkış yapmanıza neden olacak.</translation> <translation id="8437238597147034694">Taşımayı &geri al</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 kredi kartı}other{# kredi kartı}}</translation> +<translation id="8473863474539038330">Adresler ve daha fazlası</translation> <translation id="8483780878231876732">Google Hesabınızda kayıtlı kartları kullanmak için Chrome'da oturum açın</translation> <translation id="8488350697529856933">Uygulandığı yer</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> ana makinesinin yanıt vermesi çok uzun sürdü.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Kart bilgilerinizi güncellemek için <ph name="CREDIT_CARD" /> numaralı karta ilişkin son kullanma tarihini ve CVC kodunu girin. Onayladığınızda Googe Payments hesabınızdaki kart bilgileriniz bu siteyle paylaşılır.</translation> <translation id="8957210676456822347">Giriş Portalı Yetkilendirmesi</translation> <translation id="8971063699422889582">Sunucu sertifikasının süresi doldu.</translation> +<translation id="8975012916872825179">Telefon numaraları, e-posta adresleri ve gönderim adresleri gibi bilgileri içerir</translation> <translation id="8978053250194585037">Google Güvenli Tarama yakın bir zamanda <ph name="SITE" /> sitesinde <ph name="BEGIN_LINK" />kimlik avı yapıldığını tespit etti<ph name="END_LINK" />. Kimlik avı siteleri sizi aldatmak için başka web siteleri gibi görünür.</translation> <translation id="8983003182662520383">Google Pay'i Kullanan Ödeme Yöntemleri ve Adresler</translation> <translation id="8987927404178983737">Ay</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">FORMU TEMİZLE</translation> <translation id="939736085109172342">Yeni klasör</translation> <translation id="951104842009476243">Kabul Edilen Banka ve Ön Ödemeli Kartlar</translation> +<translation id="962484866189421427">Bu içerik başka bir şeyi taklit eden aldatıcı uygulamalar yükleyebilir veya sizi izlemek için kullanılabilecek veriler toplayabilirler. <ph name="BEGIN_LINK" />Yine de göster<ph name="END_LINK" /></translation> <translation id="969892804517981540">Resmi Derleme</translation> <translation id="973773823069644502">Teslimat Adresi Ekle</translation> <translation id="975560348586398090">{COUNT,plural, =0{Yok}=1{1 öğe}other{# öğe}}</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index b2f8fdc..b470164 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Зберегти дані картки у вашому обліковому записі Google і на цьому пристрої?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Діє до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Шкідливий вміст заблоковано.</translation> <translation id="382518646247711829">Якщо ви використовуєте проксі-сервер…</translation> <translation id="3828924085048779000">Порожня парольна фраза заборонена.</translation> <translation id="385051799172605136">Назад</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Дії</translation> <translation id="4958444002117714549">Розгорнути список</translation> <translation id="4974590756084640048">Показувати застереження</translation> +<translation id="4988217478422488391">Пришвидшує оплату в Інтернеті</translation> <translation id="4989809363548539747">Цей плагін не підтримується</translation> <translation id="5002932099480077015">Коли цю функцію ввімкнено, Chrome зберігає копію даних вашої картки на пристрої, щоб ви могли швидше заповнювати форми.</translation> <translation id="5018422839182700155">Не вдається відкрити цю сторінку</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Повторити редагування</translation> <translation id="5481076368049295676">Цей вміст може намагатися встановити на ваш пристрій небезпечну програму, яка викрадає або видаляє інформацію. <ph name="BEGIN_LINK" />Усе одно показати<ph name="END_LINK" /></translation> <translation id="54817484435770891">Додати дійсну адресу</translation> +<translation id="5490432419156082418">Адреси й інше</translation> <translation id="5492298309214877701">URL-адреса цього сайту в інтранеті компанії, організації чи навчального закладу збігається з адресою зовнішнього веб-сайту. <ph name="LINE_BREAK" /> Зв’яжіться зі своїм системним адміністратором.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Використовується 1 файл}one{Використовується # файл}few{Використовуються # файли}many{Використовуються # файлів}other{Використовуються # файлу}}</translation> <translation id="5922853866070715753">Майже готово</translation> <translation id="5939518447894949180">Скинути</translation> +<translation id="5951495562196540101">Не вдається зареєструватися за допомогою особистого облікового запису користувача (доступна пакетна ліцензія).</translation> <translation id="5967592137238574583">Змініть контактну інформацію</translation> <translation id="5967867314010545767">Видалити з історії</translation> <translation id="5975083100439434680">Зменшити масштаб</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Ви вийдете з облікового запису на більшості веб-сайтів.</translation> <translation id="8437238597147034694">&Відмінити переміщення</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 кредитна картка}one{# кредитна картка}few{# кредитні картки}many{# кредитних карток}other{# кредитної картки}}</translation> +<translation id="8473863474539038330">Адреси й інше</translation> <translation id="8483780878231876732">Щоб користуватися картками у своєму обліковому записі Google, увійдіть у Chrome</translation> <translation id="8488350697529856933">Застосовується до:</translation> <translation id="8498891568109133222">Хост <ph name="HOST_NAME" /> довго не відповідає.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Введіть термін дії та код CVC картки <ph name="CREDIT_CARD" />, щоб оновити її дані. Щойно ви підтвердите дані картки з облікового запису Google Payments, цей сайт отримає доступ до них.</translation> <translation id="8957210676456822347">Авторизація приєднаного порталу</translation> <translation id="8971063699422889582">Термін дії сертифіката сервера завершився.</translation> +<translation id="8975012916872825179">Зокрема така інформація, як номери телефонів, електронні адреси й адреси доставки</translation> <translation id="8978053250194585037">Функція безпечного перегляду від Google нещодавно <ph name="BEGIN_LINK" />виявила фішинг<ph name="END_LINK" /> на сайті <ph name="SITE" />. Фішингові сайти видають себе за інші сайти, щоб ошукати вас.</translation> <translation id="8983003182662520383">Способи оплати й адреси, пов’язані з Google Pay</translation> <translation id="8987927404178983737">Місяць</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">ОЧИСТИТИ ФОРМУ</translation> <translation id="939736085109172342">Нова папка</translation> <translation id="951104842009476243">Дебетові та передплачені картки, які приймаються до оплати</translation> +<translation id="962484866189421427">Ця сторінка може спробувати встановити оманливі додатки, які видають себе за інший вміст або збирають дані для відстеження вашої активності. <ph name="BEGIN_LINK" />Усе одно показати<ph name="END_LINK" /></translation> <translation id="969892804517981540">Розробка</translation> <translation id="973773823069644502">Додати адресу доставки</translation> <translation id="975560348586398090">{COUNT,plural, =0{Немає}=1{1 запис}one{# запис}few{# записи}many{# записів}other{# запису}}</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 552075a6..d8392a71 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">Bạn có muốn lưu thẻ này vào Tài khoản Google của bạn và trên thiết bị này không?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Ngày hết hạn <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">Đã chặn nội dung độc hại.</translation> <translation id="382518646247711829">Nếu bạn sử dụng máy chủ proxy...</translation> <translation id="3828924085048779000">Không cho phép cụm mật khẩu trống.</translation> <translation id="385051799172605136">Quay lại</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">Tác vụ</translation> <translation id="4958444002117714549">Mở rộng danh sách</translation> <translation id="4974590756084640048">Bật lại cảnh báo</translation> +<translation id="4988217478422488391">Giúp bạn thanh toán trực tuyến nhanh hơn</translation> <translation id="4989809363548539747">Plugin này không được hỗ trợ</translation> <translation id="5002932099480077015">Nếu được bật, Chrome sẽ lưu trữ bản sao thẻ của bạn trên thiết bị này để điền vào biểu mẫu nhanh hơn.</translation> <translation id="5018422839182700155">Không thể mở trang này</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">&Làm lại chỉnh sửa</translation> <translation id="5481076368049295676">Nội dung này có thể tìm cách cài đặt phần mềm nguy hiểm trên thiết bị của bạn để lấy cắp hoặc xóa thông tin. <ph name="BEGIN_LINK" />Vẫn hiển thị<ph name="END_LINK" /></translation> <translation id="54817484435770891">Thêm địa chỉ hợp lệ</translation> +<translation id="5490432419156082418">Địa chỉ và các tùy chọn khác</translation> <translation id="5492298309214877701">Trang web trên mạng nội bộ của công ty, tổ chức hoặc trường học này có URL tương tự như trang web bên ngoài. <ph name="LINE_BREAK" /> Hãy thử liên hệ với quản trị viên hệ thống của bạn.</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Đang sử dụng 1 cookie}other{Đang sử dụng # cookie}}</translation> <translation id="5922853866070715753">Sắp hoàn tất</translation> <translation id="5939518447894949180">Đặt lại</translation> +<translation id="5951495562196540101">Không thể đăng ký bằng tài khoản người dùng thông thường (giấy phép theo gói có sẵn).</translation> <translation id="5967592137238574583">Chỉnh sửa thông tin liên hệ</translation> <translation id="5967867314010545767">Xóa khỏi lịch sử</translation> <translation id="5975083100439434680">Thu nhỏ</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">Thao tác này sẽ đăng xuất bạn khỏi hầu hết các trang web.</translation> <translation id="8437238597147034694">&Hoàn tác di chuyển</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 thẻ tín dụng}other{# thẻ tín dụng}}</translation> +<translation id="8473863474539038330">Địa chỉ và các tùy chọn khác</translation> <translation id="8483780878231876732">Để sử dụng thẻ từ Tài khoản Google, hãy đăng nhập vào Chrome</translation> <translation id="8488350697529856933">Áp dụng cho</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> mất quá nhiều thời gian để phản hồi.</translation> @@ -1125,6 +1130,7 @@ <translation id="8952525071319348207">Hãy nhập ngày hết hạn và CVC cho <ph name="CREDIT_CARD" /> để cập nhật thông tin chi tiết thẻ của bạn. Sau khi bạn xác nhận, thông tin chi tiết thẻ từ tài khoản thanh toán Google sẽ được chia sẻ với trang web này.</translation> <translation id="8957210676456822347">Ủy quyền cổng bị khóa</translation> <translation id="8971063699422889582">Chứng chỉ của máy chủ đã hết hạn.</translation> +<translation id="8975012916872825179">Bao gồm các thông tin như số điện thoại, địa chỉ email và địa chỉ giao hàng</translation> <translation id="8978053250194585037">Tính năng Duyệt web an toàn của Google gần đây đã <ph name="BEGIN_LINK" />phát hiện dấu hiệu lừa đảo<ph name="END_LINK" /> trên <ph name="SITE" />. Các trang web lừa đảo sẽ giả mạo các trang web khác để đánh lừa bạn.</translation> <translation id="8983003182662520383">Địa chỉ và phương thức thanh toán sử dụng Google Pay</translation> <translation id="8987927404178983737">Tháng</translation> @@ -1173,6 +1179,7 @@ <translation id="935608979562296692">XÓA BIỂU MẪU</translation> <translation id="939736085109172342">Thư mục mới</translation> <translation id="951104842009476243">Thẻ ghi nợ và thẻ trả trước được chấp nhận</translation> +<translation id="962484866189421427">Nội dung này có thể tìm cách cài đặt ứng dụng lừa đảo giả mạo nội dung khác hoặc thu thập dữ liệu có thể được dùng để theo dõi bạn. <ph name="BEGIN_LINK" />Vẫn hiển thị<ph name="END_LINK" /></translation> <translation id="969892804517981540">Phiên bản Chính thức</translation> <translation id="973773823069644502">Thêm địa chỉ giao hàng</translation> <translation id="975560348586398090">{COUNT,plural, =0{Không có}=1{1 mục}other{# mục}}</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 2c98b6c..257fc256 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -419,6 +419,7 @@ <translation id="3778403066972421603">要将此卡的信息保存到您的 Google 帐号中和此设备上吗?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">失效日期:<ph name="EXPIRATION_YEAR" /> 年 <ph name="EXPIRATION_MONTH" /> 月</translation> +<translation id="3807873520724684969">有害内容已被拦截。</translation> <translation id="382518646247711829">如果您使用代理服务器…</translation> <translation id="3828924085048779000">密码输入字段不能留空。</translation> <translation id="385051799172605136">后退</translation> @@ -575,6 +576,7 @@ <translation id="495170559598752135">操作</translation> <translation id="4958444002117714549">展开列表</translation> <translation id="4974590756084640048">重新启用警告功能</translation> +<translation id="4988217478422488391">加快在线支付速度</translation> <translation id="4989809363548539747">该插件不受支持</translation> <translation id="5002932099480077015">如果您选中此项,Chrome 会将您的卡的副本存储在此设备上,以加快表单填写速度。</translation> <translation id="5018422839182700155">无法打开此网页</translation> @@ -654,6 +656,7 @@ <translation id="5470861586879999274">恢复修改(&R)</translation> <translation id="5481076368049295676">此内容可能会试图在您的设备上安装危险的软件来窃取或删除您的信息。<ph name="BEGIN_LINK" />仍然显示<ph name="END_LINK" /></translation> <translation id="54817484435770891">添加有效地址</translation> +<translation id="5490432419156082418">地址和其他信息</translation> <translation id="5492298309214877701">这个位于公司、组织或学校内网中的网站使用的网址与某个外部网站的网址相同。 <ph name="LINE_BREAK" /> 请尝试与您的系统管理员联系。</translation> @@ -717,6 +720,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{正在使用 1 个}other{正在使用 # 个}}</translation> <translation id="5922853866070715753">即将完成</translation> <translation id="5939518447894949180">重置</translation> +<translation id="5951495562196540101">无法通过消费者帐号注册(有封装的许可)。</translation> <translation id="5967592137238574583">修改联系信息</translation> <translation id="5967867314010545767">从历史记录中移除</translation> <translation id="5975083100439434680">缩小</translation> @@ -1061,6 +1065,7 @@ <translation id="8433057134996913067">这将使您退出大多数网站。</translation> <translation id="8437238597147034694">撤消移动(&U)</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 张信用卡}other{# 张信用卡}}</translation> +<translation id="8473863474539038330">地址和其他信息</translation> <translation id="8483780878231876732">要使用您 Google 帐号中的信用卡,请登录 Chrome</translation> <translation id="8488350697529856933">适用对象</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> 的响应时间过长。</translation> @@ -1121,6 +1126,7 @@ <translation id="8952525071319348207">请输入 <ph name="CREDIT_CARD" /> 的失效日期和银行卡验证码 (CVC),以更新您的信用卡详细信息。在您确认之后,您的 Google Payments 帐号中的信用卡详细信息将会共享给该网站。</translation> <translation id="8957210676456822347">强制门户授权</translation> <translation id="8971063699422889582">服务器的证书已过期。</translation> +<translation id="8975012916872825179">包括电话号码、电子邮件地址和送货地址等信息</translation> <translation id="8978053250194585037">Google 安全浏览功能最近在 <ph name="SITE" /> 上<ph name="BEGIN_LINK" />检测到网上诱骗行为<ph name="END_LINK" />。网上诱骗网站会假冒其他网站来欺骗您。</translation> <translation id="8983003182662520383">Google Pay 中存储的付款方式和地址信息</translation> <translation id="8987927404178983737">月</translation> @@ -1169,6 +1175,7 @@ <translation id="935608979562296692">清除表单内容</translation> <translation id="939736085109172342">新建文件夹</translation> <translation id="951104842009476243">接受的借记卡和预付卡</translation> +<translation id="962484866189421427">此内容可能会尝试安装欺骗性应用,而这些应用能够冒充其他内容或收集可用于对您进行跟踪的数据。<ph name="BEGIN_LINK" />仍然显示<ph name="END_LINK" /></translation> <translation id="969892804517981540">正式版本</translation> <translation id="973773823069644502">添加速递地址</translation> <translation id="975560348586398090">{COUNT,plural, =0{无}=1{1 项内容}other{# 项内容}}</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 5dbc66b..3516cb3 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -422,6 +422,7 @@ <translation id="3778403066972421603">你要將這張信用卡的資訊儲存到你在這個裝置上的 Google 帳戶嗎?</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">到期日:<ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> +<translation id="3807873520724684969">已封鎖有害內容。</translation> <translation id="382518646247711829">如果你使用 Proxy 伺服器...</translation> <translation id="3828924085048779000">通關密語欄位不得留空。</translation> <translation id="385051799172605136">返回</translation> @@ -578,6 +579,7 @@ <translation id="495170559598752135">動作</translation> <translation id="4958444002117714549">展開清單</translation> <translation id="4974590756084640048">重新啟用警告功能</translation> +<translation id="4988217478422488391">加快線上付款流程</translation> <translation id="4989809363548539747">這是不支援的外掛程式</translation> <translation id="5002932099480077015">啟用後,Chrome 會將您的信用卡複本儲存在這個裝置上,以加快表單填寫速度。</translation> <translation id="5018422839182700155">無法開啟這個網頁</translation> @@ -657,6 +659,7 @@ <translation id="5470861586879999274">重做編輯(&R)</translation> <translation id="5481076368049295676">這項內容可能會試圖在你的裝置上安裝危險軟體,藉此竊取或刪除你的資訊。<ph name="BEGIN_LINK" />仍要顯示<ph name="END_LINK" /></translation> <translation id="54817484435770891">新增有效的地址</translation> +<translation id="5490432419156082418">地址和其他資訊</translation> <translation id="5492298309214877701">這個位於公司、機構或學校內部網路的網站使用的網址與某個外部網站相同。 <ph name="LINE_BREAK" /> 請與您的系統管理員聯絡。</translation> @@ -720,6 +723,7 @@ <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{目前使用 1 個 Cookie}other{目前使用 # 個 Cookie}}</translation> <translation id="5922853866070715753">即將完成</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5951495562196540101">無法透過個人帳戶註冊 (有封裝授權)。</translation> <translation id="5967592137238574583">編輯聯絡資訊</translation> <translation id="5967867314010545767">從記錄中移除</translation> <translation id="5975083100439434680">縮小</translation> @@ -1065,6 +1069,7 @@ <translation id="8433057134996913067">您會因此登出大多數網站。</translation> <translation id="8437238597147034694">復原移動(&U)</translation> <translation id="8466379296835108687">{COUNT,plural, =1{1 張信用卡}other{# 張信用卡}}</translation> +<translation id="8473863474539038330">地址和其他資訊</translation> <translation id="8483780878231876732">如要使用您的 Google 帳戶中的信用卡,請登入 Chrome</translation> <translation id="8488350697529856933">適用對象</translation> <translation id="8498891568109133222"><ph name="HOST_NAME" /> 的回應時間過長。</translation> @@ -1124,6 +1129,7 @@ <translation id="8952525071319348207">請輸入 <ph name="CREDIT_CARD" /> 的到期日和信用卡安全碼,以更新你的信用卡詳細資料。完成驗證後,這個網站就會取得你 Google 付款帳戶中的信用卡詳細資料。</translation> <translation id="8957210676456822347">監控式入口網站授權</translation> <translation id="8971063699422889582">伺服器憑證已過期。</translation> +<translation id="8975012916872825179">包括電話號碼、電子郵件地址和運送地址等資訊</translation> <translation id="8978053250194585037">Google 安全瀏覽功能最近在 <ph name="SITE" /> 上<ph name="BEGIN_LINK" />偵測到網路詐騙行為<ph name="END_LINK" />。詐騙網站會偽裝成其他網站,藉此騙取你的資訊。</translation> <translation id="8983003182662520383">儲存在 Google Pay 的付款方式和地址資訊</translation> <translation id="8987927404178983737">月</translation> @@ -1172,6 +1178,7 @@ <translation id="935608979562296692">清除表單</translation> <translation id="939736085109172342">新增資料夾</translation> <translation id="951104842009476243">接受的簽帳金融卡和預付卡</translation> +<translation id="962484866189421427">這項內容可能會試圖讓你安裝身分不實的欺騙性應用程式,或是收集可用於追蹤你的資料。<ph name="BEGIN_LINK" />仍要顯示<ph name="END_LINK" /></translation> <translation id="969892804517981540">正式版本</translation> <translation id="973773823069644502">新增快遞地址</translation> <translation id="975560348586398090">{COUNT,plural, =0{無}=1{1 個項目}other{# 個項目}}</translation>
diff --git a/components/sync/base/nigori.cc b/components/sync/base/nigori.cc index b9030aa..3f777a5 100644 --- a/components/sync/base/nigori.cc +++ b/components/sync/base/nigori.cc
@@ -12,8 +12,10 @@ #include "base/base64.h" #include "base/feature_list.h" #include "base/logging.h" +#include "base/metrics/histogram_functions.h" #include "base/stl_util.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/sys_byteorder.h" #include "components/sync/base/sync_base_switches.h" #include "crypto/encryptor.h" @@ -32,6 +34,8 @@ namespace syncer { +namespace { + // NigoriStream simplifies the concatenation operation of the Nigori protocol. class NigoriStream { public: @@ -62,6 +66,23 @@ std::ostringstream stream_; }; +const char* GetHistogramSuffixForKeyDerivationMethod( + KeyDerivationMethod method) { + switch (method) { + case KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003: + return "Pbkdf2"; + case KeyDerivationMethod::SCRYPT_8192_8_11: + return "Scrypt8192"; + case KeyDerivationMethod::UNSUPPORTED: + break; + } + + NOTREACHED(); + return "Unsupported"; +} + +} // namespace + KeyDerivationParams::KeyDerivationParams(KeyDerivationMethod method, const std::string& pbkdf2_hostname, const std::string& pbkdf2_username, @@ -215,22 +236,31 @@ bool Nigori::InitByDerivation(const KeyDerivationParams& key_derivation_params, const std::string& password) { + base::TimeTicks begin_time = base::TimeTicks::Now(); + bool result = false; switch (key_derivation_params.method()) { case KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003: - return keys_.InitByDerivationUsingPbkdf2( + result = keys_.InitByDerivationUsingPbkdf2( key_derivation_params.pbkdf2_hostname(), key_derivation_params.pbkdf2_username(), password); + break; case KeyDerivationMethod::SCRYPT_8192_8_11: DCHECK(!base::FeatureList::IsEnabled( switches::kSyncForceDisableScryptForCustomPassphrase)); - return keys_.InitByDerivationUsingScrypt( + result = keys_.InitByDerivationUsingScrypt( key_derivation_params.scrypt_salt(), password); + break; case KeyDerivationMethod::UNSUPPORTED: return false; } - NOTREACHED(); - return false; + UmaHistogramTimes( + base::StringPrintf("Sync.Crypto.NigoriKeyDerivationDuration.%s", + GetHistogramSuffixForKeyDerivationMethod( + key_derivation_params.method())), + base::TimeTicks::Now() - begin_time); + + return result; } bool Nigori::InitByImport(const std::string& user_key,
diff --git a/components/sync/base/nigori_unittest.cc b/components/sync/base/nigori_unittest.cc index 4a6d3c70..e0238b74 100644 --- a/components/sync/base/nigori_unittest.cc +++ b/components/sync/base/nigori_unittest.cc
@@ -6,6 +6,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "components/sync/base/sync_base_switches.h" #include "testing/gtest/include/gtest/gtest.h" @@ -244,6 +245,29 @@ KeyDerivationParams::CreateWithUnsupportedMethod(), "Passphrase!")); } +// TODO(davidovic): Use an injected clock in the following tests in order to +// verify that the duration is computed correctly. +TEST(SyncNigoriTest, InitByDerivationShouldReportPbkdf2DurationInHistogram) { + Nigori nigori; + base::HistogramTester histogram_tester; + ASSERT_TRUE(nigori.InitByDerivation( + KeyDerivationParams::CreateForPbkdf2("localhost", "dummy"), + "Passphrase!")); + + histogram_tester.ExpectTotalCount( + "Sync.Crypto.NigoriKeyDerivationDuration.Pbkdf2", /*count=*/1); +} + +TEST(SyncNigoriTest, InitByDerivationShouldReportScryptDurationInHistogram) { + Nigori nigori; + base::HistogramTester histogram_tester; + ASSERT_TRUE(nigori.InitByDerivation( + KeyDerivationParams::CreateForScrypt("somesalt"), "Passphrase!")); + + histogram_tester.ExpectTotalCount( + "Sync.Crypto.NigoriKeyDerivationDuration.Scrypt8192", /*count=*/1); +} + TEST(SyncNigoriTest, GenerateScryptSaltShouldReturnSaltOfCorrectSize) { EXPECT_EQ(32U, Nigori::GenerateScryptSalt().size()); }
diff --git a/components/sync/engine_impl/net/server_connection_manager.cc b/components/sync/engine_impl/net/server_connection_manager.cc index a40ec6a9..1475da3 100644 --- a/components/sync/engine_impl/net/server_connection_manager.cc +++ b/components/sync/engine_impl/net/server_connection_manager.cc
@@ -156,14 +156,12 @@ bool ServerConnectionManager::SetAuthToken(const std::string& auth_token) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!auth_token.empty() && (previously_invalidated_token != auth_token)) { + if (!auth_token.empty()) { auth_token_.assign(auth_token); - previously_invalidated_token = std::string(); return true; } - if (auth_token.empty()) - InvalidateAndClearAuthToken(); + auth_token_.clear(); // The auth token could be non-empty in cases like server outage/bug. E.g. // token returned by first request is considered invalid by sync server and @@ -175,13 +173,8 @@ return false; } -void ServerConnectionManager::InvalidateAndClearAuthToken() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Copy over the token to previous invalid token. - if (!auth_token_.empty()) { - previously_invalidated_token.assign(auth_token_); - auth_token_.clear(); - } +void ServerConnectionManager::ClearAuthToken() { + auth_token_.clear(); } void ServerConnectionManager::SetServerStatus( @@ -237,7 +230,7 @@ ¶ms->response); if (params->response.server_status == HttpResponse::SYNC_AUTH_ERROR) { - InvalidateAndClearAuthToken(); + auth_token_.clear(); } if (!ok || net::HTTP_OK != params->response.response_code)
diff --git a/components/sync/engine_impl/net/server_connection_manager.h b/components/sync/engine_impl/net/server_connection_manager.h index 5d98018..11d2b9c 100644 --- a/components/sync/engine_impl/net/server_connection_manager.h +++ b/components/sync/engine_impl/net/server_connection_manager.h
@@ -211,10 +211,7 @@ const std::string& path, const std::string& auth_token); - // An internal helper to clear our auth_token_ and cache the old version - // in |previously_invalidated_token_| to shelter us from retrying with a - // known bad token. - void InvalidateAndClearAuthToken(); + void ClearAuthToken(); // Helper to check terminated flags and build a Connection object. If this // ServerConnectionManager has been terminated, this will return null. @@ -241,9 +238,6 @@ // The auth token to use in authenticated requests. std::string auth_token_; - // The previous auth token that is invalid now. - std::string previously_invalidated_token; - base::ObserverList<ServerConnectionEventListener>::Unchecked listeners_; HttpResponse::ServerConnectionCode server_status_;
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl.cc b/components/sync/engine_impl/sync_encryption_handler_impl.cc index 6fb401c..4efc72b 100644 --- a/components/sync/engine_impl/sync_encryption_handler_impl.cc +++ b/components/sync/engine_impl/sync_encryption_handler_impl.cc
@@ -73,6 +73,19 @@ MIGRATION_STATE_SIZE, }; +// Enumeration of possible values for a key derivation method (including a +// special value of "not set"). Used in UMA metrics. Do not re-order or delete +// these entries; they are used in a UMA histogram. Please edit +// SyncCustomPassphraseKeyDerivationMethodState in enums.xml if a value is +// added. +enum class KeyDerivationMethodStateForMetrics { + NOT_SET = 0, + UNSUPPORTED = 1, + PBKDF2_HMAC_SHA1_1003 = 2, + SCRYPT_8192_8_11 = 3, + kMaxValue = SCRYPT_8192_8_11 +}; + // The new passphrase state is sufficient to determine whether a nigori node // is migrated to support keystore encryption. In addition though, we also // want to verify the conditions for proper keystore encryption functionality. @@ -252,6 +265,24 @@ } } +KeyDerivationMethodStateForMetrics GetKeyDerivationMethodStateForMetrics( + const base::Optional<KeyDerivationParams>& key_derivation_params) { + if (!key_derivation_params.has_value()) { + return KeyDerivationMethodStateForMetrics::NOT_SET; + } + switch (key_derivation_params.value().method()) { + case KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003: + return KeyDerivationMethodStateForMetrics::PBKDF2_HMAC_SHA1_1003; + case KeyDerivationMethod::SCRYPT_8192_8_11: + return KeyDerivationMethodStateForMetrics::SCRYPT_8192_8_11; + case KeyDerivationMethod::UNSUPPORTED: + return KeyDerivationMethodStateForMetrics::UNSUPPORTED; + } + + NOTREACHED(); + return KeyDerivationMethodStateForMetrics::UNSUPPORTED; +} + // The custom passphrase key derivation method in Nigori can be unspecified // (which means that PBKDF2 was implicitly used). In those cases, we want to set // it explicitly to PBKDF2. This function checks whether this needs to be done. @@ -329,10 +360,15 @@ WriteEncryptionStateToNigori(&trans); } - UMA_HISTOGRAM_ENUMERATION( - "Sync.PassphraseType", - static_cast<unsigned>(GetPassphraseType(trans.GetWrappedTrans())), - static_cast<unsigned>(PassphraseType::PASSPHRASE_TYPE_SIZE)); + PassphraseType passphrase_type = GetPassphraseType(trans.GetWrappedTrans()); + UMA_HISTOGRAM_ENUMERATION("Sync.PassphraseType", passphrase_type, + PassphraseType::PASSPHRASE_TYPE_SIZE); + if (passphrase_type == PassphraseType::CUSTOM_PASSPHRASE) { + UMA_HISTOGRAM_ENUMERATION( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup", + GetKeyDerivationMethodStateForMetrics( + custom_passphrase_key_derivation_params_)); + } bool has_pending_keys = UnlockVault(trans.GetWrappedTrans()).cryptographer.has_pending_keys(); @@ -1295,6 +1331,11 @@ DCHECK(IsNigoriMigratedToKeystore(nigori_node->GetNigoriSpecifics())); KeyDerivationParams key_derivation_params = CreateKeyDerivationParamsForCustomPassphrase(random_salt_generator_); + + UMA_HISTOGRAM_ENUMERATION( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnNewPassphrase", + GetKeyDerivationMethodStateForMetrics(key_derivation_params)); + KeyParams key_params = {key_derivation_params, passphrase}; if (GetPassphraseType(trans->GetWrappedTrans()) != @@ -1392,6 +1433,15 @@ DVLOG(1) << "Explicit passphrase accepted for decryption."; cryptographer->GetBootstrapToken(&bootstrap_token); success = true; + + if (passphrase_type == PassphraseType::CUSTOM_PASSPHRASE) { + DCHECK(custom_passphrase_key_derivation_params_.has_value()); + UMA_HISTOGRAM_ENUMERATION( + "Sync.Crypto." + "CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption", + GetKeyDerivationMethodStateForMetrics( + custom_passphrase_key_derivation_params_)); + } } else { DVLOG(1) << "Explicit passphrase failed to decrypt."; success = false;
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc index 3a289b80d..4f4d0ee 100644 --- a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc +++ b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc
@@ -13,6 +13,7 @@ #include "base/json/json_string_value_serializer.h" #include "base/optional.h" #include "base/run_loop.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" #include "components/sync/base/fake_encryptor.h" @@ -55,6 +56,13 @@ static const ::google::protobuf::int32 kUnsupportedKeyDerivationMethod = 12345; static const char kScryptSalt[] = "Salt string used for scrypt"; +enum class ExpectedKeyDerivationMethodStateForMetrics { + NOT_SET = 0, + UNSUPPORTED = 1, + PBKDF2_HMAC_SHA1_1003 = 2, + SCRYPT_8192_8_11 = 3 +}; + class SyncEncryptionHandlerObserverMock : public SyncEncryptionHandler::Observer { public: @@ -2617,6 +2625,80 @@ } TEST_F(SyncEncryptionHandlerImplTest, + InitShouldReportPbkdf2InHistogramWhenPbkdf2Persisted) { + KeyParams custom_key = { + KeyDerivationParams::CreateForPbkdf2("localhost", "dummy"), + kCustomPassphrase}; + GetCryptographer()->AddKey(custom_key); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + InitCustomPassMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003, + kCustomPassphrase, /*key_derivation_salt=*/base::nullopt); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup", + /*sample=*/ + ExpectedKeyDerivationMethodStateForMetrics::PBKDF2_HMAC_SHA1_1003, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, + InitShouldReportPbkdf2InHistogramWhenUnspecifiedKeyMethodPersisted) { + KeyParams custom_key = { + KeyDerivationParams::CreateForPbkdf2("localhost", "dummy"), + kCustomPassphrase}; + GetCryptographer()->AddKey(custom_key); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + InitCustomPassMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::UNSPECIFIED, + kCustomPassphrase, /*key_derivation_salt=*/base::nullopt); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup", + /*sample=*/ + ExpectedKeyDerivationMethodStateForMetrics::PBKDF2_HMAC_SHA1_1003, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, + InitShouldReportScryptInHistogramWhenScryptPersisted) { + KeyParams custom_key = {KeyDerivationParams::CreateForScrypt(kScryptSalt), + kCustomPassphrase}; + GetCryptographer()->AddKey(custom_key); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + InitCustomPassMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11, + kCustomPassphrase, /*key_derivation_salt=*/kScryptSalt); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup", + /*sample=*/ExpectedKeyDerivationMethodStateForMetrics::SCRYPT_8192_8_11, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, + InitShouldNotReportKeyMethodInHistogramIfNotCustomPassphrase) { + TearDown(); + test_user_share_.SetUp(); + SetUpEncryption(); + SetupKeystoreKeys({kRawKeystoreKey}); + + base::HistogramTester histogram_tester; + InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey, + kKeystoreKey); + + histogram_tester.ExpectTotalCount( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup", + /*count=*/0); +} + +TEST_F(SyncEncryptionHandlerImplTest, SetEncryptionPassphraseShouldSetPbkdf2InNigoriIfScryptForNewDisabled) { SetScryptFeaturesState(/*force_disabled=*/false, /*use_for_new_passphrases=*/false); @@ -2655,6 +2737,28 @@ GetCryptographer()->GetDefaultNigoriKeyData()); } +TEST_F(SyncEncryptionHandlerImplTest, + SetEncryptionPassphraseShouldReportPbkdf2InHistogramWhenPbkdf2Used) { + SetScryptFeaturesState(/*force_disabled=*/false, + /*use_for_new_passphrases=*/false); + TearDown(); + test_user_share_.SetUp(); + SetUpEncryption(); + SetupKeystoreKeys({kRawKeystoreKey}); + InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey, + kKeystoreKey); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnNewPassphrase", + /*sample=*/ + ExpectedKeyDerivationMethodStateForMetrics::PBKDF2_HMAC_SHA1_1003, + /*count=*/1); +} + // Regardless of the state of the "scrypt for new passphrases" feature, turning // on the "force-disable scrypt" should lead to using PBKDF2. TEST_F(SyncEncryptionHandlerImplTest, @@ -2742,6 +2846,27 @@ } TEST_F(SyncEncryptionHandlerImplTest, + SetEncryptionPassphraseShouldReportScryptInHistogramWhenScryptUsed) { + SetScryptFeaturesState(/*force_disabled=*/false, + /*use_for_new_passphrases=*/true); + TearDown(); + test_user_share_.SetUp(); + SetUpEncryption(); + SetupKeystoreKeys({kRawKeystoreKey}); + InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey, + kKeystoreKey); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnNewPassphrase", + /*sample=*/ExpectedKeyDerivationMethodStateForMetrics::SCRYPT_8192_8_11, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, SetDecryptionPassphraseShouldUsePbkdf2WhenUnspecifiedInNigori) { InitAndVerifyCustomPassphraseMigratedNigori( /* migration_time = */ 1, sync_pb::NigoriSpecifics::UNSPECIFIED, @@ -2839,6 +2964,58 @@ } TEST_F(SyncEncryptionHandlerImplTest, + SetDecryptionPassphraseShouldReportPersistedPbkdf2InHistogramOnSuccess) { + InitAndVerifyCustomPassphraseMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003, + kCustomPassphrase, /*key_derivation_salt=*/base::nullopt); + GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag()); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + encryption_handler()->SetDecryptionPassphrase(kCustomPassphrase); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption", + /*sample=*/ + ExpectedKeyDerivationMethodStateForMetrics::PBKDF2_HMAC_SHA1_1003, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, + SetDecryptionPassphraseShouldReportPersistedScryptInHistogramOnSuccess) { + InitAndVerifyCustomPassphraseMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11, + kCustomPassphrase, /*key_derivation_salt=*/kScryptSalt); + GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag()); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + encryption_handler()->SetDecryptionPassphrase(kCustomPassphrase); + + histogram_tester.ExpectUniqueSample( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption", + /*sample=*/ExpectedKeyDerivationMethodStateForMetrics::SCRYPT_8192_8_11, + /*count=*/1); +} + +TEST_F(SyncEncryptionHandlerImplTest, + SetDecryptionPassphraseShouldNotReportKeyMethodInHistogramOnFailure) { + InitAndVerifyCustomPassphraseMigratedNigori( + /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11, + kCustomPassphrase, /*key_derivation_salt=*/kScryptSalt); + GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag()); + + IgnoreAllObserverCalls(); + base::HistogramTester histogram_tester; + encryption_handler()->SetDecryptionPassphrase( + "Invalid passphrase, not the same as kCustomPassphrase"); + + histogram_tester.ExpectTotalCount( + "Sync.Crypto.CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption", + /*count=*/0); +} + +TEST_F(SyncEncryptionHandlerImplTest, ApplyNigoriUpdateShouldPassPbkdf2ToObserverWhenUnspecified) { TearDown(); test_user_share_.SetUp();
diff --git a/components/sync/model/entity_data.cc b/components/sync/model/entity_data.cc index 7d0c2c2..090f264 100644 --- a/components/sync/model/entity_data.cc +++ b/components/sync/model/entity_data.cc
@@ -101,6 +101,11 @@ dict->SetString(base::ToUpperASCII(#value), transform(value)); std::unique_ptr<base::DictionaryValue> EntityData::ToDictionaryValue() { + // This is used when debugging at sync-internals page. The code in + // sync_node_browser.js is expecing certain fields names. e.g. CTIME, MTIME, + // and IS_DIR. + base::Time ctime = creation_time; + base::Time mtime = modification_time; std::unique_ptr<base::DictionaryValue> dict = std::make_unique<base::DictionaryValue>(); dict->Set("SPECIFICS", EntitySpecificsToValue(specifics)); @@ -109,10 +114,10 @@ ADD_TO_DICT(dict, server_defined_unique_tag); ADD_TO_DICT(dict, non_unique_name); ADD_TO_DICT(dict, parent_id); - ADD_TO_DICT_WITH_TRANSFORM(dict, creation_time, GetTimeDebugString); - ADD_TO_DICT_WITH_TRANSFORM(dict, modification_time, GetTimeDebugString); + ADD_TO_DICT_WITH_TRANSFORM(dict, ctime, GetTimeDebugString); + ADD_TO_DICT_WITH_TRANSFORM(dict, mtime, GetTimeDebugString); ADD_TO_DICT_WITH_TRANSFORM(dict, unique_position, UniquePositionToString); - dict->SetBoolean("IS_FOLDER", is_folder); + dict->SetBoolean("IS_DIR", is_folder); return dict; }
diff --git a/components/sync/test/engine/mock_connection_manager.cc b/components/sync/test/engine/mock_connection_manager.cc index 481fb7195..48ed2c5 100644 --- a/components/sync/test/engine/mock_connection_manager.cc +++ b/components/sync/test/engine/mock_connection_manager.cc
@@ -118,7 +118,7 @@ if (auth_token != kValidAuthToken) { // Simulate server-side auth failure. params->response.server_status = HttpResponse::SYNC_AUTH_ERROR; - InvalidateAndClearAuthToken(); + ClearAuthToken(); } if (--countdown_to_postbuffer_fail_ == 0) {
diff --git a/components/sync/test/engine/mock_connection_manager.h b/components/sync/test/engine/mock_connection_manager.h index b10f8cc..2ac6bbb8 100644 --- a/components/sync/test/engine/mock_connection_manager.h +++ b/components/sync/test/engine/mock_connection_manager.h
@@ -268,7 +268,7 @@ // Adds a new progress marker to the last update. sync_pb::DataTypeProgressMarker* AddUpdateProgressMarker(); - void ResetAuthToken() { InvalidateAndClearAuthToken(); } + void ResetAuthToken() { ClearAuthToken(); } private: sync_pb::SyncEntity* AddUpdateFull(syncable::Id id,
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc index 13c5de8..9db87793 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -31,12 +31,12 @@ void BookmarkModelObserverImpl::BookmarkModelLoaded( bookmarks::BookmarkModel* model, bool ids_reassigned) { - NOTIMPLEMENTED(); + // This class isn't responsible for any loading-related logic. } void BookmarkModelObserverImpl::BookmarkModelBeingDeleted( bookmarks::BookmarkModel* model) { - NOTIMPLEMENTED(); + // This class isn't responsible for any deletion-related logic. } void BookmarkModelObserverImpl::BookmarkNodeMoved( @@ -129,10 +129,25 @@ DCHECK(bookmark_tracker_->GetEntityForBookmarkNode(node) == nullptr); } +void BookmarkModelObserverImpl::OnWillRemoveAllUserBookmarks( + bookmarks::BookmarkModel* model) { + const bookmarks::BookmarkNode* root_node = model->root_node(); + for (int i = 0; i < root_node->child_count(); ++i) { + const bookmarks::BookmarkNode* permanent_node = root_node->GetChild(i); + for (int j = permanent_node->child_count() - 1; j >= 0; --j) { + if (!model->client()->CanSyncNode(permanent_node->GetChild(j))) { + continue; + } + ProcessDelete(permanent_node, permanent_node->GetChild(j)); + } + } + nudge_for_commit_closure_.Run(); +} + void BookmarkModelObserverImpl::BookmarkAllUserNodesRemoved( bookmarks::BookmarkModel* model, const std::set<GURL>& removed_urls) { - NOTIMPLEMENTED(); + // All the work should have already been done in OnWillRemoveAllUserBookmarks. } void BookmarkModelObserverImpl::BookmarkNodeChanged(
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.h b/components/sync_bookmarks/bookmark_model_observer_impl.h index ef5ecc7..e40fae0 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl.h +++ b/components/sync_bookmarks/bookmark_model_observer_impl.h
@@ -53,6 +53,7 @@ int old_index, const bookmarks::BookmarkNode* node, const std::set<GURL>& removed_urls) override; + void OnWillRemoveAllUserBookmarks(bookmarks::BookmarkModel* model) override; void BookmarkAllUserNodesRemoved(bookmarks::BookmarkModel* model, const std::set<GURL>& removed_urls) override; void BookmarkNodeChanged(bookmarks::BookmarkModel* model,
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index c0cba76..ee29ffc 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -7,21 +7,25 @@ #include <utility> #include "base/callback.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/browser/bookmark_utils.h" #include "components/sync/base/data_type_histogram.h" #include "components/sync/base/model_type.h" +#include "components/sync/base/time.h" #include "components/sync/engine/commit_queue.h" #include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/model_type_processor_proxy.h" #include "components/sync/model/data_type_activation_request.h" #include "components/sync/protocol/bookmark_model_metadata.pb.h" +#include "components/sync/protocol/proto_value_conversions.h" #include "components/sync_bookmarks/bookmark_local_changes_builder.h" #include "components/sync_bookmarks/bookmark_model_merger.h" #include "components/sync_bookmarks/bookmark_model_observer_impl.h" #include "components/sync_bookmarks/bookmark_remote_updates_handler.h" +#include "components/sync_bookmarks/bookmark_specifics_conversions.h" #include "components/undo/bookmark_undo_utils.h" namespace sync_bookmarks { @@ -68,6 +72,21 @@ DISALLOW_COPY_AND_ASSIGN(ScopedRemoteUpdateBookmarks); }; +std::string ComputeServerDefinedUniqueTagForDebugging( + const bookmarks::BookmarkNode* node, + bookmarks::BookmarkModel* model) { + if (node == model->bookmark_bar_node()) { + return "bookmark_bar"; + } + if (node == model->other_node()) { + return "other_bookmarks"; + } + if (node == model->mobile_node()) { + return "synced_bookmarks"; + } + return ""; +} + } // namespace BookmarkModelTypeProcessor::BookmarkModelTypeProcessor( @@ -321,8 +340,34 @@ void BookmarkModelTypeProcessor::OnSyncStopping( syncer::SyncStopMetadataFate metadata_fate) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Disabling sync for a type shouldn't happen before the model is ready to + // sync and metadata are tracked. + DCHECK(bookmark_tracker_); + DCHECK(bookmark_model_); + DCHECK(bookmark_model_observer_); + DCHECK(!start_callback_); + cache_guid_.clear(); - NOTIMPLEMENTED(); + worker_.reset(); + + switch (metadata_fate) { + case syncer::KEEP_METADATA: { + break; + } + + case syncer::CLEAR_METADATA: { + // Stop observing local changes. We'll start observing local changes again + // when Sync is (re)started in StartTrackingMetadata(). + bookmark_model_->RemoveObserver(bookmark_model_observer_.get()); + bookmark_model_observer_.reset(); + bookmark_tracker_.reset(); + schedule_save_closure_.Run(); + break; + } + } + + // Do not let any delayed callbacks to be called. + weak_ptr_factory_.InvalidateWeakPtrs(); } void BookmarkModelTypeProcessor::NudgeForCommitIfNeeded() { @@ -354,7 +399,96 @@ void BookmarkModelTypeProcessor::GetAllNodesForDebugging( AllNodesCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - NOTIMPLEMENTED(); + auto all_nodes = std::make_unique<base::ListValue>(); + // Create a permanent folder since sync server no longer create root folders, + // and USS won't migrate root folders from directory, we create root folders. + auto root_node = std::make_unique<base::DictionaryValue>(); + // Function isTypeRootNode in sync_node_browser.js use PARENT_ID and + // UNIQUE_SERVER_TAG to check if the node is root node. isChildOf in + // sync_node_browser.js uses modelType to check if root node is parent of real + // data node. NON_UNIQUE_NAME will be the name of node to display. + root_node->SetString("ID", "BOOKMARKS_ROOT"); + root_node->SetString("PARENT_ID", "r"); + root_node->SetString("UNIQUE_SERVER_TAG", "Bookmarks"); + root_node->SetBoolean("IS_DIR", true); + root_node->SetString("modelType", "Bookmarks"); + root_node->SetString("NON_UNIQUE_NAME", "Bookmarks"); + all_nodes->Append(std::move(root_node)); + + const bookmarks::BookmarkNode* model_root_node = bookmark_model_->root_node(); + for (int i = 0; i < model_root_node->child_count(); ++i) { + const bookmarks::BookmarkNode* model_permanent_node = + model_root_node->GetChild(i); + AppendNodeAndChildrenForDebugging(model_permanent_node, i, all_nodes.get()); + } + + std::move(callback).Run(syncer::BOOKMARKS, std::move(all_nodes)); +} + +void BookmarkModelTypeProcessor::AppendNodeAndChildrenForDebugging( + const bookmarks::BookmarkNode* node, + int index, + base::ListValue* all_nodes) const { + const SyncedBookmarkTracker::Entity* entity = + bookmark_tracker_->GetEntityForBookmarkNode(node); + // Include only tracked nodes. Newly added nodes are tracked even before being + // sent to the server. Managed bookmarks (that are installed by a policy) + // aren't syncable and hence not tracked. In addition, Mobile Bookmarks folder + // is only synced after it's been created on the server. + if (!entity) { + return; + } + const sync_pb::EntityMetadata* metadata = entity->metadata(); + // Copy data to an EntityData object to reuse its conversion + // ToDictionaryValue() methods. + syncer::EntityData data; + data.id = metadata->server_id(); + data.creation_time = node->date_added(); + data.modification_time = + syncer::ProtoTimeToTime(metadata->modification_time()); + data.non_unique_name = base::UTF16ToUTF8(node->GetTitle()); + data.is_folder = node->is_folder(); + data.unique_position = metadata->unique_position(); + data.specifics = CreateSpecificsFromBookmarkNode(node, bookmark_model_); + if (node->is_permanent_node()) { + data.server_defined_unique_tag = + ComputeServerDefinedUniqueTagForDebugging(node, bookmark_model_); + // Set the parent to empty string to indicate it's parent of the root node + // for bookmarks. The code in sync_node_browser.js links nodes with the + // "modelType" when they are lacking a parent id. + data.parent_id = ""; + } else { + const bookmarks::BookmarkNode* parent = node->parent(); + const SyncedBookmarkTracker::Entity* parent_entity = + bookmark_tracker_->GetEntityForBookmarkNode(parent); + DCHECK(parent_entity); + data.parent_id = parent_entity->metadata()->server_id(); + } + + std::unique_ptr<base::DictionaryValue> data_dictionary = + data.ToDictionaryValue(); + // TODO(https://crbug.com/516866): Prepending the ID with an "s" is consistent + // with the implementation in ClientTagBasedModelTypeProcessor. Double check + // if this is actually needed and update both implementations if makes sense. + // Set ID value as in legacy directory-based implementation, "s" means server. + data_dictionary->SetString("ID", "s" + metadata->server_id()); + if (node->is_permanent_node()) { + // Hardcode the parent of permanent nodes. + data_dictionary->SetString("PARENT_ID", "BOOKMARKS_ROOT"); + data_dictionary->SetString("UNIQUE_SERVER_TAG", + data.server_defined_unique_tag); + } else { + data_dictionary->SetString("PARENT_ID", "s" + data.parent_id); + } + data_dictionary->SetInteger("LOCAL_EXTERNAL_ID", node->id()); + data_dictionary->SetInteger("positionIndex", index); + data_dictionary->Set("metadata", syncer::EntityMetadataToValue(*metadata)); + data_dictionary->SetString("modelType", "Bookmarks"); + all_nodes->Append(std::move(data_dictionary)); + + for (int i = 0; i < node->child_count(); ++i) { + AppendNodeAndChildrenForDebugging(node->GetChild(i), i, all_nodes); + } } void BookmarkModelTypeProcessor::GetStatusCountersForDebugging(
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index a8c9dfd4..66adbba 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -103,6 +103,15 @@ std::vector<NodeMetadataPair> nodes_metadata, std::unique_ptr<sync_pb::ModelTypeState> model_type_state); + // Creates a DictionaryValue for local and remote debugging information about + // |node| and appends it to |all_nodes|. It does the same for child nodes + // recursively. |index| is the index of |node| within its parent. |index| + // could computed from |node|, however it's much cheaper to pass from outside + // since we iterate over child nodes already in the calling sites. + void AppendNodeAndChildrenForDebugging(const bookmarks::BookmarkNode* node, + int index, + base::ListValue* all_nodes) const; + // Stores the start callback in between OnSyncStarting() and // ModelReadyToSync(). StartCallback start_callback_;
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc index 4c6971d..47e49206 100644 --- a/components/sync_sessions/session_sync_bridge_unittest.cc +++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -298,6 +298,10 @@ return tab; } + void CloseTab(int tab_id) { + window_getter_.CloseTab(SessionID::FromSerializedValue(tab_id)); + } + void SessionRestoreComplete() { window_getter_.SessionRestoreComplete(); } SessionSyncBridge* bridge() { return bridge_.get(); } @@ -873,6 +877,77 @@ /*tab_node_id=*/1, {"http://bar.com/"}))))); } +TEST_F(SessionSyncBridgeTest, ShouldRestoreLocalSessionWithFreedTab) { + const int kWindowId1 = 1000001; + const int kWindowId2 = 1000002; + const int kTabId1 = 1000003; + const int kTabId2 = 1000004; + const int kTabId3 = 1000005; + const int kTabId4 = 1000006; + // Zero is the first assigned tab node ID. + const int kTabNodeId1 = 0; + const int kTabNodeId2 = 1; + + AddWindow(kWindowId1); + TestSyncedTabDelegate* tab1 = AddTab(kWindowId1, "http://foo.com/", kTabId1); + AddTab(kWindowId1, "http://bar.com/", kTabId2); + + const std::string header_storage_key = + SessionStore::GetHeaderStorageKey(kLocalSessionTag); + const std::string tab_storage_key1 = + SessionStore::GetTabStorageKey(kLocalSessionTag, kTabNodeId1); + const std::string tab_storage_key2 = + SessionStore::GetTabStorageKey(kLocalSessionTag, kTabNodeId2); + + InitializeBridge(); + StartSyncing(); + + ASSERT_THAT(GetData(header_storage_key), + EntityDataHasSpecifics(MatchesHeader( + kLocalSessionTag, {kWindowId1}, {kTabId1, kTabId2}))); + + // Close |kTabId2| and force reassociation by navigating in the remaining open + // tab, leading to a freed tab entity. + CloseTab(kTabId2); + tab1->Navigate("http://baz.com/"); + + ASSERT_THAT(GetData(header_storage_key), + EntityDataHasSpecifics( + MatchesHeader(kLocalSessionTag, {kWindowId1}, {kTabId1}))); + + ShutdownBridge(); + ResetWindows(); + + // The browser gets restarted with a new initial tab, for example because the + // user chose "Continue where you left off". + AddWindow(kWindowId2); + AddTab(kWindowId2, "http://qux.com/", kTabId3); + + // Start the bridge again. + InitializeBridge(); + StartSyncing(); + + ASSERT_THAT(GetData(header_storage_key), + EntityDataHasSpecifics( + MatchesHeader(kLocalSessionTag, {kWindowId2}, {kTabId3}))); + + // |kTabNodeId1| should be free at this point. When a new tab is opened + // (|kTabId4|), it should be reused. + AddTab(kWindowId2, "http://quux.com/", kTabId4); + EXPECT_THAT( + GetAllData(), + UnorderedElementsAre( + Pair(header_storage_key, + EntityDataHasSpecifics(MatchesHeader( + kLocalSessionTag, {kWindowId2}, {kTabId3, kTabId4}))), + Pair(tab_storage_key2, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId2, kTabId3, + kTabNodeId2, {"http://qux.com/"}))), + Pair(tab_storage_key1, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId2, kTabId4, + kTabNodeId1, {"http://quux.com/"}))))); +} + TEST_F(SessionSyncBridgeTest, ShouldDisableSyncAndReenable) { const int kWindowId = 1000001; const int kTabId = 1000002;
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index c757b17..0655362f 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -330,8 +330,12 @@ session->synced_window_map.erase(window_pair.first); session->unmapped_windows.clear(); - for (const auto& tab_pair : session->unmapped_tabs) + for (const auto& tab_pair : session->unmapped_tabs) { session->synced_tab_map.erase(tab_pair.first); + + if (session_tag == local_session_tag_) + session->tab_node_pool.FreeTab(tab_pair.first); + } session->unmapped_tabs.clear(); } @@ -494,8 +498,6 @@ void SyncedSessionTracker::CleanupLocalTabs(std::set<int>* deleted_node_ids) { DCHECK(!local_session_tag_.empty()); TrackedSession* session = GetTrackedSession(local_session_tag_); - for (const auto& tab_pair : session->unmapped_tabs) - session->tab_node_pool.FreeTab(tab_pair.first); CleanupSessionImpl(local_session_tag_); session->tab_node_pool.CleanupTabNodes(deleted_node_ids); }
diff --git a/components/sync_sessions/synced_session_tracker.h b/components/sync_sessions/synced_session_tracker.h index fe67be5..8ee5ba7 100644 --- a/components/sync_sessions/synced_session_tracker.h +++ b/components/sync_sessions/synced_session_tracker.h
@@ -172,9 +172,9 @@ // Gets the session tag previously set with InitLocalSession(). const std::string& GetLocalSessionTag() const; - // Similar to CleanupForeignSession, but also marks any unmapped tabs as free - // in the tab node pool and fills |deleted_node_ids| with the set of locally - // free tab nodes to be deleted. + // Similar to CleanupSession() but also triggers garbage collection of free + // tab nodes and consequently fills |deleted_node_ids| with the set of + // locally free tab nodes to be deleted. void CleanupLocalTabs(std::set<int>* deleted_node_ids); // Returns the tab node ID for |tab_id| if an existing tab node was found, or @@ -264,7 +264,7 @@ SessionLookup lookup, bool exclude_local_session) const; - // Implementation of CleanupForeignSession/CleanupLocalTabs. + // Implementation of CleanupSession()/CleanupLocalTabs(). void CleanupSessionImpl(const std::string& session_tag); // The client of the sync sessions datatype.
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.cc b/components/sync_sessions/test_synced_window_delegates_getter.cc index 55c06bd..39915c6 100644 --- a/components/sync_sessions/test_synced_window_delegates_getter.cc +++ b/components/sync_sessions/test_synced_window_delegates_getter.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/stl_util.h" #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sync_sessions/synced_session.h" #include "components/sync_sessions/tab_node_pool.h" @@ -249,6 +250,13 @@ tab_delegates_[index] = delegate; } +void TestSyncedWindowDelegate::CloseTab(SessionID tab_id) { + base::EraseIf(tab_delegates_, + [tab_id](const std::pair<int, SyncedTabDelegate*>& entry) { + return entry.second->GetSessionId() == tab_id; + }); +} + void TestSyncedWindowDelegate::SetIsSessionRestoreInProgress(bool value) { is_session_restore_in_progress_ = value; } @@ -346,6 +354,14 @@ return tabs_.back().get(); } +void TestSyncedWindowDelegatesGetter::CloseTab(SessionID tab_id) { + for (auto& window : windows_) { + // CloseTab() will only take effect with the belonging window, the rest will + // simply ignore the call. + window->CloseTab(tab_id); + } +} + void TestSyncedWindowDelegatesGetter::SessionRestoreComplete() { for (auto& window : windows_) window->SetIsSessionRestoreInProgress(false);
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.h b/components/sync_sessions/test_synced_window_delegates_getter.h index eab3eac4..b125d8b 100644 --- a/components/sync_sessions/test_synced_window_delegates_getter.h +++ b/components/sync_sessions/test_synced_window_delegates_getter.h
@@ -122,6 +122,8 @@ // |delegate| must not be nullptr and must outlive this object. void OverrideTabAt(int index, SyncedTabDelegate* delegate); + void CloseTab(SessionID tab_id); + void SetIsSessionRestoreInProgress(bool value); // SyncedWindowDelegate overrides. @@ -143,8 +145,6 @@ const sync_pb::SessionWindow_BrowserType window_type_; std::map<int, SyncedTabDelegate*> tab_delegates_; - std::map<int, SyncedTabDelegate*> tab_overrides_; - std::map<int, SessionID> tab_id_overrides_; bool is_session_restore_in_progress_; DISALLOW_COPY_AND_ASSIGN(TestSyncedWindowDelegate); @@ -164,6 +164,7 @@ // TestSyncedTabDelegate (not owned). TestSyncedTabDelegate* AddTab(SessionID window_id, SessionID tab_id = SessionID::NewUnique()); + void CloseTab(SessionID tab_id); void SessionRestoreComplete(); LocalSessionEventRouter* router();
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn index a27ba6d..ddcc74f4 100644 --- a/components/tracing/BUILD.gn +++ b/components/tracing/BUILD.gn
@@ -50,6 +50,8 @@ "common/trace_startup_config.h", "common/trace_to_console.cc", "common/trace_to_console.h", + "common/tracing_sampler_profiler.cc", + "common/tracing_sampler_profiler.h", "common/tracing_switches.cc", "common/tracing_switches.h", "tracing_export.h", @@ -68,9 +70,11 @@ sources = [ "child/child_trace_message_filter_unittest.cc", "common/graphics_memory_dump_provider_android_unittest.cc", + "common/tracing_sampler_profiler_unittest.cc", ] deps = [ + ":startup_tracing", ":tracing", "//base/test:test_support", "//ipc",
diff --git a/components/tracing/common/tracing_sampler_profiler.cc b/components/tracing/common/tracing_sampler_profiler.cc new file mode 100644 index 0000000..1cd8b74 --- /dev/null +++ b/components/tracing/common/tracing_sampler_profiler.cc
@@ -0,0 +1,119 @@ +// 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/tracing/common/tracing_sampler_profiler.h" + +#include <cinttypes> + +#include "base/format_macros.h" +#include "base/no_destructor.h" +#include "base/profiler/stack_sampling_profiler.h" +#include "base/strings/stringprintf.h" +#include "base/trace_event/trace_event.h" +#include "base/trace_event/trace_log.h" + +namespace tracing { + +namespace { + +// This class will receive the sampling profiler stackframes and output them +// to the chrome trace via an event. +class TracingProfileBuilder + : public base::StackSamplingProfiler::ProfileBuilder { + public: + void RecordAnnotations() override {} + + void OnSampleCompleted( + std::vector<base::StackSamplingProfiler::Frame> frames) override { + if (frames.empty()) + return; + // Insert an event with the frames rendered as a string with the following + // format: + // offset - module [debugid] + // The offset is difference between the load module address and the + // frame address. + // + // Example: + // + // "7ffb3d439164 - win32u.dll [B3E4BE89CA7FB42A2AC1E1C475284CA11] + // 7ffb3f991b2d - USER32.dll [2103C0950C7DEC7F7AAA44348EDC1DDD1] + // 7ffaf3e26201 - chrome.dll [8767EB7E1C77DD10014E8152A34786B812] + // 7ffaf3e26008 - chrome.dll [8767EB7E1C77DD10014E8152A34786B812] + // 7ffaf3e25afe - chrome.dll [8767EB7E1C77DD10014E8152A34786B812] + // 7ffaf3e436e1 - chrome.dll [8767EB7E1C77DD10014E8152A34786B812] + // [...] " + std::string result; + for (const auto& frame : frames) { + base::StringAppendF( + &result, "0x%" PRIxPTR " - %s [%s]\n", + frame.instruction_pointer - frame.module.base_address, + frame.module.filename.BaseName().MaybeAsASCII().c_str(), + frame.module.id.c_str()); + } + + TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), + "StackCpuSampling", TRACE_EVENT_SCOPE_THREAD, "frames", + result); + } + + void OnProfileCompleted(base::TimeDelta profile_duration, + base::TimeDelta sampling_period) override {} +}; + +} // namespace + +TracingSamplerProfiler::TracingSamplerProfiler() + : sampled_thread_id_(base::PlatformThread::CurrentId()) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // Make sure tracing system notices profiler category. + TRACE_EVENT_WARMUP_CATEGORY(TRACE_DISABLED_BY_DEFAULT("cpu_profiler")); + + // If tracing is currently running, start the sample profiler. + bool is_already_enabled = + base::trace_event::TraceLog::GetInstance()->IsEnabled(); + base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this); + if (is_already_enabled) + OnTraceLogEnabled(); +} + +TracingSamplerProfiler::~TracingSamplerProfiler() { + base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this); +} + +void TracingSamplerProfiler::OnTraceLogEnabled() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_NE(sampled_thread_id_, base::kInvalidThreadId); + + // Ensure there was not an instance of the profiler already running. + if (profiler_.get()) + return; + + bool enabled; + TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), + &enabled); + if (!enabled) + return; + + base::StackSamplingProfiler::SamplingParams params; + params.samples_per_profile = std::numeric_limits<int>::max(); + params.sampling_interval = base::TimeDelta::FromMilliseconds(50); + + // Create and start the stack sampling profiler. + profiler_ = std::make_unique<base::StackSamplingProfiler>( + sampled_thread_id_, params, std::make_unique<TracingProfileBuilder>()); + profiler_->Start(); +} + +void TracingSamplerProfiler::OnTraceLogDisabled() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!profiler_.get()) + return; + // Stop and release the stack sampling profiler. + profiler_->Stop(); + profiler_.reset(); +} + +} // namespace tracing
diff --git a/components/tracing/common/tracing_sampler_profiler.h b/components/tracing/common/tracing_sampler_profiler.h new file mode 100644 index 0000000..aad845a --- /dev/null +++ b/components/tracing/common/tracing_sampler_profiler.h
@@ -0,0 +1,43 @@ +// 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_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_ +#define COMPONENTS_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_ + +#include "base/macros.h" +#include "base/sequence_checker.h" +#include "base/threading/platform_thread.h" +#include "base/trace_event/trace_log.h" +#include "components/tracing/tracing_export.h" + +namespace base { +class StackSamplingProfiler; +} + +namespace tracing { + +// This class is a bridge between the base stack sampling profiler and chrome +// tracing. It's listening to TraceLog enabled/disabled events and it's starting +// a stack profiler on the current thread if needed. +class TRACING_EXPORT TracingSamplerProfiler + : public base::trace_event::TraceLog::EnabledStateObserver { + public: + TracingSamplerProfiler(); + ~TracingSamplerProfiler() override; + + // trace_event::TraceLog::EnabledStateObserver implementation: + void OnTraceLogEnabled() override; + void OnTraceLogDisabled() override; + + private: + base::PlatformThreadId sampled_thread_id_; + std::unique_ptr<base::StackSamplingProfiler> profiler_; + SEQUENCE_CHECKER(sequence_checker_); + + DISALLOW_COPY_AND_ASSIGN(TracingSamplerProfiler); +}; + +} // namespace tracing + +#endif // COMPONENTS_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_
diff --git a/components/tracing/common/tracing_sampler_profiler_unittest.cc b/components/tracing/common/tracing_sampler_profiler_unittest.cc new file mode 100644 index 0000000..f8f32ac --- /dev/null +++ b/components/tracing/common/tracing_sampler_profiler_unittest.cc
@@ -0,0 +1,150 @@ +// 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/tracing/common/tracing_sampler_profiler.h" + +#include "base/at_exit.h" +#include "base/json/json_reader.h" +#include "base/memory/ref_counted_memory.h" +#include "base/profiler/stack_sampling_profiler.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "base/trace_event/trace_buffer.h" +#include "base/trace_event/trace_event.h" +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace tracing { +namespace { + +using base::trace_event::TraceLog; +using base::StackSamplingProfiler; + +class TracingSampleProfilerTest : public testing::Test { + public: + TracingSampleProfilerTest() : testing::Test() {} + ~TracingSampleProfilerTest() override {} + + void SetUp() override { + TraceLog* tracelog = TraceLog::GetInstance(); + ASSERT_TRUE(tracelog); + ASSERT_FALSE(tracelog->IsEnabled()); + trace_buffer_.SetOutputCallback(json_output_.GetCallback()); + } + + void TearDown() override { + EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); + + // Be sure there is no pending/running tasks. + scoped_task_environment_.RunUntilIdle(); + } + + void BeginTrace() { + base::trace_event::TraceConfig config( + TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), + base::trace_event::RECORD_UNTIL_FULL); + TraceLog::GetInstance()->SetEnabled(config, TraceLog::RECORDING_MODE); + EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); + } + + void WaitForEvents() { + base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200)); + } + + size_t events_received_count() { return events_received_count_; } + + // Returns whether of not the sampler profiling is able to unwind the stack + // on this platform. + bool IsStackUnwindingSupported() { +#if defined(OS_MACOSX) || defined(OS_WIN) && defined(_WIN64) + return true; +#else + return false; +#endif + } + + static void TraceDataCallback( + const base::RepeatingCallback<void()>& callback, + std::string* output, + const scoped_refptr<base::RefCountedString>& json_events_str, + bool has_more_events) { + if (output->size() > 1 && !json_events_str->data().empty()) { + output->append(","); + } + output->append(json_events_str->data()); + if (!has_more_events) { + callback.Run(); + } + } + + void EndTracing() { + std::string json_data = "["; + TraceLog::GetInstance()->SetDisabled(); + base::RunLoop run_loop; + TraceLog::GetInstance()->Flush(base::BindRepeating( + &TracingSampleProfilerTest::TraceDataCallback, run_loop.QuitClosure(), + base::Unretained(&json_data))); + run_loop.Run(); + json_data.append("]"); + + std::string error_msg; + std::unique_ptr<base::Value> trace_data = + base::JSONReader::ReadAndReturnError(json_data, 0, nullptr, &error_msg); + CHECK(trace_data) << "JSON parsing failed (" << error_msg << ")"; + + base::ListValue* list; + CHECK(trace_data->GetAsList(&list)); + for (size_t i = 0; i < list->GetSize(); i++) { + base::Value* item = nullptr; + if (list->Get(i, &item)) { + base::DictionaryValue* dict; + CHECK(item->GetAsDictionary(&dict)); + std::string name; + CHECK(dict->GetString("name", &name)); + if (name == "StackCpuSampling") + events_received_count_++; + } + } + } + + private: + base::test::ScopedTaskEnvironment scoped_task_environment_; + + // We want our singleton torn down after each test. + base::ShadowingAtExitManager at_exit_manager_; + base::trace_event::TraceResultBuffer trace_buffer_; + base::trace_event::TraceResultBuffer::SimpleOutput json_output_; + + // Number of events received. + size_t events_received_count_ = 0; + + DISALLOW_COPY_AND_ASSIGN(TracingSampleProfilerTest); +}; + +} // namespace + +TEST_F(TracingSampleProfilerTest, OnSampleCompleted) { + TracingSamplerProfiler profiler; + BeginTrace(); + WaitForEvents(); + EndTracing(); + if (IsStackUnwindingSupported()) + EXPECT_GT(events_received_count(), 0U); + else + EXPECT_EQ(events_received_count(), 0U); +} + +TEST_F(TracingSampleProfilerTest, JoinRunningTracing) { + BeginTrace(); + TracingSamplerProfiler profiler; + WaitForEvents(); + EndTracing(); + if (IsStackUnwindingSupported()) + EXPECT_GT(events_received_count(), 0U); + else + EXPECT_EQ(events_received_count(), 0U); +} + +} // namespace tracing
diff --git a/components/translate/core/browser/translate_accept_languages.h b/components/translate/core/browser/translate_accept_languages.h index b296c52d..65a71c0 100644 --- a/components/translate/core/browser/translate_accept_languages.h +++ b/components/translate/core/browser/translate_accept_languages.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_change_registrar.h" class PrefService; @@ -17,13 +18,13 @@ // TranslateAcceptLanguages tracks the value of the "Accept-Language" HTTP // header. -class TranslateAcceptLanguages { +class TranslateAcceptLanguages : public KeyedService { public: // |accept_languages_pref| is the path to the preference storing the accept // languages. TranslateAcceptLanguages(PrefService* prefs, const char* accept_languages_pref); - virtual ~TranslateAcceptLanguages(); + ~TranslateAcceptLanguages() override; // Returns true if |language| is available as Accept-Languages. |language| // will be converted if it has the synonym of accept language.
diff --git a/components/ukm/BUILD.gn b/components/ukm/BUILD.gn index 6bb8424..44d801a0 100644 --- a/components/ukm/BUILD.gn +++ b/components/ukm/BUILD.gn
@@ -98,6 +98,7 @@ "//components/sync", "//components/sync:test_support_driver", "//components/sync_preferences:test_support", + "//components/unified_consent:test_support", "//components/variations", "//net:test_support", "//services/metrics/public/cpp:ukm_builders",
diff --git a/components/ukm/observers/sync_disable_observer.cc b/components/ukm/observers/sync_disable_observer.cc index 820dbb3c..fb364a8 100644 --- a/components/ukm/observers/sync_disable_observer.cc +++ b/components/ukm/observers/sync_disable_observer.cc
@@ -9,6 +9,7 @@ #include "base/stl_util.h" #include "components/sync/driver/sync_token_status.h" #include "components/sync/engine/connection_status.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/url_keyed_data_collection_consent_helper.h" using unified_consent::UrlKeyedDataCollectionConsentHelper; @@ -92,12 +93,11 @@ void SyncDisableObserver::ObserveServiceForSyncDisables( syncer::SyncService* sync_service, - PrefService* prefs, - bool is_unified_consent_enabled) { + PrefService* prefs) { std::unique_ptr<UrlKeyedDataCollectionConsentHelper> consent_helper; - if (is_unified_consent_enabled) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { consent_helper = UrlKeyedDataCollectionConsentHelper:: - NewAnonymizedDataCollectionConsentHelper(true, prefs, sync_service); + NewAnonymizedDataCollectionConsentHelper(prefs, sync_service); } SyncState state = GetSyncState(sync_service, consent_helper.get());
diff --git a/components/ukm/observers/sync_disable_observer.h b/components/ukm/observers/sync_disable_observer.h index e051443..e70f25a 100644 --- a/components/ukm/observers/sync_disable_observer.h +++ b/components/ukm/observers/sync_disable_observer.h
@@ -32,8 +32,7 @@ // Starts observing a service for sync disables. void ObserveServiceForSyncDisables(syncer::SyncService* sync_service, - PrefService* pref_service, - bool is_unified_consent_enabled); + PrefService* pref_service); // Returns true iff all sync states alllow UKM to be enabled. This means that // for all profiles:
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc index 5208ebb..cf26268 100644 --- a/components/ukm/observers/sync_disable_observer_unittest.cc +++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -10,9 +10,13 @@ #include "components/sync/engine/connection_status.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/unified_consent/pref_names.h" +#include "components/unified_consent/scoped_unified_consent.h" #include "components/unified_consent/unified_consent_service.h" #include "testing/gtest/include/gtest/gtest.h" +using unified_consent::ScopedUnifiedConsent; +using unified_consent::UnifiedConsentFeatureState; + namespace ukm { namespace { @@ -119,6 +123,7 @@ void SetUrlKeyedAnonymizedDataCollectionEnabled(PrefService* prefs, bool enabled) { + DCHECK(unified_consent::IsUnifiedConsentFeatureEnabled()); prefs->SetBoolean( unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, enabled); @@ -138,16 +143,20 @@ } TEST_F(SyncDisableObserverTest, OneEnabled_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync; sync.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_TRUE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, OneEnabled_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); sync_preferences::TestingPrefServiceSyncable prefs; RegisterUrlKeyedAnonymizedDataCollectionPref(prefs); SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs, true); @@ -156,7 +165,7 @@ for (bool history_enabled : {true, false}) { TestSyncDisableObserver observer; sync.SetStatus(has_passphrase, history_enabled); - observer.ObserveServiceForSyncDisables(&sync, &prefs, true); + observer.ObserveServiceForSyncDisables(&sync, &prefs); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_TRUE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); @@ -165,30 +174,36 @@ } TEST_F(SyncDisableObserverTest, Passphrased_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); MockSyncService sync; sync.SetStatus(true, true); TestSyncDisableObserver observer; - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, HistoryDisabled_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync; sync.SetStatus(false, false); - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, AuthError_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync; sync.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_TRUE(observer.SyncStateAllowsUkm()); sync.SetConnectionStatus(syncer::CONNECTION_AUTH_ERROR); EXPECT_FALSE(observer.SyncStateAllowsUkm()); @@ -197,28 +212,32 @@ } TEST_F(SyncDisableObserverTest, MixedProfiles1_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync1; sync1.SetStatus(false, false); - observer.ObserveServiceForSyncDisables(&sync1, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync1, nullptr); MockSyncService sync2; sync2.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync2, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync2, nullptr); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, MixedProfiles2_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync1; sync1.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync1, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync1, nullptr); EXPECT_TRUE(observer.ResetNotified()); MockSyncService sync2; sync2.SetStatus(false, false); - observer.ObserveServiceForSyncDisables(&sync2, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync2, nullptr); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_TRUE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); @@ -228,44 +247,69 @@ EXPECT_FALSE(observer.ResetPurged()); } +TEST_F(SyncDisableObserverTest, MixedProfiles_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); + sync_preferences::TestingPrefServiceSyncable prefs1; + RegisterUrlKeyedAnonymizedDataCollectionPref(prefs1); + sync_preferences::TestingPrefServiceSyncable prefs2; + RegisterUrlKeyedAnonymizedDataCollectionPref(prefs2); + + TestSyncDisableObserver observer; + MockSyncService sync1; + SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs1, false); + observer.ObserveServiceForSyncDisables(&sync1, &prefs1); + MockSyncService sync2; + SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs2, true); + observer.ObserveServiceForSyncDisables(&sync2, &prefs2); + EXPECT_FALSE(observer.SyncStateAllowsUkm()); + EXPECT_FALSE(observer.ResetNotified()); + EXPECT_FALSE(observer.ResetPurged()); +} + TEST_F(SyncDisableObserverTest, TwoEnabled_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync1; sync1.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync1, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync1, nullptr); EXPECT_TRUE(observer.ResetNotified()); MockSyncService sync2; sync2.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync2, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync2, nullptr); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, TwoEnabled_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); + sync_preferences::TestingPrefServiceSyncable prefs1; + RegisterUrlKeyedAnonymizedDataCollectionPref(prefs1); sync_preferences::TestingPrefServiceSyncable prefs2; RegisterUrlKeyedAnonymizedDataCollectionPref(prefs2); + TestSyncDisableObserver observer; - - // First profile has sync enabled. MockSyncService sync1; - sync1.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync1, nullptr, false); + SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs1, true); + observer.ObserveServiceForSyncDisables(&sync1, &prefs1); EXPECT_TRUE(observer.ResetNotified()); - - // Second profile has URL-keyed anonymized data collection enabled. MockSyncService sync2; SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs2, true); - observer.ObserveServiceForSyncDisables(&sync2, &prefs2, true); + observer.ObserveServiceForSyncDisables(&sync2, &prefs2); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); } TEST_F(SyncDisableObserverTest, OneAddRemove_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync; - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); @@ -280,11 +324,13 @@ } TEST_F(SyncDisableObserverTest, OneAddRemove_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); sync_preferences::TestingPrefServiceSyncable prefs; RegisterUrlKeyedAnonymizedDataCollectionPref(prefs); TestSyncDisableObserver observer; MockSyncService sync; - observer.ObserveServiceForSyncDisables(&sync, &prefs, true); + observer.ObserveServiceForSyncDisables(&sync, &prefs); EXPECT_FALSE(observer.SyncStateAllowsUkm()); EXPECT_FALSE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); @@ -299,10 +345,12 @@ } TEST_F(SyncDisableObserverTest, PurgeOnDisable_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); TestSyncDisableObserver observer; MockSyncService sync; sync.SetStatus(false, true); - observer.ObserveServiceForSyncDisables(&sync, nullptr, false); + observer.ObserveServiceForSyncDisables(&sync, nullptr); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_TRUE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged()); @@ -317,12 +365,15 @@ } TEST_F(SyncDisableObserverTest, PurgeOnDisable_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); + sync_preferences::TestingPrefServiceSyncable prefs; RegisterUrlKeyedAnonymizedDataCollectionPref(prefs); TestSyncDisableObserver observer; MockSyncService sync; SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs, true); - observer.ObserveServiceForSyncDisables(&sync, &prefs, true); + observer.ObserveServiceForSyncDisables(&sync, &prefs); EXPECT_TRUE(observer.SyncStateAllowsUkm()); EXPECT_TRUE(observer.ResetNotified()); EXPECT_FALSE(observer.ResetPurged());
diff --git a/components/unified_consent/feature.cc b/components/unified_consent/feature.cc index edb7dc0..dfa49e9b 100644 --- a/components/unified_consent/feature.cc +++ b/components/unified_consent/feature.cc
@@ -17,7 +17,7 @@ const base::Feature kForceUnifiedConsentBump{"ForceUnifiedConsentBump", base::FEATURE_DISABLED_BY_DEFAULT}; -namespace internal { +namespace { UnifiedConsentFeatureState GetUnifiedConsentFeatureState() { // Unified consent requires user consent to be recorded via its own // sync model type.The reason is that when unified consent is enabled, @@ -35,6 +35,16 @@ return show_bump.empty() ? UnifiedConsentFeatureState::kEnabledNoBump : UnifiedConsentFeatureState::kEnabledWithBump; } -} // namespace internal +} // namespace + +bool IsUnifiedConsentFeatureEnabled() { + return GetUnifiedConsentFeatureState() != + UnifiedConsentFeatureState::kDisabled; +} + +bool IsUnifiedConsentFeatureWithBumpEnabled() { + return GetUnifiedConsentFeatureState() == + UnifiedConsentFeatureState::kEnabledWithBump; +} } // namespace unified_consent
diff --git a/components/unified_consent/feature.h b/components/unified_consent/feature.h index b42de35..21bd42d 100644 --- a/components/unified_consent/feature.h +++ b/components/unified_consent/feature.h
@@ -24,15 +24,14 @@ extern const char kUnifiedConsentShowBumpParameter[]; extern const base::Feature kForceUnifiedConsentBump; -namespace internal { -// Returns the state of the "Unified Consent" feature. -// -// WARNING: Do not call this method directly to check whether unfied consent -// is enabled. Please use the per-platfome functions defined in -// * chrome/browser/signin/unified_consent_helper.h -// * ios/chrome/browser/unified_consent/feature.h -unified_consent::UnifiedConsentFeatureState GetUnifiedConsentFeatureState(); -} // namespace internal +// Returns true if the unified consent feature state is kEnabledNoBump or +// kEnabledWithBump. Note that the bump may not be enabled, even if this returns +// true. To check if the bump is enabled, use +// IsUnifiedConsentFeatureWithBumpEnabled(). +bool IsUnifiedConsentFeatureEnabled(); + +// Returns true if the unified consent feature state is kEnabledWithBump. +bool IsUnifiedConsentFeatureWithBumpEnabled(); } // namespace unified_consent
diff --git a/components/unified_consent/feature_unittest.cc b/components/unified_consent/feature_unittest.cc index e66297f..757aa856e 100644 --- a/components/unified_consent/feature_unittest.cc +++ b/components/unified_consent/feature_unittest.cc
@@ -4,25 +4,35 @@ #include "components/unified_consent/feature.h" -#include <memory> - #include "components/sync/driver/sync_driver_switches.h" #include "components/unified_consent/scoped_unified_consent.h" #include "testing/gtest/include/gtest/gtest.h" namespace unified_consent { -TEST(UnifiedConsentFeatureTest, UnifiedConsent) { +TEST(UnifiedConsentFeatureTest, FeatureState) { // Unified consent is disabled by default. - EXPECT_EQ(UnifiedConsentFeatureState::kDisabled, - internal::GetUnifiedConsentFeatureState()); + EXPECT_FALSE(IsUnifiedConsentFeatureEnabled()); + EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled()); - for (UnifiedConsentFeatureState state : - {UnifiedConsentFeatureState::kDisabled, - UnifiedConsentFeatureState::kEnabledNoBump, - UnifiedConsentFeatureState::kEnabledWithBump}) { - ScopedUnifiedConsent scoped_state(state); - EXPECT_EQ(state, internal::GetUnifiedConsentFeatureState()); + { + ScopedUnifiedConsent scoped_disabled(UnifiedConsentFeatureState::kDisabled); + EXPECT_FALSE(IsUnifiedConsentFeatureEnabled()); + EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled()); + } + + { + ScopedUnifiedConsent scoped_no_bump( + UnifiedConsentFeatureState::kEnabledNoBump); + EXPECT_TRUE(IsUnifiedConsentFeatureEnabled()); + EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled()); + } + + { + ScopedUnifiedConsent scoped_bump( + UnifiedConsentFeatureState::kEnabledWithBump); + EXPECT_TRUE(IsUnifiedConsentFeatureEnabled()); + EXPECT_TRUE(IsUnifiedConsentFeatureWithBumpEnabled()); } } @@ -35,8 +45,8 @@ { base::test::ScopedFeatureList unified_consent_feature_list_; unified_consent_feature_list_.InitAndEnableFeature(kUnifiedConsent); - EXPECT_EQ(UnifiedConsentFeatureState::kDisabled, - internal::GetUnifiedConsentFeatureState()); + EXPECT_FALSE(IsUnifiedConsentFeatureEnabled()); + EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled()); } { @@ -45,8 +55,8 @@ base::test::ScopedFeatureList unified_consent_feature_list_; unified_consent_feature_list_.InitAndEnableFeatureWithParameters( kUnifiedConsent, feature_params); - EXPECT_EQ(UnifiedConsentFeatureState::kDisabled, - internal::GetUnifiedConsentFeatureState()); + EXPECT_FALSE(IsUnifiedConsentFeatureEnabled()); + EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled()); } }
diff --git a/components/unified_consent/scoped_unified_consent.cc b/components/unified_consent/scoped_unified_consent.cc index dc27b9f..5f16cd6 100644 --- a/components/unified_consent/scoped_unified_consent.cc +++ b/components/unified_consent/scoped_unified_consent.cc
@@ -34,8 +34,6 @@ break; } } - - DCHECK_EQ(state, internal::GetUnifiedConsentFeatureState()); } ScopedUnifiedConsent::~ScopedUnifiedConsent() {}
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper.cc b/components/unified_consent/url_keyed_data_collection_consent_helper.cc index 17f2e88e..268aedb 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper.cc +++ b/components/unified_consent/url_keyed_data_collection_consent_helper.cc
@@ -11,6 +11,7 @@ #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_service_observer.h" #include "components/sync/driver/sync_service_utils.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/pref_names.h" #include <map> @@ -146,10 +147,9 @@ // static std::unique_ptr<UrlKeyedDataCollectionConsentHelper> UrlKeyedDataCollectionConsentHelper::NewAnonymizedDataCollectionConsentHelper( - bool is_unified_consent_enabled, PrefService* pref_service, syncer::SyncService* sync_service) { - if (is_unified_consent_enabled) { + if (IsUnifiedConsentFeatureEnabled()) { return std::make_unique<PrefBasedUrlKeyedDataCollectionConsentHelper>( pref_service); } @@ -162,9 +162,8 @@ // static std::unique_ptr<UrlKeyedDataCollectionConsentHelper> UrlKeyedDataCollectionConsentHelper::NewPersonalizedDataCollectionConsentHelper( - bool is_unified_consent_enabled, syncer::SyncService* sync_service) { - if (is_unified_consent_enabled) { + if (IsUnifiedConsentFeatureEnabled()) { return std::make_unique<SyncBasedUrlKeyedDataCollectionConsentHelper>( sync_service, std::set<syncer::ModelType>( {syncer::ModelType::HISTORY_DELETE_DIRECTIVES,
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper.h b/components/unified_consent/url_keyed_data_collection_consent_helper.h index 5e005f56..af37ed1d 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper.h +++ b/components/unified_consent/url_keyed_data_collection_consent_helper.h
@@ -43,8 +43,7 @@ // // Note: |pref_service| must outlive the retuned instance. static std::unique_ptr<UrlKeyedDataCollectionConsentHelper> - NewAnonymizedDataCollectionConsentHelper(bool is_unified_consent_enabled, - PrefService* pref_service, + NewAnonymizedDataCollectionConsentHelper(PrefService* pref_service, syncer::SyncService* sync_service); // Creates a new |UrlKeyedDataCollectionConsentHelper| instance that checks @@ -58,8 +57,7 @@ // 2. If |is_unified_consent_enabled| is false then URL-keyed data collection // is enabled if sync is active and if sync history is enabled. static std::unique_ptr<UrlKeyedDataCollectionConsentHelper> - NewPersonalizedDataCollectionConsentHelper(bool is_unified_consent_enabled, - syncer::SyncService* sync_service); + NewPersonalizedDataCollectionConsentHelper(syncer::SyncService* sync_service); virtual ~UrlKeyedDataCollectionConsentHelper();
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc index 92b9ab6..df0631e 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc +++ b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
@@ -10,6 +10,7 @@ #include "components/sync/engine/cycle/sync_cycle_snapshot.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/unified_consent/pref_names.h" +#include "components/unified_consent/scoped_unified_consent.h" #include "components/unified_consent/unified_consent_service.h" #include "testing/gtest/include/gtest/gtest.h" @@ -95,9 +96,11 @@ TEST_F(UrlKeyedDataCollectionConsentHelperTest, AnonymizedDataCollection_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: - NewAnonymizedDataCollectionConsentHelper(true, &pref_service_, + NewAnonymizedDataCollectionConsentHelper(&pref_service_, &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); @@ -120,9 +123,11 @@ TEST_F(UrlKeyedDataCollectionConsentHelperTest, AnonymizedDataCollection_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: - NewAnonymizedDataCollectionConsentHelper(false, &pref_service_, + NewAnonymizedDataCollectionConsentHelper(&pref_service_, &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); @@ -138,19 +143,22 @@ TEST_F(UrlKeyedDataCollectionConsentHelperTest, AnonymizedDataCollection_UnifiedConsentDisabled_NullSyncService) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: - NewAnonymizedDataCollectionConsentHelper( - false /* is_unified_consent_enabled */, &pref_service_, - nullptr /* sync_service */); + NewAnonymizedDataCollectionConsentHelper(&pref_service_, + nullptr /* sync_service */); EXPECT_FALSE(helper->IsEnabled()); } TEST_F(UrlKeyedDataCollectionConsentHelperTest, PersonalizeddDataCollection_UnifiedConsentEnabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: - NewPersonalizedDataCollectionConsentHelper(true, &sync_service_); + NewPersonalizedDataCollectionConsentHelper(&sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); EXPECT_TRUE(state_changed_notifications.empty()); @@ -183,9 +191,11 @@ TEST_F(UrlKeyedDataCollectionConsentHelperTest, PersonalizedDataCollection_UnifiedConsentDisabled) { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: - NewPersonalizedDataCollectionConsentHelper(false, &sync_service_); + NewPersonalizedDataCollectionConsentHelper(&sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); EXPECT_TRUE(state_changed_notifications.empty()); @@ -201,18 +211,20 @@ TEST_F(UrlKeyedDataCollectionConsentHelperTest, PersonalizedDataCollection_NullSyncService) { { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kDisabled); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - false /* is_unified_consent_enabled */, nullptr /* sync_service */); EXPECT_FALSE(helper->IsEnabled()); } { + ScopedUnifiedConsent scoped_unified_consent( + UnifiedConsentFeatureState::kEnabledNoBump); std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - true /* is_unified_consent_enabled */, nullptr /* sync_service */); EXPECT_FALSE(helper->IsEnabled()); }
diff --git a/components/url_pattern_index/OWNERS b/components/url_pattern_index/OWNERS index 8e8ba099..d598acd 100644 --- a/components/url_pattern_index/OWNERS +++ b/components/url_pattern_index/OWNERS
@@ -1,3 +1,4 @@ csharrison@chromium.org engedy@chromium.org +karandeepb@chromium.org pkalinnikov@chromium.org
diff --git a/components/url_pattern_index/url_pattern.cc b/components/url_pattern_index/url_pattern.cc index aea83211..b45f4d8 100644 --- a/components/url_pattern_index/url_pattern.cc +++ b/components/url_pattern_index/url_pattern.cc
@@ -161,13 +161,6 @@ anchor_right_(ConvertAnchorType(rule.anchor_right())), match_case_(!!(rule.options() & flat::OptionFlag_IS_MATCH_CASE)) {} -UrlPattern::UrlPattern(const proto::UrlRule& rule) - : type_(rule.url_pattern_type()), - url_pattern_(rule.url_pattern()), - anchor_left_(rule.anchor_left()), - anchor_right_(rule.anchor_right()), - match_case_(rule.match_case()) {} - UrlPattern::~UrlPattern() = default; bool UrlPattern::MatchesUrl(const GURL& url) const {
diff --git a/components/url_pattern_index/url_pattern.h b/components/url_pattern_index/url_pattern.h index 0994803a..e0c18ac4 100644 --- a/components/url_pattern_index/url_pattern.h +++ b/components/url_pattern_index/url_pattern.h
@@ -34,10 +34,8 @@ proto::AnchorType anchor_left, proto::AnchorType anchor_right); - // The following constructors create UrlPattern from one of the UrlRule - // representations. The passed in |rule| must outlive the created instance. + // The passed in |rule| must outlive the created instance. explicit UrlPattern(const flat::UrlRule& rule); - explicit UrlPattern(const proto::UrlRule& rule); ~UrlPattern();
diff --git a/components/variations/entropy_provider_unittest.cc b/components/variations/entropy_provider_unittest.cc index 79439eb..5e54f3a 100644 --- a/components/variations/entropy_provider_unittest.cc +++ b/components/variations/entropy_provider_unittest.cc
@@ -63,6 +63,14 @@ return permuted_provider.GetEntropyForTrial(trial_name, 0); } +// Make a vector of consecutive integers for shuffling. +std::vector<uint16_t> MakeRange(size_t vector_size) { + std::vector<uint16_t> range(vector_size); + for (size_t i = 0; i < vector_size; ++i) + range[i] = i; + return range; +} + // Helper interface for testing used to generate entropy values for a given // field trial. Unlike EntropyProvider, which keeps the low/high entropy source // value constant and generates entropy for different trial names, instances @@ -357,6 +365,23 @@ } } +TEST(EntropyProviderTest, PermutedEntropyConsistency) { + std::vector<uint16_t> to_shuffle = MakeRange(10); + std::vector<uint16_t> expected = {7, 6, 8, 3, 2, 0, 1, 4, 9, 5}; + internal::PermuteMappingUsingRandomizationSeed(5, &to_shuffle); + EXPECT_EQ(expected, to_shuffle); +} + +TEST(EntropyProviderTest, PermutedEntropyConsistencyWithReroll) { + // Test that the permuted entropy provider is consistent with previously + // shipped versions, with a case that requires rerolls. + std::vector<uint16_t> to_shuffle = MakeRange(1000); + std::vector<uint16_t> expected = {776, 561, 72, 966, 500}; + internal::PermuteMappingUsingRandomizationSeed(10694, &to_shuffle); + std::vector<uint16_t> slice(to_shuffle.begin(), to_shuffle.begin() + 5); + EXPECT_EQ(expected, slice); +} + TEST(EntropyProviderTest, SeededRandGeneratorIsUniform) { // Verifies that SeededRandGenerator has a uniform distribution. //
diff --git a/components/variations/service/BUILD.gn b/components/variations/service/BUILD.gn index 5e79f406..c77020f 100644 --- a/components/variations/service/BUILD.gn +++ b/components/variations/service/BUILD.gn
@@ -20,7 +20,6 @@ "//base", "//components/data_use_measurement/core", "//components/encrypted_messages", - "//components/language/core/browser", "//components/metrics", "//components/network_time", "//components/pref_registry",
diff --git a/components/variations/service/DEPS b/components/variations/service/DEPS index 4ccdcd6..7d4e98a 100644 --- a/components/variations/service/DEPS +++ b/components/variations/service/DEPS
@@ -1,7 +1,6 @@ include_rules = [ "+components/data_use_measurement/core", "+components/encrypted_messages", - "+components/language/core/browser", "+components/metrics", "+components/network_time", "+components/pref_registry",
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc index c36f85d5..ab2cfce 100644 --- a/components/variations/service/variations_field_trial_creator.cc +++ b/components/variations/service/variations_field_trial_creator.cc
@@ -24,7 +24,6 @@ #include "base/trace_event/trace_event.h" #include "base/version.h" #include "build/build_config.h" -#include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" #include "components/variations/field_trial_config/field_trial_util.h" #include "components/variations/platform_field_trials.h" @@ -36,7 +35,6 @@ #include "components/variations/variations_seed_processor.h" #include "components/variations/variations_switches.h" #include "ui/base/device_form_factor.h" -#include "ui/base/l10n/l10n_util.h" namespace variations { namespace { @@ -153,15 +151,6 @@ exit(1); } -// Returns the current application locale (e.g. "en-US"). -std::string GetApplicationLocale(PrefService* local_state) { - if (!local_state->HasPrefPath(language::prefs::kApplicationLocale)) - return std::string(); - std::string locale = - local_state->GetString(language::prefs::kApplicationLocale); - return l10n_util::GetApplicationLocale(locale); -} - } // namespace VariationsFieldTrialCreator::VariationsFieldTrialCreator( @@ -256,7 +245,7 @@ const base::Version& version) { std::unique_ptr<ClientFilterableState> state = std::make_unique<ClientFilterableState>(); - state->locale = GetApplicationLocale(local_state()); + state->locale = client_->GetApplicationLocale(); state->reference_date = GetReferenceDateForExpiryChecks(local_state()); state->version = version; state->channel = GetChannelForVariations(client_->GetChannel());
diff --git a/components/variations/service/variations_field_trial_creator_unittest.cc b/components/variations/service/variations_field_trial_creator_unittest.cc index fbdcf01..aea3a891 100644 --- a/components/variations/service/variations_field_trial_creator_unittest.cc +++ b/components/variations/service/variations_field_trial_creator_unittest.cc
@@ -155,6 +155,7 @@ ~TestVariationsServiceClient() override = default; // VariationsServiceClient: + std::string GetApplicationLocale() override { return std::string(); } base::Callback<base::Version(void)> GetVersionForSimulationCallback() override { return base::Callback<base::Version(void)>();
diff --git a/components/variations/service/variations_service_client.h b/components/variations/service/variations_service_client.h index c573180..4e2c644 100644 --- a/components/variations/service/variations_service_client.h +++ b/components/variations/service/variations_service_client.h
@@ -29,6 +29,9 @@ public: virtual ~VariationsServiceClient() {} + // Returns the current application locale (e.g. "en-US"). + virtual std::string GetApplicationLocale() = 0; + // Returns a callback that when run returns the base::Version to use for // variations seed simulation. VariationsService guarantees that the callback // will be run on a background thread that permits blocking.
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc index e383474..5826d50 100644 --- a/components/variations/service/variations_service_unittest.cc +++ b/components/variations/service/variations_service_unittest.cc
@@ -71,6 +71,7 @@ ~TestVariationsServiceClient() override {} // VariationsServiceClient: + std::string GetApplicationLocale() override { return std::string(); } base::Callback<base::Version(void)> GetVersionForSimulationCallback() override { return base::Bind(&StubGetVersionForSimulation);
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn index a572960e..7c4fd646 100644 --- a/components/vector_icons/BUILD.gn +++ b/components/vector_icons/BUILD.gn
@@ -48,6 +48,8 @@ static_library("vector_icons") { sources = get_target_outputs(":components_vector_icons") + defines = [ "COMPONENTS_VECTOR_ICONS_IMPL" ] + deps = [ ":components_vector_icons", "//base",
diff --git a/components/vector_icons/cc_macros.h b/components/vector_icons/cc_macros.h index e51c4d4..7589f34 100644 --- a/components/vector_icons/cc_macros.h +++ b/components/vector_icons/cc_macros.h
@@ -15,14 +15,20 @@ #define VECTOR_ICON_ID_PREFIX "" #endif +// This define may be specified by a vector icon target, allowing a compiler +// visibility attribute to be set on the icon symbol. +#ifndef VECTOR_ICON_EXPORT +#define VECTOR_ICON_EXPORT +#endif + #define VECTOR_ICON_REP_TEMPLATE(path_name, ...) \ static constexpr gfx::PathElement path_name[] = {__VA_ARGS__}; -#define VECTOR_ICON_TEMPLATE_CC(rep_list_name, icon_name, ...) \ - constexpr char icon_name##Id[] = VECTOR_ICON_ID_PREFIX #icon_name; \ - static constexpr gfx::VectorIconRep rep_list_name[] = {__VA_ARGS__}; \ - const gfx::VectorIcon icon_name = {rep_list_name, arraysize(rep_list_name), \ - icon_name##Id}; +#define VECTOR_ICON_TEMPLATE_CC(rep_list_name, icon_name, ...) \ + constexpr char icon_name##Id[] = VECTOR_ICON_ID_PREFIX #icon_name; \ + static constexpr gfx::VectorIconRep rep_list_name[] = {__VA_ARGS__}; \ + VECTOR_ICON_EXPORT const gfx::VectorIcon icon_name = { \ + rep_list_name, arraysize(rep_list_name), icon_name##Id}; #else // !COMPONENTS_VECTOR_ICONS_CC_MACROS_H_ #error This file should only be included once.
diff --git a/components/vector_icons/vector_icons.h.template b/components/vector_icons/vector_icons.h.template index 114d8cc..6cb00d3c 100644 --- a/components/vector_icons/vector_icons.h.template +++ b/components/vector_icons/vector_icons.h.template
@@ -15,6 +15,10 @@ #define VECTOR_ICON_TEMPLATE_H(icon_name) \ extern const gfx::VectorIcon icon_name; +#if defined(FEATURE_MODULES) && defined(COMPONENTS_VECTOR_ICONS_IMPL) +#define VECTOR_ICON_EXPORT __attribute__((visibility("default"))) +#endif + namespace vector_icons { TEMPLATE_PLACEHOLDER
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index d61603a..2846bac 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -31,7 +31,6 @@ #include "media/renderers/video_resource_updater.h" #include "media/video/half_float_maker.h" #include "third_party/skia/include/core/SkColorPriv.h" -#include "third_party/skia/include/core/SkColorSpaceXform.h" #include "third_party/skia/include/core/SkMatrix.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkSurface.h"
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index 4caa237..61ef09f 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -73,7 +73,6 @@ #include <cstring> #include "base/trace_event/trace_event_etw_export_win.h" -#include "ui/base/l10n/l10n_util_win.h" #include "ui/display/win/dpi.h" #elif defined(OS_MACOSX) #include "base/mac/mach_port_broker.h" @@ -884,14 +883,6 @@ BrowserThreadImpl::CreateTaskExecutor(); delegate_->PreCreateMainMessageLoop(); -#if defined(OS_WIN) - if (l10n_util::GetLocaleOverrides().empty()) { - // Override the configured locale with the user's preferred UI language. - // Don't do this if the locale is already set, which is done by - // integration tests to ensure tests always run with the same locale. - l10n_util::OverrideLocaleWithUILanguageList(); - } -#endif // Create a MessageLoop if one does not already exist for the current // thread. This thread won't be promoted as BrowserThread::UI until
diff --git a/content/app/strings/translations/content_strings_am.xtb b/content/app/strings/translations/content_strings_am.xtb index e68c2ac..7213b247 100644 --- a/content/app/strings/translations/content_strings_am.xtb +++ b/content/app/strings/translations/content_strings_am.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">የዛፍ ፍርግርግ</translation> <translation id="1822429046913737220">ጥዋት/ከሰዓት</translation> <translation id="1832974991323546415">በርቀት መሳሪያ ላይ አጫውት</translation> +<translation id="1838818994221231429">ሙሉ ማያ ገጽን ወደ የተቆረጠው የማሳያ አካባቢ ይቀይሩ</translation> <translation id="190587075670221089">ስረዛ</translation> <translation id="1907737156431278478">ምሳሌ</translation> <translation id="1921819250265091946">ቀቀ</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">ከ«<ph name="ATSIGN" />» በኋላ የሚመጣ ክፍል የ«<ph name="INVALIDCHARACTER" />» ምልክት መያዝ የለበትም።</translation> <translation id="4668956016107839909">ቅጥያዎች</translation> <translation id="4742539557769756338">ሽፋን</translation> +<translation id="4748357248530471599">የተቆረጠው የማሳያ ክፍል ሙሉ ማያ ገጽን ይቀያይሩ</translation> <translation id="4757246831282535685">የትር ፓነል</translation> <translation id="4763480195061959176">ቪዲዮ</translation> <translation id="479989351350248267">ፈልግ</translation>
diff --git a/content/app/strings/translations/content_strings_ar.xtb b/content/app/strings/translations/content_strings_ar.xtb index 380b81cc..848bdec 100644 --- a/content/app/strings/translations/content_strings_ar.xtb +++ b/content/app/strings/translations/content_strings_ar.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">شبكة متفرعة</translation> <translation id="1822429046913737220">صباحًا/مساءً</translation> <translation id="1832974991323546415">تشغيل على جهاز بعيد</translation> +<translation id="1838818994221231429">تبديل وضع ملء الشاشة إلى منطقة صورة مقطوعة للشاشة</translation> <translation id="190587075670221089">حذف</translation> <translation id="1907737156431278478">مثال</translation> <translation id="1921819250265091946">يوم</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">يجب ألا يشتمل الجزء الذي يلي العلامة "<ph name="ATSIGN" />" على الرمز "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">ملحق</translation> <translation id="4742539557769756338">غلاف</translation> +<translation id="4748357248530471599">تبديل صورة مقطوعة للشاشة إلى وضع ملء الشاشة</translation> <translation id="4757246831282535685">لوحة علامة التبويب</translation> <translation id="4763480195061959176">فيديو</translation> <translation id="479989351350248267">بحث</translation>
diff --git a/content/app/strings/translations/content_strings_bg.xtb b/content/app/strings/translations/content_strings_bg.xtb index a9d48c86..e90675e7 100644 --- a/content/app/strings/translations/content_strings_bg.xtb +++ b/content/app/strings/translations/content_strings_bg.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">дървовидна таблица</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">възпроизвеждане на отдалечено устройство</translation> +<translation id="1838818994221231429">превключване на навлизането на целия екран в областта на прореза на екрана</translation> <translation id="190587075670221089">изтриване</translation> <translation id="1907737156431278478">пример</translation> <translation id="1921819250265091946">дд</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Текстът след „<ph name="ATSIGN" />“ не бива да съдържа символа „<ph name="INVALIDCHARACTER" />“.</translation> <translation id="4668956016107839909">приложение</translation> <translation id="4742539557769756338">корица</translation> +<translation id="4748357248530471599">превключване на прореза на екрана при цял екран</translation> <translation id="4757246831282535685">панел с раздели</translation> <translation id="4763480195061959176">видео</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb index 391d68d..d396d40 100644 --- a/content/app/strings/translations/content_strings_ca.xtb +++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">quadrícula d'arbre</translation> <translation id="1822429046913737220">a. m./p. m.</translation> <translation id="1832974991323546415">reprodueix al dispositiu remot</translation> +<translation id="1838818994221231429">activa o desactiva la pantalla completa a l'àrea del retall de pantalla</translation> <translation id="190587075670221089">supressió</translation> <translation id="1907737156431278478">exemple</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Un domini precedit per "<ph name="ATSIGN" />" no pot contenir el símbol "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">apèndix</translation> <translation id="4742539557769756338">portada</translation> +<translation id="4748357248530471599">activa o desactiva la pantalla completa al retall de pantalla</translation> <translation id="4757246831282535685">tauler de pestanyes</translation> <translation id="4763480195061959176">vídeo</translation> <translation id="479989351350248267">cerca</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb index f6e35d6f..bfa537c9 100644 --- a/content/app/strings/translations/content_strings_cs.xtb +++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">stromová mřížka</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">přehrát ve vzdáleném zařízení</translation> +<translation id="1838818994221231429">přepnout celou obrazovku na oblast výřezu displeje</translation> <translation id="190587075670221089">smazání</translation> <translation id="1907737156431278478">příklad</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Část za znakem <ph name="ATSIGN" /> nesmí obsahovat znak <ph name="INVALIDCHARACTER" />.</translation> <translation id="4668956016107839909">příloha</translation> <translation id="4742539557769756338">titulní strana</translation> +<translation id="4748357248530471599">přepnout výřez displeje na celou obrazovku</translation> <translation id="4757246831282535685">panel karty</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_da.xtb b/content/app/strings/translations/content_strings_da.xtb index 836c37f..283bd54b 100644 --- a/content/app/strings/translations/content_strings_da.xtb +++ b/content/app/strings/translations/content_strings_da.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">trægitter</translation> <translation id="1822429046913737220">f.m./e.m.</translation> <translation id="1832974991323546415">afspil på en enhed via fjernadgang</translation> +<translation id="1838818994221231429">skift fuld skærm i skærmhak</translation> <translation id="190587075670221089">sletning</translation> <translation id="1907737156431278478">eksempel</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Den del, der kommer efter "<ph name="ATSIGN" />", må ikke indeholde symbolet "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">bilag</translation> <translation id="4742539557769756338">forside</translation> +<translation id="4748357248530471599">skift skærmhak i fuld skærm</translation> <translation id="4757246831282535685">fanepanel</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">søg</translation>
diff --git a/content/app/strings/translations/content_strings_de.xtb b/content/app/strings/translations/content_strings_de.xtb index f2f2ca890..93cebecf 100644 --- a/content/app/strings/translations/content_strings_de.xtb +++ b/content/app/strings/translations/content_strings_de.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">Baumraster</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">auf Remote-Gerät wiedergeben</translation> +<translation id="1838818994221231429">Ansicht von Vollbildmodus in Display-Aussparung ein-/ausschalten</translation> <translation id="190587075670221089">Löschen</translation> <translation id="1907737156431278478">Beispiel</translation> <translation id="1921819250265091946">tt</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Nach dem <ph name="ATSIGN" />-Zeichen darf das Zeichen "<ph name="INVALIDCHARACTER" />" nicht verwendet werden.</translation> <translation id="4668956016107839909">Anhang</translation> <translation id="4742539557769756338">Titelseite</translation> +<translation id="4748357248530471599">Vollbildmodus mit Display-Aussparung ein-/ausschalten</translation> <translation id="4757246831282535685">Tabsteuerfeld</translation> <translation id="4763480195061959176">Video</translation> <translation id="479989351350248267">Suchen</translation>
diff --git a/content/app/strings/translations/content_strings_el.xtb b/content/app/strings/translations/content_strings_el.xtb index 5d16e52..1b24c50 100644 --- a/content/app/strings/translations/content_strings_el.xtb +++ b/content/app/strings/translations/content_strings_el.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">πλέγμα δέντρου</translation> <translation id="1822429046913737220">Π.Μ./Μ.Μ.</translation> <translation id="1832974991323546415">αναπαραγωγή σε απομακρυσμένη συσκευή</translation> +<translation id="1838818994221231429">εναλλαγή πλήρους οθόνης σε περιοχή εγκοπής οθόνης</translation> <translation id="190587075670221089">διαγραφή</translation> <translation id="1907737156431278478">παράδειγμα</translation> <translation id="1921819250265091946">ηη</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Το τμήμα της διεύθυνσης μετά το σύμβολο "<ph name="ATSIGN" />" δεν πρέπει να περιέχει το σύμβολο "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">παράρτημα</translation> <translation id="4742539557769756338">εξώφυλλο</translation> +<translation id="4748357248530471599">εναλλαγή πλήρους οθόνης εγκοπής οθόνης</translation> <translation id="4757246831282535685">παράθυρο καρτέλας</translation> <translation id="4763480195061959176">βίντεο</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb index 370c170..decbe9e 100644 --- a/content/app/strings/translations/content_strings_es.xtb +++ b/content/app/strings/translations/content_strings_es.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">cuadrícula de árbol</translation> <translation id="1822429046913737220">A.M./P.M.</translation> <translation id="1832974991323546415">reproducir en dispositivo remoto</translation> +<translation id="1838818994221231429">activar pantalla completa en el área de recorte de la pantalla</translation> <translation id="190587075670221089">eliminación</translation> <translation id="1907737156431278478">ejemplo</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">El texto detrás del signo "<ph name="ATSIGN" />" no debe incluir el símbolo "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">apéndice</translation> <translation id="4742539557769756338">portada</translation> +<translation id="4748357248530471599">activar pantalla completa en el recorte de la pantalla</translation> <translation id="4757246831282535685">panel de pestaña</translation> <translation id="4763480195061959176">vídeo</translation> <translation id="479989351350248267">buscar</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb index 0490fd1..7e674c7 100644 --- a/content/app/strings/translations/content_strings_et.xtb +++ b/content/app/strings/translations/content_strings_et.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">puuruudustik</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">kaugseadmes esitamine</translation> +<translation id="1838818994221231429">ekraani väljalõike piirkonnas täisekraanrežiimi sisse-/väljalülitamine</translation> <translation id="190587075670221089">kustutamine</translation> <translation id="1907737156431278478">näide</translation> <translation id="1921819250265091946">pp</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Märgile „<ph name="ATSIGN" />” järgnev osa ei tohi sisaldada sümbolit „<ph name="INVALIDCHARACTER" />”.</translation> <translation id="4668956016107839909">lisa</translation> <translation id="4742539557769756338">kaas</translation> +<translation id="4748357248530471599">ekraani väljalõike täisekraanrežiimi sisse-/väljalülitamine</translation> <translation id="4757246831282535685">vahelehepaneel</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">otsing</translation>
diff --git a/content/app/strings/translations/content_strings_fa.xtb b/content/app/strings/translations/content_strings_fa.xtb index 6a0cbe1..1fbae91d 100644 --- a/content/app/strings/translations/content_strings_fa.xtb +++ b/content/app/strings/translations/content_strings_fa.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">شبکه درختی</translation> <translation id="1822429046913737220">ق.ظ/ب.ظ</translation> <translation id="1832974991323546415">پخش در دستگاه راه دور</translation> +<translation id="1838818994221231429">جابهجایی تمامصفحه به ناحیه برش نمایشگر</translation> <translation id="190587075670221089">حذف</translation> <translation id="1907737156431278478">مثال</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">قسمت بعد از «<ph name="ATSIGN" />» نباید حاوی نماد «<ph name="INVALIDCHARACTER" />» باشد.</translation> <translation id="4668956016107839909">ضمیمه</translation> <translation id="4742539557769756338">جلد</translation> +<translation id="4748357248530471599">جابجایی برش نمایشگر تمامصفحه</translation> <translation id="4757246831282535685">پانل برگه</translation> <translation id="4763480195061959176">ویدئو</translation> <translation id="479989351350248267">جستجو</translation>
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb index 1630404..b57abce 100644 --- a/content/app/strings/translations/content_strings_fil.xtb +++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">tree grid</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">i-play sa malayuang device</translation> +<translation id="1838818994221231429">i-toggle ang fullscreen sa bahagi ng cutout ng display</translation> <translation id="190587075670221089">pag-delete</translation> <translation id="1907737156431278478">halimbawa</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Hindi dapat naglalaman ng simbolong '<ph name="INVALIDCHARACTER" />' ang bahagi pagkatapos ng '<ph name="ATSIGN" />.'</translation> <translation id="4668956016107839909">appendix</translation> <translation id="4742539557769756338">cover</translation> +<translation id="4748357248530471599">i-toggle ang fullscreen ng cutout ng display</translation> <translation id="4757246831282535685">panel ng tab</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb index f7877500..391f83d9 100644 --- a/content/app/strings/translations/content_strings_fr.xtb +++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">arborescence</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">lire sur un appareil à distance</translation> +<translation id="1838818994221231429">activer/désactiver le passage du mode plein écran en encoche</translation> <translation id="190587075670221089">suppression</translation> <translation id="1907737156431278478">exemple</translation> <translation id="1921819250265091946">jj</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">La partie précédée du symbole "<ph name="ATSIGN" />" ne doit pas contenir le caractère "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">annexe</translation> <translation id="4742539557769756338">couverture</translation> +<translation id="4748357248530471599">activer/désactiver plein écran en encoche</translation> <translation id="4757246831282535685">panneau des onglets</translation> <translation id="4763480195061959176">vidéo</translation> <translation id="479989351350248267">rechercher</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb index 3fd9c62..ac414a8 100644 --- a/content/app/strings/translations/content_strings_gu.xtb +++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ટ્રી ગ્રિડ</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">રિમોટ ઉપકરણ પર ચલાવો</translation> +<translation id="1838818994221231429">પૂર્ણસ્ક્રીનને ડિસ્પ્લેમાં જ સામેલ વિસ્તારમાં જ ટૉગલ કરો</translation> <translation id="190587075670221089">ડિલીટ કરો</translation> <translation id="1907737156431278478">ઉદાહરણ</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' ને અનુસરી રહેલા ભાગમાં '<ph name="INVALIDCHARACTER" />' પ્રતીક શામેલ હોવું જોઈએ નહીં.</translation> <translation id="4668956016107839909">જોડાણ</translation> <translation id="4742539557769756338">કવર</translation> +<translation id="4748357248530471599">ડિસ્પ્લેમાં જ સામેલ પૂર્ણસ્ક્રીન ટૉગલ કરો</translation> <translation id="4757246831282535685">ટેબ પેનલ</translation> <translation id="4763480195061959176">વિડિઓ</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb index 6a1fc5c..767545c 100644 --- a/content/app/strings/translations/content_strings_hi.xtb +++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -27,13 +27,14 @@ <translation id="1821985195704844674">ट्री ग्रिड</translation> <translation id="1822429046913737220">पूर्वाह्न/अपराह्न</translation> <translation id="1832974991323546415">दूरस्थ डिवाइस पर चलाएं</translation> +<translation id="1838818994221231429">डिसप्ले कटआउट क्षेत्र में फ़ुलस्क्रीन टॉगल करें</translation> <translation id="190587075670221089">मिटाना</translation> <translation id="1907737156431278478">उदाहरण</translation> <translation id="1921819250265091946">dd</translation> <translation id="1930711995431081526">स्थिति</translation> <translation id="1938124657309484470">मान <ph name="MAXIMUM_DATE_OR_TIME" /> या पहले का होना चाहिए.</translation> <translation id="1946271899482435442">तारीख पिकर दिखाएं</translation> -<translation id="1993104285338243655">स्क्रीन शेयर करने पर स्विच किया गया</translation> +<translation id="1993104285338243655">'स्क्रीन शेयर करने' पर स्विच किया गया</translation> <translation id="2060505056492490888">'<ph name="DOT" />' का '<ph name="INVALIDDOMAIN" />' में गलत स्थान पर उपयोग किया गया है.</translation> <translation id="2148716181193084225">आज</translation> <translation id="2158401438286456825">पेज सूची</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' के बाद आने वाले भाग में '<ph name="INVALIDCHARACTER" />' प्रतीक शामिल नहीं होना चाहिए.</translation> <translation id="4668956016107839909">परिशिष्ट</translation> <translation id="4742539557769756338">कवर</translation> +<translation id="4748357248530471599">डिसप्ले कटआउट फ़ुलस्क्रीन टॉगल करें</translation> <translation id="4757246831282535685">टैब फलक</translation> <translation id="4763480195061959176">वीडियो</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_hr.xtb b/content/app/strings/translations/content_strings_hr.xtb index bbf4478..354c4acc 100644 --- a/content/app/strings/translations/content_strings_hr.xtb +++ b/content/app/strings/translations/content_strings_hr.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">rešetka u obliku stabla</translation> <translation id="1822429046913737220">prijepodne/poslijepodne</translation> <translation id="1832974991323546415">reproduciraj na udaljenom uređaju</translation> +<translation id="1838818994221231429">prebacite cijeli zaslon u područje za urez na zaslonu</translation> <translation id="190587075670221089">brisanje</translation> <translation id="1907737156431278478">primjer</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Dio adrese iza znaka "<ph name="ATSIGN" />" ne smije sadržavati simbol "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">dodatak</translation> <translation id="4742539557769756338">naslovnica</translation> +<translation id="4748357248530471599">prebacite urez na zaslonu u cijeli zaslon</translation> <translation id="4757246831282535685">ploča kartice</translation> <translation id="4763480195061959176">videozapis</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_hu.xtb b/content/app/strings/translations/content_strings_hu.xtb index a5ba319..c16b586 100644 --- a/content/app/strings/translations/content_strings_hu.xtb +++ b/content/app/strings/translations/content_strings_hu.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">farács</translation> <translation id="1822429046913737220">de./du.</translation> <translation id="1832974991323546415">lejátszás távoli eszközön</translation> +<translation id="1838818994221231429">váltás teljes képernyőre a képernyőkivágás területén</translation> <translation id="190587075670221089">törlés</translation> <translation id="1907737156431278478">példa</translation> <translation id="1921819250265091946">nn</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">A „<ph name="ATSIGN" />” utáni rész nem tartalmazhat „<ph name="INVALIDCHARACTER" />” karaktert.</translation> <translation id="4668956016107839909">függelék</translation> <translation id="4742539557769756338">borító</translation> +<translation id="4748357248530471599">képernyőkivágás váltása teljes képernyőn</translation> <translation id="4757246831282535685">lappanel</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_id.xtb b/content/app/strings/translations/content_strings_id.xtb index e1c21fd0..7672803 100644 --- a/content/app/strings/translations/content_strings_id.xtb +++ b/content/app/strings/translations/content_strings_id.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">kisi pohon</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">putar di perangkat jarak jauh</translation> +<translation id="1838818994221231429">mengalihkan layar penuh ke area potongan layar</translation> <translation id="190587075670221089">penghapusan</translation> <translation id="1907737156431278478">contoh</translation> <translation id="1921819250265091946">hh</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Bagian setelah '<ph name="ATSIGN" />' tidak boleh berisi simbol '<ph name="INVALIDCHARACTER" />'.</translation> <translation id="4668956016107839909">lampiran</translation> <translation id="4742539557769756338">sampul</translation> +<translation id="4748357248530471599">mengalihkan layar penuh potongan layar</translation> <translation id="4757246831282535685">panel tab</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_it.xtb b/content/app/strings/translations/content_strings_it.xtb index 283ac3b..ecbcfe24 100644 --- a/content/app/strings/translations/content_strings_it.xtb +++ b/content/app/strings/translations/content_strings_it.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">griglia ad albero</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">riproduci su dispositivo remoto</translation> +<translation id="1838818994221231429">attiva/disattiva lo schermo intero nell'area tagliata dalla visualizzazione</translation> <translation id="190587075670221089">eliminazione</translation> <translation id="1907737156431278478">esempio</translation> <translation id="1921819250265091946">gg</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Una parte che segue "<ph name="ATSIGN" />" non deve contenere il simbolo "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">appendice</translation> <translation id="4742539557769756338">copertina</translation> +<translation id="4748357248530471599">attiva/disattiva lo schermo intero tagliato dalla visualizzazione</translation> <translation id="4757246831282535685">riquadro a schede</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">ricerca</translation>
diff --git a/content/app/strings/translations/content_strings_iw.xtb b/content/app/strings/translations/content_strings_iw.xtb index e0a2ae5..769457bb 100644 --- a/content/app/strings/translations/content_strings_iw.xtb +++ b/content/app/strings/translations/content_strings_iw.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">רשת של עץ</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">הפעלה במכשיר מרוחק</translation> +<translation id="1838818994221231429">מעבר ממסך מלא אל אזור המגרעת במסך</translation> <translation id="190587075670221089">מחיקה</translation> <translation id="1907737156431278478">דוגמה</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">חלק ולאחריו '<ph name="ATSIGN" />' לא אמור לכלול את הסמל '<ph name="INVALIDCHARACTER" />'.</translation> <translation id="4668956016107839909">נספח</translation> <translation id="4742539557769756338">שער</translation> +<translation id="4748357248530471599">מעבר ממסך מלא לאזור המגרעת במסך</translation> <translation id="4757246831282535685">חלונית כרטיסיות</translation> <translation id="4763480195061959176">סרטוני וידאו</translation> <translation id="479989351350248267">Search</translation>
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb index c8de147..8d633af1 100644 --- a/content/app/strings/translations/content_strings_ja.xtb +++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ツリーグリッド</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">リモート デバイスで再生</translation> +<translation id="1838818994221231429">全画面表示をディスプレイ カットアウト領域に合わせた表示に切り替えます</translation> <translation id="190587075670221089">削除</translation> <translation id="1907737156431278478">例</translation> <translation id="1921819250265091946">日</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">「<ph name="ATSIGN" />」に続く文字列に記号「<ph name="INVALIDCHARACTER" />」を使用しないでください。</translation> <translation id="4668956016107839909">付録</translation> <translation id="4742539557769756338">表紙</translation> +<translation id="4748357248530471599">ディスプレイ カットアウトに合わせた全画面表示に切り替えます</translation> <translation id="4757246831282535685">タブパネル</translation> <translation id="4763480195061959176">動画</translation> <translation id="479989351350248267">検索</translation>
diff --git a/content/app/strings/translations/content_strings_kn.xtb b/content/app/strings/translations/content_strings_kn.xtb index 0783881..61ca4f1 100644 --- a/content/app/strings/translations/content_strings_kn.xtb +++ b/content/app/strings/translations/content_strings_kn.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ಟ್ರೀ ಗ್ರಿಡ್</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">ರಿಮೋಟ್ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡಿ</translation> +<translation id="1838818994221231429">ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಡಿಸ್ಪ್ಲೇ ಕಟ್ಔಟ್ ಪ್ರದೇಶವಾಗಿ ಟಾಗಲ್ ಮಾಡಿ</translation> <translation id="190587075670221089">ಅಳಿಸುವಿಕೆ</translation> <translation id="1907737156431278478">ಉದಾಹರಣೆ</translation> <translation id="1921819250265091946">ದಿದಿ</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' ನಂತರದ ಭಾಗವು '<ph name="INVALIDCHARACTER" />' ಚಿಹ್ನೆಯನ್ನು ಒಳಗೊಂಡಿರಬಾರದು.</translation> <translation id="4668956016107839909">ಅನುಬಂಧ</translation> <translation id="4742539557769756338">ಕವರ್</translation> +<translation id="4748357248530471599">ಡಿಸ್ಪ್ಲೇ ಕಟ್ಔಟ್ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಟಾಗಲ್ ಮಾಡಿ</translation> <translation id="4757246831282535685">ಟ್ಯಾಬ್ ಫಲಕ</translation> <translation id="4763480195061959176">ವೀಡಿಯೊ</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb index b9f4f9e..4e41361c 100644 --- a/content/app/strings/translations/content_strings_ko.xtb +++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">트리 격자</translation> <translation id="1822429046913737220">오전/오후</translation> <translation id="1832974991323546415">원격 기기에서 재생</translation> +<translation id="1838818994221231429">전체화면을 디스플레이 컷아웃 영역으로 전환</translation> <translation id="190587075670221089">삭제</translation> <translation id="1907737156431278478">예시</translation> <translation id="1921819250265091946">일</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' 다음 부분에 '<ph name="INVALIDCHARACTER" />' 기호가 포함되면 안됩니다.</translation> <translation id="4668956016107839909">부록</translation> <translation id="4742539557769756338">표지</translation> +<translation id="4748357248530471599">디스플레이 컷아웃을 전체화면으로 전환</translation> <translation id="4757246831282535685">탭 패널</translation> <translation id="4763480195061959176">동영상</translation> <translation id="479989351350248267">검색</translation>
diff --git a/content/app/strings/translations/content_strings_lt.xtb b/content/app/strings/translations/content_strings_lt.xtb index d3c6446..234fba47 100644 --- a/content/app/strings/translations/content_strings_lt.xtb +++ b/content/app/strings/translations/content_strings_lt.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">medžio tinklelis</translation> <translation id="1822429046913737220">iki pietų / po pietų</translation> <translation id="1832974991323546415">leisti naudojant nuotolinį įrenginį</translation> +<translation id="1838818994221231429">perjungti visą ekraną į ekrano išpjovos zoną</translation> <translation id="190587075670221089">trynimas</translation> <translation id="1907737156431278478">pavyzdys</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Po „<ph name="ATSIGN" />“ esančioje dalyje neturėtų būti simbolio „<ph name="INVALIDCHARACTER" />“.</translation> <translation id="4668956016107839909">priedas</translation> <translation id="4742539557769756338">viršelis</translation> +<translation id="4748357248530471599">perjungti ekrano išpjovą į visą ekraną</translation> <translation id="4757246831282535685">skirtuko skydelis</translation> <translation id="4763480195061959176">vaizdo įrašas</translation> <translation id="479989351350248267">ieškoti</translation>
diff --git a/content/app/strings/translations/content_strings_lv.xtb b/content/app/strings/translations/content_strings_lv.xtb index cadacb3f..bfe6fa5 100644 --- a/content/app/strings/translations/content_strings_lv.xtb +++ b/content/app/strings/translations/content_strings_lv.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">koka režģis</translation> <translation id="1822429046913737220">priekšpusdienā/pēcpusdienā</translation> <translation id="1832974991323546415">atskaņot attālinātā ierīcē</translation> +<translation id="1838818994221231429">pārslēdz pilnekrāna režīmu displeja izgriezuma apgabalā</translation> <translation id="190587075670221089">dzēšana</translation> <translation id="1907737156431278478">piemērs</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Daļā, kas atrodas aiz zīmes <ph name="ATSIGN" />, nedrīkst būt ietverts simbols <ph name="INVALIDCHARACTER" />.</translation> <translation id="4668956016107839909">pielikums</translation> <translation id="4742539557769756338">vāks</translation> +<translation id="4748357248530471599">pārslēdz displeja izgriezuma apgabalu pilnekrāna režīmā</translation> <translation id="4757246831282535685">ciļņu panelis</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">meklēt</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb index dc74067..20c9ea8 100644 --- a/content/app/strings/translations/content_strings_ml.xtb +++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ട്രീ ഗ്രിഡ്</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">വിദൂര ഉപകരണത്തിൽ പ്ലേ ചെയ്യുക</translation> +<translation id="1838818994221231429">പൂർണ്ണ സ്ക്രീൻ, ഡിസ്പ്ലേ കട്ടൗട്ട് മേഖലയിലേക്ക് മാറ്റുക</translation> <translation id="190587075670221089">ഇല്ലാതാക്കൽ</translation> <translation id="1907737156431278478">ഉദാഹരണം</translation> <translation id="1921819250265091946">തീയതി</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' എന്നതിനുശേഷം വരുന്ന ഭാഗത്തിൽ '<ph name="INVALIDCHARACTER" />' ചിഹ്നം ഉണ്ടാകരുത്.</translation> <translation id="4668956016107839909">അനുബന്ധം</translation> <translation id="4742539557769756338">കവർ</translation> +<translation id="4748357248530471599">ഡിസ്പ്ലേ കട്ടൗട്ട് പൂർണ്ണ സ്ക്രീൻ മാറ്റുക</translation> <translation id="4757246831282535685">ടാബ് പാനൽ</translation> <translation id="4763480195061959176">വീഡിയോ</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_mr.xtb b/content/app/strings/translations/content_strings_mr.xtb index 9ad8055..4b0e7a3 100644 --- a/content/app/strings/translations/content_strings_mr.xtb +++ b/content/app/strings/translations/content_strings_mr.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ट्री ग्रीड</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">दूरस्थ डिव्हाइसवर प्ले करा</translation> +<translation id="1838818994221231429">डिस्प्ले कटआउट भागामध्ये फुलस्क्रीन टॉगल करा</translation> <translation id="190587075670221089">हटवणे</translation> <translation id="1907737156431278478">उदाहरण</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' चे फॉलो करणार्या भागामध्ये '<ph name="INVALIDCHARACTER" />' चिन्ह नसावे.</translation> <translation id="4668956016107839909">परिशिष्ट</translation> <translation id="4742539557769756338">कव्हर</translation> +<translation id="4748357248530471599">डिस्प्ले कटआउट फुलस्क्रीन टॉगल करा</translation> <translation id="4757246831282535685">टॅब पॅनेल</translation> <translation id="4763480195061959176">व्हिडिओ</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_nl.xtb b/content/app/strings/translations/content_strings_nl.xtb index 8d1cea6..4bf7822 100644 --- a/content/app/strings/translations/content_strings_nl.xtb +++ b/content/app/strings/translations/content_strings_nl.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">boomstructuur</translation> <translation id="1822429046913737220">a.m./p.m.</translation> <translation id="1832974991323546415">afspelen op extern apparaat</translation> +<translation id="1838818994221231429">volledig scherm met display-cutoutgebied schakelen</translation> <translation id="190587075670221089">verwijdering</translation> <translation id="1907737156431278478">voorbeeld</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Het adresgedeelte na '<ph name="ATSIGN" />' mag niet het teken '<ph name="INVALIDCHARACTER" />' bevatten.</translation> <translation id="4668956016107839909">bijlage</translation> <translation id="4742539557769756338">omslag</translation> +<translation id="4748357248530471599">volledig scherm met display-cutout schakelen</translation> <translation id="4757246831282535685">deelvenster met tabblad</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">zoeken</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb index 2b165a6..5eb145f 100644 --- a/content/app/strings/translations/content_strings_no.xtb +++ b/content/app/strings/translations/content_strings_no.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">trerutenett</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">spill på ekstern enhet</translation> +<translation id="1838818994221231429">slå av/på fullskjermsvisning av området med skjermutklipp</translation> <translation id="190587075670221089">sletting</translation> <translation id="1907737156431278478">eksempel</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">En del etterfulgt av «<ph name="ATSIGN" />» kan ikke inneholde symbolet «<ph name="INVALIDCHARACTER" />».</translation> <translation id="4668956016107839909">vedlegg</translation> <translation id="4742539557769756338">omslag</translation> +<translation id="4748357248530471599">slå av/på fullskjermsvisning av skjermutklipp</translation> <translation id="4757246831282535685">fanepanel</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">søk</translation>
diff --git a/content/app/strings/translations/content_strings_pl.xtb b/content/app/strings/translations/content_strings_pl.xtb index 95213b7..b65e5526 100644 --- a/content/app/strings/translations/content_strings_pl.xtb +++ b/content/app/strings/translations/content_strings_pl.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">siatka drzewa</translation> <translation id="1822429046913737220">rano/po południu</translation> <translation id="1832974991323546415">odtwarzanie na urządzeniu zdalnym</translation> +<translation id="1838818994221231429">przełącz z trybu pełnoekranowego na obszar z wycięciem w ekranie</translation> <translation id="190587075670221089">usunięcie</translation> <translation id="1907737156431278478">przykład</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Część po znaku „<ph name="ATSIGN" />” nie może zawierać symbolu „<ph name="INVALIDCHARACTER" />”.</translation> <translation id="4668956016107839909">dodatek</translation> <translation id="4742539557769756338">okładka</translation> +<translation id="4748357248530471599">przełącz z wycięcia w ekranie na tryb pełnoekranowy</translation> <translation id="4757246831282535685">panel karty</translation> <translation id="4763480195061959176">film</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_pt-BR.xtb b/content/app/strings/translations/content_strings_pt-BR.xtb index 1f50ea1..fd5f89ca 100644 --- a/content/app/strings/translations/content_strings_pt-BR.xtb +++ b/content/app/strings/translations/content_strings_pt-BR.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">grade de árvore</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">reproduzir em dispositivo remoto</translation> +<translation id="1838818994221231429">alternar tela cheia na área de corte da tela</translation> <translation id="190587075670221089">exclusão</translation> <translation id="1907737156431278478">exemplo</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">A parte depois de "<ph name="ATSIGN" />" não deve conter o símbolo "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">apêndice</translation> <translation id="4742539557769756338">capa</translation> +<translation id="4748357248530471599">alternar tela cheia do corte da tela</translation> <translation id="4757246831282535685">painel da guia</translation> <translation id="4763480195061959176">vídeo</translation> <translation id="479989351350248267">pesquisar</translation>
diff --git a/content/app/strings/translations/content_strings_pt-PT.xtb b/content/app/strings/translations/content_strings_pt-PT.xtb index 5407012..7c1b85cf6 100644 --- a/content/app/strings/translations/content_strings_pt-PT.xtb +++ b/content/app/strings/translations/content_strings_pt-PT.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">grelha de árvore</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">reproduzir no dispositivo remoto</translation> +<translation id="1838818994221231429">ativar/desativar o ecrã inteiro na área de recorte no ecrã</translation> <translation id="190587075670221089">eliminação</translation> <translation id="1907737156431278478">exemplo</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Uma parte a seguir a "<ph name="ATSIGN" />" não deve conter o símbolo "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">apêndice</translation> <translation id="4742539557769756338">capa</translation> +<translation id="4748357248530471599">ativar/desativar o ecrã inteiro de recorte no ecrã</translation> <translation id="4757246831282535685">painel de separadores</translation> <translation id="4763480195061959176">vídeo</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_ro.xtb b/content/app/strings/translations/content_strings_ro.xtb index 50d67946..7bb26721 100644 --- a/content/app/strings/translations/content_strings_ro.xtb +++ b/content/app/strings/translations/content_strings_ro.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">grilă arbore</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">redă pe dispozitiv la distanță</translation> +<translation id="1838818994221231429">comută ecranul complet în zona cu decupajul ecranului</translation> <translation id="190587075670221089">ștergere</translation> <translation id="1907737156431278478">exemplu</translation> <translation id="1921819250265091946">zz</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Valoarea care urmează după semnul „<ph name="ATSIGN" />” nu trebuie să conțină simbolul „<ph name="INVALIDCHARACTER" />”.</translation> <translation id="4668956016107839909">anexă</translation> <translation id="4742539557769756338">copertă</translation> +<translation id="4748357248530471599">comută decupajul ecranului pe ecran complet</translation> <translation id="4757246831282535685">panou de file</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">căutați</translation>
diff --git a/content/app/strings/translations/content_strings_ru.xtb b/content/app/strings/translations/content_strings_ru.xtb index 4ebbc1c..ab654d5 100644 --- a/content/app/strings/translations/content_strings_ru.xtb +++ b/content/app/strings/translations/content_strings_ru.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">сетка в виде дерева</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">воспроизвести на удаленном устройстве</translation> +<translation id="1838818994221231429">Переключить полный экран на вырезанную область</translation> <translation id="190587075670221089">удаление</translation> <translation id="1907737156431278478">пример</translation> <translation id="1921819250265091946">дд</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Часть адреса после символа "<ph name="ATSIGN" />" не должна содержать символ "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">приложение</translation> <translation id="4742539557769756338">обложка</translation> +<translation id="4748357248530471599">Переключить вырезанную область на полный экран</translation> <translation id="4757246831282535685">панель вкладок</translation> <translation id="4763480195061959176">видео</translation> <translation id="479989351350248267">поиск</translation>
diff --git a/content/app/strings/translations/content_strings_sk.xtb b/content/app/strings/translations/content_strings_sk.xtb index 799bcaff..9ec872f 100644 --- a/content/app/strings/translations/content_strings_sk.xtb +++ b/content/app/strings/translations/content_strings_sk.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">stromová mriežka</translation> <translation id="1822429046913737220">AM / PM</translation> <translation id="1832974991323546415">prehrať na vzdialenom zariadení</translation> +<translation id="1838818994221231429">prepnúť celú obrazovku na výrez obrazovky</translation> <translation id="190587075670221089">odstránenie</translation> <translation id="1907737156431278478">príklad</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Časť za znakom <ph name="ATSIGN" /> by nemala obsahovať symbol <ph name="INVALIDCHARACTER" />.</translation> <translation id="4668956016107839909">príloha</translation> <translation id="4742539557769756338">titulná strana</translation> +<translation id="4748357248530471599">prepnúť výrez obrazovky na celú obrazovku</translation> <translation id="4757246831282535685">panel karty</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_sr.xtb b/content/app/strings/translations/content_strings_sr.xtb index 676581cd..c8aa7cec 100644 --- a/content/app/strings/translations/content_strings_sr.xtb +++ b/content/app/strings/translations/content_strings_sr.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">мрежа стабла</translation> <translation id="1822429046913737220">пре подне/по подне</translation> <translation id="1832974991323546415">пуштајте на удаљеном уређају</translation> +<translation id="1838818994221231429">укључује/искључује приказивање на целом екрану у области изреза екрана</translation> <translation id="190587075670221089">брисање</translation> <translation id="1907737156431278478">пример</translation> <translation id="1921819250265091946">дд</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Део после „<ph name="ATSIGN" />“ не треба да садржи симбол „<ph name="INVALIDCHARACTER" />“.</translation> <translation id="4668956016107839909">додатак</translation> <translation id="4742539557769756338">корицe</translation> +<translation id="4748357248530471599">укључи/искључи цео екрану у области изреза екрана</translation> <translation id="4757246831282535685">табла са картицама</translation> <translation id="4763480195061959176">видео</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb index 3f94cd1..c3b676b 100644 --- a/content/app/strings/translations/content_strings_sv.xtb +++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">träddiagram</translation> <translation id="1822429046913737220">FM/EM</translation> <translation id="1832974991323546415">spela på en fjärrenhet</translation> +<translation id="1838818994221231429">aktivera och inaktivera helskärm till området för utskärning</translation> <translation id="190587075670221089">borttagning</translation> <translation id="1907737156431278478">exempel</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">En del efter <ph name="ATSIGN" /> får inte innehålla symbolen <ph name="INVALIDCHARACTER" />.</translation> <translation id="4668956016107839909">bilaga</translation> <translation id="4742539557769756338">omslag</translation> +<translation id="4748357248530471599">aktivera och inaktivera skärmutskärning i helskärm</translation> <translation id="4757246831282535685">flikpanel</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">sök</translation>
diff --git a/content/app/strings/translations/content_strings_sw.xtb b/content/app/strings/translations/content_strings_sw.xtb index 686d61b6..540815f 100644 --- a/content/app/strings/translations/content_strings_sw.xtb +++ b/content/app/strings/translations/content_strings_sw.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">gridi ya mti</translation> <translation id="1822429046913737220">AM / PM</translation> <translation id="1832974991323546415">cheza kwenye kifaa cha mbali</translation> +<translation id="1838818994221231429">tumia skrini nzima katika eneo la mkato kwenye skrini</translation> <translation id="190587075670221089">ufutaji</translation> <translation id="1907737156431278478">mfano</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Sehemu inayofuata '<ph name="ATSIGN" />' haipaswi kuwa na alama ya '<ph name="INVALIDCHARACTER" />'.</translation> <translation id="4668956016107839909">kiambatisho</translation> <translation id="4742539557769756338">jalada</translation> +<translation id="4748357248530471599">tumia mkato kwenye skrini nzima</translation> <translation id="4757246831282535685">kisanduku cha kichupo</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">tafuta</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb index a7768b92..f3954fd 100644 --- a/content/app/strings/translations/content_strings_ta.xtb +++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ட்ரீ கிரிட்</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">தொலைநிலைச் சாதனத்தில் இயக்கு</translation> +<translation id="1838818994221231429">முழுத்திரைக் காட்சியைத் திரை டிஸ்ப்ளே கட்அவுட் பகுதிக்கு நிலைமாற்றும்</translation> <translation id="190587075670221089">நீக்கும்</translation> <translation id="1907737156431278478">உதாரணம்</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />' ஐத் தொடரும் பகுதியில், '<ph name="INVALIDCHARACTER" />' சின்னம் இருக்கக்கூடாது.</translation> <translation id="4668956016107839909">பிற்சேர்க்கை</translation> <translation id="4742539557769756338">அட்டை</translation> +<translation id="4748357248530471599">டிஸ்ப்ளே கட்அவுட் முழுத்திரை நிலைமாற்ற பட்டன்</translation> <translation id="4757246831282535685">தாவல் பலகம்</translation> <translation id="4763480195061959176">வீடியோ</translation> <translation id="479989351350248267">Search</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb index 2638aa2..4b6b9fd 100644 --- a/content/app/strings/translations/content_strings_te.xtb +++ b/content/app/strings/translations/content_strings_te.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">వృక్షాంశ గ్రిడ్</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">రిమోట్ పరికరంలో ప్లే చేస్తుంది</translation> +<translation id="1838818994221231429">పూర్తి స్క్రీన్ను డిస్ప్లే కత్తిరింపు భాగానికి తగినట్లు సక్రియం చేస్తుంది</translation> <translation id="190587075670221089">తొలగింపు</translation> <translation id="1907737156431278478">ఉదాహరణ</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">'<ph name="ATSIGN" />'కి తర్వాత ఉన్న భాగంలో '<ph name="INVALIDCHARACTER" />' చిహ్నం ఉండకూడదు.</translation> <translation id="4668956016107839909">అనుబంధం</translation> <translation id="4742539557769756338">ముఖచిత్రం</translation> +<translation id="4748357248530471599">డిస్ప్లే కత్తిరింపు పూర్తి స్క్రీన్ని సక్రియం చేస్తుంది</translation> <translation id="4757246831282535685">ట్యాబ్ ప్యానెల్</translation> <translation id="4763480195061959176">వీడియో</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_th.xtb b/content/app/strings/translations/content_strings_th.xtb index c805447d..57e893a 100644 --- a/content/app/strings/translations/content_strings_th.xtb +++ b/content/app/strings/translations/content_strings_th.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">แผนผังต้นไม้</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">เล่นในอุปกรณ์ระยะไกล</translation> +<translation id="1838818994221231429">สลับจากเต็มหน้าจอเป็นพื้นที่หน้าจอรอยบาก</translation> <translation id="190587075670221089">การลบ</translation> <translation id="1907737156431278478">ตัวอย่าง</translation> <translation id="1921819250265091946">วว</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">ส่วนที่ต่อท้าย "<ph name="ATSIGN" />" ต้องไม่มีสัญลักษณ์ "<ph name="INVALIDCHARACTER" />"</translation> <translation id="4668956016107839909">ภาคผนวก</translation> <translation id="4742539557769756338">หน้าปก</translation> +<translation id="4748357248530471599">สลับเป็นแบบเต็มหน้าจอสำหรับหน้าจอรอยบาก</translation> <translation id="4757246831282535685">แผงแท็บ</translation> <translation id="4763480195061959176">วิดีโอ</translation> <translation id="479989351350248267">ค้นหา</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb index 3f4ee073..2ad6bf3 100644 --- a/content/app/strings/translations/content_strings_tr.xtb +++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">ağaç tablo</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">uzaktan cihazda oynat</translation> +<translation id="1838818994221231429">tam ekranı ekran kesimi alanı olarak değiştirin</translation> <translation id="190587075670221089">silme</translation> <translation id="1907737156431278478">örnek</translation> <translation id="1921819250265091946">gg</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Başında "<ph name="ATSIGN" />" bulunan kısımda "<ph name="INVALIDCHARACTER" />" simgesi bulunmamalıdır.</translation> <translation id="4668956016107839909">ek</translation> <translation id="4742539557769756338">kapak</translation> +<translation id="4748357248530471599">ekran kesimi alanını tam ekran olarak değiştirin</translation> <translation id="4757246831282535685">sekme paneli</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">ara</translation>
diff --git a/content/app/strings/translations/content_strings_uk.xtb b/content/app/strings/translations/content_strings_uk.xtb index 0b0bfbb..bef1d48 100644 --- a/content/app/strings/translations/content_strings_uk.xtb +++ b/content/app/strings/translations/content_strings_uk.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">сітка дерева</translation> <translation id="1822429046913737220">д.п./п.п.</translation> <translation id="1832974991323546415">відтворити на віддаленому пристрої</translation> +<translation id="1838818994221231429">перемкнути з повноекранного режиму на виріз екрана</translation> <translation id="190587075670221089">видалення</translation> <translation id="1907737156431278478">приклад</translation> <translation id="1921819250265091946">дд</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Частина після знака "<ph name="ATSIGN" />" не може містити символ "<ph name="INVALIDCHARACTER" />".</translation> <translation id="4668956016107839909">додаток</translation> <translation id="4742539557769756338">обкладинка</translation> +<translation id="4748357248530471599">перемкнути виріз у повноекранному режимі</translation> <translation id="4757246831282535685">панель вкладок</translation> <translation id="4763480195061959176">відео</translation> <translation id="479989351350248267">пошук</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb index b312949..a2e904bb 100644 --- a/content/app/strings/translations/content_strings_vi.xtb +++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">lưới dạng cây</translation> <translation id="1822429046913737220">SA/CH</translation> <translation id="1832974991323546415">phát trên thiết bị từ xa</translation> +<translation id="1838818994221231429">chuyển từ chế độ toàn màn hình sang chế độ có vùng vết cắt trên màn hình</translation> <translation id="190587075670221089">xóa</translation> <translation id="1907737156431278478">ví dụ</translation> <translation id="1921819250265091946">dd</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">Phần đứng sau '<ph name="ATSIGN" />' không được chứa biểu tượng '<ph name="INVALIDCHARACTER" />'.</translation> <translation id="4668956016107839909">phụ lục</translation> <translation id="4742539557769756338">trang bìa</translation> +<translation id="4748357248530471599">chuyển đổi chế độ toàn màn hình hiển thị vết cắt</translation> <translation id="4757246831282535685">bảng điều khiển tab</translation> <translation id="4763480195061959176">video</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb index 1cee8ea1..f5f5dfa 100644 --- a/content/app/strings/translations/content_strings_zh-CN.xtb +++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">树状网格</translation> <translation id="1822429046913737220">上午/下午</translation> <translation id="1832974991323546415">在远程设备上播放</translation> +<translation id="1838818994221231429">切换到包含刘海屏区域的全屏模式</translation> <translation id="190587075670221089">删除</translation> <translation id="1907737156431278478">示例</translation> <translation id="1921819250265091946">日</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">“<ph name="ATSIGN" />”后面的内容不应包含符号“<ph name="INVALIDCHARACTER" />”。</translation> <translation id="4668956016107839909">附录</translation> <translation id="4742539557769756338">封面</translation> +<translation id="4748357248530471599">开启/关闭全屏模式中的刘海屏</translation> <translation id="4757246831282535685">标签面板</translation> <translation id="4763480195061959176">视频</translation> <translation id="479989351350248267">搜索</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb index 0f1c535..857bab9 100644 --- a/content/app/strings/translations/content_strings_zh-TW.xtb +++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -27,6 +27,7 @@ <translation id="1821985195704844674">樹狀目錄網格</translation> <translation id="1822429046913737220">AM/PM</translation> <translation id="1832974991323546415">在遠端裝置上播放</translation> +<translation id="1838818994221231429">切換為包含螢幕凹口區域的全螢幕模式</translation> <translation id="190587075670221089">刪除</translation> <translation id="1907737156431278478">範例</translation> <translation id="1921819250265091946">日</translation> @@ -103,6 +104,7 @@ <translation id="4664250907885839816">「<ph name="ATSIGN" />」後面的部分不應包含「<ph name="INVALIDCHARACTER" />」符號。</translation> <translation id="4668956016107839909">附錄</translation> <translation id="4742539557769756338">封面</translation> +<translation id="4748357248530471599">切換螢幕凹口全螢幕模式</translation> <translation id="4757246831282535685">分頁面板</translation> <translation id="4763480195061959176">影片</translation> <translation id="479989351350248267">search</translation>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 24ce6a3..82d691a 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1661,6 +1661,8 @@ "shared_worker/shared_worker_host.h", "shared_worker/shared_worker_instance.cc", "shared_worker/shared_worker_instance.h", + "shared_worker/shared_worker_script_fetcher.cc", + "shared_worker/shared_worker_script_fetcher.h", "shared_worker/shared_worker_script_loader.cc", "shared_worker/shared_worker_script_loader.h", "shared_worker/shared_worker_script_loader_factory.cc",
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc index 13f6f47..10ea554 100644 --- a/content/browser/background_fetch/background_fetch_context.cc +++ b/content/browser/background_fetch/background_fetch_context.cc
@@ -25,6 +25,8 @@ namespace content { +using FailureReason = blink::mojom::BackgroundFetchFailureReason; + BackgroundFetchContext::BackgroundFetchContext( BrowserContext* browser_context, const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context, @@ -143,23 +145,14 @@ // operator uses. DCHECK_EQ(0u, fetch_callbacks_.count(registration_id)); fetch_callbacks_[registration_id] = std::move(callback); - - // |data_manager| is guaranteed to outlive |this|. |create_registration| is - // passed to `DidGetPermission`, which is tied to |weak_factory_|. That means - // that if |create_registration| runs, |this| is still alive, as is - // |data_manager| (a pointer owned by |this|). - auto create_registration = base::BindOnce( - &BackgroundFetchDataManager::CreateRegistration, - base::Unretained(data_manager_.get()), registration_id, requests, options, - icon, - base::BindOnce(&BackgroundFetchContext::DidCreateRegistration, - weak_factory_.GetWeakPtr(), registration_id)); + int frame_tree_node_id = + render_frame_host ? render_frame_host->GetFrameTreeNodeId() : 0; GetPermissionForOrigin( registration_id.origin(), render_frame_host, base::BindOnce(&BackgroundFetchContext::DidGetPermission, - weak_factory_.GetWeakPtr(), std::move(create_registration), - registration_id)); + weak_factory_.GetWeakPtr(), registration_id, requests, + options, icon, frame_tree_node_id)); } void BackgroundFetchContext::GetPermissionForOrigin( @@ -167,7 +160,6 @@ RenderFrameHost* render_frame_host, GetPermissionCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - ResourceRequestInfo::WebContentsGetter wc_getter = base::NullCallback(); // Permissions need to go through the DownloadRequestLimiter if the fetch @@ -182,11 +174,25 @@ } void BackgroundFetchContext::DidGetPermission( - base::OnceClosure permission_closure, const BackgroundFetchRegistrationId& registration_id, + const std::vector<ServiceWorkerFetchRequest>& requests, + const BackgroundFetchOptions& options, + const SkBitmap& icon, + int frame_tree_node_id, bool has_permission) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(&background_fetch::RecordBackgroundFetchUkmEvent, + registration_id.origin(), requests, options, icon, + frame_tree_node_id, has_permission)); + if (has_permission) { - std::move(permission_closure).Run(); + data_manager_->BackgroundFetchDataManager::CreateRegistration( + registration_id, requests, options, icon, + base::BindOnce(&BackgroundFetchContext::DidCreateRegistration, + weak_factory_.GetWeakPtr(), registration_id)); return; } @@ -261,7 +267,7 @@ const BackgroundFetchRegistrationId& registration_id) { auto job_it = job_controllers_.find(registration_id.unique_id()); if (job_it != job_controllers_.end() && job_it->second) - job_it->second->Abort(BackgroundFetchReasonToAbort::QUOTA_EXCEEDED); + job_it->second->Abort(FailureReason::QUOTA_EXCEEDED); } void BackgroundFetchContext::AbandonFetches( @@ -281,8 +287,7 @@ service_worker_registration_id) { DCHECK(saved_iter->second); - saved_iter->second->Abort( - BackgroundFetchReasonToAbort::SERVICE_WORKER_UNAVAILABLE); + saved_iter->second->Abort(FailureReason::SERVICE_WORKER_UNAVAILABLE); } } @@ -383,13 +388,13 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); DidFinishJob(std::move(callback), registration_id, - BackgroundFetchReasonToAbort::ABORTED_BY_DEVELOPER); + FailureReason::CANCELLED_BY_DEVELOPER); } void BackgroundFetchContext::DidFinishJob( base::OnceCallback<void(blink::mojom::BackgroundFetchError)> callback, const BackgroundFetchRegistrationId& registration_id, - BackgroundFetchReasonToAbort reason_to_abort) { + FailureReason reason_to_abort) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // If |aborted| is true, this will also propagate the event to any active @@ -403,7 +408,7 @@ void BackgroundFetchContext::DidMarkForDeletion( const BackgroundFetchRegistrationId& registration_id, - BackgroundFetchReasonToAbort reason_to_abort, + FailureReason reason_to_abort, base::OnceCallback<void(blink::mojom::BackgroundFetchError)> callback, blink::mojom::BackgroundFetchError error) { DCHECK(callback); @@ -418,7 +423,7 @@ auto controllers_iter = job_controllers_.find(registration_id.unique_id()); - if (reason_to_abort == BackgroundFetchReasonToAbort::ABORTED_BY_DEVELOPER) { + if (reason_to_abort == FailureReason::CANCELLED_BY_DEVELOPER) { DCHECK(controllers_iter != job_controllers_.end()); controllers_iter->second->Abort(reason_to_abort); } @@ -426,17 +431,19 @@ blink::mojom::BackgroundFetchState::FAILURE); switch (reason_to_abort) { - case BackgroundFetchReasonToAbort::ABORTED_BY_DEVELOPER: - case BackgroundFetchReasonToAbort::CANCELLED_FROM_UI: + case FailureReason::CANCELLED_BY_DEVELOPER: + case FailureReason::CANCELLED_FROM_UI: CleanupRegistration(registration_id, {}, blink::mojom::BackgroundFetchState::FAILURE); event_dispatcher_.DispatchBackgroundFetchAbortEvent( registration_id, std::move(registration), base::DoNothing()); return; - case BackgroundFetchReasonToAbort::TOTAL_DOWNLOAD_SIZE_EXCEEDED: - case BackgroundFetchReasonToAbort::SERVICE_WORKER_UNAVAILABLE: - case BackgroundFetchReasonToAbort::QUOTA_EXCEEDED: - case BackgroundFetchReasonToAbort::NONE: + case FailureReason::TOTAL_DOWNLOAD_SIZE_EXCEEDED: + case FailureReason::SERVICE_WORKER_UNAVAILABLE: + case FailureReason::QUOTA_EXCEEDED: + case FailureReason::BAD_STATUS: + case FailureReason::FETCH_ERROR: + case FailureReason::NONE: // This will send a BackgroundFetchFetched or BackgroundFetchFail event. // We still need this to figure out which event to send. // TODO(crbug.com/699957, crbug.com/874092): Add a method to only return
diff --git a/content/browser/background_fetch/background_fetch_context.h b/content/browser/background_fetch/background_fetch_context.h index e25b915..6062473f 100644 --- a/content/browser/background_fetch/background_fetch_context.h +++ b/content/browser/background_fetch/background_fetch_context.h
@@ -195,12 +195,12 @@ void DidFinishJob( base::OnceCallback<void(blink::mojom::BackgroundFetchError)> callback, const BackgroundFetchRegistrationId& registration_id, - BackgroundFetchReasonToAbort reason_to_abort); + blink::mojom::BackgroundFetchFailureReason reason_to_abort); // Called when the data manager finishes marking a registration as deleted. void DidMarkForDeletion( const BackgroundFetchRegistrationId& registration_id, - BackgroundFetchReasonToAbort reason_to_abort, + blink::mojom::BackgroundFetchFailureReason reason_to_abort, base::OnceCallback<void(blink::mojom::BackgroundFetchError)> callback, blink::mojom::BackgroundFetchError error); @@ -271,8 +271,11 @@ GetPermissionCallback callback); // Callback for GetPermissionForOrigin. - void DidGetPermission(base::OnceClosure permission_closure, - const BackgroundFetchRegistrationId& registration_id, + void DidGetPermission(const BackgroundFetchRegistrationId& registration_id, + const std::vector<ServiceWorkerFetchRequest>& requests, + const BackgroundFetchOptions& options, + const SkBitmap& icon, + int frame_tree_node_id, bool has_permission); // |this| is owned, indirectly, by the BrowserContext.
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.cc b/content/browser/background_fetch/background_fetch_delegate_proxy.cc index c8048fe..9e1f4cd0 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.cc +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.cc
@@ -176,8 +176,9 @@ } // BackgroundFetchDelegate::Client implementation: - void OnJobCancelled(const std::string& job_unique_id, - BackgroundFetchReasonToAbort reason_to_abort) override; + void OnJobCancelled( + const std::string& job_unique_id, + blink::mojom::BackgroundFetchFailureReason reason_to_abort) override; void OnDownloadUpdated(const std::string& job_unique_id, const std::string& guid, uint64_t bytes_downloaded) override; @@ -207,7 +208,7 @@ void BackgroundFetchDelegateProxy::Core::OnJobCancelled( const std::string& job_unique_id, - BackgroundFetchReasonToAbort reason_to_abort) { + blink::mojom::BackgroundFetchFailureReason reason_to_abort) { DCHECK_CURRENTLY_ON(BrowserThread::UI); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, @@ -383,11 +384,12 @@ void BackgroundFetchDelegateProxy::OnJobCancelled( const std::string& job_unique_id, - BackgroundFetchReasonToAbort reason_to_abort) { + blink::mojom::BackgroundFetchFailureReason reason_to_abort) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(reason_to_abort == BackgroundFetchReasonToAbort::CANCELLED_FROM_UI || - reason_to_abort == - BackgroundFetchReasonToAbort::TOTAL_DOWNLOAD_SIZE_EXCEEDED); + DCHECK(reason_to_abort == + blink::mojom::BackgroundFetchFailureReason::CANCELLED_FROM_UI || + reason_to_abort == blink::mojom::BackgroundFetchFailureReason:: + TOTAL_DOWNLOAD_SIZE_EXCEEDED); // TODO(delphick): The controller may not exist as persistence is not yet // implemented.
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.h b/content/browser/background_fetch/background_fetch_delegate_proxy.h index d393db4..e877ab6 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.h +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.h
@@ -20,6 +20,7 @@ #include "content/public/browser/background_fetch_description.h" #include "content/public/browser/background_fetch_response.h" #include "content/public/browser/browser_thread.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" namespace content { @@ -48,7 +49,7 @@ const scoped_refptr<BackgroundFetchRequestInfo>& request) = 0; // Called when the delegate aborts a Background Fetch registration. - virtual void Abort(BackgroundFetchReasonToAbort) = 0; + virtual void Abort(blink::mojom::BackgroundFetchFailureReason) = 0; virtual ~Controller() {} }; @@ -114,8 +115,9 @@ // Called when the job identified by |job_unique|id| was cancelled by the // delegate. Should only be called on the IO thread. - void OnJobCancelled(const std::string& job_unique_id, - BackgroundFetchReasonToAbort reason_to_abort); + void OnJobCancelled( + const std::string& job_unique_id, + blink::mojom::BackgroundFetchFailureReason reason_to_abort); // Called when the download identified by |guid| has succeeded/failed/aborted. // Should only be called on the IO thread.
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc b/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc index 8d14278..2448cad 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc +++ b/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc
@@ -15,6 +15,7 @@ #include "content/public/browser/background_fetch_response.h" #include "content/public/browser/browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" namespace content { @@ -118,7 +119,8 @@ request_completed_ = true; } - void Abort(BackgroundFetchReasonToAbort reason_to_abort) override {} + void Abort( + blink::mojom::BackgroundFetchFailureReason reason_to_abort) override {} bool request_started_ = false; bool request_completed_ = false;
diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc index a2e82ba..adfecb4a1 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.cc +++ b/content/browser/background_fetch/background_fetch_job_controller.cc
@@ -144,38 +144,15 @@ return std::make_unique<BackgroundFetchRegistration>( registration_id().developer_id(), registration_id().unique_id(), 0 /* upload_total */, 0 /* uploaded */, total_downloads_size_, - complete_requests_downloaded_bytes_cache_, state, MojoFailureReason()); + complete_requests_downloaded_bytes_cache_, state, reason_to_abort_); } uint64_t BackgroundFetchJobController::GetInProgressDownloadedBytes() { return active_request_downloaded_bytes_; } -// TODO(crbug.com/876691): Get rid of BackgroundFetchReasonToAbort and remove -// this method. -blink::mojom::BackgroundFetchFailureReason -BackgroundFetchJobController::MojoFailureReason() const { - switch (reason_to_abort_) { - case BackgroundFetchReasonToAbort::NONE: - return blink::mojom::BackgroundFetchFailureReason::NONE; - case BackgroundFetchReasonToAbort::CANCELLED_FROM_UI: - return blink::mojom::BackgroundFetchFailureReason::CANCELLED_FROM_UI; - case BackgroundFetchReasonToAbort::ABORTED_BY_DEVELOPER: - return blink::mojom::BackgroundFetchFailureReason::CANCELLED_BY_DEVELOPER; - case BackgroundFetchReasonToAbort::TOTAL_DOWNLOAD_SIZE_EXCEEDED: - return blink::mojom::BackgroundFetchFailureReason:: - TOTAL_DOWNLOAD_SIZE_EXCEEDED; - case BackgroundFetchReasonToAbort::SERVICE_WORKER_UNAVAILABLE: - return blink::mojom::BackgroundFetchFailureReason:: - SERVICE_WORKER_UNAVAILABLE; - case BackgroundFetchReasonToAbort::QUOTA_EXCEEDED: - return blink::mojom::BackgroundFetchFailureReason::QUOTA_EXCEEDED; - } - NOTREACHED(); -} - void BackgroundFetchJobController::Abort( - BackgroundFetchReasonToAbort reason_to_abort) { + blink::mojom::BackgroundFetchFailureReason reason_to_abort) { reason_to_abort_ = reason_to_abort; // Stop propagating any in-flight events to the scheduler.
diff --git a/content/browser/background_fetch/background_fetch_job_controller.h b/content/browser/background_fetch/background_fetch_job_controller.h index 7bc8b2f..a4abe5d 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.h +++ b/content/browser/background_fetch/background_fetch_job_controller.h
@@ -41,7 +41,7 @@ public: using FinishedCallback = base::OnceCallback<void(const BackgroundFetchRegistrationId&, - BackgroundFetchReasonToAbort)>; + blink::mojom::BackgroundFetchFailureReason)>; using ProgressCallback = base::RepeatingCallback<void(const std::string& /* unique_id */, uint64_t /* download_total */, @@ -110,14 +110,10 @@ bool HasMoreRequests() override; void StartRequest(scoped_refptr<BackgroundFetchRequestInfo> request, RequestFinishedCallback request_finished_callback) override; - void Abort(BackgroundFetchReasonToAbort reason_to_abort) override; + void Abort( + blink::mojom::BackgroundFetchFailureReason reason_to_abort) override; private: - // Returns reason_to_abort_ as blink::mojom::BackgroundFetchFailureReason. - // TODO(crbug.com/876691): Get rid of BackgroundFetchReasonToAbort and remove - // this converter. - blink::mojom::BackgroundFetchFailureReason MojoFailureReason() const; - // Options for the represented background fetch registration. BackgroundFetchOptions options_; @@ -151,8 +147,8 @@ int completed_downloads_ = 0; // The reason background fetch was aborted. - BackgroundFetchReasonToAbort reason_to_abort_ = - BackgroundFetchReasonToAbort::NONE; + blink::mojom::BackgroundFetchFailureReason reason_to_abort_ = + blink::mojom::BackgroundFetchFailureReason::NONE; base::WeakPtrFactory<BackgroundFetchJobController> weak_ptr_factory_;
diff --git a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc index b231b85f..8d2003d 100644 --- a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc +++ b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
@@ -29,6 +29,7 @@ #include "content/public/test/fake_download_item.h" #include "content/public/test/mock_download_manager.h" #include "testing/gmock/include/gmock/gmock.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" using testing::_; @@ -55,7 +56,7 @@ const BackgroundFetchRegistrationId& registration_id) { if (finished_requests_.count(registration_id)) { DCHECK_NE(finished_requests_[registration_id], - BackgroundFetchReasonToAbort::NONE); + blink::mojom::BackgroundFetchFailureReason::NONE); return JobCompletionStatus::kAborted; } @@ -179,7 +180,8 @@ uint64_t last_downloaded_ = 0; std::map<BackgroundFetchRegistrationId, int> pending_requests_counts_; - std::map<BackgroundFetchRegistrationId, BackgroundFetchReasonToAbort> + std::map<BackgroundFetchRegistrationId, + blink::mojom::BackgroundFetchFailureReason> finished_requests_; // Closure that will be invoked every time the JobController receives a @@ -199,8 +201,9 @@ job_progress_closure_.Run(); } - void DidFinishJob(const BackgroundFetchRegistrationId& registration_id, - BackgroundFetchReasonToAbort reason_to_abort) { + void DidFinishJob( + const BackgroundFetchRegistrationId& registration_id, + blink::mojom::BackgroundFetchFailureReason reason_to_abort) { auto iter = pending_requests_counts_.find(registration_id); DCHECK(iter != pending_requests_counts_.end()); @@ -300,7 +303,8 @@ base::BindOnce(&BackgroundFetchJobControllerTest::OnRequestFinished, base::Unretained(this), registration_id)); - controller->Abort(BackgroundFetchReasonToAbort::CANCELLED_FROM_UI); + controller->Abort( + blink::mojom::BackgroundFetchFailureReason::CANCELLED_FROM_UI); base::RunLoop().RunUntilIdle();
diff --git a/content/browser/background_fetch/background_fetch_metrics.cc b/content/browser/background_fetch/background_fetch_metrics.cc index ec5979b..12772cd 100644 --- a/content/browser/background_fetch/background_fetch_metrics.cc +++ b/content/browser/background_fetch/background_fetch_metrics.cc
@@ -5,11 +5,20 @@ #include "content/browser/background_fetch/background_fetch_metrics.h" #include "base/metrics/histogram_macros.h" +#include "content/browser/web_contents/web_contents_impl.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/web_contents.h" +#include "services/metrics/public/cpp/metrics_utils.h" +#include "services/metrics/public/cpp/ukm_builders.h" +#include "services/metrics/public/cpp/ukm_recorder.h" namespace content { namespace background_fetch { +// Exponential bucket spacing for UKM event data. +const double kUkmEventDataBucketSpacing = 2.0; + void RecordSchedulerFinishedError(blink::mojom::BackgroundFetchError error) { UMA_HISTOGRAM_ENUMERATION("BackgroundFetch.SchedulerFinishedError", error); } @@ -22,6 +31,39 @@ UMA_HISTOGRAM_ENUMERATION("BackgroundFetch.RegistrationDeletedError", error); } +void RecordBackgroundFetchUkmEvent( + const url::Origin& origin, + const std::vector<ServiceWorkerFetchRequest>& requests, + const BackgroundFetchOptions& options, + const SkBitmap& icon, + int frame_tree_node_id, + bool has_permission) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + // Only record UKM data if there's a frame associated. + auto* web_contents = WebContents::FromFrameTreeNodeId(frame_tree_node_id); + if (!web_contents) + return; + + // Only record UKM data if the origin of the page currently being displayed + // is the same as the one the background fetch was started with. + auto displayed_origin = web_contents->GetLastCommittedURL().GetOrigin(); + if (!origin.IsSameOriginWith(url::Origin::Create(displayed_origin))) + return; + ukm::SourceId source_id = static_cast<WebContentsImpl*>(web_contents) + ->GetUkmSourceIdForLastCommittedSource(); + + ukm::builders::BackgroundFetch(source_id) + .SetHasTitle(!options.title.empty()) + .SetNumIcons(options.icons.size()) + .SetDownloadTotal(ukm::GetExponentialBucketMin( + options.download_total, kUkmEventDataBucketSpacing)) + .SetNumRequestsInFetch(ukm::GetExponentialBucketMin( + requests.size(), kUkmEventDataBucketSpacing)) + .SetDeniedDueToPermissions(!has_permission) + .Record(ukm::UkmRecorder::Get()); +} + } // namespace background_fetch } // namespace content
diff --git a/content/browser/background_fetch/background_fetch_metrics.h b/content/browser/background_fetch/background_fetch_metrics.h index 977b33b..dad6a35 100644 --- a/content/browser/background_fetch/background_fetch_metrics.h +++ b/content/browser/background_fetch/background_fetch_metrics.h
@@ -24,6 +24,17 @@ // associated with a registration has been completely deleted. void RecordRegistrationDeletedError(blink::mojom::BackgroundFetchError error); +// Records the BackgroundFetch UKM event. Must be called before a Background +// Fetch registration has been created. Will be a no-op if |frame_tree_node_id| +// does not identify a valid, live frame. +void RecordBackgroundFetchUkmEvent( + const url::Origin& origin, + const std::vector<ServiceWorkerFetchRequest>& requests, + const BackgroundFetchOptions& options, + const SkBitmap& icon, + int frame_tree_node_id, + bool has_permission); + } // namespace background_fetch } // namespace content
diff --git a/content/browser/background_fetch/background_fetch_scheduler.cc b/content/browser/background_fetch/background_fetch_scheduler.cc index 4fe7cf3..63fa719 100644 --- a/content/browser/background_fetch/background_fetch_scheduler.cc +++ b/content/browser/background_fetch/background_fetch_scheduler.cc
@@ -23,16 +23,18 @@ BackgroundFetchScheduler::Controller::~Controller() = default; void BackgroundFetchScheduler::Controller::Finish( - BackgroundFetchReasonToAbort reason_to_abort) { - DCHECK(reason_to_abort != BackgroundFetchReasonToAbort::NONE || + blink::mojom::BackgroundFetchFailureReason reason_to_abort) { + DCHECK(reason_to_abort != blink::mojom::BackgroundFetchFailureReason::NONE || !HasMoreRequests()); scheduler_->RemoveJobController(this); // Developer-initiated abortions will have already marked the registration for // deletion, so make sure that we don't execute the same code-path twice. - if (reason_to_abort == BackgroundFetchReasonToAbort::ABORTED_BY_DEVELOPER) + if (reason_to_abort == + blink::mojom::BackgroundFetchFailureReason::CANCELLED_BY_DEVELOPER) { return; + } // Race conditions make it possible for a controller to finish twice. This // should be removed when the scheduler starts owning the controllers. @@ -141,7 +143,7 @@ return; } - active_controller_->Finish(BackgroundFetchReasonToAbort::NONE); + active_controller_->Finish(blink::mojom::BackgroundFetchFailureReason::NONE); } } // namespace content
diff --git a/content/browser/background_fetch/background_fetch_scheduler.h b/content/browser/background_fetch/background_fetch_scheduler.h index 449ea669..3c692bd 100644 --- a/content/browser/background_fetch/background_fetch_scheduler.h +++ b/content/browser/background_fetch/background_fetch_scheduler.h
@@ -16,12 +16,12 @@ #include "base/memory/weak_ptr.h" #include "content/browser/background_fetch/background_fetch_registration_id.h" #include "content/common/content_export.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" namespace content { class BackgroundFetchRegistrationId; class BackgroundFetchRequestInfo; -enum class BackgroundFetchReasonToAbort; // Maintains a list of Controllers and chooses which ones should launch new // downloads. @@ -29,7 +29,7 @@ public: using FinishedCallback = base::OnceCallback<void(const BackgroundFetchRegistrationId&, - BackgroundFetchReasonToAbort)>; + blink::mojom::BackgroundFetchFailureReason)>; // Interface for download job controllers. class CONTENT_EXPORT Controller { @@ -46,7 +46,7 @@ virtual void StartRequest(scoped_refptr<BackgroundFetchRequestInfo> request, RequestFinishedCallback callback) = 0; - void Finish(BackgroundFetchReasonToAbort reason_to_abort); + void Finish(blink::mojom::BackgroundFetchFailureReason reason_to_abort); const BackgroundFetchRegistrationId& registration_id() const { return registration_id_;
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index f132d5e..5cea69cf 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -188,6 +188,7 @@ #include "base/memory/memory_pressure_monitor_win.h" #include "net/base/winsock_init.h" #include "services/service_manager/sandbox/win/sandbox_win.h" +#include "ui/base/l10n/l10n_util_win.h" #include "ui/display/win/screen_win.h" #endif @@ -616,6 +617,14 @@ #endif // defined(USE_GLIB) if (parts_) { +#if defined(OS_WIN) + // If we're running tests (ui_task is non-null), then the ResourceBundle + // has already been initialized. + if (!parameters_.ui_task) { + // Override the configured locale with the user's preferred UI language. + l10n_util::OverrideLocaleWithUILanguageList(); + } +#endif const int pre_early_init_error_code = parts_->PreEarlyInitialization(); if (pre_early_init_error_code != service_manager::RESULT_CODE_NORMAL_EXIT) return pre_early_init_error_code;
diff --git a/content/browser/devtools/devtools_url_interceptor_request_job.cc b/content/browser/devtools/devtools_url_interceptor_request_job.cc index 908bd7c..b67076c 100644 --- a/content/browser/devtools/devtools_url_interceptor_request_job.cc +++ b/content/browser/devtools/devtools_url_interceptor_request_job.cc
@@ -1248,6 +1248,11 @@ response_headers_callback_ = std::move(callback); } +void DevToolsURLInterceptorRequestJob::ContinueDespiteLastError() { + if (sub_request_) + sub_request_->request()->ContinueDespiteLastError(); +} + DevToolsURLInterceptorRequestJob::RequestDetails::RequestDetails( const GURL& url, const std::string& method,
diff --git a/content/browser/devtools/devtools_url_interceptor_request_job.h b/content/browser/devtools/devtools_url_interceptor_request_job.h index ac37f72..0dc53c2 100644 --- a/content/browser/devtools/devtools_url_interceptor_request_job.h +++ b/content/browser/devtools/devtools_url_interceptor_request_job.h
@@ -61,6 +61,7 @@ void SetRequestHeadersCallback(net::RequestHeadersCallback callback) override; void SetResponseHeadersCallback( net::ResponseHeadersCallback callback) override; + void ContinueDespiteLastError() override; // Must be called on IO thread. void StopIntercepting();
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc index 2c570588..193dcdb 100644 --- a/content/browser/devtools/protocol/browser_handler.cc +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -268,5 +268,10 @@ } } +Response BrowserHandler::Crash() { + CHECK(false); + return Response::OK(); +} + } // namespace protocol } // namespace content
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h index 5175b0ff..3b8515a 100644 --- a/content/browser/devtools/protocol/browser_handler.h +++ b/content/browser/devtools/protocol/browser_handler.h
@@ -53,6 +53,8 @@ Response ResetPermissions(Maybe<std::string> browser_context_id) override; + Response Crash() override; + private: Response FindBrowserContext(const Maybe<std::string>& browser_context_id, BrowserContext** browser_context);
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index c66b3c9..57a7497 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" +#include "base/json/json_reader.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "base/sys_info.h" @@ -1356,6 +1357,48 @@ ->GetURL()); } +IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, + CertificateErrorRequestInterception) { + net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); + https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED); + https_server.ServeFilesFromSourceDirectory("content/test/data"); + ASSERT_TRUE(https_server.Start()); + GURL test_url = https_server.GetURL("/devtools/navigation.html"); + + shell()->LoadURL(GURL("about:blank")); + WaitForLoadStop(shell()->web_contents()); + + Attach(); + SendCommand("Network.enable", nullptr, true); + SendCommand("Security.enable", nullptr, false); + SendCommand( + "Network.setRequestInterception", + base::JSONReader::Read("{\"patterns\": [{\"urlPattern\": \"*\"}]}"), + true); + + SendCommand("Security.setIgnoreCertificateErrors", + base::JSONReader::Read("{\"ignore\": true}"), true); + + SendCommand("Network.clearBrowserCache", nullptr, true); + SendCommand("Network.clearBrowserCookies", nullptr, true); + TestNavigationObserver continue_observer(shell()->web_contents(), 1); + shell()->LoadURL(test_url); + std::unique_ptr<base::DictionaryValue> params = + WaitForNotification("Network.requestIntercepted", false); + std::string interceptionId; + EXPECT_TRUE(params->GetString("interceptionId", &interceptionId)); + SendCommand("Network.continueInterceptedRequest", + base::JSONReader::Read("{\"interceptionId\": \"" + + interceptionId + "\"}"), + false); + continue_observer.Wait(); + EXPECT_EQ(test_url, shell() + ->web_contents() + ->GetController() + .GetLastCommittedEntry() + ->GetURL()); +} + IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CertificateErrorBrowserTarget) { net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.cc b/content/browser/devtools/protocol/devtools_protocol_test_support.cc index 41ba4bc..14d94c8a 100644 --- a/content/browser/devtools/protocol/devtools_protocol_test_support.cc +++ b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
@@ -47,7 +47,7 @@ base::DictionaryValue* DevToolsProtocolTest::SendCommand( const std::string& method, - std::unique_ptr<base::DictionaryValue> params, + std::unique_ptr<base::Value> params, bool wait) { in_dispatch_ = true; base::DictionaryValue command;
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.h b/content/browser/devtools/protocol/devtools_protocol_test_support.h index 15e5d23..cb8a499 100644 --- a/content/browser/devtools/protocol/devtools_protocol_test_support.h +++ b/content/browser/devtools/protocol/devtools_protocol_test_support.h
@@ -40,16 +40,14 @@ content::WebContents* web_contents, content::SecurityStyleExplanations* security_style_explanations) override; - base::DictionaryValue* SendCommand( - const std::string& method, - std::unique_ptr<base::DictionaryValue> params) { + base::DictionaryValue* SendCommand(const std::string& method, + std::unique_ptr<base::Value> params) { return SendCommand(method, std::move(params), true); } - base::DictionaryValue* SendCommand( - const std::string& method, - std::unique_ptr<base::DictionaryValue> params, - bool wait); + base::DictionaryValue* SendCommand(const std::string& method, + std::unique_ptr<base::Value> params, + bool wait); void WaitForResponse();
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 92d7822..64115be 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -448,6 +448,8 @@ type = ui::PAGE_TRANSITION_LINK; else if (transition_type == Page::TransitionTypeEnum::Typed) type = ui::PAGE_TRANSITION_TYPED; + else if (transition_type == Page::TransitionTypeEnum::Address_bar) + type = ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; else if (transition_type == Page::TransitionTypeEnum::Auto_bookmark) type = ui::PAGE_TRANSITION_AUTO_BOOKMARK; else if (transition_type == Page::TransitionTypeEnum::Auto_subframe)
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json index 1c77929..98c9cee 100644 --- a/content/browser/devtools/protocol_config.json +++ b/content/browser/devtools/protocol_config.json
@@ -11,7 +11,7 @@ "options": [ { "domain": "Browser", - "include": ["getVersion", "getHistograms", "getHistogram", "getBrowserCommandLine", "grantPermissions", "resetPermissions"] + "include": ["getVersion", "getHistograms", "getHistogram", "getBrowserCommandLine", "grantPermissions", "resetPermissions", "crash"] }, { "domain": "DOM",
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc index ed5a3d8..4952e5e8 100644 --- a/content/browser/frame_host/frame_tree.cc +++ b/content/browser/frame_host/frame_tree.cc
@@ -100,9 +100,6 @@ manager_delegate_(manager_delegate), root_(new FrameTreeNode(this, navigator, - render_frame_delegate, - render_widget_delegate, - manager_delegate, nullptr, // The top-level frame must always be in a // document scope. @@ -195,10 +192,8 @@ return false; std::unique_ptr<FrameTreeNode> new_node = base::WrapUnique(new FrameTreeNode( - this, parent->navigator(), render_frame_delegate_, - render_widget_delegate_, manager_delegate_, parent, scope, frame_name, - frame_unique_name, is_created_by_script, devtools_frame_token, - frame_owner_properties)); + this, parent->navigator(), parent, scope, frame_name, frame_unique_name, + is_created_by_script, devtools_frame_token, frame_owner_properties)); // Set sandbox flags and container policy and make them effective immediately, // since initial sandbox flags and feature policy should apply to the initial
diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h index 248489e..6aa4ee1b 100644 --- a/content/browser/frame_host/frame_tree.h +++ b/content/browser/frame_host/frame_tree.h
@@ -102,6 +102,23 @@ FrameTreeNode* root() const { return root_; } + // Delegates for RenderFrameHosts, RenderViewHosts, RenderWidgetHosts and + // RenderFrameHostManagers. These can be kept centrally on the FrameTree + // because they are expected to be the same for all frames on a given + // FrameTree. + RenderFrameHostDelegate* render_frame_delegate() { + return render_frame_delegate_; + } + RenderViewHostDelegate* render_view_delegate() { + return render_view_delegate_; + } + RenderWidgetHostDelegate* render_widget_delegate() { + return render_widget_delegate_; + } + RenderFrameHostManager::Delegate* manager_delegate() { + return manager_delegate_; + } + // Returns the FrameTreeNode with the given |frame_tree_node_id| if it is part // of this FrameTree. FrameTreeNode* FindByID(int frame_tree_node_id);
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 46e3d2a76..7e1ab4d 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -88,9 +88,6 @@ FrameTreeNode::FrameTreeNode(FrameTree* frame_tree, Navigator* navigator, - RenderFrameHostDelegate* render_frame_delegate, - RenderWidgetHostDelegate* render_widget_delegate, - RenderFrameHostManager::Delegate* manager_delegate, FrameTreeNode* parent, blink::WebTreeScopeType scope, const std::string& name, @@ -100,10 +97,7 @@ const FrameOwnerProperties& frame_owner_properties) : frame_tree_(frame_tree), navigator_(navigator), - render_manager_(this, - render_frame_delegate, - render_widget_delegate, - manager_delegate), + render_manager_(this, frame_tree->manager_delegate()), frame_tree_node_id_(next_frame_tree_node_id_++), parent_(parent), depth_(parent ? parent->depth_ + 1 : 0u),
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h index cee8a19..6834b83 100644 --- a/content/browser/frame_host/frame_tree_node.h +++ b/content/browser/frame_host/frame_tree_node.h
@@ -62,9 +62,6 @@ // calling the constructor. FrameTreeNode(FrameTree* frame_tree, Navigator* navigator, - RenderFrameHostDelegate* render_frame_delegate, - RenderWidgetHostDelegate* render_widget_delegate, - RenderFrameHostManager::Delegate* manager_delegate, FrameTreeNode* parent, blink::WebTreeScopeType scope, const std::string& name,
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc index d8aca9e2..2a4126b6 100644 --- a/content/browser/frame_host/navigation_controller_impl.cc +++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -1848,7 +1848,8 @@ std::unique_ptr<NavigationRequest> request = CreateNavigationRequest( render_frame_host->frame_tree_node(), *entry, frame_entry, ReloadType::NONE, false /* is_same_document_history_load */, - true /* is_history_navigation_in_new_child */, nullptr, nullptr); + true /* is_history_navigation_in_new_child */, nullptr, nullptr, + base::TimeTicks() /* input_start */); if (!request) return false; @@ -1938,7 +1939,8 @@ std::unique_ptr<NavigationRequest> request = CreateNavigationRequest( render_frame_host->frame_tree_node(), *entry, frame_entry.get(), ReloadType::NONE, false /* is_same_document_history_load */, - false /* is_history_navigation_in_new_child */, post_body, nullptr); + false /* is_history_navigation_in_new_child */, post_body, nullptr, + base::TimeTicks() /* input_start */); if (!request) return; @@ -2195,7 +2197,8 @@ CreateNavigationRequest( root, *pending_entry_, pending_entry_->GetFrameEntry(root), reload_type, false /* is_same_document_history_load */, - false /* is_history_navigation_in_new_child */, nullptr, nullptr); + false /* is_history_navigation_in_new_child */, nullptr, nullptr, + base::TimeTicks() /* input_start */); if (!navigation_request) { // This navigation cannot start (e.g. the URL is invalid), delete the // pending NavigationEntry. @@ -2271,7 +2274,8 @@ CreateNavigationRequest( frame, *pending_entry_, new_item, reload_type, true /* is_same_document_history_load */, - false /* is_history_navigation_in_new_child */, nullptr, nullptr); + false /* is_history_navigation_in_new_child */, nullptr, nullptr, + base::TimeTicks() /* input_start */); if (navigation_request) { // Only add the request if was properly created. It's possible for the // creation to fail in certain cases, e.g. when the URL is invalid. @@ -2297,7 +2301,8 @@ CreateNavigationRequest( frame, *pending_entry_, new_item, reload_type, false /* is_same_document_history_load */, - false /* is_history_navigation_in_new_child */, nullptr, nullptr); + false /* is_history_navigation_in_new_child */, nullptr, nullptr, + base::TimeTicks() /* input_start */); if (navigation_request) { // Only add the request if was properly created. It's possible for the // creation to fail in certain cases, e.g. when the URL is invalid. @@ -2381,7 +2386,8 @@ node, *pending_entry_, pending_entry_->GetFrameEntry(node), reload_type, false /* is_same_document_history_load */, false /* is_history_navigation_in_new_child */, nullptr, - params.navigation_ui_data ? params.navigation_ui_data->Clone() : nullptr); + params.navigation_ui_data ? params.navigation_ui_data->Clone() : nullptr, + params.input_start); // If the navigation couldn't start, return immediately and discard the // pending NavigationEntry. @@ -2543,7 +2549,8 @@ bool is_same_document_history_load, bool is_history_navigation_in_new_child, const scoped_refptr<network::ResourceRequestBody>& post_body, - std::unique_ptr<NavigationUIData> navigation_ui_data) { + std::unique_ptr<NavigationUIData> navigation_ui_data, + base::TimeTicks input_start) { GURL dest_url = frame_entry->url(); Referrer dest_referrer = frame_entry->referrer(); if (reload_type == ReloadType::ORIGINAL_REQUEST_URL && @@ -2616,7 +2623,7 @@ frame_tree_node, dest_url, dest_referrer, *frame_entry, entry, navigation_type, previews_state, is_same_document_history_load, is_history_navigation_in_new_child, post_body, navigation_start, this, - std::move(navigation_ui_data)); + std::move(navigation_ui_data), input_start); } void NavigationControllerImpl::NotifyNavigationEntryCommitted(
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h index 8b3502c..e371105 100644 --- a/content/browser/frame_host/navigation_controller_impl.h +++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -293,7 +293,8 @@ bool is_same_document_history_load, bool is_history_navigation_in_new_child, const scoped_refptr<network::ResourceRequestBody>& post_body, - std::unique_ptr<NavigationUIData> navigation_ui_data); + std::unique_ptr<NavigationUIData> navigation_ui_data, + base::TimeTicks input_start); // Returns whether there is a pending NavigationEntry whose unique ID matches // the given NavigationHandle's pending_nav_entry_id.
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc index aa9c80e..bd85169 100644 --- a/content/browser/frame_host/navigation_entry_impl.cc +++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -686,7 +686,8 @@ const Referrer& dest_referrer, FrameMsg_Navigate_Type::Value navigation_type, PreviewsState previews_state, - const base::TimeTicks& navigation_start) const { + base::TimeTicks navigation_start, + base::TimeTicks input_start) const { return CommonNavigationParams( dest_url, dest_referrer, GetTransitionType(), navigation_type, !IsViewSourceMode(), should_replace_entry(), GetBaseURLForDataURL(), @@ -696,7 +697,7 @@ CSPDisposition::CHECK /* should_check_main_world_csp */, has_started_from_context_menu(), has_user_gesture(), std::vector<ContentSecurityPolicy>() /* initiator_csp */, - CSPSource() /* initiator_self_source */); + CSPSource() /* initiator_self_source */, input_start); } RequestNavigationParams NavigationEntryImpl::ConstructRequestNavigationParams(
diff --git a/content/browser/frame_host/navigation_entry_impl.h b/content/browser/frame_host/navigation_entry_impl.h index 8c398afe..858d2af 100644 --- a/content/browser/frame_host/navigation_entry_impl.h +++ b/content/browser/frame_host/navigation_entry_impl.h
@@ -187,7 +187,8 @@ const Referrer& dest_referrer, FrameMsg_Navigate_Type::Value navigation_type, PreviewsState previews_state, - const base::TimeTicks& navigation_start) const; + base::TimeTicks navigation_start, + base::TimeTicks input_start) const; RequestNavigationParams ConstructRequestNavigationParams( const FrameNavigationEntry& frame_entry, const GURL& original_url,
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 07d350a..b22c4a1 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -28,6 +28,7 @@ #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/loader/navigation_url_loader.h" #include "content/browser/renderer_host/render_process_host_impl.h" +#include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_navigation_handle.h" @@ -287,9 +288,10 @@ bool is_same_document_history_load, bool is_history_navigation_in_new_child, const scoped_refptr<network::ResourceRequestBody>& post_body, - const base::TimeTicks& navigation_start, + base::TimeTicks navigation_start, NavigationControllerImpl* controller, - std::unique_ptr<NavigationUIData> navigation_ui_data) { + std::unique_ptr<NavigationUIData> navigation_ui_data, + base::TimeTicks input_start) { // A form submission happens either because the navigation is a // renderer-initiated form submission that took the OpenURL path or a // back/forward/reload navigation the does a form resubmission. @@ -322,7 +324,7 @@ CommonNavigationParams common_params = entry.ConstructCommonNavigationParams( frame_entry, request_body, dest_url, dest_referrer, navigation_type, - previews_state, navigation_start); + previews_state, navigation_start, input_start); RequestNavigationParams request_params = entry.ConstructRequestNavigationParams(
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h index 5d4aa5c..7171f048 100644 --- a/content/browser/frame_host/navigation_request.h +++ b/content/browser/frame_host/navigation_request.h
@@ -91,9 +91,10 @@ bool is_same_document_history_load, bool is_history_navigation_in_new_child, const scoped_refptr<network::ResourceRequestBody>& post_body, - const base::TimeTicks& navigation_start, + base::TimeTicks navigation_start, NavigationControllerImpl* controller, - std::unique_ptr<NavigationUIData> navigation_ui_data); + std::unique_ptr<NavigationUIData> navigation_ui_data, + base::TimeTicks input_start); // Creates a request for a renderer-intiated navigation. // Note: |body| is sent to the IO thread when calling BeginNavigation, and
diff --git a/content/browser/frame_host/render_frame_host_factory.cc b/content/browser/frame_host/render_frame_host_factory.cc index 4276b86..5f8784a5 100644 --- a/content/browser/frame_host/render_frame_host_factory.cc +++ b/content/browser/frame_host/render_frame_host_factory.cc
@@ -19,7 +19,6 @@ SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id, @@ -28,14 +27,12 @@ bool renderer_initiated_creation) { if (factory_) { return factory_->CreateRenderFrameHost( - site_instance, render_view_host, delegate, rwh_delegate, frame_tree, - frame_tree_node, routing_id, widget_routing_id, hidden, - renderer_initiated_creation); + site_instance, render_view_host, delegate, frame_tree, frame_tree_node, + routing_id, widget_routing_id, hidden, renderer_initiated_creation); } return base::WrapUnique(new RenderFrameHostImpl( - site_instance, render_view_host, delegate, rwh_delegate, frame_tree, - frame_tree_node, routing_id, widget_routing_id, hidden, - renderer_initiated_creation)); + site_instance, render_view_host, delegate, frame_tree, frame_tree_node, + routing_id, widget_routing_id, hidden, renderer_initiated_creation)); } // static
diff --git a/content/browser/frame_host/render_frame_host_factory.h b/content/browser/frame_host/render_frame_host_factory.h index 5fd70cb..9b3c548 100644 --- a/content/browser/frame_host/render_frame_host_factory.h +++ b/content/browser/frame_host/render_frame_host_factory.h
@@ -19,7 +19,6 @@ class RenderFrameHostDelegate; class RenderFrameHostImpl; class RenderViewHostImpl; -class RenderWidgetHostDelegate; class SiteInstance; // A factory for creating RenderFrameHosts. There is a global factory function @@ -33,7 +32,6 @@ SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id, @@ -54,7 +52,6 @@ SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id,
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 5be5a5b..1a58a87 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -84,7 +84,6 @@ #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h" #include "content/browser/renderer_host/render_view_host_impl.h" -#include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_factory.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" @@ -547,7 +546,6 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id, @@ -643,8 +641,8 @@ if (!render_widget_host_) { DCHECK(frame_tree_node->parent()); render_widget_host_ = RenderWidgetHostFactory::Create( - rwh_delegate, GetProcess(), widget_routing_id, std::move(widget), - hidden); + frame_tree_->render_widget_delegate(), GetProcess(), + widget_routing_id, std::move(widget), hidden); render_widget_host_->set_owned_by_render_frame_host(true); } else { DCHECK(!render_widget_host_->owned_by_render_frame_host());
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index d71a3c0..2733e0d9 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -138,7 +138,6 @@ class RenderFrameProxyHost; class RenderProcessHost; class RenderViewHostImpl; -class RenderWidgetHostDelegate; class RenderWidgetHostImpl; class RenderWidgetHostView; class RenderWidgetHostViewBase; @@ -799,7 +798,6 @@ RenderFrameHostImpl(SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id,
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc index 49ad391..5759ba43b 100644 --- a/content/browser/frame_host/render_frame_host_manager.cc +++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -68,15 +68,10 @@ } // namespace -RenderFrameHostManager::RenderFrameHostManager( - FrameTreeNode* frame_tree_node, - RenderFrameHostDelegate* render_frame_delegate, - RenderWidgetHostDelegate* render_widget_delegate, - Delegate* delegate) +RenderFrameHostManager::RenderFrameHostManager(FrameTreeNode* frame_tree_node, + Delegate* delegate) : frame_tree_node_(frame_tree_node), delegate_(delegate), - render_frame_delegate_(render_frame_delegate), - render_widget_delegate_(render_widget_delegate), weak_factory_(this) { DCHECK(frame_tree_node_); } @@ -1706,9 +1701,9 @@ } return RenderFrameHostFactory::Create( - site_instance, render_view_host, render_frame_delegate_, - render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, - widget_routing_id, hidden, renderer_initiated_creation); + site_instance, render_view_host, frame_tree->render_frame_delegate(), + frame_tree, frame_tree_node_, frame_routing_id, widget_routing_id, hidden, + renderer_initiated_creation); } bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( @@ -2169,7 +2164,9 @@ // Removing them when they are deleted is too late. // This needs to be done before updating the frame tree structure, else it // will have trouble removing the descendants. - render_frame_delegate_->FullscreenStateChanged(current_frame_host(), false); + frame_tree_node_->frame_tree() + ->render_frame_delegate() + ->FullscreenStateChanged(current_frame_host(), false); // While the old frame is still current, remove its children from the tree. frame_tree_node_->ResetForNewProcess();
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h index d8cf377..499e3cd 100644 --- a/content/browser/frame_host/render_frame_host_manager.h +++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -17,7 +17,6 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/browser/frame_host/render_frame_host_impl.h" -#include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/site_instance_impl.h" #include "content/common/content_export.h" #include "content/public/browser/global_request_id.h" @@ -34,12 +33,10 @@ class NavigationEntry; class NavigationRequest; class NavigatorTestWithBrowserSideNavigation; -class RenderFrameHostDelegate; class RenderFrameHostManagerTest; class RenderFrameProxyHost; class RenderViewHost; class RenderViewHostImpl; -class RenderWidgetHostDelegate; class RenderWidgetHostView; class TestWebContents; class WebUIImpl; @@ -176,17 +173,11 @@ virtual ~Delegate() {} }; - // All three delegate pointers must be non-NULL and are not owned by this - // class. They must outlive this class. The RenderViewHostDelegate and - // RenderWidgetHostDelegate are what will be installed into all - // RenderViewHosts that are created. + // The delegate pointer must be non-NULL and is not owned by this class. It + // must outlive this class. // // You must call Init() before using this class. - RenderFrameHostManager( - FrameTreeNode* frame_tree_node, - RenderFrameHostDelegate* render_frame_delegate, - RenderWidgetHostDelegate* render_widget_delegate, - Delegate* delegate); + RenderFrameHostManager(FrameTreeNode* frame_tree_node, Delegate* delegate); ~RenderFrameHostManager(); // For arguments, see WebContentsImpl constructor. @@ -747,11 +738,6 @@ // Our delegate, not owned by us. Guaranteed non-NULL. Delegate* delegate_; - // Implemented by the owner of this class. These delegates are installed into - // all the RenderFrameHosts that we create. - RenderFrameHostDelegate* render_frame_delegate_; - RenderWidgetHostDelegate* render_widget_delegate_; - // Our RenderFrameHost which is responsible for all communication with a child // RenderFrame instance. // For now, RenderFrameHost keeps a RenderViewHost in its SiteInstance alive.
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index bc5e48e..4f184f7 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -450,7 +450,7 @@ manager->frame_tree_node_, frame_entry->url(), frame_entry->referrer(), *frame_entry, entry, navigate_type, PREVIEWS_UNSPECIFIED, false, false, nullptr, base::TimeTicks::Now(), - controller, nullptr); + controller, nullptr, base::TimeTicks()); // Simulates request creation that triggers the 1st internal call to // GetFrameHostForNavigation. @@ -2823,7 +2823,8 @@ frame_entry->referrer(), *frame_entry, entry, FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, PREVIEWS_UNSPECIFIED, false, false, nullptr, base::TimeTicks::Now(), - static_cast<NavigationControllerImpl*>(&controller()), nullptr); + static_cast<NavigationControllerImpl*>(&controller()), nullptr, + base::TimeTicks()); manager->DidCreateNavigationRequest(navigation_request.get()); // As the initial RenderFrame was not live, the new RenderFrameHost should be @@ -2885,7 +2886,8 @@ frame_entry->referrer(), *frame_entry, entry, FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, PREVIEWS_UNSPECIFIED, false, false, nullptr, base::TimeTicks::Now(), - static_cast<NavigationControllerImpl*>(&controller()), nullptr); + static_cast<NavigationControllerImpl*>(&controller()), nullptr, + base::TimeTicks()); manager->DidCreateNavigationRequest(navigation_request.get()); // The current WebUI should still be in place and the pending WebUI should be @@ -2944,7 +2946,8 @@ frame_entry->referrer(), *frame_entry, entry, FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, PREVIEWS_UNSPECIFIED, false, false, nullptr, base::TimeTicks::Now(), - static_cast<NavigationControllerImpl*>(&controller()), nullptr); + static_cast<NavigationControllerImpl*>(&controller()), nullptr, + base::TimeTicks()); manager->DidCreateNavigationRequest(navigation_request.get()); // The current WebUI should still be in place and there should be a new
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 974f157..756936a2 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -15,7 +15,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" -#include "base/debug/alias.h" #include "base/feature_list.h" #include "base/logging.h" #include "base/macros.h" @@ -983,11 +982,6 @@ } void GpuProcessHost::OnProcessLaunchFailed(int error_code) { - // TODO(crbug.com/849639): Ensure |error_code| is included in crash minidumps. - // This is for debugging and should be removed when bug is closed. - int process_launch_error_code = error_code; - base::debug::Alias(&process_launch_error_code); - #if defined(OS_WIN) if (kind_ == GPU_PROCESS_KIND_SANDBOXED) RecordAppContainerStatus(error_code, crashed_before_); @@ -996,11 +990,6 @@ } void GpuProcessHost::OnProcessCrashed(int exit_code) { - // TODO(crbug.com/849639): Ensure |exit_code| is included in crash minidumps. - // This is for debugging and should be removed when bug is closed. - int process_crash_exit_code = exit_code; - base::debug::Alias(&process_crash_exit_code); - // Record crash before doing anything that could start a new GPU process. RecordProcessCrash(); @@ -1268,16 +1257,6 @@ recent_crash_count = display_compositor_recent_crash_count_; } - // TODO(crbug.com/849639): Ensure crash counts are included in crash - // minidumps. This is for debugging and should be removed when bug is closed. - int hardware_accelerated_crash_count = - hardware_accelerated_recent_crash_count_; - base::debug::Alias(&hardware_accelerated_crash_count); - int swiftshader_crash_count = swiftshader_recent_crash_count_; - base::debug::Alias(&swiftshader_crash_count); - int display_compositor_crash_count = display_compositor_recent_crash_count_; - base::debug::Alias(&display_compositor_crash_count); - // GPU process initialization failed and fallback already happened. if (!gpu_host_ || !gpu_host_->initialized()) return;
diff --git a/content/browser/loader/resource_message_filter.cc b/content/browser/loader/resource_message_filter.cc index 2f531f5..5184d20 100644 --- a/content/browser/loader/resource_message_filter.cc +++ b/content/browser/loader/resource_message_filter.cc
@@ -184,7 +184,8 @@ std::make_unique<URLLoaderFactoryImpl>(requester_info_), base::BindRepeating(&ResourceDispatcherHostImpl::CancelRequest, base::Unretained(ResourceDispatcherHostImpl::Get()), - requester_info_->child_id())); + requester_info_->child_id()), + nullptr); std::vector<network::mojom::URLLoaderFactoryRequest> requests = std::move(queued_clone_requests_);
diff --git a/content/browser/notifications/blink_notification_service_impl.cc b/content/browser/notifications/blink_notification_service_impl.cc index 73c5d6b4..84f5070 100644 --- a/content/browser/notifications/blink_notification_service_impl.cc +++ b/content/browser/notifications/blink_notification_service_impl.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback_helpers.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/strings/string16.h" #include "content/browser/notifications/notification_event_dispatcher_impl.h" @@ -18,6 +19,7 @@ #include "content/public/browser/permission_type.h" #include "content/public/browser/platform_notification_service.h" #include "content/public/common/content_client.h" +#include "content/public/common/content_features.h" #include "content/public/common/notification_resources.h" #include "content/public/common/platform_notification_data.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" @@ -27,6 +29,10 @@ namespace { +const char kBadMessageImproperNotificationImage[] = + "Received an unexpected message with image while notification images are " + "disabled."; + // Returns the implementation of the PlatformNotificationService. May be NULL. PlatformNotificationService* GetNotificationService() { return GetContentClient()->browser()->GetPlatformNotificationService(); @@ -83,6 +89,9 @@ const NotificationResources& notification_resources, blink::mojom::NonPersistentNotificationListenerPtr event_listener_ptr) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!ValidateNotificationResources(notification_resources)) + return; + if (!GetNotificationService()) return; @@ -133,12 +142,28 @@ origin_.GetURL()); } +bool BlinkNotificationServiceImpl::ValidateNotificationResources( + const NotificationResources& notification_resources) { + if (notification_resources.image.drawsNothing() || + base::FeatureList::IsEnabled(features::kNotificationContentImage)) + return true; + binding_.ReportBadMessage(kBadMessageImproperNotificationImage); + // The above ReportBadMessage() closes |binding_| but does not trigger its + // connection error handler, so we need to call the error handler explicitly + // here to do some necessary work. + OnConnectionError(); + return false; +} + void BlinkNotificationServiceImpl::DisplayPersistentNotification( int64_t service_worker_registration_id, const PlatformNotificationData& platform_notification_data, const NotificationResources& notification_resources, DisplayPersistentNotificationCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!ValidateNotificationResources(notification_resources)) + return; + if (!GetNotificationService()) { std::move(callback).Run(PersistentNotificationError::INTERNAL_ERROR); return;
diff --git a/content/browser/notifications/blink_notification_service_impl.h b/content/browser/notifications/blink_notification_service_impl.h index 193f5d2..aed37b1 100644 --- a/content/browser/notifications/blink_notification_service_impl.h +++ b/content/browser/notifications/blink_notification_service_impl.h
@@ -62,6 +62,13 @@ // Check the permission status for the current |origin_|. blink::mojom::PermissionStatus CheckPermissionStatus(); + // Validate |notification_resources| received in a Mojo IPC message. + // If the validation failed, we'd close the Mojo connection |binding_| and + // destroy |this| by calling OnConnectionError() directly, then return false. + // So, please do not touch |this| again after you got a false return value. + bool ValidateNotificationResources( + const NotificationResources& notification_resources); + void DisplayPersistentNotificationOnIOThread( int64_t service_worker_registration_id, int64_t persistent_notification_id,
diff --git a/content/browser/notifications/blink_notification_service_impl_unittest.cc b/content/browser/notifications/blink_notification_service_impl_unittest.cc index 618c7bd..8de2804 100644 --- a/content/browser/notifications/blink_notification_service_impl_unittest.cc +++ b/content/browser/notifications/blink_notification_service_impl_unittest.cc
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" #include "base/test/test_simple_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/notifications/blink_notification_service_impl.h" @@ -19,18 +20,21 @@ #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/browser/permission_type.h" +#include "content/public/common/content_features.h" #include "content/public/test/mock_permission_manager.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" #include "content/test/mock_platform_notification_service.h" #include "content/test/test_content_browser_client.h" +#include "mojo/core/embedder/embedder.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/modules/notifications/notification_service.mojom.h" #include "third_party/blink/public/platform/modules/permissions/permission_status.mojom.h" +#include "third_party/skia/include/core/SkBitmap.h" using ::testing::Return; using ::testing::_; @@ -41,6 +45,16 @@ const char kTestOrigin[] = "https://example.com"; const char kTestServiceWorkerUrl[] = "https://example.com/sw.js"; +const char kBadMessageImproperNotificationImage[] = + "Received an unexpected message with image while notification images are " + "disabled."; + +SkBitmap CreateBitmap(int width, int height, SkColor color) { + SkBitmap bitmap; + bitmap.allocN32Pixels(width, height); + bitmap.eraseColor(color); + return bitmap; +} class MockNonPersistentNotificationListener : public blink::mojom::NonPersistentNotificationListener { @@ -110,19 +124,25 @@ // will be initialized long before it is read from so this is fine. RunAllTasksUntilIdle(); - blink::mojom::NotificationServicePtr notification_service_ptr; notification_service_ = std::make_unique<BlinkNotificationServiceImpl>( notification_context_.get(), &browser_context_, embedded_worker_helper_->context_wrapper(), url::Origin::Create(GURL(kTestOrigin)), - mojo::MakeRequest(¬ification_service_ptr)); + mojo::MakeRequest(¬ification_service_ptr_)); // Provide a mock permission manager to the |browser_context_|. browser_context_.SetPermissionControllerDelegate( std::make_unique<testing::NiceMock<MockPermissionManager>>()); + + mojo::core::SetDefaultProcessErrorCallback(base::AdaptCallbackForRepeating( + base::BindOnce(&BlinkNotificationServiceImplTest::OnMojoError, + base::Unretained(this)))); } void TearDown() override { + mojo::core::SetDefaultProcessErrorCallback( + mojo::core::ProcessErrorCallback()); + embedded_worker_helper_.reset(); // Give pending shutdown operations a chance to finish. @@ -242,12 +262,29 @@ std::move(quit_closure).Run(); } + void DisplayNonPersistentNotification( + const std::string& token, + const PlatformNotificationData& platform_notification_data, + const NotificationResources& notification_resources, + blink::mojom::NonPersistentNotificationListenerPtr event_listener_ptr) { + notification_service_ptr_->DisplayNonPersistentNotification( + token, platform_notification_data, notification_resources, + std::move(event_listener_ptr)); + // TODO(https://crbug.com/787459): Pass a callback to + // DisplayNonPersistentNotification instead of waiting for all tasks to run + // here; a callback parameter will be needed anyway to enable + // non-persistent notification event acknowledgements - see bug. + RunAllTasksUntilIdle(); + } + void DisplayPersistentNotificationSync( int64_t service_worker_registration_id, const PlatformNotificationData& platform_notification_data, const NotificationResources& notification_resources) { base::RunLoop run_loop; - notification_service_->DisplayPersistentNotification( + notification_service_ptr_.set_connection_error_handler( + run_loop.QuitClosure()); + notification_service_ptr_->DisplayPersistentNotification( service_worker_registration_id, platform_notification_data, notification_resources, base::BindOnce( @@ -308,12 +345,16 @@ } protected: + void OnMojoError(const std::string& error) { bad_messages_.push_back(error); } + TestBrowserThreadBundle thread_bundle_; // Must be first member. std::unique_ptr<EmbeddedWorkerTestHelper> embedded_worker_helper_; std::unique_ptr<BlinkNotificationServiceImpl> notification_service_; + blink::mojom::NotificationServicePtr notification_service_ptr_; + TestBrowserContext browser_context_; scoped_refptr<PlatformNotificationContextImpl> notification_context_; @@ -324,6 +365,8 @@ blink::mojom::PersistentNotificationError display_persistent_callback_result_; + std::vector<std::string> bad_messages_; + private: NotificationBrowserClient notification_browser_client_; @@ -383,16 +426,10 @@ DisplayNonPersistentNotificationWithPermission) { SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED); - notification_service_->DisplayNonPersistentNotification( + DisplayNonPersistentNotification( "token", PlatformNotificationData(), NotificationResources(), non_persistent_notification_listener_.GetPtr()); - // TODO(https://crbug.com/787459): Pass a callback to - // DisplayNonPersistentNotification instead of waiting for all tasks to run - // here; a callback parameter will be needed anyway to enable - // non-persistent notification event acknowledgements - see bug. - RunAllTasksUntilIdle(); - EXPECT_EQ(1u, GetDisplayedNotifications().size()); } @@ -400,17 +437,81 @@ DisplayNonPersistentNotificationWithoutPermission) { SetPermissionStatus(blink::mojom::PermissionStatus::DENIED); - notification_service_->DisplayNonPersistentNotification( + DisplayNonPersistentNotification( "token", PlatformNotificationData(), NotificationResources(), non_persistent_notification_listener_.GetPtr()); - // TODO(https://crbug.com/787459): Pass a callback to - // DisplayNonPersistentNotification instead of waiting for all tasks to run - // here; a callback parameter will be needed anyway to enable - // non-persistent notification event acknowledgements - see bug. + EXPECT_EQ(0u, GetDisplayedNotifications().size()); +} + +TEST_F(BlinkNotificationServiceImplTest, + DisplayNonPersistentNotificationWithContentImageSwitchOn) { + SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED); + + NotificationResources resources; + resources.image = CreateBitmap(200, 100, SK_ColorMAGENTA); + DisplayNonPersistentNotification( + "token", PlatformNotificationData(), resources, + non_persistent_notification_listener_.GetPtr()); + + EXPECT_EQ(1u, GetDisplayedNotifications().size()); +} + +TEST_F(BlinkNotificationServiceImplTest, + DisplayNonPersistentNotificationWithContentImageSwitchOff) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + features::kNotificationContentImage); + SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED); + + ASSERT_TRUE(bad_messages_.empty()); + NotificationResources resources; + resources.image = CreateBitmap(200, 100, SK_ColorMAGENTA); + DisplayNonPersistentNotification( + "token", PlatformNotificationData(), resources, + non_persistent_notification_listener_.GetPtr()); + EXPECT_EQ(1u, bad_messages_.size()); + EXPECT_EQ(kBadMessageImproperNotificationImage, bad_messages_[0]); +} + +TEST_F(BlinkNotificationServiceImplTest, + DisplayPersistentNotificationWithContentImageSwitchOn) { + SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED); + + scoped_refptr<ServiceWorkerRegistration> registration; + RegisterServiceWorker(®istration); + + NotificationResources resources; + resources.image = CreateBitmap(200, 100, SK_ColorMAGENTA); + DisplayPersistentNotificationSync(registration->id(), + PlatformNotificationData(), resources); + + EXPECT_EQ(blink::mojom::PersistentNotificationError::NONE, + display_persistent_callback_result_); + + // Wait for service to receive the Display call. RunAllTasksUntilIdle(); - EXPECT_EQ(0u, GetDisplayedNotifications().size()); + EXPECT_EQ(1u, GetDisplayedNotifications().size()); +} + +TEST_F(BlinkNotificationServiceImplTest, + DisplayPersistentNotificationWithContentImageSwitchOff) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + features::kNotificationContentImage); + SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED); + + scoped_refptr<ServiceWorkerRegistration> registration; + RegisterServiceWorker(®istration); + + ASSERT_TRUE(bad_messages_.empty()); + NotificationResources resources; + resources.image = CreateBitmap(200, 100, SK_ColorMAGENTA); + DisplayPersistentNotificationSync(registration->id(), + PlatformNotificationData(), resources); + EXPECT_EQ(1u, bad_messages_.size()); + EXPECT_EQ(kBadMessageImproperNotificationImage, bad_messages_[0]); } TEST_F(BlinkNotificationServiceImplTest,
diff --git a/content/browser/presentation/presentation_service_impl_unittest.cc b/content/browser/presentation/presentation_service_impl_unittest.cc index 51fd39f10..1476c14 100644 --- a/content/browser/presentation/presentation_service_impl_unittest.cc +++ b/content/browser/presentation/presentation_service_impl_unittest.cc
@@ -175,9 +175,7 @@ class MockPresentationConnection : public PresentationConnection { public: - MOCK_METHOD2(OnMessage, - void(PresentationConnectionMessagePtr message, - base::OnceCallback<void(bool)> send_message_cb)); + MOCK_METHOD1(OnMessage, void(PresentationConnectionMessagePtr message)); MOCK_METHOD1(DidChangeState, void(PresentationConnectionState state)); MOCK_METHOD0(RequestClose, void()); };
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index a77ba76..429f73c0 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -696,7 +696,7 @@ needs_animate_(false), pending_frames_(0U), layer_tree_frame_sink_request_pending_(false), - lock_manager_(base::ThreadTaskRunnerHandle::Get(), this), + lock_manager_(base::ThreadTaskRunnerHandle::Get()), enable_surface_synchronization_( features::IsSurfaceSynchronizationEnabled()), enable_viz_( @@ -842,7 +842,7 @@ params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params.settings = &settings; params.mutator_host = animation_host_.get(); - host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); + host_ = cc::LayerTreeHost::CreateSingleThreaded(this, std::move(params)); DCHECK(!host_->IsVisible()); host_->SetViewportSizeAndScale(size_, root_window_->GetDipScale(), GenerateLocalSurfaceId()); @@ -1254,7 +1254,8 @@ std::unique_ptr<ui::CompositorLock> CompositorImpl::GetCompositorLock( ui::CompositorLockClient* client, base::TimeDelta timeout) { - return lock_manager_.GetCompositorLock(client, timeout); + return lock_manager_.GetCompositorLock(client, timeout, + host_->DeferCommits()); } bool CompositorImpl::IsDrawingFirstVisibleFrame() const { @@ -1274,11 +1275,6 @@ display_private_->SetVSyncPaused(paused); } -void CompositorImpl::OnCompositorLockStateChanged(bool locked) { - if (host_) - host_->SetDeferCommits(locked); -} - void CompositorImpl::EnqueueLowEndBackgroundCleanup() { if (base::SysInfo::IsLowEndDevice()) { low_end_background_cleanup_task_.Reset(
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h index 07afb242..355b28106 100644 --- a/content/browser/renderer_host/compositor_impl_android.h +++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -66,7 +66,6 @@ : public Compositor, public cc::LayerTreeHostClient, public cc::LayerTreeHostSingleThreadClient, - public ui::CompositorLockManagerClient, public ui::UIResourceProvider, public ui::WindowAndroidCompositor, public viz::HostFrameSinkClient, @@ -159,9 +158,6 @@ void OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) override; - // ui::CompositorLockManagerClient implementation. - void OnCompositorLockStateChanged(bool locked) override; - void SetVisible(bool visible); void CreateLayerTreeHost();
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc index 995ba36a..1c08009 100644 --- a/content/browser/renderer_host/delegated_frame_host.cc +++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -482,7 +482,6 @@ void DelegatedFrameHost::DidNavigate() { first_local_surface_id_after_navigation_ = pending_local_surface_id_; - received_frame_after_navigation_ = false; } bool DelegatedFrameHost::IsPrimarySurfaceEvicted() const {
diff --git a/content/browser/renderer_host/delegated_frame_host.h b/content/browser/renderer_host/delegated_frame_host.h index b223d47..71f9f940 100644 --- a/content/browser/renderer_host/delegated_frame_host.h +++ b/content/browser/renderer_host/delegated_frame_host.h
@@ -238,7 +238,6 @@ std::unique_ptr<viz::FrameEvictor> frame_evictor_; viz::LocalSurfaceId first_local_surface_id_after_navigation_; - bool received_frame_after_navigation_ = false; std::vector<std::unique_ptr<viz::CopyOutputRequest>> pending_first_frame_requests_;
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc index 95d9bd0..582b96f 100644 --- a/content/browser/renderer_host/input/input_router_impl.cc +++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -340,16 +340,16 @@ if (WebTouchEventTraits::IsTouchSequenceStart(event.event) && ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) { touch_action_filter_.AppendToGestureSequenceForDebugging("T"); - touch_action_filter_.IncreaseActiveTouches(); // Touch action must be auto when there is no consumer touch_action_filter_.OnSetTouchAction(cc::kTouchActionAuto); + touch_action_filter_.SetActiveTouchInProgress(true); UpdateTouchAckTimeoutEnabled(); } disposition_handler_->OnTouchEventAck(event, ack_source, ack_result); if (WebTouchEventTraits::IsTouchSequenceEnd(event.event)) { - touch_action_filter_.DecreaseActiveTouches(); touch_action_filter_.ReportAndResetTouchAction(); + touch_action_filter_.SetActiveTouchInProgress(false); UpdateTouchAckTimeoutEnabled(); } } @@ -530,11 +530,8 @@ // The SetTouchAction IPC occurs on a different channel so always // send it in the input event ack to ensure it is available at the // time the ACK is handled. - if (touch_action.has_value()) { - if (WebTouchEventTraits::IsTouchSequenceStart(touch_event.event)) - touch_action_filter_.IncreaseActiveTouches(); + if (touch_action.has_value()) OnSetTouchAction(touch_action.value()); - } // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. touch_event_queue_.ProcessTouchAck(source, state, latency, @@ -599,6 +596,7 @@ void InputRouterImpl::ForceSetTouchActionAuto() { touch_action_filter_.AppendToGestureSequenceForDebugging("F"); touch_action_filter_.OnSetTouchAction(cc::kTouchActionAuto); + touch_action_filter_.SetActiveTouchInProgress(true); } void InputRouterImpl::OnHasTouchEventHandlersForTest(bool has_handlers) { @@ -618,6 +616,7 @@ touch_action_filter_.AppendToGestureSequenceForDebugging( std::to_string(touch_action).c_str()); touch_action_filter_.OnSetTouchAction(touch_action); + touch_action_filter_.SetActiveTouchInProgress(true); // kTouchActionNone should disable the touch ack timeout. UpdateTouchAckTimeoutEnabled();
diff --git a/content/browser/renderer_host/input/touch_action_filter.cc b/content/browser/renderer_host/input/touch_action_filter.cc index b56ad8e..8ac9be14 100644 --- a/content/browser/renderer_host/input/touch_action_filter.cc +++ b/content/browser/renderer_host/input/touch_action_filter.cc
@@ -7,7 +7,6 @@ #include <math.h> #include "base/debug/crash_logging.h" -#include "base/debug/dump_without_crashing.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "third_party/blink/public/platform/web_gesture_event.h" @@ -241,19 +240,9 @@ scrolling_touch_action_ = allowed_touch_action_; } -void TouchActionFilter::IncreaseActiveTouches() { - // The touch start and associated touch end should be acked in order. If not, - // dump. - if (num_of_active_touches_ > 0) - base::debug::DumpWithoutCrashing(); - num_of_active_touches_++; -} - -void TouchActionFilter::DecreaseActiveTouches() { - // Something is seriously wrong if this is true. - if (num_of_active_touches_ == 0) - base::debug::DumpWithoutCrashing(); - num_of_active_touches_--; +void TouchActionFilter::SetActiveTouchInProgress( + bool active_touch_in_progress) { + active_touch_in_progress_ = active_touch_in_progress; } void TouchActionFilter::ReportAndResetTouchAction() { @@ -262,8 +251,7 @@ else gesture_sequence_.append("R0"); ReportTouchAction(); - if (num_of_active_touches_ <= 0) - ResetTouchAction(); + ResetTouchAction(); } void TouchActionFilter::ReportTouchAction() { @@ -372,7 +360,7 @@ // We have set the associated touch action if the touch start already happened // or there is a gesture in progress. In these cases, we should not reset the // associated touch action. - if (!gesture_sequence_in_progress_ && num_of_active_touches_ <= 0) { + if (!gesture_sequence_in_progress_ && !active_touch_in_progress_) { ResetTouchAction(); if (has_touch_event_handler_) scrolling_touch_action_.reset();
diff --git a/content/browser/renderer_host/input/touch_action_filter.h b/content/browser/renderer_host/input/touch_action_filter.h index 495272ad..2d157fb 100644 --- a/content/browser/renderer_host/input/touch_action_filter.h +++ b/content/browser/renderer_host/input/touch_action_filter.h
@@ -67,8 +67,7 @@ void OnHasTouchEventHandlers(bool has_handlers); - void IncreaseActiveTouches(); - void DecreaseActiveTouches(); + void SetActiveTouchInProgress(bool active_touch_in_progress); // Debugging only. void AppendToGestureSequenceForDebugging(const char* str); @@ -108,8 +107,8 @@ // before GSE. bool gesture_sequence_in_progress_ = false; - // Increment at receiving ACK for touch start and decrement at touch end. - int num_of_active_touches_ = 0; + // True at touch start and false at touch end. + bool active_touch_in_progress_ = false; // What touch actions are currently permitted. base::Optional<cc::TouchAction> allowed_touch_action_;
diff --git a/content/browser/renderer_host/input/touch_action_filter_unittest.cc b/content/browser/renderer_host/input/touch_action_filter_unittest.cc index 8c60a0d9..31311cd 100644 --- a/content/browser/renderer_host/input/touch_action_filter_unittest.cc +++ b/content/browser/renderer_host/input/touch_action_filter_unittest.cc
@@ -1079,7 +1079,7 @@ // Receive a touch start ack, set the touch action. filter_.OnSetTouchAction(cc::kTouchActionPanY); - filter_.IncreaseActiveTouches(); + filter_.SetActiveTouchInProgress(true); filter_.OnHasTouchEventHandlers(false); EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionPanY); EXPECT_EQ(filter_.allowed_touch_action().value(), cc::kTouchActionPanY); @@ -1088,33 +1088,6 @@ EXPECT_EQ(filter_.allowed_touch_action().value(), cc::kTouchActionPanY); } -TEST_F(TouchActionFilterTest, ResetTouchActionWithActiveTouch) { - filter_.OnHasTouchEventHandlers(true); - EXPECT_FALSE(ScrollingTouchAction().has_value()); - EXPECT_FALSE(filter_.allowed_touch_action().has_value()); - - // Receive a touch start ack, set the touch action. - filter_.OnSetTouchAction(cc::kTouchActionPanY); - filter_.IncreaseActiveTouches(); - - // Somehow we get the ACK for the second touch start before the ACK for the - // first touch end. - filter_.OnSetTouchAction(cc::kTouchActionPan); - filter_.IncreaseActiveTouches(); - - // The first touch end comes, we report and reset touch action. The touch - // actions should still have value. - filter_.DecreaseActiveTouches(); - filter_.ReportAndResetTouchAction(); - EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionPanY); - EXPECT_EQ(filter_.allowed_touch_action().value(), cc::kTouchActionPanY); - - // The ack for the second touch end comes, the touch actions will be reset. - filter_.DecreaseActiveTouches(); - filter_.ReportAndResetTouchAction(); - EXPECT_FALSE(filter_.allowed_touch_action().has_value()); -} - // If the renderer is busy, the gesture event might have come before the // OnHasTouchEventHanlders IPC is received. In this case, we should allow all // the gestures.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 989b527..bf02935 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2932,6 +2932,7 @@ switches::kDisable2dCanvasImageChromium, switches::kDisableAcceleratedJpegDecoding, switches::kDisableAcceleratedVideoDecode, + switches::kDisableBackgroundFetch, switches::kDisableBackgroundTasks, switches::kDisableBackgroundTimerThrottling, switches::kDisableBreakpad,
diff --git a/content/browser/renderer_host/render_widget_host_delegate.cc b/content/browser/renderer_host/render_widget_host_delegate.cc index aa01d7b2..e5ea12e 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.cc +++ b/content/browser/renderer_host/render_widget_host_delegate.cc
@@ -12,6 +12,10 @@ namespace content { +int RenderWidgetHostDelegate::GetTopControlsHeight() const { + return 0; +} + KeyboardEventProcessingResult RenderWidgetHostDelegate::PreHandleKeyboardEvent( const NativeWebKeyboardEvent& event) { return KeyboardEventProcessingResult::NOT_HANDLED;
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index 387c81d..fb8cf2e 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -56,6 +56,12 @@ // of the RenderWidgetHost. class CONTENT_EXPORT RenderWidgetHostDelegate { public: + // Functions for controlling the browser top controls slide behavior with page + // gesture scrolling. + virtual void SetTopControlsShownRatio(float ratio) {} + virtual int GetTopControlsHeight() const; + virtual void SetTopControlsGestureScrollInProgress(bool in_progress) {} + // The RenderWidgetHost has just been created. virtual void RenderWidgetCreated(RenderWidgetHostImpl* render_widget_host) {}
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 3544f769..ff49b4fe 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -2332,8 +2332,10 @@ } void RenderWidgetHostImpl::SetMouseCapture(bool capture) { - if (delegate_) - delegate_->GetInputEventRouter()->SetMouseCaptureTarget(GetView(), capture); + if (!delegate_ || !delegate_->GetInputEventRouter()) + return; + + delegate_->GetInputEventRouter()->SetMouseCaptureTarget(GetView(), capture); } void RenderWidgetHostImpl::OnInvalidFrameToken(uint32_t frame_token) {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 126b857..44e7633 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -827,6 +827,15 @@ return latest_capture_sequence_number_; } +bool RenderWidgetHostViewAura::DoBrowserControlsShrinkBlinkSize() const { + return !top_controls_gesture_scroll_in_progress_ && + top_controls_shown_ratio_ > 0; +} + +float RenderWidgetHostViewAura::GetTopControlsHeight() const { + return host()->delegate() ? host()->delegate()->GetTopControlsHeight() : 0; +} + void RenderWidgetHostViewAura::CopyFromSurface( const gfx::Rect& src_subrect, const gfx::Size& dst_size, @@ -961,6 +970,17 @@ void RenderWidgetHostViewAura::GestureEventAck( const blink::WebGestureEvent& event, InputEventAckState ack_result) { + const blink::WebInputEvent::Type event_type = event.GetType(); + if (event_type == blink::WebGestureEvent::kGestureScrollBegin || + event_type == blink::WebGestureEvent::kGestureScrollEnd) { + top_controls_gesture_scroll_in_progress_ = + event_type == blink::WebGestureEvent::kGestureScrollBegin; + if (host()->delegate()) { + host()->delegate()->SetTopControlsGestureScrollInProgress( + top_controls_gesture_scroll_in_progress_); + } + } + if (overscroll_controller_) { overscroll_controller_->ReceivedEventACK( event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result)); @@ -971,7 +991,7 @@ // action would complete at the end of the active fling progress which // causes noticeable delay in cases that the fling velocity is large. // https://crbug.com/797855 - if (event.GetType() == blink::WebInputEvent::kGestureScrollUpdate && + if (event_type == blink::WebInputEvent::kGestureScrollUpdate && event.data.scroll_update.inertial_phase == blink::WebGestureEvent::kMomentumPhase && overscroll_controller_->overscroll_mode() != OVERSCROLL_NONE) { @@ -2047,6 +2067,18 @@ return host()->SynchronizeVisualProperties(); } +void RenderWidgetHostViewAura::OnDidUpdateVisualPropertiesComplete( + const cc::RenderFrameMetadata& metadata) { + DCHECK(window_); + + top_controls_shown_ratio_ = metadata.top_controls_shown_ratio; + if (host()->delegate()) + host()->delegate()->SetTopControlsShownRatio(top_controls_shown_ratio_); + + SynchronizeVisualProperties(cc::DeadlinePolicy::UseDefaultDeadline(), + metadata.local_surface_id); +} + ui::InputMethod* RenderWidgetHostViewAura::GetInputMethod() const { if (!window_) return nullptr; @@ -2449,10 +2481,8 @@ RenderWidgetHostViewAura::DidUpdateVisualProperties( const cc::RenderFrameMetadata& metadata) { base::OnceCallback<void()> allocation_task = base::BindOnce( - base::IgnoreResult( - &RenderWidgetHostViewAura::SynchronizeVisualProperties), - weak_ptr_factory_.GetWeakPtr(), cc::DeadlinePolicy::UseDefaultDeadline(), - metadata.local_surface_id); + &RenderWidgetHostViewAura::OnDidUpdateVisualPropertiesComplete, + weak_ptr_factory_.GetWeakPtr(), metadata); return window_->GetSurfaceIdAllocator(std::move(allocation_task)); }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 0dc579d4..9bfd9396 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -137,6 +137,8 @@ void SetTooltipText(const base::string16& tooltip_text) override; void DisplayTooltipText(const base::string16& tooltip_text) override; uint32_t GetCaptureSequenceNumber() const override; + bool DoBrowserControlsShrinkBlinkSize() const override; + float GetTopControlsHeight() const override; bool IsSurfaceAvailableForCopy() const override; void CopyFromSurface( const gfx::Rect& src_rect, @@ -461,6 +463,9 @@ const base::Optional<viz::LocalSurfaceId>& child_allocated_local_surface_id); + void OnDidUpdateVisualPropertiesComplete( + const cc::RenderFrameMetadata& metadata); + // Tracks whether SnapToPhysicalPixelBoundary() has been called. bool has_snapped_to_boundary() { return has_snapped_to_boundary_; } void ResetHasSnappedToBoundary() { has_snapped_to_boundary_ = false; } @@ -558,6 +563,9 @@ // Tracks the ancestors of the RWHVA window for window location changes. std::unique_ptr<WindowAncestorObserver> ancestor_window_observer_; + float top_controls_shown_ratio_ = 0.f; + bool top_controls_gesture_scroll_in_progress_ = false; + // Are we in the process of closing? Tracked so fullscreen views can avoid // sending a second shutdown request to the host when they lose the focus // after requesting shutdown for another reason (e.g. Escape key).
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 44ee710..9c654d4 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -2015,10 +2015,7 @@ if ([ns_selected_text length] == 0) return; scoped_refptr<ui::UniquePasteboard> pasteboard = new ui::UniquePasteboard; - NSArray* types = [NSArray arrayWithObject:NSStringPboardType]; - [pasteboard->get() declareTypes:types owner:nil]; - if ([pasteboard->get() setString:ns_selected_text - forType:NSStringPboardType]) { + if ([pasteboard->get() writeObjects:@[ ns_selected_text ]]) { NSPerformService(@"Look Up in Dictionary", pasteboard->get()); } }
diff --git a/content/browser/resources/media/stats_graph_helper.js b/content/browser/resources/media/stats_graph_helper.js index daa2886..30cdf0ee 100644 --- a/content/browser/resources/media/stats_graph_helper.js +++ b/content/browser/resources/media/stats_graph_helper.js
@@ -36,8 +36,8 @@ if (length >= 2) { var lastDataPoint = srcDataSeries.dataPoints_[length - 1]; var secondLastDataPoint = srcDataSeries.dataPoints_[length - 2]; - return (lastDataPoint.value - secondLastDataPoint.value) * 1000 / - (lastDataPoint.time - secondLastDataPoint.time); + return Math.floor((lastDataPoint.value - secondLastDataPoint.value) * 1000 / + (lastDataPoint.time - secondLastDataPoint.time)); } return 0;
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index 05211510..597aba7 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -758,11 +758,13 @@ observer.OnStartWorkerMessageSent(); } -void EmbeddedWorkerInstance::RequestTermination() { +void EmbeddedWorkerInstance::RequestTermination( + RequestTerminationCallback callback) { if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) { mojo::ReportBadMessage( "Invalid termination request: RequestTermination() was called but " "S13nServiceWorker is not enabled"); + std::move(callback).Run(true /* will_be_terminated */); return; } @@ -771,12 +773,19 @@ mojo::ReportBadMessage( "Invalid termination request: Termination should be requested during " "running or stopping"); + std::move(callback).Run(true /* will_be_terminated */); return; } - if (status() == EmbeddedWorkerStatus::STOPPING) + if (status() == EmbeddedWorkerStatus::STOPPING) { + std::move(callback).Run(true /* will_be_terminated */); return; + } owner_version_->StopWorkerIfIdle(true /* requested_from_renderer */); + + // If DevTools is attached and the worker won't be stopped, the worker needs + // to continue to work. + std::move(callback).Run(status() != EmbeddedWorkerStatus::RUNNING); } void EmbeddedWorkerInstance::CountFeature(blink::mojom::WebFeature feature) {
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index 6873dc9..261425d2 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -253,7 +253,7 @@ // Implements mojom::EmbeddedWorkerInstanceHost. // These functions all run on the IO thread. - void RequestTermination() override; + void RequestTermination(RequestTerminationCallback callback) override; void CountFeature(blink::mojom::WebFeature feature) override; void OnReadyForInspection() override; void OnScriptLoaded() override;
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 0df5fa8..7e129e8 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1740,6 +1740,90 @@ run_loop.Run(); } +// Test when the renderer requests termination because the service worker is +// idle, and the browser ignores the request because DevTools is attached. The +// renderer should continue processing events on the service worker instead of +// waiting for termination or an event from the browser. Regression test for +// https://crbug.com/878667. +IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, IdleTimerWithDevTools) { + StartServerAndNavigateToSetup(); + + // This test is based on a new idle timer mechanism which is available only + // when S13nServiceWorker or NetworkService is enabled. + if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) { + LOG(WARNING) + << "This test requires NetworkService or ServiceWorkerServicification."; + return; + } + + // Register a service worker. + scoped_refptr<WorkerActivatedObserver> observer = + new WorkerActivatedObserver(wrapper()); + observer->Init(); + const GURL scope = + embedded_test_server()->GetURL("/service_worker/fetch_from_page.html"); + const GURL worker_url = embedded_test_server()->GetURL( + "/service_worker/fetch_event_respond_with_fetch.js"); + + blink::mojom::ServiceWorkerRegistrationOptions options( + scope, blink::mojom::ServiceWorkerUpdateViaCache::kNone); + public_context()->RegisterServiceWorker( + worker_url, options, + base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + observer->Wait(); + + // Navigate to a new page and request a sub resource. This should succeed + // normally. + { + const GURL url = embedded_test_server()->GetURL( + "/service_worker/fetch_from_page.html?url=/service_worker/empty.html"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + const base::string16 title = base::ASCIIToUTF16("DONE"); + TitleWatcher watcher(shell()->web_contents(), title); + EXPECT_EQ(title, watcher.WaitAndGetTitle()); + } + + // Simulate to attach DevTools. + base::RunLoop loop; + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce( + [](base::OnceClosure done, ServiceWorkerContextWrapper* wrapper, + int64_t version_id) { + ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); + scoped_refptr<ServiceWorkerVersion> version = + wrapper->GetLiveVersion(version_id); + version->SetDevToolsAttached(true); + + // Set the idle timer delay to zero for making the service worker + // idle immediately. This may cause infinite loop of IPCs when no + // event was queued in the renderer because a callback of + // RequestTermination() is called and it triggers another + // RequestTermination() immediately. However, this is unusual + // situation happening only in testing so it's acceptable. + // In production code, WakeUp() as the result of + // RequestTermination() doesn't happen when the idle timer delay is + // set to zero. Instead, activating a new worker will be triggered. + version->endpoint()->SetIdleTimerDelayToZero(); + std::move(done).Run(); + }, + loop.QuitClosure(), base::Unretained(wrapper()), + observer->version_id())); + loop.Run(); + + // Trigger another sub resource request. The sub resource request will + // directly go to the worker thread and be queued because the worker is + // idle. However, the browser process notifies the renderer to let it continue + // to work because DevTools is attached, and it'll result in running all + // queued events. + EXPECT_EQ(200, EvalJs(shell(), R"( + (async () => { + let response = await fetch(params.get('url')); + return response.status; + })() + )")); +} + class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest { public: using self = ServiceWorkerNavigationPreloadTest;
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc index 52ffd977..6c268f5 100644 --- a/content/browser/service_worker/service_worker_job_unittest.cc +++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -897,7 +897,7 @@ public: struct AttributeChangeLogEntry { int64_t registration_id; - ChangedVersionAttributesMask mask; + blink::mojom::ChangedServiceWorkerObjectsMaskPtr mask; ServiceWorkerRegistrationInfo info; }; @@ -1042,13 +1042,13 @@ // ServiceWorkerRegistration::Listener overrides void OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) override { AttributeChangeLogEntry entry; entry.registration_id = registration->id(); - entry.mask = changed_mask; + entry.mask = std::move(changed_mask); entry.info = info; - attribute_change_log_.push_back(entry); + attribute_change_log_.push_back(std::move(entry)); } void OnRegistrationFailed(ServiceWorkerRegistration* registration) override { @@ -1064,7 +1064,7 @@ StateChangeLogEntry entry; entry.version_id = version->version_id(); entry.status = version->status(); - state_change_log_.push_back(entry); + state_change_log_.push_back(std::move(entry)); } scoped_refptr<ServiceWorkerRegistration> observed_registration_; @@ -1232,39 +1232,47 @@ EXPECT_FALSE(registration->waiting_version()); ASSERT_EQ(3u, update_helper->attribute_change_log_.size()); - UpdateJobTestHelper::AttributeChangeLogEntry entry; - entry = update_helper->attribute_change_log_[0]; - EXPECT_TRUE(entry.mask.installing_changed()); - EXPECT_FALSE(entry.mask.waiting_changed()); - EXPECT_FALSE(entry.mask.active_changed()); - EXPECT_NE(entry.info.installing_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_EQ(entry.info.waiting_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_NE(entry.info.active_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); + { + const UpdateJobTestHelper::AttributeChangeLogEntry& entry = + update_helper->attribute_change_log_[0]; + EXPECT_TRUE(entry.mask->installing); + EXPECT_FALSE(entry.mask->waiting); + EXPECT_FALSE(entry.mask->active); + EXPECT_NE(entry.info.installing_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_EQ(entry.info.waiting_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_NE(entry.info.active_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + } - entry = update_helper->attribute_change_log_[1]; - EXPECT_TRUE(entry.mask.installing_changed()); - EXPECT_TRUE(entry.mask.waiting_changed()); - EXPECT_FALSE(entry.mask.active_changed()); - EXPECT_EQ(entry.info.installing_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_NE(entry.info.waiting_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_NE(entry.info.active_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); + { + const UpdateJobTestHelper::AttributeChangeLogEntry& entry = + update_helper->attribute_change_log_[1]; + EXPECT_TRUE(entry.mask->installing); + EXPECT_TRUE(entry.mask->waiting); + EXPECT_FALSE(entry.mask->active); + EXPECT_EQ(entry.info.installing_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_NE(entry.info.waiting_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_NE(entry.info.active_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + } - entry = update_helper->attribute_change_log_[2]; - EXPECT_FALSE(entry.mask.installing_changed()); - EXPECT_TRUE(entry.mask.waiting_changed()); - EXPECT_TRUE(entry.mask.active_changed()); - EXPECT_EQ(entry.info.installing_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_EQ(entry.info.waiting_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); - EXPECT_NE(entry.info.active_version.version_id, - blink::mojom::kInvalidServiceWorkerVersionId); + { + const UpdateJobTestHelper::AttributeChangeLogEntry& entry = + update_helper->attribute_change_log_[2]; + EXPECT_FALSE(entry.mask->installing); + EXPECT_TRUE(entry.mask->waiting); + EXPECT_TRUE(entry.mask->active); + EXPECT_EQ(entry.info.installing_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_EQ(entry.info.waiting_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + EXPECT_NE(entry.info.active_version.version_id, + blink::mojom::kInvalidServiceWorkerVersionId); + } // expected version state transitions: // new.installing, new.installed,
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc index 1f25d3e..846f77b2 100644 --- a/content/browser/service_worker/service_worker_provider_host.cc +++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -40,6 +40,7 @@ #include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/strong_associated_binding.h" #include "net/base/url_util.h" +#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/resource_request_body.h" #include "storage/browser/blob/blob_storage_context.h" #include "third_party/blink/public/common/message_port/message_port_channel.h" @@ -393,11 +394,11 @@ void ServiceWorkerProviderHost::OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& /* info */) { if (!get_ready_callback_ || get_ready_callback_->is_null()) return; - if (changed_mask.active_changed() && registration->active_version()) { + if (changed_mask->active && registration->active_version()) { // Wait until the state change so we don't send the get for ready // registration complete message before set version attributes message. registration->active_version()->RegisterStatusChangeCallback(base::BindOnce( @@ -478,14 +479,30 @@ // SetController message should be sent only for clients. DCHECK(IsProviderForClient()); - // If there is no connection to the renderer yet, |this| is hosting a reserved - // client undergoing navigation. The controller will be sent on navigation - // commit. See CommitNavigation in frame.mojom. - if (!container_.is_bound()) { - DCHECK_EQ(blink::mojom::ServiceWorkerClientType::kWindow, client_type()); - DCHECK(!is_execution_ready_); - return; + + // The final response hasn't been committed yet, so there's no reason to send + // the controller since it can be changed again before the final response. + if (!is_execution_ready_) { + if (client_type() == blink::mojom::ServiceWorkerClientType::kWindow) { + // |this| is hosting a reserved client undergoing navigation. The + // controller will be sent on navigation commit. See CommitNavigation in + // frame.mojom. + DCHECK(!container_.is_bound()); + return; + } + DCHECK_EQ(blink::mojom::ServiceWorkerClientType::kSharedWorker, + client_type()); + + // NetworkService (PlzWorker): + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // When PlzWorker is enabled, the controller will be sent when the + // response is committed to the renderer at SharedWorkerHost::Start(). + return; + } + // When NetworkService is disabled and the client is for a shared worker, + // the controller won't be sent on response commit, so send it here. } + SendSetControllerServiceWorker(notify_controllerchange); } @@ -694,13 +711,29 @@ void ServiceWorkerProviderHost::CountFeature(blink::mojom::WebFeature feature) { // CountFeature message should be sent only for clients. DCHECK(IsProviderForClient()); - // If there is no connection to the renderer yet, |this| is hosting a reserved - // client undergoing navigation. The use counter will be sent correctly in - // CompleteNavigationInitialized() later. - if (!container_.is_bound()) { - DCHECK_EQ(blink::mojom::ServiceWorkerClientType::kWindow, client_type()); - DCHECK(!is_execution_ready_); - return; + + // The final response hasn't been committed yet, so there's no reason to send + // the use counter since it can be changed again before the final response. + if (!is_execution_ready_) { + if (client_type() == blink::mojom::ServiceWorkerClientType::kWindow) { + // |this| is hosting a reserved client undergoing navigation. The use + // counter will be sent correctly in CompleteNavigationInitialized() + // later. + DCHECK(!container_.is_bound()); + return; + } + DCHECK_EQ(blink::mojom::ServiceWorkerClientType::kSharedWorker, + client_type()); + + // NetworkService (PlzWorker): + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // When PlzWorker is enabled, the use counter will be sent when the + // response is committed to the renderer at SharedWorkerHost::Start(). + // TODO(nhiroki): Send the use counter on starting the shared worker. + return; + } + // When NetworkService is disabled and the client is for a shared worker, + // the use counter won't be sent on response commit, so send it here. } container_->CountFeature(feature);
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h index 2fe3e1e..d1ca2a44 100644 --- a/content/browser/service_worker/service_worker_provider_host.h +++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -494,7 +494,7 @@ // ServiceWorkerRegistration::Listener overrides. void OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) override; void OnRegistrationFailed(ServiceWorkerRegistration* registration) override; void OnRegistrationFinishedUninstalling(
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc index f215fd80..b8c7d18 100644 --- a/content/browser/service_worker/service_worker_registration.cc +++ b/content/browser/service_worker/service_worker_registration.cc
@@ -94,10 +94,10 @@ } void ServiceWorkerRegistration::NotifyVersionAttributesChanged( - ChangedVersionAttributesMask mask) { + blink::mojom::ChangedServiceWorkerObjectsMaskPtr mask) { for (auto& observer : listeners_) - observer.OnVersionAttributesChanged(this, mask, GetInfo()); - if (mask.active_changed() || mask.waiting_changed()) + observer.OnVersionAttributesChanged(this, mask.Clone(), GetInfo()); + if (mask->active || mask->waiting) NotifyRegistrationFinished(); } @@ -121,9 +121,10 @@ should_activate_when_ready_ = false; - ChangedVersionAttributesMask mask; + auto mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(false, false, false); if (version) - UnsetVersionInternal(version.get(), &mask); + UnsetVersionInternal(version.get(), mask.get()); if (active_version_) active_version_->RemoveObserver(this); active_version_ = version; @@ -131,9 +132,9 @@ active_version_->AddObserver(this); active_version_->SetNavigationPreloadState(navigation_preload_state_); } - mask.add(ChangedVersionAttributesMask::ACTIVE_VERSION); + mask->active = true; - NotifyVersionAttributesChanged(mask); + NotifyVersionAttributesChanged(std::move(mask)); } void ServiceWorkerRegistration::SetWaitingVersion( @@ -143,53 +144,55 @@ should_activate_when_ready_ = false; - ChangedVersionAttributesMask mask; + auto mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(false, false, false); if (version) - UnsetVersionInternal(version.get(), &mask); + UnsetVersionInternal(version.get(), mask.get()); waiting_version_ = version; - mask.add(ChangedVersionAttributesMask::WAITING_VERSION); + mask->waiting = true; - NotifyVersionAttributesChanged(mask); + NotifyVersionAttributesChanged(std::move(mask)); } void ServiceWorkerRegistration::SetInstallingVersion( const scoped_refptr<ServiceWorkerVersion>& version) { if (installing_version_ == version) return; - - ChangedVersionAttributesMask mask; + auto mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(false, false, false); if (version) - UnsetVersionInternal(version.get(), &mask); + UnsetVersionInternal(version.get(), mask.get()); installing_version_ = version; - mask.add(ChangedVersionAttributesMask::INSTALLING_VERSION); - - NotifyVersionAttributesChanged(mask); + mask->installing = true; + NotifyVersionAttributesChanged(std::move(mask)); } void ServiceWorkerRegistration::UnsetVersion(ServiceWorkerVersion* version) { if (!version) return; - ChangedVersionAttributesMask mask; - UnsetVersionInternal(version, &mask); - if (mask.changed()) - NotifyVersionAttributesChanged(mask); + auto mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(false, false, false); + UnsetVersionInternal(version, mask.get()); + if (mask->installing || mask->waiting || mask->active) + NotifyVersionAttributesChanged(std::move(mask)); } void ServiceWorkerRegistration::UnsetVersionInternal( ServiceWorkerVersion* version, - ChangedVersionAttributesMask* mask) { + blink::mojom::ChangedServiceWorkerObjectsMask* mask) { DCHECK(version); + if (installing_version_.get() == version) { installing_version_ = nullptr; - mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); + mask->installing = true; } else if (waiting_version_.get() == version) { waiting_version_ = nullptr; should_activate_when_ready_ = false; - mask->add(ChangedVersionAttributesMask::WAITING_VERSION); + mask->waiting = true; } else if (active_version_.get() == version) { active_version_->RemoveObserver(this); active_version_ = nullptr; - mask->add(ChangedVersionAttributesMask::ACTIVE_VERSION); + mask->active = true; } } @@ -568,26 +571,27 @@ context_->storage()->NotifyDoneUninstallingRegistration(this); std::vector<scoped_refptr<ServiceWorkerVersion>> versions_to_doom; - ChangedVersionAttributesMask mask; + auto mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(false, false, false); if (installing_version_.get()) { versions_to_doom.push_back(installing_version_); installing_version_ = nullptr; - mask.add(ChangedVersionAttributesMask::INSTALLING_VERSION); + mask->installing = true; } if (waiting_version_.get()) { versions_to_doom.push_back(waiting_version_); waiting_version_ = nullptr; - mask.add(ChangedVersionAttributesMask::WAITING_VERSION); + mask->waiting = true; } if (active_version_.get()) { versions_to_doom.push_back(active_version_); active_version_->RemoveObserver(this); active_version_ = nullptr; - mask.add(ChangedVersionAttributesMask::ACTIVE_VERSION); + mask->active = true; } - if (mask.changed()) { - NotifyVersionAttributesChanged(mask); + if (mask->installing || mask->waiting || mask->active) { + NotifyVersionAttributesChanged(std::move(mask)); // Doom only after notifying attributes changed, because the spec requires // the attributes to be cleared by the time the statechange event is
diff --git a/content/browser/service_worker/service_worker_registration.h b/content/browser/service_worker/service_worker_registration.h index e41fa4a0..5f5e7f4 100644 --- a/content/browser/service_worker/service_worker_registration.h +++ b/content/browser/service_worker/service_worker_registration.h
@@ -46,7 +46,7 @@ public: virtual void OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) {} virtual void OnUpdateViaCacheChanged( ServiceWorkerRegistration* registation) {} @@ -120,7 +120,8 @@ virtual void RemoveListener(Listener* listener); void NotifyRegistrationFailed(); void NotifyUpdateFound(); - void NotifyVersionAttributesChanged(ChangedVersionAttributesMask mask); + void NotifyVersionAttributesChanged( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr mask); ServiceWorkerRegistrationInfo GetInfo(); @@ -193,7 +194,7 @@ void UnsetVersionInternal( ServiceWorkerVersion* version, - ChangedVersionAttributesMask* mask); + blink::mojom::ChangedServiceWorkerObjectsMask* mask); // ServiceWorkerVersion::Observer override. void OnNoControllees(ServiceWorkerVersion* version) override;
diff --git a/content/browser/service_worker/service_worker_registration_object_host.cc b/content/browser/service_worker/service_worker_registration_object_host.cc index 5466cd6..c5dae23 100644 --- a/content/browser/service_worker/service_worker_registration_object_host.cc +++ b/content/browser/service_worker/service_worker_registration_object_host.cc
@@ -115,12 +115,12 @@ void ServiceWorkerRegistrationObjectHost::OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) { DCHECK_EQ(registration->id(), registration_->id()); - SetVersionAttributes(changed_mask, registration->installing_version(), - registration->waiting_version(), - registration->active_version()); + SetServiceWorkerObjects( + std::move(changed_mask), registration->installing_version(), + registration->waiting_version(), registration->active_version()); } void ServiceWorkerRegistrationObjectHost::OnUpdateViaCacheChanged( @@ -131,11 +131,9 @@ void ServiceWorkerRegistrationObjectHost::OnRegistrationFailed( ServiceWorkerRegistration* registration) { DCHECK_EQ(registration->id(), registration_->id()); - ChangedVersionAttributesMask changed_mask( - ChangedVersionAttributesMask::INSTALLING_VERSION | - ChangedVersionAttributesMask::WAITING_VERSION | - ChangedVersionAttributesMask::ACTIVE_VERSION); - SetVersionAttributes(changed_mask, nullptr, nullptr, nullptr); + auto changed_mask = + blink::mojom::ChangedServiceWorkerObjectsMask::New(true, true, true); + SetServiceWorkerObjects(std::move(changed_mask), nullptr, nullptr, nullptr); } void ServiceWorkerRegistrationObjectHost::OnUpdateFound( @@ -371,29 +369,30 @@ base::nullopt); } -void ServiceWorkerRegistrationObjectHost::SetVersionAttributes( - ChangedVersionAttributesMask changed_mask, +void ServiceWorkerRegistrationObjectHost::SetServiceWorkerObjects( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, ServiceWorkerVersion* installing_version, ServiceWorkerVersion* waiting_version, ServiceWorkerVersion* active_version) { - if (!changed_mask.changed()) + if (!(changed_mask->installing || changed_mask->waiting || + changed_mask->active)) return; blink::mojom::ServiceWorkerObjectInfoPtr installing; blink::mojom::ServiceWorkerObjectInfoPtr waiting; blink::mojom::ServiceWorkerObjectInfoPtr active; - if (changed_mask.installing_changed()) { + if (changed_mask->installing) { installing = CreateCompleteObjectInfoToSend(provider_host_, installing_version); } - if (changed_mask.waiting_changed()) + if (changed_mask->waiting) waiting = CreateCompleteObjectInfoToSend(provider_host_, waiting_version); - if (changed_mask.active_changed()) + if (changed_mask->active) active = CreateCompleteObjectInfoToSend(provider_host_, active_version); DCHECK(remote_registration_); - remote_registration_->SetVersionAttributes( - changed_mask.changed(), std::move(installing), std::move(waiting), + remote_registration_->SetServiceWorkerObjects( + std::move(changed_mask), std::move(installing), std::move(waiting), std::move(active)); }
diff --git a/content/browser/service_worker/service_worker_registration_object_host.h b/content/browser/service_worker/service_worker_registration_object_host.h index cfca9b43..db6c5f8 100644 --- a/content/browser/service_worker/service_worker_registration_object_host.h +++ b/content/browser/service_worker/service_worker_registration_object_host.h
@@ -58,7 +58,7 @@ // ServiceWorkerRegistration::Listener overrides. void OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) override; void OnUpdateViaCacheChanged( ServiceWorkerRegistration* registration) override; @@ -115,10 +115,11 @@ // Sets the corresponding version field to the given version or if the given // version is nullptr, clears the field. - void SetVersionAttributes(ChangedVersionAttributesMask changed_mask, - ServiceWorkerVersion* installing_version, - ServiceWorkerVersion* waiting_version, - ServiceWorkerVersion* active_version); + void SetServiceWorkerObjects( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, + ServiceWorkerVersion* installing_version, + ServiceWorkerVersion* waiting_version, + ServiceWorkerVersion* active_version); void OnConnectionError();
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc index beed04a..5059ff3 100644 --- a/content/browser/service_worker/service_worker_registration_unittest.cc +++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -80,7 +80,9 @@ int set_update_via_cache_called_count() const { return set_update_via_cache_called_count_; } - int changed_mask() const { return changed_mask_; } + const blink::mojom::ChangedServiceWorkerObjectsMask& changed_mask() const { + return *changed_mask_; + } const blink::mojom::ServiceWorkerObjectInfoPtr& installing() const { return installing_; } @@ -96,13 +98,13 @@ private: // Implements blink::mojom::ServiceWorkerRegistrationObject. - void SetVersionAttributes( - int changed_mask, + void SetServiceWorkerObjects( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, blink::mojom::ServiceWorkerObjectInfoPtr installing, blink::mojom::ServiceWorkerObjectInfoPtr waiting, blink::mojom::ServiceWorkerObjectInfoPtr active) override { set_version_attributes_called_count_++; - changed_mask_ = changed_mask; + changed_mask_ = std::move(changed_mask); installing_ = std::move(installing); waiting_ = std::move(waiting); active_ = std::move(active); @@ -117,7 +119,7 @@ int update_found_called_count_ = 0; int set_version_attributes_called_count_ = 0; int set_update_via_cache_called_count_ = 0; - int changed_mask_ = 0; + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask_; blink::mojom::ServiceWorkerObjectInfoPtr installing_; blink::mojom::ServiceWorkerObjectInfoPtr waiting_; blink::mojom::ServiceWorkerObjectInfoPtr active_; @@ -137,7 +139,8 @@ protected: void OnSetIdleTimerDelayToZero(int embedded_worker_id) override { - GetEmbeddedWorkerInstanceHost(embedded_worker_id)->RequestTermination(); + GetEmbeddedWorkerInstanceHost(embedded_worker_id) + ->RequestTermination(base::DoNothing()); } }; @@ -171,10 +174,10 @@ void OnVersionAttributesChanged( ServiceWorkerRegistration* registration, - ChangedVersionAttributesMask changed_mask, + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, const ServiceWorkerRegistrationInfo& info) override { observed_registration_ = registration; - observed_changed_mask_ = changed_mask; + observed_changed_mask_ = std::move(changed_mask); observed_info_ = info; } @@ -189,12 +192,12 @@ void Reset() { observed_registration_ = nullptr; - observed_changed_mask_ = ChangedVersionAttributesMask(); + observed_changed_mask_ = nullptr; observed_info_ = ServiceWorkerRegistrationInfo(); } scoped_refptr<ServiceWorkerRegistration> observed_registration_; - ChangedVersionAttributesMask observed_changed_mask_; + blink::mojom::ChangedServiceWorkerObjectsMaskPtr observed_changed_mask_; ServiceWorkerRegistrationInfo observed_info_; }; @@ -229,8 +232,7 @@ EXPECT_EQ(version_1.get(), registration->active_version()); EXPECT_EQ(registration, listener.observed_registration_); - EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION, - listener.observed_changed_mask_.changed()); + EXPECT_TRUE(listener.observed_changed_mask_->active); EXPECT_EQ(kScope, listener.observed_info_.pattern); EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); EXPECT_EQ(kScript, listener.observed_info_.active_version.script_url); @@ -243,8 +245,7 @@ registration->SetInstallingVersion(version_2); EXPECT_EQ(version_2.get(), registration->installing_version()); - EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION, - listener.observed_changed_mask_.changed()); + EXPECT_TRUE(listener.observed_changed_mask_->installing); EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); EXPECT_EQ(version_2_id, listener.observed_info_.installing_version.version_id); @@ -256,8 +257,8 @@ EXPECT_EQ(version_2.get(), registration->waiting_version()); EXPECT_FALSE(registration->installing_version()); - EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed()); - EXPECT_TRUE(listener.observed_changed_mask_.installing_changed()); + EXPECT_TRUE(listener.observed_changed_mask_->waiting); + EXPECT_TRUE(listener.observed_changed_mask_->installing); EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id); EXPECT_EQ(listener.observed_info_.installing_version.version_id, @@ -267,8 +268,7 @@ registration->UnsetVersion(version_2.get()); EXPECT_FALSE(registration->waiting_version()); - EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION, - listener.observed_changed_mask_.changed()); + EXPECT_TRUE(listener.observed_changed_mask_->waiting); EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); EXPECT_EQ(listener.observed_info_.waiting_version.version_id, blink::mojom::kInvalidServiceWorkerVersionId); @@ -1124,75 +1124,59 @@ registration, kScriptUrl, version_2_id, context()->AsWeakPtr()); // Set an active worker. - { - registration->SetActiveVersion(version_1); - EXPECT_EQ(version_1.get(), registration->active_version()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, - mock_registration_object->set_version_attributes_called_count()); - ChangedVersionAttributesMask mask(mock_registration_object->changed_mask()); - EXPECT_FALSE(mask.installing_changed()); - EXPECT_FALSE(mock_registration_object->installing()); - EXPECT_FALSE(mask.waiting_changed()); - EXPECT_FALSE(mock_registration_object->waiting()); - EXPECT_TRUE(mask.active_changed()); - EXPECT_TRUE(mock_registration_object->active()); - EXPECT_EQ(version_1_id, mock_registration_object->active()->version_id); - EXPECT_EQ(kScriptUrl, mock_registration_object->active()->url); - } + registration->SetActiveVersion(version_1); + EXPECT_EQ(version_1.get(), registration->active_version()); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, mock_registration_object->set_version_attributes_called_count()); + EXPECT_FALSE(mock_registration_object->changed_mask().installing); + EXPECT_FALSE(mock_registration_object->installing()); + EXPECT_FALSE(mock_registration_object->changed_mask().waiting); + EXPECT_FALSE(mock_registration_object->waiting()); + EXPECT_TRUE(mock_registration_object->changed_mask().active); + EXPECT_TRUE(mock_registration_object->active()); + EXPECT_EQ(version_1_id, mock_registration_object->active()->version_id); + EXPECT_EQ(kScriptUrl, mock_registration_object->active()->url); // Set an installing worker. - { - registration->SetInstallingVersion(version_2); - EXPECT_EQ(version_2.get(), registration->installing_version()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(2, - mock_registration_object->set_version_attributes_called_count()); - ChangedVersionAttributesMask mask(mock_registration_object->changed_mask()); - EXPECT_TRUE(mask.installing_changed()); - EXPECT_TRUE(mock_registration_object->installing()); - EXPECT_FALSE(mask.waiting_changed()); - EXPECT_FALSE(mock_registration_object->waiting()); - EXPECT_FALSE(mask.active_changed()); - EXPECT_FALSE(mock_registration_object->active()); - EXPECT_EQ(version_2_id, mock_registration_object->installing()->version_id); - EXPECT_EQ(kScriptUrl, mock_registration_object->installing()->url); - } + registration->SetInstallingVersion(version_2); + EXPECT_EQ(version_2.get(), registration->installing_version()); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(2, mock_registration_object->set_version_attributes_called_count()); + EXPECT_TRUE(mock_registration_object->changed_mask().installing); + EXPECT_TRUE(mock_registration_object->installing()); + EXPECT_FALSE(mock_registration_object->changed_mask().waiting); + EXPECT_FALSE(mock_registration_object->waiting()); + EXPECT_FALSE(mock_registration_object->changed_mask().active); + EXPECT_FALSE(mock_registration_object->active()); + EXPECT_EQ(version_2_id, mock_registration_object->installing()->version_id); + EXPECT_EQ(kScriptUrl, mock_registration_object->installing()->url); // Promote the installing worker to waiting. - { - registration->SetWaitingVersion(version_2); - EXPECT_EQ(version_2.get(), registration->waiting_version()); - EXPECT_FALSE(registration->installing_version()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(3, - mock_registration_object->set_version_attributes_called_count()); - ChangedVersionAttributesMask mask(mock_registration_object->changed_mask()); - EXPECT_TRUE(mask.installing_changed()); - EXPECT_FALSE(mock_registration_object->installing()); - EXPECT_TRUE(mask.waiting_changed()); - EXPECT_TRUE(mock_registration_object->waiting()); - EXPECT_FALSE(mask.active_changed()); - EXPECT_FALSE(mock_registration_object->active()); - EXPECT_EQ(version_2_id, mock_registration_object->waiting()->version_id); - EXPECT_EQ(kScriptUrl, mock_registration_object->waiting()->url); - } + registration->SetWaitingVersion(version_2); + EXPECT_EQ(version_2.get(), registration->waiting_version()); + EXPECT_FALSE(registration->installing_version()); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(3, mock_registration_object->set_version_attributes_called_count()); + EXPECT_TRUE(mock_registration_object->changed_mask().installing); + EXPECT_FALSE(mock_registration_object->installing()); + EXPECT_TRUE(mock_registration_object->changed_mask().waiting); + EXPECT_TRUE(mock_registration_object->waiting()); + EXPECT_FALSE(mock_registration_object->changed_mask().active); + EXPECT_FALSE(mock_registration_object->active()); + EXPECT_EQ(version_2_id, mock_registration_object->waiting()->version_id); + EXPECT_EQ(kScriptUrl, mock_registration_object->waiting()->url); // Remove the waiting worker. - { - registration->UnsetVersion(version_2.get()); - EXPECT_FALSE(registration->waiting_version()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(4, - mock_registration_object->set_version_attributes_called_count()); - ChangedVersionAttributesMask mask(mock_registration_object->changed_mask()); - EXPECT_FALSE(mask.installing_changed()); - EXPECT_FALSE(mock_registration_object->installing()); - EXPECT_TRUE(mask.waiting_changed()); - EXPECT_FALSE(mock_registration_object->waiting()); - EXPECT_FALSE(mask.active_changed()); - EXPECT_FALSE(mock_registration_object->active()); - } + registration->UnsetVersion(version_2.get()); + EXPECT_FALSE(registration->waiting_version()); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(4, mock_registration_object->set_version_attributes_called_count()); + EXPECT_FALSE(mock_registration_object->changed_mask().installing); + EXPECT_FALSE(mock_registration_object->installing()); + EXPECT_TRUE(mock_registration_object->changed_mask().waiting); + EXPECT_FALSE(mock_registration_object->waiting()); + EXPECT_FALSE(mock_registration_object->changed_mask().active); + EXPECT_FALSE(mock_registration_object->active()); } TEST_F(ServiceWorkerRegistrationObjectHostTest, SetUpdateViaCache) {
diff --git a/content/browser/shared_worker/mock_shared_worker.cc b/content/browser/shared_worker/mock_shared_worker.cc index 62990876..1936d7c 100644 --- a/content/browser/shared_worker/mock_shared_worker.cc +++ b/content/browser/shared_worker/mock_shared_worker.cc
@@ -106,7 +106,9 @@ int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_sciript_load_params, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) {
diff --git a/content/browser/shared_worker/mock_shared_worker.h b/content/browser/shared_worker/mock_shared_worker.h index ab510d94..5920e02b0 100644 --- a/content/browser/shared_worker/mock_shared_worker.h +++ b/content/browser/shared_worker/mock_shared_worker.h
@@ -75,7 +75,9 @@ int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) override;
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc index a2f6eea0..840ad10 100644 --- a/content/browser/shared_worker/shared_worker_host.cc +++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -17,6 +17,7 @@ #include "content/browser/shared_worker/shared_worker_instance.h" #include "content/browser/shared_worker/shared_worker_service_impl.h" #include "content/browser/storage_partition_impl.h" +#include "content/common/navigation_subresource_loader_params.h" #include "content/common/url_loader_factory_bundle.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" @@ -25,6 +26,7 @@ #include "content/public/common/content_client.h" #include "content/public/common/renderer_preference_watcher.mojom.h" #include "services/network/public/cpp/features.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/message_port/message_port_channel.h" #include "third_party/blink/public/common/service_worker/service_worker_utils.h" #include "third_party/blink/public/platform/web_feature.mojom.h" @@ -130,10 +132,39 @@ service_worker_provider_info, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories) { + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + base::Optional<SubresourceLoaderParams> subresource_loader_params) { DCHECK_CURRENTLY_ON(BrowserThread::UI); AdvanceTo(Phase::kStarted); +#if DCHECK_IS_ON() + // Verify the combination of the given args based on the flags. See the + // function comment for details. + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // NetworkService (PlzWorker): + DCHECK(service_worker_provider_info); + DCHECK(!main_script_loader_factory); + DCHECK(main_script_load_params); + DCHECK(subresource_loader_factories); + } else if (base::FeatureList::IsEnabled( + blink::features::kServiceWorkerServicification)) { + // S13nServiceWorker (non-NetworkService): + DCHECK(service_worker_provider_info); + DCHECK(main_script_loader_factory); + DCHECK(subresource_loader_factories); + DCHECK(!subresource_loader_params); + DCHECK(!main_script_load_params); + } else { + // Legacy case (to be deprecated): + DCHECK(!service_worker_provider_info); + DCHECK(!main_script_loader_factory); + DCHECK(!subresource_loader_factories); + DCHECK(!subresource_loader_params); + DCHECK(!main_script_load_params); + } +#endif // DCHECK_IS_ON() + mojom::SharedWorkerInfoPtr info(mojom::SharedWorkerInfo::New( instance_->url(), instance_->name(), instance_->content_security_policy(), instance_->content_security_policy_type(), @@ -176,18 +207,22 @@ // Add the default factory to the bundle for subresource loading to pass to // the renderer. The bundle is only provided if // NetworkService/S13nServiceWorker is enabled. - // TODO(nhiroki): We might need to set the default factory to AppCache - // instead, as we do for frames, if requests from this shared worker are - // supposed to go through AppCache. Currently, we set the default factory to a - // direct network. if (blink::ServiceWorkerUtils::IsServicificationEnabled()) { DCHECK(subresource_loader_factories); DCHECK(!subresource_loader_factories->default_factory_info()); if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { - network::mojom::URLLoaderFactoryPtrInfo network_factory_info; - CreateNetworkFactory(mojo::MakeRequest(&network_factory_info)); + // If the caller has supplied a default URLLoaderFactory override (for, + // e.g., AppCache), use that. + network::mojom::URLLoaderFactoryPtrInfo default_factory_info; + if (subresource_loader_params && + subresource_loader_params->loader_factory_info.is_valid()) { + default_factory_info = + std::move(subresource_loader_params->loader_factory_info); + } else { + CreateNetworkFactory(mojo::MakeRequest(&default_factory_info)); + } subresource_loader_factories->default_factory_info() = - std::move(network_factory_info); + std::move(default_factory_info); } else { // Use the non-NetworkService network factory for the process when // NetworkService is off. @@ -199,6 +234,27 @@ } } + // NetworkService (PlzWorker): + // Prepare the controller service worker info to pass to the renderer. This is + // only provided if NetworkService is enabled. In the non-NetworkService case, + // the controller is sent in SetController IPCs during the request for the + // shared worker script. + mojom::ControllerServiceWorkerInfoPtr controller; + blink::mojom::ServiceWorkerObjectAssociatedPtrInfo remote_object; + blink::mojom::ServiceWorkerState sent_state; + if (subresource_loader_params && + subresource_loader_params->controller_service_worker_info) { + DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService)); + controller = + std::move(subresource_loader_params->controller_service_worker_info); + // |object_info| can be nullptr when the service worker context or the + // service worker version is gone during shared worker startup. + if (controller->object_info) { + controller->object_info->request = mojo::MakeRequest(&remote_object); + sent_state = controller->object_info->state; + } + } + // Send the CreateSharedWorker message. factory_ = std::move(factory); factory_->CreateSharedWorker( @@ -207,9 +263,24 @@ std::move(content_settings), std::move(service_worker_provider_info), appcache_handle_ ? appcache_handle_->appcache_host_id() : kAppCacheNoHostId, - std::move(main_script_loader_factory), - std::move(subresource_loader_factories), std::move(host), - std::move(worker_request_), std::move(interface_provider)); + std::move(main_script_loader_factory), std::move(main_script_load_params), + std::move(subresource_loader_factories), std::move(controller), + std::move(host), std::move(worker_request_), + std::move(interface_provider)); + + // NetworkService (PlzWorker): + // |remote_object| is an associated interface ptr, so calls can't be made on + // it until its request endpoint is sent. Now that the request endpoint was + // sent, it can be used, so add it to ServiceWorkerObjectHost. + if (remote_object.is_valid()) { + DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService)); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce( + &ServiceWorkerObjectHost::AddRemoteObjectPtrAndUpdateState, + subresource_loader_params->controller_service_worker_object_host, + std::move(remote_object), sent_state)); + } // 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 c75d992..de2700d 100644 --- a/content/browser/shared_worker/shared_worker_host.h +++ b/content/browser/shared_worker/shared_worker_host.h
@@ -25,6 +25,7 @@ #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/mojom/shared_worker/shared_worker_main_script_load_params.mojom.h" #include "third_party/blink/public/web/devtools_agent.mojom.h" class GURL; @@ -40,6 +41,7 @@ class SharedWorkerInstance; class SharedWorkerServiceImpl; class URLLoaderFactoryBundleInfo; +struct SubresourceLoaderParams; // The SharedWorkerHost is the interface that represents the browser side of // the browser <-> worker communication channel. This is owned by @@ -61,25 +63,41 @@ // information about its ServiceWorkerProviderHost, the browser-side host for // supporting the shared worker as a service worker client. // - // S13nServiceWorker: + // S13nServiceWorker (non-NetworkService): // |main_script_loader_factory| is sent to the renderer process and is to be // used to request the shared worker's main 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. + // non-null when S13nServiceWorker is enabled but NetworkService is disabled, + // to allow service worker machinery to observe the request. + // + // NetworkService (PlzWorker): + // |main_script_load_params| is sent to the renderer process and to be used to + // load the shared worker main script pre-requested by the browser process. + // This is only non-null when NetworkService is enabled. // // NetworkService: // |subresource_loader_factories| is sent to the renderer process and is to be // used to request subresources where applicable. For example, this allows the // shared worker to load chrome-extension:// URLs which the renderer's default // loader factory can't load. + // + // NetworkService (PlzWorker): + // |subresource_loader_params| contains information about the default loader + // factory for |subresource_loader_factories_| and the service worker + // controller. The default loader factory can be associated with some request + // interceptor like AppCacheRequestHandler. This is only non-null when + // NetworkService is enabled. + // When S13nServiceWorker is enabled but NetworkService is disabled, the + // default network loader factory is created by the RenderFrameHost, and + // service worker controller is sent via ServiceWorkerContainer#SetController. void Start( mojom::SharedWorkerFactoryPtr factory, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories); + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + base::Optional<SubresourceLoaderParams> subresource_loader_params); void AllowFileSystem(const GURL& url, base::OnceCallback<void(bool)> callback);
diff --git a/content/browser/shared_worker/shared_worker_host_unittest.cc b/content/browser/shared_worker/shared_worker_host_unittest.cc index c5043d87..638a492 100644 --- a/content/browser/shared_worker/shared_worker_host_unittest.cc +++ b/content/browser/shared_worker/shared_worker_host_unittest.cc
@@ -15,6 +15,7 @@ #include "content/browser/shared_worker/shared_worker_connector_impl.h" #include "content/browser/shared_worker/shared_worker_instance.h" #include "content/browser/shared_worker/shared_worker_service_impl.h" +#include "content/common/navigation_subresource_loader_params.h" #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -68,7 +69,9 @@ mojom::SharedWorkerFactoryPtr factory) { host->Start(std::move(factory), nullptr /* service_worker_provider_info */, {} /* main_script_loader_factory */, - nullptr /* subresource_loader_factories */); + nullptr /* subresource_loader_factories */, + nullptr /* main_script_load_params */, + base::nullopt /* subresource_loader_params */); } MessagePortChannel AddClient(SharedWorkerHost* host, @@ -199,7 +202,9 @@ // Start the worker. host->Start(std::move(factory), nullptr /* service_worker_provider_info */, {} /* main_script_loader_factory */, - nullptr /* subresource_loader_factories */); + nullptr /* subresource_loader_factories */, + nullptr /* resource_load_info */, + base::nullopt /* subresource_loader_params */); // Add a client. MockSharedWorkerClient client;
diff --git a/content/browser/shared_worker/shared_worker_script_fetcher.cc b/content/browser/shared_worker/shared_worker_script_fetcher.cc new file mode 100644 index 0000000..fa9a0ab --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_fetcher.cc
@@ -0,0 +1,171 @@ +// 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_fetcher.h" + +#include "base/feature_list.h" +#include "content/browser/shared_worker/shared_worker_script_loader.h" +#include "content/browser/shared_worker/shared_worker_script_loader_factory.h" +#include "content/common/navigation_subresource_loader_params.h" +#include "content/common/throttling_url_loader.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/common/url_loader_throttle.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/features.h" +#include "services/network/public/cpp/resource_response.h" + +namespace content { + +namespace { + +const net::NetworkTrafficAnnotationTag + kSharedWorkerScriptLoadTrafficAnnotation = + net::DefineNetworkTrafficAnnotation("shared_worker_script_load", + R"( + semantics { + sender: "Shared Worker Script Load" + description: + "This request is issued by SharedWorker to fetch its main script." + trigger: + "Calling new SharedWorker()." + data: "Anything the initiator wants to send." + destination: OTHER + } + policy { + cookies_allowed: YES + cookies_store: "user" + setting: "This request can be prevented by disabling JavaScript." + chrome_policy { + URLBlacklist { + URLBlacklist: { entries: '*' } + } + } + chrome_policy { + URLWhitelist { + URLWhitelist { } + } + } + } +)"); + +} // namespace + +void SharedWorkerScriptFetcher::CreateAndStart( + std::unique_ptr<SharedWorkerScriptLoaderFactory> script_loader_factory, + std::vector<std::unique_ptr<URLLoaderThrottle>> throttles, + std::unique_ptr<network::ResourceRequest> resource_request, + CreateAndStartCallback callback) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService)); + // This fetcher will delete itself. See the class level comment. + (new SharedWorkerScriptFetcher(std::move(script_loader_factory), + std::move(resource_request), + std::move(callback))) + ->Start(std::move(throttles)); +} + +SharedWorkerScriptFetcher::SharedWorkerScriptFetcher( + std::unique_ptr<SharedWorkerScriptLoaderFactory> script_loader_factory, + std::unique_ptr<network::ResourceRequest> resource_request, + CreateAndStartCallback callback) + : script_loader_factory_(std::move(script_loader_factory)), + resource_request_(std::move(resource_request)), + callback_(std::move(callback)) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); +} + +SharedWorkerScriptFetcher::~SharedWorkerScriptFetcher() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); +} + +void SharedWorkerScriptFetcher::Start( + std::vector<std::unique_ptr<URLLoaderThrottle>> throttles) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + auto shared_url_loader_factory = + base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( + script_loader_factory_.get()); + + // SharedWorker doesn't have a frame. + int32_t routing_id = MSG_ROUTING_NONE; + + // NetworkService is not interested in the request ID. + int request_id = -1; + + url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( + std::move(shared_url_loader_factory), std::move(throttles), routing_id, + request_id, network::mojom::kURLLoadOptionNone, resource_request_.get(), + this, kSharedWorkerScriptLoadTrafficAnnotation, + base::ThreadTaskRunnerHandle::Get()); +} + +void SharedWorkerScriptFetcher::OnReceiveResponse( + const network::ResourceResponseHead& head) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + // TODO(nhiroki): Support AppCache's fallback case. See + // NavigationLoaderInterceptor::MaybeCreateLoaderForResponse() for + // reference (https://crbug.com/715632). + + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params = + blink::mojom::SharedWorkerMainScriptLoadParams::New(); + main_script_load_params->response_head = head; + main_script_load_params->url_loader_client_endpoints = url_loader_->Unbind(); + + for (size_t i = 0; i < redirect_infos_.size(); ++i) { + main_script_load_params->redirect_infos.emplace_back(redirect_infos_[i]); + main_script_load_params->redirect_response_heads.emplace_back( + redirect_response_heads_[i]); + } + + base::Optional<SubresourceLoaderParams> subresource_loader_params = + script_loader_factory_->TakeSubresourceLoaderParams(); + + std::move(callback_).Run(std::move(main_script_load_params), + std::move(subresource_loader_params)); + delete this; +} + +void SharedWorkerScriptFetcher::OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& head) { + redirect_infos_.push_back(redirect_info); + redirect_response_heads_.push_back(head); + url_loader_->FollowRedirect(base::nullopt); +} + +void SharedWorkerScriptFetcher::OnUploadProgress( + int64_t current_position, + int64_t total_size, + OnUploadProgressCallback callback) { + NOTREACHED(); +} + +void SharedWorkerScriptFetcher::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) { + NOTREACHED(); +} + +void SharedWorkerScriptFetcher::OnTransferSizeUpdated( + int32_t transfer_size_diff) { + NOTREACHED(); +} + +void SharedWorkerScriptFetcher::OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) { + // Not reached. At this point, the loader and client endpoints must have + // been unbound and forwarded to the renderer. + NOTREACHED(); +} + +void SharedWorkerScriptFetcher::OnComplete( + const network::URLLoaderCompletionStatus& status) { + // TODO(nhiroki): Handle the case where loading fails before receiving a + // response head. In that case, we should run |callback_| with an error code. + // (https://crbug.com/715632). + NOTIMPLEMENTED(); + delete this; +} + +} // namespace content
diff --git a/content/browser/shared_worker/shared_worker_script_fetcher.h b/content/browser/shared_worker/shared_worker_script_fetcher.h new file mode 100644 index 0000000..81e6d03 --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_fetcher.h
@@ -0,0 +1,83 @@ +// 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_FETCHER_H_ +#define CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_FETCHER_H_ + +#include "base/callback.h" +#include "base/optional.h" +#include "net/url_request/redirect_info.h" +#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" +#include "services/network/public/mojom/url_loader.mojom.h" +#include "third_party/blink/public/mojom/shared_worker/shared_worker_main_script_load_params.mojom.h" + +namespace network { +struct ResourceResponseHead; +struct ResourceRequest; +} // namespace network + +namespace content { + +class SharedWorkerScriptLoaderFactory; +class ThrottlingURLLoader; +class URLLoaderThrottle; +struct SubresourceLoaderParams; + +// NetworkService (PlzWorker): +// This is an implementation of the URLLoaderClient for shared worker's main +// script fetch. The loader and client bounded with this class are to be unbound +// and forwarded to the renderer process on OnReceiveResponse, and the resource +// loader in the renderer process will take them over. +// +// SharedWorkerScriptFetcher deletes itself when the ownership of the loader and +// client is passed to the renderer, or on failure. It lives on the IO thread. +class SharedWorkerScriptFetcher : public network::mojom::URLLoaderClient { + public: + using CreateAndStartCallback = + base::OnceCallback<void(blink::mojom::SharedWorkerMainScriptLoadParamsPtr, + base::Optional<SubresourceLoaderParams>)>; + + // Called on the IO thread, and calls |callback| on the IO thread when + // OnReceiveResponse is called on |this|. + static void CreateAndStart( + std::unique_ptr<SharedWorkerScriptLoaderFactory> script_loader_factory, + std::vector<std::unique_ptr<URLLoaderThrottle>> throttles, + std::unique_ptr<network::ResourceRequest> resource_request, + CreateAndStartCallback callback); + + private: + SharedWorkerScriptFetcher( + std::unique_ptr<SharedWorkerScriptLoaderFactory> script_loader_factory, + std::unique_ptr<network::ResourceRequest> resource_request, + CreateAndStartCallback callback); + + ~SharedWorkerScriptFetcher() override; + + void Start(std::vector<std::unique_ptr<URLLoaderThrottle>> throttles); + + // network::mojom::URLLoaderClient + void OnReceiveResponse(const network::ResourceResponseHead& head) override; + void OnReceiveRedirect(const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& head) override; + void OnUploadProgress(int64_t current_position, + int64_t total_size, + OnUploadProgressCallback 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; + + std::unique_ptr<SharedWorkerScriptLoaderFactory> script_loader_factory_; + std::unique_ptr<network::ResourceRequest> resource_request_; + CreateAndStartCallback callback_; + std::unique_ptr<ThrottlingURLLoader> url_loader_; + + std::vector<net::RedirectInfo> redirect_infos_; + std::vector<network::ResourceResponseHead> redirect_response_heads_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_FETCHER_H_
diff --git a/content/browser/shared_worker/shared_worker_script_loader.cc b/content/browser/shared_worker/shared_worker_script_loader.cc index 0ded2f6..4854a89 100644 --- a/content/browser/shared_worker/shared_worker_script_loader.cc +++ b/content/browser/shared_worker/shared_worker_script_loader.cc
@@ -62,6 +62,10 @@ SharedWorkerScriptLoader::~SharedWorkerScriptLoader() = default; +base::WeakPtr<SharedWorkerScriptLoader> SharedWorkerScriptLoader::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + void SharedWorkerScriptLoader::Start() { if (interceptor_index_ < interceptors_.size()) { auto* interceptor = interceptors_[interceptor_index_++].get(); @@ -82,13 +86,11 @@ SingleRequestURLLoaderFactory::RequestHandler single_request_handler) { DCHECK(interceptor); - // TODO(nhiroki): Create SubresourceLoaderParams for intercepting subresource - // requests and populating the "controller" field in ServiceWorkerContainer, - // and send the params to the renderer when we create the SharedWorker. - // Note that we shouldn't try the next interceptor if this interceptor - // provides SubresourceLoaderParams. See comments on - // NavigationLoaderInterceptor::MaybeCreateSubresourceLoaderParams() for - // details. + // Create SubresourceLoaderParams for intercepting subresource requests and + // populating the "controller" field in ServiceWorkerContainer. This can be + // null if the interceptor is not interested in this request. + subresource_loader_params_ = + interceptor->MaybeCreateSubresourceLoaderParams(); if (single_request_handler) { // The interceptor elected to handle the request. Use it. @@ -103,6 +105,12 @@ return; } + // We shouldn't try the remaining interceptors if this interceptor provides + // SubresourceLoaderParams. For details, see comments on + // NavigationLoaderInterceptor::MaybeCreateSubresourceLoaderParams(). + if (subresource_loader_params_) + interceptor_index_ = interceptors_.size(); + // Continue until all the interceptors are tried. Start(); }
diff --git a/content/browser/shared_worker/shared_worker_script_loader.h b/content/browser/shared_worker/shared_worker_script_loader.h index e8a876e..93b7140 100644 --- a/content/browser/shared_worker/shared_worker_script_loader.h +++ b/content/browser/shared_worker/shared_worker_script_loader.h
@@ -6,6 +6,7 @@ #define CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_H_ #include "base/macros.h" +#include "content/common/navigation_subresource_loader_params.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" @@ -82,6 +83,12 @@ mojo::ScopedDataPipeConsumerHandle body) override; void OnComplete(const network::URLLoaderCompletionStatus& status) override; + base::Optional<SubresourceLoaderParams> TakeSubresourceLoaderParams() { + return std::move(subresource_loader_params_); + } + + base::WeakPtr<SharedWorkerScriptLoader> GetWeakPtr(); + private: void Start(); void MaybeStartLoader( @@ -94,6 +101,8 @@ std::vector<std::unique_ptr<NavigationLoaderInterceptor>> interceptors_; size_t interceptor_index_ = 0; + base::Optional<SubresourceLoaderParams> subresource_loader_params_; + const int process_id_; const int32_t routing_id_; const int32_t request_id_;
diff --git a/content/browser/shared_worker/shared_worker_script_loader_factory.cc b/content/browser/shared_worker/shared_worker_script_loader_factory.cc index 74eaef6..eae7545 100644 --- a/content/browser/shared_worker/shared_worker_script_loader_factory.cc +++ b/content/browser/shared_worker/shared_worker_script_loader_factory.cc
@@ -5,6 +5,7 @@ #include "content/browser/shared_worker/shared_worker_script_loader_factory.h" #include <memory> +#include "base/feature_list.h" #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" @@ -12,6 +13,7 @@ #include "content/browser/shared_worker/shared_worker_script_loader.h" #include "content/public/browser/browser_thread.h" #include "mojo/public/cpp/bindings/strong_binding.h" +#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/resource_response.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/blink/public/common/service_worker/service_worker_utils.h" @@ -51,29 +53,46 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - // 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; + // When NetworkService is not enabled, this function is called from the + // renderer process, so use ReportBadMessage() instead of DCHECK(). + if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // 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; + } + if (script_loader_) { + mojo::ReportBadMessage( + "SharedWorkerScriptLoaderFactory should be used only one time"); + return; + } } + DCHECK_EQ(RESOURCE_TYPE_SHARED_WORKER, resource_request.resource_type); + DCHECK(!script_loader_); // Create a SharedWorkerScriptLoader to load the script. - mojo::MakeStrongBinding( - std::make_unique<SharedWorkerScriptLoader>( - process_id_, routing_id, request_id, options, resource_request, - std::move(client), service_worker_provider_host_, appcache_host_, - resource_context_, loader_factory_, traffic_annotation), - std::move(request)); + auto script_loader = std::make_unique<SharedWorkerScriptLoader>( + process_id_, routing_id, request_id, options, resource_request, + std::move(client), service_worker_provider_host_, appcache_host_, + resource_context_, loader_factory_, traffic_annotation); + script_loader_ = script_loader->GetWeakPtr(); + mojo::MakeStrongBinding(std::move(script_loader), 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(); + NOTREACHED(); +} + +base::Optional<SubresourceLoaderParams> +SharedWorkerScriptLoaderFactory::TakeSubresourceLoaderParams() { + DCHECK(script_loader_); + return script_loader_->TakeSubresourceLoaderParams(); } } // 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 index f54949b..4eedffb8 100644 --- a/content/browser/shared_worker/shared_worker_script_loader_factory.h +++ b/content/browser/shared_worker/shared_worker_script_loader_factory.h
@@ -6,6 +6,7 @@ #define CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_FACTORY_H_ #include "base/macros.h" +#include "content/common/navigation_subresource_loader_params.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" namespace network { @@ -17,6 +18,7 @@ class AppCacheHost; class ServiceWorkerContextWrapper; class ServiceWorkerProviderHost; +class SharedWorkerScriptLoader; class ResourceContext; // S13nServiceWorker: @@ -28,7 +30,8 @@ // // This creates a SharedWorkerScriptLoader to load the script, which follows // redirects and sets the controller service worker on the shared worker if -// needed. +// needed. It's an error to call CreateLoaderAndStart() more than a total of one +// time across this object or any of its clones. class SharedWorkerScriptLoaderFactory : public network::mojom::URLLoaderFactory { public: @@ -56,6 +59,8 @@ traffic_annotation) override; void Clone(network::mojom::URLLoaderFactoryRequest request) override; + base::Optional<SubresourceLoaderParams> TakeSubresourceLoaderParams(); + private: const int process_id_; base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host_; @@ -63,6 +68,10 @@ ResourceContext* resource_context_ = nullptr; scoped_refptr<network::SharedURLLoaderFactory> loader_factory_; + // This is owned by StrongBinding associated with the given URLLoaderRequest, + // and invalidated after request completion or failure. + base::WeakPtr<SharedWorkerScriptLoader> script_loader_; + DISALLOW_COPY_AND_ASSIGN(SharedWorkerScriptLoaderFactory); };
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc index 700a069..b383daf9 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.cc +++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -9,6 +9,7 @@ #include <algorithm> #include <iterator> +#include "base/bind.h" #include "base/callback.h" #include "base/feature_list.h" #include "base/logging.h" @@ -19,20 +20,27 @@ #include "content/browser/file_url_loader_factory.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_fetcher.h" +#include "content/browser/shared_worker/shared_worker_script_loader.h" #include "content/browser/shared_worker/shared_worker_script_loader_factory.h" #include "content/browser/storage_partition_impl.h" #include "content/browser/url_loader_factory_getter.h" #include "content/browser/web_contents/web_contents_impl.h" +#include "content/common/content_constants_internal.h" +#include "content/common/navigation_subresource_loader_params.h" #include "content/common/service_worker/service_worker_provider.mojom.h" #include "content/common/shared_worker/shared_worker_client.mojom.h" +#include "content/common/throttling_url_loader.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/render_frame_host.h" #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 "content/public/common/renderer_preferences.h" #include "mojo/public/cpp/bindings/strong_associated_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h" +#include "services/network/loader_util.h" #include "services/network/public/cpp/features.h" #include "third_party/blink/public/common/message_port/message_port_channel.h" #include "third_party/blink/public/common/service_worker/service_worker_utils.h" @@ -41,6 +49,13 @@ namespace content { namespace { +using StartLoaderCallback = + base::OnceCallback<void(mojom::ServiceWorkerProviderInfoForSharedWorkerPtr, + network::mojom::URLLoaderFactoryAssociatedPtrInfo, + std::unique_ptr<URLLoaderFactoryBundleInfo>, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr, + base::Optional<SubresourceLoaderParams>)>; + bool IsShuttingDown(RenderProcessHost* host) { return !host || host->FastShutdownStarted() || host->IsKeepAliveRefCountDisabled(); @@ -87,6 +102,26 @@ return factory_bundle; } +void DidCreateScriptLoaderOnIO( + StartLoaderCallback callback, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + main_script_loader_factory, + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + base::Optional<SubresourceLoaderParams> subresource_loader_params) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(std::move(callback), + std::move(service_worker_provider_info), + std::move(main_script_loader_factory), + std::move(subresource_loader_factories), + std::move(main_script_load_params), + std::move(subresource_loader_params))); +} + void CreateScriptLoaderOnIO( scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter, std::unique_ptr<URLLoaderFactoryBundleInfo> factory_bundle_for_browser_info, @@ -95,12 +130,11 @@ AppCacheNavigationHandleCore* appcache_handle_core, std::unique_ptr<network::SharedURLLoaderFactoryInfo> blob_url_loader_factory_info, + std::unique_ptr<network::ResourceRequest> resource_request, int process_id, - base::OnceCallback<void(mojom::ServiceWorkerProviderInfoForSharedWorkerPtr, - network::mojom::URLLoaderFactoryAssociatedPtrInfo, - std::unique_ptr<URLLoaderFactoryBundleInfo>)> - callback) { + StartLoaderCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled()); // Set up for service worker. auto provider_info = mojom::ServiceWorkerProviderInfoForSharedWorker::New(); @@ -144,6 +178,31 @@ appcache_handle_core ? appcache_handle_core->host()->GetWeakPtr() : nullptr; + // NetworkService (PlzWorker): + // Start loading a shared worker main script. + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // TODO(nhiroki): Figure out what we should do in |wc_getter| for loading + // shared worker's main script. + base::RepeatingCallback<WebContents*()> wc_getter = + base::BindRepeating([]() -> WebContents* { return nullptr; }); + std::vector<std::unique_ptr<URLLoaderThrottle>> throttles = + GetContentClient()->browser()->CreateURLLoaderThrottles( + *resource_request, context->resource_context(), wc_getter, + nullptr /* navigation_ui_data */, -1 /* frame_tree_node_id */); + + SharedWorkerScriptFetcher::CreateAndStart( + std::make_unique<SharedWorkerScriptLoaderFactory>( + process_id, context.get(), host, + std::move(appcache_host), context->resource_context(), + std::move(url_loader_factory)), + std::move(throttles), std::move(resource_request), + base::BindOnce(DidCreateScriptLoaderOnIO, std::move(callback), + std::move(provider_info), + nullptr /* main_script_loader_factory */, + std::move(subresource_loader_factories))); + return; + } + // Create the SharedWorkerScriptLoaderFactory. network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory; mojo::MakeStrongAssociatedBinding( @@ -153,12 +212,11 @@ std::move(url_loader_factory)), mojo::MakeRequest(&main_script_loader_factory)); - // We continue in StartWorker. - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::BindOnce(std::move(callback), std::move(provider_info), - std::move(main_script_loader_factory), - std::move(subresource_loader_factories))); + DidCreateScriptLoaderOnIO(std::move(callback), std::move(provider_info), + std::move(main_script_loader_factory), + std::move(subresource_loader_factories), + nullptr /* main_script_load_params */, + base::nullopt /* subresource_loader_params */); } } // namespace @@ -330,6 +388,37 @@ CreateFactoryBundle(process_id, storage_partition, constructor_uses_file_url); + // NetworkService (PlzWorker): + // Create a resource request for initiating shared worker script fetch from + // the browser process. + std::unique_ptr<network::ResourceRequest> resource_request; + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + // TODO(nhiroki): Populate more fields like referrer. + // (https://crbug.com/715632) + resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = weak_host->instance()->url(); + resource_request->request_initiator = + weak_host->instance()->constructor_origin(); + resource_request->resource_type = RESOURCE_TYPE_SHARED_WORKER; + + // Set the "Accept" header. + resource_request->headers.SetHeader(network::kAcceptHeader, + network::kDefaultAcceptHeader); + + // Set the "DNT" header if necessary. + RendererPreferences renderer_preferences; + GetContentClient()->browser()->UpdateRendererPreferencesForWorker( + RenderProcessHost::FromID(process_id)->GetBrowserContext(), + &renderer_preferences); + if (renderer_preferences.enable_do_not_track) + resource_request->headers.SetHeader(kDoNotTrackHeader, "1"); + + // TODO(nhiroki): Set the "Sec-Metadata" header and the "Save-Data" + // header. See AddAdditionalRequestHeaders() in navigation_request.cc for + // reference (https://crbug.com/715632). + } + + // NetworkService (PlzWorker): // An appcache interceptor is available only when the network service is // enabled. AppCacheNavigationHandleCore* appcache_handle_core = nullptr; @@ -350,7 +439,7 @@ appcache_handle_core, blob_url_loader_factory ? blob_url_loader_factory->Clone() : nullptr, - process_id, + std::move(resource_request), process_id, base::BindOnce(&SharedWorkerServiceImpl::StartWorker, weak_factory_.GetWeakPtr(), std::move(instance), weak_host, std::move(client), process_id, frame_id, @@ -358,11 +447,14 @@ return; } + // Legacy case (to be deprecated): StartWorker(std::move(instance), weak_host, std::move(client), process_id, frame_id, message_port, nullptr /* service_worker_provider_info */, {} /* main_script_loader_factory */, - nullptr /* subresource_loader_factories */); + nullptr /* subresource_loader_factories */, + nullptr /* main_script_load_params */, + base::nullopt /* subresource_loader_params */); } void SharedWorkerServiceImpl::StartWorker( @@ -376,7 +468,9 @@ service_worker_provider_info, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories) { + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + base::Optional<SubresourceLoaderParams> subresource_loader_params) { DCHECK_CURRENTLY_ON(BrowserThread::UI); // The host may already be gone if something forcibly terminated the worker @@ -404,7 +498,9 @@ host->Start(std::move(factory), std::move(service_worker_provider_info), std::move(main_script_loader_factory), - std::move(subresource_loader_factories)); + std::move(main_script_load_params), + std::move(subresource_loader_factories), + std::move(subresource_loader_params)); host->AddClient(std::move(client), process_id, frame_id, message_port); }
diff --git a/content/browser/shared_worker/shared_worker_service_impl.h b/content/browser/shared_worker/shared_worker_service_impl.h index 219003f2..c993eb07 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.h +++ b/content/browser/shared_worker/shared_worker_service_impl.h
@@ -20,7 +20,9 @@ #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/cpp/resource_response.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" +#include "third_party/blink/public/mojom/shared_worker/shared_worker_main_script_load_params.mojom.h" namespace blink { class MessagePortChannel; @@ -32,6 +34,7 @@ class SharedWorkerInstance; class SharedWorkerHost; class StoragePartition; +struct SubresourceLoaderParams; // Created per StoragePartition. class CONTENT_EXPORT SharedWorkerServiceImpl : public SharedWorkerService { @@ -85,7 +88,9 @@ service_worker_provider_info, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories); + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + base::Optional<SubresourceLoaderParams> subresource_loader_params); // Returns nullptr if there is no such host. SharedWorkerHost* FindSharedWorkerHost(int process_id, int route_id);
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index cc0baa4..da022d8 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -1834,15 +1834,7 @@ // results in a scroll. This is only handled by RenderWidgetHostViewAura // and is needed for trackpad scrolling on Chromebooks. #if defined(USE_AURA) - -#if defined(THREAD_SANITIZER) || defined(OS_CHROMEOS) -// Flaky: https://crbug.com/833380 -#define MAYBE_ScrollEventToOOPIF DISABLED_ScrollEventToOOPIF -#else -#define MAYBE_ScrollEventToOOPIF ScrollEventToOOPIF -#endif -IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, - MAYBE_ScrollEventToOOPIF) { +IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, ScrollEventToOOPIF) { GURL main_url(embedded_test_server()->GetURL( "/frame_tree/page_with_positioned_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -1890,17 +1882,8 @@ blink::WebInputEvent::kMouseWheel)); } -#if defined(THREAD_SANITIZER) -// Flaky: https://crbug.com/833380 -#define MAYBE_InputEventRouterWheelCoalesceTest \ - DISABLED_InputEventRouterWheelCoalesceTest -#else -#define MAYBE_InputEventRouterWheelCoalesceTest \ - InputEventRouterWheelCoalesceTest -#endif - IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, - MAYBE_InputEventRouterWheelCoalesceTest) { + InputEventRouterWheelCoalesceTest) { GURL main_url(embedded_test_server()->GetURL( "/frame_tree/page_with_positioned_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -2075,35 +2058,22 @@ OverlapSurfaceHitTestHelper(shell(), embedded_test_server()); } -#if defined(OS_LINUX) -// Flaky timeouts and failures: https://crbug.com/833380 -#define MAYBE_HitTestLayerSquashing DISABLED_HitTestLayerSquashing -#else -#define MAYBE_HitTestLayerSquashing HitTestLayerSquashing -#endif IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, - MAYBE_HitTestLayerSquashing) { + HitTestLayerSquashing) { HitTestLayerSquashing(shell(), embedded_test_server()); } IN_PROC_BROWSER_TEST_P(SitePerProcessHighDPIHitTestBrowserTest, - MAYBE_HitTestLayerSquashing) { + HitTestLayerSquashing) { HitTestLayerSquashing(shell(), embedded_test_server()); } -#if defined(OS_LINUX) -// Flaky timeouts and failures: https://crbug.com/833380 -#define MAYBE_HitTestWatermark DISABLED_HitTestWatermark -#else -#define MAYBE_HitTestWatermark HitTestWatermark -#endif -IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, - MAYBE_HitTestWatermark) { +IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, HitTestWatermark) { HitTestWatermark(shell(), embedded_test_server()); } IN_PROC_BROWSER_TEST_P(SitePerProcessHighDPIHitTestBrowserTest, - MAYBE_HitTestWatermark) { + HitTestWatermark) { HitTestWatermark(shell(), embedded_test_server()); }
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc index 042eccd..280d9de 100644 --- a/content/browser/utility_process_host.cc +++ b/content/browser/utility_process_host.cc
@@ -105,7 +105,8 @@ #if BUILDFLAG(USE_ZYGOTE_HANDLE) service_manager::ZygoteHandle GetZygote() override { if (service_manager::IsUnsandboxedSandboxType(sandbox_type_) || - sandbox_type_ == service_manager::SANDBOX_TYPE_NETWORK) { + sandbox_type_ == service_manager::SANDBOX_TYPE_NETWORK || + sandbox_type_ == service_manager::SANDBOX_TYPE_AUDIO) { return nullptr; } return service_manager::GetGenericZygote();
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 49f26c7b..90cad1d 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2084,6 +2084,20 @@ return last_committed_source_id_; } +void WebContentsImpl::SetTopControlsShownRatio(float ratio) { + if (delegate_) + delegate_->SetTopControlsShownRatio(this, ratio); +} + +int WebContentsImpl::GetTopControlsHeight() const { + return delegate_ ? delegate_->GetTopControlsHeight() : 0; +} + +void WebContentsImpl::SetTopControlsGestureScrollInProgress(bool in_progress) { + if (delegate_) + delegate_->SetTopControlsGestureScrollInProgress(in_progress); +} + void WebContentsImpl::RenderWidgetCreated( RenderWidgetHostImpl* render_widget_host) { created_widgets_.insert(render_widget_host);
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 2687e87e..042b256 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -689,6 +689,9 @@ // RenderWidgetHostDelegate -------------------------------------------------- ukm::SourceId GetUkmSourceIdForLastCommittedSource() const override; + void SetTopControlsShownRatio(float ratio) override; + int GetTopControlsHeight() const override; + void SetTopControlsGestureScrollInProgress(bool in_progress) override; void RenderWidgetCreated(RenderWidgetHostImpl* render_widget_host) override; void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) override; void RenderWidgetGotFocus(RenderWidgetHostImpl* render_widget_host) override;
diff --git a/content/browser/web_contents/web_drag_source_mac.mm b/content/browser/web_contents/web_drag_source_mac.mm index 1ebcedb0..32f12c7 100644 --- a/content/browser/web_contents/web_drag_source_mac.mm +++ b/content/browser/web_contents/web_drag_source_mac.mm
@@ -31,6 +31,7 @@ #include "net/base/escape.h" #include "net/base/filename_util.h" #include "net/base/mime_util.h" +#include "ui/base/clipboard/clipboard_util_mac.h" #include "ui/base/clipboard/custom_data_helper.h" #include "ui/base/cocoa/cocoa_base_utils.h" #include "ui/base/dragdrop/cocoa_dnd_util.h" @@ -49,10 +50,6 @@ namespace { -// An unofficial standard pasteboard title type to be provided alongside the -// |NSURLPboardType|. -NSString* const kNSURLTitlePboardType = @"public.url-name"; - // This helper's sole task is to write out data for a promised file; the caller // is responsible for opening the file. It takes the drop data and an open file // stream. @@ -154,9 +151,9 @@ } [url writeToPasteboard:pboard]; // URL title. - } else if ([type isEqualToString:kNSURLTitlePboardType]) { + } else if ([type isEqualToString:ui::kUTTypeURLName]) { [pboard setString:SysUTF16ToNSString(dropData_->url_title) - forType:kNSURLTitlePboardType]; + forType:ui::kUTTypeURLName]; // File contents. } else if ([type isEqualToString:base::mac::CFToNSCast(fileUTI_)]) { @@ -348,7 +345,7 @@ // URL (and title). if (dropData_->url.is_valid()) { - [pasteboard_ addTypes:@[ NSURLPboardType, kNSURLTitlePboardType ] + [pasteboard_ addTypes:@[ NSURLPboardType, ui::kUTTypeURLName ] owner:contentsView_]; }
diff --git a/content/browser/web_package/signed_exchange_certificate_chain.h b/content/browser/web_package/signed_exchange_certificate_chain.h index b20f7349..62ce9d5 100644 --- a/content/browser/web_package/signed_exchange_certificate_chain.h +++ b/content/browser/web_package/signed_exchange_certificate_chain.h
@@ -46,7 +46,6 @@ private: scoped_refptr<net::X509Certificate> cert_; - // Version b1 specific fields: std::string ocsp_; std::string sct_; };
diff --git a/content/browser/web_package/signed_exchange_consts.h b/content/browser/web_package/signed_exchange_consts.h index 4f18d33..3433503 100644 --- a/content/browser/web_package/signed_exchange_consts.h +++ b/content/browser/web_package/signed_exchange_consts.h
@@ -10,7 +10,7 @@ constexpr char kAcceptHeaderSignedExchangeSuffix[] = ",application/signed-exchange;v=b2"; -enum class SignedExchangeVersion { kB2 }; +enum class SignedExchangeVersion { kUnknown, kB2 }; // Field names defined in the application/signed-exchange content type: // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#application-signed-exchange
diff --git a/content/browser/web_package/signed_exchange_envelope.cc b/content/browser/web_package/signed_exchange_envelope.cc index 96f2750e..1b2d42e 100644 --- a/content/browser/web_package/signed_exchange_envelope.cc +++ b/content/browser/web_package/signed_exchange_envelope.cc
@@ -23,7 +23,7 @@ namespace { -// IsStateful{Request,Response}Header return true if |name| is a stateful +// IsStateful{Request,Response}Header returns true if |name| is a stateful // header field. Stateful header fields will cause validation failure of // signed exchanges. // Note that |name| must be lower-cased. @@ -180,20 +180,6 @@ devtools_proxy, "Failed to parse status code to integer."); return false; } - // https://wicg.github.io/webpackage/loading.html#parsing-b1 - // Step 26. If parsedExchange’s response's status is a redirect status or the - // signed exchange version of parsedExchange’s response is not - // undefined, return a failure. [spec text] - // TODO(crbug.com/803774): Reject if inner response is a signed exchange. - if (net::HttpResponseHeaders::IsRedirectResponseCode(response_code)) { - signed_exchange_utils::ReportErrorAndTraceEvent( - devtools_proxy, - base::StringPrintf( - "Exchange's response status must not be a redirect status. " - "status: %d", - response_code)); - return false; - } out->set_response_code(static_cast<net::HttpStatusCode>(response_code)); for (const auto& it : response_map) { @@ -224,7 +210,7 @@ return false; } - // 4. If exchange’s headers contain a stateful header field, as defined in + // 4. If exchange’s headers contains a stateful header field, as defined in // Section 4.1, return “invalid”. [spec text] if (IsStatefulResponseHeader(name_str)) { signed_exchange_utils::ReportErrorAndTraceEvent( @@ -249,6 +235,37 @@ return false; } } + + // https://wicg.github.io/webpackage/loading.html#parsing-b1 + // Step 26. If parsedExchange’s response's status is a redirect status or the + // signed exchange version of parsedExchange’s response is not + // undefined, return a failure. [spec text] + if (net::HttpResponseHeaders::IsRedirectResponseCode(out->response_code())) { + signed_exchange_utils::ReportErrorAndTraceEvent( + devtools_proxy, + base::StringPrintf( + "Exchange's response status must not be a redirect status. " + "status: %d", + response_code)); + return false; + } + // Note: This does not reject content-type like "application/signed-exchange" + // (no "v=" parameter). In that case, SignedExchangeRequestHandler does not + // handle the inner response and UA just downloads it. + // See https://github.com/WICG/webpackage/issues/299 for details. + auto found = out->response_headers().find("content-type"); + if (found != out->response_headers().end() && + signed_exchange_utils::GetSignedExchangeVersion(found->second) + .has_value()) { + signed_exchange_utils::ReportErrorAndTraceEvent( + devtools_proxy, + base::StringPrintf( + "Exchange's inner response must not be a signed-exchange. " + "conetent-type: %s", + found->second.c_str())); + return false; + } + return true; }
diff --git a/content/browser/web_package/signed_exchange_envelope.h b/content/browser/web_package/signed_exchange_envelope.h index 6903b8e..1b7026d 100644 --- a/content/browser/web_package/signed_exchange_envelope.h +++ b/content/browser/web_package/signed_exchange_envelope.h
@@ -33,7 +33,7 @@ // Parse headers from the application/signed-exchange;v=b2 format. // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#application-signed-exchange // - // This also performs the step 1, 3 and 4 of "Cross-origin trust" validation. + // This also performs the steps 1, 3 and 4 of "Cross-origin trust" validation. // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cross-origin-trust static base::Optional<SignedExchangeEnvelope> Parse( const GURL& fallback_url,
diff --git a/content/browser/web_package/signed_exchange_envelope_unittest.cc b/content/browser/web_package/signed_exchange_envelope_unittest.cc index 919019bd..99c7963 100644 --- a/content/browser/web_package/signed_exchange_envelope_unittest.cc +++ b/content/browser/web_package/signed_exchange_envelope_unittest.cc
@@ -229,4 +229,15 @@ ASSERT_FALSE(header.has_value()); } +TEST(SignedExchangeEnvelopeTest, InnerResponseIsSXG) { + auto header = GenerateHeaderAndParse( + GURL("https://test.example.org/test/"), kSignatureString, + { + {kMethodKey, "GET"}, + }, + {{kStatusKey, "200"}, + {"content-type", "application/signed-exchange;v=b2"}}); + ASSERT_FALSE(header.has_value()); +} + } // namespace content
diff --git a/content/browser/web_package/signed_exchange_handler.cc b/content/browser/web_package/signed_exchange_handler.cc index a2c5fb82..64e39f6 100644 --- a/content/browser/web_package/signed_exchange_handler.cc +++ b/content/browser/web_package/signed_exchange_handler.cc
@@ -103,6 +103,43 @@ certificate, url, ocsp_result, sct_list, std::move(wrapped_callback)); } +std::string OCSPErrorToString(const net::OCSPVerifyResult& ocsp_result) { + switch (ocsp_result.response_status) { + case net::OCSPVerifyResult::PROVIDED: + break; + case net::OCSPVerifyResult::NOT_CHECKED: + // This happens only in tests. + return "OCSP verification was not performed."; + case net::OCSPVerifyResult::MISSING: + return "No OCSP Response was stapled."; + case net::OCSPVerifyResult::ERROR_RESPONSE: + return "OCSP response did not have a SUCCESSFUL status."; + case net::OCSPVerifyResult::BAD_PRODUCED_AT: + return "OCSP Response was produced at outside the certificate " + "validity period."; + case net::OCSPVerifyResult::NO_MATCHING_RESPONSE: + return "OCSP Response did not match the certificate."; + case net::OCSPVerifyResult::INVALID_DATE: + return "OCSP Response was expired or not yet valid."; + case net::OCSPVerifyResult::PARSE_RESPONSE_ERROR: + return "OCSPResponse structure could not be parsed."; + case net::OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR: + return "OCSP ResponseData structure could not be parsed."; + } + + switch (ocsp_result.revocation_status) { + case net::OCSPRevocationStatus::GOOD: + NOTREACHED(); + break; + case net::OCSPRevocationStatus::REVOKED: + return "OCSP response indicates that the certificate is revoked."; + case net::OCSPRevocationStatus::UNKNOWN: + return "OCSP responder doesn't know about the certificate."; + } + NOTREACHED(); + return std::string(); +} + } // namespace // static @@ -136,12 +173,11 @@ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"), "SignedExchangeHandler::SignedExchangeHandler"); - if (!SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version_) || - !IsSupportedSignedExchangeVersion(version_)) { + version_ = signed_exchange_utils::GetSignedExchangeVersion(content_type); + if (!IsSupportedSignedExchangeVersion(version_)) { signed_exchange_utils::ReportErrorAndTraceEvent( devtools_proxy_.get(), - base::StringPrintf("Unsupported version of the content type. Currentry " + base::StringPrintf("Unsupported version of the content type. Currently " "content type must be " "\"application/signed-exchange;v=b2\". But the " "response content type was \"%s\"", @@ -481,10 +517,8 @@ if (!CheckOCSPStatus(cv_result.ocsp_result)) { signed_exchange_utils::ReportErrorAndTraceEvent( devtools_proxy_.get(), - base::StringPrintf( - "OCSP check failed. response status: %d, revocation status: %d", - cv_result.ocsp_result.response_status, - cv_result.ocsp_result.revocation_status), + base::StringPrintf("OCSP check failed: %s", + OCSPErrorToString(cv_result.ocsp_result).c_str()), std::make_pair(0 /* signature_index */, SignedExchangeError::Field::kSignatureCertUrl)); RunErrorCallback(net::ERR_INVALID_SIGNED_EXCHANGE);
diff --git a/content/browser/web_package/signed_exchange_handler.h b/content/browser/web_package/signed_exchange_handler.h index 122ac720..546ec38 100644 --- a/content/browser/web_package/signed_exchange_handler.h +++ b/content/browser/web_package/signed_exchange_handler.h
@@ -45,12 +45,12 @@ class SignedExchangeDevToolsProxy; // SignedExchangeHandler reads "application/signed-exchange" format from a -// net::SourceStream, parse and verify the signed exchange, and report +// net::SourceStream, parses and verifies the signed exchange, and reports // the result asynchronously via SignedExchangeHandler::ExchangeHeadersCallback. // // Note that verifying a signed exchange requires an associated certificate // chain. SignedExchangeHandler creates a SignedExchangeCertFetcher to -// fetch the certificate chain over network, and verify it with the +// fetch the certificate chain over the network, and verifies it with the // net::CertVerifier. class CONTENT_EXPORT SignedExchangeHandler { public:
diff --git a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc index 03a54596..299aa55e 100644 --- a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc +++ b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
@@ -327,7 +327,7 @@ // StoragePartition so that we can record and extract the detailed error // status for testing via that. console_observer.Wait(); - EXPECT_TRUE(base::StartsWith(console_observer.message(), "OCSP check failed.", + EXPECT_TRUE(base::StartsWith(console_observer.message(), "OCSP check failed:", base::CompareCase::SENSITIVE)); }
diff --git a/content/browser/web_package/signed_exchange_signature_header_field.cc b/content/browser/web_package/signed_exchange_signature_header_field.cc index f6e3cfd..907e09e 100644 --- a/content/browser/web_package/signed_exchange_signature_header_field.cc +++ b/content/browser/web_package/signed_exchange_signature_header_field.cc
@@ -280,28 +280,6 @@ return signatures; } -// static -bool SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - base::StringPiece content_type, - base::Optional<SignedExchangeVersion>* version_param) { - DCHECK(version_param); - StructuredHeaderParser parser(content_type); - ParameterisedIdentifier parameterised_identifier; - parser.ParseParameterisedIdentifier(¶meterised_identifier); - if (!parser.ParsedSuccessfully()) - return false; - const auto it = parameterised_identifier.params.find("v"); - if (it == parameterised_identifier.params.end()) { - *version_param = base::nullopt; - } else { - if (it->second == "b2") - *version_param = SignedExchangeVersion::kB2; - else - return false; - } - return true; -} - SignedExchangeSignatureHeaderField::Signature::Signature() = default; SignedExchangeSignatureHeaderField::Signature::Signature( const Signature& other) = default;
diff --git a/content/browser/web_package/signed_exchange_signature_header_field.h b/content/browser/web_package/signed_exchange_signature_header_field.h index 166850c..c2603c4 100644 --- a/content/browser/web_package/signed_exchange_signature_header_field.h +++ b/content/browser/web_package/signed_exchange_signature_header_field.h
@@ -13,7 +13,6 @@ #include "base/macros.h" #include "base/optional.h" #include "base/strings/string_piece.h" -#include "content/browser/web_package/signed_exchange_consts.h" #include "content/common/content_export.h" #include "net/base/hash_value.h" #include "url/gurl.h" @@ -22,7 +21,7 @@ class SignedExchangeDevToolsProxy; -// SignedExchangeSignatureHeaderField provides parser for signed exchange's +// SignedExchangeSignatureHeaderField provides a parser for signed exchange's // `Signature` header field. // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html class CONTENT_EXPORT SignedExchangeSignatureHeaderField { @@ -49,14 +48,6 @@ static base::Optional<std::vector<Signature>> ParseSignature( base::StringPiece signature_str, SignedExchangeDevToolsProxy* devtools_proxy); - - // TODO(kouhei): Move this to another class. - // Parses |content_type| to get the value of "v=" parameter of the signed - // exchange, and converts to SignedExchangeVersion. Returns false if failed to - // parse. - static bool GetVersionParamFromContentType( - base::StringPiece content_type, - base::Optional<SignedExchangeVersion>* version_param); }; } // namespace content
diff --git a/content/browser/web_package/signed_exchange_signature_header_field_unittest.cc b/content/browser/web_package/signed_exchange_signature_header_field_unittest.cc index e34fd13..b6cacc1 100644 --- a/content/browser/web_package/signed_exchange_signature_header_field_unittest.cc +++ b/content/browser/web_package/signed_exchange_signature_header_field_unittest.cc
@@ -274,60 +274,4 @@ EXPECT_FALSE(signatures.has_value()); } -TEST_F(SignedExchangeSignatureHeaderFieldTest, VersionParam_None) { - const char content_type[] = "application/signed-exchange"; - base::Optional<SignedExchangeVersion> version; - EXPECT_TRUE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); - EXPECT_FALSE(version); -} - -TEST_F(SignedExchangeSignatureHeaderFieldTest, VersionParam_NoneWithSemicolon) { - const char content_type[] = "application/signed-exchange;"; - base::Optional<SignedExchangeVersion> version; - EXPECT_FALSE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); -} - -TEST_F(SignedExchangeSignatureHeaderFieldTest, VersionParam_EmptyString) { - const char content_type[] = "application/signed-exchange;v="; - base::Optional<SignedExchangeVersion> version; - EXPECT_FALSE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); -} - -TEST_F(SignedExchangeSignatureHeaderFieldTest, VersionParam_Simple) { - const char content_type[] = "application/signed-exchange;v=b2"; - base::Optional<SignedExchangeVersion> version; - EXPECT_TRUE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); - ASSERT_TRUE(version); - EXPECT_EQ(*version, SignedExchangeVersion::kB2); -} - -TEST_F(SignedExchangeSignatureHeaderFieldTest, VersionParam_SimpleWithSpace) { - const char content_type[] = "application/signed-exchange; v=b2"; - base::Optional<SignedExchangeVersion> version; - EXPECT_TRUE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); - ASSERT_TRUE(version); - EXPECT_EQ(*version, SignedExchangeVersion::kB2); -} - -TEST_F(SignedExchangeSignatureHeaderFieldTest, - VersionParam_SimpleWithDoublequotes) { - const char content_type[] = "application/signed-exchange;v=\"b2\""; - base::Optional<SignedExchangeVersion> version; - EXPECT_TRUE( - SignedExchangeSignatureHeaderField::GetVersionParamFromContentType( - content_type, &version)); - ASSERT_TRUE(version); - EXPECT_EQ(*version, SignedExchangeVersion::kB2); -} - } // namespace content
diff --git a/content/browser/web_package/signed_exchange_utils.cc b/content/browser/web_package/signed_exchange_utils.cc index bc1a1af24..b5b611c 100644 --- a/content/browser/web_package/signed_exchange_utils.cc +++ b/content/browser/web_package/signed_exchange_utils.cc
@@ -5,12 +5,14 @@ #include "content/browser/web_package/signed_exchange_utils.h" #include "base/feature_list.h" +#include "base/strings/string_util.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "content/browser/web_package/signed_exchange_devtools_proxy.h" #include "content/browser/web_package/signed_exchange_error.h" #include "content/browser/web_package/signed_exchange_request_handler.h" #include "content/public/common/content_features.h" +#include "net/http/http_util.h" #include "services/network/public/cpp/resource_response.h" #include "third_party/blink/public/common/origin_trials/trial_token_validator.h" @@ -54,5 +56,42 @@ base::Time::Now()); } +base::Optional<SignedExchangeVersion> GetSignedExchangeVersion( + const std::string& content_type) { + // https://wicg.github.io/webpackage/loading.html#signed-exchange-version + // Step 1. Let mimeType be the supplied MIME type of response. [spec text] + // |content_type| is the supplied MIME type. + // Step 2. If mimeType is undefined, return undefined. [spec text] + // Step 3. If mimeType's essence is not "application/signed-exchange", return + // undefined. [spec text] + const std::string::size_type semicolon = content_type.find(';'); + const std::string essence = base::ToLowerASCII(base::TrimWhitespaceASCII( + content_type.substr(0, semicolon), base::TRIM_ALL)); + if (essence != "application/signed-exchange") + return base::nullopt; + + // Step 4.Let params be mimeType's parameters. [spec text] + std::map<std::string, std::string> params; + if (semicolon != base::StringPiece::npos) { + net::HttpUtil::NameValuePairsIterator parser( + content_type.begin() + semicolon + 1, content_type.end(), ';'); + while (parser.GetNext()) { + const base::StringPiece name(parser.name_begin(), parser.name_end()); + params[base::ToLowerASCII(name)] = parser.value(); + } + if (!parser.valid()) + return base::nullopt; + } + // Step 5. If params["v"] exists, return it. Otherwise, return undefined. + // [spec text] + auto iter = params.find("v"); + if (iter != params.end()) { + if (iter->second == "b2") + return base::make_optional(SignedExchangeVersion::kB2); + return base::make_optional(SignedExchangeVersion::kUnknown); + } + return base::nullopt; +} + } // namespace signed_exchange_utils } // namespace content
diff --git a/content/browser/web_package/signed_exchange_utils.h b/content/browser/web_package/signed_exchange_utils.h index 105cd89..359dc02 100644 --- a/content/browser/web_package/signed_exchange_utils.h +++ b/content/browser/web_package/signed_exchange_utils.h
@@ -8,7 +8,9 @@ #include <string> #include "base/optional.h" +#include "content/browser/web_package/signed_exchange_consts.h" #include "content/browser/web_package/signed_exchange_error.h" +#include "content/common/content_export.h" class GURL; @@ -43,7 +45,15 @@ const GURL& request_url, const network::ResourceResponseHead& head); -} // namespace signed_exchange_utils +// Extracts the signed exchange version [1] from |content_type|, and converts it +// to SignedExchanveVersion. Returns nullopt if the mime type is not a variant +// of application/signed-exchange. Returns SignedExchangeVersion::kUnknown if an +// unsupported signed exchange version is found. +// [1] https://wicg.github.io/webpackage/loading.html#signed-exchange-version +CONTENT_EXPORT base::Optional<SignedExchangeVersion> GetSignedExchangeVersion( + const std::string& content_type); + +} // namespace signed_exchange_utils } // namespace content #endif // CONTENT_BROWSER_WEB_PACKAGE_SIGNED_EXCHANGE_UTILS_H_
diff --git a/content/browser/web_package/signed_exchange_utils_unittest.cc b/content/browser/web_package/signed_exchange_utils_unittest.cc new file mode 100644 index 0000000..93fd069 --- /dev/null +++ b/content/browser/web_package/signed_exchange_utils_unittest.cc
@@ -0,0 +1,73 @@ +// 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/web_package/signed_exchange_utils.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { +namespace signed_exchange_utils { + +TEST(SignedExchangeUtilsTest, VersionParam_None) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange"); + EXPECT_FALSE(version.has_value()); +} + +TEST(SignedExchangeUtilsTest, VersionParam_NoneWithSemicolon) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;"); + EXPECT_FALSE(version.has_value()); +} + +TEST(SignedExchangeUtilsTest, VersionParam_Empty) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v="); + EXPECT_FALSE(version.has_value()); +} + +TEST(SignedExchangeUtilsTest, VersionParam_EmptyString) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v=\"\""); + EXPECT_EQ(version, SignedExchangeVersion::kUnknown); +} + +TEST(SignedExchangeUtilsTest, VersionParam_UnknownVersion) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v=foobar"); + EXPECT_EQ(version, SignedExchangeVersion::kUnknown); +} + +TEST(SignedExchangeUtilsTest, VersionParam_Simple) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v=b2"); + EXPECT_EQ(version, SignedExchangeVersion::kB2); +} + +TEST(SignedExchangeUtilsTest, VersionParam_WithSpace) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange ; v=b2"); + EXPECT_EQ(version, SignedExchangeVersion::kB2); +} + +TEST(SignedExchangeUtilsTest, VersionParam_ExtraParam) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v=b2;foo=bar"); + EXPECT_EQ(version, SignedExchangeVersion::kB2); +} + +TEST(SignedExchangeUtilsTest, VersionParam_Quoted) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("application/signed-exchange;v=\"b2\""); + EXPECT_EQ(version, SignedExchangeVersion::kB2); +} + +TEST(SignedExchangeUtilsTest, VersionParam_UseCaseInsensitiveMatch) { + base::Optional<SignedExchangeVersion> version = + GetSignedExchangeVersion("Application/Signed-Exchange;V=b2"); + EXPECT_EQ(version, SignedExchangeVersion::kB2); +} + +} // namespace signed_exchange_utils +} // namespace content
diff --git a/content/browser/webui/web_ui_message_handler_unittest.cc b/content/browser/webui/web_ui_message_handler_unittest.cc index e940e5c..ba1bb02 100644 --- a/content/browser/webui/web_ui_message_handler_unittest.cc +++ b/content/browser/webui/web_ui_message_handler_unittest.cc
@@ -14,10 +14,13 @@ TEST(WebUIMessageHandlerTest, ExtractIntegerValue) { base::ListValue list; - int value, zero_value = 0, neg_value = -1234, pos_value = 1234; - base::string16 zero_string(base::UTF8ToUTF16("0")); - base::string16 neg_string(base::UTF8ToUTF16("-1234")); - base::string16 pos_string(base::UTF8ToUTF16("1234")); + int value; + constexpr int zero_value = 0; + constexpr int neg_value = -1234; + constexpr int pos_value = 1234; + static const char zero_string[] = "0"; + static const char neg_string[] = "-1234"; + static const char pos_string[] = "1234"; list.AppendInteger(zero_value); EXPECT_TRUE(WebUIMessageHandler::ExtractIntegerValue(&list, &value)); @@ -51,10 +54,13 @@ TEST(WebUIMessageHandlerTest, ExtractDoubleValue) { base::ListValue list; - double value, zero_value = 0.0, neg_value = -1234.5, pos_value = 1234.5; - base::string16 zero_string(base::UTF8ToUTF16("0")); - base::string16 neg_string(base::UTF8ToUTF16("-1234.5")); - base::string16 pos_string(base::UTF8ToUTF16("1234.5")); + double value; + constexpr double zero_value = 0.0; + constexpr double neg_value = -1234.5; + constexpr double pos_value = 1234.5; + static const char zero_string[] = "0"; + static const char neg_string[] = "-1234.5"; + static const char pos_string[] = "1234.5"; list.AppendDouble(zero_value); EXPECT_TRUE(WebUIMessageHandler::ExtractDoubleValue(&list, &value)); @@ -88,19 +94,16 @@ TEST(WebUIMessageHandlerTest, ExtractStringValue) { base::ListValue list; - base::string16 in_string(base::UTF8ToUTF16( - "The facts, though interesting, are irrelevant.")); + static const char in_string[] = + "The facts, though interesting, are irrelevant."; list.AppendString(in_string); base::string16 out_string = WebUIMessageHandler::ExtractStringValue(&list); - EXPECT_EQ(in_string, out_string); + EXPECT_EQ(base::ASCIIToUTF16(in_string), out_string); } class TestWebUIMessageHandler : public WebUIMessageHandler { public: - TestWebUIMessageHandler() - : on_javascript_allowed_calls_(0), on_javascript_disallowed_calls_(0) { - set_web_ui(&test_web_ui_); - } + TestWebUIMessageHandler() { set_web_ui(&test_web_ui_); } ~TestWebUIMessageHandler() override { // The test handler unusually owns its own TestWebUI, so we make sure to @@ -121,8 +124,8 @@ void OnJavascriptAllowed() override { ++on_javascript_allowed_calls_; } void OnJavascriptDisallowed() override { ++on_javascript_disallowed_calls_; } - int on_javascript_allowed_calls_; - int on_javascript_disallowed_calls_; + int on_javascript_allowed_calls_ = 0; + int on_javascript_disallowed_calls_ = 0; }; TEST(WebUIMessageHandlerTest, AllowAndDisallowJavascript) {
diff --git a/content/child/child_process.h b/content/child/child_process.h index 0721f11..11c5e200 100644 --- a/content/child/child_process.h +++ b/content/child/child_process.h
@@ -72,13 +72,13 @@ // These are used for ref-counting the child process. The process shuts // itself down when the ref count reaches 0. - // For example, in the renderer process, generally each tab managed by this - // process will hold a reference to the process, and release when closed. - // However for renderer processes specifically, there is also fast shutdown - // code path initiated by the browser process. The process refcount does - // not influence fast shutdown. See blink::Platform::suddenTerminationChanged. - void AddRefProcess(); - void ReleaseProcess(); + // + // This is not used for renderer processes. The browser process is the only + // one responsible for shutting them down. See mojo::KeepAliveHandle and more + // generally the RenderProcessHostImpl class if you want to keep the renderer + // process alive longer. + virtual void AddRefProcess(); + virtual void ReleaseProcess(); // Getter for the one ChildProcess object for this process. Can only be called // on the main thread.
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index e303614d..11fbc82 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -501,6 +501,9 @@ WebRuntimeFeatures::EnablePortals( base::FeatureList::IsEnabled(blink::features::kPortals)); -}; + + if (command_line.HasSwitch(switches::kDisableBackgroundFetch)) + WebRuntimeFeatures::EnableBackgroundFetch(false); +} } // namespace content
diff --git a/content/common/notifications/notification_struct_traits.cc b/content/common/notifications/notification_struct_traits.cc index f51f3786..4877f361 100644 --- a/content/common/notifications/notification_struct_traits.cc +++ b/content/common/notifications/notification_struct_traits.cc
@@ -4,9 +4,6 @@ #include "content/common/notifications/notification_struct_traits.h" -#include "base/feature_list.h" -#include "content/public/common/content_features.h" - namespace { // Maximum number of entries in a vibration pattern. @@ -38,11 +35,6 @@ blink::mojom::NotificationData::kMaximumDeveloperDataSize; } -bool ValidateImage(const SkBitmap& image) { - return image.drawsNothing() || - base::FeatureList::IsEnabled(features::kNotificationContentImage); -} - } // namespace namespace mojo { @@ -184,11 +176,8 @@ content::NotificationResources>:: Read(blink::mojom::NotificationResourcesDataView in, content::NotificationResources* out) { - if (!in.ReadImage(&out->image) || !in.ReadIcon(&out->notification_icon) || - !in.ReadBadge(&out->badge) || !in.ReadActionIcons(&out->action_icons)) { - return false; - } - return ValidateImage(out->image); + return in.ReadImage(&out->image) && in.ReadIcon(&out->notification_icon) && + in.ReadBadge(&out->badge) && in.ReadActionIcons(&out->action_icons); } } // namespace mojo
diff --git a/content/common/notifications/notification_struct_traits_unittest.cc b/content/common/notifications/notification_struct_traits_unittest.cc index 1ecf6106..aca9fb5 100644 --- a/content/common/notifications/notification_struct_traits_unittest.cc +++ b/content/common/notifications/notification_struct_traits_unittest.cc
@@ -7,9 +7,7 @@ #include "base/macros.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "base/time/time.h" -#include "content/public/common/content_features.h" #include "content/public/common/platform_notification_data.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" @@ -209,21 +207,6 @@ ¬ification_data, &platform_notification_data)); } -// Check round-trip fails if image supplied when kill-switch is active. -TEST(NotificationStructTraitsTest, ContentImageKillSwitch) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - features::kNotificationContentImage); - - NotificationResources resources; - resources.image = CreateBitmap(200, 100, SK_ColorMAGENTA); - - NotificationResources roundtrip_resources; - ASSERT_FALSE( - mojo::test::SerializeAndDeserialize<blink::mojom::NotificationResources>( - &resources, &roundtrip_resources)); -} - TEST(NotificationStructTraitsTest, NotificationResourcesRoundtrip) { NotificationResources resources;
diff --git a/content/common/render_frame_metadata.mojom b/content/common/render_frame_metadata.mojom index 1470abb5..8af7f1a 100644 --- a/content/common/render_frame_metadata.mojom +++ b/content/common/render_frame_metadata.mojom
@@ -48,10 +48,8 @@ // Used to position the Android location top bar and page content, whose // precise position is computed by the renderer compositor. - [EnableIf=is_android] float top_controls_height; - [EnableIf=is_android] float top_controls_shown_ratio; // Used to position Android bottom bar, whose position is computed by the
diff --git a/content/common/render_frame_metadata_struct_traits.cc b/content/common/render_frame_metadata_struct_traits.cc index 302e4cd..68340d3 100644 --- a/content/common/render_frame_metadata_struct_traits.cc +++ b/content/common/render_frame_metadata_struct_traits.cc
@@ -21,9 +21,9 @@ out->is_mobile_optimized = data.is_mobile_optimized(); out->device_scale_factor = data.device_scale_factor(); out->page_scale_factor = data.page_scale_factor(); -#if defined(OS_ANDROID) out->top_controls_height = data.top_controls_height(); out->top_controls_shown_ratio = data.top_controls_shown_ratio(); +#if defined(OS_ANDROID) out->bottom_controls_height = data.bottom_controls_height(); out->bottom_controls_shown_ratio = data.bottom_controls_shown_ratio(); out->min_page_scale_factor = data.min_page_scale_factor();
diff --git a/content/common/render_frame_metadata_struct_traits.h b/content/common/render_frame_metadata_struct_traits.h index 5f76e36..cd317a36 100644 --- a/content/common/render_frame_metadata_struct_traits.h +++ b/content/common/render_frame_metadata_struct_traits.h
@@ -57,7 +57,6 @@ return metadata.page_scale_factor; } -#if defined(OS_ANDROID) static float top_controls_height(const cc::RenderFrameMetadata& metadata) { return metadata.top_controls_height; } @@ -67,6 +66,7 @@ return metadata.top_controls_shown_ratio; } +#if defined(OS_ANDROID) static float bottom_controls_height(const cc::RenderFrameMetadata& metadata) { return metadata.bottom_controls_height; }
diff --git a/content/common/service_worker/embedded_worker.mojom b/content/common/service_worker/embedded_worker.mojom index fbecf410..adb7fbb 100644 --- a/content/common/service_worker/embedded_worker.mojom +++ b/content/common/service_worker/embedded_worker.mojom
@@ -120,12 +120,13 @@ // S13nServiceWorker: // Called when the worker requests to be terminated. The worker will request // to be terminated when it realizes it has been idle for some time. The - // request may be ignored, for example when there are inflight events issued - // just before RequestTermination(). Note that the browser can terminate the - // worker at any time even if RequestTermination() is not called. For example, - // if the worker thread is continuously busy and the browser's periodic ping - // message has been missed, the browser will terminate the service worker. - RequestTermination(); + // browser doesn't terminate the worker when there are inflight events or + // DevTools is attached, and in that case the callback will be called with + // false. Note that the browser can terminate the worker at any time even if + // RequestTermination() is not called. For example, if the worker thread is + // continuously busy and the browser's periodic ping message has been missed, + // the browser will terminate the service worker. + RequestTermination() => (bool will_be_terminated); // Tells the browser process that this service worker used |feature|, for // UseCounter purposes. The browser process propagates the feature usage bit
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h index 99f262fc..a7f686f 100644 --- a/content/common/service_worker/service_worker_types.h +++ b/content/common/service_worker/service_worker_types.h
@@ -121,30 +121,6 @@ bool is_history_navigation = false; }; -class ChangedVersionAttributesMask { - public: - enum { - INSTALLING_VERSION = 1 << 0, - WAITING_VERSION = 1 << 1, - ACTIVE_VERSION = 1 << 2, - CONTROLLING_VERSION = 1 << 3, - }; - - ChangedVersionAttributesMask() : changed_(0) {} - explicit ChangedVersionAttributesMask(int changed) : changed_(changed) {} - - int changed() const { return changed_; } - - void add(int changed_versions) { changed_ |= changed_versions; } - bool installing_changed() const { return !!(changed_ & INSTALLING_VERSION); } - bool waiting_changed() const { return !!(changed_ & WAITING_VERSION); } - bool active_changed() const { return !!(changed_ & ACTIVE_VERSION); } - bool controller_changed() const { return !!(changed_ & CONTROLLING_VERSION); } - - private: - int changed_; -}; - } // namespace content #endif // CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_TYPES_H_
diff --git a/content/common/shared_worker/shared_worker_factory.mojom b/content/common/shared_worker/shared_worker_factory.mojom index 488e822..8014029a 100644 --- a/content/common/shared_worker/shared_worker_factory.mojom +++ b/content/common/shared_worker/shared_worker_factory.mojom
@@ -4,6 +4,7 @@ module content.mojom; +import "content/common/service_worker/controller_service_worker.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"; @@ -14,6 +15,7 @@ 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/mojom/shared_worker/shared_worker_main_script_load_params.mojom"; import "third_party/blink/public/web/worker_content_settings_proxy.mojom"; // The name of the InterfaceProviderSpec in service manifests used by the @@ -49,12 +51,13 @@ // is disabled or AppCache doesn't serve resources for this shared worker. int32 appcache_host_id, - // S13nServiceWorker: + // S13nServiceWorker (non-NetworkService): // 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. + // This is only non-null when S13nServiceWorker is enabled but + // NetworkService 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 @@ -64,6 +67,11 @@ // worker execution contexts. associated network.mojom.URLLoaderFactory? main_script_loader_factory, + // NetworkService (PlzWorker): + // Used for passing a main script pre-requested by the browser process and + // its redirect information. + blink.mojom.SharedWorkerMainScriptLoadParams? main_script_load_params, + // NetworkService: // When the Network Service is enabled, |subresource_loader_factories| // may also be provided a means for the shared worker to load @@ -72,6 +80,14 @@ // loader factory can't load. URLLoaderFactoryBundle? subresource_loader_factories, + // NetworkService (PlzWorker): + // Used for setting ServiceWorkerContainer#controller. This is null when + // NetworkService is disabled or there're no controller service worker. + // + // In S13nServiceWorker, the controller is sent via + // ServiceWorkerContainer.SetController(). + ControllerServiceWorkerInfo? controller_info, + SharedWorkerHost host, SharedWorker& shared_worker, service_manager.mojom.InterfaceProvider interface_provider);
diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc index cf3b6df7..0ceb731 100644 --- a/content/common/user_agent.cc +++ b/content/common/user_agent.cc
@@ -66,30 +66,7 @@ } #elif defined(OS_ANDROID) std::string android_version_str = base::SysInfo::OperatingSystemVersion(); - - std::string android_info_str; - - // Send information about the device. - bool semicolon_inserted = false; - std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename(); - std::string android_device_name = base::SysInfo::HardwareModelName(); - if ("REL" == android_build_codename && android_device_name.size() > 0) { - android_info_str += "; " + android_device_name; - semicolon_inserted = true; - } - - // Append the build ID. - if (base::FeatureList::IsEnabled(kAndroidUserAgentStringContainsBuildId) || - include_android_build_number) { - std::string android_build_id = base::SysInfo::GetAndroidBuildID(); - if (android_build_id.size() > 0) { - if (!semicolon_inserted) { - android_info_str += ";"; - } - android_info_str += " Build/" + android_build_id; - } - } - + std::string android_info_str = GetAndroidOSInfo(include_android_build_number); #elif (defined(OS_POSIX) && !defined(OS_MACOSX)) || defined(OS_FUCHSIA) // Should work on any Posix system. struct utsname unixinfo; @@ -164,14 +141,40 @@ std::string BuildUserAgentFromProductAndExtraOSInfo( const std::string& product, const std::string& extra_os_info, - const bool include_android_build_number) { + bool include_android_build_number) { std::string os_info; base::StringAppendF(&os_info, "%s%s%s", getUserAgentPlatform().c_str(), BuildOSCpuInfo(include_android_build_number).c_str(), extra_os_info.c_str()); return BuildUserAgentFromOSAndProduct(os_info, product); } -#endif + +std::string GetAndroidOSInfo(bool include_android_build_number) { + std::string android_info_str; + + // Send information about the device. + bool semicolon_inserted = false; + std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename(); + std::string android_device_name = base::SysInfo::HardwareModelName(); + if (!android_device_name.empty() && "REL" == android_build_codename) { + android_info_str += "; " + android_device_name; + semicolon_inserted = true; + } + + // Append the build ID. + if (base::FeatureList::IsEnabled(kAndroidUserAgentStringContainsBuildId) || + include_android_build_number) { + std::string android_build_id = base::SysInfo::GetAndroidBuildID(); + if (!android_build_id.empty()) { + if (!semicolon_inserted) + android_info_str += ";"; + android_info_str += " Build/" + android_build_id; + } + } + + return android_info_str; +} +#endif // defined(OS_ANDROID) std::string BuildUserAgentFromOSAndProduct(const std::string& os_info, const std::string& product) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayCore.java b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayCore.java index 0446d9d..d94d15e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayCore.java +++ b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayCore.java
@@ -101,13 +101,23 @@ mHost = null; } - private void copyRectToLayoutParams(final Rect rect) { + /** + * Updates the most recent position/size for the dialog window. Returns false if |rect| already + * matches the current params. + */ + private boolean copyRectToLayoutParams(final Rect rect) { + if (mLayoutParams.x == rect.x && mLayoutParams.y == rect.y + && mLayoutParams.width == rect.width && mLayoutParams.height == rect.height) { + return false; + } + // TODO(liberato): adjust for CompositorView screen location here if we want to support // non-full screen use cases. mLayoutParams.x = rect.x; mLayoutParams.y = rect.y; mLayoutParams.width = rect.width; mLayoutParams.height = rect.height; + return true; } /** @@ -117,7 +127,10 @@ public void layoutSurface(final Rect rect) { if (mDialog == null || mLayoutParams.token == null) return; - copyRectToLayoutParams(rect); + // Note that it is important to not update the attributes if updating the layout params was + // a no-op because it results in unnecessary re-layouts for the window. + if (!copyRectToLayoutParams(rect)) return; + mDialog.getWindow().setAttributes(mLayoutParams); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/remoteobjects/RemoteObjectRegistry.java b/content/public/android/java/src/org/chromium/content/browser/remoteobjects/RemoteObjectRegistry.java index d01a2fa1..4ddbf9f 100644 --- a/content/public/android/java/src/org/chromium/content/browser/remoteobjects/RemoteObjectRegistry.java +++ b/content/public/android/java/src/org/chromium/content/browser/remoteobjects/RemoteObjectRegistry.java
@@ -18,7 +18,7 @@ private final Set<? super RemoteObjectRegistry> mRetainingSet; private final Map<Integer, Object> mObjectsById = new HashMap<>(); private final Map<Object, Integer> mIdsByObject = new HashMap<>(); - private int mNextId = 0; + private int mNextId; RemoteObjectRegistry(Set<? super RemoteObjectRegistry> retainingSet) { retainingSet.add(this);
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionEventProxyImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionEventProxyImpl.java index 1c2c89b..e1bc1e3 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionEventProxyImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionEventProxyImpl.java
@@ -33,7 +33,7 @@ private static Method sSelectionModifiedSelectionMethod; private static Method sSelectionActionMethod; private static Method sSelectionActionClassificationMethod; - private static boolean sReflectionFailed = false; + private static boolean sReflectionFailed; public static SelectionEventProxyImpl create() { if (sReflectionFailed) return null;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index f39237e..da52e15 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -98,7 +98,7 @@ // A flag to determine if we should get readback view from WindowAndroid. // The readback view could be the ContainerView, which WindowAndroid has no control on that. // Embedders should set this properly to use the correct view for readback. - private static boolean sShouldGetReadbackViewFromWindowAndroid = false; + private static boolean sShouldGetReadbackViewFromWindowAndroid; private static final class UserDataFactoryLazyHolder { private static final UserDataFactory<SelectionPopupControllerImpl> INSTANCE =
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java index 317f5761..7d8b82f 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java
@@ -41,6 +41,7 @@ boolean mIsRendererInitiated; boolean mShouldReplaceCurrentEntry; long mIntentReceivedTimestamp; + long mInputStartTimestamp; boolean mHasUserGesture; boolean mShouldClearHistoryList; @@ -454,6 +455,21 @@ } /** + * @param inputStartTimestamp the timestamp of the event in the location bar that triggered + * this URL load, as returned by System.currentMillis. + */ + public void setInputStartTimestamp(long inputStartTimestamp) { + mInputStartTimestamp = inputStartTimestamp; + } + + /** + * @return The timestamp of the event in the location bar that triggered this URL load. + */ + public long getInputStartTimestamp() { + return mInputStartTimestamp; + } + + /** * Set whether the load is initiated by a user gesture. * * @param hasUserGesture True if load is initiated by user gesture, or false otherwise.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java index a128865..d1c0b8ac 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java
@@ -82,7 +82,7 @@ // Start the Helper service. class HelperConnection implements ServiceConnection { - Messenger mMessenger = null; + Messenger mMessenger; @Override public void onServiceConnected(ComponentName name, IBinder service) {
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeActivityTestRule.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeActivityTestRule.java index 7996bee..f2778332c 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeActivityTestRule.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeActivityTestRule.java
@@ -27,7 +27,7 @@ public class JavaBridgeActivityTestRule extends ContentShellActivityTestRule implements SetUpTestRule<JavaBridgeActivityTestRule> { private TestCallbackHelperContainer mTestCallbackHelperContainer; - private boolean mSetup = false; + private boolean mSetup; public static class Controller { private static final int RESULT_WAIT_TIME = 5000;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/PopupZoomerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/PopupZoomerTest.java index 236dcd8b..1f25156 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/PopupZoomerTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/PopupZoomerTest.java
@@ -41,7 +41,7 @@ private static class CustomCanvasPopupZoomer extends PopupZoomer { Canvas mCanvas; - long mPendingDraws = 0; + long mPendingDraws; CustomCanvasPopupZoomer(Context context, ViewGroup containerView, Canvas c) { super(context, containerView, null, null);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java b/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java index 031fef0..dcac4b6 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java
@@ -81,8 +81,8 @@ public long surfaceKey; } - private boolean mHasReceivedOverlayModeChange = false; - private boolean mUseOverlayMode = false; + private boolean mHasReceivedOverlayModeChange; + private boolean mUseOverlayMode; private ArrayBlockingQueue<Event> mPending;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/remoteobjects/RemoteObjectHostImplTest.java b/content/public/android/javatests/src/org/chromium/content/browser/remoteobjects/RemoteObjectHostImplTest.java index 1e21ace..f641f1b 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/remoteobjects/RemoteObjectHostImplTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/remoteobjects/RemoteObjectHostImplTest.java
@@ -52,7 +52,7 @@ * {@link ConnectionErrorHandler} that records any error it received. */ private static class CapturingErrorHandler implements ConnectionErrorHandler { - private MojoException mLastMojoException = null; + private MojoException mLastMojoException; /** * @see ConnectionErrorHandler#onConnectionError(MojoException) @@ -93,7 +93,7 @@ * This verifies that it is working correctly. */ private static class HasMethodCapture implements RemoteObject.HasMethodResponse { - public Boolean methodExists = null; + public Boolean methodExists; @Override public void call(Boolean result) {
diff --git a/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java b/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java index 0104fa79b..a97ba04e 100644 --- a/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java
@@ -5,6 +5,7 @@ package org.chromium.content.browser.androidoverlay; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -73,6 +74,7 @@ private SurfaceHolder.Callback2 mCallback; private WindowManager.LayoutParams mLayoutParams; + public boolean mDidUpdateParams; @Implementation public void takeSurface(SurfaceHolder.Callback2 callback) { @@ -82,6 +84,7 @@ @Implementation public void setAttributes(WindowManager.LayoutParams layoutParams) { mLayoutParams = layoutParams; + mDidUpdateParams = true; } } @@ -145,6 +148,10 @@ return ((MyPhoneWindowShadow) Shadows.shadowOf(mDialog.getWindow())).mLayoutParams; } + MyPhoneWindowShadow getShadowWindow() { + return ((MyPhoneWindowShadow) Shadows.shadowOf(mDialog.getWindow())); + } + /** * Host impl that counts calls to it. */ @@ -337,4 +344,17 @@ mCore.onWindowToken(mWindowToken); assertEquals(layoutParams().type, WindowManager.LayoutParams.TYPE_APPLICATION_PANEL); } + + @Test + @Config(shadows = {MyPhoneWindowShadow.class}) + public void testNoParamsUpdateForSamePositionRect() { + createOverlay(); + mCore.onWindowToken(mWindowToken); + assertTrue(getShadowWindow().mDidUpdateParams); + + // Update with the same rect, it should not update the window params. + getShadowWindow().mDidUpdateParams = false; + mCore.layoutSurface(mConfig.rect); + assertFalse(getShadowWindow().mDidUpdateParams); + } }
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json index c2e72da4..1f3224a0 100644 --- a/content/public/app/mojo/content_browser_manifest.json +++ b/content/public/app/mojo/content_browser_manifest.json
@@ -1,6 +1,7 @@ { "name": "content_browser", "display_name": "Content (browser process)", + "options": { "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { "provides": { @@ -126,8 +127,7 @@ "service_manager": [ "service_manager:client_process", "service_manager:instance_name", - "service_manager:service_manager", - "service_manager:user_id" + "service_manager:service_manager" ], "shape_detection": [ "barcode_detection",
diff --git a/content/public/app/mojo/content_packaged_services_manifest.json b/content/public/app/mojo/content_packaged_services_manifest.json index eee8e3b..dbe8aed 100644 --- a/content/public/app/mojo/content_packaged_services_manifest.json +++ b/content/public/app/mojo/content_packaged_services_manifest.json
@@ -9,7 +9,8 @@ "name": "content_packaged_services", "display_name": "Content Packaged Services", "options" : { - "instance_sharing" : "singleton" + "instance_sharing" : "singleton", + "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { @@ -22,8 +23,7 @@ "*": [ "app" ], "content_browser": [], "service_manager": [ - "service_manager:client_process", - "service_manager:user_id" + "service_manager:client_process" ] } }
diff --git a/content/public/browser/background_fetch_delegate.h b/content/public/browser/background_fetch_delegate.h index bff9eb6..2d283a8d 100644 --- a/content/public/browser/background_fetch_delegate.h +++ b/content/public/browser/background_fetch_delegate.h
@@ -16,6 +16,7 @@ #include "base/optional.h" #include "content/common/content_export.h" #include "content/public/browser/resource_request_info.h" +#include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h" #include "third_party/skia/include/core/SkBitmap.h" class GURL; @@ -38,16 +39,6 @@ struct BackgroundFetchResult; struct BackgroundFetchDescription; -// Various reasons a Background Fetch can get aborted. -enum class BackgroundFetchReasonToAbort { - NONE, - CANCELLED_FROM_UI, - ABORTED_BY_DEVELOPER, - TOTAL_DOWNLOAD_SIZE_EXCEEDED, - SERVICE_WORKER_UNAVAILABLE, - QUOTA_EXCEEDED, -}; - // Interface for launching background fetches. Implementing classes would // generally interface with the DownloadService or DownloadManager. // Must only be used on the UI thread and generally expected to be called by the @@ -67,7 +58,7 @@ // e.g. because the user clicked cancel on a notification. virtual void OnJobCancelled( const std::string& job_unique_id, - BackgroundFetchReasonToAbort reason_to_abort) = 0; + blink::mojom::BackgroundFetchFailureReason reason_to_abort) = 0; // Called after the download has started with the initial response // (including headers and URL chain). Always called on the UI thread.
diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc index fc977559..84007d7 100644 --- a/content/public/browser/gpu_utils.cc +++ b/content/public/browser/gpu_utils.cc
@@ -96,6 +96,9 @@ gpu_preferences.disable_oop_rasterization = command_line->HasSwitch(switches::kDisableOopRasterization); + gpu_preferences.enable_oop_rasterization_ddl = + command_line->HasSwitch(switches::kEnableOopRasterizationDDL); + gpu_preferences.enable_vulkan = command_line->HasSwitch(switches::kEnableVulkan);
diff --git a/content/public/browser/navigation_controller.h b/content/public/browser/navigation_controller.h index 03d9b48..a520adf 100644 --- a/content/public/browser/navigation_controller.h +++ b/content/public/browser/navigation_controller.h
@@ -197,6 +197,11 @@ // ContentBrowserClient::GetNavigationUIData. std::unique_ptr<NavigationUIData> navigation_ui_data; + // Time at which the input leading to this navigation occurred. This field + // is set for links clicked by the user; the embedder is recommended to set + // it for navigations it initiates. + base::TimeTicks input_start; + explicit LoadURLParams(const GURL& url); ~LoadURLParams();
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index 9d5eb00..c7cf40ef 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -260,6 +260,9 @@ return false; } +void WebContentsDelegate::SetTopControlsGestureScrollInProgress( + bool in_progress) {} + gfx::Size WebContentsDelegate::EnterPictureInPicture(const viz::SurfaceId&, const gfx::Size&) { return gfx::Size();
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index f7e72b3..0de00703 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -551,6 +551,9 @@ const url::Origin& origin, const GURL& resource_url); + virtual void SetTopControlsShownRatio(WebContents* web_contents, + float ratio) {} + // Requests to get browser controls info such as the height of the top/bottom // controls, and whether they will shrink the Blink's view size. // Note that they are not complete in the sense that there is no API to tell @@ -560,6 +563,11 @@ virtual int GetBottomControlsHeight() const; virtual bool DoBrowserControlsShrinkBlinkSize() const; + // Propagates to the browser that gesture scrolling has changed state. This is + // used by the browser to assist in controlling the behavior of sliding the + // top controls as a result of page gesture scrolling while in tablet mode. + virtual void SetTopControlsGestureScrollInProgress(bool in_progress); + // Give WebContentsDelegates the opportunity to adjust the previews state. virtual void AdjustPreviewsStateForNavigation( content::WebContents* web_contents,
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h index 64de36a..a077821 100644 --- a/content/public/common/common_param_traits_macros.h +++ b/content/public/common/common_param_traits_macros.h
@@ -303,9 +303,6 @@ IPC_STRUCT_TRAITS_MEMBER(subpixel_rendering) IPC_STRUCT_TRAITS_MEMBER(use_subpixel_positioning) IPC_STRUCT_TRAITS_MEMBER(focus_ring_color) - IPC_STRUCT_TRAITS_MEMBER(thumb_active_color) - IPC_STRUCT_TRAITS_MEMBER(thumb_inactive_color) - IPC_STRUCT_TRAITS_MEMBER(track_color) IPC_STRUCT_TRAITS_MEMBER(active_selection_bg_color) IPC_STRUCT_TRAITS_MEMBER(active_selection_fg_color) IPC_STRUCT_TRAITS_MEMBER(inactive_selection_bg_color)
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 30b0661..8c1a929 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -367,7 +367,7 @@ // Loading Dispatcher v0 support with ResourceLoadScheduler (crbug.com/729954). const base::Feature kResourceLoadScheduler{"ResourceLoadScheduler", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Run video capture service in the Browser process as opposed to a dedicated // utility process @@ -441,8 +441,8 @@ // synthetic wheel event in a pinch sequence, then send the rest of the // synthetic wheel events of the pinch sequence as non-blocking if the first // event’s ACK is not canceled. -const base::Feature kTouchpadAsyncPinchEvents{ - "TouchpadAsyncPinchEvents", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kTouchpadAsyncPinchEvents{"TouchpadAsyncPinchEvents", + base::FEATURE_ENABLED_BY_DEFAULT}; // An experimental simple user-activation model where the user gesture state is // tracked through a frame-based state instead of the gesture tokens we use @@ -466,13 +466,6 @@ const base::Feature kV8VmFuture{"V8VmFuture", base::FEATURE_DISABLED_BY_DEFAULT}; -// Controls the decode acceleration of JPEG images (as opposed to camera -// captures) in Chrome OS using the VA-API. -// TODO(andrescj): remove or enable by default in Chrome OS once -// https://crbug.com/868400 is resolved. -const base::Feature kVaapiJpegImageDecodeAcceleration{ - "VaapiJpegImageDecodeAcceleration", base::FEATURE_DISABLED_BY_DEFAULT}; - // Enable WebAssembly structured cloning. // http://webassembly.org/ const base::Feature kWebAssembly{"WebAssembly",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 764b0685..4662679 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -110,7 +110,6 @@ CONTENT_EXPORT extern const base::Feature kV8LowMemoryModeForSubframes; CONTENT_EXPORT extern const base::Feature kV8Orinoco; CONTENT_EXPORT extern const base::Feature kV8VmFuture; -CONTENT_EXPORT extern const base::Feature kVaapiJpegImageDecodeAcceleration; CONTENT_EXPORT extern const base::Feature kWebAssembly; CONTENT_EXPORT extern const base::Feature kWebAssemblyStreaming; CONTENT_EXPORT extern const base::Feature kWebAssemblyBaseline;
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 049f139..7305f9e2 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -81,6 +81,9 @@ const char kDisableBackgroundingOccludedWindowsForTesting[] = "disable-backgrounding-occluded-windows"; +// Disable Background Fetch. +const char kDisableBackgroundFetch[] = "disable-background-fetch"; + // Disable task throttling of timer tasks from background pages. const char kDisableBackgroundTimerThrottling[] = "disable-background-timer-throttling"; @@ -478,6 +481,9 @@ // would have been used. Enables the chromium_raster_transport extension. const char kEnableOopRasterization[] = "enable-oop-rasterization"; +// Turns on skia deferred display list for out of process raster. +const char kEnableOopRasterizationDDL[] = "enable-oop-rasterization-ddl"; + // The number of multisample antialiasing samples for GPU rasterization. // Requires MSAA support on GPU to have an effect. 0 disables MSAA. const char kGpuRasterizationMSAASampleCount[] =
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 081af901e..a0eddb4 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -37,6 +37,7 @@ extern const char kDisableBackingStoreLimit[]; CONTENT_EXPORT extern const char kDisableBackgroundingOccludedWindowsForTesting[]; +CONTENT_EXPORT extern const char kDisableBackgroundFetch[]; CONTENT_EXPORT extern const char kDisableBackgroundTimerThrottling[]; CONTENT_EXPORT extern const char kDisableBlinkFeatures[]; CONTENT_EXPORT extern const char kDisableCompositorUkmForTests[]; @@ -151,6 +152,7 @@ CONTENT_EXPORT extern const char kForceGpuRasterization[]; CONTENT_EXPORT extern const char kDisableOopRasterization[]; CONTENT_EXPORT extern const char kEnableOopRasterization[]; +CONTENT_EXPORT extern const char kEnableOopRasterizationDDL[]; CONTENT_EXPORT extern const char kForceOverlayFullscreenVideo[]; CONTENT_EXPORT extern const char kForcePresentationReceiverForTesting[]; CONTENT_EXPORT extern const char kForceRendererAccessibility[];
diff --git a/content/public/common/renderer_preferences.cc b/content/public/common/renderer_preferences.cc index 2f5c823d..58ec6b4 100644 --- a/content/public/common/renderer_preferences.cc +++ b/content/public/common/renderer_preferences.cc
@@ -19,9 +19,6 @@ subpixel_rendering(gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE), use_subpixel_positioning(false), focus_ring_color(SkColorSetARGB(255, 229, 151, 0)), - thumb_active_color(SkColorSetRGB(244, 244, 244)), - thumb_inactive_color(SkColorSetRGB(234, 234, 234)), - track_color(SkColorSetRGB(211, 211, 211)), active_selection_bg_color(SkColorSetRGB(30, 144, 255)), active_selection_fg_color(SK_ColorWHITE), inactive_selection_bg_color(SkColorSetRGB(200, 200, 200)),
diff --git a/content/public/common/renderer_preferences.h b/content/public/common/renderer_preferences.h index fa8c2cd..87ade6e 100644 --- a/content/public/common/renderer_preferences.h +++ b/content/public/common/renderer_preferences.h
@@ -63,12 +63,6 @@ // The color of the focus ring. Currently only used on Linux. SkColor focus_ring_color; - // The color of different parts of the scrollbar. Currently only used on - // Linux. - SkColor thumb_active_color; - SkColor thumb_inactive_color; - SkColor track_color; - // The colors used in selection text. Currently only used on Linux and Ash. SkColor active_selection_bg_color; SkColor active_selection_fg_color;
diff --git a/content/public/common/user_agent.h b/content/public/common/user_agent.h index fbd7f9f..651fcbd0 100644 --- a/content/public/common/user_agent.h +++ b/content/public/common/user_agent.h
@@ -34,7 +34,10 @@ CONTENT_EXPORT std::string BuildUserAgentFromProductAndExtraOSInfo( const std::string& product, const std::string& extra_os_info, - const bool include_android_build_number); + bool include_android_build_number); + +// Helper function to generate just the OS info. +CONTENT_EXPORT std::string GetAndroidOSInfo(bool include_android_build_number); #endif // Builds a full user agent string given a string describing the OS and a
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc index 84f90fa..4e50a9ab 100644 --- a/content/public/renderer/content_renderer_client.cc +++ b/content/public/renderer/content_renderer_client.cc
@@ -170,10 +170,6 @@ return false; } -bool ContentRendererClient::AllowPepperMediaStreamAPI(const GURL& url) { - return false; -} - void ContentRendererClient::AddSupportedKeySystems( std::vector<std::unique_ptr<media::KeySystemProperties>>* key_systems) {}
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index f1c9cc59..3e48084 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h
@@ -272,9 +272,6 @@ // language. virtual bool IsOriginIsolatedPepperPlugin(const base::FilePath& plugin_path); - // Returns true if the page at |url| can use Pepper MediaStream APIs. - virtual bool AllowPepperMediaStreamAPI(const GURL& url); - // Allows an embedder to provide a MediaStreamRendererFactory. virtual std::unique_ptr<MediaStreamRendererFactory> CreateMediaStreamRendererFactory();
diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h index 21f3b48..4e5b9c8 100644 --- a/content/public/renderer/render_view.h +++ b/content/public/renderer/render_view.h
@@ -106,7 +106,7 @@ // Returns |renderer_preferences_.accept_languages| value. virtual const std::string& GetAcceptLanguages() const = 0; -#if defined(OS_ANDROID) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) virtual void UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate) = 0;
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 2ab3d95..26bce7ad 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -532,7 +532,6 @@ "render_thread_impl.h", "render_view_impl.cc", "render_view_impl.h", - "render_view_impl_android.cc", "render_view_linux.cc", "render_view_win.cc", "render_widget.cc", @@ -845,20 +844,12 @@ if (enable_plugins) { sources += [ - "media/pepper/pepper_to_video_track_adapter.cc", - "media/pepper/pepper_to_video_track_adapter.h", - "media/pepper/video_track_to_pepper_adapter.cc", - "media/pepper/video_track_to_pepper_adapter.h", "pepper/pepper_media_stream_audio_track_host.cc", "pepper/pepper_media_stream_audio_track_host.h", "pepper/pepper_media_stream_track_host_base.cc", "pepper/pepper_media_stream_track_host_base.h", "pepper/pepper_media_stream_video_track_host.cc", "pepper/pepper_media_stream_video_track_host.h", - "pepper/pepper_video_destination_host.cc", - "pepper/pepper_video_destination_host.h", - "pepper/pepper_video_source_host.cc", - "pepper/pepper_video_source_host.h", ] }
diff --git a/content/renderer/gpu/layer_tree_view.cc b/content/renderer/gpu/layer_tree_view.cc index 3d13eef4..728c43f2 100644 --- a/content/renderer/gpu/layer_tree_view.cc +++ b/content/renderer/gpu/layer_tree_view.cc
@@ -171,10 +171,11 @@ } if (!is_threaded) { // Single-threaded layout tests, and unit tests. - layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); - } else { layer_tree_host_ = - cc::LayerTreeHost::CreateThreaded(compositor_thread_, ¶ms); + cc::LayerTreeHost::CreateSingleThreaded(this, std::move(params)); + } else { + layer_tree_host_ = cc::LayerTreeHost::CreateThreaded(compositor_thread_, + std::move(params)); } } @@ -496,8 +497,8 @@ layer_tree_host_->Composite(base::TimeTicks::Now(), raster); } -void LayerTreeView::SetDeferCommits(bool defer_commits) { - layer_tree_host_->SetDeferCommits(defer_commits); +std::unique_ptr<cc::ScopedDeferCommits> LayerTreeView::DeferCommits() { + return layer_tree_host_->DeferCommits(); } int LayerTreeView::LayerTreeId() const {
diff --git a/content/renderer/gpu/layer_tree_view.h b/content/renderer/gpu/layer_tree_view.h index 09dbf80..67caa40 100644 --- a/content/renderer/gpu/layer_tree_view.h +++ b/content/renderer/gpu/layer_tree_view.h
@@ -40,6 +40,7 @@ class RenderFrameMetadataObserver; class TaskGraphRunner; class UkmRecorderFactory; +class ScopedDeferCommits; } // namespace cc namespace gfx { @@ -138,7 +139,7 @@ base::OnceCallback<void(const SkBitmap&)> callback) override; void SynchronouslyCompositeNoRasterForTesting() override; void CompositeWithRasterForTesting() override; - void SetDeferCommits(bool defer_commits) override; + std::unique_ptr<cc::ScopedDeferCommits> DeferCommits() override; void RegisterViewportLayers(const ViewportLayers& viewport_layers) override; void ClearViewportLayers() override; void RegisterSelection(const cc::LayerSelection& selection) override;
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc index 88dd2318..5e28af5 100644 --- a/content/renderer/loader/resource_dispatcher.cc +++ b/content/renderer/loader/resource_dispatcher.cc
@@ -735,10 +735,23 @@ request_id, this, loading_task_runner, true /* bypass_redirect_checks */); - DCHECK(continue_navigation_function); - *continue_navigation_function = - base::BindOnce(&ResourceDispatcher::ContinueForNavigation, - weak_factory_.GetWeakPtr(), request_id); + if (request->resource_type == RESOURCE_TYPE_SHARED_WORKER) { + // For shared workers, immediately post a task for continuing loading + // because shared workers don't have the concept of the navigation commit + // and |continue_navigation_function| is never called. + // TODO(nhiroki): Unify this case with the navigation case for code + // health. + loading_task_runner->PostTask( + FROM_HERE, base::BindOnce(&ResourceDispatcher::ContinueForNavigation, + weak_factory_.GetWeakPtr(), request_id)); + } else { + // For navigations, |continue_navigation_function| is called after the + // navigation commit. + DCHECK(continue_navigation_function); + *continue_navigation_function = + base::BindOnce(&ResourceDispatcher::ContinueForNavigation, + weak_factory_.GetWeakPtr(), request_id); + } return request_id; }
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc index c5d16f3..615fca5c 100644 --- a/content/renderer/loader/web_url_loader_impl.cc +++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -24,7 +24,6 @@ #include "base/time/time.h" #include "build/build_config.h" #include "content/child/child_thread_impl.h" -#include "content/child/scoped_child_process_reference.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/content_features.h" @@ -102,18 +101,6 @@ using HeadersVector = network::HttpRawRequestResponseInfo::HeadersVector; -class KeepAliveHandleWithChildProcessReference { - public: - explicit KeepAliveHandleWithChildProcessReference( - mojom::KeepAliveHandlePtr ptr) - : keep_alive_handle_(std::move(ptr)) {} - ~KeepAliveHandleWithChildProcessReference() {} - - private: - mojom::KeepAliveHandlePtr keep_alive_handle_; - ScopedChildProcessReference reference_; -}; - // TODO(estark): Figure out a way for the embedder to provide the // security style for a resource. Ideally, the logic for assigning // per-resource security styles should live in the same place as the @@ -463,7 +450,7 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner_; std::unique_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; std::unique_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_; - std::unique_ptr<KeepAliveHandleWithChildProcessReference> keep_alive_handle_; + mojom::KeepAliveHandlePtr keep_alive_handle_; enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA}; DeferState defers_loading_; int request_id_; @@ -542,11 +529,7 @@ resource_dispatcher_(resource_dispatcher), task_runner_handle_(std::move(task_runner_handle)), task_runner_(task_runner_handle_->GetTaskRunner()), - keep_alive_handle_( - keep_alive_handle_ptr - ? std::make_unique<KeepAliveHandleWithChildProcessReference>( - std::move(keep_alive_handle_ptr)) - : nullptr), + keep_alive_handle_(std::move(keep_alive_handle_ptr)), defers_loading_(NOT_DEFERRING), request_id_(-1), url_loader_factory_(std::move(url_loader_factory)) { @@ -737,8 +720,6 @@ // an implementation of a URLLoaderClient to get the response body. if (response_override) { DCHECK(!sync_load_response); - DCHECK_NE(network::mojom::RequestContextFrameType::kNone, - request.GetFrameType()); } RequestExtraData empty_extra_data;
diff --git a/content/renderer/media/pepper/pepper_to_video_track_adapter.cc b/content/renderer/media/pepper/pepper_to_video_track_adapter.cc deleted file mode 100644 index d768c29..0000000 --- a/content/renderer/media/pepper/pepper_to_video_track_adapter.cc +++ /dev/null
@@ -1,250 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/pepper/pepper_to_video_track_adapter.h" - -#include <string> - -#include "base/base64.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/rand_util.h" -#include "base/single_thread_task_runner.h" -#include "base/strings/utf_string_conversions.h" -#include "base/trace_event/trace_event.h" -#include "content/renderer/media/stream/media_stream_registry_interface.h" -#include "content/renderer/media/stream/media_stream_video_source.h" -#include "content/renderer/media/stream/media_stream_video_track.h" -#include "content/renderer/pepper/ppb_image_data_impl.h" -#include "content/renderer/render_thread_impl.h" -#include "media/base/video_frame_pool.h" -#include "media/capture/video_capture_types.h" -#include "third_party/blink/public/platform/web_media_stream_track.h" -#include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/public/web/web_media_stream_registry.h" -#include "third_party/libyuv/include/libyuv/convert.h" -#include "url/gurl.h" - -namespace content { - -// PpFrameWriter implements MediaStreamVideoSource and can therefore provide -// video frames to MediaStreamVideoTracks. It also implements -// FrameWriterInterface, which will be used by Pepper plugins (notably the -// Effects plugin) to inject the processed frame. -class PpFrameWriter : public MediaStreamVideoSource, - public FrameWriterInterface, - public base::SupportsWeakPtr<PpFrameWriter> { - public: - PpFrameWriter(); - ~PpFrameWriter() override; - - // FrameWriterInterface implementation. - // This method will be called by the Pepper host from render thread. - void PutFrame(PPB_ImageData_Impl* image_data, int64_t time_stamp_ns) override; - - protected: - // MediaStreamVideoSource implementation. - void StartSourceImpl( - const VideoCaptureDeliverFrameCB& frame_callback) override; - void StopSourceImpl() override; - - private: - media::VideoFramePool frame_pool_; - - class FrameWriterDelegate; - scoped_refptr<FrameWriterDelegate> delegate_; - - DISALLOW_COPY_AND_ASSIGN(PpFrameWriter); -}; - -class PpFrameWriter::FrameWriterDelegate - : public base::RefCountedThreadSafe<FrameWriterDelegate> { - public: - FrameWriterDelegate( - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const VideoCaptureDeliverFrameCB& new_frame_callback); - - void DeliverFrame(const scoped_refptr<media::VideoFrame>& frame); - private: - friend class base::RefCountedThreadSafe<FrameWriterDelegate>; - virtual ~FrameWriterDelegate(); - - void DeliverFrameOnIO(const scoped_refptr<media::VideoFrame>& frame); - - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - VideoCaptureDeliverFrameCB new_frame_callback_; -}; - -PpFrameWriter::FrameWriterDelegate::FrameWriterDelegate( - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const VideoCaptureDeliverFrameCB& new_frame_callback) - : io_task_runner_(io_task_runner), new_frame_callback_(new_frame_callback) { -} - -PpFrameWriter::FrameWriterDelegate::~FrameWriterDelegate() { -} - -void PpFrameWriter::FrameWriterDelegate::DeliverFrame( - const scoped_refptr<media::VideoFrame>& frame) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&FrameWriterDelegate::DeliverFrameOnIO, this, frame)); -} - -void PpFrameWriter::FrameWriterDelegate::DeliverFrameOnIO( - const scoped_refptr<media::VideoFrame>& frame) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - // The local time when this frame is generated is unknown so give a null - // value to |estimated_capture_time|. - new_frame_callback_.Run(frame, base::TimeTicks()); -} - -PpFrameWriter::PpFrameWriter() { - DVLOG(3) << "PpFrameWriter ctor"; -} - -PpFrameWriter::~PpFrameWriter() { - DVLOG(3) << "PpFrameWriter dtor"; -} - -void PpFrameWriter::StartSourceImpl( - const VideoCaptureDeliverFrameCB& frame_callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!delegate_.get()); - DVLOG(3) << "PpFrameWriter::StartSourceImpl()"; - delegate_ = new FrameWriterDelegate(io_task_runner(), frame_callback); - OnStartDone(MEDIA_DEVICE_OK); -} - -void PpFrameWriter::StopSourceImpl() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -} - -// Note: PutFrame must copy or process image_data directly in this function, -// because it may be overwritten as soon as we return from this function. -void PpFrameWriter::PutFrame(PPB_ImageData_Impl* image_data, - int64_t time_stamp_ns) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - TRACE_EVENT0("media", "PpFrameWriter::PutFrame"); - DVLOG(3) << "PpFrameWriter::PutFrame()"; - - if (!image_data) { - LOG(ERROR) << "PpFrameWriter::PutFrame - Called with NULL image_data."; - return; - } - ImageDataAutoMapper mapper(image_data); - if (!mapper.is_valid()) { - LOG(ERROR) << "PpFrameWriter::PutFrame - " - << "The image could not be mapped and is unusable."; - return; - } - SkBitmap bitmap(image_data->GetMappedBitmap()); - if (bitmap.empty()) { - LOG(ERROR) << "PpFrameWriter::PutFrame - " - << "The image_data's mapped bitmap failed."; - return; - } - - const uint8_t* src_data = static_cast<uint8_t*>(bitmap.getPixels()); - const int src_stride = static_cast<int>(bitmap.rowBytes()); - const int width = bitmap.width(); - const int height = bitmap.height(); - - // We only support PP_IMAGEDATAFORMAT_BGRA_PREMUL at the moment. - DCHECK(image_data->format() == PP_IMAGEDATAFORMAT_BGRA_PREMUL); - - const gfx::Size frame_size(width, height); - - if (state() != MediaStreamVideoSource::STARTED) - return; - - const base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( - time_stamp_ns / base::Time::kNanosecondsPerMicrosecond); - - scoped_refptr<media::VideoFrame> new_frame = - frame_pool_.CreateFrame(media::PIXEL_FORMAT_I420, frame_size, - gfx::Rect(frame_size), frame_size, timestamp); - - libyuv::ARGBToI420(src_data, - src_stride, - new_frame->data(media::VideoFrame::kYPlane), - new_frame->stride(media::VideoFrame::kYPlane), - new_frame->data(media::VideoFrame::kUPlane), - new_frame->stride(media::VideoFrame::kUPlane), - new_frame->data(media::VideoFrame::kVPlane), - new_frame->stride(media::VideoFrame::kVPlane), - width, - height); - - delegate_->DeliverFrame(new_frame); -} - -// PpFrameWriterProxy is a helper class to make sure the user won't use -// PpFrameWriter after it is released (IOW its owner - WebMediaStreamSource - -// is released). -class PpFrameWriterProxy : public FrameWriterInterface { - public: - explicit PpFrameWriterProxy(const base::WeakPtr<PpFrameWriter>& writer) - : writer_(writer) { - DCHECK(writer_); - } - - ~PpFrameWriterProxy() override {} - - void PutFrame(PPB_ImageData_Impl* image_data, - int64_t time_stamp_ns) override { - writer_->PutFrame(image_data, time_stamp_ns); - } - - private: - base::WeakPtr<PpFrameWriter> writer_; - - DISALLOW_COPY_AND_ASSIGN(PpFrameWriterProxy); -}; - -bool PepperToVideoTrackAdapter::Open(MediaStreamRegistryInterface* registry, - const std::string& url, - FrameWriterInterface** frame_writer) { - DVLOG(3) << "PepperToVideoTrackAdapter::Open"; - blink::WebMediaStream stream; - if (registry) { - stream = registry->GetMediaStream(url); - } else { - stream = - blink::WebMediaStreamRegistry::LookupMediaStreamDescriptor(GURL(url)); - } - if (stream.IsNull()) { - LOG(ERROR) << "PepperToVideoTrackAdapter::Open - invalid url: " << url; - return false; - } - - // Create a new native video track and add it to |stream|. - std::string track_id; - // According to spec, a media stream source's id should be unique per - // application. There's no easy way to strictly achieve that. The id - // generated with this method should be unique for most of the cases but - // theoretically it's possible we can get an id that's duplicated with the - // existing sources. - base::Base64Encode(base::RandBytesAsString(64), &track_id); - - PpFrameWriter* writer = new PpFrameWriter(); - - // Create a new webkit video track. - blink::WebMediaStreamSource webkit_source; - blink::WebMediaStreamSource::Type type = - blink::WebMediaStreamSource::kTypeVideo; - blink::WebString webkit_track_id = blink::WebString::FromUTF8(track_id); - webkit_source.Initialize(webkit_track_id, type, webkit_track_id, - false /* remote */); - webkit_source.SetExtraData(writer); - - bool track_enabled = true; - stream.AddTrack(MediaStreamVideoTrack::CreateVideoTrack( - writer, MediaStreamVideoSource::ConstraintsCallback(), track_enabled)); - - *frame_writer = new PpFrameWriterProxy(writer->AsWeakPtr()); - return true; -} - -} // namespace content
diff --git a/content/renderer/media/pepper/pepper_to_video_track_adapter.h b/content/renderer/media/pepper/pepper_to_video_track_adapter.h deleted file mode 100644 index 618fc41..0000000 --- a/content/renderer/media/pepper/pepper_to_video_track_adapter.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_PEPPER_PEPPER_TO_VIDEO_TRACK_ADAPTER_H_ -#define CONTENT_RENDERER_MEDIA_PEPPER_PEPPER_TO_VIDEO_TRACK_ADAPTER_H_ - -#include <stdint.h> - -#include <string> -#include <vector> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "content/common/content_export.h" - -namespace content { - -class MediaStreamRegistryInterface; -class PPB_ImageData_Impl; - -// Interface used by a Pepper plugin to output frames to a video track. -class CONTENT_EXPORT FrameWriterInterface { - public: - // The ownership of the |image_data| doesn't transfer. So the implementation - // of this interface should make a copy of the |image_data| before return. - virtual void PutFrame(PPB_ImageData_Impl* image_data, - int64_t time_stamp_ns) = 0; - virtual ~FrameWriterInterface() {} -}; - -// PepperToVideoTrackAdapter is a glue class between the content MediaStream and -// the effects pepper plugin host. -class CONTENT_EXPORT PepperToVideoTrackAdapter { - public: - // Instantiates and adds a new video track to the MediaStream specified by - // |url|. Returns a handler for delivering frames to the new video track as - // |frame_writer|. - // If |registry| is NULL the global blink::WebMediaStreamRegistry will be - // used to look up the media stream. - // The caller of the function takes the ownership of |frame_writer|. - // Returns true on success and false on failure. - static bool Open(MediaStreamRegistryInterface* registry, - const std::string& url, - FrameWriterInterface** frame_writer); - - private: - DISALLOW_COPY_AND_ASSIGN(PepperToVideoTrackAdapter); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_PEPPER_PEPPER_TO_VIDEO_TRACK_ADAPTER_H_
diff --git a/content/renderer/media/pepper/pepper_to_video_track_adapter_unittest.cc b/content/renderer/media/pepper/pepper_to_video_track_adapter_unittest.cc deleted file mode 100644 index ce350d3..0000000 --- a/content/renderer/media/pepper/pepper_to_video_track_adapter_unittest.cc +++ /dev/null
@@ -1,111 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "base/run_loop.h" -#include "content/child/child_process.h" -#include "content/public/test/mock_render_thread.h" -#include "content/renderer/media/pepper/pepper_to_video_track_adapter.h" -#include "content/renderer/media/stream/media_stream_video_track.h" -#include "content/renderer/media/stream/mock_media_stream_registry.h" -#include "content/renderer/media/stream/mock_media_stream_video_sink.h" -#include "content/renderer/pepper/pepper_plugin_instance_impl.h" -#include "content/renderer/pepper/ppb_image_data_impl.h" -#include "content/test/ppapi_unittest.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/web_media_stream_track.h" -#include "third_party/blink/public/platform/web_string.h" -#include "third_party/blink/public/web/web_heap.h" - -using ::testing::_; - -namespace content { - -ACTION_P(RunClosure, closure) { - closure.Run(); -} - -static const std::string kTestStreamUrl = "stream_url"; -static const std::string kUnknownStreamUrl = "unknown_stream_url"; - -class PepperToVideoTrackAdapterTest : public PpapiUnittest { - public: - PepperToVideoTrackAdapterTest() : registry_(new MockMediaStreamRegistry()) { - registry_->Init(kTestStreamUrl); - } - - void TearDown() override { - registry_.reset(); - blink::WebHeap::CollectAllGarbageForTesting(); - PpapiUnittest::TearDown(); - } - - protected: - // A ChildProcess is needed to fool the Tracks and Sources into believing they - // are on the right threads. The ScopedTaskEnvironment provided by - // PpapiUnittest prevents the ChildProcess from leaking a TaskScheduler. - const ChildProcess child_process_; - const MockRenderThread render_thread_; - std::unique_ptr<MockMediaStreamRegistry> registry_; -}; - -TEST_F(PepperToVideoTrackAdapterTest, Open) { - // |frame_writer| is a proxy and is owned by whoever call Open. - FrameWriterInterface* frame_writer = nullptr; - // Unknow url will return false. - EXPECT_FALSE(PepperToVideoTrackAdapter::Open(registry_.get(), - kUnknownStreamUrl, &frame_writer)); - EXPECT_TRUE(PepperToVideoTrackAdapter::Open(registry_.get(), - kTestStreamUrl, &frame_writer)); - delete frame_writer; -} - -TEST_F(PepperToVideoTrackAdapterTest, PutFrame) { - FrameWriterInterface* frame_writer = nullptr; - EXPECT_TRUE(PepperToVideoTrackAdapter::Open(registry_.get(), - kTestStreamUrl, &frame_writer)); - ASSERT_TRUE(frame_writer); - - // Verify the video track has been added. - const blink::WebMediaStream test_stream = registry_->test_stream(); - blink::WebVector<blink::WebMediaStreamTrack> video_tracks = - test_stream.VideoTracks(); - ASSERT_EQ(1u, video_tracks.size()); - - // Verify the native video track has been added. - MediaStreamVideoTrack* native_track = - MediaStreamVideoTrack::GetVideoTrack(video_tracks[0]); - ASSERT_TRUE(native_track != nullptr); - - MockMediaStreamVideoSink sink; - native_track->AddSink(&sink, sink.GetDeliverFrameCB(), false); - scoped_refptr<PPB_ImageData_Impl> image(new PPB_ImageData_Impl( - instance()->pp_instance(), PPB_ImageData_Impl::ForTest())); - image->Init(PP_IMAGEDATAFORMAT_BGRA_PREMUL, 640, 360, true); - { - base::RunLoop run_loop; - base::Closure quit_closure = run_loop.QuitClosure(); - - EXPECT_CALL(sink, OnVideoFrame()) - .WillOnce(RunClosure(std::move(quit_closure))); - frame_writer->PutFrame(image.get(), 10); - run_loop.Run(); - // Run all pending tasks to let the the test clean up before the test ends. - // This is due to that - // FrameWriterDelegate::FrameWriterDelegate::DeliverFrame use - // PostTaskAndReply to the IO thread and expects the reply to process - // on the main render thread to clean up its resources. However, the - // QuitClosure above ends before that. - base::RunLoop().RunUntilIdle(); - } - EXPECT_EQ(1, sink.number_of_frames()); - native_track->RemoveSink(&sink); - - // The |frame_writer| is a proxy and is owned by whoever call Open. - delete frame_writer; -} - -} // namespace content
diff --git a/content/renderer/media/pepper/video_track_to_pepper_adapter.cc b/content/renderer/media/pepper/video_track_to_pepper_adapter.cc deleted file mode 100644 index a87b792..0000000 --- a/content/renderer/media/pepper/video_track_to_pepper_adapter.cc +++ /dev/null
@@ -1,140 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/pepper/video_track_to_pepper_adapter.h" - -#include <string> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "base/synchronization/lock.h" -#include "base/trace_event/trace_event.h" -#include "content/public/renderer/media_stream_video_sink.h" -#include "content/renderer/media/stream/media_stream_registry_interface.h" -#include "media/base/bind_to_current_loop.h" -#include "media/capture/video_capture_types.h" -#include "third_party/blink/public/platform/web_media_stream.h" -#include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/public/web/web_media_stream_registry.h" -#include "url/gurl.h" - -namespace content { - -// PpFrameReceiver implements MediaStreamVideoSink so that it can be attached -// to video track to receive captured frames. -// It can be attached to a FrameReaderInterface to output the received frame. -class PpFrameReceiver : public MediaStreamVideoSink { - public: - PpFrameReceiver(blink::WebMediaStreamTrack track) - : track_(track), reader_(nullptr), weak_factory_(this) {} - - ~PpFrameReceiver() override {} - - void SetReader(FrameReaderInterface* reader) { - DCHECK((reader_ && !reader) || (!reader_ && reader)) - << " |reader| = " << reader << ", |reader_| = " << reader_; - if (reader) { - MediaStreamVideoSink::ConnectToTrack( - track_, - media::BindToCurrentLoop(base::Bind(&PpFrameReceiver::OnVideoFrame, - weak_factory_.GetWeakPtr())), - false); - } else { - MediaStreamVideoSink::DisconnectFromTrack(); - weak_factory_.InvalidateWeakPtrs(); - } - reader_ = reader; - } - - void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, - base::TimeTicks estimated_capture_time) { - TRACE_EVENT0("media", "PpFrameReceiver::OnVideoFrame"); - if (reader_) - reader_->GotFrame(frame); - } - - private: - const blink::WebMediaStreamTrack track_; - FrameReaderInterface* reader_; - base::WeakPtrFactory<PpFrameReceiver> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(PpFrameReceiver); -}; - -VideoTrackToPepperAdapter::VideoTrackToPepperAdapter( - MediaStreamRegistryInterface* registry) - : registry_(registry) {} - -VideoTrackToPepperAdapter::~VideoTrackToPepperAdapter() { - for (const auto& reader_and_receiver : reader_to_receiver_) - delete reader_and_receiver.second; -} - -bool VideoTrackToPepperAdapter::Open(const std::string& url, - FrameReaderInterface* reader) { - DCHECK(thread_checker_.CalledOnValidThread()); - const blink::WebMediaStreamTrack& track = GetFirstVideoTrack(url); - if (track.IsNull()) - return false; - reader_to_receiver_[reader] = new SourceInfo(track, reader); - return true; -} - -bool VideoTrackToPepperAdapter::Close(FrameReaderInterface* reader) { - DCHECK(thread_checker_. CalledOnValidThread()); - SourceInfoMap::iterator it = reader_to_receiver_.find(reader); - if (it == reader_to_receiver_.end()) - return false; - delete it->second; - reader_to_receiver_.erase(it); - return true; -} - -blink::WebMediaStreamTrack VideoTrackToPepperAdapter::GetFirstVideoTrack( - const std::string& url) { - DCHECK(thread_checker_.CalledOnValidThread()); - const blink::WebMediaStream stream = - registry_ ? registry_->GetMediaStream(url) - : blink::WebMediaStreamRegistry::LookupMediaStreamDescriptor( - GURL(url)); - - if (stream.IsNull()) { - LOG(ERROR) << "GetFirstVideoSource - invalid url: " << url; - return blink::WebMediaStreamTrack(); - } - - // Get the first video track from the stream. - blink::WebVector<blink::WebMediaStreamTrack> video_tracks = - stream.VideoTracks(); - if (video_tracks.IsEmpty()) { - LOG(ERROR) << "GetFirstVideoSource - no video tracks. url: " << url; - return blink::WebMediaStreamTrack(); - } - - return video_tracks[0]; -} - -void VideoTrackToPepperAdapter::DeliverFrameForTesting( - FrameReaderInterface* reader, - const scoped_refptr<media::VideoFrame>& frame) { - SourceInfoMap::const_iterator it = reader_to_receiver_.find(reader); - if (it == reader_to_receiver_.end()) - return; - PpFrameReceiver* receiver = it->second->receiver_.get(); - receiver->OnVideoFrame(frame, base::TimeTicks()); -} - -VideoTrackToPepperAdapter::SourceInfo::SourceInfo( - const blink::WebMediaStreamTrack& blink_track, - FrameReaderInterface* reader) - : receiver_(new PpFrameReceiver(blink_track)) { - receiver_->SetReader(reader); -} - -VideoTrackToPepperAdapter::SourceInfo::~SourceInfo() { - receiver_->SetReader(nullptr); -} - -} // namespace content
diff --git a/content/renderer/media/pepper/video_track_to_pepper_adapter.h b/content/renderer/media/pepper/video_track_to_pepper_adapter.h deleted file mode 100644 index 732ec622..0000000 --- a/content/renderer/media/pepper/video_track_to_pepper_adapter.h +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_VIDEO_VIDEO_TRACK_TO_PEPPER_ADAPTER_H_ -#define CONTENT_RENDERER_MEDIA_VIDEO_VIDEO_TRACK_TO_PEPPER_ADAPTER_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/threading/thread_checker.h" -#include "content/common/content_export.h" -#include "media/base/video_frame.h" -#include "third_party/blink/public/platform/web_media_stream_track.h" - -namespace content { - -class MediaStreamRegistryInterface; -class PpFrameReceiver; - -// Interface used by a Pepper plugin to get captured frames from a video track. -class CONTENT_EXPORT FrameReaderInterface { - public: - // Got a new captured frame. - virtual void GotFrame(const scoped_refptr<media::VideoFrame>& frame) = 0; - - protected: - virtual ~FrameReaderInterface() {} -}; - -// VideoTrackToPepperAdapter is a glue class between MediaStreamVideoTrack and a -// Pepper plugin host. -class CONTENT_EXPORT VideoTrackToPepperAdapter { - public: - // |registry| is used to look up the media stream by url. If a NULL |registry| - // is given, the global blink::WebMediaStreamRegistry will be used. - explicit VideoTrackToPepperAdapter(MediaStreamRegistryInterface* registry); - virtual ~VideoTrackToPepperAdapter(); - // Connects to the first video track in the MediaStream specified by |url| and - // the received frames will be delivered via |reader|. - // Returns true on success and false on failure. - bool Open(const std::string& url, FrameReaderInterface* reader); - // Closes |reader|'s connection with the video track, i.e. stops receiving - // frames from the video track. - // Returns true on success and false on failure. - bool Close(FrameReaderInterface* reader); - - private: - friend class VideoTrackToPepperAdapterTest; - - struct SourceInfo { - SourceInfo(const blink::WebMediaStreamTrack& blink_track, - FrameReaderInterface* reader); - ~SourceInfo(); - - std::unique_ptr<PpFrameReceiver> receiver_; - }; - - typedef std::map<FrameReaderInterface*, SourceInfo*> SourceInfoMap; - - blink::WebMediaStreamTrack GetFirstVideoTrack(const std::string& url); - - // Deliver VideoFrame to the MediaStreamVideoSink associated with - // |reader|. For testing only. - void DeliverFrameForTesting(FrameReaderInterface* reader, - const scoped_refptr<media::VideoFrame>& frame); - - MediaStreamRegistryInterface* const registry_; - SourceInfoMap reader_to_receiver_; - - base::ThreadChecker thread_checker_; - - DISALLOW_COPY_AND_ASSIGN(VideoTrackToPepperAdapter); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_VIDEO_VIDEO_TRACK_TO_PEPPER_ADAPTER_H_
diff --git a/content/renderer/media/pepper/video_track_to_pepper_adapter_unittest.cc b/content/renderer/media/pepper/video_track_to_pepper_adapter_unittest.cc deleted file mode 100644 index 2edaed60..0000000 --- a/content/renderer/media/pepper/video_track_to_pepper_adapter_unittest.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <string> - -#include "base/test/scoped_task_environment.h" -#include "content/child/child_process.h" -#include "content/renderer/media/pepper/video_track_to_pepper_adapter.h" -#include "content/renderer/media/stream/mock_media_stream_registry.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/web/web_heap.h" - -namespace content { - -static const std::string kTestStreamUrl = "stream_url"; -static const std::string kTestVideoTrackId = "video_track_id"; -static const std::string kUnknownStreamUrl = "unknown_stream_url"; - -class VideoTrackToPepperAdapterTest : public ::testing::Test, - public FrameReaderInterface { - public: - VideoTrackToPepperAdapterTest() : registry_(new MockMediaStreamRegistry()) { - handler_.reset(new VideoTrackToPepperAdapter(registry_.get())); - registry_->Init(kTestStreamUrl); - registry_->AddVideoTrack(kTestVideoTrackId); - EXPECT_FALSE(handler_->GetFirstVideoTrack(kTestStreamUrl).IsNull()); - } - - MOCK_METHOD1(GotFrame, void(const scoped_refptr<media::VideoFrame>&)); - - void TearDown() override { - registry_.reset(); - handler_.reset(); - blink::WebHeap::CollectAllGarbageForTesting(); - } - - void DeliverFrameForTesting(const scoped_refptr<media::VideoFrame>& frame) { - handler_->DeliverFrameForTesting(this, frame); - } - - protected: - // A ChildProcess is needed to fool the Tracks and Sources below into - // believing they are on the right threads. A ScopedTaskEnvironment must be - // instantiated before ChildProcess to prevent it from leaking a - // TaskScheduler. - const base::test::ScopedTaskEnvironment scoped_task_environment_; - const ChildProcess child_process_; - std::unique_ptr<VideoTrackToPepperAdapter> handler_; - std::unique_ptr<MockMediaStreamRegistry> registry_; -}; - -// Open |handler_| and send a VideoFrame to be received at the other side. -TEST_F(VideoTrackToPepperAdapterTest, OpenClose) { - // Unknow url will return false. - EXPECT_FALSE(handler_->Open(kUnknownStreamUrl, this)); - EXPECT_TRUE(handler_->Open(kTestStreamUrl, this)); - - const base::TimeDelta ts = base::TimeDelta::FromMilliseconds(789012); - const scoped_refptr<media::VideoFrame> captured_frame = - media::VideoFrame::CreateBlackFrame(gfx::Size(640, 360)); - captured_frame->set_timestamp(ts); - - EXPECT_CALL(*this, GotFrame(captured_frame)); - DeliverFrameForTesting(captured_frame); - - EXPECT_FALSE(handler_->Close(nullptr)); - EXPECT_TRUE(handler_->Close(this)); -} - -TEST_F(VideoTrackToPepperAdapterTest, OpenWithoutClose) { - EXPECT_TRUE(handler_->Open(kTestStreamUrl, this)); -} - -} // namespace content
diff --git a/content/renderer/media/stream/apply_constraints_processor.cc b/content/renderer/media/stream/apply_constraints_processor.cc index 874d3bd9..9d791cb6 100644 --- a/content/renderer/media/stream/apply_constraints_processor.cc +++ b/content/renderer/media/stream/apply_constraints_processor.cc
@@ -256,8 +256,6 @@ DCHECK(video_source_->GetCurrentCaptureParams()); VideoDeviceCaptureCapabilities video_capabilities; - video_capabilities.power_line_capabilities.push_back( - video_source_->GetCurrentCaptureParams()->power_line_frequency); video_capabilities.noise_reduction_capabilities.push_back( GetCurrentVideoTrack()->noise_reduction()); video_capabilities.device_capabilities.push_back(
diff --git a/content/renderer/media/stream/media_stream_constraints_util.h b/content/renderer/media/stream/media_stream_constraints_util.h index fd2267d..1e73420 100644 --- a/content/renderer/media/stream/media_stream_constraints_util.h +++ b/content/renderer/media/stream/media_stream_constraints_util.h
@@ -36,8 +36,8 @@ // The following fields are used to control MediaStreamVideoSource objects: // * device_id: used for device selection and obtained from the deviceId // * capture_params: used to initialize video capture. Its values are obtained -// from the width, height, aspectRatio, frame_rate, googPowerLineFrequency, -// and googNoiseReduction constraints. +// from the width, height, aspectRatio, frame_rate, and googNoiseReduction +// constraints. // The following fields are used to control MediaStreamVideoTrack objects: // * track_adapter_settings: All track objects use a VideoTrackAdapter object // that may perform cropping and frame-rate adjustment. This field contains @@ -104,10 +104,6 @@ DCHECK(HasValue()); return capture_params_.resolution_change_policy; } - media::PowerLineFrequency PowerLineFrequency() const { - DCHECK(HasValue()); - return capture_params_.power_line_frequency; - } // Other accessors. const char* failed_constraint_name() const { return failed_constraint_name_; }
diff --git a/content/renderer/media/stream/media_stream_constraints_util_video_device.cc b/content/renderer/media/stream/media_stream_constraints_util_video_device.cc index d971221..2bc538e 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_video_device.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_video_device.cc
@@ -27,8 +27,8 @@ // Number of default settings to be used as final tie-breaking criteria for // settings that are equally good at satisfying constraints: -// device ID, power-line frequency, noise reduction, resolution and frame rate. -const int kNumDefaultDistanceEntries = 5; +// device ID, noise reduction, resolution and frame rate. +const int kNumDefaultDistanceEntries = 4; // The minimum aspect ratio to be supported by sources. const double kMinSourceAspectRatio = 0.05; @@ -54,21 +54,16 @@ const std::string& group_id, const media::VideoCaptureFormat& format, media::VideoFacingMode facing_mode, - media::PowerLineFrequency power_line_frequency, const base::Optional<bool>& noise_reduction) : device_id_(device_id), group_id_(group_id), format_(format), facing_mode_(facing_mode), - power_line_frequency_(power_line_frequency), noise_reduction_(noise_reduction) {} // These accessor-like methods transform types to what Blink constraint // classes expect. blink::WebString GetFacingMode() const { return ToWebString(facing_mode_); } - long GetPowerLineFrequency() const { - return static_cast<long>(power_line_frequency_); - } blink::WebString GetDeviceId() const { return blink::WebString::FromASCII(device_id_.data()); } @@ -84,9 +79,6 @@ const std::string& device_id() const { return device_id_; } const std::string& group_id() const { return group_id_; } media::VideoFacingMode facing_mode() const { return facing_mode_; } - media::PowerLineFrequency power_line_frequency() const { - return power_line_frequency_; - } const base::Optional<bool>& noise_reduction() const { return noise_reduction_; } @@ -96,7 +88,6 @@ std::string group_id_; media::VideoCaptureFormat format_; media::VideoFacingMode facing_mode_; - media::PowerLineFrequency power_line_frequency_; base::Optional<bool> noise_reduction_; }; @@ -185,7 +176,6 @@ const blink::WebMediaTrackConstraintSet& basic_constraint_set) { media::VideoCaptureParams capture_params; capture_params.requested_format = candidate.format(); - capture_params.power_line_frequency = candidate.power_line_frequency(); auto track_adapter_settings = SelectVideoTrackAdapterSettings( basic_constraint_set, constrained_format.constrained_resolution(), constrained_format.constrained_frame_rate(), @@ -409,32 +399,6 @@ return 0.0; } -// Returns a custom distance function suitable for the googPowerLineFrequency -// constraint, given a |constraint| and a candidate value |source_value|. -// The distance is HUGE_VAL if |source_value| cannot satisfy |constraint|. -// Otherwise, the distance is zero. -double PowerLineFrequencyConstraintSourceDistance( - const blink::LongConstraint& constraint, - media::PowerLineFrequency source_value, - const char** failed_constraint_name) { - bool constraint_has_min = ConstraintHasMin(constraint); - bool constraint_has_max = ConstraintHasMax(constraint); - long constraint_min = constraint_has_min ? ConstraintMin(constraint) : -1L; - long constraint_max = constraint_has_max ? ConstraintMax(constraint) : -1L; - long source_value_long = static_cast<long>(source_value); - - if ((constraint_has_max && source_value_long > constraint_max) || - (constraint_has_min && source_value_long < constraint_min) || - (constraint_has_min && constraint_has_max && - constraint_min > constraint_max)) { - if (failed_constraint_name) - *failed_constraint_name = constraint.GetName(); - return HUGE_VAL; - } - - return 0.0; -} - // Returns a custom distance function suitable for the googNoiseReduction // constraint, given a |constraint| and a candidate value |value|. // The distance is HUGE_VAL if |candidate_value| cannot satisfy |constraint|. @@ -520,9 +484,6 @@ failed_constraint_name) + FormatSourceDistance(candidate.format(), constrained_format, constraint_set, failed_constraint_name) + - PowerLineFrequencyConstraintSourceDistance( - constraint_set.goog_power_line_frequency, - candidate.power_line_frequency(), failed_constraint_name) + NoiseReductionConstraintSourceDistance( constraint_set.goog_noise_reduction, candidate.noise_reduction(), failed_constraint_name); @@ -627,23 +588,6 @@ } // Returns the fitness distance between |value| and |constraint| for the -// googPowerLineFrequency constraint. -// Based on https://w3c.github.io/mediacapture-main/#dfn-fitness-distance. -double PowerLineFrequencyConstraintFitnessDistance( - long value, - const blink::LongConstraint& constraint) { - if (!constraint.HasIdeal()) - return 0.0; - - // This constraint is of type long, but it behaves as an enum. Thus, values - // equal to ideal have fitness 0.0 and any other values have fitness 1.0. - if (value == constraint.Ideal()) - return 0.0; - - return 1.0; -} - -// Returns the fitness distance between |value| and |constraint| for the // googNoiseReduction constraint. // Based on https://w3c.github.io/mediacapture-main/#dfn-fitness-distance. double NoiseReductionConstraintFitnessDistance( @@ -679,9 +623,6 @@ constraint_set.facing_mode); fitness += StringConstraintFitnessDistance(candidate.GetVideoKind(), constraint_set.video_kind); - fitness += PowerLineFrequencyConstraintFitnessDistance( - candidate.GetPowerLineFrequency(), - constraint_set.goog_power_line_frequency); fitness += NoiseReductionConstraintFitnessDistance( candidate.noise_reduction(), constraint_set.goog_noise_reduction); // No need to pass minimum value to compute fitness for range-based @@ -741,14 +682,6 @@ } } - // Prefer default power-line frequency. - double power_line_frequency_distance = - candidate.power_line_frequency() == - media::PowerLineFrequency::FREQUENCY_DEFAULT - ? 0.0 - : HUGE_VAL; - distance_vector->push_back(power_line_frequency_distance); - // Prefer not having a specific noise-reduction value and let the lower-layers // implementation choose a noise-reduction strategy. double noise_reduction_distance = @@ -877,75 +810,63 @@ if (!constrained_format.ApplyConstraintSet(constraints.Basic())) continue; - for (auto& power_line_frequency : capabilities.power_line_capabilities) { - double basic_power_line_frequency_distance = - PowerLineFrequencyConstraintSourceDistance( - constraints.Basic().goog_power_line_frequency, - power_line_frequency, &failed_constraint_name); - if (!std::isfinite(basic_power_line_frequency_distance)) + for (auto& noise_reduction : capabilities.noise_reduction_capabilities) { + double basic_noise_reduction_distance = + NoiseReductionConstraintSourceDistance( + constraints.Basic().goog_noise_reduction, noise_reduction, + &failed_constraint_name); + if (!std::isfinite(basic_noise_reduction_distance)) continue; - for (auto& noise_reduction : - capabilities.noise_reduction_capabilities) { - double basic_noise_reduction_distance = - NoiseReductionConstraintSourceDistance( - constraints.Basic().goog_noise_reduction, noise_reduction, - &failed_constraint_name); - if (!std::isfinite(basic_noise_reduction_distance)) - continue; + // The candidate satisfies the basic constraint set. + double candidate_basic_custom_distance = basic_device_distance + + basic_format_distance + + basic_noise_reduction_distance; + DCHECK(std::isfinite(candidate_basic_custom_distance)); - // The candidate satisfies the basic constraint set. - double candidate_basic_custom_distance = - basic_device_distance + basic_format_distance + - basic_power_line_frequency_distance + - basic_noise_reduction_distance; - DCHECK(std::isfinite(candidate_basic_custom_distance)); + // Temporary vector to save custom distances for advanced constraints. + // Custom distances must be added to the candidate distance vector + // after all the spec-mandated values. + DistanceVector advanced_custom_distance_vector; + Candidate candidate(device->device_id, device->group_id, format, + device->facing_mode, noise_reduction); + DistanceVector candidate_distance_vector; + // First criteria for valid candidates is satisfaction of advanced + // constraint sets. + for (const auto& advanced_set : constraints.Advanced()) { + double custom_distance = CandidateSourceDistance( + candidate, constrained_format, advanced_set, nullptr); + if (!constrained_format.ApplyConstraintSet(advanced_set)) + custom_distance = HUGE_VAL; + advanced_custom_distance_vector.push_back(custom_distance); + double spec_distance = std::isfinite(custom_distance) ? 0 : 1; + candidate_distance_vector.push_back(spec_distance); + } - // Temporary vector to save custom distances for advanced constraints. - // Custom distances must be added to the candidate distance vector - // after all the spec-mandated values. - DistanceVector advanced_custom_distance_vector; - Candidate candidate(device->device_id, device->group_id, format, - device->facing_mode, power_line_frequency, - noise_reduction); - DistanceVector candidate_distance_vector; - // First criteria for valid candidates is satisfaction of advanced - // constraint sets. - for (const auto& advanced_set : constraints.Advanced()) { - double custom_distance = CandidateSourceDistance( - candidate, constrained_format, advanced_set, nullptr); - if (!constrained_format.ApplyConstraintSet(advanced_set)) - custom_distance = HUGE_VAL; - advanced_custom_distance_vector.push_back(custom_distance); - double spec_distance = std::isfinite(custom_distance) ? 0 : 1; - candidate_distance_vector.push_back(spec_distance); - } + // Second criterion is fitness distance. + candidate_distance_vector.push_back(CandidateFitnessDistance( + candidate, constrained_format, constraints.Basic())); - // Second criterion is fitness distance. - candidate_distance_vector.push_back(CandidateFitnessDistance( - candidate, constrained_format, constraints.Basic())); + // Third criteria are custom distances to constraint sets. + candidate_distance_vector.push_back(candidate_basic_custom_distance); + std::copy(advanced_custom_distance_vector.begin(), + advanced_custom_distance_vector.end(), + std::back_inserter(candidate_distance_vector)); - // Third criteria are custom distances to constraint sets. - candidate_distance_vector.push_back(candidate_basic_custom_distance); - std::copy(advanced_custom_distance_vector.begin(), - advanced_custom_distance_vector.end(), - std::back_inserter(candidate_distance_vector)); + // Fourth criteria is native fitness distance. + candidate_distance_vector.push_back(CandidateNativeFitnessDistance( + constrained_format, constraints.Basic())); - // Fourth criteria is native fitness distance. - candidate_distance_vector.push_back(CandidateNativeFitnessDistance( - constrained_format, constraints.Basic())); + // Final criteria are custom distances to default settings. + AppendDistanceFromDefault(candidate, capabilities, default_width, + default_height, default_frame_rate, + &candidate_distance_vector); - // Final criteria are custom distances to default settings. - AppendDistanceFromDefault(candidate, capabilities, default_width, - default_height, default_frame_rate, - &candidate_distance_vector); - - DCHECK_EQ(best_distance.size(), candidate_distance_vector.size()); - if (candidate_distance_vector < best_distance) { - best_distance = candidate_distance_vector; - result = ComputeVideoDeviceCaptureSettings( - candidate, constrained_format, constraints.Basic()); - } + DCHECK_EQ(best_distance.size(), candidate_distance_vector.size()); + if (candidate_distance_vector < best_distance) { + best_distance = candidate_distance_vector; + result = ComputeVideoDeviceCaptureSettings( + candidate, constrained_format, constraints.Basic()); } } }
diff --git a/content/renderer/media/stream/media_stream_constraints_util_video_device.h b/content/renderer/media/stream/media_stream_constraints_util_video_device.h index 5c8c85a..33e3f73 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_video_device.h +++ b/content/renderer/media/stream/media_stream_constraints_util_video_device.h
@@ -45,7 +45,6 @@ // Each field is independent of each other. std::vector<blink::mojom::VideoInputDeviceCapabilitiesPtr> device_capabilities; - std::vector<media::PowerLineFrequency> power_line_capabilities; std::vector<base::Optional<bool>> noise_reduction_capabilities; }; @@ -106,9 +105,9 @@ // ideal value and thus has worse fitness according to step 2, even if C3's // native fitness is better than C1's and C2's. // 5. C1 is better than C2 if its settings are closer to certain default -// settings that include the device ID, power-line frequency, noise -// reduction, resolution, and frame rate, in that order. Note that there is -// no default facing mode or aspect ratio. +// settings that include the device ID, noise reduction, resolution, +// and frame rate, in that order. Note that there is no default facing mode +// or aspect ratio. // This function uses the SelectVideoTrackAdapterSettings function to compute // some track-specific settings. These are available in the returned value via // the track_adapter_settings() accessor. For more details about the algorithm
diff --git a/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc index 8a9a13eb..cb17ff92 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_video_device_unittest.cc
@@ -171,12 +171,6 @@ }; capabilities_.device_capabilities.push_back(std::move(device)); - capabilities_.power_line_capabilities = { - media::PowerLineFrequency::FREQUENCY_DEFAULT, - media::PowerLineFrequency::FREQUENCY_50HZ, - media::PowerLineFrequency::FREQUENCY_60HZ, - }; - capabilities_.noise_reduction_capabilities = { base::Optional<bool>(), base::Optional<bool>(true), base::Optional<bool>(false), @@ -222,8 +216,6 @@ EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); // Should select default settings for other constraints. - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); EXPECT_EQ(base::Optional<bool>(), result.noise_reduction()); } @@ -387,30 +379,6 @@ } TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, - OverconstrainedOnPowerLineFrequency) { - constraint_factory_.Reset(); - constraint_factory_.basic().goog_power_line_frequency.SetExact(123467890); - auto result = SelectSettings(); - EXPECT_FALSE(result.HasValue()); - EXPECT_EQ(constraint_factory_.basic().goog_power_line_frequency.GetName(), - result.failed_constraint_name()); - - constraint_factory_.Reset(); - constraint_factory_.basic().goog_power_line_frequency.SetMin(123467890); - result = SelectSettings(); - EXPECT_FALSE(result.HasValue()); - EXPECT_EQ(constraint_factory_.basic().goog_power_line_frequency.GetName(), - result.failed_constraint_name()); - - constraint_factory_.Reset(); - constraint_factory_.basic().goog_power_line_frequency.SetMax(-1); - result = SelectSettings(); - EXPECT_FALSE(result.HasValue()); - EXPECT_EQ(constraint_factory_.basic().goog_power_line_frequency.GetName(), - result.failed_constraint_name()); -} - -TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, OverconstrainedOnNoiseReduction) { // Simulate a system that does not support noise reduction. // Manually adding device capabilities because VideoDeviceCaptureCapabilities @@ -425,7 +393,6 @@ media::PIXEL_FORMAT_I420), }; capabilities.device_capabilities.push_back(std::move(device)); - capabilities.power_line_capabilities = capabilities_.power_line_capabilities; capabilities.noise_reduction_capabilities = {base::Optional<bool>(false)}; constraint_factory_.Reset(); @@ -447,8 +414,6 @@ EXPECT_TRUE(result.HasValue()); EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().device_id.SetExact( @@ -456,8 +421,6 @@ result = SelectSettings(); EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(*low_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().device_id.SetExact( @@ -465,8 +428,6 @@ result = SelectSettings(); EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -478,8 +439,6 @@ EXPECT_TRUE(result.HasValue()); EXPECT_EQ(default_device_->device_id, result.device_id()); EXPECT_EQ(*default_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().group_id.SetExact( @@ -487,8 +446,6 @@ result = SelectSettings(); EXPECT_EQ(low_res_device_->device_id, result.device_id()); EXPECT_EQ(*low_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().group_id.SetExact( @@ -496,8 +453,6 @@ result = SelectSettings(); EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(*high_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -513,8 +468,6 @@ EXPECT_EQ(media::MEDIA_VIDEO_FACING_ENVIRONMENT, low_res_device_->facing_mode); EXPECT_EQ(*low_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); constraint_factory_.basic().facing_mode.SetExact( @@ -526,8 +479,6 @@ EXPECT_EQ(high_res_device_->device_id, result.device_id()); EXPECT_EQ(media::MEDIA_VIDEO_FACING_USER, high_res_device_->facing_mode); EXPECT_EQ(*high_res_closest_format_, result.Format()); - EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, - result.PowerLineFrequency()); CheckTrackAdapterSettingsEqualsFormat(result); } @@ -549,25 +500,6 @@ CheckTrackAdapterSettingsEqualsFormat(result); } -TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryPowerLineFrequency) { - constraint_factory_.Reset(); - const media::PowerLineFrequency kPowerLineFrequencies[] = { - media::PowerLineFrequency::FREQUENCY_50HZ, - media::PowerLineFrequency::FREQUENCY_60HZ}; - for (auto power_line_frequency : kPowerLineFrequencies) { - constraint_factory_.basic().goog_power_line_frequency.SetExact( - static_cast<long>(power_line_frequency)); - auto result = SelectSettings(); - EXPECT_TRUE(result.HasValue()); - EXPECT_EQ(power_line_frequency, result.PowerLineFrequency()); - // The default device and settings closest to the default should be - // selected. - EXPECT_EQ(default_device_->device_id, result.device_id()); - EXPECT_EQ(*default_closest_format_, result.Format()); - CheckTrackAdapterSettingsEqualsFormat(result); - } -} - TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryNoiseReduction) { constraint_factory_.Reset(); const bool kNoiseReductionValues[] = {true, false}; @@ -2276,39 +2208,6 @@ } TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, - AdvancedContradictoryPowerLineFrequency) { - { - constraint_factory_.Reset(); - blink::WebMediaTrackConstraintSet& advanced1 = - constraint_factory_.AddAdvanced(); - advanced1.width.SetMin(640); - advanced1.height.SetMin(480); - advanced1.goog_power_line_frequency.SetExact(50); - blink::WebMediaTrackConstraintSet& advanced2 = - constraint_factory_.AddAdvanced(); - advanced2.width.SetMin(1920); - advanced2.height.SetMin(1080); - advanced2.goog_power_line_frequency.SetExact(60); - auto result = SelectSettings(); - EXPECT_TRUE(result.HasValue()); - // The second advanced set cannot be satisfied because it contradicts the - // first set. The default device supports the first set and should be - // selected. - EXPECT_EQ(default_device_->device_id, result.device_id()); - EXPECT_LE(640, result.Width()); - EXPECT_LE(480, result.Height()); - EXPECT_EQ(50, static_cast<int>(result.PowerLineFrequency())); - EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width); - EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height); - EXPECT_EQ(640.0 / result.Height(), - result.track_adapter_settings().min_aspect_ratio); - EXPECT_EQ(result.Width() / 480.0, - result.track_adapter_settings().max_aspect_ratio); - CheckTrackAdapterSettingsEqualsFrameRate(result); - } -} - -TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedContradictoryAspectRatioWidth) { { constraint_factory_.Reset();
diff --git a/content/renderer/media/stream/processed_local_audio_source.cc b/content/renderer/media/stream/processed_local_audio_source.cc index 1418fe6..8f486c3 100644 --- a/content/renderer/media/stream/processed_local_audio_source.cc +++ b/content/renderer/media/stream/processed_local_audio_source.cc
@@ -334,13 +334,6 @@ audio_processor_proxy_->SetControls(controls); } -// TODO(https://crbug.com/879243): Is this needed when doing audio processing in -// the audio service? -media::AudioParameters ProcessedLocalAudioSource::GetInputFormat() const { - return audio_processor_ ? audio_processor_->InputFormat() - : media::AudioParameters(); -} - void ProcessedLocalAudioSource::SetOutputDeviceForAec( const std::string& output_device_id) { DVLOG(1) << "ProcessedLocalAudioSource::SetOutputDeviceForAec()";
diff --git a/content/renderer/media/stream/processed_local_audio_source.h b/content/renderer/media/stream/processed_local_audio_source.h index 9cbaa29..5876c69 100644 --- a/content/renderer/media/stream/processed_local_audio_source.h +++ b/content/renderer/media/stream/processed_local_audio_source.h
@@ -91,11 +91,6 @@ int Volume() const; int MaxVolume() const; - // Audio parameters utilized by the source of the audio capturer. - // TODO(phoglund): Think over the implications of this accessor and if we can - // remove it. - media::AudioParameters GetInputFormat() const; - void SetOutputDeviceForAec(const std::string& output_device_id); protected:
diff --git a/content/renderer/media/stream/user_media_client_impl.cc b/content/renderer/media/stream/user_media_client_impl.cc index 56cc103..738a84c 100644 --- a/content/renderer/media/stream/user_media_client_impl.cc +++ b/content/renderer/media/stream/user_media_client_impl.cc
@@ -194,6 +194,10 @@ MaybeProcessNextRequestInfo(); } +bool UserMediaClientImpl::IsCapturing() { + return user_media_processor_->HasActiveSources(); +} + void UserMediaClientImpl::MaybeProcessNextRequestInfo() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (is_processing_request_ || pending_request_infos_.empty())
diff --git a/content/renderer/media/stream/user_media_client_impl.h b/content/renderer/media/stream/user_media_client_impl.h index b87767c..1882252d 100644 --- a/content/renderer/media/stream/user_media_client_impl.h +++ b/content/renderer/media/stream/user_media_client_impl.h
@@ -59,6 +59,7 @@ void ApplyConstraints( const blink::WebApplyConstraintsRequest& web_request) override; void StopTrack(const blink::WebMediaStreamTrack& web_track) override; + bool IsCapturing() override; // RenderFrameObserver override void WillCommitProvisionalLoad() override;
diff --git a/content/renderer/media/stream/user_media_client_impl_unittest.cc b/content/renderer/media/stream/user_media_client_impl_unittest.cc index 703ea98..f2f1955 100644 --- a/content/renderer/media/stream/user_media_client_impl_unittest.cc +++ b/content/renderer/media/stream/user_media_client_impl_unittest.cc
@@ -884,8 +884,6 @@ MediaStreamVideoSource::kDefaultFrameRate); EXPECT_EQ(video_capture_settings.ResolutionChangePolicy(), media::ResolutionChangePolicy::FIXED_RESOLUTION); - EXPECT_EQ(video_capture_settings.PowerLineFrequency(), - media::PowerLineFrequency::FREQUENCY_DEFAULT); EXPECT_FALSE(video_capture_settings.noise_reduction()); EXPECT_FALSE(video_capture_settings.min_frame_rate().has_value()); @@ -945,8 +943,6 @@ EXPECT_EQ(video_capture_settings.FrameRate(), kDefaultScreenCastFrameRate); EXPECT_EQ(video_capture_settings.ResolutionChangePolicy(), media::ResolutionChangePolicy::FIXED_RESOLUTION); - EXPECT_EQ(video_capture_settings.PowerLineFrequency(), - media::PowerLineFrequency::FREQUENCY_DEFAULT); EXPECT_FALSE(video_capture_settings.noise_reduction()); EXPECT_FALSE(video_capture_settings.min_frame_rate().has_value()); EXPECT_FALSE(video_capture_settings.max_frame_rate().has_value()); @@ -1006,8 +1002,6 @@ EXPECT_EQ(video_capture_settings.FrameRate(), kDefaultScreenCastFrameRate); EXPECT_EQ(video_capture_settings.ResolutionChangePolicy(), media::ResolutionChangePolicy::ANY_WITHIN_LIMIT); - EXPECT_EQ(video_capture_settings.PowerLineFrequency(), - media::PowerLineFrequency::FREQUENCY_DEFAULT); EXPECT_FALSE(video_capture_settings.noise_reduction()); EXPECT_FALSE(video_capture_settings.min_frame_rate().has_value()); EXPECT_FALSE(video_capture_settings.max_frame_rate().has_value()); @@ -1339,4 +1333,19 @@ EXPECT_FALSE(source->device().matched_output_device_id); } +TEST_F(UserMediaClientImplTest, IsCapturing) { + EXPECT_FALSE(user_media_client_impl_->IsCapturing()); + EXPECT_CALL(mock_dispatcher_host_, OnStreamStarted(_)); + blink::WebMediaStream stream = RequestLocalMediaStream(); + EXPECT_TRUE(user_media_client_impl_->IsCapturing()); + + user_media_client_impl_->StopTrack(stream.AudioTracks()[0]); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(user_media_client_impl_->IsCapturing()); + + user_media_client_impl_->StopTrack(stream.VideoTracks()[0]); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(user_media_client_impl_->IsCapturing()); +} + } // namespace content
diff --git a/content/renderer/media/stream/user_media_processor.cc b/content/renderer/media/stream/user_media_processor.cc index 150e73c..36d2961a 100644 --- a/content/renderer/media/stream/user_media_processor.cc +++ b/content/renderer/media/stream/user_media_processor.cc
@@ -609,10 +609,6 @@ VideoDeviceCaptureCapabilities capabilities; capabilities.device_capabilities = std::move(video_input_capabilities); - capabilities.power_line_capabilities = { - media::PowerLineFrequency::FREQUENCY_DEFAULT, - media::PowerLineFrequency::FREQUENCY_50HZ, - media::PowerLineFrequency::FREQUENCY_60HZ}; capabilities.noise_reduction_capabilities = {base::Optional<bool>(), base::Optional<bool>(true), base::Optional<bool>(false)}; @@ -1376,6 +1372,10 @@ source_impl->StopSource(); } +bool UserMediaProcessor::HasActiveSources() const { + return !local_sources_.empty(); +} + const mojom::MediaStreamDispatcherHostPtr& UserMediaProcessor::GetMediaStreamDispatcherHost() { if (!dispatcher_host_) {
diff --git a/content/renderer/media/stream/user_media_processor.h b/content/renderer/media/stream/user_media_processor.h index 6b9e18f8..f323c31 100644 --- a/content/renderer/media/stream/user_media_processor.h +++ b/content/renderer/media/stream/user_media_processor.h
@@ -105,6 +105,8 @@ return media_stream_device_observer_.get(); } + bool HasActiveSources() const; + // MediaStreamDispatcherEventHandler implementation. void OnDeviceStopped(const MediaStreamDevice& device) override;
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index a26dc43e..dd8f4c2f 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -94,6 +94,25 @@ return min_port != 0 && max_port != 0; } +// PeerConnectionDependencies wants to own the factory, so we provide a simple +// object that delegates calls to the IpcPacketSocketFactory. +// TODO(zstein): Move the creation logic from IpcPacketSocketFactory in to this +// class. +class ProxyAsyncResolverFactory final : public webrtc::AsyncResolverFactory { + public: + ProxyAsyncResolverFactory(IpcPacketSocketFactory* ipc_psf) + : ipc_psf_(ipc_psf) { + DCHECK(ipc_psf); + } + + rtc::AsyncResolverInterface* Create() override { + return ipc_psf_->CreateAsyncResolver(); + } + + private: + IpcPacketSocketFactory* ipc_psf_; +}; + } // namespace PeerConnectionDependencyFactory::PeerConnectionDependencyFactory( @@ -313,11 +332,12 @@ if (!GetPcFactory().get()) return nullptr; - std::unique_ptr<P2PPortAllocator> port_allocator = - CreatePortAllocator(web_frame); + webrtc::PeerConnectionDependencies dependencies(observer); + dependencies.allocator = CreatePortAllocator(web_frame); + dependencies.async_resolver_factory = + std::make_unique<ProxyAsyncResolverFactory>(socket_factory_.get()); return GetPcFactory() - ->CreatePeerConnection(config, std::move(port_allocator), nullptr, - observer) + ->CreatePeerConnection(config, std::move(dependencies)) .get(); }
diff --git a/content/renderer/media/webrtc/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc/webrtc_audio_device_impl.cc index 46cec777..d6dba45 100644 --- a/content/renderer/media/webrtc/webrtc_audio_device_impl.cc +++ b/content/renderer/media/webrtc/webrtc_audio_device_impl.cc
@@ -323,34 +323,6 @@ return 0; } -int32_t WebRtcAudioDeviceImpl::StereoPlayoutIsAvailable(bool* available) const { - DCHECK(initialized_); - // This method is called during initialization on the signaling thread and - // then later on the worker thread. Due to this we cannot DCHECK on what - // thread we're on since it might incorrectly initialize the - // worker_thread_checker_. - base::AutoLock auto_lock(lock_); - *available = renderer_ && renderer_->channels() == 2; - return 0; -} - -int32_t WebRtcAudioDeviceImpl::StereoRecordingIsAvailable( - bool* available) const { - DCHECK(initialized_); - // This method is called during initialization on the signaling thread and - // then later on the worker thread. Due to this we cannot DCHECK on what - // thread we're on since it might incorrectly initialize the - // worker_thread_checker_. - - // TODO(xians): These kind of hardware methods do not make much sense since we - // support multiple sources. Remove or figure out new APIs for such methods. - base::AutoLock auto_lock(lock_); - if (capturers_.empty()) - return -1; - *available = (capturers_.back()->GetInputFormat().channels() == 2); - return 0; -} - int32_t WebRtcAudioDeviceImpl::PlayoutDelay(uint16_t* delay_ms) const { DCHECK(worker_thread_checker_.CalledOnValidThread()); base::AutoLock auto_lock(lock_);
diff --git a/content/renderer/media/webrtc/webrtc_audio_device_impl.h b/content/renderer/media/webrtc/webrtc_audio_device_impl.h index 9b7f5426d..4f3f1ac 100644 --- a/content/renderer/media/webrtc/webrtc_audio_device_impl.h +++ b/content/renderer/media/webrtc/webrtc_audio_device_impl.h
@@ -164,8 +164,6 @@ int32_t MaxMicrophoneVolume(uint32_t* max_volume) const override; int32_t MinMicrophoneVolume(uint32_t* min_volume) const override; - int32_t StereoPlayoutIsAvailable(bool* available) const override; - int32_t StereoRecordingIsAvailable(bool* available) const override; int32_t PlayoutDelay(uint16_t* delay_ms) const override; public:
diff --git a/content/renderer/media/webrtc/webrtc_audio_device_not_impl.cc b/content/renderer/media/webrtc/webrtc_audio_device_not_impl.cc index 800da351..315439e 100644 --- a/content/renderer/media/webrtc/webrtc_audio_device_not_impl.cc +++ b/content/renderer/media/webrtc/webrtc_audio_device_not_impl.cc
@@ -121,6 +121,12 @@ return 0; } +int32_t WebRtcAudioDeviceNotImpl::StereoPlayoutIsAvailable( + bool* available) const { + *available = false; + return 0; +} + int32_t WebRtcAudioDeviceNotImpl::SetStereoPlayout(bool enable) { return 0; } @@ -129,6 +135,12 @@ return 0; } +int32_t WebRtcAudioDeviceNotImpl::StereoRecordingIsAvailable( + bool* available) const { + *available = false; + return 0; +} + int32_t WebRtcAudioDeviceNotImpl::SetStereoRecording(bool enable) { return 0; }
diff --git a/content/renderer/media/webrtc/webrtc_audio_device_not_impl.h b/content/renderer/media/webrtc/webrtc_audio_device_not_impl.h index 02ba0987d..17b42ef20 100644 --- a/content/renderer/media/webrtc/webrtc_audio_device_not_impl.h +++ b/content/renderer/media/webrtc/webrtc_audio_device_not_impl.h
@@ -61,7 +61,9 @@ int32_t MicrophoneMuteIsAvailable(bool* available) override; int32_t SetMicrophoneMute(bool enable) override; int32_t MicrophoneMute(bool* enabled) const override; + int32_t StereoPlayoutIsAvailable(bool* available) const override; int32_t SetStereoPlayout(bool enable) override; + int32_t StereoRecordingIsAvailable(bool* available) const override; int32_t StereoPlayout(bool* enabled) const override; int32_t SetStereoRecording(bool enable) override; int32_t StereoRecording(bool* enabled) const override;
diff --git a/content/renderer/p2p/socket_client_impl.cc b/content/renderer/p2p/socket_client_impl.cc index 096a3494..2b0de5c 100644 --- a/content/renderer/p2p/socket_client_impl.cc +++ b/content/renderer/p2p/socket_client_impl.cc
@@ -135,7 +135,9 @@ } void P2PSocketClientImpl::IncomingTcpConnection( - const net::IPEndPoint& socket_address) { + const net::IPEndPoint& socket_address, + network::mojom::P2PSocketPtr socket, + network::mojom::P2PSocketClientRequest client_request) { DCHECK_EQ(state_, STATE_OPEN); auto new_client = @@ -143,13 +145,11 @@ new_client->state_ = STATE_OPEN; network::mojom::P2PSocketClientPtr socket_client; - new_client->binding_.Bind(mojo::MakeRequest(&socket_client)); + new_client->socket_ = std::move(socket); + new_client->binding_.Bind(std::move(client_request)); new_client->binding_.set_connection_error_handler(base::Bind( &P2PSocketClientImpl::OnConnectionError, base::Unretained(this))); - socket_->AcceptIncomingTcpConnection(socket_address, std::move(socket_client), - mojo::MakeRequest(&new_client->socket_)); - DCHECK(thread_checker_.CalledOnValidThread()); if (delegate_) { delegate_->OnIncomingTcpConnection(socket_address, std::move(new_client)); @@ -157,7 +157,6 @@ // Just close the socket if there is no delegate to accept it. new_client->Close(); } - } void P2PSocketClientImpl::DataReceived(const net::IPEndPoint& socket_address,
diff --git a/content/renderer/p2p/socket_client_impl.h b/content/renderer/p2p/socket_client_impl.h index 4aa5532..cb9bb37 100644 --- a/content/renderer/p2p/socket_client_impl.h +++ b/content/renderer/p2p/socket_client_impl.h
@@ -87,7 +87,10 @@ void SocketCreated(const net::IPEndPoint& local_address, const net::IPEndPoint& remote_address) override; void SendComplete(const network::P2PSendPacketMetrics& send_metrics) override; - void IncomingTcpConnection(const net::IPEndPoint& socket_address) override; + void IncomingTcpConnection( + const net::IPEndPoint& socket_address, + network::mojom::P2PSocketPtr socket, + network::mojom::P2PSocketClientRequest client_request) override; void DataReceived(const net::IPEndPoint& socket_address, const std::vector<int8_t>& data, base::TimeTicks timestamp) override;
diff --git a/content/renderer/pepper/content_renderer_pepper_host_factory.cc b/content/renderer/pepper/content_renderer_pepper_host_factory.cc index 2c396ff..401e48c6 100644 --- a/content/renderer/pepper/content_renderer_pepper_host_factory.cc +++ b/content/renderer/pepper/content_renderer_pepper_host_factory.cc
@@ -27,9 +27,7 @@ #include "content/renderer/pepper/pepper_url_loader_host.h" #include "content/renderer/pepper/pepper_video_capture_host.h" #include "content/renderer/pepper/pepper_video_decoder_host.h" -#include "content/renderer/pepper/pepper_video_destination_host.h" #include "content/renderer/pepper/pepper_video_encoder_host.h" -#include "content/renderer/pepper/pepper_video_source_host.h" #include "content/renderer/pepper/pepper_websocket_host.h" #include "content/renderer/pepper/ppb_image_data_impl.h" #include "content/renderer/pepper/renderer_ppapi_host_impl.h" @@ -55,18 +53,6 @@ namespace { -bool CanUseMediaStreamAPI(const RendererPpapiHost* host, PP_Instance instance) { - blink::WebPluginContainer* container = - host->GetContainerForInstance(instance); - if (!container) - return false; - - GURL document_url = container->GetDocument().Url(); - ContentRendererClient* content_renderer_client = - GetContentClient()->renderer(); - return content_renderer_client->AllowPepperMediaStreamAPI(document_url); -} - static bool CanUseCameraDeviceAPI(const RendererPpapiHost* host, PP_Instance instance) { blink::WebPluginContainer* container = @@ -187,19 +173,6 @@ case PpapiHostMsg_MediaStreamVideoTrack_Create::ID: return std::make_unique<PepperMediaStreamVideoTrackHost>(host_, instance, resource); - // These private MediaStream interfaces are exposed as if they were public - // so they can be used by NaCl plugins. However, they are available only - // for whitelisted apps. - case PpapiHostMsg_VideoDestination_Create::ID: - if (CanUseMediaStreamAPI(host_, instance)) - return std::make_unique<PepperVideoDestinationHost>(host_, instance, - resource); - return nullptr; - case PpapiHostMsg_VideoSource_Create::ID: - if (CanUseMediaStreamAPI(host_, instance)) - return std::make_unique<PepperVideoSourceHost>(host_, instance, - resource); - return nullptr; } // Dev interfaces.
diff --git a/content/renderer/pepper/pepper_video_destination_host.cc b/content/renderer/pepper/pepper_video_destination_host.cc deleted file mode 100644 index aa3567d..0000000 --- a/content/renderer/pepper/pepper_video_destination_host.cc +++ /dev/null
@@ -1,108 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/pepper/pepper_video_destination_host.h" - -#include "base/time/time.h" -#include "content/public/renderer/renderer_ppapi_host.h" -#include "content/renderer/pepper/ppb_image_data_impl.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/host/dispatch_host_message.h" -#include "ppapi/host/host_message_context.h" -#include "ppapi/host/ppapi_host.h" -#include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/thunk/enter.h" -#include "ppapi/thunk/ppb_image_data_api.h" - -using ppapi::host::HostMessageContext; -using ppapi::host::ReplyMessageContext; - -namespace content { - -PepperVideoDestinationHost::PepperVideoDestinationHost(RendererPpapiHost* host, - PP_Instance instance, - PP_Resource resource) - : ResourceHost(host->GetPpapiHost(), instance, resource), -#if DCHECK_IS_ON() - has_received_frame_(false), -#endif - weak_factory_(this) {} - -PepperVideoDestinationHost::~PepperVideoDestinationHost() {} - -int32_t PepperVideoDestinationHost::OnResourceMessageReceived( - const IPC::Message& msg, - HostMessageContext* context) { - PPAPI_BEGIN_MESSAGE_MAP(PepperVideoDestinationHost, msg) - PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDestination_Open, - OnHostMsgOpen) - PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDestination_PutFrame, - OnHostMsgPutFrame) - PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoDestination_Close, - OnHostMsgClose) - PPAPI_END_MESSAGE_MAP() - return PP_ERROR_FAILED; -} - -int32_t PepperVideoDestinationHost::OnHostMsgOpen( - HostMessageContext* context, - const std::string& stream_url) { - GURL gurl(stream_url); - if (!gurl.is_valid()) - return PP_ERROR_BADARGUMENT; - - FrameWriterInterface* frame_writer = nullptr; - if (!PepperToVideoTrackAdapter::Open(nullptr /* registry */, gurl.spec(), - &frame_writer)) - return PP_ERROR_FAILED; - frame_writer_.reset(frame_writer); - - ReplyMessageContext reply_context = context->MakeReplyMessageContext(); - reply_context.params.set_result(PP_OK); - host()->SendReply(reply_context, PpapiPluginMsg_VideoDestination_OpenReply()); - return PP_OK_COMPLETIONPENDING; -} - -int32_t PepperVideoDestinationHost::OnHostMsgPutFrame( - HostMessageContext* context, - const ppapi::HostResource& image_data_resource, - PP_TimeTicks timestamp) { - ppapi::thunk::EnterResourceNoLock<ppapi::thunk::PPB_ImageData_API> enter( - image_data_resource.host_resource(), true); - if (enter.failed()) - return PP_ERROR_BADRESOURCE; - PPB_ImageData_Impl* image_data_impl = - static_cast<PPB_ImageData_Impl*>(enter.object()); - - if (!PPB_ImageData_Impl::IsImageDataFormatSupported( - image_data_impl->format())) - return PP_ERROR_BADARGUMENT; - - if (!frame_writer_.get()) - return PP_ERROR_FAILED; - - // Convert PP_TimeTicks (a double, in seconds) to a video timestamp (int64_t, - // nanoseconds). - const int64_t timestamp_ns = - static_cast<int64_t>(timestamp * base::Time::kNanosecondsPerSecond); - // Check that timestamps are strictly increasing. -#if DCHECK_IS_ON() - if (has_received_frame_) - DCHECK_GT(timestamp_ns, previous_timestamp_ns_); - has_received_frame_ = true; - previous_timestamp_ns_ = timestamp_ns; -#endif - - frame_writer_->PutFrame(image_data_impl, timestamp_ns); - - return PP_OK; -} - -int32_t PepperVideoDestinationHost::OnHostMsgClose( - HostMessageContext* context) { - frame_writer_.reset(nullptr); - return PP_OK; -} - -} // namespace content
diff --git a/content/renderer/pepper/pepper_video_destination_host.h b/content/renderer/pepper/pepper_video_destination_host.h deleted file mode 100644 index 1041952..0000000 --- a/content/renderer/pepper/pepper_video_destination_host.h +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DESTINATION_HOST_H_ -#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DESTINATION_HOST_H_ - -#include <stdint.h> - -#include <memory> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "content/common/content_export.h" -#include "content/renderer/media/pepper/pepper_to_video_track_adapter.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/host/resource_host.h" - -namespace content { - -class RendererPpapiHost; - -class CONTENT_EXPORT PepperVideoDestinationHost - : public ppapi::host::ResourceHost { - public: - PepperVideoDestinationHost(RendererPpapiHost* host, - PP_Instance instance, - PP_Resource resource); - - ~PepperVideoDestinationHost() override; - - int32_t OnResourceMessageReceived( - const IPC::Message& msg, - ppapi::host::HostMessageContext* context) override; - - private: - int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context, - const std::string& stream_url); - int32_t OnHostMsgPutFrame(ppapi::host::HostMessageContext* context, - const ppapi::HostResource& image_data_resource, - PP_TimeTicks timestamp); - int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context); - - std::unique_ptr<FrameWriterInterface> frame_writer_; - // Used for checking that timestamps are strictly increasing. -#if DCHECK_IS_ON() - bool has_received_frame_; - int64_t previous_timestamp_ns_; -#endif - - base::WeakPtrFactory<PepperVideoDestinationHost> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(PepperVideoDestinationHost); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DESTINATION_HOST_H_
diff --git a/content/renderer/pepper/pepper_video_source_host.cc b/content/renderer/pepper/pepper_video_source_host.cc deleted file mode 100644 index 4804713..0000000 --- a/content/renderer/pepper/pepper_video_source_host.cc +++ /dev/null
@@ -1,322 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/pepper/pepper_video_source_host.h" - -#include <string.h> - -#include "base/bind.h" -#include "base/numerics/safe_conversions.h" -#include "content/public/renderer/renderer_ppapi_host.h" -#include "content/renderer/media/pepper/video_track_to_pepper_adapter.h" -#include "content/renderer/pepper/ppb_image_data_impl.h" -#include "content/renderer/render_thread_impl.h" -#include "media/base/video_util.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/host/dispatch_host_message.h" -#include "ppapi/host/ppapi_host.h" -#include "ppapi/proxy/host_dispatcher.h" -#include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_image_data_proxy.h" -#include "ppapi/shared_impl/scoped_pp_resource.h" -#include "ppapi/thunk/enter.h" -#include "ppapi/thunk/ppb_image_data_api.h" -#include "third_party/libyuv/include/libyuv/convert.h" -#include "third_party/libyuv/include/libyuv/scale.h" -#include "third_party/skia/include/core/SkBitmap.h" - -using ppapi::host::HostMessageContext; -using ppapi::host::ReplyMessageContext; - -namespace content { - -class PepperVideoSourceHost::FrameReceiver - : public FrameReaderInterface, - public base::RefCountedThreadSafe<FrameReceiver> { - public: - explicit FrameReceiver(const base::WeakPtr<PepperVideoSourceHost>& host); - - // FrameReaderInterface implementation. - void GotFrame(const scoped_refptr<media::VideoFrame>& frame) override; - - private: - friend class base::RefCountedThreadSafe<FrameReceiver>; - ~FrameReceiver() override; - - base::WeakPtr<PepperVideoSourceHost> host_; - // |thread_checker_| is bound to the main render thread. - base::ThreadChecker thread_checker_; -}; - -PepperVideoSourceHost::FrameReceiver::FrameReceiver( - const base::WeakPtr<PepperVideoSourceHost>& host) - : host_(host) {} - -PepperVideoSourceHost::FrameReceiver::~FrameReceiver() {} - -void PepperVideoSourceHost::FrameReceiver::GotFrame( - const scoped_refptr<media::VideoFrame>& video_frame) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (!host_) - return; - - if (!(video_frame->format() == media::PIXEL_FORMAT_I420 || - video_frame->format() == media::PIXEL_FORMAT_I420A)) { - NOTREACHED(); - return; - } - scoped_refptr<media::VideoFrame> frame = video_frame; - // Drop alpha channel since we do not support it yet. - if (frame->format() == media::PIXEL_FORMAT_I420A) - frame = media::WrapAsI420VideoFrame(video_frame); - - // Hold a reference to the new frame and release the previous. - host_->last_frame_ = frame; - if (host_->get_frame_pending_) - host_->SendGetFrameReply(); -} - -PepperVideoSourceHost::PepperVideoSourceHost(RendererPpapiHost* host, - PP_Instance instance, - PP_Resource resource) - : ResourceHost(host->GetPpapiHost(), instance, resource), - frame_source_(new VideoTrackToPepperAdapter(nullptr)), - get_frame_pending_(false), - weak_factory_(this) { - frame_receiver_ = new FrameReceiver(weak_factory_.GetWeakPtr()); - memset(&shared_image_desc_, 0, sizeof(shared_image_desc_)); -} - -PepperVideoSourceHost::~PepperVideoSourceHost() { Close(); } - -int32_t PepperVideoSourceHost::OnResourceMessageReceived( - const IPC::Message& msg, - HostMessageContext* context) { - PPAPI_BEGIN_MESSAGE_MAP(PepperVideoSourceHost, msg) - PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoSource_Open, - OnHostMsgOpen) - PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoSource_GetFrame, - OnHostMsgGetFrame) - PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoSource_Close, - OnHostMsgClose) - PPAPI_END_MESSAGE_MAP() - return PP_ERROR_FAILED; -} - -int32_t PepperVideoSourceHost::OnHostMsgOpen(HostMessageContext* context, - const std::string& stream_url) { - GURL gurl(stream_url); - if (!gurl.is_valid()) - return PP_ERROR_BADARGUMENT; - - if (!frame_source_->Open(gurl.spec(), frame_receiver_.get())) - return PP_ERROR_BADARGUMENT; - - stream_url_ = gurl.spec(); - - ReplyMessageContext reply_context = context->MakeReplyMessageContext(); - reply_context.params.set_result(PP_OK); - host()->SendReply(reply_context, PpapiPluginMsg_VideoSource_OpenReply()); - return PP_OK_COMPLETIONPENDING; -} - -int32_t PepperVideoSourceHost::OnHostMsgGetFrame(HostMessageContext* context) { - if (!frame_source_.get()) - return PP_ERROR_FAILED; - if (get_frame_pending_) - return PP_ERROR_INPROGRESS; - - reply_context_ = context->MakeReplyMessageContext(); - get_frame_pending_ = true; - - // If a frame is ready, try to convert it and send the reply. - if (last_frame_.get()) - SendGetFrameReply(); - - return PP_OK_COMPLETIONPENDING; -} - -int32_t PepperVideoSourceHost::OnHostMsgClose(HostMessageContext* context) { - Close(); - return PP_OK; -} - -void PepperVideoSourceHost::SendGetFrameReply() { - DCHECK(get_frame_pending_); - get_frame_pending_ = false; - - DCHECK(last_frame_.get()); - const gfx::Size dst_size = last_frame_->natural_size(); - - // Note: We try to reuse the shared memory for the previous frame here. This - // means that the previous frame may be overwritten and is no longer valid - // after calling this function again. - base::SharedMemoryHandle image_handle; - uint32_t byte_count; - if (shared_image_.get() && dst_size.width() == shared_image_->width() && - dst_size.height() == shared_image_->height()) { - // We have already allocated the correct size in shared memory. We need to - // duplicate the handle for IPC however, which will close down the - // duplicated handle when it's done. - base::SharedMemory* local_shm; - if (shared_image_->GetSharedMemory(&local_shm, &byte_count) != PP_OK) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - ppapi::proxy::HostDispatcher* dispatcher = - ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); - if (!dispatcher) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - image_handle = - dispatcher->ShareSharedMemoryHandleWithRemote(local_shm->handle()); - } else { - // We need to allocate new shared memory. - shared_image_ = nullptr; // Release any previous image. - - ppapi::ScopedPPResource resource( - ppapi::ScopedPPResource::PassRef(), - ppapi::proxy::PPB_ImageData_Proxy::CreateImageData( - pp_instance(), - ppapi::PPB_ImageData_Shared::SIMPLE, - PP_IMAGEDATAFORMAT_BGRA_PREMUL, - PP_MakeSize(dst_size.width(), dst_size.height()), - false /* init_to_zero */, - &shared_image_desc_, - &image_handle, - &byte_count)); - if (!resource) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - ppapi::thunk::EnterResourceNoLock<ppapi::thunk::PPB_ImageData_API> - enter_resource(resource, false); - if (enter_resource.failed()) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - shared_image_ = static_cast<PPB_ImageData_Impl*>(enter_resource.object()); - if (!shared_image_.get()) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - DCHECK(!shared_image_->IsMapped()); // New memory should not be mapped. - if (!shared_image_->Map() || shared_image_->GetMappedBitmap().empty()) { - shared_image_ = nullptr; - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - } - - SkBitmap bitmap(shared_image_->GetMappedBitmap()); - if (bitmap.empty()) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - uint8_t* bitmap_pixels = static_cast<uint8_t*>(bitmap.getPixels()); - if (!bitmap_pixels) { - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - - // Calculate the portion of the |last_frame_| that should be copied into - // |bitmap|. If |last_frame_| is lazily scaled, then - // last_frame_->visible_rect()._size() != last_frame_.natural_size(). - scoped_refptr<media::VideoFrame> frame; - if (dst_size == last_frame_->visible_rect().size()) { - // No scaling is needed, convert directly from last_frame_. - frame = last_frame_; - // Frame resolution doesn't change frequently, so don't keep any unnecessary - // buffers around. - scaled_frame_ = nullptr; - } else { - // We need to create an intermediate scaled frame. Make sure we have - // allocated one of correct size. - if (!scaled_frame_.get() || scaled_frame_->coded_size() != dst_size) { - scaled_frame_ = media::VideoFrame::CreateFrame( - media::PIXEL_FORMAT_I420, dst_size, gfx::Rect(dst_size), dst_size, - last_frame_->timestamp()); - if (!scaled_frame_.get()) { - LOG(ERROR) << "Failed to allocate a media::VideoFrame"; - SendGetFrameErrorReply(PP_ERROR_FAILED); - return; - } - } - scaled_frame_->set_timestamp(last_frame_->timestamp()); - libyuv::I420Scale(last_frame_->visible_data(media::VideoFrame::kYPlane), - last_frame_->stride(media::VideoFrame::kYPlane), - last_frame_->visible_data(media::VideoFrame::kUPlane), - last_frame_->stride(media::VideoFrame::kUPlane), - last_frame_->visible_data(media::VideoFrame::kVPlane), - last_frame_->stride(media::VideoFrame::kVPlane), - last_frame_->visible_rect().width(), - last_frame_->visible_rect().height(), - scaled_frame_->data(media::VideoFrame::kYPlane), - scaled_frame_->stride(media::VideoFrame::kYPlane), - scaled_frame_->data(media::VideoFrame::kUPlane), - scaled_frame_->stride(media::VideoFrame::kUPlane), - scaled_frame_->data(media::VideoFrame::kVPlane), - scaled_frame_->stride(media::VideoFrame::kVPlane), - dst_size.width(), - dst_size.height(), - libyuv::kFilterBilinear); - frame = scaled_frame_; - } - last_frame_ = nullptr; - - libyuv::I420ToARGB(frame->visible_data(media::VideoFrame::kYPlane), - frame->stride(media::VideoFrame::kYPlane), - frame->visible_data(media::VideoFrame::kUPlane), - frame->stride(media::VideoFrame::kUPlane), - frame->visible_data(media::VideoFrame::kVPlane), - frame->stride(media::VideoFrame::kVPlane), - bitmap_pixels, - bitmap.rowBytes(), - dst_size.width(), - dst_size.height()); - - ppapi::HostResource host_resource; - host_resource.SetHostResource(pp_instance(), shared_image_->GetReference()); - - // Convert a video timestamp to a PP_TimeTicks (a double, in seconds). - const PP_TimeTicks timestamp = frame->timestamp().InSecondsF(); - - ppapi::proxy::SerializedHandle serialized_handle; - serialized_handle.set_shmem(image_handle, byte_count); - reply_context_.params.AppendHandle(std::move(serialized_handle)); - - host()->SendReply(reply_context_, - PpapiPluginMsg_VideoSource_GetFrameReply( - host_resource, shared_image_desc_, timestamp)); - - reply_context_ = ppapi::host::ReplyMessageContext(); -} - -void PepperVideoSourceHost::SendGetFrameErrorReply(int32_t error) { - reply_context_.params.set_result(error); - host()->SendReply( - reply_context_, - PpapiPluginMsg_VideoSource_GetFrameReply( - ppapi::HostResource(), PP_ImageDataDesc(), 0.0 /* timestamp */)); - reply_context_ = ppapi::host::ReplyMessageContext(); -} - -void PepperVideoSourceHost::Close() { - if (frame_source_.get() && !stream_url_.empty()) - frame_source_->Close(frame_receiver_.get()); - - frame_source_.reset(nullptr); - stream_url_.clear(); - - shared_image_ = nullptr; -} - -} // namespace content
diff --git a/content/renderer/pepper/pepper_video_source_host.h b/content/renderer/pepper/pepper_video_source_host.h deleted file mode 100644 index 811a4616..0000000 --- a/content/renderer/pepper/pepper_video_source_host.h +++ /dev/null
@@ -1,90 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_ -#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_ - -#include <stdint.h> - -#include <memory> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/threading/thread_checker.h" -#include "content/common/content_export.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/c/ppb_image_data.h" -#include "ppapi/host/host_message_context.h" -#include "ppapi/host/resource_host.h" - -struct PP_ImageDataDesc; - -namespace media { -class VideoFrame; -} // namespace media - -namespace content { - -class PPB_ImageData_Impl; -class RendererPpapiHost; -class VideoTrackToPepperAdapter; - -class CONTENT_EXPORT PepperVideoSourceHost : public ppapi::host::ResourceHost { - public: - PepperVideoSourceHost(RendererPpapiHost* host, - PP_Instance instance, - PP_Resource resource); - - ~PepperVideoSourceHost() override; - - int32_t OnResourceMessageReceived( - const IPC::Message& msg, - ppapi::host::HostMessageContext* context) override; - - private: - // Helper object to receive frames on a video worker thread and pass them on - // to us. - class FrameReceiver; - - int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context, - const std::string& stream_url); - int32_t OnHostMsgGetFrame(ppapi::host::HostMessageContext* context); - int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context); - - // Sends the reply to a GetFrame message from the plugin. A reply is always - // sent and last_frame_, reply_context_, and get_frame_pending_ are all reset. - void SendGetFrameReply(); - // Sends the reply to a GetFrame message from the plugin in case of an error. - void SendGetFrameErrorReply(int32_t error); - - void Close(); - - ppapi::host::ReplyMessageContext reply_context_; - - std::unique_ptr<VideoTrackToPepperAdapter> frame_source_; - scoped_refptr<FrameReceiver> frame_receiver_; - std::string stream_url_; - scoped_refptr<media::VideoFrame> last_frame_; - // An internal frame buffer to avoid reallocations. It is only allocated if - // scaling is needed. - scoped_refptr<media::VideoFrame> scaled_frame_; - bool get_frame_pending_; - // We use only one ImageData resource in order to avoid allocating - // shared memory repeatedly. We send the same one each time the plugin - // requests a frame. For this to work, the plugin must finish using - // the ImageData it receives prior to calling GetFrame, and not access - // the ImageData until it gets its next callback to GetFrame. - scoped_refptr<PPB_ImageData_Impl> shared_image_; - PP_ImageDataDesc shared_image_desc_; - - base::WeakPtrFactory<PepperVideoSourceHost> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(PepperVideoSourceHost); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_SOURCE_HOST_H_
diff --git a/content/renderer/pepper/plugin_module.cc b/content/renderer/pepper/plugin_module.cc index 7f3d594f7..c0e6fb2 100644 --- a/content/renderer/pepper/plugin_module.cc +++ b/content/renderer/pepper/plugin_module.cc
@@ -127,8 +127,6 @@ #include "ppapi/c/private/ppb_testing_private.h" #include "ppapi/c/private/ppb_udp_socket_private.h" #include "ppapi/c/private/ppb_uma_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" #include "ppapi/c/private/ppb_x509_certificate_private.h" #include "ppapi/c/trusted/ppb_broker_trusted.h" #include "ppapi/c/trusted/ppb_browser_font_trusted.h"
diff --git a/content/renderer/pepper/resource_creation_impl.cc b/content/renderer/pepper/resource_creation_impl.cc index 418806a..5f0db4a 100644 --- a/content/renderer/pepper/resource_creation_impl.cc +++ b/content/renderer/pepper/resource_creation_impl.cc
@@ -331,18 +331,10 @@ return PPB_VideoDecoder_Impl::Create(instance, graphics3d_id, profile); } -PP_Resource ResourceCreationImpl::CreateVideoDestination(PP_Instance instance) { - return 0; // Not supported in-process. -} - PP_Resource ResourceCreationImpl::CreateVideoEncoder(PP_Instance instance) { return 0; // Not supported in-process. } -PP_Resource ResourceCreationImpl::CreateVideoSource(PP_Instance instance) { - return 0; // Not supported in-process. -} - PP_Resource ResourceCreationImpl::CreateVpnProvider(PP_Instance instance) { return 0; // Not supported in-process. }
diff --git a/content/renderer/pepper/resource_creation_impl.h b/content/renderer/pepper/resource_creation_impl.h index d89ded2..13b5c04 100644 --- a/content/renderer/pepper/resource_creation_impl.h +++ b/content/renderer/pepper/resource_creation_impl.h
@@ -128,9 +128,7 @@ PP_Resource CreateVideoDecoderDev(PP_Instance instance, PP_Resource graphics3d_id, PP_VideoDecoder_Profile profile) override; - PP_Resource CreateVideoDestination(PP_Instance instance) override; PP_Resource CreateVideoEncoder(PP_Instance instance) override; - PP_Resource CreateVideoSource(PP_Instance instance) override; PP_Resource CreateVpnProvider(PP_Instance instance) override; PP_Resource CreateWheelInputEvent(PP_Instance instance, PP_TimeTicks time_stamp,
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index a4d5cf2..ce7d96f 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -2083,8 +2083,7 @@ // Swap this RenderFrame out so the frame can navigate to a page rendered by // a different process. This involves running the unload handler and - // clearing the page. We also allow this process to exit if there are no - // other active RenderFrames in it. + // clearing the page. // Send an UpdateState message before we get deleted. SendUpdateState(); @@ -2156,13 +2155,6 @@ auto send_swapout_ack = base::BindOnce( [](int routing_id, bool is_main_frame) { RenderThread::Get()->Send(new FrameHostMsg_SwapOut_ACK(routing_id)); - // Now that the unload handler, and any postMessages posted from it, - // have finished, and we've sent the swapout ACK, it's safe to exit if - // no one else is using the process. Release the process if we've - // swapped the main frame out, and hence transitioned the - // RenderView/Widget to swapped out state. - if (is_main_frame) - RenderProcess::current()->ReleaseProcess(); }, routing_id, is_main_frame); task_runner->PostTask(FROM_HERE, std::move(send_swapout_ack)); @@ -5922,16 +5914,12 @@ // If this is the main frame going from a remote frame to a local frame, // it needs to set RenderViewImpl's pointer for the main frame to itself, - // ensure RenderWidget is no longer in swapped out mode, and call - // AddRefProcess() to prevent the process from exiting. A matching - // ReleaseProcess() call will be made if the RenderWidget ever becomes - // swapped out again - see OnSwapOut(). + // ensure RenderWidget is no longer in swapped out mode. if (is_main_frame_) { CHECK(!render_view_->main_render_frame_); render_view_->main_render_frame_ = this; if (render_view_->is_swapped_out()) { render_view_->SetSwappedOut(false); - RenderProcess::current()->AddRefProcess(); } render_view_->UpdateWebViewWithDeviceScaleFactor(); } @@ -6181,13 +6169,6 @@ !weak_self) { return blink::kWebNavigationPolicyIgnore; } - - // |navigation_start| must be recorded immediately after dispatching the - // beforeunload event. - if (pending_navigation_params_) { - pending_navigation_params_->common_params.navigation_start = - base::TimeTicks::Now(); - } } // When an MHTML Archive is present, it should be used to serve iframe content
diff --git a/content/renderer/render_frame_metadata_observer_impl.cc b/content/renderer/render_frame_metadata_observer_impl.cc index c8de63d..b98aa7b 100644 --- a/content/renderer/render_frame_metadata_observer_impl.cc +++ b/content/renderer/render_frame_metadata_observer_impl.cc
@@ -116,15 +116,15 @@ rfm1.is_mobile_optimized != rfm2.is_mobile_optimized || rfm1.device_scale_factor != rfm2.device_scale_factor || rfm1.viewport_size_in_pixels != rfm2.viewport_size_in_pixels || + rfm1.top_controls_height != rfm2.top_controls_height || + rfm1.top_controls_shown_ratio != rfm2.top_controls_shown_ratio || rfm1.local_surface_id != rfm2.local_surface_id) { *needs_activation_notification = true; return true; } #if defined(OS_ANDROID) - if (rfm1.top_controls_height != rfm2.top_controls_height || - rfm1.top_controls_shown_ratio != rfm2.top_controls_shown_ratio || - rfm1.bottom_controls_height != rfm2.bottom_controls_height || + if (rfm1.bottom_controls_height != rfm2.bottom_controls_height || rfm1.bottom_controls_shown_ratio != rfm2.bottom_controls_shown_ratio || rfm1.min_page_scale_factor != rfm2.min_page_scale_factor || rfm1.max_page_scale_factor != rfm2.max_page_scale_factor ||
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index 49973c5..29707273 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc
@@ -237,4 +237,12 @@ return enabled_bindings_; } +void RenderProcessImpl::AddRefProcess() { + NOTREACHED(); +} + +void RenderProcessImpl::ReleaseProcess() { + NOTREACHED(); +} + } // namespace content
diff --git a/content/renderer/render_process_impl.h b/content/renderer/render_process_impl.h index 0776bb2..a81dcb1 100644 --- a/content/renderer/render_process_impl.h +++ b/content/renderer/render_process_impl.h
@@ -32,6 +32,14 @@ void AddBindings(int bindings) override; int GetEnabledBindings() const override; + // Do not use these functions. + // The browser process is the only one responsible for knowing when to + // shutdown its renderer processes. Reference counting to keep this process + // alive is not used. To keep this process alive longer, see + // mojo::KeepAliveHandle and content::RenderProcessHostImpl. + void AddRefProcess() override; + void ReleaseProcess() override; + private: RenderProcessImpl(std::unique_ptr<base::TaskScheduler::InitParams> task_scheduler_init_params);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index f942fee8..1b6c6f0 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -1621,6 +1621,7 @@ // caused race conditions, where the browser process was reusing renderer // processes that were shutting down. // See https://crbug.com/535246 or https://crbug.com/873541/#c8. + NOTREACHED(); } bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) {
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index d876f11..c929caa 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -420,6 +420,24 @@ } } +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) +// Check content::BrowserControlsState, and cc::BrowserControlsState +// are kept in sync. +static_assert(int(BROWSER_CONTROLS_STATE_SHOWN) == + int(cc::BrowserControlsState::kShown), + "mismatching enums: SHOWN"); +static_assert(int(BROWSER_CONTROLS_STATE_HIDDEN) == + int(cc::BrowserControlsState::kHidden), + "mismatching enums: HIDDEN"); +static_assert(int(BROWSER_CONTROLS_STATE_BOTH) == + int(cc::BrowserControlsState::kBoth), + "mismatching enums: BOTH"); + +cc::BrowserControlsState ContentToCc(BrowserControlsState state) { + return static_cast<cc::BrowserControlsState>(state); +} +#endif + } // namespace RenderViewImpl::RenderViewImpl(CompositorDependencies* compositor_deps, @@ -1765,6 +1783,33 @@ return renderer_preferences_.accept_languages; } +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) + +void RenderViewImpl::UpdateBrowserControlsState( + BrowserControlsState constraints, + BrowserControlsState current, + bool animate) { + if (GetWebWidget()) { + GetWebWidget()->UpdateBrowserControlsState(ContentToCc(constraints), + ContentToCc(current), animate); + } + + top_controls_constraints_ = constraints; +} + +void RenderViewImpl::didScrollWithKeyboard(const blink::WebSize& delta) { + if (delta.height == 0) + return; + + BrowserControlsState current = delta.height < 0 + ? BROWSER_CONTROLS_STATE_SHOWN + : BROWSER_CONTROLS_STATE_HIDDEN; + + UpdateBrowserControlsState(top_controls_constraints_, current, true); +} + +#endif + void RenderViewImpl::ConvertViewportToWindowViaWidget(blink::WebRect* rect) { WidgetClient()->ConvertViewportToWindow(rect); }
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index fc982820..510b766 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -266,7 +266,6 @@ // date and time input fields using MULTIPLE_FIELDS_UI bool OpenDateTimeChooser(const blink::WebDateTimeChooserParams&, blink::WebDateTimeChooserCompletion*) override; - virtual void didScrollWithKeyboard(const blink::WebSize& delta); #endif // RenderView implementation ------------------------------------------------- @@ -287,10 +286,11 @@ const std::string& value) override; void ClearEditCommands() override; const std::string& GetAcceptLanguages() const override; -#if defined(OS_ANDROID) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) void UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate) override; + virtual void didScrollWithKeyboard(const blink::WebSize& delta); #endif void ConvertViewportToWindowViaWidget(blink::WebRect* rect) override; gfx::RectF ElementBoundsInWindow(const blink::WebElement& element) override; @@ -642,7 +642,7 @@ // The next target URL we want to send to the browser. GURL pending_target_url_; -#if defined(OS_ANDROID) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) // Cache the old browser controls state constraints. Used when updating // current value only without altering the constraints. BrowserControlsState top_controls_constraints_ = BROWSER_CONTROLS_STATE_BOTH;
diff --git a/content/renderer/render_view_impl_android.cc b/content/renderer/render_view_impl_android.cc deleted file mode 100644 index f6835cd..0000000 --- a/content/renderer/render_view_impl_android.cc +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright (c) 2012 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/renderer/render_view_impl.h" - -#include "base/command_line.h" -#include "cc/trees/layer_tree_host.h" -#include "content/common/view_messages.h" -#include "content/renderer/gpu/layer_tree_view.h" -#include "third_party/blink/public/web/web_view.h" - -namespace content { - -// Check content::BrowserControlsState, and cc::BrowserControlsState -// are kept in sync. -static_assert(int(BROWSER_CONTROLS_STATE_SHOWN) == - int(cc::BrowserControlsState::kShown), - "mismatching enums: SHOWN"); -static_assert(int(BROWSER_CONTROLS_STATE_HIDDEN) == - int(cc::BrowserControlsState::kHidden), - "mismatching enums: HIDDEN"); -static_assert(int(BROWSER_CONTROLS_STATE_BOTH) == - int(cc::BrowserControlsState::kBoth), - "mismatching enums: BOTH"); - -cc::BrowserControlsState ContentToCc(BrowserControlsState state) { - return static_cast<cc::BrowserControlsState>(state); -} - -void RenderViewImpl::UpdateBrowserControlsState( - BrowserControlsState constraints, - BrowserControlsState current, - bool animate) { - if (GetWebWidget()) { - GetWebWidget()->UpdateBrowserControlsState(ContentToCc(constraints), - ContentToCc(current), animate); - } - - top_controls_constraints_ = constraints; -} - -void RenderViewImpl::didScrollWithKeyboard(const blink::WebSize& delta) { - if (delta.height == 0) - return; - - BrowserControlsState current = delta.height < 0 - ? BROWSER_CONTROLS_STATE_SHOWN - : BROWSER_CONTROLS_STATE_HIDDEN; - - UpdateBrowserControlsState(top_controls_constraints_, current, true); -} - -} // namespace content
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 89c83d99..a1a3de76 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -436,10 +436,6 @@ widget_binding_(this, std::move(widget_request)), weak_ptr_factory_(this) { DCHECK_NE(routing_id_, MSG_ROUTING_NONE); - // TODO(nasko, alexmos): ref count the process based on the lifetime of - // RenderFrames rather than RenderWidgets. - if (!swapped_out) - RenderProcess::current()->AddRefProcess(); DCHECK(RenderThread::Get()); // In tests there may not be a RenderThreadImpl. @@ -470,9 +466,6 @@ if (input_event_queue_) input_event_queue_->ClearClient(); - // If we are swapped out, we have released already. - if (!is_swapped_out_ && RenderProcess::current()) - RenderProcess::current()->ReleaseProcess(); #if defined(USE_AURA) // It is possible for a RenderWidget to be destroyed before it was embedded // in a mus window. The RendererWindowTreeClient will leak in such cases. So
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 4a594bd9..740296f 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -523,14 +523,6 @@ thread->GetRendererHost()->SuddenTerminationChanged(enabled); } -void RendererBlinkPlatformImpl::AddRefProcess() { - ChildProcess::current()->AddRefProcess(); -} - -void RendererBlinkPlatformImpl::ReleaseRefProcess() { - ChildProcess::current()->ReleaseProcess(); -} - blink::WebThread* RendererBlinkPlatformImpl::CompositorThread() const { return compositor_thread_; }
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index b3bde113..5dd2ccd 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -101,8 +101,6 @@ const blink::WebString& cacheStorageCacheName) override; blink::WebString DefaultLocale() override; void SuddenTerminationChanged(bool enabled) override; - void AddRefProcess() override; - void ReleaseRefProcess() override; blink::WebThread* CompositorThread() const override; std::unique_ptr<blink::WebStorageNamespace> CreateLocalStorageNamespace() override;
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc index d54d88dd..117a785 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
@@ -25,12 +25,6 @@ namespace content { -EmbeddedWorkerInstanceClientImpl::WorkerWrapper::WorkerWrapper( - std::unique_ptr<blink::WebEmbeddedWorker> worker) - : worker_(std::move(worker)) {} - -EmbeddedWorkerInstanceClientImpl::WorkerWrapper::~WorkerWrapper() = default; - // static void EmbeddedWorkerInstanceClientImpl::Create( scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner, @@ -42,17 +36,17 @@ } void EmbeddedWorkerInstanceClientImpl::WorkerContextDestroyed() { - DCHECK(wrapper_); + DCHECK(worker_); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::WorkerContextDestroyed"); // Destroys |this|. - wrapper_.reset(); + worker_.reset(); } void EmbeddedWorkerInstanceClientImpl::StartWorker( mojom::EmbeddedWorkerStartParamsPtr params) { DCHECK(ChildThreadImpl::current()); - DCHECK(!wrapper_); + DCHECK(!worker_); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StartWorker"); auto start_timing = mojom::EmbeddedWorkerStartTiming::New(); @@ -88,41 +82,37 @@ UMA_HISTOGRAM_ENUMERATION( "ServiceWorker.EmbeddedWorkerInstanceClient.StartWorker", metric, StartWorkerHistogramEnum::NUM_TYPES); - wrapper_ = StartWorkerContext(std::move(params), std::move(client), - std::move(cache_storage), - std::move(interface_provider), - std::move(privacy_preferences)); + worker_ = StartWorkerContext( + std::move(params), std::move(client), std::move(cache_storage), + std::move(interface_provider), std::move(privacy_preferences)); } void EmbeddedWorkerInstanceClientImpl::StopWorker() { // StopWorker must be called after StartWorker is called. DCHECK(ChildThreadImpl::current()); - DCHECK(wrapper_); + DCHECK(worker_); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker"); - wrapper_->worker()->TerminateWorkerContext(); + worker_->TerminateWorkerContext(); } void EmbeddedWorkerInstanceClientImpl::ResumeAfterDownload() { - DCHECK(wrapper_); - DCHECK(wrapper_->worker()); - wrapper_->worker()->ResumeAfterDownload(); + DCHECK(worker_); + worker_->ResumeAfterDownload(); } void EmbeddedWorkerInstanceClientImpl::AddMessageToConsole( blink::WebConsoleMessage::Level level, const std::string& message) { - DCHECK(wrapper_); - DCHECK(wrapper_->worker()); - wrapper_->worker()->AddMessageToConsole( + DCHECK(worker_); + worker_->AddMessageToConsole( blink::WebConsoleMessage(level, blink::WebString::FromUTF8(message))); } void EmbeddedWorkerInstanceClientImpl::BindDevToolsAgent( blink::mojom::DevToolsAgentAssociatedRequest request) { - DCHECK(wrapper_); - DCHECK(wrapper_->worker()); - wrapper_->worker()->BindDevToolsAgent(request.PassHandle()); + DCHECK(worker_); + worker_->BindDevToolsAgent(request.PassHandle()); } EmbeddedWorkerInstanceClientImpl::EmbeddedWorkerInstanceClientImpl( @@ -143,7 +133,7 @@ temporal_self_.reset(); } -std::unique_ptr<EmbeddedWorkerInstanceClientImpl::WorkerWrapper> +std::unique_ptr<blink::WebEmbeddedWorker> EmbeddedWorkerInstanceClientImpl::StartWorkerContext( mojom::EmbeddedWorkerStartParamsPtr params, std::unique_ptr<ServiceWorkerContextClient> context_client, @@ -159,11 +149,10 @@ std::move(params->installed_scripts_info), io_thread_runner_); } - auto wrapper = - std::make_unique<WorkerWrapper>(blink::WebEmbeddedWorker::Create( - std::move(context_client), std::move(manager), - params->content_settings_proxy.PassHandle(), - cache_storage.PassHandle(), interface_provider.PassHandle())); + auto worker = blink::WebEmbeddedWorker::Create( + std::move(context_client), std::move(manager), + params->content_settings_proxy.PassHandle(), cache_storage.PassHandle(), + interface_provider.PassHandle()); blink::WebEmbeddedWorkerStartData start_data; start_data.script_url = params->script_url; @@ -182,8 +171,8 @@ : blink::WebEmbeddedWorkerStartData::kDontPauseAfterDownload; start_data.privacy_preferences = std::move(privacy_preferences); - wrapper->worker()->StartWorkerContext(start_data); - return wrapper; + worker->StartWorkerContext(start_data); + return worker; } } // namespace content
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.h b/content/renderer/service_worker/embedded_worker_instance_client_impl.h index d86d3387..45260fc8 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.h +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.h
@@ -10,7 +10,6 @@ #include "base/containers/id_map.h" #include "base/single_thread_task_runner.h" #include "content/child/child_thread_impl.h" -#include "content/child/scoped_child_process_reference.h" #include "content/common/service_worker/embedded_worker.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "third_party/blink/public/common/privacy_preferences.h" @@ -69,20 +68,6 @@ void WorkerContextDestroyed(); private: - // A thin wrapper of WebEmbeddedWorker which also adds and releases process - // references automatically. - class WorkerWrapper { - public: - explicit WorkerWrapper(std::unique_ptr<blink::WebEmbeddedWorker> worker); - ~WorkerWrapper(); - - blink::WebEmbeddedWorker* worker() { return worker_.get(); } - - private: - ScopedChildProcessReference process_ref_; - std::unique_ptr<blink::WebEmbeddedWorker> worker_; - }; - EmbeddedWorkerInstanceClientImpl( scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner, mojom::EmbeddedWorkerInstanceClientRequest request); @@ -99,7 +84,7 @@ // Handler of connection error bound to |binding_|. void OnError(); - std::unique_ptr<WorkerWrapper> StartWorkerContext( + std::unique_ptr<blink::WebEmbeddedWorker> StartWorkerContext( mojom::EmbeddedWorkerStartParamsPtr params, std::unique_ptr<ServiceWorkerContextClient> context_client, blink::mojom::CacheStoragePtrInfo cache_storage, @@ -113,7 +98,7 @@ std::unique_ptr<EmbeddedWorkerInstanceClientImpl> temporal_self_; // nullptr means the worker is not running. - std::unique_ptr<WorkerWrapper> wrapper_; + std::unique_ptr<blink::WebEmbeddedWorker> worker_; scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner_;
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index 375571a..22544dc 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -1941,7 +1941,25 @@ // ServiceWorkerContextClient::OnIdleTiemout() has been called. It means // termination has been requested. DCHECK(RequestedTermination()); - (*instance_host_)->RequestTermination(); + (*instance_host_) + ->RequestTermination(base::BindOnce( + &ServiceWorkerContextClient::OnRequestedTermination, GetWeakPtr())); +} + +void ServiceWorkerContextClient::OnRequestedTermination( + bool will_be_terminated) { + DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled()); + DCHECK(context_); + DCHECK(context_->timeout_timer); + + // This worker will be terminated soon. Ignore the message. + if (will_be_terminated) + return; + + // Dispatch a dummy event to run all of queued tasks. This updates the + // idle timer too. + const int event_id = context_->timeout_timer->StartEvent(base::DoNothing()); + context_->timeout_timer->EndEvent(event_id); } bool ServiceWorkerContextClient::RequestedTermination() const {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h index 598860ab..2a2860c4 100644 --- a/content/renderer/service_worker/service_worker_context_client.h +++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -388,6 +388,8 @@ // the last task finished. void OnIdleTimeout(); + void OnRequestedTermination(bool will_be_terminated); + // Returns true if the worker has requested to be terminated by the browser // process. It does this due to idle timeout. bool RequestedTermination() const;
diff --git a/content/renderer/service_worker/service_worker_network_provider.cc b/content/renderer/service_worker/service_worker_network_provider.cc index 64b0d8bc..49dfdfcc 100644 --- a/content/renderer/service_worker/service_worker_network_provider.cc +++ b/content/renderer/service_worker/service_worker_network_provider.cc
@@ -207,13 +207,14 @@ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, + mojom::ControllerServiceWorkerInfoPtr controller_info, scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) { // S13nServiceWorker: |info| holds info about the precreated provider host. if (info) { DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled()); return base::WrapUnique(new ServiceWorkerNetworkProvider( std::move(info), std::move(script_loader_factory_info), - std::move(fallback_loader_factory))); + std::move(controller_info), std::move(fallback_loader_factory))); } return base::WrapUnique(new ServiceWorkerNetworkProvider( @@ -317,12 +318,13 @@ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, + mojom::ControllerServiceWorkerInfoPtr controller_info, scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) { 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(fallback_loader_factory)); + std::move(controller_info), std::move(fallback_loader_factory)); if (script_loader_factory_info.is_valid()) script_loader_factory_.Bind(std::move(script_loader_factory_info)); }
diff --git a/content/renderer/service_worker/service_worker_network_provider.h b/content/renderer/service_worker/service_worker_network_provider.h index 0145765..ea98eb7 100644 --- a/content/renderer/service_worker/service_worker_network_provider.h +++ b/content/renderer/service_worker/service_worker_network_provider.h
@@ -86,10 +86,15 @@ // Creates a ServiceWorkerNetworkProvider for a shared worker (as a // non-document service worker client). + // + // For NetworkService (PlzWorker): + // |controller_info| contains the endpoint and object info that is needed to + // set up the controller service worker for the client. static std::unique_ptr<ServiceWorkerNetworkProvider> CreateForSharedWorker( mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, + mojom::ControllerServiceWorkerInfoPtr controller_info, scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory); // Creates a ServiceWorkerNetworkProvider for a "controller" (i.e. @@ -142,6 +147,7 @@ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, + mojom::ControllerServiceWorkerInfoPtr controller_info, scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory); // This is for controllers, used in CreateForController.
diff --git a/content/renderer/service_worker/thread_safe_script_container.cc b/content/renderer/service_worker/thread_safe_script_container.cc index 6f6e038..83838ce 100644 --- a/content/renderer/service_worker/thread_safe_script_container.cc +++ b/content/renderer/service_worker/thread_safe_script_container.cc
@@ -14,7 +14,8 @@ void ThreadSafeScriptContainer::AddOnIOThread(const GURL& url, std::unique_ptr<Data> data) { base::AutoLock lock(lock_); - script_data_[url] = std::move(data); + ScriptStatus status = data ? ScriptStatus::kReceived : ScriptStatus::kFailed; + script_data_.emplace(url, std::make_pair(status, std::move(data))); if (url == waiting_url_) waiting_cv_.Signal(); } @@ -25,11 +26,7 @@ auto it = script_data_.find(url); if (it == script_data_.end()) return ScriptStatus::kPending; - if (!it->second) - return ScriptStatus::kTaken; - if (!it->second->IsValid()) - return ScriptStatus::kFailed; - return ScriptStatus::kReceived; + return it->second.first; } void ThreadSafeScriptContainer::ResetOnWorkerThread(const GURL& url) { @@ -54,17 +51,19 @@ waiting_cv_.Wait(); } waiting_url_ = GURL(); - // TODO(shimazu): Keep the status for each entries instead of using IsValid(). - const auto& data = script_data_[url]; - return !data || data->IsValid(); + return true; } std::unique_ptr<ThreadSafeScriptContainer::Data> ThreadSafeScriptContainer::TakeOnWorkerThread(const GURL& url) { base::AutoLock lock(lock_); - DCHECK(base::ContainsKey(script_data_, url)) - << "Script should be added before calling Take."; - return std::move(script_data_[url]); + auto it = script_data_.find(url); + DCHECK(it != script_data_.end()) + << "Script should have been received before calling Take"; + std::pair<ScriptStatus, std::unique_ptr<Data>>& pair = it->second; + DCHECK_EQ(ScriptStatus::kReceived, pair.first); + pair.first = ScriptStatus::kTaken; + return std::move(pair.second); } void ThreadSafeScriptContainer::OnAllDataAddedOnIOThread() {
diff --git a/content/renderer/service_worker/thread_safe_script_container.h b/content/renderer/service_worker/thread_safe_script_container.h index c0e8d6d..7ecc7d4f 100644 --- a/content/renderer/service_worker/thread_safe_script_container.h +++ b/content/renderer/service_worker/thread_safe_script_container.h
@@ -7,6 +7,7 @@ #include <map> #include <memory> +#include <utility> #include "base/memory/ref_counted.h" #include "base/synchronization/condition_variable.h" @@ -48,7 +49,9 @@ kPending }; - // Called on the IO thread. + // Adds a script for the |url| to the container, and records status of the + // script as kReceived when |data| is non-null, or kFailed when |data| is + // nullptr. Called on the IO thread. void AddOnIOThread(const GURL& url, std::unique_ptr<Data> data); // Called on the worker thread. @@ -83,7 +86,7 @@ // is added, or OnAllDataAdded is called. The worker thread waits on this, and // the IO thread signals it. base::ConditionVariable waiting_cv_; - std::map<GURL, std::unique_ptr<Data>> script_data_; + std::map<GURL, std::pair<ScriptStatus, std::unique_ptr<Data>>> script_data_; GURL waiting_url_; bool are_all_data_added_; };
diff --git a/content/renderer/service_worker/thread_safe_script_container_unittest.cc b/content/renderer/service_worker/thread_safe_script_container_unittest.cc index a6853ed..47e4543d 100644 --- a/content/renderer/service_worker/thread_safe_script_container_unittest.cc +++ b/content/renderer/service_worker/thread_safe_script_container_unittest.cc
@@ -169,13 +169,13 @@ { bool result = false; WaitOnReaderThread(kKey, &result)->Wait(); - // Waiting for |kKey| should succeed. + // Waiting for |kKey| being already taken should succeed. EXPECT_TRUE(result); - ThreadSafeScriptContainer::Data* taken_data; - TakeOnReaderThread(kKey, &taken_data)->Wait(); - // |taken_data| should be nullptr because it's already taken. - EXPECT_EQ(nullptr, taken_data); + // The status of |kKey| should still be |kTaken|. + ScriptStatus status = ScriptStatus::kFailed; + GetStatusOnReaderThread(kKey, &status)->Wait(); + EXPECT_EQ(ScriptStatus::kTaken, status); } // Finish adding data. @@ -184,13 +184,13 @@ { bool result = false; WaitOnReaderThread(kKey, &result)->Wait(); - // The record has been already added, so Wait shouldn't fail. + // The record is in |kTaken| status, so Wait shouldn't fail. EXPECT_TRUE(result); - ThreadSafeScriptContainer::Data* taken_data; - TakeOnReaderThread(kKey, &taken_data)->Wait(); - // |taken_data| should be nullptr because it's already taken. - EXPECT_EQ(nullptr, taken_data); + // The status of |kKey| should still be |kTaken|. + ScriptStatus status = ScriptStatus::kFailed; + GetStatusOnReaderThread(kKey, &status)->Wait(); + EXPECT_EQ(ScriptStatus::kTaken, status); } }
diff --git a/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl.cc b/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl.cc index 8533648c..6384a5c 100644 --- a/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl.cc +++ b/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl.cc
@@ -202,8 +202,7 @@ DCHECK(receivers); if (!receivers->body()->has_received_all_data() || !receivers->meta_data()->has_received_all_data()) { - script_container_->AddOnIOThread(script_url, - RawScriptData::CreateInvalidInstance()); + script_container_->AddOnIOThread(script_url, nullptr /* data */); running_receivers_.erase(iter); return; } @@ -295,13 +294,13 @@ const bool success = script_container_->WaitOnWorkerThread(script_url); // It can fail due to an error on Mojo pipes. if (!success) - return RawScriptData::CreateInvalidInstance(); + return nullptr; status = script_container_->GetStatusOnWorkerThread(script_url); DCHECK_NE(ThreadSafeScriptContainer::ScriptStatus::kPending, status); } if (status == ThreadSafeScriptContainer::ScriptStatus::kFailed) - return RawScriptData::CreateInvalidInstance(); + return nullptr; DCHECK_EQ(ThreadSafeScriptContainer::ScriptStatus::kReceived, status); return script_container_->TakeOnWorkerThread(script_url);
diff --git a/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl_unittest.cc b/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl_unittest.cc index 5b24150..4cff1d6a 100644 --- a/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl_unittest.cc +++ b/content/renderer/service_worker/web_service_worker_installed_scripts_manager_impl_unittest.cc
@@ -231,8 +231,7 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); - ASSERT_TRUE(script_data); - EXPECT_TRUE(script_data->IsValid()); + EXPECT_TRUE(script_data); ASSERT_EQ(1u, script_data->ScriptTextChunks().size()); ASSERT_EQ(kExpectedBody.size() + 1, script_data->ScriptTextChunks()[0].size()); @@ -270,8 +269,7 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); - ASSERT_TRUE(script_data); - EXPECT_TRUE(script_data->IsValid()); + EXPECT_TRUE(script_data); ASSERT_EQ(1u, script_data->ScriptTextChunks().size()); ASSERT_EQ(kExpectedBody.size() + 1, script_data->ScriptTextChunks()[0].size()); @@ -316,19 +314,17 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); - // script_data->IsValid() should return false since the data pipe for body + // |script_data| should be null since the data pipe for body // gets disconnected during sending. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + EXPECT_FALSE(script_data); } { std::unique_ptr<RawScriptData> script_data; GetRawScriptDataOnWorkerThread(kScriptUrl, &script_data)->Wait(); - // |script_data| should be invalid since the data wasn't received on the + // |script_data| should be null since the data wasn't received on the // renderer process. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + EXPECT_FALSE(script_data); } } @@ -363,19 +359,17 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); - // script_data->IsValid() should return false since the data pipe for meta - // data gets disconnected during sending. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + // |script_data| should be null since the data pipe for meta data gets + // disconnected during sending. + EXPECT_FALSE(script_data); } { std::unique_ptr<RawScriptData> script_data; GetRawScriptDataOnWorkerThread(kScriptUrl, &script_data)->Wait(); - // |script_data| should be invalid since the data wasn't received on the + // |script_data| should be null since the data wasn't received on the // renderer process. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + EXPECT_FALSE(script_data); } } @@ -399,18 +393,16 @@ // Wait for the script's arrival. get_raw_script_data_waiter->Wait(); // |script_data| should be nullptr since no data will arrive. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + EXPECT_FALSE(script_data); } { std::unique_ptr<RawScriptData> script_data; // This should not be blocked because data will not arrive anymore. GetRawScriptDataOnWorkerThread(kScriptUrl, &script_data)->Wait(); - // |script_data| should be invalid since the data wasn't received on the + // |script_data| should be null since the data wasn't received on the // renderer process. - ASSERT_TRUE(script_data); - EXPECT_FALSE(script_data->IsValid()); + EXPECT_FALSE(script_data); } }
diff --git a/content/renderer/service_worker/web_service_worker_registration_impl.cc b/content/renderer/service_worker/web_service_worker_registration_impl.cc index bd98361e..59e3868 100644 --- a/content/renderer/service_worker/web_service_worker_registration_impl.cc +++ b/content/renderer/service_worker/web_service_worker_registration_impl.cc
@@ -321,22 +321,21 @@ base::WrapRefCounted(this))); } -void WebServiceWorkerRegistrationImpl::SetVersionAttributes( - int changed_mask, +void WebServiceWorkerRegistrationImpl::SetServiceWorkerObjects( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, blink::mojom::ServiceWorkerObjectInfoPtr installing, blink::mojom::ServiceWorkerObjectInfoPtr waiting, blink::mojom::ServiceWorkerObjectInfoPtr active) { - ChangedVersionAttributesMask mask(changed_mask); - DCHECK(mask.installing_changed() || !installing); - if (mask.installing_changed()) { + DCHECK(changed_mask->installing || !installing); + if (changed_mask->installing) { SetInstalling(std::move(installing)); } - DCHECK(mask.waiting_changed() || !waiting); - if (mask.waiting_changed()) { + DCHECK(changed_mask->waiting || !waiting); + if (changed_mask->waiting) { SetWaiting(std::move(waiting)); } - DCHECK(mask.active_changed() || !active); - if (mask.active_changed()) { + DCHECK(changed_mask->active || !active); + if (changed_mask->active) { SetActive(std::move(active)); } }
diff --git a/content/renderer/service_worker/web_service_worker_registration_impl.h b/content/renderer/service_worker/web_service_worker_registration_impl.h index e57e362..3f9c385 100644 --- a/content/renderer/service_worker/web_service_worker_registration_impl.h +++ b/content/renderer/service_worker/web_service_worker_registration_impl.h
@@ -128,8 +128,8 @@ const base::Optional<std::string>& error_msg); // Implements blink::mojom::ServiceWorkerRegistrationObject. - void SetVersionAttributes( - int changed_mask, + void SetServiceWorkerObjects( + blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask, blink::mojom::ServiceWorkerObjectInfoPtr installing, blink::mojom::ServiceWorkerObjectInfoPtr waiting, blink::mojom::ServiceWorkerObjectInfoPtr active) override;
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc index 7bf92c0..c29ed56 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -10,7 +10,6 @@ #include "base/feature_list.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "content/child/scoped_child_process_reference.h" #include "content/common/possibly_associated_wrapper_shared_url_loader_factory.h" #include "content/common/url_loader_factory_bundle.h" #include "content/public/common/appcache_info.h" @@ -88,8 +87,11 @@ public: WebServiceWorkerNetworkProviderForSharedWorker( std::unique_ptr<ServiceWorkerNetworkProvider> provider, - bool is_secure_context) - : provider_(std::move(provider)), is_secure_context_(is_secure_context) {} + bool is_secure_context, + std::unique_ptr<NavigationResponseOverrideParameters> response_override) + : provider_(std::move(provider)), + is_secure_context_(is_secure_context), + response_override_(std::move(response_override)) {} // Blink calls this method for each request starting with the main script, // we tag them with the provider id. @@ -97,7 +99,15 @@ auto extra_data = std::make_unique<RequestExtraData>(); extra_data->set_service_worker_provider_id(provider_->provider_id()); extra_data->set_initiated_in_secure_context(is_secure_context_); + if (response_override_) { + DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService)); + DCHECK_EQ(blink::WebURLRequest::kRequestContextSharedWorker, + request.GetRequestContext()); + extra_data->set_navigation_response_override( + std::move(response_override_)); + } request.SetExtraData(std::move(extra_data)); + // If the provider does not have a controller at this point, the renderer // expects subresource requests to never be handled by a controlling service // worker, so set |skip_service_worker| to skip service workers here. @@ -189,6 +199,7 @@ private: std::unique_ptr<ServiceWorkerNetworkProvider> provider_; const bool is_secure_context_; + std::unique_ptr<NavigationResponseOverrideParameters> response_override_; }; } // namespace @@ -205,7 +216,9 @@ int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) @@ -221,6 +234,20 @@ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService) || appcache_host_id == kAppCacheNoHostId); + if (main_script_load_params) { + response_override_ = + std::make_unique<NavigationResponseOverrideParameters>(); + response_override_->url_loader_client_endpoints = + std::move(main_script_load_params->url_loader_client_endpoints); + response_override_->response = main_script_load_params->response_head; + // TODO(nhiroki): Set |response_override_->redirects|. + // (https://crbug.com/715632) + response_override_->redirect_responses = + main_script_load_params->redirect_response_heads; + response_override_->redirect_infos = + main_script_load_params->redirect_infos; + } + impl_ = blink::WebSharedWorker::Create(this); if (pause_on_start) { // Pause worker context when it starts and wait until either DevTools client @@ -230,6 +257,7 @@ service_worker_provider_info_ = std::move(service_worker_provider_info); main_script_loader_factory_ = std::move(main_script_loader_factory); + controller_info_ = std::move(controller_info); // Make the factory bundle. subresource_loader_factories_ = @@ -343,11 +371,11 @@ std::unique_ptr<ServiceWorkerNetworkProvider> provider = ServiceWorkerNetworkProvider::CreateForSharedWorker( std::move(service_worker_provider_info_), - std::move(main_script_loader_factory_), + std::move(main_script_loader_factory_), std::move(controller_info_), subresource_loader_factories_); return std::make_unique<WebServiceWorkerNetworkProviderForSharedWorker>( - std::move(provider), IsOriginSecure(url_)); + std::move(provider), IsOriginSecure(url_), std::move(response_override_)); } void EmbeddedSharedWorkerStub::WaitForServiceWorkerControllerInfo(
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h index d43d1ec7..408fa7c 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.h +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -10,7 +10,6 @@ #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" @@ -21,6 +20,7 @@ #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/mojom/shared_worker/shared_worker_main_script_load_params.mojom.h" #include "third_party/blink/public/platform/web_content_security_policy.h" #include "third_party/blink/public/platform/web_content_settings_client.h" #include "third_party/blink/public/platform/web_string.h" @@ -41,9 +41,11 @@ } namespace content { + class HostChildURLLoaderFactoryBundle; class URLLoaderFactoryBundleInfo; class WebApplicationCacheHostImpl; +struct NavigationResponseOverrideParameters; // A stub class to receive IPC from browser process and talk to // blink::WebSharedWorker. Implements blink::WebSharedWorkerClient. @@ -69,7 +71,9 @@ int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider); @@ -121,7 +125,6 @@ std::pair<int /* connection_request_id */, blink::MessagePortChannel>; std::vector<PendingChannel> pending_channels_; - ScopedChildProcessReference process_ref_; const int appcache_host_id_; WebApplicationCacheHostImpl* app_cache_host_ = nullptr; // Not owned. @@ -134,10 +137,17 @@ // main script. network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory_; + // NetworkService: + mojom::ControllerServiceWorkerInfoPtr controller_info_; + // S13nServiceWorker: The factory bundle used for loading subresources for // this shared worker. scoped_refptr<HostChildURLLoaderFactoryBundle> subresource_loader_factories_; + // NetworkService (PlzWorker): The response override parameters used for + // taking a resource pre-requested by the browser process. + std::unique_ptr<NavigationResponseOverrideParameters> response_override_; + 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 a8c429de..74468218 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.cc +++ b/content/renderer/shared_worker/shared_worker_factory_impl.cc
@@ -31,8 +31,10 @@ service_worker_provider_info, int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo - script_loader_factory_ptr_info, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, + main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) { @@ -41,9 +43,10 @@ std::move(info), pause_on_start, devtools_worker_token, renderer_preferences, std::move(preference_watcher_request), std::move(content_settings), std::move(service_worker_provider_info), - appcache_host_id, std::move(script_loader_factory_ptr_info), - std::move(subresource_loaders), std::move(host), std::move(request), - std::move(interface_provider)); + appcache_host_id, std::move(main_script_loader_factory), + std::move(main_script_load_params), + std::move(subresource_loader_factories), std::move(controller_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 42433c91..0f137e0 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.h +++ b/content/renderer/shared_worker/shared_worker_factory_impl.h
@@ -32,8 +32,10 @@ service_worker_provider_info, int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo - script_loader_factory_ptr_info, - std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, + main_script_loader_factory, + blink::mojom::SharedWorkerMainScriptLoadParamsPtr main_script_load_params, + std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, + mojom::ControllerServiceWorkerInfoPtr controller_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) override;
diff --git a/content/shell/app/shell_content_main.cc b/content/shell/app/shell_content_main.cc index 24c1f41..7c8589f 100644 --- a/content/shell/app/shell_content_main.cc +++ b/content/shell/app/shell_content_main.cc
@@ -7,11 +7,21 @@ #include "build/build_config.h" #include "content/public/app/content_main.h" #include "content/shell/app/shell_main_delegate.h" +#include "content/shell/common/shell_switches.h" #if defined(OS_MACOSX) int ContentMain(int argc, const char** argv) { - content::ShellMainDelegate delegate; + bool is_browsertest = false; + std::string browser_test_flag(std::string("--") + + switches::kContentBrowserTest); + for (int i = 0; i < argc; ++i) { + if (browser_test_flag == argv[i]) { + is_browsertest = true; + break; + } + } + content::ShellMainDelegate delegate(is_browsertest); content::ContentMainParams params(&delegate); params.argc = argc; params.argv = argv;
diff --git a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc index 1f4baf4..dc1023bc 100644 --- a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc +++ b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc
@@ -61,15 +61,10 @@ if (!client_) return download::Client::ShouldDownload::ABORT; - // TODO(crbug.com/863949): In-memory downloads don't properly populate - // |url_chain| and |headers| for this method call. Augment success instead. - auto mock_headers = - base::MakeRefCounted<const net::HttpResponseHeaders>("200 OK\r\n\r\n"); - client_->OnDownloadStarted( guid_to_unique_job_id_mapping_[guid], guid, - std::make_unique<content::BackgroundFetchResponse>( - url_chain, std::move(mock_headers))); + std::make_unique<content::BackgroundFetchResponse>(url_chain, + std::move(headers))); return download::Client::ShouldDownload::CONTINUE; }
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc index e0ed46f..67e478a 100644 --- a/content/shell/browser/shell_content_browser_client.cc +++ b/content/shell/browser/shell_content_browser_client.cc
@@ -291,6 +291,16 @@ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kRegisterFontFiles)); } + +#if defined(OS_MACOSX) + // Needed since on Mac, content_browsertests doesn't use + // content_test_launcher.cc and instead uses shell_main.cc. So give a signal + // to shell_main.cc that it's a browser test. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kContentBrowserTest)) { + command_line->AppendSwitch(switches::kContentBrowserTest); + } +#endif } std::string ShellContentBrowserClient::GetAcceptLangs(BrowserContext* context) {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 862228af..7c50c7d 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1625,6 +1625,7 @@ "../browser/web_package/signed_exchange_prologue_unittest.cc", "../browser/web_package/signed_exchange_signature_header_field_unittest.cc", "../browser/web_package/signed_exchange_signature_verifier_unittest.cc", + "../browser/web_package/signed_exchange_utils_unittest.cc", "../browser/webrtc/webrtc_internals_message_handler_unittest.cc", "../browser/webrtc/webrtc_internals_unittest.cc", "../browser/websockets/websocket_manager_unittest.cc", @@ -1979,8 +1980,6 @@ "../browser/renderer_host/pepper/pepper_printing_host_unittest.cc", "../browser/renderer_host/pepper/pepper_proxy_lookup_helper_unittest.cc", "../browser/renderer_host/pepper/quota_reservation_unittest.cc", - "../renderer/media/pepper/pepper_to_video_track_adapter_unittest.cc", - "../renderer/media/pepper/video_track_to_pepper_adapter_unittest.cc", "../renderer/pepper/event_conversion_unittest.cc", "../renderer/pepper/host_var_tracker_unittest.cc", "../renderer/pepper/mock_resource.h",
diff --git a/content/test/data/browsing_data/media_license.html b/content/test/data/browsing_data/media_license.html deleted file mode 100644 index 251f6fe..0000000 --- a/content/test/data/browsing_data/media_license.html +++ /dev/null
@@ -1,81 +0,0 @@ -<html> -<script> - - function success_() { - domAutomationController.send(true); - } - - function failure_() { - domAutomationController.send(false); - } - - // EME creates session IDs dynamically, so we have no idea what it will be. - // As the tests only need to create a single session, keep track of the - // last session ID created. - var savedSessionId = 'unknown'; - - function createPersistentSession() { - // This function creates a persistent-license type session, and resolves - // with the created session object on success. - return navigator.requestMediaKeySystemAccess( - 'org.chromium.externalclearkey', [{ - initDataTypes: ['keyids'], - audioCapabilities: [ - // Include a set of codecs that should cover all user agents. - {contentType: 'audio/mp4; codecs="mp4a.40.2"'}, - {contentType: 'audio/webm; codecs="opus"'} - ], - persistentState: 'required', - sessionTypes: ['persistent-license'], - }]) - .then(function(access) { - return access.createMediaKeys(); - }) - .then(function(mediaKeys) { - return mediaKeys.createSession('persistent-license'); - }); - } - - function handleMessageEvent(e) { - var session = e.target; - var te = new TextEncoder(); - var license = te.encode( - '{"keys":[{"kty":"oct","k":"tQ0bJVWb6b0KPL6KtZIy_A","kid":"LwVHf8JLtPrv2GUXFW2v_A"}],"type":"persistent-license"}'); - - savedSessionId = session.sessionId; - session.update(license).then(success_, failure_); - } - - function setMediaLicense() { - var te = new TextEncoder(); - var initData = te.encode('{"kids":["LwVHf8JLtPrv2GUXFW2v_A"]}'); - - createPersistentSession().then(function(session) { - // generateRequest() will trigger a 'message' event, which we need to - // wait for in order to call update() which provides the license. - session.addEventListener('message', handleMessageEvent, false); - return session.generateRequest('keyids', initData); - }) - // Success is reported from handleMessageEvent(). - .catch(failure_); - } - - function hasMediaLicense() { - createPersistentSession().then(function(session) { - return session.load(savedSessionId); - }) - .then(function(result) { - // |result| is a boolean, indicating if the session was loaded or not. - domAutomationController.send(result); - }) - .catch(failure_); - } -</script> - -<body> - This page is used to test creation and deletion of Media Licenses. - The functions are called from BrowsingDataRemoverBrowserTest::HasDataForType - and BrowsingDataRemoverBrowserTest::SetDataForType. -</body> - -</html> \ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/context_lost_expectations.py b/content/test/gpu/gpu_tests/context_lost_expectations.py index 93ba677c..d95a4f9 100644 --- a/content/test/gpu/gpu_tests/context_lost_expectations.py +++ b/content/test/gpu/gpu_tests/context_lost_expectations.py
@@ -65,8 +65,8 @@ self.Fail('ContextLost_WebGLContextLostFromQuantity', ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611906) - # Android NVIDIA (Nexus 9, SHIELD TV) + # Android self.Fail('ContextLost_WorkerRAFAfterGPUCrash', - ['android', 'nvidia'], bug=851213) + ['android'], bug=880078) self.Fail('ContextLost_WorkerRAFAfterGPUCrash_OOPD', - ['android', 'nvidia'], bug=851213) + ['android'], bug=880078)
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index d155b82..a6b5b3d 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc
@@ -53,7 +53,6 @@ TestRenderFrameHost::TestRenderFrameHost(SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id, @@ -62,7 +61,6 @@ : RenderFrameHostImpl(site_instance, render_view_host, delegate, - rwh_delegate, frame_tree, frame_tree_node, routing_id,
diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h index be49874..5303c37 100644 --- a/content/test/test_render_frame_host.h +++ b/content/test/test_render_frame_host.h
@@ -49,7 +49,6 @@ TestRenderFrameHost(SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id,
diff --git a/content/test/test_render_frame_host_factory.cc b/content/test/test_render_frame_host_factory.cc index c6c9116..9d4b8c9 100644 --- a/content/test/test_render_frame_host_factory.cc +++ b/content/test/test_render_frame_host_factory.cc
@@ -23,7 +23,6 @@ SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id, @@ -31,8 +30,8 @@ bool hidden, bool renderer_initiated_creation) { return std::make_unique<TestRenderFrameHost>( - site_instance, render_view_host, delegate, rwh_delegate, frame_tree, - frame_tree_node, routing_id, widget_routing_id, hidden); + site_instance, render_view_host, delegate, frame_tree, frame_tree_node, + routing_id, widget_routing_id, hidden); } } // namespace content
diff --git a/content/test/test_render_frame_host_factory.h b/content/test/test_render_frame_host_factory.h index f72c02f..62a1527 100644 --- a/content/test/test_render_frame_host_factory.h +++ b/content/test/test_render_frame_host_factory.h
@@ -31,7 +31,6 @@ SiteInstance* site_instance, RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, - RenderWidgetHostDelegate* rwh_delegate, FrameTree* frame_tree, FrameTreeNode* frame_tree_node, int32_t routing_id,
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index b8eca557..a1f1919 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -20,6 +20,7 @@ #include "services/service_manager/sandbox/sandbox.h" #if defined(OS_LINUX) +#include "services/audio/audio_sandbox_hook_linux.h" #include "services/network/network_sandbox_hook_linux.h" #include "services/service_manager/sandbox/linux/sandbox_linux.h" #endif @@ -71,10 +72,14 @@ auto sandbox_type = service_manager::SandboxTypeFromCommandLine(parameters.command_line); if (parameters.zygote_child || - sandbox_type == service_manager::SANDBOX_TYPE_NETWORK) { + sandbox_type == service_manager::SANDBOX_TYPE_NETWORK || + sandbox_type == service_manager::SANDBOX_TYPE_AUDIO) { service_manager::SandboxLinux::PreSandboxHook pre_sandbox_hook; if (sandbox_type == service_manager::SANDBOX_TYPE_NETWORK) pre_sandbox_hook = base::BindOnce(&network::NetworkPreSandboxHook); + else if (sandbox_type == service_manager::SANDBOX_TYPE_AUDIO) + pre_sandbox_hook = base::BindOnce(&audio::AudioPreSandboxHook); + service_manager::Sandbox::Initialize( sandbox_type, std::move(pre_sandbox_hook), service_manager::SandboxLinux::Options());
diff --git a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java index a1df8498..856f947 100644 --- a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java +++ b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java
@@ -522,11 +522,11 @@ static class FakeBluetoothGatt extends Wrappers.BluetoothGattWrapper { final FakeBluetoothDevice mDevice; final ArrayList<Wrappers.BluetoothGattServiceWrapper> mServices; - boolean mReadCharacteristicWillFailSynchronouslyOnce = false; - boolean mSetCharacteristicNotificationWillFailSynchronouslyOnce = false; - boolean mWriteCharacteristicWillFailSynchronouslyOnce = false; - boolean mReadDescriptorWillFailSynchronouslyOnce = false; - boolean mWriteDescriptorWillFailSynchronouslyOnce = false; + boolean mReadCharacteristicWillFailSynchronouslyOnce; + boolean mSetCharacteristicNotificationWillFailSynchronouslyOnce; + boolean mWriteCharacteristicWillFailSynchronouslyOnce; + boolean mReadDescriptorWillFailSynchronouslyOnce; + boolean mWriteDescriptorWillFailSynchronouslyOnce; public FakeBluetoothGatt(FakeBluetoothDevice device) { super(null, null);
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc index 8850c0cd..8d53f17 100644 --- a/device/fido/make_credential_task.cc +++ b/device/fido/make_credential_task.cc
@@ -58,6 +58,7 @@ IsClientPinOptionCompatible(device(), request_parameter_)) { MakeCredential(); } else { + device()->set_supported_protocol(ProtocolVersion::kU2f); U2fRegister(); } } @@ -77,6 +78,7 @@ return; } + DCHECK_EQ(ProtocolVersion::kU2f, device()->supported_protocol()); register_operation_ = std::make_unique<U2fRegisterOperation>( device(), request_parameter_, std::move(callback_)); register_operation_->Start();
diff --git a/device/fido/make_credential_task_unittest.cc b/device/fido/make_credential_task_unittest.cc index ceb35ae..b150e876 100644 --- a/device/fido/make_credential_task_unittest.cc +++ b/device/fido/make_credential_task_unittest.cc
@@ -151,6 +151,7 @@ const auto task = CreateMakeCredentialTask(device.get()); make_credential_callback_receiver().WaitForCallback(); + EXPECT_EQ(ProtocolVersion::kU2f, device->supported_protocol()); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, make_credential_callback_receiver().status()); EXPECT_TRUE(make_credential_callback_receiver().value());
diff --git a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadMappings.java b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadMappings.java index debc6bd..e6a058aa 100644 --- a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadMappings.java +++ b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadMappings.java
@@ -270,8 +270,8 @@ } private static class XboxOneS2016FirmwareMappings extends GamepadMappings { - private boolean mLeftTriggerActivated = false; - private boolean mRightTriggerActivated = false; + private boolean mLeftTriggerActivated; + private boolean mRightTriggerActivated; /** * Method for mapping Xbox One S controller (in Bluetooth mode) to
diff --git a/device/vr/orientation/orientation_device_provider_unittest.cc b/device/vr/orientation/orientation_device_provider_unittest.cc index 2909230..d4fc8cf 100644 --- a/device/vr/orientation/orientation_device_provider_unittest.cc +++ b/device/vr/orientation/orientation_device_provider_unittest.cc
@@ -38,7 +38,7 @@ mojo::MakeRequest(&sensor_ptr_)); shared_buffer_handle_ = mojo::SharedBufferHandle::Create( sizeof(SensorReadingSharedBuffer) * - static_cast<uint64_t>(mojom::SensorType::LAST)); + (static_cast<uint64_t>(mojom::SensorType::kMaxValue) + 1)); service_manager::mojom::ConnectorRequest request; connector_ = service_manager::Connector::Create(&request);
diff --git a/device/vr/orientation/orientation_device_unittest.cc b/device/vr/orientation/orientation_device_unittest.cc index 96cc3a8..9934679 100644 --- a/device/vr/orientation/orientation_device_unittest.cc +++ b/device/vr/orientation/orientation_device_unittest.cc
@@ -84,7 +84,7 @@ shared_buffer_handle_ = mojo::SharedBufferHandle::Create( sizeof(SensorReadingSharedBuffer) * - static_cast<uint64_t>(mojom::SensorType::LAST)); + (static_cast<uint64_t>(mojom::SensorType::kMaxValue) + 1)); shared_buffer_mapping_ = shared_buffer_handle_->MapAtOffset( mojom::SensorInitParams::kReadBufferSizeForTests, GetBufferOffset());
diff --git a/docs/testing/layout_tests.md b/docs/testing/layout_tests.md index 60aa9c4..88df0af 100644 --- a/docs/testing/layout_tests.md +++ b/docs/testing/layout_tests.md
@@ -85,18 +85,18 @@ *** To run only some of the tests, specify their directories or filenames as -arguments to `run_webkit_tests.py` relative to the layout test directory +arguments to `run_web_tests.py` relative to the layout test directory (`src/third_party/WebKit/LayoutTests`). For example, to run the fast form tests, use: ```bash -third_party/blink/tools/run_web_tests.py fast/forms +python third_party/blink/tools/run_web_tests.py fast/forms ``` Or you could use the following shorthand: ```bash -third_party/blink/tools/run_web_tests.py fast/fo\* +python third_party/blink/tools/run_web_tests.py fast/fo\* ``` *** promo @@ -104,7 +104,7 @@ test the SVG tests and run pixel tests, you would run: ```bash -third_party/blink/tools/run_web_tests.py -t Default svg +python third_party/blink/tools/run_web_tests.py -t Default svg ``` *** @@ -125,7 +125,11 @@ but this requires a manual diff against expected results, because the shell doesn't do it for you. -To see a complete list of arguments supported, run: `run_web_tests.py --help` +To see a complete list of arguments supported, run: + +```bash +python run_web_tests.py --help +``` *** note **Linux Note:** We try to match the Windows render tree output exactly by @@ -199,7 +203,7 @@ * Using `--additional-driver-flag`: ```bash - run_web_tests.py --additional-driver-flag=--blocking-repaint + python run_web_tests.py --additional-driver-flag=--blocking-repaint ``` This tells the test harness to pass `--blocking-repaint` to the @@ -284,16 +288,16 @@ * Type: **Bug** * Labels: **Test-Layout** -You can also use the _Layout Test Failure_ template, which will pre-set these +You can also use the _Layout Test Failure_ template, which pre-sets these labels for you. ## Debugging Layout Tests -After the layout tests run, you should get a summary of tests that pass or fail. -If something fails unexpectedly (a new regression), you will get a content_shell -window with a summary of the unexpected failures. Or you might have a failing -test in mind to investigate. In any case, here are some steps and tips for -finding the problem. +After the layout tests run, you should get a summary of tests that pass or +fail. If something fails unexpectedly (a new regression), you will get a +`content_shell` window with a summary of the unexpected failures. Or you might +have a failing test in mind to investigate. In any case, here are some steps and +tips for finding the problem. * Take a look at the result. Sometimes tests just need to be rebaselined (see below) to account for changes introduced in your patch. @@ -317,10 +321,10 @@ spacing or box sizes are often unimportant, especially around fonts and form controls. Differences in wording of JS error messages are also usually acceptable. - * `./run_webkit_tests.py path/to/your/test.html --full-results-html` will - produce a page including links to the expected result, actual result, and - diff. - * Add the `--sources` option to `run_webkit_tests.py` to see exactly which + * `python run_web_tests.py path/to/your/test.html --full-results-html` + produces a page including links to the expected result, actual result, + and diff. + * Add the `--sources` option to `run_web_tests.py` to see exactly which expected result it's comparing to (a file next to the test, something in platform/mac/, something in platform/chromium-win/, etc.) * If you're still sure it's correct, rebaseline the test (see below). @@ -364,23 +368,23 @@ ```bash cd src/third_party/blink/tools -./run_blink_httpd.py +python run_blink_httpd.py ``` -The layout tests will be served from `http://127.0.0.1:8000`. For example, to +The layout tests are served from `http://127.0.0.1:8000/`. For example, to run the test `LayoutTest/http/tests/serviceworker/chromium/service-worker-allowed.html`, navigate to `http://127.0.0.1:8000/serviceworker/chromium/service-worker-allowed.html`. Some -tests will behave differently if you go to 127.0.0.1 vs localhost, so use -127.0.0.1. +tests behave differently if you go to `127.0.0.1` vs. `localhost`, so use +`127.0.0.1`. To kill the server, hit any key on the terminal where `run_blink_httpd.py` is -running, or just use `taskkill` or the Task Manager on Windows, and `killall` or -Activity Monitor on MacOS. +running, use `taskkill` or the Task Manager on Windows, or `killall` or +Activity Monitor on macOS. -The test server sets up an alias to `LayoutTests/resources` directory. In HTTP -tests, you can access testing framework at e.g. +The test server sets up an alias to the `LayoutTests/resources` directory. For +example, in HTTP tests, you can access the testing framework using `src="/js-test-resources/js-test.js"`. ### Tips @@ -408,10 +412,10 @@ ### Debugging DevTools Tests -* Add `debug_devtools=true` to args.gn and compile: `autoninja -C out/Default devtools_frontend_resources` +* Add `debug_devtools=true` to `args.gn` and compile: `autoninja -C out/Default devtools_frontend_resources` > Debug DevTools lets you avoid having to recompile after every change to the DevTools front-end. * Do one of the following: - * Option A) Run from the chromium/src folder: + * Option A) Run from the `chromium/src` folder: `third_party/blink/tools/run_web_tests.sh --additional-driver-flag='--debug-devtools' --additional-driver-flag='--remote-debugging-port=9222' @@ -449,7 +453,7 @@ To set up an automated bisect of a layout test regression, create a script like this: -``` +```bash #!/bin/bash # Exit code 125 tells git bisect to skip the revision. @@ -464,7 +468,7 @@ Modify the `out` directory, ninja args, and test name as appropriate, and save the script in `~/checkrev.sh`. Then run: -``` +```bash chmod u+x ~/checkrev.sh # mark script as executable git bisect start <badrev> <goodrev> git bisect run ~/checkrev.sh @@ -482,7 +486,7 @@ ```bash cd src/third_party/blink -tools/run_web_tests.py --reset-results foo/bar/test.html +python tools/run_web_tests.py --reset-results foo/bar/test.html ``` If there are current expectation files for `LayoutTests/foo/bar/test.html`, @@ -506,7 +510,7 @@ ```bash cd src/third_party/blink -tools/run_web_tests.py --additional-driver-flag=--enable-flag --reset-results foo/bar/test.html +python tools/run_web_tests.py --additional-driver-flag=--enable-flag --reset-results foo/bar/test.html ``` New baselines will be created in the flag-specific baselines directory, e.g.
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc index cbf8b12..a7469ade 100644 --- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc +++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
@@ -150,7 +150,7 @@ extension->id(), extension->location()); for (const std::string& match : script_value.matches) { URLPattern pattern(UserScript::ValidUserScriptSchemes(allowed_everywhere)); - if (pattern.Parse(match) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(match) != URLPattern::ParseResult::kSuccess) { *error = errors::kInvalidMatches; return std::unique_ptr<extensions::UserScript>(); } @@ -165,7 +165,7 @@ URLPattern pattern( UserScript::ValidUserScriptSchemes(allowed_everywhere)); - if (pattern.Parse(exclude_match) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(exclude_match) != URLPattern::ParseResult::kSuccess) { *error = errors::kInvalidExcludeMatches; return std::unique_ptr<extensions::UserScript>(); }
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index eaea366..074d6821 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -30,6 +30,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/resource_context.h" #include "content/public/browser/resource_request_info.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" @@ -141,6 +142,10 @@ keys::kOnHeadersReceivedEvent, }; +// User data key for WebRequestAPI::ProxySet. +const void* const kWebRequestProxySetUserDataKey = + &kWebRequestProxySetUserDataKey; + const char* GetRequestStageAsString( ExtensionWebRequestEventRouter::EventTypes type) { switch (type) { @@ -387,6 +392,19 @@ return std::make_unique<WebRequestEventDetails>(request, extra_info_spec); } +void MaybeProxyAuthRequestOnIO( + content::ResourceContext* resource_context, + net::AuthChallengeInfo* auth_info, + scoped_refptr<net::HttpResponseHeaders> response_headers, + const content::GlobalRequestID& request_id, + WebRequestAPI::AuthRequestCallback callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + auto* proxies = + WebRequestAPI::ProxySet::GetFromResourceContext(resource_context); + proxies->MaybeProxyAuthRequest(auth_info, std::move(response_headers), + request_id, std::move(callback)); +} + } // namespace void WebRequestAPI::Proxy::HandleAuthRequest( @@ -401,16 +419,25 @@ } WebRequestAPI::ProxySet::ProxySet() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); + DCHECK_CURRENTLY_ON(BrowserThread::IO); } WebRequestAPI::ProxySet::~ProxySet() { DCHECK_CURRENTLY_ON(BrowserThread::IO); } +WebRequestAPI::ProxySet* WebRequestAPI::ProxySet::GetFromResourceContext( + content::ResourceContext* resource_context) { + if (!resource_context->GetUserData(kWebRequestProxySetUserDataKey)) { + resource_context->SetUserData(kWebRequestProxySetUserDataKey, + std::make_unique<WebRequestAPI::ProxySet>()); + } + return static_cast<WebRequestAPI::ProxySet*>( + resource_context->GetUserData(kWebRequestProxySetUserDataKey)); +} + void WebRequestAPI::ProxySet::AddProxy(std::unique_ptr<Proxy> proxy) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(!is_shutdown_); proxies_.insert(std::move(proxy)); } @@ -430,13 +457,6 @@ proxies_.erase(proxy_it); } -void WebRequestAPI::ProxySet::Shutdown() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - is_shutdown_ = true; - - proxies_.clear(); -} - void WebRequestAPI::ProxySet::AssociateProxyWithRequestId( Proxy* proxy, const content::GlobalRequestID& id) { @@ -490,7 +510,6 @@ WebRequestAPI::WebRequestAPI(content::BrowserContext* context) : browser_context_(context), info_map_(ExtensionSystem::Get(browser_context_)->info_map()), - proxies_(base::MakeRefCounted<ProxySet>()), request_id_generator_(base::MakeRefCounted<RequestIDGenerator>()), may_have_proxies_(MayHaveProxies()), rules_monitor_observer_(this), @@ -516,10 +535,6 @@ } WebRequestAPI::~WebRequestAPI() { - proxies_->SetAPIDestroyed(); - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::BindOnce(&ProxySet::Shutdown, std::move(proxies_))); } void WebRequestAPI::Shutdown() { @@ -614,7 +629,7 @@ is_for_browser_initiated_requests ? -1 : frame->GetProcess()->GetID(), request_id_generator_, std::move(navigation_ui_data), base::Unretained(info_map_), std::move(proxied_request), - std::move(target_factory_info), proxies_)); + std::move(target_factory_info))); return true; } @@ -632,7 +647,8 @@ proxied_request_id.child_id = -1; BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, - base::BindOnce(&ProxySet::MaybeProxyAuthRequest, proxies_, + base::BindOnce(&MaybeProxyAuthRequestOnIO, + browser_context_->GetResourceContext(), base::RetainedRef(auth_info), std::move(response_headers), proxied_request_id, std::move(callback))); return true; @@ -660,8 +676,7 @@ frame->GetProcess()->GetBrowserContext(), frame->GetProcess()->GetBrowserContext()->GetResourceContext(), base::Unretained(info_map_), std::move(proxied_socket_ptr_info), - std::move(proxied_request), std::move(authentication_request), - proxies_)); + std::move(proxied_request), std::move(authentication_request))); } bool WebRequestAPI::MayHaveProxies() const { @@ -783,7 +798,7 @@ URLPattern::SCHEME_EXTENSION | URLPattern::SCHEME_WS | URLPattern::SCHEME_WSS); if (!urls_value->GetString(i, &url) || - pattern.Parse(url) != URLPattern::PARSE_SUCCESS) { + pattern.Parse(url) != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessage( keys::kInvalidRequestFilterUrl, url); return false;
diff --git a/extensions/browser/api/web_request/web_request_api.h b/extensions/browser/api/web_request/web_request_api.h index 277ab61..8c96d95 100644 --- a/extensions/browser/api/web_request/web_request_api.h +++ b/extensions/browser/api/web_request/web_request_api.h
@@ -105,31 +105,21 @@ }; // A ProxySet is a set of proxies used by WebRequestAPI: It holds Proxy - // instances, and removes all proxies when the WebRequestAPI instance is - // gone, on the IO thread. - // This proxy set is created on the UI thread but anything else other than - // AddRef() and Release() including destruction will be done in the IO thread. - class ProxySet : public base::RefCountedThreadSafe< - ProxySet, - content::BrowserThread::DeleteOnIOThread> { + // instances, and removes all proxies when the ResourceContext it is bound to + // is destroyed. + class ProxySet : public base::SupportsUserData::Data { public: ProxySet(); + ~ProxySet() override; - // Add a Proxy. This can be called only when |is_shutdown()| is false. + // Gets or creates a ProxySet from the given ResourceContext. + static ProxySet* GetFromResourceContext( + content::ResourceContext* resource_context); + + // Add a Proxy. void AddProxy(std::unique_ptr<Proxy> proxy); // Remove a Proxy. The removed proxy is deleted upon this call. void RemoveProxy(Proxy* proxy); - // Set is_shutdown_ and deletes app proxies. - void Shutdown(); - bool is_shutdown() const { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - return is_shutdown_; - } - - // Threadsafe methods to check and set if the WebRequestAPI has been - // destroyed. - void SetAPIDestroyed() { api_destroyed_.Set(); } - bool IsAPIDestroyed() { return api_destroyed_.IsSet(); } // Associates |proxy| with |id|. |proxy| must already be registered within // this ProxySet. @@ -153,31 +143,16 @@ AuthRequestCallback callback); private: - friend struct content::BrowserThread::DeleteOnThread< - content::BrowserThread::IO>; - friend class base::DeleteHelper<ProxySet>; - - ~ProxySet(); - // Although these members are initialized on the UI thread, we expect at // least one memory barrier before actually calling Generate in the IO // thread, so we don't protect them with a lock. std::set<std::unique_ptr<Proxy>, base::UniquePtrComparator> proxies_; - bool is_shutdown_ = false; // Bi-directional mapping between request ID and Proxy for faster lookup. std::map<content::GlobalRequestID, Proxy*> request_id_to_proxy_map_; std::map<Proxy*, std::set<content::GlobalRequestID>> proxy_to_request_id_map_; - // Tracks whether the WebRequestAPI has been destroyed. Since WebRequestAPI - // is destroyed on the UI thread, and ProxySet is destroyed on the IO - // thread, there may be race conditions where a Proxy mojo pipe receives a - // connection error after WebRequestAPI is destroyed but before the ProxySet - // has been destroyed. Before running any error handlers, make sure to check - // this flag. - base::AtomicFlag api_destroyed_; - DISALLOW_COPY_AND_ASSIGN(ProxySet); }; @@ -276,9 +251,6 @@ content::BrowserContext* const browser_context_; InfoMap* const info_map_; - // Active proxies. Only used when the Network Service is enabled. - scoped_refptr<ProxySet> proxies_; - scoped_refptr<RequestIDGenerator> request_id_generator_; // Stores the last result of |MayHaveProxies()|, so it can be used in
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc index 957c6e4..72571f4 100644 --- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc +++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -522,9 +522,6 @@ } void WebRequestProxyingURLLoaderFactory::InProgressRequest::OnRequestError( const network::URLLoaderCompletionStatus& status) { - if (factory_->proxies_->IsAPIDestroyed()) - return; - if (!request_completed_) { target_client_->OnComplete(status); ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred( @@ -587,16 +584,15 @@ std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, InfoMap* info_map, network::mojom::URLLoaderFactoryRequest loader_request, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, - scoped_refptr<WebRequestAPI::ProxySet> proxies) { + network::mojom::URLLoaderFactoryPtrInfo target_factory_info) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (proxies->is_shutdown()) - return; + auto* proxies = + WebRequestAPI::ProxySet::GetFromResourceContext(resource_context); auto proxy = std::make_unique<WebRequestProxyingURLLoaderFactory>( browser_context, resource_context, render_process_id, std::move(request_id_generator), std::move(navigation_ui_data), info_map, - std::move(loader_request), std::move(target_factory_info), proxies.get()); + std::move(loader_request), std::move(target_factory_info), proxies); proxies->AddProxy(std::move(proxy)); }
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h index 12b402b..534b3e12 100644 --- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h +++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
@@ -169,8 +169,7 @@ std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, InfoMap* info_map, network::mojom::URLLoaderFactoryRequest loader_request, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, - scoped_refptr<WebRequestAPI::ProxySet> proxies); + network::mojom::URLLoaderFactoryPtrInfo target_factory_info); // network::mojom::URLLoaderFactory: void CreateLoaderAndStart(network::mojom::URLLoaderRequest loader_request,
diff --git a/extensions/browser/api/web_request/web_request_proxying_websocket.cc b/extensions/browser/api/web_request/web_request_proxying_websocket.cc index dc569e9..16dfd80 100644 --- a/extensions/browser/api/web_request/web_request_proxying_websocket.cc +++ b/extensions/browser/api/web_request/web_request_proxying_websocket.cc
@@ -265,17 +265,16 @@ InfoMap* info_map, network::mojom::WebSocketPtrInfo proxied_socket_ptr_info, network::mojom::WebSocketRequest proxied_request, - network::mojom::AuthenticationHandlerRequest auth_request, - scoped_refptr<WebRequestAPI::ProxySet> proxies) { + network::mojom::AuthenticationHandlerRequest auth_request) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (proxies->is_shutdown()) - return; + auto* proxies = + WebRequestAPI::ProxySet::GetFromResourceContext(resource_context); auto proxy = std::make_unique<WebRequestProxyingWebSocket>( process_id, render_frame_id, origin, browser_context, resource_context, info_map, std::move(request_id_generator), network::mojom::WebSocketPtr(std::move(proxied_socket_ptr_info)), - std::move(proxied_request), std::move(auth_request), proxies.get()); + std::move(proxied_request), std::move(auth_request), proxies); proxies->AddProxy(std::move(proxy)); } @@ -400,10 +399,7 @@ } void WebRequestProxyingWebSocket::OnError(int error_code) { - if (proxies_->IsAPIDestroyed()) - return; - - if (!is_done_) { + if (!is_done_ && info_.has_value()) { is_done_ = true; ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred( browser_context_, info_map_, &info_.value(), true /* started */,
diff --git a/extensions/browser/api/web_request/web_request_proxying_websocket.h b/extensions/browser/api/web_request/web_request_proxying_websocket.h index 29bd415..88ff6f3 100644 --- a/extensions/browser/api/web_request/web_request_proxying_websocket.h +++ b/extensions/browser/api/web_request/web_request_proxying_websocket.h
@@ -94,8 +94,7 @@ InfoMap* info_map, network::mojom::WebSocketPtrInfo proxied_socket_ptr_info, network::mojom::WebSocketRequest proxied_request, - network::mojom::AuthenticationHandlerRequest auth_request, - scoped_refptr<WebRequestAPI::ProxySet> proxies); + network::mojom::AuthenticationHandlerRequest auth_request); private: void OnBeforeRequestComplete(int error_code);
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index bdecc6b..837466b 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1332,6 +1332,8 @@ AUTOTESTPRIVATE_ISAPPSHOWN = 1269, ENTERPRISEREPORTINGPRIVATE_GETDEVICEID = 1270, ENTERPRISE_HARDWAREPLATFORM_GETHARDWAREPLATFORMINFO = 1271, + FILEMANAGERPRIVATEINTERNAL_SHAREPATHWITHCROSTINICONTAINER = 1272, + AUTOTESTPRIVATE_SETCROSTINIENABLED = 1273, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/updater/update_service.cc b/extensions/browser/updater/update_service.cc index 090cd7ba..b1908b7 100644 --- a/extensions/browser/updater/update_service.cc +++ b/extensions/browser/updater/update_service.cc
@@ -106,7 +106,8 @@ } bool UpdateService::CanUpdate(const std::string& extension_id) const { - if (!base::FeatureList::IsEnabled(features::kNewExtensionUpdaterService)) + if (!base::FeatureList::IsEnabled( + extensions_features::kNewExtensionUpdaterService)) return false; // It's possible to change Webstore update URL from command line (through // apps-gallery-update-url command line switch). When Webstore update URL is
diff --git a/extensions/browser/updater/update_service_unittest.cc b/extensions/browser/updater/update_service_unittest.cc index 6a174ec..35b60939 100644 --- a/extensions/browser/updater/update_service_unittest.cc +++ b/extensions/browser/updater/update_service_unittest.cc
@@ -940,10 +940,10 @@ if (GetParam()) { scoped_feature_list_.InitAndEnableFeature( - features::kNewExtensionUpdaterService); + extensions_features::kNewExtensionUpdaterService); } else { scoped_feature_list_.InitAndDisableFeature( - features::kNewExtensionUpdaterService); + extensions_features::kNewExtensionUpdaterService); } store_extension_ =
diff --git a/extensions/browser/user_script_loader.cc b/extensions/browser/user_script_loader.cc index 0c584cd8..8a26dce9 100644 --- a/extensions/browser/user_script_loader.cc +++ b/extensions/browser/user_script_loader.cc
@@ -122,12 +122,12 @@ script->set_description(value); } else if (GetDeclarationValue(line, kMatchDeclaration, &value)) { URLPattern pattern(UserScript::ValidUserScriptSchemes()); - if (URLPattern::PARSE_SUCCESS != pattern.Parse(value)) + if (URLPattern::ParseResult::kSuccess != pattern.Parse(value)) return false; script->add_url_pattern(pattern); } else if (GetDeclarationValue(line, kExcludeMatchDeclaration, &value)) { URLPattern exclude(UserScript::ValidUserScriptSchemes()); - if (URLPattern::PARSE_SUCCESS != exclude.Parse(value)) + if (URLPattern::ParseResult::kSuccess != exclude.Parse(value)) return false; script->add_exclude_url_pattern(exclude); } else if (GetDeclarationValue(line, kRunAtDeclaration, &value)) {
diff --git a/extensions/common/api/BUILD.gn b/extensions/common/api/BUILD.gn index 46d3230..cd20fc1 100644 --- a/extensions/common/api/BUILD.gn +++ b/extensions/common/api/BUILD.gn
@@ -11,7 +11,35 @@ assert(enable_extensions) -# TODO(devlin): Enforce visibility restrictions on more of these targets? +################################################################################ +# Public Targets + +group("api") { + public_deps = [ + ":generated_api_json_strings", + ":generated_api_types", + ":mojom", + "//extensions/buildflags", + ] +} + +group("extensions_features") { + public_deps = [ + ":api_features", + ":behavior_features", + ":manifest_features", + ":permission_features", + ] +} + +mojom("mojom") { + sources = [ + "mime_handler.mojom", + ] +} + +################################################################################ +# Private Targets generated_json_strings("generated_api_json_strings") { sources = extensions_api_schema_files + extensions_api_uncompiled_sources + @@ -35,18 +63,13 @@ visibility = [ ":api" ] } -mojom("mojom") { - sources = [ - "mime_handler.mojom", - ] -} - json_features("api_features") { feature_type = "APIFeature" method_name = "AddCoreAPIFeatures" sources = [ "_api_features.json", ] + visibility = [ ":extensions_features" ] } json_features("permission_features") { @@ -55,6 +78,7 @@ sources = [ "_permission_features.json", ] + visibility = [ ":extensions_features" ] } json_features("manifest_features") { @@ -63,6 +87,7 @@ sources = [ "_manifest_features.json", ] + visibility = [ ":extensions_features" ] } json_features("behavior_features") { @@ -71,24 +96,5 @@ sources = [ "_behavior_features.json", ] -} - -# Public Targets - -group("api") { - public_deps = [ - ":generated_api_json_strings", - ":generated_api_types", - ":mojom", - "//extensions/buildflags", - ] -} - -group("extensions_features") { - public_deps = [ - ":api_features", - ":behavior_features", - ":manifest_features", - ":permission_features", - ] + visibility = [ ":extensions_features" ] }
diff --git a/extensions/common/extension.cc b/extensions/common/extension.cc index 9bf511b..711b93a7 100644 --- a/extensions/common/extension.cc +++ b/extensions/common/extension.cc
@@ -673,12 +673,12 @@ URLPattern pattern(kValidWebExtentSchemes); URLPattern::ParseResult parse_result = pattern.Parse(pattern_string); - if (parse_result == URLPattern::PARSE_ERROR_EMPTY_PATH) { + if (parse_result == URLPattern::ParseResult::kEmptyPath) { pattern_string += "/"; parse_result = pattern.Parse(pattern_string); } - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( value_error, base::NumberToString(i), URLPattern::GetParseResultString(parse_result));
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc index 8f48443..46023e9 100644 --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc
@@ -4,8 +4,7 @@ #include "extensions/common/extension_features.h" -namespace extensions { -namespace features { +namespace extensions_features { // Enables the use of C++-based extension bindings (instead of JS generation). const base::Feature kNativeCrxBindings{"NativeCrxBindings", @@ -20,5 +19,4 @@ const base::Feature kRuntimeHostPermissions{"RuntimeHostPermissions", base::FEATURE_DISABLED_BY_DEFAULT}; -} // namespace features -} // namespace extensions +} // namespace extensions_features
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h index 6371dd0..f300599 100644 --- a/extensions/common/extension_features.h +++ b/extensions/common/extension_features.h
@@ -7,14 +7,12 @@ #include "base/feature_list.h" -namespace extensions { -namespace features { +namespace extensions_features { extern const base::Feature kNativeCrxBindings; extern const base::Feature kNewExtensionUpdaterService; extern const base::Feature kRuntimeHostPermissions; -} // namespace features -} // namespace extensions +} // namespace extensions_features #endif // EXTENSIONS_COMMON_EXTENSIONS_FEATURES_H_
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc index 8f8ca1b..c27ac18 100644 --- a/extensions/common/extension_messages.cc +++ b/extensions/common/extension_messages.cc
@@ -140,7 +140,7 @@ URLPattern::ParseResult result = p->Parse(spec, URLPattern::ALLOW_WILDCARD_FOR_EFFECTIVE_TLD); p->SetValidSchemes(valid_schemes); - return URLPattern::PARSE_SUCCESS == result; + return URLPattern::ParseResult::kSuccess == result; } void ParamTraits<URLPattern>::Log(const param_type& p, std::string* l) {
diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc index 9a7c6478..6afc5499 100644 --- a/extensions/common/manifest_constants.cc +++ b/extensions/common/manifest_constants.cc
@@ -157,8 +157,6 @@ const char kThemeImages[] = "images"; const char kThemeTints[] = "tints"; const char kTtsEngine[] = "tts_engine"; -const char kTtsGenderFemale[] = "female"; -const char kTtsGenderMale[] = "male"; const char kTtsVoices[] = "voices"; const char kTtsVoicesEventTypeEnd[] = "end"; const char kTtsVoicesEventTypeError[] = "error";
diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h index 015ece2..f502b343 100644 --- a/extensions/common/manifest_constants.h +++ b/extensions/common/manifest_constants.h
@@ -160,8 +160,6 @@ extern const char kThemeImages[]; extern const char kThemeTints[]; extern const char kTtsEngine[]; -extern const char kTtsGenderFemale[]; -extern const char kTtsGenderMale[]; extern const char kTtsVoices[]; extern const char kTtsVoicesEventTypeEnd[]; extern const char kTtsVoicesEventTypeError[];
diff --git a/extensions/common/manifest_handler.cc b/extensions/common/manifest_handler.cc index fbaf5de8..37f7ee3 100644 --- a/extensions/common/manifest_handler.cc +++ b/extensions/common/manifest_handler.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include <map> +#include <vector> #include "base/logging.h" #include "base/stl_util.h" @@ -220,29 +221,25 @@ } void ManifestHandlerRegistry::SortManifestHandlers() { - std::set<ManifestHandler*> unsorted_handlers; - for (ManifestHandlerMap::const_iterator iter = handlers_.begin(); - iter != handlers_.end(); ++iter) { - unsorted_handlers.insert(iter->second.get()); + std::vector<ManifestHandler*> unsorted_handlers; + unsorted_handlers.reserve(handlers_.size()); + for (const auto& key_value : handlers_) { + unsorted_handlers.push_back(key_value.second.get()); } int priority = 0; while (true) { - std::set<ManifestHandler*> next_unsorted_handlers; - for (std::set<ManifestHandler*>::const_iterator iter = - unsorted_handlers.begin(); - iter != unsorted_handlers.end(); ++iter) { - ManifestHandler* handler = *iter; + std::vector<ManifestHandler*> next_unsorted_handlers; + next_unsorted_handlers.reserve(unsorted_handlers.size()); + for (ManifestHandler* handler : unsorted_handlers) { const std::vector<std::string>& prerequisites = handler->PrerequisiteKeys(); int unsatisfied = prerequisites.size(); - for (size_t i = 0; i < prerequisites.size(); ++i) { - ManifestHandlerMap::const_iterator prereq_iter = - handlers_.find(prerequisites[i]); + for (const std::string& key : prerequisites) { + ManifestHandlerMap::const_iterator prereq_iter = handlers_.find(key); // If the prerequisite does not exist, crash. CHECK(prereq_iter != handlers_.end()) - << "Extension manifest handler depends on unrecognized key " - << prerequisites[i]; + << "Extension manifest handler depends on unrecognized key " << key; // Prerequisite is in our map. if (base::ContainsKey(priority_map_, prereq_iter->second.get())) unsatisfied--; @@ -252,7 +249,7 @@ priority++; } else { // Put in the list for next time. - next_unsorted_handlers.insert(handler); + next_unsorted_handlers.push_back(handler); } } if (next_unsorted_handlers.size() == unsorted_handlers.size()) @@ -262,7 +259,7 @@ // If there are any leftover unsorted handlers, they must have had // circular dependencies. - CHECK_EQ(unsorted_handlers.size(), std::set<ManifestHandler*>::size_type(0)) + CHECK(unsorted_handlers.empty()) << "Extension manifest handlers have circular dependencies!"; }
diff --git a/extensions/common/manifest_handler.h b/extensions/common/manifest_handler.h index f61332f8..bf9653f 100644 --- a/extensions/common/manifest_handler.h +++ b/extensions/common/manifest_handler.h
@@ -133,6 +133,8 @@ friend struct base::LazyInstanceTraitsBase<ManifestHandlerRegistry>; FRIEND_TEST_ALL_PREFIXES(ManifestHandlerPerfTest, MANUAL_CommonInitialize); FRIEND_TEST_ALL_PREFIXES(ManifestHandlerPerfTest, MANUAL_LookupTest); + FRIEND_TEST_ALL_PREFIXES(ManifestHandlerPerfTest, + MANUAL_CommonMeasureFinalization); FRIEND_TEST_ALL_PREFIXES(ChromeExtensionsClientTest, CheckManifestHandlerRegistryForOverflow);
diff --git a/extensions/common/manifest_handler_perf_test.cc b/extensions/common/manifest_handler_perf_test.cc index af766d5..6500e26 100644 --- a/extensions/common/manifest_handler_perf_test.cc +++ b/extensions/common/manifest_handler_perf_test.cc
@@ -53,4 +53,18 @@ LoggingTimer::Print(); } +TEST(ManifestHandlerPerfTest, MANUAL_CommonMeasureFinalization) { + ManifestHandlerRegistry::ResetForTesting(); + static constexpr char kTimerId[] = "Finalize"; + for (int i = 0; i < 100000; ++i) { + { + RegisterCommonManifestHandlers(); + LoggingTimer timer(kTimerId); + ManifestHandler::FinalizeRegistration(); + } + ManifestHandlerRegistry::ResetForTesting(); + } + LoggingTimer::Print(); +} + } // namespace extensions
diff --git a/extensions/common/manifest_handlers/automation.cc b/extensions/common/manifest_handlers/automation.cc index a5c0339..7140f99 100644 --- a/extensions/common/manifest_handlers/automation.cc +++ b/extensions/common/manifest_handlers/automation.cc
@@ -253,7 +253,7 @@ ~URLPattern::SCHEME_CHROMEUI); URLPattern::ParseResult parse_result = pattern.Parse(*it); - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { install_warnings->push_back( InstallWarning(ErrorUtils::FormatErrorMessage( automation_errors::kErrorInvalidMatch, *it,
diff --git a/extensions/common/manifest_handlers/content_scripts_handler.cc b/extensions/common/manifest_handlers/content_scripts_handler.cc index ee7c0bd..030a7dc 100644 --- a/extensions/common/manifest_handlers/content_scripts_handler.cc +++ b/extensions/common/manifest_handlers/content_scripts_handler.cc
@@ -159,7 +159,7 @@ URLPattern pattern(valid_schemes); URLPattern::ParseResult parse_result = pattern.Parse(match_str); - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidMatch, base::IntToString(definition_index), base::NumberToString(j), @@ -212,7 +212,7 @@ URLPattern pattern(valid_schemes); URLPattern::ParseResult parse_result = pattern.Parse(match_str); - if (parse_result != URLPattern::PARSE_SUCCESS) { + if (parse_result != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidExcludeMatch, base::IntToString(definition_index), base::NumberToString(j),
diff --git a/extensions/common/manifest_handlers/externally_connectable.cc b/extensions/common/manifest_handlers/externally_connectable.cc index ae5f604..c56cc27 100644 --- a/extensions/common/manifest_handlers/externally_connectable.cc +++ b/extensions/common/manifest_handlers/externally_connectable.cc
@@ -117,7 +117,7 @@ // Safe to use SCHEME_ALL here; externally_connectable gives a page -> // extension communication path, not the other way. URLPattern pattern(URLPattern::SCHEME_ALL); - if (pattern.Parse(*it) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(*it) != URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( externally_connectable_errors::kErrorInvalidMatchPattern, *it); return std::unique_ptr<ExternallyConnectableInfo>();
diff --git a/extensions/common/manifest_handlers/permissions_parser.cc b/extensions/common/manifest_handlers/permissions_parser.cc index 069bcbb..73279e1 100644 --- a/extensions/common/manifest_handlers/permissions_parser.cc +++ b/extensions/common/manifest_handlers/permissions_parser.cc
@@ -187,7 +187,7 @@ // Check if it's a host pattern permission. URLPattern pattern = URLPattern(kAllowedSchemes); URLPattern::ParseResult parse_result = pattern.Parse(permission_str); - if (parse_result == URLPattern::PARSE_SUCCESS) { + if (parse_result == URLPattern::ParseResult::kSuccess) { // The path component is not used for host permissions, so we force it // to match all paths. pattern.SetPath("/*");
diff --git a/extensions/common/manifest_handlers/sandboxed_page_info.cc b/extensions/common/manifest_handlers/sandboxed_page_info.cc index 5520282..defa0985 100644 --- a/extensions/common/manifest_handlers/sandboxed_page_info.cc +++ b/extensions/common/manifest_handlers/sandboxed_page_info.cc
@@ -82,7 +82,8 @@ return false; } URLPattern pattern(URLPattern::SCHEME_EXTENSION); - if (pattern.Parse(extension->url().spec()) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(extension->url().spec()) != + URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidURLPatternError, extension->url().spec()); return false;
diff --git a/extensions/common/manifest_handlers/web_accessible_resources_info.cc b/extensions/common/manifest_handlers/web_accessible_resources_info.cc index f8b36de..071edce 100644 --- a/extensions/common/manifest_handlers/web_accessible_resources_info.cc +++ b/extensions/common/manifest_handlers/web_accessible_resources_info.cc
@@ -76,7 +76,8 @@ return false; } URLPattern pattern(URLPattern::SCHEME_EXTENSION); - if (pattern.Parse(extension->url().spec()) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(extension->url().spec()) != + URLPattern::ParseResult::kSuccess) { *error = ErrorUtils::FormatErrorMessageUTF16( errors::kInvalidURLPatternError, extension->url().spec()); return false;
diff --git a/extensions/common/url_pattern.cc b/extensions/common/url_pattern.cc index 318e936d..1b5a979f 100644 --- a/extensions/common/url_pattern.cc +++ b/extensions/common/url_pattern.cc
@@ -9,6 +9,7 @@ #include <ostream> #include "base/macros.h" +#include "base/stl_util.h" #include "base/strings/pattern.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -70,7 +71,8 @@ kParseErrorInvalidHost, }; -static_assert(URLPattern::NUM_PARSE_RESULTS == arraysize(kParseResultMessages), +static_assert(static_cast<int>(URLPattern::ParseResult::kNumParseResults) == + base::size(kParseResultMessages), "must add message for each parse result"); const char kPathSeparator[] = "/"; @@ -162,12 +164,14 @@ match_effective_tld_(true), port_("*") { ParseResult result = Parse(pattern); - if (PARSE_SUCCESS != result) { + if (result != ParseResult::kSuccess) { + const char* error_string = GetParseResultString(result); // Temporarily add more logging to investigate why this code path is // reached. For http://crbug.com/856948 LOG(ERROR) << "Invalid pattern was given " << pattern << " result " - << result; - NOTREACHED() << "URLPattern invalid: " << pattern << " result " << result; + << error_string; + NOTREACHED() << "URLPattern invalid: '" << pattern + << "'; error: " << error_string; } } @@ -207,7 +211,7 @@ // Special case pattern to match every valid URL. if (pattern == kAllUrlsPattern) { SetMatchAllURLs(true); - return PARSE_SUCCESS; + return ParseResult::kSuccess; } // Parse out the scheme. @@ -221,20 +225,20 @@ } if (scheme_end_pos == base::StringPiece::npos) - return PARSE_ERROR_MISSING_SCHEME_SEPARATOR; + return ParseResult::kMissingSchemeSeparator; if (!SetScheme(pattern.substr(0, scheme_end_pos))) - return PARSE_ERROR_INVALID_SCHEME; + return ParseResult::kInvalidScheme; bool standard_scheme = IsStandardScheme(scheme_); if (standard_scheme != has_standard_scheme_separator) - return PARSE_ERROR_WRONG_SCHEME_SEPARATOR; + return ParseResult::kWrongSchemeSeparator; // Advance past the scheme separator. scheme_end_pos += (standard_scheme ? strlen(url::kStandardSchemeSeparator) : 1); if (scheme_end_pos >= pattern.size()) - return PARSE_ERROR_EMPTY_HOST; + return ParseResult::kEmptyHost; // Parse out the host and path. size_t host_start_pos = scheme_end_pos; @@ -259,10 +263,10 @@ // Host is required. if (host_start_pos == host_end_pos) - return PARSE_ERROR_EMPTY_HOST; + return ParseResult::kEmptyHost; if (host_end_pos == base::StringPiece::npos) - return PARSE_ERROR_EMPTY_PATH; + return ParseResult::kEmptyPath; base::StringPiece host_and_port = pattern.substr(host_start_pos, host_end_pos - host_start_pos); @@ -274,15 +278,15 @@ } else { // IPv6. size_t host_end_pos = host_and_port.find(']'); if (host_end_pos == base::StringPiece::npos) - return PARSE_ERROR_INVALID_HOST; + return ParseResult::kInvalidHost; if (host_end_pos == 1) - return PARSE_ERROR_EMPTY_HOST; + return ParseResult::kEmptyHost; if (host_end_pos < host_and_port.length() - 1) { // The host isn't the only component. Check for a port. This would // require a ':' to follow the closing ']' from the host. if (host_and_port[host_end_pos + 1] != ':') - return PARSE_ERROR_INVALID_HOST; + return ParseResult::kInvalidHost; port_separator_pos = host_end_pos + 1; } @@ -290,7 +294,7 @@ if (port_separator_pos != base::StringPiece::npos && !SetPort(host_and_port.substr(port_separator_pos + 1))) { - return PARSE_ERROR_INVALID_PORT; + return ParseResult::kInvalidPort; } // Note: this substr() will be the entire string if the port position @@ -304,7 +308,7 @@ // Could be empty if the host only consists of whitespace characters. if (host_components.empty() || (host_components.size() == 1 && host_components[0].empty())) - return PARSE_ERROR_EMPTY_HOST; + return ParseResult::kEmptyHost; if (host_components[0] == "*") { match_subdomains_ = true; @@ -329,7 +333,7 @@ // done as a convenience to developers who might otherwise be confused and // think '*' works as a glob in the host. if (host_.find('*') != std::string::npos) - return PARSE_ERROR_INVALID_HOST_WILDCARD; + return ParseResult::kInvalidHostWildcard; if (!host_.empty()) { // If |host_| is present (i.e., isn't a wildcard), we need to canonicalize @@ -338,14 +342,14 @@ host_ = net::CanonicalizeHost(host_, &host_info); // net::CanonicalizeHost() returns an empty string on failure. if (host_.empty()) - return PARSE_ERROR_INVALID_HOST; + return ParseResult::kInvalidHost; } // Null characters are not allowed in hosts. if (host_.find('\0') != std::string::npos) - return PARSE_ERROR_INVALID_HOST; + return ParseResult::kInvalidHost; - return PARSE_SUCCESS; + return ParseResult::kSuccess; } void URLPattern::SetValidSchemes(int valid_schemes) { @@ -677,7 +681,7 @@ return *copy_source; URLPattern result(intersection_schemes); ParseResult parse_result = result.Parse(copy_source->GetAsString()); - CHECK_EQ(PARSE_SUCCESS, parse_result); + CHECK_EQ(ParseResult::kSuccess, parse_result); return result; } } @@ -737,7 +741,7 @@ // TODO(devlin): I don't think there's any way this should ever fail, but // use a CHECK() to flush any cases out. If nothing crops up, downgrade this // to a DCHECK in M72. - CHECK_EQ(PARSE_SUCCESS, result); + CHECK_EQ(ParseResult::kSuccess, result); return pattern; } @@ -814,5 +818,5 @@ // static const char* URLPattern::GetParseResultString( URLPattern::ParseResult parse_result) { - return kParseResultMessages[parse_result]; + return kParseResultMessages[static_cast<int>(parse_result)]; }
diff --git a/extensions/common/url_pattern.h b/extensions/common/url_pattern.h index 47fffe2..f639dc47 100644 --- a/extensions/common/url_pattern.h +++ b/extensions/common/url_pattern.h
@@ -72,17 +72,17 @@ }; // Error codes returned from Parse(). - enum ParseResult { - PARSE_SUCCESS = 0, - PARSE_ERROR_MISSING_SCHEME_SEPARATOR, - PARSE_ERROR_INVALID_SCHEME, - PARSE_ERROR_WRONG_SCHEME_SEPARATOR, - PARSE_ERROR_EMPTY_HOST, - PARSE_ERROR_INVALID_HOST_WILDCARD, - PARSE_ERROR_EMPTY_PATH, - PARSE_ERROR_INVALID_PORT, - PARSE_ERROR_INVALID_HOST, - NUM_PARSE_RESULTS + enum class ParseResult { + kSuccess = 0, + kMissingSchemeSeparator, + kInvalidScheme, + kWrongSchemeSeparator, + kEmptyHost, + kInvalidHostWildcard, + kEmptyPath, + kInvalidPort, + kInvalidHost, + kNumParseResults, }; // Types of URLPattern that Parse() considers valid. @@ -115,8 +115,8 @@ bool operator==(const URLPattern& other) const; // Initializes this instance by parsing the provided string. Returns - // URLPattern::PARSE_SUCCESS on success, or an error code otherwise. On - // failure, this instance will have some intermediate values and is in an + // URLPattern::ParseResult::kSuccess on success, or an error code otherwise. + // On failure, this instance will have some intermediate values and is in an // invalid state. If you want to allow the match pattern to specify a wildcard // for the effective TLD, specify in |parse_options|. ParseResult Parse(base::StringPiece pattern_str);
diff --git a/extensions/common/url_pattern_set.cc b/extensions/common/url_pattern_set.cc index bac9ddb..096e941 100644 --- a/extensions/common/url_pattern_set.cc +++ b/extensions/common/url_pattern_set.cc
@@ -195,7 +195,8 @@ DCHECK(real_origin.IsSameOriginWith(url::Origin::Create(origin.GetOrigin()))); URLPattern origin_pattern(valid_schemes); // Origin adding could fail if |origin| does not match |valid_schemes|. - if (origin_pattern.Parse(origin.spec()) != URLPattern::PARSE_SUCCESS) { + if (origin_pattern.Parse(origin.spec()) != + URLPattern::ParseResult::kSuccess) { return false; } origin_pattern.SetPath("/*"); @@ -280,7 +281,7 @@ ClearPatterns(); for (size_t i = 0; i < patterns.size(); ++i) { URLPattern pattern(valid_schemes); - if (pattern.Parse(patterns[i]) != URLPattern::PARSE_SUCCESS) { + if (pattern.Parse(patterns[i]) != URLPattern::ParseResult::kSuccess) { if (error) { *error = ErrorUtils::FormatErrorMessage(kInvalidURLPatternError, patterns[i]);
diff --git a/extensions/common/url_pattern_set_unittest.cc b/extensions/common/url_pattern_set_unittest.cc index 31ec44d..88e2972 100644 --- a/extensions/common/url_pattern_set_unittest.cc +++ b/extensions/common/url_pattern_set_unittest.cc
@@ -259,7 +259,7 @@ URLPatternSet set1; for (const auto& pattern_str : test_case.set1) { URLPattern pattern(kValidSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse(pattern_str)) + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse(pattern_str)) << "Failed to parse: " << pattern_str; set1.AddPattern(pattern); } @@ -267,7 +267,7 @@ URLPatternSet set2; for (const auto& pattern_str : test_case.set2) { URLPattern pattern(kValidSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse(pattern_str)) + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse(pattern_str)) << "Failed to parse: " << pattern_str; set2.AddPattern(pattern); }
diff --git a/extensions/common/url_pattern_unittest.cc b/extensions/common/url_pattern_unittest.cc index b6fc1d8..449d7b3 100644 --- a/extensions/common/url_pattern_unittest.cc +++ b/extensions/common/url_pattern_unittest.cc
@@ -30,20 +30,20 @@ const char* pattern; URLPattern::ParseResult expected_result; } kInvalidPatterns[] = { - {"http", URLPattern::PARSE_ERROR_MISSING_SCHEME_SEPARATOR}, - {"http:", URLPattern::PARSE_ERROR_WRONG_SCHEME_SEPARATOR}, - {"http:/", URLPattern::PARSE_ERROR_WRONG_SCHEME_SEPARATOR}, - {"about://", URLPattern::PARSE_ERROR_WRONG_SCHEME_SEPARATOR}, - {"http://", URLPattern::PARSE_ERROR_EMPTY_HOST}, - {"http:///", URLPattern::PARSE_ERROR_EMPTY_HOST}, - {"http:// /", URLPattern::PARSE_ERROR_EMPTY_HOST}, - {"http://:1234/", URLPattern::PARSE_ERROR_EMPTY_HOST}, - {"http://*foo/bar", URLPattern::PARSE_ERROR_INVALID_HOST_WILDCARD}, - {"http://foo.*.bar/baz", URLPattern::PARSE_ERROR_INVALID_HOST_WILDCARD}, - {"http://fo.*.ba:123/baz", URLPattern::PARSE_ERROR_INVALID_HOST_WILDCARD}, - {"http:/bar", URLPattern::PARSE_ERROR_WRONG_SCHEME_SEPARATOR}, - {"http://bar", URLPattern::PARSE_ERROR_EMPTY_PATH}, - {"http://foo.*/bar", URLPattern::PARSE_ERROR_INVALID_HOST_WILDCARD}}; + {"http", URLPattern::ParseResult::kMissingSchemeSeparator}, + {"http:", URLPattern::ParseResult::kWrongSchemeSeparator}, + {"http:/", URLPattern::ParseResult::kWrongSchemeSeparator}, + {"about://", URLPattern::ParseResult::kWrongSchemeSeparator}, + {"http://", URLPattern::ParseResult::kEmptyHost}, + {"http:///", URLPattern::ParseResult::kEmptyHost}, + {"http:// /", URLPattern::ParseResult::kEmptyHost}, + {"http://:1234/", URLPattern::ParseResult::kEmptyHost}, + {"http://*foo/bar", URLPattern::ParseResult::kInvalidHostWildcard}, + {"http://foo.*.bar/baz", URLPattern::ParseResult::kInvalidHostWildcard}, + {"http://fo.*.ba:123/baz", URLPattern::ParseResult::kInvalidHostWildcard}, + {"http:/bar", URLPattern::ParseResult::kWrongSchemeSeparator}, + {"http://bar", URLPattern::ParseResult::kEmptyPath}, + {"http://foo.*/bar", URLPattern::ParseResult::kInvalidHostWildcard}}; for (size_t i = 0; i < arraysize(kInvalidPatterns); ++i) { URLPattern pattern(URLPattern::SCHEME_ALL); @@ -56,8 +56,7 @@ // Cannot use a C string, because this contains a null byte. std::string null_host("http://\0www/", 12); URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_ERROR_INVALID_HOST, - pattern.Parse(null_host)) + EXPECT_EQ(URLPattern::ParseResult::kInvalidHost, pattern.Parse(null_host)) << null_host; } } @@ -68,26 +67,26 @@ URLPattern::ParseResult expected_result; const char* expected_port; } kTestPatterns[] = { - {"http://foo:1234/", URLPattern::PARSE_SUCCESS, "1234"}, - {"http://foo:1234/bar", URLPattern::PARSE_SUCCESS, "1234"}, - {"http://*.foo:1234/", URLPattern::PARSE_SUCCESS, "1234"}, - {"http://*.foo:1234/bar", URLPattern::PARSE_SUCCESS, "1234"}, - {"http://foo:/", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, - {"http://*:1234/", URLPattern::PARSE_SUCCESS, "1234"}, - {"http://*:*/", URLPattern::PARSE_SUCCESS, "*"}, - {"http://foo:*/", URLPattern::PARSE_SUCCESS, "*"}, - {"http://*.foo:/", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, - {"http://foo:com/", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, - {"http://foo:123456/", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, - {"http://foo:80:80/monkey", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, - {"file://foo:1234/bar", URLPattern::PARSE_SUCCESS, "*"}, - {"chrome://foo:1234/bar", URLPattern::PARSE_ERROR_INVALID_PORT, "*"}, + {"http://foo:1234/", URLPattern::ParseResult::kSuccess, "1234"}, + {"http://foo:1234/bar", URLPattern::ParseResult::kSuccess, "1234"}, + {"http://*.foo:1234/", URLPattern::ParseResult::kSuccess, "1234"}, + {"http://*.foo:1234/bar", URLPattern::ParseResult::kSuccess, "1234"}, + {"http://foo:/", URLPattern::ParseResult::kInvalidPort, "*"}, + {"http://*:1234/", URLPattern::ParseResult::kSuccess, "1234"}, + {"http://*:*/", URLPattern::ParseResult::kSuccess, "*"}, + {"http://foo:*/", URLPattern::ParseResult::kSuccess, "*"}, + {"http://*.foo:/", URLPattern::ParseResult::kInvalidPort, "*"}, + {"http://foo:com/", URLPattern::ParseResult::kInvalidPort, "*"}, + {"http://foo:123456/", URLPattern::ParseResult::kInvalidPort, "*"}, + {"http://foo:80:80/monkey", URLPattern::ParseResult::kInvalidPort, "*"}, + {"file://foo:1234/bar", URLPattern::ParseResult::kSuccess, "*"}, + {"chrome://foo:1234/bar", URLPattern::ParseResult::kInvalidPort, "*"}, // Port-like strings in the path should not trigger a warning. - {"http://*/:1234", URLPattern::PARSE_SUCCESS, "*"}, - {"http://*.foo/bar:1234", URLPattern::PARSE_SUCCESS, "*"}, - {"http://foo/bar:1234/path", URLPattern::PARSE_SUCCESS, "*"}, - {"http://*.foo.*/:1234", URLPattern::PARSE_SUCCESS, "*"}}; + {"http://*/:1234", URLPattern::ParseResult::kSuccess, "*"}, + {"http://*.foo/bar:1234", URLPattern::ParseResult::kSuccess, "*"}, + {"http://foo/bar:1234/path", URLPattern::ParseResult::kSuccess, "*"}, + {"http://*.foo.*/:1234", URLPattern::ParseResult::kSuccess, "*"}}; for (size_t i = 0; i < arraysize(kTestPatterns); ++i) { URLPattern pattern(URLPattern::SCHEME_ALL); @@ -117,7 +116,8 @@ for (const auto& test_case : kSuccessTestPatterns) { SCOPED_TRACE(test_case.pattern); URLPattern pattern(URLPattern::SCHEME_HTTP); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse(test_case.pattern)); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse(test_case.pattern)); EXPECT_EQ(test_case.expected_host, pattern.host()); EXPECT_EQ(test_case.expected_port, pattern.port()); } @@ -128,26 +128,26 @@ } kFailureTestPatterns[] = { // No port specified, but port separator. {"http://[2607:f8b0:4005:805::200e]:/*", - URLPattern::PARSE_ERROR_INVALID_PORT}, + URLPattern::ParseResult::kInvalidPort}, // No host. - {"http://[]:8888/*", URLPattern::PARSE_ERROR_EMPTY_HOST}, + {"http://[]:8888/*", URLPattern::ParseResult::kEmptyHost}, // No closing bracket (`]`). {"http://[2607:f8b0:4005:805::200e/*", - URLPattern::PARSE_ERROR_INVALID_HOST}, + URLPattern::ParseResult::kInvalidHost}, // Two closing brackets (`]]`). {"http://[2607:f8b0:4005:805::200e]]/*", - URLPattern::PARSE_ERROR_INVALID_HOST}, + URLPattern::ParseResult::kInvalidHost}, // Two open brackets (`[[`). {"http://[[2607:f8b0:4005:805::200e]/*", - URLPattern::PARSE_ERROR_INVALID_HOST}, + URLPattern::ParseResult::kInvalidHost}, // Too few colons in the last chunk. {"http://[2607:f8b0:4005:805:200e]/*", - URLPattern::PARSE_ERROR_INVALID_HOST}, + URLPattern::ParseResult::kInvalidHost}, // Non-hex piece. {"http://[2607:f8b0:4005:805:200e:12:bogus]/*", - URLPattern::PARSE_ERROR_INVALID_HOST}, + URLPattern::ParseResult::kInvalidHost}, {"http://[[2607:f8b0:4005:805::200e]:abc/*", - URLPattern::PARSE_ERROR_INVALID_PORT}, + URLPattern::ParseResult::kInvalidPort}, }; for (const auto& test_case : kFailureTestPatterns) { @@ -160,7 +160,7 @@ // all pages for a given scheme TEST(ExtensionURLPatternTest, Match1) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*/*")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("", pattern.host()); EXPECT_TRUE(pattern.match_subdomains()); @@ -177,7 +177,7 @@ // all domains TEST(ExtensionURLPatternTest, Match2) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("https://*/foo*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("https://*/foo*")); EXPECT_EQ("https", pattern.scheme()); EXPECT_EQ("", pattern.host()); EXPECT_TRUE(pattern.match_subdomains()); @@ -195,7 +195,7 @@ // subdomains TEST(URLPatternTest, Match3) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*.google.com/foo*bar")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("google.com", pattern.host()); @@ -217,7 +217,8 @@ // glob escaping TEST(ExtensionURLPatternTest, Match5) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("file:///foo?bar\\*baz")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("file:///foo?bar\\*baz")); EXPECT_EQ("file", pattern.scheme()); EXPECT_EQ("", pattern.host()); EXPECT_FALSE(pattern.match_subdomains()); @@ -231,7 +232,8 @@ // ip addresses TEST(ExtensionURLPatternTest, Match6) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://127.0.0.1/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("http://127.0.0.1/*")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("127.0.0.1", pattern.host()); EXPECT_FALSE(pattern.match_subdomains()); @@ -245,7 +247,8 @@ TEST(ExtensionURLPatternTest, Match7) { URLPattern pattern(kAllSchemes); // allowed, but useless - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.0.0.1/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("http://*.0.0.1/*")); EXPECT_EQ("http", pattern.scheme()); // Canonicalization forces 0.0.1 to 0.0.0.1. EXPECT_EQ("0.0.0.1", pattern.host()); @@ -262,7 +265,7 @@ URLPattern pattern(kAllSchemes); // The below is the ASCII encoding of the following URL: // http://*.\xe1\x80\xbf/a\xc2\x81\xe1* - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*.xn--gkd/a%C2%81%E1*")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("xn--gkd", pattern.host()); @@ -279,7 +282,8 @@ // chrome:// TEST(ExtensionURLPatternTest, Match9) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("chrome://favicon/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("chrome://favicon/*")); EXPECT_EQ("chrome", pattern.scheme()); EXPECT_EQ("favicon", pattern.host()); EXPECT_FALSE(pattern.match_subdomains()); @@ -294,7 +298,7 @@ // *:// TEST(ExtensionURLPatternTest, Match10) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("*://*/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("*://*/*")); EXPECT_TRUE(pattern.MatchesScheme("http")); EXPECT_TRUE(pattern.MatchesScheme("https")); EXPECT_FALSE(pattern.MatchesScheme("chrome")); @@ -313,7 +317,7 @@ // <all_urls> TEST(ExtensionURLPatternTest, Match11) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("<all_urls>")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("<all_urls>")); EXPECT_TRUE(pattern.MatchesScheme("chrome")); EXPECT_TRUE(pattern.MatchesScheme("http")); EXPECT_TRUE(pattern.MatchesScheme("https")); @@ -346,7 +350,7 @@ // SCHEME_ALL matches all schemes. TEST(ExtensionURLPatternTest, Match12) { URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("<all_urls>")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("<all_urls>")); EXPECT_TRUE(pattern.MatchesScheme("chrome")); EXPECT_TRUE(pattern.MatchesScheme("http")); EXPECT_TRUE(pattern.MatchesScheme("https")); @@ -387,7 +391,7 @@ TEST(ExtensionURLPatternTest, Match13) { for (size_t i = 0; i < arraysize(kMatch13UrlPatternTestCases); ++i) { URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse(kMatch13UrlPatternTestCases[i].pattern)) << " while parsing " << kMatch13UrlPatternTestCases[i].pattern; EXPECT_TRUE(pattern.MatchesURL( @@ -397,14 +401,14 @@ // Negative test. URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("data:*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("data:*")); EXPECT_FALSE(pattern.MatchesURL(GURL("about:blank"))); } // file scheme with empty hostname TEST(ExtensionURLPatternTest, Match14) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("file:///foo*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("file:///foo*")); EXPECT_EQ("file", pattern.scheme()); EXPECT_EQ("", pattern.host()); EXPECT_FALSE(pattern.match_subdomains()); @@ -421,7 +425,7 @@ // file scheme without hostname part TEST(ExtensionURLPatternTest, Match15) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("file://foo*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("file://foo*")); EXPECT_EQ("file", pattern.scheme()); EXPECT_EQ("", pattern.host()); EXPECT_FALSE(pattern.match_subdomains()); @@ -438,7 +442,8 @@ // file scheme with hostname TEST(ExtensionURLPatternTest, Match16) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("file://localhost/foo*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("file://localhost/foo*")); EXPECT_EQ("file", pattern.scheme()); // Since hostname is ignored for file://. EXPECT_EQ("", pattern.host()); @@ -456,7 +461,7 @@ // Specific port TEST(ExtensionURLPatternTest, Match17) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://www.example.com:80/foo")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("www.example.com", pattern.host()); @@ -476,7 +481,7 @@ // Explicit port wildcard TEST(ExtensionURLPatternTest, Match18) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://www.example.com:*/foo")); EXPECT_EQ("http", pattern.scheme()); EXPECT_EQ("www.example.com", pattern.host()); @@ -494,7 +499,7 @@ // chrome-extension:// TEST(ExtensionURLPatternTest, Match19) { URLPattern pattern(URLPattern::SCHEME_EXTENSION); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("chrome-extension://ftw/*")); EXPECT_EQ(extensions::kExtensionScheme, pattern.scheme()); EXPECT_EQ("ftw", pattern.host()); @@ -514,7 +519,7 @@ // effective TLD wildcard TEST(URLPatternTest, EffectiveTldWildcard) { URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*.google.*/foo*bar", URLPattern::ALLOW_WILDCARD_FOR_EFFECTIVE_TLD)); EXPECT_EQ("http", pattern.scheme()); @@ -532,7 +537,7 @@ EXPECT_FALSE(pattern.MatchesURL( GURL("filesystem:http://google.com/temporary/foobar"))); URLPattern pattern_sub(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern_sub.Parse("https://maps.google.*/", URLPattern::ALLOW_WILDCARD_FOR_EFFECTIVE_TLD)); EXPECT_EQ("https", pattern_sub.scheme()); @@ -565,7 +570,7 @@ TEST(ExtensionURLPatternTest, GetAsString) { for (size_t i = 0; i < arraysize(kGetAsStringTestCases); ++i) { URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse(kGetAsStringTestCases[i].pattern)) << "Error parsing " << kGetAsStringTestCases[i].pattern; EXPECT_EQ(kGetAsStringTestCases[i].pattern, @@ -675,7 +680,7 @@ GURL url("http://www.example.com:1234/foo"); URLPattern pattern(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse(pattern_str)); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse(pattern_str)); EXPECT_EQ(pattern_str, pattern.GetAsString()); EXPECT_FALSE(pattern.MatchesURL(url)); @@ -688,9 +693,9 @@ GURL url2("http://www.example.com/example/"); URLPattern pattern1(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse(pattern_str1)); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern1.Parse(pattern_str1)); URLPattern pattern2(kAllSchemes); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse(pattern_str2)); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, pattern2.Parse(pattern_str2)); // Same patterns should match same urls. EXPECT_TRUE(pattern1.MatchesURL(url1)); @@ -797,21 +802,25 @@ TEST(ExtensionURLPatternTest, CanReusePatternWithParse) { URLPattern pattern1(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse("http://aa.com/*")); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse("http://bb.com/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern1.Parse("http://aa.com/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern1.Parse("http://bb.com/*")); EXPECT_TRUE(pattern1.MatchesURL(GURL("http://bb.com/path"))); EXPECT_FALSE(pattern1.MatchesURL(GURL("http://aa.com/path"))); URLPattern pattern2(URLPattern::SCHEME_ALL, URLPattern::kAllUrlsPattern); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse("http://aa.com/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern2.Parse("http://aa.com/*")); EXPECT_FALSE(pattern2.MatchesURL(GURL("http://bb.com/path"))); EXPECT_TRUE(pattern2.MatchesURL(GURL("http://aa.com/path"))); EXPECT_FALSE(pattern2.MatchesURL(GURL("http://sub.aa.com/path"))); URLPattern pattern3(URLPattern::SCHEME_ALL, "http://aa.com/*"); - EXPECT_EQ(URLPattern::PARSE_SUCCESS, pattern3.Parse("http://aa.com:88/*")); + EXPECT_EQ(URLPattern::ParseResult::kSuccess, + pattern3.Parse("http://aa.com:88/*")); EXPECT_FALSE(pattern3.MatchesURL(GURL("http://aa.com/path"))); EXPECT_TRUE(pattern3.MatchesURL(GURL("http://aa.com:88/path"))); } @@ -1087,7 +1096,7 @@ // Sometimes, canonicalization can fail (such as here, where we have invalid // unicode characters). In that case, URLPattern parsing should also fail. URLPattern pattern(URLPattern::SCHEME_ALL); - EXPECT_EQ(URLPattern::PARSE_ERROR_INVALID_HOST, + EXPECT_EQ(URLPattern::ParseResult::kInvalidHost, pattern.Parse("https://\xef\xb7\x90zyx.com/*")); } } @@ -1169,10 +1178,12 @@ test_case.pattern2.c_str(), test_case.expected_intersection.c_str())); URLPattern pattern1(kValidSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse(test_case.pattern1)) + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern1.Parse(test_case.pattern1)) << "Pattern failed to parse: " << test_case.pattern1; URLPattern pattern2(kValidSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse(test_case.pattern2)) + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern2.Parse(test_case.pattern2)) << "Pattern failed to parse: " << test_case.pattern2; // Intersection of two URLPatterns should be identical regardless of which @@ -1217,10 +1228,10 @@ test_case.scheme2, test_case.expected_scheme)); URLPattern pattern1(test_case.scheme1); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern1.Parse(URLPattern::kAllUrlsPattern)); URLPattern pattern2(test_case.scheme2); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern2.Parse(URLPattern::kAllUrlsPattern)); base::Optional<URLPattern> intersection1 = pattern1.CreateIntersection(pattern2);
diff --git a/extensions/common/user_script.cc b/extensions/common/user_script.cc index 7fddf33..f9276b90 100644 --- a/extensions/common/user_script.cc +++ b/extensions/common/user_script.cc
@@ -301,8 +301,9 @@ URLPattern pattern(kValidUserScriptSchemes); URLPattern::ParseResult result = pattern.Parse(pattern_str); - CHECK(URLPattern::PARSE_SUCCESS == result) << - URLPattern::GetParseResultString(result) << " " << pattern_str.c_str(); + CHECK(URLPattern::ParseResult::kSuccess == result) + << URLPattern::GetParseResultString(result) << " " + << pattern_str.c_str(); pattern.SetValidSchemes(valid_schemes); pattern_list->AddPattern(pattern);
diff --git a/extensions/common/user_script_unittest.cc b/extensions/common/user_script_unittest.cc index 4d46c2ba..488d94c 100644 --- a/extensions/common/user_script_unittest.cc +++ b/extensions/common/user_script_unittest.cc
@@ -77,7 +77,7 @@ TEST(ExtensionUserScriptTest, UrlPattern) { URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*/foo*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*/foo*")); UserScript script; script.add_url_pattern(pattern); @@ -91,11 +91,13 @@ UserScript script; URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("http://*.nytimes.com/*")); script.add_url_pattern(pattern); URLPattern exclude(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude.Parse("*://*/*business*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + exclude.Parse("*://*/*business*")); script.add_exclude_url_pattern(exclude); EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/health"))); @@ -107,11 +109,12 @@ UserScript script; URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("*://*/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("*://*/*")); script.add_url_pattern(pattern); URLPattern exclude(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude.Parse("*://mail.nytimes.com/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + exclude.Parse("*://mail.nytimes.com/*")); script.add_exclude_url_pattern(exclude); EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/health"))); @@ -126,7 +129,8 @@ UserScript script; URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("http://*.nytimes.com/*")); script.add_url_pattern(pattern); script.add_glob("*nytimes.com/???s/*"); @@ -140,7 +144,8 @@ UserScript script; URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern.Parse("http://*.nytimes.com/*")); script.add_url_pattern(pattern); script.add_exclude_glob("*science*"); @@ -155,7 +160,7 @@ UserScript script; URLPattern pattern(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://www.google.com/*")); script.add_url_pattern(pattern); @@ -186,10 +191,11 @@ URLPattern pattern2(kAllSchemes); URLPattern exclude1(kAllSchemes); URLPattern exclude2(kAllSchemes); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse("http://*/foo*")); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse("http://bar/baz*")); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude1.Parse("*://*/*bar")); - ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude2.Parse("https://*/*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern1.Parse("http://*/foo*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, + pattern2.Parse("http://bar/baz*")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, exclude1.Parse("*://*/*bar")); + ASSERT_EQ(URLPattern::ParseResult::kSuccess, exclude2.Parse("https://*/*")); UserScript script1; script1.js_scripts().push_back(std::make_unique<UserScript::File>(
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index 790b839..f06670bc 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -669,7 +669,7 @@ {"platformApp", IDR_PLATFORM_APP_JS}, }; - if (!base::FeatureList::IsEnabled(features::kNativeCrxBindings)) { + if (!base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) { resources.push_back({"binding", IDR_BINDING_JS}); resources.push_back({kEventBindings, IDR_EVENT_BINDINGS_JS}); resources.push_back({"lastError", IDR_LAST_ERROR_JS}); @@ -1368,7 +1368,7 @@ std::unique_ptr<ExtensionBindingsSystem> Dispatcher::CreateBindingsSystem( std::unique_ptr<IPCMessageSender> ipc_sender) { std::unique_ptr<ExtensionBindingsSystem> bindings_system; - if (base::FeatureList::IsEnabled(features::kNativeCrxBindings)) { + if (base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) { auto system = std::make_unique<NativeExtensionBindingsSystem>(std::move(ipc_sender)); delegate_->InitializeBindingsSystem(this, system.get());
diff --git a/extensions/renderer/module_system.cc b/extensions/renderer/module_system.cc index a30a806..0b0ed47e 100644 --- a/extensions/renderer/module_system.cc +++ b/extensions/renderer/module_system.cc
@@ -171,8 +171,8 @@ source_map_(source_map), natives_enabled_(0), exception_handler_(new DefaultExceptionHandler(context)), - lazily_initialize_handlers_( - base::FeatureList::IsEnabled(features::kNativeCrxBindings)) { + lazily_initialize_handlers_(base::FeatureList::IsEnabled( + extensions_features::kNativeCrxBindings)) { v8::Local<v8::Object> global(context->v8_context()->Global()); v8::Isolate* isolate = context->isolate(); SetPrivate(global, kModulesField, v8::Object::New(isolate));
diff --git a/extensions/renderer/module_system_test.cc b/extensions/renderer/module_system_test.cc index 06ffcad..c8a75f0e 100644 --- a/extensions/renderer/module_system_test.cc +++ b/extensions/renderer/module_system_test.cc
@@ -52,8 +52,9 @@ GetAPINatives(ScriptContext* context, NativeExtensionBindingsSystem* bindings_system) : ObjectBackedNativeHandler(context), bindings_system_(bindings_system) { - DCHECK_EQ(base::FeatureList::IsEnabled(features::kNativeCrxBindings), - !!bindings_system); + DCHECK_EQ( + base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings), + !!bindings_system); } ~GetAPINatives() override {} @@ -160,7 +161,7 @@ context_->v8_context()->Enter(); assert_natives_ = new AssertNatives(context_); - if (base::FeatureList::IsEnabled(features::kNativeCrxBindings)) + if (base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) bindings_system_ = std::make_unique<NativeExtensionBindingsSystem>(nullptr); {
diff --git a/extensions/renderer/utils_unittest.cc b/extensions/renderer/utils_unittest.cc index b74bf066..5acdf37 100644 --- a/extensions/renderer/utils_unittest.cc +++ b/extensions/renderer/utils_unittest.cc
@@ -29,7 +29,7 @@ // Native bindings set up the chrome.runtime accessor, so we don't need to // stub it out. - if (base::FeatureList::IsEnabled(features::kNativeCrxBindings)) + if (base::FeatureList::IsEnabled(extensions_features::kNativeCrxBindings)) return; gin::Dictionary chrome(env()->isolate(), env()->CreateGlobal("chrome"));
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h index 6945a601..8cb2646 100644 --- a/gin/public/isolate_holder.h +++ b/gin/public/isolate_holder.h
@@ -70,8 +70,9 @@ kUtility }; - IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner, - IsolateType isolate_type); + explicit IsolateHolder( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + IsolateType isolate_type); IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner, AccessMode access_mode, IsolateType isolate_type);
diff --git a/gin/v8_isolate_memory_dump_provider.cc b/gin/v8_isolate_memory_dump_provider.cc index 604c04d..bcf9ffa8 100644 --- a/gin/v8_isolate_memory_dump_provider.cc +++ b/gin/v8_isolate_memory_dump_provider.cc
@@ -50,9 +50,8 @@ // Dump statistics related to code/bytecode when memory-infra.v8.code_stats is // enabled. -void DumpCodeStatistics( - base::trace_event::MemoryAllocatorDump* heap_spaces_dump, - IsolateHolder* isolate_holder) { +void DumpCodeStatistics(base::trace_event::MemoryAllocatorDump* dump, + IsolateHolder* isolate_holder) { // Collecting code statistics is an expensive operation (~10 ms) when // compared to other v8 metrics (< 1 ms). So, dump them only when // memory-infra.v8.code_stats is enabled. @@ -71,37 +70,37 @@ return; } - heap_spaces_dump->AddScalar( - "code_and_metadata_size", - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - code_statistics.code_and_metadata_size()); - heap_spaces_dump->AddScalar( - "bytecode_and_metadata_size", - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - code_statistics.bytecode_and_metadata_size()); - heap_spaces_dump->AddScalar( - "external_script_source_size", - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - code_statistics.external_script_source_size()); + dump->AddScalar("code_and_metadata_size", + base::trace_event::MemoryAllocatorDump::kUnitsBytes, + code_statistics.code_and_metadata_size()); + dump->AddScalar("bytecode_and_metadata_size", + base::trace_event::MemoryAllocatorDump::kUnitsBytes, + code_statistics.bytecode_and_metadata_size()); + dump->AddScalar("external_script_source_size", + base::trace_event::MemoryAllocatorDump::kUnitsBytes, + code_statistics.external_script_source_size()); } // Dump the number of native and detached contexts. // The result looks as follows in the Chrome trace viewer: -// ====================================== -// Component object_count +// ======================================== +// Component object_count // - v8 -// - isolate +// - main // - contexts // - detached_context 10 // - native_context 20 -// ====================================== +// ======================================== void DumpContextStatistics( base::trace_event::ProcessMemoryDump* process_memory_dump, std::string dump_base_name, + std::string dump_name_suffix, size_t number_of_detached_contexts, size_t number_of_native_contexts) { - std::string dump_name_prefix = dump_base_name + "/contexts"; - std::string native_context_name = dump_name_prefix + "/native_context"; + std::string dump_name_prefix = + dump_base_name + "/contexts" + dump_name_suffix; + std::string native_context_name = + dump_name_prefix + "/native_context" + dump_name_suffix; auto* native_context_dump = process_memory_dump->CreateAllocatorDump(native_context_name); native_context_dump->AddScalar( @@ -115,20 +114,57 @@ number_of_detached_contexts); } +std::string IsolateTypeString(IsolateHolder::IsolateType isolate_type) { + switch (isolate_type) { + case IsolateHolder::IsolateType::kBlinkMainThread: + return "main"; + case IsolateHolder::IsolateType::kBlinkWorkerThread: + return "workers"; + case IsolateHolder::IsolateType::kTest: + LOG(FATAL) << "Unreachable code"; + return "test"; + case IsolateHolder::IsolateType::kUtility: + return "utility"; + } + LOG(FATAL) << "Unreachable code"; +} + +bool CanHaveMultipleIsolates(IsolateHolder::IsolateType isolate_type) { + switch (isolate_type) { + case IsolateHolder::IsolateType::kBlinkMainThread: + return false; + case IsolateHolder::IsolateType::kBlinkWorkerThread: + return true; + case IsolateHolder::IsolateType::kTest: + LOG(FATAL) << "Unreachable code"; + return false; + case IsolateHolder::IsolateType::kUtility: + // PDFium and ProxyResolver create one isolate per process. + return false; + } + LOG(FATAL) << "Unreachable code"; +} + } // namespace anonymous void V8IsolateMemoryDumpProvider::DumpHeapStatistics( const base::trace_event::MemoryDumpArgs& args, base::trace_event::ProcessMemoryDump* process_memory_dump) { - std::string dump_base_name = base::StringPrintf( - "v8/isolate_0x%" PRIXPTR, + std::string isolate_name = base::StringPrintf( + "isolate_0x%" PRIXPTR, reinterpret_cast<uintptr_t>(isolate_holder_->isolate())); // Dump statistics of the heap's spaces. - std::string space_name_prefix = dump_base_name + "/heap_spaces"; v8::HeapStatistics heap_statistics; isolate_holder_->isolate()->GetHeapStatistics(&heap_statistics); + IsolateHolder::IsolateType isolate_type = isolate_holder_->isolate_type(); + std::string dump_base_name = "v8/" + IsolateTypeString(isolate_type); + std::string dump_name_suffix = + CanHaveMultipleIsolates(isolate_type) ? "/" + isolate_name : ""; + + std::string space_name_prefix = dump_base_name + "/heap"; + size_t known_spaces_used_size = 0; size_t known_spaces_size = 0; size_t known_spaces_physical_size = 0; @@ -145,14 +181,15 @@ known_spaces_used_size += space_used_size; known_spaces_physical_size += space_physical_size; - std::string space_dump_name = - space_name_prefix + "/" + space_statistics.space_name(); + std::string space_dump_name = dump_base_name + "/heap/" + + space_statistics.space_name() + + dump_name_suffix; + auto* space_dump = process_memory_dump->CreateAllocatorDump(space_dump_name); space_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, base::trace_event::MemoryAllocatorDump::kUnitsBytes, space_physical_size); - space_dump->AddScalar("virtual_size", base::trace_event::MemoryAllocatorDump::kUnitsBytes, space_size); @@ -172,7 +209,7 @@ // resident values. if (heap_statistics.does_zap_garbage()) { auto* zap_dump = process_memory_dump->CreateAllocatorDump( - dump_base_name + "/zapped_for_debug"); + dump_base_name + "/zapped_for_debug" + dump_name_suffix); zap_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, base::trace_event::MemoryAllocatorDump::kUnitsBytes, heap_statistics.total_heap_size() - @@ -180,7 +217,7 @@ } // Dump statistics about malloced memory. - std::string malloc_name = dump_base_name + "/malloc"; + std::string malloc_name = dump_base_name + "/malloc" + dump_name_suffix; auto* malloc_dump = process_memory_dump->CreateAllocatorDump(malloc_name); malloc_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, base::trace_event::MemoryAllocatorDump::kUnitsBytes, @@ -196,17 +233,15 @@ system_allocator_name); } - DumpContextStatistics(process_memory_dump, dump_base_name, + DumpContextStatistics(process_memory_dump, dump_base_name, dump_name_suffix, heap_statistics.number_of_detached_contexts(), heap_statistics.number_of_native_contexts()); - // Add an empty row for the heap_spaces. This is to keep the shape of the - // dump stable, whether code stats are enabled or not. - auto* heap_spaces_dump = - process_memory_dump->CreateAllocatorDump(space_name_prefix); + auto* code_stats_dump = process_memory_dump->CreateAllocatorDump( + dump_base_name + "/code_stats" + dump_name_suffix); // Dump statistics related to code and bytecode if requested. - DumpCodeStatistics(heap_spaces_dump, isolate_holder_); + DumpCodeStatistics(code_stats_dump, isolate_holder_); // Dump object statistics only for detailed dumps. if (args.level_of_detail != @@ -217,7 +252,8 @@ // Dump statistics of the heap's live objects from last GC. // TODO(primiano): these should not be tracked in the same trace event as they // report stats for the last GC (not the current state). See crbug.com/498779. - std::string object_name_prefix = dump_base_name + "/heap_objects_at_last_gc"; + std::string object_name_prefix = + dump_base_name + "/heap_objects_at_last_gc" + dump_name_suffix; bool did_dump_object_stats = false; const size_t object_types = isolate_holder_->isolate()->NumberOfTrackedHeapObjectTypes(); @@ -256,7 +292,8 @@ if (did_dump_object_stats) { process_memory_dump->AddOwnershipEdge( process_memory_dump->CreateAllocatorDump(object_name_prefix)->guid(), - heap_spaces_dump->guid()); + process_memory_dump->GetOrCreateAllocatorDump(space_name_prefix) + ->guid()); } }
diff --git a/gin/v8_isolate_memory_dump_provider_unittest.cc b/gin/v8_isolate_memory_dump_provider_unittest.cc index db9d1ebe..7a4ad9c 100644 --- a/gin/v8_isolate_memory_dump_provider_unittest.cc +++ b/gin/v8_isolate_memory_dump_provider_unittest.cc
@@ -38,12 +38,13 @@ bool did_dump_objects_stats = false; for (const auto& name_dump : allocator_dumps) { const std::string& name = name_dump.first; - if (name.find("v8/isolate") != std::string::npos) { + if (name.find("v8/main") != std::string::npos) { did_dump_isolate_stats = true; } - if (name.find("heap_spaces") != std::string::npos) { + if (name.find("v8/main/heap") != std::string::npos) { did_dump_space_stats = true; - } else if (name.find("heap_objects") != std::string::npos) { + } + if (name.find("v8/main/heap_objects") != std::string::npos) { did_dump_objects_stats = true; } } @@ -101,7 +102,7 @@ for (const auto& name_dump : allocator_dumps) { const std::string& name = name_dump.first; - if (name.find("heap_spaces") != std::string::npos) { + if (name.find("code_stats") != std::string::npos) { for (const base::trace_event::MemoryAllocatorDump::Entry& entry : name_dump.second->entries()) { if (entry.name == "bytecode_and_metadata_size") {
diff --git a/google_apis/gaia/oauth_multilogin_result.cc b/google_apis/gaia/oauth_multilogin_result.cc index 772f934..6212cbc 100644 --- a/google_apis/gaia/oauth_multilogin_result.cc +++ b/google_apis/gaia/oauth_multilogin_result.cc
@@ -9,6 +9,11 @@ OAuthMultiloginResult::OAuthMultiloginResult() {} +OAuthMultiloginResult::OAuthMultiloginResult( + const OAuthMultiloginResult& other) { + cookies_ = other.cookies(); +} + // static base::StringPiece OAuthMultiloginResult::StripXSSICharacters( const std::string& raw_data) {
diff --git a/google_apis/gaia/oauth_multilogin_result.h b/google_apis/gaia/oauth_multilogin_result.h index 6967326..c6375ed 100644 --- a/google_apis/gaia/oauth_multilogin_result.h +++ b/google_apis/gaia/oauth_multilogin_result.h
@@ -19,6 +19,7 @@ class OAuthMultiloginResult { public: OAuthMultiloginResult(); + OAuthMultiloginResult(const OAuthMultiloginResult& other); ~OAuthMultiloginResult(); std::vector<net::CanonicalCookie> cookies() const { return cookies_; }
diff --git a/gpu/command_buffer/client/client_discardable_manager.cc b/gpu/command_buffer/client/client_discardable_manager.cc index 1374cda..8c866efe 100644 --- a/gpu/command_buffer/client/client_discardable_manager.cc +++ b/gpu/command_buffer/client/client_discardable_manager.cc
@@ -193,6 +193,20 @@ return found->second; } +bool ClientDiscardableManager::HandleIsDeleted( + ClientDiscardableHandle::Id handle_id) { + auto found = handles_.find(handle_id); + if (found == handles_.end()) + return true; + + if (found->second.CanBeReUsed()) { + handles_.erase(found); + return true; + } + + return false; +} + bool ClientDiscardableManager::HandleIsDeletedForTracing( ClientDiscardableHandle::Id handle_id) const { auto found = handles_.find(handle_id);
diff --git a/gpu/command_buffer/client/client_discardable_manager.h b/gpu/command_buffer/client/client_discardable_manager.h index 9967d31..a5331085 100644 --- a/gpu/command_buffer/client/client_discardable_manager.h +++ b/gpu/command_buffer/client/client_discardable_manager.h
@@ -31,6 +31,7 @@ void FreeHandle(ClientDiscardableHandle::Id handle_id); bool HandleIsValid(ClientDiscardableHandle::Id handle_id) const; ClientDiscardableHandle GetHandle(ClientDiscardableHandle::Id handle_id); + bool HandleIsDeleted(ClientDiscardableHandle::Id handle_id); // For diagnostic tracing only. bool HandleIsDeletedForTracing(ClientDiscardableHandle::Id handle_id) const;
diff --git a/gpu/command_buffer/client/client_font_manager.cc b/gpu/command_buffer/client/client_font_manager.cc index b15b66f..b0985c5 100644 --- a/gpu/command_buffer/client/client_font_manager.cc +++ b/gpu/command_buffer/client/client_font_manager.cc
@@ -90,6 +90,19 @@ return false; } +bool ClientFontManager::isHandleDeleted(SkDiscardableHandleId handle_id) { + auto it = discardable_handle_map_.find(handle_id); + if (it == discardable_handle_map_.end()) + return true; + + if (client_discardable_manager_.HandleIsDeleted(it->second)) { + discardable_handle_map_.erase(it); + return true; + } + + return false; +} + void ClientFontManager::Serialize() { // TODO(khushalsagar): May be skia can track the size required so we avoid // this copy.
diff --git a/gpu/command_buffer/client/client_font_manager.h b/gpu/command_buffer/client/client_font_manager.h index faf8226..0b1a697 100644 --- a/gpu/command_buffer/client/client_font_manager.h +++ b/gpu/command_buffer/client/client_font_manager.h
@@ -31,6 +31,7 @@ // SkStrikeServer::DiscardableHandleManager implementation. SkDiscardableHandleId createHandle() override; bool lockHandle(SkDiscardableHandleId handle_id) override; + bool isHandleDeleted(SkDiscardableHandleId handle_id) override; void Serialize(); SkStrikeServer* strike_server() { return &strike_server_; }
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index a6b1863..fff9e25 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -61,6 +61,7 @@ #include "gpu/command_buffer/service/vertex_attrib_manager.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" +#include "third_party/skia/include/core/SkDeferredDisplayListRecorder.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkSurfaceProps.h" #include "third_party/skia/include/core/SkTypeface.h" @@ -746,6 +747,7 @@ int commands_to_process_ = 0; bool supports_oop_raster_ = false; + bool use_ddl_ = false; bool has_robustness_extension_ = false; bool context_was_lost_ = false; @@ -802,6 +804,8 @@ // Raster helpers. ServiceFontManager font_manager_; sk_sp<SkSurface> sk_surface_; + + std::unique_ptr<SkDeferredDisplayListRecorder> recorder_; std::unique_ptr<SkCanvas> raster_canvas_; uint32_t raster_color_space_id_; std::vector<SkDiscardableHandleId> locked_handles_; @@ -1017,6 +1021,7 @@ } supports_oop_raster_ = !!raster_decoder_context_state_->gr_context; + use_ddl_ = group_->gpu_preferences().enable_oop_rasterization_ddl; } return ContextResult::kSuccess; @@ -3107,9 +3112,21 @@ sk_surface_.reset(); return; } + + SkCanvas* canvas = nullptr; + if (use_ddl_) { + SkSurfaceCharacterization characterization; + bool result = sk_surface_->characterize(&characterization); + DCHECK(result) << "Failed to characterize raster SkSurface."; + recorder_ = + std::make_unique<SkDeferredDisplayListRecorder>(characterization); + canvas = recorder_->getCanvas(); + } else { + canvas = sk_surface_->getCanvas(); + } + raster_canvas_ = SkCreateColorSpaceXformCanvas( - sk_surface_->getCanvas(), - color_space_entry->color_space().ToSkColorSpace()); + canvas, color_space_entry->color_space().ToSkColorSpace()); raster_color_space_id_ = color_space_transfer_cache_id; // All or nothing clearing, as no way to validate the client's input on what @@ -3207,6 +3224,7 @@ } void RasterDecoderImpl::DoEndRasterCHROMIUM() { + TRACE_EVENT0("gpu", "RasterDecoderImpl::DoEndRasterCHROMIUM"); if (!sk_surface_) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginRasterCHROMIUM", "EndRasterCHROMIUM without BeginRasterCHROMIUM"); @@ -3216,6 +3234,12 @@ raster_decoder_context_state_->need_context_state_reset = true; raster_canvas_.reset(); + + if (use_ddl_) { + auto ddl = recorder_->detach(); + recorder_ = nullptr; + sk_surface_->draw(ddl.get()); + } sk_surface_->prepareForExternalIO(); sk_surface_.reset();
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc index df79cc6..97599b1 100644 --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc
@@ -49,4 +49,11 @@ const base::Feature kDirectCompositionPreferNV12Overlays{ "DirectCompositionPreferNV12Overlays", base::FEATURE_DISABLED_BY_DEFAULT}; +// Controls the decode acceleration of JPEG images (as opposed to camera +// captures) in Chrome OS using the VA-API. +// TODO(andrescj): remove or enable by default in Chrome OS once +// https://crbug.com/868400 is resolved. +const base::Feature kVaapiJpegImageDecodeAcceleration{ + "VaapiJpegImageDecodeAcceleration", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace features
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h index 9b064a3..c4e6799e 100644 --- a/gpu/config/gpu_finch_features.h +++ b/gpu/config/gpu_finch_features.h
@@ -30,6 +30,8 @@ GPU_EXPORT extern const base::Feature kDirectCompositionPreferNV12Overlays; +GPU_EXPORT extern const base::Feature kVaapiJpegImageDecodeAcceleration; + } // namespace features #endif // GPU_CONFIG_GPU_FEATURES_H_
diff --git a/gpu/config/gpu_preferences.h b/gpu/config/gpu_preferences.h index 8fc47a80..7ca2142 100644 --- a/gpu/config/gpu_preferences.h +++ b/gpu/config/gpu_preferences.h
@@ -197,6 +197,8 @@ bool enable_oop_rasterization = false; bool disable_oop_rasterization = false; + bool enable_oop_rasterization_ddl = false; + // Start the watchdog suspended, as the app is already backgrounded and won't // send a background/suspend signal. bool watchdog_starts_backgrounded = false;
diff --git a/gpu/config/gpu_preferences_unittest.cc b/gpu/config/gpu_preferences_unittest.cc index 3647d83..d31ea56 100644 --- a/gpu/config/gpu_preferences_unittest.cc +++ b/gpu/config/gpu_preferences_unittest.cc
@@ -98,10 +98,10 @@ GpuPreferences default_prefs; mojom::GpuPreferences prefs_mojom; - // Make sure all feilds are included in mojo struct. + // Make sure all fields are included in mojo struct. // TODO(zmo): This test isn't perfect. If a field isn't included in - // mojom::GpuPreferences, but because of alignment, the two struct sizes - // could still be the same. + // mojom::GpuPreferences, the two struct sizes might still be equal due to + // alignment. EXPECT_EQ(sizeof(default_prefs), sizeof(prefs_mojom)); #define GPU_PREFERENCES_FIELD(name, value) \
diff --git a/gpu/ipc/common/gpu_preferences.mojom b/gpu/ipc/common/gpu_preferences.mojom index b2940ad..05e89ef 100644 --- a/gpu/ipc/common/gpu_preferences.mojom +++ b/gpu/ipc/common/gpu_preferences.mojom
@@ -62,6 +62,7 @@ bool ignore_gpu_blacklist; bool enable_oop_rasterization; bool disable_oop_rasterization; + bool enable_oop_rasterization_ddl; bool watchdog_starts_backgrounded; bool enable_vulkan; bool enable_gpu_benchmarking_extension;
diff --git a/gpu/ipc/common/gpu_preferences_struct_traits.h b/gpu/ipc/common/gpu_preferences_struct_traits.h index 11340777..cc8afa7 100644 --- a/gpu/ipc/common/gpu_preferences_struct_traits.h +++ b/gpu/ipc/common/gpu_preferences_struct_traits.h
@@ -118,6 +118,7 @@ out->ignore_gpu_blacklist = prefs.ignore_gpu_blacklist(); out->enable_oop_rasterization = prefs.enable_oop_rasterization(); out->disable_oop_rasterization = prefs.disable_oop_rasterization(); + out->enable_oop_rasterization_ddl = prefs.enable_oop_rasterization_ddl(); out->watchdog_starts_backgrounded = prefs.watchdog_starts_backgrounded(); out->enable_vulkan = prefs.enable_vulkan(); out->enable_gpu_benchmarking_extension = @@ -256,6 +257,9 @@ static bool disable_oop_rasterization(const gpu::GpuPreferences& prefs) { return prefs.disable_oop_rasterization; } + static bool enable_oop_rasterization_ddl(const gpu::GpuPreferences& prefs) { + return prefs.enable_oop_rasterization_ddl; + } static bool watchdog_starts_backgrounded(const gpu::GpuPreferences& prefs) { return prefs.watchdog_starts_backgrounded; }
diff --git a/headless/lib/dom_tree_extraction_expected_nodes.txt b/headless/lib/dom_tree_extraction_expected_nodes.txt index fe074127..22008d96 100644 --- a/headless/lib/dom_tree_extraction_expected_nodes.txt +++ b/headless/lib/dom_tree_extraction_expected_nodes.txt
@@ -14,7 +14,9 @@ "layoutNodeIndex": 0, "nodeName": "#document", "nodeType": 9, - "nodeValue": "" + "nodeValue": "", + "scrollOffsetX": 0.0, + "scrollOffsetY": 0.0 } { "backendNodeId": "?", @@ -120,7 +122,7 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 354.0, + "height": 353.4375, "width": 784.0, "x": 8.0, "y": 8.0 @@ -201,10 +203,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 205.0, + "height": 204.0, "width": 404.0, "x": 8.0, - "y": 61.0 + "y": 61.4375 }, "contentDocumentIndex": 18, "frameId": "?", @@ -230,7 +232,9 @@ "layoutNodeIndex": 7, "nodeName": "#document", "nodeType": 9, - "nodeValue": "" + "nodeValue": "", + "scrollOffsetX": 0.0, + "scrollOffsetY": 0.0 } { "backendNodeId": "?", @@ -257,7 +261,7 @@ { "backendNodeId": "?", "boundingBox": { - "height": 171.0, + "height": 170.5625, "width": 384.0, "x": 8.0, "y": 8.0 @@ -301,7 +305,7 @@ "backendNodeId": "?", "boundingBox": { "height": 36.0, - "width": 308.0, + "width": 307.734375, "x": 8.0, "y": 8.0 }, @@ -350,10 +354,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 97.0, + "height": 96.0, "width": 784.0, "x": 8.0, - "y": 265.0 + "y": 265.4375 }, "childNodeIndexes": [ 28, 29, 48 ], "layoutNodeIndex": 13, @@ -375,10 +379,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 97.0, + "height": 96.0, "width": 784.0, "x": 8.0, - "y": 265.0 + "y": 265.4375 }, "childNodeIndexes": [ 30, 31, 47 ], "layoutNodeIndex": 14, @@ -400,10 +404,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 97.0, + "height": 96.0, "width": 784.0, "x": 8.0, - "y": 265.0 + "y": 265.4375 }, "childNodeIndexes": [ 32, 33, 35, 36, 38, 39, 40, 41, 46 ], "layoutNodeIndex": 15, @@ -425,10 +429,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 112.0, "x": 8.0, - "y": 265.0 + "y": 265.4375 }, "childNodeIndexes": [ 34 ], "isClickable": true, @@ -441,10 +445,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 112.0, "x": 8.0, - "y": 265.0 + "y": 265.4375 }, "inlineTextNodes": [ { "boundingBox": { @@ -481,10 +485,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 784.0, "x": 8.0, - "y": 297.0 + "y": 297.4375 }, "childNodeIndexes": [ 37 ], "layoutNodeIndex": 19, @@ -496,10 +500,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 192.0, "x": 8.0, - "y": 297.0 + "y": 297.4375 }, "inlineTextNodes": [ { "boundingBox": { @@ -527,10 +531,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 0.0, "x": 8.0, - "y": 329.0 + "y": 329.4375 }, "inlineTextNodes": [ { "boundingBox": { @@ -562,10 +566,10 @@ } ], "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 784.0, "x": 8.0, - "y": 345.0 + "y": 345.4375 }, "childNodeIndexes": [ 42, 43, 45 ], "layoutNodeIndex": 22, @@ -577,10 +581,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 80.0, "x": 8.0, - "y": 345.0 + "y": 345.4375 }, "inlineTextNodes": [ { "boundingBox": { @@ -602,10 +606,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 80.0, "x": 88.0, - "y": 345.0 + "y": 345.4375 }, "childNodeIndexes": [ 44 ], "layoutNodeIndex": 24, @@ -617,10 +621,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 80.0, "x": 88.0, - "y": 345.0 + "y": 345.4375 }, "inlineTextNodes": [ { "boundingBox": { @@ -642,10 +646,10 @@ { "backendNodeId": "?", "boundingBox": { - "height": 17.0, + "height": 16.0, "width": 128.0, "x": 168.0, - "y": 345.0 + "y": 345.4375 }, "inlineTextNodes": [ { "boundingBox": {
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg index 3761a1b..c7d43df 100644 --- a/infra/config/global/luci-milo.cfg +++ b/infra/config/global/luci-milo.cfg
@@ -1264,8 +1264,7 @@ short_name: "mac" } builders { - name: "buildbot/chromium.perf/Linux Builder Perf" - name: "buildbucket/luci.chrome.ci/Linux Builder Perf" + name: "buildbucket/luci.chrome.ci/linux-builder-perf" category: "builder" short_name: "lnx" } @@ -2030,7 +2029,7 @@ builders { name: "buildbot/chromium.clang/ToTiOS" category: "iOS" - short_name: "fat" + short_name: "sim" } builders { name: "buildbot/chromium.clang/ToTiOSDevice"
diff --git a/ios/BUILD.gn b/ios/BUILD.gn index 94c73a6..f09a7eb2 100644 --- a/ios/BUILD.gn +++ b/ios/BUILD.gn
@@ -4,6 +4,7 @@ assert(!is_component_build, "component build is unsupported on iOS") +import("//build/config/ios/ios_sdk.gni") import("//ios/features.gni") declare_args() { @@ -36,6 +37,8 @@ "//components/cronet/ios:cronet_package", ] } else { + assert(xcode_version_int >= 1000, "Xcode 10 is required.") + deps = [ # List all the targets that need to be built on iOS by default. "//ios/chrome/app:chrome",
diff --git a/ios/build/bots/chromium.clang/ToTiOS.json b/ios/build/bots/chromium.clang/ToTiOS.json index 4a4904f..b9ecca3 100644 --- a/ios/build/bots/chromium.clang/ToTiOS.json +++ b/ios/build/bots/chromium.clang/ToTiOS.json
@@ -8,8 +8,8 @@ "is_component_build=false", "is_debug=false", "llvm_force_head_revision=true", - "additional_target_cpus=[\"arm64\",\"x64\",\"x86\"]", - "target_cpu=\"arm\"", + "additional_target_cpus=[\"x86\"]", + "target_cpu=\"x64\"", "target_os=\"ios\"" ], "additional_compile_targets": [ @@ -23,86 +23,171 @@ { "app": "base_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "boringssl_crypto_tests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "boringssl_ssl_tests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "components_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "crypto_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "gfx_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "google_apis_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ios_chrome_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ios_net_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ios_web_inttests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ios_web_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ios_web_view_inttests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "net_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "skia_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "sql_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "ui_base_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" }, { "app": "url_unittests", "device type": "iPhone 6s", + "dimensions": [ + { "os": "Mac-10.13.4", "pool": "Chrome" }, + { "os": "Mac-10.13.5", "pool": "Chrome" }, + { "os": "Mac-10.13.6", "pool": "Chrome" } + ], "os": "12.0" } ]
diff --git a/ios/build/bots/chromium.clang/ToTiOSDevice.json b/ios/build/bots/chromium.clang/ToTiOSDevice.json index 56d82cf0e..8471878 100644 --- a/ios/build/bots/chromium.clang/ToTiOSDevice.json +++ b/ios/build/bots/chromium.clang/ToTiOSDevice.json
@@ -38,87 +38,87 @@ { "app": "base_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "boringssl_crypto_tests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "boringssl_ssl_tests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "components_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "crypto_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "gfx_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "google_apis_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ios_chrome_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ios_net_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ios_web_inttests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ios_web_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ios_web_view_inttests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "net_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "skia_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "sql_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "ui_base_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" }, { "app": "url_unittests", "device type": "iPhone 6s", - "os": "11.4" + "os": "11.4.1" } ], "expiration_time": 10800
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb index 88e9ecfd..d5cba36d 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -53,7 +53,7 @@ <translation id="8175055321229419309">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chromium-ത്തെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation> <translation id="8252885722420466166">Chromium-ത്തിൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം സ്വന്തമാക്കുക.</translation> <translation id="8353224596138547809">ഈ സൈറ്റിനായുള്ള നിങ്ങളുടെ പാസ്വേഡ് Chromium സംരക്ഷിക്കണമെന്ന് നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുണ്ടോ?</translation> -<translation id="8508544542427105412">ഏതുസമയത്തും <ph name="BEGIN_LINK" />ക്രമീകരണം<ph name="END_LINK" /> ഇഷ്ടാനുസൃതമാക്കാം. Chromium, Translate, തിരയൽ, പരസ്യങ്ങൾ എന്നിവ പോലുള്ള Google സേവനങ്ങൾ വ്യക്തിപരമാക്കാൻ, നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകളിലെ ഉള്ളടക്കം, ബ്രൗസർ ഇടപെടലുകൾ, ആക്റ്റിവിറ്റി എന്നിവ Google ഉപയോഗിച്ചേക്കാം.</translation> +<translation id="8508544542427105412">ഏതുസമയത്തും <ph name="BEGIN_LINK" />ക്രമീകരണം<ph name="END_LINK" /> ഇഷ്ടാനുസൃതമാക്കാം. Translate, തിരയൽ, പരസ്യങ്ങൾ എന്നിവ പോലുള്ള Google സേവനങ്ങൾ, Chromium എന്നിവ വ്യക്തിപരമാക്കാൻ, നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകളിലെ ഉള്ളടക്കം, ബ്രൗസർ ഇടപെടലുകൾ, ആക്റ്റിവിറ്റി എന്നിവ Google ഉപയോഗിച്ചേക്കാം.</translation> <translation id="8586442755830160949">പകർപ്പവകാശം <ph name="YEAR" /> Chromium രചയിതാക്കൾ. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> <translation id="8809780021347235332">ചിത്രങ്ങൾ സംരക്ഷിക്കാൻ, ക്രമീകരണത്തിൽ ടാപ്പുചെയ്ത് നിങ്ങളുടെ ഫോട്ടോകൾ ഉപയോഗിക്കാൻ Chromium-ത്തെ അനുവദിക്കുക</translation> <translation id="9022552996538154597">Chromium-ത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb index 87b1865..ea056b2a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -35,7 +35,7 @@ <translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജുചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation> <translation id="5240817131241497236">Chrome-ൽ സമന്വയം, വ്യക്തിപരമാക്കൽ, മറ്റ് Google സേവനങ്ങൾ എന്നിവ നിയന്ത്രിക്കുന്ന ക്രമീകരണം മാറിയിട്ടുണ്ട്. ഇത് നിങ്ങളുടെ ക്രമീകരണത്തെ ബാധിച്ചേക്കാം.</translation> <translation id="5389212809648216794">മറ്റൊരു അപ്ലിക്കേഷൻ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നതിനാൽ Google Chrome-ന് അത് ഉപയോഗിക്കാനാവില്ല</translation> -<translation id="5489543008378040943">ഏത് സമയത്തും <ph name="END_LINK" />ക്രമീകരണം<ph name="BEGIN_LINK" /> ഇഷ്ടാനുസൃതമാക്കാം. Chrome, Translate, തിരയൽ, പരസ്യങ്ങൾ പോലുള്ള Google സേവനങ്ങൾ വ്യക്തിപരമാക്കാൻ നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകളിലെ ഉള്ളടക്കം, ബ്രൗസർ ഇടപെടലുകൾ, ആക്റ്റിവിറ്റി എന്നിവ Google ഉപയോഗിച്ചേക്കാം.</translation> +<translation id="5489543008378040943">ഏത് സമയത്തും <ph name="BEGIN_LINK" />ക്രമീകരണം<ph name="END_LINK" /> ഇഷ്ടാനുസൃതമാക്കാം. Translate, തിരയൽ, പരസ്യങ്ങൾ പോലുള്ള Google സേവനങ്ങൾ, Chrome എന്നിവ വ്യക്തിപരമാക്കാൻ നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകളിലെ ഉള്ളടക്കം, ബ്രൗസർ ഇടപെടലുകൾ, ആക്റ്റിവിറ്റി എന്നിവ Google ഉപയോഗിച്ചേക്കാം.</translation> <translation id="5639704535586432836">ക്രമീകരണം > സ്വകാര്യത > ക്യാമറ > Google Chrome തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation> <translation id="5642200033778930880">വിഭജിത കാഴ്ച മോഡിൽ Google Chrome-ന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation> <translation id="5703130498371792817">Chrome ആസ്വദിക്കുന്നുണ്ടോ? <ph name="BEGIN_LINK" />ഈ ആപ്പ് റേറ്റുചെയ്യുക<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 9fc64d2..c7189390e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">ንጥል ተዘምኗል</translation> <translation id="1047726139967079566">ለእዚህ ገጽ ዕልባት አዘጋጅ…</translation> <translation id="1049743911850919806">ማንነት የማያሳውቅ</translation> +<translation id="1063454504051558093">ሌላ የይለፍ ቃል ይጠቀሙ...</translation> <translation id="1076421457278169141">ኮድ ተቃኝቷል</translation> <translation id="1084365883616172403">የFacebook ልጥፍ ተጠናቅቋል።</translation> <translation id="1104948393051856124">ተቀበል እና ቀጥል</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">የጥቅመት ብዛትን ላክ</translation> <translation id="1886928167269928266">የጊዜ መጀመሪያ</translation> <translation id="1911619930368729126">ወደ Google Drive ስቀል</translation> +<translation id="191179954310195971">ሌሎች የGoogle አገልግሎቶች</translation> <translation id="1941314575388338491">ለመቅዳት ሁለቴ መታ ያድርጉ።</translation> <translation id="1952728750904661634">በሚተዳደር መለያ ይግቡ</translation> <translation id="1974060860693918893">የላቀ</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">የንባብ ዝርዝርዎ ከመስመር ውጭ ይገኛል። አንድ ገጽ ወደ የእርስዎ የንባብ ዝርዝር ለማከል <ph name="SHARE_OPENING_ICON" />ን መታ ያድርጉ።</translation> <translation id="3638472932233958418">ድረ-ገጾችን አስቀድመው ይጫኑ</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ላይ ዕልባት ተደርጓል</translation> +<translation id="3765471630796399471">ሌላ የይለፍ ቃል ይጠቀሙ</translation> <translation id="3771033907050503522">ማንነት የማያሳውቁ ትሮች</translation> <translation id="3779810277399252432">ምንም የበይነመረብ ግንኙነት የለም።</translation> <translation id="3783017676699494206">ምስሉን አስቀምጥ</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">ጽሑፍ አጽዳ</translation> <translation id="6346549652287021269">አዲስ ውርድ ይጀመር?</translation> <translation id="6362362396625799311">ምንም ማንነት የማያሳውቁ ትሮች የሉም</translation> +<translation id="6363526231572697780">ምንም የተጠቃሚ ስም የለም</translation> <translation id="6374469231428023295">እንደገና ይሞክሩ</translation> <translation id="6380866119319257197">የእርስዎን የይለፍሐረግ ከረሱት ወይም ይህን ቅንብር መለወጥ ከፈለጉ <ph name="BEGIN_LINK" />ስምረትን ዳግም ያስጀምሩ<ph name="END_LINK" /></translation> <translation id="6389470377220713856">በካርድ ላይ ያለ ስም</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index dda2778..551417a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">تم تحديث العنصر</translation> <translation id="1047726139967079566">وضع إشارة مرجعية على هذه الصفحة...</translation> <translation id="1049743911850919806">التصفح المتخفي</translation> +<translation id="1063454504051558093">استخدام كلمة مرور أخرى...</translation> <translation id="1076421457278169141">تم مسح الرمز ضوئيًا</translation> <translation id="1084365883616172403">اكتمل النشر على Facebook.</translation> <translation id="1104948393051856124">القبول والمتابعة</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">إرسال بيانات الاستخدام</translation> <translation id="1886928167269928266">بدايةَ الوقت</translation> <translation id="1911619930368729126">التحميل إلى Google Drive</translation> +<translation id="191179954310195971">خدمات Google الأخرى</translation> <translation id="1941314575388338491">انقر مرّتين للنسخ.</translation> <translation id="1952728750904661634">تسجيل الدخول باستخدام حساب مُدار</translation> <translation id="1974060860693918893">إعدادات متقدمة</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">قائمة القراءة متاحة بلا اتصال بالإنترنت. لإضافة صفحة إلى قائمة القراءة، انقر على <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">تحميل صفحات الويب مسبقًا</translation> <translation id="3691593122358196899">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">استخدام كلمة مرور أخرى</translation> <translation id="3771033907050503522">علامات تبويب التصفح المتخفي</translation> <translation id="3779810277399252432">لا يتوفر اتصال بالإنترنت.</translation> <translation id="3783017676699494206">حفظ الصورة</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">محو النص</translation> <translation id="6346549652287021269">هل تريد بدء تنزيل جديد؟</translation> <translation id="6362362396625799311">لا توجد علامات تبويب للتصفح المتخفي</translation> +<translation id="6363526231572697780">ليس هناك اسم مستخدم</translation> <translation id="6374469231428023295">إعادة المحاولة</translation> <translation id="6380866119319257197">إذا كنت قد نسيت عبارة المرور أو ترغب في تغيير هذا الإعداد، يمكنك <ph name="BEGIN_LINK" />إعادة تعيين المزامنة<ph name="END_LINK" /></translation> <translation id="6389470377220713856">الاسم كما في البطاقة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 5fd1975..4fcfa26 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Елементът е актуализиран</translation> <translation id="1047726139967079566">Запазване на отметка към тази страница...</translation> <translation id="1049743911850919806">„Инкогнито“</translation> +<translation id="1063454504051558093">Използване на друга парола...</translation> <translation id="1076421457278169141">Кодът бе сканиран</translation> <translation id="1084365883616172403">Публикацията във Facebook е завършена.</translation> <translation id="1104948393051856124">Приемам! Напред</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Send Usage Data</translation> <translation id="1886928167269928266">Самото начало</translation> <translation id="1911619930368729126">Качване в Google Диск</translation> +<translation id="191179954310195971">Други услуги на Google</translation> <translation id="1941314575388338491">Докоснете двукратно, за да копирате.</translation> <translation id="1952728750904661634">Влизане с управляван профил</translation> <translation id="1974060860693918893">Разширени</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Списъкът ви за четене е налице офлайн. За да добавите страница към него, докоснете „<ph name="SHARE_OPENING_ICON" />“.</translation> <translation id="3638472932233958418">Предв. зареждане на уеб стр.</translation> <translation id="3691593122358196899">Отметката бе запазена в/ъв „<ph name="FOLDER_TITLE" />“</translation> +<translation id="3765471630796399471">Използване на друга парола</translation> <translation id="3771033907050503522">Раздели „инкогнито“</translation> <translation id="3779810277399252432">Няма връзка с интернет.</translation> <translation id="3783017676699494206">Запазване на изобрaжението</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Изчистване на текста</translation> <translation id="6346549652287021269">Да се стартира ли ново изтегляне?</translation> <translation id="6362362396625799311">Няма раздели в режим „инкогнито“</translation> +<translation id="6363526231572697780">Няма потребителско име</translation> <translation id="6374469231428023295">Нов опит</translation> <translation id="6380866119319257197">Ако забравите пропуска си или искате да промените тази настройка, <ph name="BEGIN_LINK" />нулирайте синхронизирането<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Име върху картата</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 42b3f6a..9af8c47f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">S'ha actualitzat l'element.</translation> <translation id="1047726139967079566">Afegeix aquesta pàgina a les adreces d'interès...</translation> <translation id="1049743911850919806">Incògnit</translation> +<translation id="1063454504051558093">Utilitza una altra contrasenya...</translation> <translation id="1076421457278169141">S'ha escanejat el codi</translation> <translation id="1084365883616172403">S'ha completat la publicació a Facebook.</translation> <translation id="1104948393051856124">Accepta i continua</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Envia les dades d'ús</translation> <translation id="1886928167269928266">L'inici</translation> <translation id="1911619930368729126">Penja a Google Drive</translation> +<translation id="191179954310195971">Altres serveis de Google</translation> <translation id="1941314575388338491">Feu doble toc per copiar-ho.</translation> <translation id="1952728750904661634">Inicieu la sessió amb un compte gestionat</translation> <translation id="1974060860693918893">Configuració avançada</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">La llista de lectura està disponible sense connexió. Per afegir-hi una pàgina, toca <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Càrrega prèvia de pàgines web</translation> <translation id="3691593122358196899">Adreça d'interès afegida a <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Utilitza una altra contrasenya</translation> <translation id="3771033907050503522">Pestanyes d'incògnit</translation> <translation id="3779810277399252432">No hi ha connexió a Internet.</translation> <translation id="3783017676699494206">Desa la imatge</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Esborra el text</translation> <translation id="6346549652287021269">Vols iniciar una baixada nova?</translation> <translation id="6362362396625799311">No hi ha cap pestanya d'incògnit</translation> +<translation id="6363526231572697780">Sense nom d'usuari</translation> <translation id="6374469231428023295">Torna-ho a provar</translation> <translation id="6380866119319257197">Si oblideu la frase de contrasenya o voleu canviar aquesta configuració, <ph name="BEGIN_LINK" />restabliu la sincronització<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Titular de la targeta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index ac5faba..b975dc8e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Položka byla aktualizována</translation> <translation id="1047726139967079566">Přidat stránku do záložek...</translation> <translation id="1049743911850919806">Anonymní režim</translation> +<translation id="1063454504051558093">Použit jiné heslo...</translation> <translation id="1076421457278169141">Kód byl naskenován</translation> <translation id="1084365883616172403">Příspěvek na Facebook byl odeslán.</translation> <translation id="1104948393051856124">Přijmout a pokračovat</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Odesílat data o využití</translation> <translation id="1886928167269928266">Od počátku věků</translation> <translation id="1911619930368729126">Nahrát na Disk Google</translation> +<translation id="191179954310195971">Další služby Google</translation> <translation id="1941314575388338491">Zkopírujete dvojitým klepnutím.</translation> <translation id="1952728750904661634">Přihlášení pomocí spravovaného účtu</translation> <translation id="1974060860693918893">Rozšířená nastavení</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Seznam obsahu k přečtení je k dispozici offline. Chcete-li na něj přidat stránku, klepněte na <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Přednačítat stránky</translation> <translation id="3691593122358196899">Záložka přidána do složky <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Použijte jiné heslo</translation> <translation id="3771033907050503522">Anonymní karty</translation> <translation id="3779810277399252432">Nejste připojeni k internetu</translation> <translation id="3783017676699494206">Uložit obrázek</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Smazat text</translation> <translation id="6346549652287021269">Zahájit nové stahování?</translation> <translation id="6362362396625799311">Žádné anonymní karty</translation> +<translation id="6363526231572697780">Žádné uživatelské jméno</translation> <translation id="6374469231428023295">Zkusit znovu</translation> <translation id="6380866119319257197">Pokud heslovou frázi zapomenete nebo toto nastavení budete chtít změnit, <ph name="BEGIN_LINK" />resetujte synchronizaci<ph name="END_LINK" />.</translation> <translation id="6389470377220713856">Jméno na kartě</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 9c4c2b0..e1d9197 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elementet blev opdateret</translation> <translation id="1047726139967079566">Tilføj denne side som bogmærke...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Brug en anden adgangskode...</translation> <translation id="1076421457278169141">Koden er scannet</translation> <translation id="1084365883616172403">Indlæg delt på Facebook.</translation> <translation id="1104948393051856124">Acceptér og fortsæt</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Send anvendelsesdata</translation> <translation id="1886928167269928266">Altid</translation> <translation id="1911619930368729126">Upload til Google Drev</translation> +<translation id="191179954310195971">Andre Google-tjenester</translation> <translation id="1941314575388338491">Tryk to gange for at kopiere.</translation> <translation id="1952728750904661634">Log ind med en administreret konto</translation> <translation id="1974060860693918893">Avanceret</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Din læseliste er tilgængelig offline. Du kan føje en side til din læseliste ved at trykke på <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Forudindlæs websider</translation> <translation id="3691593122358196899">Bogmærket er gemt i <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Brug en anden adgangskode</translation> <translation id="3771033907050503522">Inkognitofaner</translation> <translation id="3779810277399252432">Ingen internetforbindelse.</translation> <translation id="3783017676699494206">Gem billede</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Ryd tekst</translation> <translation id="6346549652287021269">Vil du starte en ny download?</translation> <translation id="6362362396625799311">Ingen inkognitofaner</translation> +<translation id="6363526231572697780">Der er intet brugernavn</translation> <translation id="6374469231428023295">Prøv igen</translation> <translation id="6380866119319257197">Hvis du glemmer din adgangssætning eller vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Navn på kort</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index e442fca..1e0fbb8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Element aktualisiert</translation> <translation id="1047726139967079566">Lesezeichen für diese Seite erstellen</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Anderes Passwort verwenden…</translation> <translation id="1076421457278169141">Code gescannt</translation> <translation id="1084365883616172403">Facebook-Beitrag gepostet</translation> <translation id="1104948393051856124">Akzeptieren & weiter</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Nutzungsdaten senden</translation> <translation id="1886928167269928266">Für gesamten Zeitraum</translation> <translation id="1911619930368729126">Auf Google Drive hochladen</translation> +<translation id="191179954310195971">Weitere Google-Dienste</translation> <translation id="1941314575388338491">Tippen Sie zum Kopieren hier doppelt.</translation> <translation id="1952728750904661634">Mit verwaltetem Konto anmelden</translation> <translation id="1974060860693918893">Erweitert</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Ihre Leseliste ist offline verfügbar. Um Ihrer Leseliste eine Seite hinzuzufügen, tippen Sie auf <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Webseiten vorabladen</translation> <translation id="3691593122358196899">Als Lesezeichen in "<ph name="FOLDER_TITLE" />" gespeichert</translation> +<translation id="3765471630796399471">Anderes Passwort verwenden</translation> <translation id="3771033907050503522">Inkognito-Tabs</translation> <translation id="3779810277399252432">Keine Internetverbindung</translation> <translation id="3783017676699494206">Bild speichern</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Text entfernen</translation> <translation id="6346549652287021269">Neuen Download starten?</translation> <translation id="6362362396625799311">Keine Inkognito-Tabs</translation> +<translation id="6363526231572697780">Kein Nutzername</translation> <translation id="6374469231428023295">Erneut versuchen</translation> <translation id="6380866119319257197">Wenn Sie Ihre Passphrase vergessen oder diese Einstellung ändern möchten, <ph name="BEGIN_LINK" />setzen Sie die Synchronisierung zurück<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Name auf Karte</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index b9be427c..9782b775 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Το στοιχείο ενημερώθηκε</translation> <translation id="1047726139967079566">Τοποθέτηση Σελιδοδείκτη σε Αυτήν τη Σελίδα...</translation> <translation id="1049743911850919806">Ανώνυμη περιήγηση</translation> +<translation id="1063454504051558093">Χρήση άλλου κωδικού πρόσβασης…</translation> <translation id="1076421457278169141">Ο κώδικας σαρώθηκε</translation> <translation id="1084365883616172403">Η ανάρτηση στο Facebook ολοκληρώθηκε.</translation> <translation id="1104948393051856124">Αποδοχή και συνέχεια</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Αποστ. δεδομ. χρήσης</translation> <translation id="1886928167269928266">Από την αρχή</translation> <translation id="1911619930368729126">Μεταφόρ.στο Google Drive</translation> +<translation id="191179954310195971">Άλλες υπηρεσίες Google</translation> <translation id="1941314575388338491">Πατήστε δύο φορές για αντιγραφή.</translation> <translation id="1952728750904661634">Σύνδεση με διαχειριζόμενο λογαριασμό</translation> <translation id="1974060860693918893">Σύνθετες</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Η λίστα ανάγνωσης είναι διαθέσιμη εκτός σύνδεσης. Για να προσθέσετε μια σελίδα στη λίστα ανάγνωσης, πατήστε το εικονίδιο <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Προφόρτ. ιστοσελίδων</translation> <translation id="3691593122358196899">Ο σελιδοδείκτης είναι στο "<ph name="FOLDER_TITLE" />"</translation> +<translation id="3765471630796399471">Χρήση άλλου κωδικού πρόσβασης</translation> <translation id="3771033907050503522">Καρτ.αν.περιήγ.</translation> <translation id="3779810277399252432">Δεν υπάρχει σύνδεση στο διαδίκτυο.</translation> <translation id="3783017676699494206">Αποθήκευση εικόνας</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Διαγραφή κειμένου</translation> <translation id="6346549652287021269">Να ξεκινήσει νέα λήψη;</translation> <translation id="6362362396625799311">Δεν υπάρχουν καρτέλες ανώνυμης περιήγησης</translation> +<translation id="6363526231572697780">Δεν υπάρχει όνομα χρήστη</translation> <translation id="6374469231428023295">Δοκιμάστε ξανά</translation> <translation id="6380866119319257197">Εάν ξεχάσετε τη φράση πρόσβασής σας ή θέλετε να αλλάξετε αυτήν τη ρύθμιση, <ph name="BEGIN_LINK" />επαναφέρετε το συγχρονισμό<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Όνομα σε κάρτα</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 113a932..c91be9b8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elemento actualizado</translation> <translation id="1047726139967079566">Añadir esta página a marcadores...</translation> <translation id="1049743911850919806">Incógnito</translation> +<translation id="1063454504051558093">Usar otra contraseña...</translation> <translation id="1076421457278169141">Código escaneado</translation> <translation id="1084365883616172403">Publicado en Facebook</translation> <translation id="1104948393051856124">Aceptar y continuar</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Enviar datos de uso</translation> <translation id="1886928167269928266">Desde siempre</translation> <translation id="1911619930368729126">Subir a Google Drive</translation> +<translation id="191179954310195971">Otros servicios de Google</translation> <translation id="1941314575388338491">Toca dos veces para copiar.</translation> <translation id="1952728750904661634">Inicia sesión con una cuenta gestionada</translation> <translation id="1974060860693918893">Configuración avanzada</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Tu lista de lectura está disponible sin conexión. Para añadir una página a la lista, toca <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Precargar páginas web</translation> <translation id="3691593122358196899">Marcador añadido a <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Usar otra contraseña</translation> <translation id="3771033907050503522">Pestañas incógnito</translation> <translation id="3779810277399252432">No hay conexión a Internet.</translation> <translation id="3783017676699494206">Guardar imagen</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Borrar texto</translation> <translation id="6346549652287021269">¿Quieres iniciar una nueva descarga?</translation> <translation id="6362362396625799311">No hay pestañas de incógnito</translation> +<translation id="6363526231572697780">Ningún nombre de usuario</translation> <translation id="6374469231428023295">Volver a intentarlo</translation> <translation id="6380866119319257197">Si has olvidado tu frase de contraseña o quieres cambiar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nombre de la tarjeta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index b2b30c90..c0eae69 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Üksus on värskendatud</translation> <translation id="1047726139967079566">Lisa selle lehe järjehoidja...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Kasuta muud parooli …</translation> <translation id="1076421457278169141">Kood on skannitud</translation> <translation id="1084365883616172403">Facebooki postitus on valmis.</translation> <translation id="1104948393051856124">Nõustu ja jätka</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Kasutusandm. saatm.</translation> <translation id="1886928167269928266">Alates algusest</translation> <translation id="1911619930368729126">Laadi üles Google Drive'i</translation> +<translation id="191179954310195971">Muud Google'i teenused</translation> <translation id="1941314575388338491">Kopeerimiseks topeltpuudutage.</translation> <translation id="1952728750904661634">Sisselogimine hallatud kontoga</translation> <translation id="1974060860693918893">Täpsemad</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Teie lugemisloend on võrguühenduseta saadaval. Lugemisloendisse lehe lisamiseks puudutage ikooni <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Lehtede eellaadimine</translation> <translation id="3691593122358196899">Lisatud järjehoidjana kausta <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Kasuta muud parooli</translation> <translation id="3771033907050503522">Inkogn. vahelehed</translation> <translation id="3779810277399252432">Interneti-ühendus puudub.</translation> <translation id="3783017676699494206">Salvesta kujutis</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Lihttekst</translation> <translation id="6346549652287021269">Kas alustada uut allalaadimist?</translation> <translation id="6362362396625799311">Inkognito vahelehti ei ole</translation> +<translation id="6363526231572697780">Kasutajanimi puudub</translation> <translation id="6374469231428023295">Proovi uuesti</translation> <translation id="6380866119319257197">Kui unustate parooli või soovite seda seadet muuta, <ph name="BEGIN_LINK" />lähtestage sünkroonimine<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nimi kaardil</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index dcb2b5d9..43ac258 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">مورد بهروز شد</translation> <translation id="1047726139967079566">نشانک گذاری این صفحه...</translation> <translation id="1049743911850919806">ناشناس</translation> +<translation id="1063454504051558093">استفاده از سایر گذرواژهها…</translation> <translation id="1076421457278169141">کد اسکن شد</translation> <translation id="1084365883616172403">پست Facebook ارسال شد.</translation> <translation id="1104948393051856124">پذیرش و ادامه</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">ارسال داده استفاده</translation> <translation id="1886928167269928266">از ابتدا</translation> <translation id="1911619930368729126">بارگذاری در Google Drive</translation> +<translation id="191179954310195971">سایر سرویسهای Google</translation> <translation id="1941314575388338491">برای کپی کردن دو ضربه سریع بزنید.</translation> <translation id="1952728750904661634">ورود به سیستم با حساب مدیریتشده</translation> <translation id="1974060860693918893">پیشرفته</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">فهرست خواندن شما در حالت آفلاین در دسترس است. برای افزودن صفحهای به فهرست خواندنتان، روی <ph name="SHARE_OPENING_ICON" /> ضربه بزنید.</translation> <translation id="3638472932233958418">صفحات وب از پیش بارگیری شده</translation> <translation id="3691593122358196899">نشانک به <ph name="FOLDER_TITLE" /> اضافه شد</translation> +<translation id="3765471630796399471">استفاده از سایر گذرواژهها</translation> <translation id="3771033907050503522">برگههای ناشناس</translation> <translation id="3779810277399252432">اتصال اینترنتی ندارید</translation> <translation id="3783017676699494206">ذخیره تصویر</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">پاککردن نوشتار</translation> <translation id="6346549652287021269">بارگیری جدید شروع شود؟</translation> <translation id="6362362396625799311">برگه ناشناسی موجود نیست</translation> +<translation id="6363526231572697780">بدون نام کاربری</translation> <translation id="6374469231428023295">دوباره امتحان کنید</translation> <translation id="6380866119319257197">اگر عبارت عبورتان را فراموش کردید یا میخواهید این تنظیم را تغییر دهید، <ph name="BEGIN_LINK" />همگامسازی را بازنشانی کنید<ph name="END_LINK" /></translation> <translation id="6389470377220713856">نام روی کارت</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 750b66e87..b8df002 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Na-update ang item</translation> <translation id="1047726139967079566">Bookmark This Page...</translation> <translation id="1049743911850919806">Incognito</translation> +<translation id="1063454504051558093">Gumamit ng Ibang Password...</translation> <translation id="1076421457278169141">Na-scan na ang code</translation> <translation id="1084365883616172403">Kumpleto na ang pag-post sa Facebook.</translation> <translation id="1104948393051856124">Tanggapin at Magpatuloy</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Magpadala ng Data</translation> <translation id="1886928167269928266">Mula sa Umpisa</translation> <translation id="1911619930368729126">I-upload sa Google Drive</translation> +<translation id="191179954310195971">Iba Pang Serbisyo ng Google</translation> <translation id="1941314575388338491">I-double tap upang kopyahin.</translation> <translation id="1952728750904661634">Mag-sign in gamit ang isang pinamamahalaang account</translation> <translation id="1974060860693918893">Advanced</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Available offline ang iyong listahan ng babasahin. Upang magdagdag ng page sa listahan ng babasahin mo, i-tap ang <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Mag-preload ng Mga Webpage</translation> <translation id="3691593122358196899">Na-bookmark sa <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Gumamit ng Ibang Password</translation> <translation id="3771033907050503522">Mga Tab na Incognito</translation> <translation id="3779810277399252432">Walang koneksyon sa internet.</translation> <translation id="3783017676699494206">I-save ang Larawan</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">I-clear ang Teksto</translation> <translation id="6346549652287021269">Magsimula ng Bagong Download?</translation> <translation id="6362362396625799311">Walang Mga Tab na Incognito</translation> +<translation id="6363526231572697780">Walang Username</translation> <translation id="6374469231428023295">Subukang Muli</translation> <translation id="6380866119319257197">Kung makalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Pangalan sa Card</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 9159668..5540f5b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Élément mis à jour</translation> <translation id="1047726139967079566">Ajouter cette page aux favoris</translation> <translation id="1049743911850919806">Navigation privée</translation> +<translation id="1063454504051558093">Utiliser un autre mot de passe…</translation> <translation id="1076421457278169141">Code scanné</translation> <translation id="1084365883616172403">Post Facebook publié.</translation> <translation id="1104948393051856124">Accepter et continuer</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Envoyer les données d'utilisation</translation> <translation id="1886928167269928266">Depuis le début</translation> <translation id="1911619930368729126">Importer dans Google Drive</translation> +<translation id="191179954310195971">Autres services Google</translation> <translation id="1941314575388338491">Appuyez deux fois pour copier.</translation> <translation id="1952728750904661634">Se connecter avec un compte géré</translation> <translation id="1974060860693918893">Paramètres avancés</translation> @@ -126,7 +128,7 @@ <translation id="2969979262385602596">Échec de la connexion. Veuillez réessayer plus tard.</translation> <translation id="2989805286512600854">Ouvrir dans un nouvel onglet</translation> <translation id="3024255823539804759">Dernières 24 heures</translation> -<translation id="3037605927509011580">Aie aie aie</translation> +<translation id="3037605927509011580">Aïe aïe aïe</translation> <translation id="3112556859945124369">Marquer…</translation> <translation id="3151924044251363314">Seule une personne connaissant votre phrase secrète peut lire vos données chiffrées. La phrase secrète ne nous est pas envoyée et nous ne la stockons pas. Si vous l'oubliez, vous devrez réinitialiser la synchronisation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="3157684681743766797">Tout marquer…</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Votre liste de lecture est disponible hors connexion. Pour ajouter une page à cette liste, appuyez sur <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Précharger pages Web</translation> <translation id="3691593122358196899">Ajouté aux favoris dans "<ph name="FOLDER_TITLE" />"</translation> +<translation id="3765471630796399471">Utiliser un autre mot de passe</translation> <translation id="3771033907050503522">Ongl. navig. priv.</translation> <translation id="3779810277399252432">Aucune connexion Internet.</translation> <translation id="3783017676699494206">Enregistrer l'image</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Effacer le texte</translation> <translation id="6346549652287021269">Lancer un nouveau téléchargement ?</translation> <translation id="6362362396625799311">Aucun onglet de navigation privée</translation> +<translation id="6363526231572697780">Aucun nom d'utilisateur</translation> <translation id="6374469231428023295">Réessayer</translation> <translation id="6380866119319257197">Si vous oubliez votre phrase secrète, ou pour modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" />.</translation> <translation id="6389470377220713856">Nom sur la carte</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index e16684b..488f0ed 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">આઇટમ અપડેટ કરી</translation> <translation id="1047726139967079566">આ પૃષ્ઠને બુકમાર્ક કરો...</translation> <translation id="1049743911850919806">છૂપી</translation> +<translation id="1063454504051558093">અન્ય પાસવર્ડનો ઉપયોગ કરો...</translation> <translation id="1076421457278169141">કોડ સ્કેન કર્યો</translation> <translation id="1084365883616172403">Facebook પોસ્ટ પૂર્ણ કરી છે.</translation> <translation id="1104948393051856124">સ્વીકારો અને ચાલુ રાખો</translation> @@ -61,6 +62,7 @@ <translation id="1876721852596493031">ઉપયોગ ડેટા મોકલો</translation> <translation id="1886928167269928266">શરૂઆતથી</translation> <translation id="1911619930368729126">Google ડ્રાઇવ પર અપલોડ કરો</translation> +<translation id="191179954310195971">અન્ય Google સેવાઓ</translation> <translation id="1941314575388338491">કૉપિ કરવા માટે બે વાર ટૅપ કરો.</translation> <translation id="1952728750904661634">સંચાલિત એકાઉન્ટ સાથે સાઇન ઇન કરો</translation> <translation id="1974060860693918893">વિગતવાર</translation> @@ -166,6 +168,7 @@ <translation id="3628119975092896051">તમારી વાંચન સૂચિ ઑફલાઇન ઉપલબ્ધ છે. તમારી વાંચન સૂચિમાં પૃષ્ઠ ઉમેરવા માટે, <ph name="SHARE_OPENING_ICON" /> ટૅપ કરો.</translation> <translation id="3638472932233958418">વેબપૃષ્ઠો પહેલાથી લોડ કરો</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> પર બુકમાર્ક કર્યું</translation> +<translation id="3765471630796399471">અન્ય પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="3771033907050503522">છૂપા ટેબ્સ</translation> <translation id="3779810277399252432">કોઈ ઇન્ટરનેટ કનેક્શન નથી.</translation> <translation id="3783017676699494206">ફોટા સાચવો</translation> @@ -314,6 +317,7 @@ <translation id="6344783595350022745">ટેક્સ્ટ સાફ કરો</translation> <translation id="6346549652287021269">નવું ડાઉનલોડ શરૂ કરીએ?</translation> <translation id="6362362396625799311">કોઈ છુપા ટૅબ્સ નથી</translation> +<translation id="6363526231572697780">કોઈ વપરાશકર્તાનું નામ નથી</translation> <translation id="6374469231428023295">ફરી પ્રયાસ કરો</translation> <translation id="6380866119319257197">જો તમે તમારો પાસફ્રેઝ ભૂલી જાઓ અથવા આ સેટિંગ બદલવા માંગતા હોવ, તો <ph name="BEGIN_LINK" />સમન્વયનને ફરીથી સેટ કરો<ph name="END_LINK" /></translation> <translation id="6389470377220713856">કાર્ડ પરનું નામ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 43c658b0..1f3271ae 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">आइटम अपडेट किया गया</translation> <translation id="1047726139967079566">इस पेज को बुकमार्क करें...</translation> <translation id="1049743911850919806">गुप्त</translation> +<translation id="1063454504051558093">कोई और पासवर्ड इस्तेमाल करें...</translation> <translation id="1076421457278169141">कोड स्कैन किया गया</translation> <translation id="1084365883616172403">Facebook पोस्ट पूर्ण.</translation> <translation id="1104948393051856124">स्वीकार करें और जारी रखें</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">उपयोग डेटा भेजें</translation> <translation id="1886928167269928266">शुरुआत से</translation> <translation id="1911619930368729126">Google डिस्क पर अपलोड करें</translation> +<translation id="191179954310195971">Google की दूसरी सेवाएं</translation> <translation id="1941314575388338491">कॉपी करने के लिए डबल टैप करें.</translation> <translation id="1952728750904661634">प्रबंधित खाते से साइन इन करें</translation> <translation id="1974060860693918893">उन्नत</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">आपकी पढ़ने की सूची ऑफ़लाइन उपलब्ध है. अपनी पढ़ने की सूची में कोई पेज जोड़ने के लिए, <ph name="SHARE_OPENING_ICON" /> पर टैप करें.</translation> <translation id="3638472932233958418">पहले से लोड वेबपेज</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> में बुकमार्क किया गया</translation> +<translation id="3765471630796399471">कोई और पासवर्ड इस्तेमाल करें</translation> <translation id="3771033907050503522">गुप्त टैब</translation> <translation id="3779810277399252432">कोई इंटरनेट कनेक्शन नहीं.</translation> <translation id="3783017676699494206">चित्र सहेजें</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">लेख साफ़ करें</translation> <translation id="6346549652287021269">नया डाउनलोड शुरू करें?</translation> <translation id="6362362396625799311">कोई गुप्त टैब नहीं है</translation> +<translation id="6363526231572697780">कोई उपयोगकर्ता नाम नहीं</translation> <translation id="6374469231428023295">फिर से कोशिश करें</translation> <translation id="6380866119319257197">यदि आप अपना पासफ़्रेज़ भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" />समन्वयन को रीसेट करें<ph name="END_LINK" /></translation> <translation id="6389470377220713856">कार्ड पर नाम</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index cad9f17..bb1d246 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Stavka je ažurirana</translation> <translation id="1047726139967079566">Označi ovu stranicu...</translation> <translation id="1049743911850919806">Anonimno</translation> +<translation id="1063454504051558093">Upotrijebi drugu zaporku...</translation> <translation id="1076421457278169141">Kod skeniran</translation> <translation id="1084365883616172403">Dovršen je post za Facebook.</translation> <translation id="1104948393051856124">Prihvati i nastavi</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Slanje pod. o upot.</translation> <translation id="1886928167269928266">Od početka</translation> <translation id="1911619930368729126">Prenesi na Google disk</translation> +<translation id="191179954310195971">Ostale Googleove usluge</translation> <translation id="1941314575388338491">Dodirnite dvaput da biste kopirali.</translation> <translation id="1952728750904661634">Prijavite se upravljanim računom</translation> <translation id="1974060860693918893">Napredno</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Vaš popis za čitanje dostupan je offline. Da biste dodali stranicu na popis za čitanje, dodirnite <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Već učitane stranice</translation> <translation id="3691593122358196899">Oznaka dodana u mapu <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Upotreba druge zaporke</translation> <translation id="3771033907050503522">Anonimne kartice</translation> <translation id="3779810277399252432">Nema internetske veze.</translation> <translation id="3783017676699494206">Spremi sliku</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Izbriši tekst</translation> <translation id="6346549652287021269">Pokrenuti novo preuzimanje?</translation> <translation id="6362362396625799311">Nema anonimnih kartica</translation> +<translation id="6363526231572697780">Nema korisničkog imena</translation> <translation id="6374469231428023295">Pokušaj ponovo</translation> <translation id="6380866119319257197">Ako zaboravite šifru ili želite promijeniti tu postavku, <ph name="BEGIN_LINK" />poništite sinkronizaciju<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Ime na kartici</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index bd6163d..eacd3ece 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elem frissítve</translation> <translation id="1047726139967079566">Könyvjelző hozzáadása ehhez az oldalhoz...</translation> <translation id="1049743911850919806">Inkognitómód</translation> +<translation id="1063454504051558093">Másik jelszó használata…</translation> <translation id="1076421457278169141">Kód beolvasva</translation> <translation id="1084365883616172403">A Facebook-bejegyzés kész.</translation> <translation id="1104948393051856124">Elfogadás és folytatás</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Használati adatok küldése</translation> <translation id="1886928167269928266">Mindenkori</translation> <translation id="1911619930368729126">Feltöltés Google Drive-ba</translation> +<translation id="191179954310195971">Egyéb Google-szolgáltatások</translation> <translation id="1941314575388338491">A másoláshoz koppintson duplán.</translation> <translation id="1952728750904661634">Bejelentkezés felügyelt fiókkal</translation> <translation id="1974060860693918893">Speciális</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Olvasási listája hozzáférhető offline módban. Ha szeretne hozzáadni oldalakat a listához, koppintson a következőkre: <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Weboldalak előtöltése</translation> <translation id="3691593122358196899">Könyvjelzők közé téve itt: <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Másik jelszó használata</translation> <translation id="3771033907050503522">Inkognitólapok</translation> <translation id="3779810277399252432">Nincs internetkapcsolat.</translation> <translation id="3783017676699494206">Kép mentése</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Szöveg törlése</translation> <translation id="6346549652287021269">Elindítja az új letöltést?</translation> <translation id="6362362396625799311">Nincsenek inkognitólapok</translation> +<translation id="6363526231572697780">Nincs felhasználónév</translation> <translation id="6374469231428023295">Próbálja újra</translation> <translation id="6380866119319257197">Ha elfelejti az összetett jelszót, vagy módosítani szeretné ezt a beállítást, <ph name="BEGIN_LINK" />állítsa alaphelyzetbe a szinkronizálást<ph name="END_LINK" /></translation> <translation id="6389470377220713856">A kártyán szereplő név</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index b8590d1..c3d78f7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Item diperbarui</translation> <translation id="1047726139967079566">Bookmark Halaman Ini...</translation> <translation id="1049743911850919806">Penyamaran</translation> +<translation id="1063454504051558093">Gunakan Sandi Lain...</translation> <translation id="1076421457278169141">Kode telah dipindai</translation> <translation id="1084365883616172403">Kirim Facebook selesai.</translation> <translation id="1104948393051856124">Terima & Lanjutkan</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Krm Data Penggunaan</translation> <translation id="1886928167269928266">Awal Waktu</translation> <translation id="1911619930368729126">Upload ke Google Drive</translation> +<translation id="191179954310195971">Layanan Google Lainnya</translation> <translation id="1941314575388338491">Ketuk dua kali untuk menyalin.</translation> <translation id="1952728750904661634">Masuk dengan akun yang dikelola</translation> <translation id="1974060860693918893">Lanjutan</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Daftar bacaan Anda tersedia secara offline. Untuk menambahkan halaman ke daftar bacaan, tap <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Pramuat Halaman Web</translation> <translation id="3691593122358196899">Dibookmark ke <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Gunakan Sandi Lain</translation> <translation id="3771033907050503522">Tab Penyamaran</translation> <translation id="3779810277399252432">Tidak ada sambungan internet.</translation> <translation id="3783017676699494206">Simpan Gambar</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Hapus Teks</translation> <translation id="6346549652287021269">Mulai Download Baru?</translation> <translation id="6362362396625799311">Tidak Ada Tab Penyamaran</translation> +<translation id="6363526231572697780">Tidak Ada Nama Pengguna</translation> <translation id="6374469231428023295">Coba Lagi</translation> <translation id="6380866119319257197">Jika lupa dengan frasa sandi atau ingin mengubah setelan ini, <ph name="BEGIN_LINK" />setel ulang sinkronisasi<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nama di Kartu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 21a7d63..30d4e6e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elemento aggiornato</translation> <translation id="1047726139967079566">Aggiungi questa pagina ai Preferiti...</translation> <translation id="1049743911850919806">In incognito</translation> +<translation id="1063454504051558093">Utilizza un'altra password…</translation> <translation id="1076421457278169141">Scansione del codice eseguita</translation> <translation id="1084365883616172403">Pubblicazione su Facebook completata.</translation> <translation id="1104948393051856124">Accetta e continua</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Invia dati di utilizzo</translation> <translation id="1886928167269928266">Tutto</translation> <translation id="1911619930368729126">Carica su Google Drive</translation> +<translation id="191179954310195971">Altri servizi Google</translation> <translation id="1941314575388338491">Tocca due volte per copiare.</translation> <translation id="1952728750904661634">Accedi con l'account gestito</translation> <translation id="1974060860693918893">Avanzate</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Il tuo elenco di lettura è disponibile offline. Per aggiungere una pagina all'elenco di lettura, tocca <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Precarica pagine web</translation> <translation id="3691593122358196899">Preferito aggiunto in: <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Utilizza un'altra password</translation> <translation id="3771033907050503522">Schede di navigazione in incognito</translation> <translation id="3779810277399252432">Nessuna connessione a Internet.</translation> <translation id="3783017676699494206">Salva immagine</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Cancella testo</translation> <translation id="6346549652287021269">Iniziare un nuovo download?</translation> <translation id="6362362396625799311">Nessuna scheda in incognito</translation> +<translation id="6363526231572697780">Nessun nome utente</translation> <translation id="6374469231428023295">Riprova</translation> <translation id="6380866119319257197">Se non ricordi la passphrase o vuoi modificare questa impostazione, <ph name="BEGIN_LINK" />reimposta la sincronizzazione<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nome sulla carta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index dd963c0..4799967 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">הפריט עודכן</translation> <translation id="1047726139967079566">הוסף דף זה לסימניות...</translation> <translation id="1049743911850919806">גלישה פרטית</translation> +<translation id="1063454504051558093">שימוש בסיסמה אחרת...</translation> <translation id="1076421457278169141">הקוד נסרק</translation> <translation id="1084365883616172403">הפרסום ב-Facebook בוצע.</translation> <translation id="1104948393051856124">קבל והמשך</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">שלח נתוני שימוש</translation> <translation id="1886928167269928266">משחר ההיסטוריה</translation> <translation id="1911619930368729126">העלה אל Google Drive</translation> +<translation id="191179954310195971">שירותי Google אחרים</translation> <translation id="1941314575388338491">הקש פעמיים כדי להעתיק.</translation> <translation id="1952728750904661634">כניסה עם חשבון מנוהל</translation> <translation id="1974060860693918893">מתקדם</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">אפשר לגשת לרשימת הקריאה במצב לא מקוון. כדי להוסיף דף לרשימת הקריאה, הקש על <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">טעינה מראש של דפי אינטרנט</translation> <translation id="3691593122358196899">התווסף לסימניות ב-<ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">שימוש בסיסמה אחרת</translation> <translation id="3771033907050503522">כרטיסיות גלישה בסתר</translation> <translation id="3779810277399252432">אין חיבור לאינטרנט.</translation> <translation id="3783017676699494206">שמור תמונה</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">טקסט נקי</translation> <translation id="6346549652287021269">להתחיל הורדה חדשה?</translation> <translation id="6362362396625799311">אין כרטיסיות של גלישה בסתר</translation> +<translation id="6363526231572697780">אין שם משתמש</translation> <translation id="6374469231428023295">נסה שוב</translation> <translation id="6380866119319257197">אם תשכח את ביטוי הסיסמה או תרצה לשנות את ההגדרה הזו, <ph name="BEGIN_LINK" />אפס את הסינכרון<ph name="END_LINK" /></translation> <translation id="6389470377220713856">שם על הכרטיס</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 4ce0d80e..60a90ed5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">更新済みのアイテム</translation> <translation id="1047726139967079566">ブックマークに追加...</translation> <translation id="1049743911850919806">シークレット モード</translation> +<translation id="1063454504051558093">他のパスワードを使用...</translation> <translation id="1076421457278169141">コードをスキャンしました</translation> <translation id="1084365883616172403">Facebookへの投稿が完了しました。</translation> <translation id="1104948393051856124">同意して続行</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">使用状況データ送信</translation> <translation id="1886928167269928266">始めから</translation> <translation id="1911619930368729126">ドライブにアップロード</translation> +<translation id="191179954310195971">他の Google サービス</translation> <translation id="1941314575388338491">ダブルタップしてコピー。</translation> <translation id="1952728750904661634">管理対象アカウントでログインする</translation> <translation id="1974060860693918893">詳細設定</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">リーディング リストをオフラインで利用できます。リーディング リストにページを追加するには、<ph name="SHARE_OPENING_ICON" /> をタップします。</translation> <translation id="3638472932233958418">ウェブページのプリロード</translation> <translation id="3691593122358196899">「<ph name="FOLDER_TITLE" />」にブックマークしました</translation> +<translation id="3765471630796399471">他のパスワードを使用</translation> <translation id="3771033907050503522">シークレットタブ</translation> <translation id="3779810277399252432">インターネットに接続されていません。</translation> <translation id="3783017676699494206">画像を保存</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">テキストを消去</translation> <translation id="6346549652287021269">新たにダウンロードを開始しますか?</translation> <translation id="6362362396625799311">シークレット タブはありません</translation> +<translation id="6363526231572697780">ユーザー名が指定されていません</translation> <translation id="6374469231428023295">再試行</translation> <translation id="6380866119319257197">パスフレーズを忘れた場合や、この設定を変更する場合は、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />します</translation> <translation id="6389470377220713856">カード名義人(半角英文字)</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index d2a071c..568d22f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">ಐಟಂ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="1047726139967079566">ಈ ಪುಟವನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ...</translation> <translation id="1049743911850919806">ಅದೃಶ್ಯ</translation> +<translation id="1063454504051558093">ಬೇರೆ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ...</translation> <translation id="1076421457278169141">ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="1084365883616172403">Facebook ಪೋಸ್ಟ್ ಪೂರ್ಣಗೊಂಡಿದೆ.</translation> <translation id="1104948393051856124">ಅಂಗೀಕರಿಸಿ ಮತ್ತು ಮುಂದುವರಿಯಿರಿ</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">ಬಳಕೆ ಡೇಟಾ ಕಳುಹಿಸಿ</translation> <translation id="1886928167269928266">ಆರಂಭದ ಸಮಯ</translation> <translation id="1911619930368729126">Google ಡ್ರೈವ್ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡು</translation> +<translation id="191179954310195971">ಇತರ Google ಸೇವೆಗಳು</translation> <translation id="1941314575388338491">ನಕಲಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> <translation id="1952728750904661634">ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="1974060860693918893">ಸುಧಾರಿತ</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಯು ಆಫ್ಲೈನ್ನಲ್ಲಿ ಲಭ್ಯವಿದೆ. ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಗೆ ಪುಟವನ್ನು ಸೇರಿಸಲು, <ph name="SHARE_OPENING_ICON" /> ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> <translation id="3638472932233958418">ವೆಬ್ ಪುಟಗಳನ್ನು ಪೂರ್ವಲೋಡ್ ಮಾಡಿ</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ಗೆ ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲಾಗಿದೆ</translation> +<translation id="3765471630796399471">ಬೇರೆ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ</translation> <translation id="3771033907050503522">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="3779810277399252432">ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಇಲ್ಲ.</translation> <translation id="3783017676699494206">ಚಿತ್ರವನ್ನು ಉಳಿಸಿ</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">ಪಠ್ಯವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> <translation id="6346549652287021269">ಹೊಸ ಡೌನ್ಲೋಡ್ ಪ್ರಾರಂಭಿಸುವುದೇ?</translation> <translation id="6362362396625799311">ಯಾವುದೇ ಅದೃಶ್ಯ ಟ್ಯಾಬ್ಗಳಿಲ್ಲ</translation> +<translation id="6363526231572697780">ಯಾವುದೇ ಬಳಕೆದಾರರ ಹೆಸರಿಲ್ಲ</translation> <translation id="6374469231428023295">ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="6380866119319257197">ನಿಮ್ಮ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನೀವು ಮರೆತರೆ ಅಥವಾ ಈ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು ಬಯಸಿದರೆ, <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮರುಹೊಂದಿಸಿ<ph name="END_LINK" /></translation> <translation id="6389470377220713856">ಕಾರ್ಡ್ನಲ್ಲಿರುವ ಹೆಸರು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 0b019dd..4a57e390 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">북마크가 업데이트되었습니다.</translation> <translation id="1047726139967079566">현재 페이지를 북마크에 추가...</translation> <translation id="1049743911850919806">시크릿</translation> +<translation id="1063454504051558093">다른 비밀번호를 사용하세요...</translation> <translation id="1076421457278169141">코드 스캔됨</translation> <translation id="1084365883616172403">Facebook 게시가 완료되었습니다.</translation> <translation id="1104948393051856124">동의 및 계속</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">사용 데이터 보내기</translation> <translation id="1886928167269928266">전체</translation> <translation id="1911619930368729126">Google 드라이브로 업로드</translation> +<translation id="191179954310195971">다른 Google 서비스</translation> <translation id="1941314575388338491">복사하려면 두 번 탭하세요.</translation> <translation id="1952728750904661634">관리 계정으로 로그인</translation> <translation id="1974060860693918893">고급</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">읽기 목록을 오프라인에서 사용할 수 있습니다. 읽기 목록에 페이지를 추가하려면 <ph name="SHARE_OPENING_ICON" />을(를) 탭하세요.</translation> <translation id="3638472932233958418">웹페이지 미리 로드하기</translation> <translation id="3691593122358196899">북마크를 <ph name="FOLDER_TITLE" />에 추가함</translation> +<translation id="3765471630796399471">다른 비밀번호 사용</translation> <translation id="3771033907050503522">시크릿 탭</translation> <translation id="3779810277399252432">인터넷에 연결되어 있지 않습니다.</translation> <translation id="3783017676699494206">이미지 저장</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">텍스트 삭제</translation> <translation id="6346549652287021269">다운로드를 새로 시작하시겠습니까?</translation> <translation id="6362362396625799311">시크릿 탭 없음</translation> +<translation id="6363526231572697780">사용자 이름 없음</translation> <translation id="6374469231428023295">다시 시도</translation> <translation id="6380866119319257197">암호를 잊어버렸거나 이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />합니다.</translation> <translation id="6389470377220713856">카드 명의</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index f81271b..fa89dc83 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elementas atnaujintas</translation> <translation id="1047726139967079566">Įtraukti šį puslapį į žymes...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Naudoti kitą slaptažodį...</translation> <translation id="1076421457278169141">Kodas nuskaitytas</translation> <translation id="1084365883616172403">„Facebook“ įrašas paskelbtas.</translation> <translation id="1104948393051856124">Sutikti ir tęsti</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Siųsti naud. duom.</translation> <translation id="1886928167269928266">Laiko pradžia</translation> <translation id="1911619930368729126">Įkelti į „Google“ diską</translation> +<translation id="191179954310195971">Kitos „Google“ paslaugos</translation> <translation id="1941314575388338491">Dukart palieskite, kad nukopijuotumėte.</translation> <translation id="1952728750904661634">Prisijunkite naudodami valdomą paskyrą</translation> <translation id="1974060860693918893">Išplėstiniai</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Skaitymo sąrašas pasiekiamas neprisijungus. Kad pridėtumėte puslapį prie skaitymo sąrašo, palieskite <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Iš anksto įk. tinkl.</translation> <translation id="3691593122358196899">Sukurta „<ph name="FOLDER_TITLE" />“ žymė</translation> +<translation id="3765471630796399471">Naudokite kitą slaptažodį</translation> <translation id="3771033907050503522">Inkognito skirt.</translation> <translation id="3779810277399252432">Nėra interneto ryšio.</translation> <translation id="3783017676699494206">Išsaugoti vaizdą</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Išvalyti tekstą</translation> <translation id="6346549652287021269">Pradėti naują atsisiuntimą?</translation> <translation id="6362362396625799311">Nėra inkognito skirtukų</translation> +<translation id="6363526231572697780">Nėra naudotojo vardo</translation> <translation id="6374469231428023295">Bandyti dar kartą</translation> <translation id="6380866119319257197">Jei pamiršote slaptafr. arba norite pakeisti šį nust., <ph name="BEGIN_LINK" />iš naujo nust. sinchr.<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Vardas kortel.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 9381d25..461f939 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Vienums atjaunināts</translation> <translation id="1047726139967079566">Saglabāt šo lapu kā grāmatzīmi...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Izmantot citu paroli</translation> <translation id="1076421457278169141">Kods ir skenēts</translation> <translation id="1084365883616172403">Facebook ziņa izveidota.</translation> <translation id="1104948393051856124">Pieņemt un turpināt</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Sūtīt liet. datus</translation> <translation id="1886928167269928266">No paša sākuma</translation> <translation id="1911619930368729126">Augšupielādēt Google diskā</translation> +<translation id="191179954310195971">Citi Google pakalpojumi</translation> <translation id="1941314575388338491">Veiciet dubultskārienu, lai kopētu.</translation> <translation id="1952728750904661634">Pierakstīšanās pārvaldītā kontā</translation> <translation id="1974060860693918893">Papildu</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Jūsu lasīšanas saraksts ir pieejams bezsaistē. Lai tam pievienotu kādu lapu, pieskarieties ikonai <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Pirmsiel. tīm. lapas</translation> <translation id="3691593122358196899">Grāmatzīme saglabāta mapē <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Izmantot citu paroli</translation> <translation id="3771033907050503522">Inkognito režīma cilnes</translation> <translation id="3779810277399252432">Nav interneta savienojuma.</translation> <translation id="3783017676699494206">Saglabāt attēlu</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Notīrīt tekstu</translation> <translation id="6346549652287021269">Vai sākt jaunu lejupielādi?</translation> <translation id="6362362396625799311">Nav inkognito ciļņu</translation> +<translation id="6363526231572697780">Nav lietotājvārda</translation> <translation id="6374469231428023295">Mēģināt vēlreiz</translation> <translation id="6380866119319257197">Ja esat aizmirsis ieejas frāzi vai vēlaties mainīt šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" />.</translation> <translation id="6389470377220713856">Vārds un uzvārds uz kartes</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index a0c4a5a..318234cd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">ഇനം അപ്ഡേറ്റുചെയ്തു</translation> <translation id="1047726139967079566">ഈ പേജ് ബുക്ക്മാര്ക്ക് ചെയ്യുക...</translation> <translation id="1049743911850919806">ആള്മാറാട്ടം</translation> +<translation id="1063454504051558093">മറ്റ് പാസ്വേഡ് ഉപയോഗിക്കുക...</translation> <translation id="1076421457278169141">കോഡ് സ്കാൻ ചെയ്തു</translation> <translation id="1084365883616172403">Facebook പങ്കിടൽ പൂർത്തിയായി.</translation> <translation id="1104948393051856124">അംഗീകരിച്ച് തുടരുക</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">ഉപയോഗ ഡാറ്റ അയയ്ക്കൂ</translation> <translation id="1886928167269928266">തുടക്കം മുതൽ</translation> <translation id="1911619930368729126">Google ഡ്രൈവിലേക്ക് അപ്ലോഡുചെയ്യുക</translation> +<translation id="191179954310195971">മറ്റ് Google സേവനങ്ങള്</translation> <translation id="1941314575388338491">പകർത്താൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക.</translation> <translation id="1952728750904661634">മാനേജുചെയ്ത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="1974060860693918893">നൂതനം</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">നിങ്ങളുടെ വായന ലിസ്റ്റ് ഓഫ്ലൈനിൽ ലഭ്യമാണ്. വായന ലിസ്റ്റിൽ ഒരു പേജ് ചേർക്കാൻ, <ph name="SHARE_OPENING_ICON" /> ടാപ്പുചെയ്യുക.</translation> <translation id="3638472932233958418">മുമ്പ് ലോഡുചെയ്ത വെബ്പേജുകൾ</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ഫോൾഡറിലേക്ക് ബുക്ക്മാർക്ക് ചെയ്തു</translation> +<translation id="3765471630796399471">മറ്റ് പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="3771033907050503522">ആൾമാറാട്ട ടാബുകൾ</translation> <translation id="3779810277399252432">ഇന്റർനെറ്റ് കണക്ഷനില്ല.</translation> <translation id="3783017676699494206">ഇമേജ് സംരക്ഷിക്കുക</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">വാചകം മായ്ക്കുക</translation> <translation id="6346549652287021269">പുതിയ ഡൗൺലോഡ് ആരംഭിക്കണോ?</translation> <translation id="6362362396625799311">ആൾമാറാട്ട ടാബുകളൊന്നുമില്ല</translation> +<translation id="6363526231572697780">ഉപയോക്തൃനാമമില്ല</translation> <translation id="6374469231428023295">വീണ്ടും ശ്രമിക്കുക</translation> <translation id="6380866119319257197">നിങ്ങൾ പാസ്ഫ്രെയ്സ് മറന്നുപോയെങ്കിലോ ഈ ക്രമീകരണം മാറ്റണമെങ്കിലോ, <ph name="BEGIN_LINK" />സമന്വയം റീസെറ്റുചെയ്യുക<ph name="END_LINK" /></translation> <translation id="6389470377220713856">കാര്ഡിലെ പേര്</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 85dffa0..09083a8d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">आयटम अपडेट केला</translation> <translation id="1047726139967079566">हे पृष्ठ बुकमार्क करा...</translation> <translation id="1049743911850919806">गुप्त</translation> +<translation id="1063454504051558093">दुसरा पासवर्ड वापरा...</translation> <translation id="1076421457278169141">कोड स्कॅन केला</translation> <translation id="1084365883616172403">Facebook पोस्ट पूर्ण केले.</translation> <translation id="1104948393051856124">स्वीकारा आणि सुरू ठेवा</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">वापरलेला डेटा पाठवा</translation> <translation id="1886928167269928266">सुरूवातीपासून</translation> <translation id="1911619930368729126">Google ड्राइव्हवर अपलोड करा</translation> +<translation id="191179954310195971">इतर Google सेवा</translation> <translation id="1941314575388338491">कॉपी करण्यासाठी दोनदा टॅप करा.</translation> <translation id="1952728750904661634">व्यवस्थापित केलेल्या खात्यासह साइन इन करा</translation> <translation id="1974060860693918893">प्रगत</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">तुमची वाचन सूची ऑफलाइन उपलब्ध आहे. आपल्या वाचन सूचीमध्ये एक पृष्ठ जोडण्यासाठी, <ph name="SHARE_OPENING_ICON" /> टॅप करा.</translation> <translation id="3638472932233958418">वेबपृष्ठे प्रीलोड करा</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> मध्ये बुकमार्क केले</translation> +<translation id="3765471630796399471">दुसरा पासवर्ड वापरा</translation> <translation id="3771033907050503522">गुप्त टॅब</translation> <translation id="3779810277399252432">कोणतेही इंटरनेट कनेक्शन नाही.</translation> <translation id="3783017676699494206">इमेज सेव्ह करा</translation> @@ -316,6 +319,7 @@ <translation id="6344783595350022745">मजकूर साफ करा</translation> <translation id="6346549652287021269">नवीन डाउनलोड सुरू करायचा?</translation> <translation id="6362362396625799311">कोणतेही गुप्त टॅब नाहीत</translation> +<translation id="6363526231572697780">वापरकर्तानाव नाही</translation> <translation id="6374469231428023295">पुन्हा प्रयत्न करा</translation> <translation id="6380866119319257197">आपण आपला सांकेतिक वाक्यांश विसरल्यास किंवा हे सेटिंग बदलू इच्छित असल्यास, <ph name="BEGIN_LINK" />संकालन रीसेट करा<ph name="END_LINK" /></translation> <translation id="6389470377220713856">कार्डवरील नाव</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 9c87082..209b7a3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Item geüpdated</translation> <translation id="1047726139967079566">Bladwijzer instellen voor deze pagina...</translation> <translation id="1049743911850919806">Incognito</translation> +<translation id="1063454504051558093">Ander wachtwoord gebruiken...</translation> <translation id="1076421457278169141">Code gescand</translation> <translation id="1084365883616172403">Facebook-bericht voltooid.</translation> <translation id="1104948393051856124">Accepteren en doorgaan</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Gebruiksgegevens verzenden</translation> <translation id="1886928167269928266">Het eerste gebruik</translation> <translation id="1911619930368729126">Uploaden naar Google Drive</translation> +<translation id="191179954310195971">Andere Google-services</translation> <translation id="1941314575388338491">Dubbeltik om te kopiëren.</translation> <translation id="1952728750904661634">Inloggen met een beheerd account</translation> <translation id="1974060860693918893">Geavanceerd</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Je leeslijst is offline beschikbaar. Als je een pagina aan je leeslijst wilt toevoegen, tik je op <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Webpagina's vooraf laden</translation> <translation id="3691593122358196899">Bladwijzer gemaakt in <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Ander wachtwoord gebruiken</translation> <translation id="3771033907050503522">Incognitotabbladen</translation> <translation id="3779810277399252432">Geen internetverbinding.</translation> <translation id="3783017676699494206">Afbeelding opslaan</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Tekst wissen</translation> <translation id="6346549652287021269">Nieuwe download starten?</translation> <translation id="6362362396625799311">Geen incognitotabbladen</translation> +<translation id="6363526231572697780">Geen gebruikersnaam</translation> <translation id="6374469231428023295">Opnieuw proberen</translation> <translation id="6380866119319257197">Als je je wachtwoordzin vergeet of deze instelling wilt wijzigen, <ph name="BEGIN_LINK" />stel je de synchronisatie opnieuw in<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Naam op kaart</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 9a8753f..da548660 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Elementet er oppdatert</translation> <translation id="1047726139967079566">Legg til bokmerke for denne siden...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Bruk et annet passord</translation> <translation id="1076421457278169141">Koden er skannet</translation> <translation id="1084365883616172403">Facebook-innlegget er fullført.</translation> <translation id="1104948393051856124">Godta og fortsett</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Send bruksdata</translation> <translation id="1886928167269928266">Tidenes morgen</translation> <translation id="1911619930368729126">Last opp til Google Disk</translation> +<translation id="191179954310195971">Andre Google-tjenester</translation> <translation id="1941314575388338491">Dobbelttrykk for å kopiere.</translation> <translation id="1952728750904661634">Logg på med administrert konto</translation> <translation id="1974060860693918893">Avansert</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Leselisten din er tilgjengelig uten nett. Du kan legge til sider i leselisten ved å trykke på <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Last inn nettsider på forhånd</translation> <translation id="3691593122358196899">Satt som bokmerke i <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Bruk et annet passord</translation> <translation id="3771033907050503522">Inkognitofaner</translation> <translation id="3779810277399252432">Ingen Internett-tilkobling.</translation> <translation id="3783017676699494206">Lagre bildet</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Klar tekst</translation> <translation id="6346549652287021269">Vil du starte en ny nedlasting?</translation> <translation id="6362362396625799311">Ingen inkognitofaner</translation> +<translation id="6363526231572697780">Ingen brukernavn</translation> <translation id="6374469231428023295">Prøv på nytt</translation> <translation id="6380866119319257197">Hvis du glemmer passordfrasen din eller vil endre denne innstillingen, må du <ph name="BEGIN_LINK" />tilbakestille synkroniseringen<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Navn som er oppført på kortet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index af91dd2..148337c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Zaktualizowano element</translation> <translation id="1047726139967079566">Dodaj stronę do zakładek...</translation> <translation id="1049743911850919806">Incognito</translation> +<translation id="1063454504051558093">Użyj innego hasła…</translation> <translation id="1076421457278169141">Kod został zeskanowany</translation> <translation id="1084365883616172403">Wpis na Facebooku dodany.</translation> <translation id="1104948393051856124">Zaakceptuj i kontynuuj</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Wysyłaj dane na temat użytkowania</translation> <translation id="1886928167269928266">Od początku</translation> <translation id="1911619930368729126">Prześlij na Dysk Google</translation> +<translation id="191179954310195971">Inne usługi Google</translation> <translation id="1941314575388338491">Kliknij dwukrotnie, by skopiować.</translation> <translation id="1952728750904661634">Zaloguj się na konto zarządzane</translation> <translation id="1974060860693918893">Zaawansowane</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Twoja lista Do przeczytania jest dostępna offline. Aby dodać do niej stronę, kliknij <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Wstępne wczytywanie stron</translation> <translation id="3691593122358196899">Utworzono zakładkę w folderze <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Użyj innego hasła</translation> <translation id="3771033907050503522">Karty incognito</translation> <translation id="3779810277399252432">Brak połączenia z internetem.</translation> <translation id="3783017676699494206">Zapisz obraz</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Wyczyść tekst</translation> <translation id="6346549652287021269">Rozpocząć nowe pobieranie?</translation> <translation id="6362362396625799311">Brak kart incognito</translation> +<translation id="6363526231572697780">Brak nazwy użytkownika</translation> <translation id="6374469231428023295">Spróbuj jeszcze raz</translation> <translation id="6380866119319257197">Jeśli nie pamiętasz hasła lub chcesz zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Imię i nazwisko na karcie</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index d5593e8..b1c513fb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Item atualizado</translation> <translation id="1047726139967079566">Adicionar esta página aos favoritos...</translation> <translation id="1049743911850919806">Modo anônimo</translation> +<translation id="1063454504051558093">Usar outra senha...</translation> <translation id="1076421457278169141">Código lido</translation> <translation id="1084365883616172403">A postagem no Facebook foi concluída.</translation> <translation id="1104948393051856124">Aceitar e continuar</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Enviar dados de uso</translation> <translation id="1886928167269928266">Desde o começo</translation> <translation id="1911619930368729126">Enviar para o Google Drive</translation> +<translation id="191179954310195971">Outros serviços do Google</translation> <translation id="1941314575388338491">Toque duas vezes para copiar.</translation> <translation id="1952728750904661634">Fazer login com uma conta gerenciada</translation> <translation id="1974060860693918893">Avançado</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Sua lista de leitura está disponível off-line. Para adicionar uma página à lista, toque em <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Pré-carregar páginas da web</translation> <translation id="3691593122358196899">Adicionado como favorito em <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Usar outra senha</translation> <translation id="3771033907050503522">Guias anônimas</translation> <translation id="3779810277399252432">Sem conexão com a Internet.</translation> <translation id="3783017676699494206">Salvar imagem</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Limpar texto</translation> <translation id="6346549652287021269">Iniciar novo download?</translation> <translation id="6362362396625799311">Não há guias anônimas</translation> +<translation id="6363526231572697780">Sem nome de usuário</translation> <translation id="6374469231428023295">Repetir</translation> <translation id="6380866119319257197">Se você esquecer a senha longa ou quiser alterar essa configuração, <ph name="BEGIN_LINK" />redefina a sincronização<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nome no cartão</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index 0d4893cb..db95f21b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Item atualizado</translation> <translation id="1047726139967079566">Marcar esta página...</translation> <translation id="1049743911850919806">Navegação anónima</translation> +<translation id="1063454504051558093">Utilizar outra palavra-passe…</translation> <translation id="1076421457278169141">Código digitalizado</translation> <translation id="1084365883616172403">Publicação no Facebook concluída.</translation> <translation id="1104948393051856124">Aceitar e Continuar</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Enviar Dados de Uso</translation> <translation id="1886928167269928266">Desde sempre</translation> <translation id="1911619930368729126">Carregar p/ Google Drive</translation> +<translation id="191179954310195971">Outros serviços Google</translation> <translation id="1941314575388338491">Toque duas vezes para copiar.</translation> <translation id="1952728750904661634">Iniciar sessão com uma conta gerida</translation> <translation id="1974060860693918893">Avançadas</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">A sua lista de leitura está disponível offline. Para adicionar uma página à mesma, toque em <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Pré-carregar Páginas Web</translation> <translation id="3691593122358196899">Adicionado aos marcadores em <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Utilizar outra palavra-passe</translation> <translation id="3771033907050503522">Sep. nav. anónima</translation> <translation id="3779810277399252432">Sem ligação à Internet.</translation> <translation id="3783017676699494206">Guardar Imagem</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Limpar Texto</translation> <translation id="6346549652287021269">Iniciar nova transferência?</translation> <translation id="6362362396625799311">Sem separadores de navegação anónima</translation> +<translation id="6363526231572697780">Sem nome de utilizador</translation> <translation id="6374469231428023295">Tentar novamente</translation> <translation id="6380866119319257197">Se se esquecer da frase de acesso ou pretender alterar esta definição, <ph name="BEGIN_LINK" />reponha a sincronização<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nome no cartão</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 9bd5c941..85c5151 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Element actualizat</translation> <translation id="1047726139967079566">Marcați această pagină...</translation> <translation id="1049743911850919806">Incognito</translation> +<translation id="1063454504051558093">Folosește altă parolă...</translation> <translation id="1076421457278169141">Codul a fost scanat</translation> <translation id="1084365883616172403">Postare pe Facebook finalizată.</translation> <translation id="1104948393051856124">Acceptă și continuă</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Trim. date utilizare</translation> <translation id="1886928167269928266">De la început</translation> <translation id="1911619930368729126">Încarcă în Google Drive</translation> +<translation id="191179954310195971">Alte servicii Google</translation> <translation id="1941314575388338491">Atinge de două ori pentru a copia.</translation> <translation id="1952728750904661634">Conectează-te cu un cont gestionat</translation> <translation id="1974060860693918893">Avansate</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Lista de lectură este disponibilă offline. Pentru a adăuga o pagină în lista de lectură, atinge <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Preîncarcă pagini</translation> <translation id="3691593122358196899">Marcaj adăugat în <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Folosește altă parolă</translation> <translation id="3771033907050503522">File incognito</translation> <translation id="3779810277399252432">Nicio conexiune la internet.</translation> <translation id="3783017676699494206">Salvează imaginea</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Ștergeți textul</translation> <translation id="6346549652287021269">Începi o nouă descărcare?</translation> <translation id="6362362396625799311">Nu există file incognito</translation> +<translation id="6363526231572697780">Niciun nume de utilizator</translation> <translation id="6374469231428023295">Încearcă din nou</translation> <translation id="6380866119319257197">Dacă uiți expresia de acces sau dorești să modifici această setare, <ph name="BEGIN_LINK" />resetează sincronizarea<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Nume de pe card</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 487699e..f3e91d6b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Обновлено</translation> <translation id="1047726139967079566">Добавить страницу в закладки…</translation> <translation id="1049743911850919806">Инкогнито</translation> +<translation id="1063454504051558093">Использовать другой пароль</translation> <translation id="1076421457278169141">Код отсканирован</translation> <translation id="1084365883616172403">Опубликовано в Facebook.</translation> <translation id="1104948393051856124">Продолжить</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Отправка статистики</translation> <translation id="1886928167269928266">За все время</translation> <translation id="1911619930368729126">Загрузить на Google Диск</translation> +<translation id="191179954310195971">Другие сервисы Google</translation> <translation id="1941314575388338491">Чтобы копировать, нажмите дважды.</translation> <translation id="1952728750904661634">Вход в управляемый аккаунт</translation> <translation id="1974060860693918893">Дополнительные</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Ваш список для чтения доступен без подключения к Интернету. Чтобы добавить в него страницу, нажмите <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Предварительная загрузка</translation> <translation id="3691593122358196899">Закладка добавлена в папку "<ph name="FOLDER_TITLE" />"</translation> +<translation id="3765471630796399471">Используйте другой пароль</translation> <translation id="3771033907050503522">Вкладки инкогнито</translation> <translation id="3779810277399252432">Нет доступа к Интернету</translation> <translation id="3783017676699494206">Сохранить изображение</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Очистить</translation> <translation id="6346549652287021269">Скачать новый файл?</translation> <translation id="6362362396625799311">Нет открытых вкладок инкогнито</translation> +<translation id="6363526231572697780">Имя пользователя не указано</translation> <translation id="6374469231428023295">Повторить</translation> <translation id="6380866119319257197">Если вы забыли кодовую фразу или хотите изменить эту настройку, <ph name="BEGIN_LINK" />сбросьте параметры синхронизации<ph name="END_LINK" />.</translation> <translation id="6389470377220713856">Владелец карты</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 3350d178..06d7153 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Položka bola aktualizovaná</translation> <translation id="1047726139967079566">Pridať stránku medzi záložky…</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Použiť iné heslo…</translation> <translation id="1076421457278169141">Kód bol naskenovaný</translation> <translation id="1084365883616172403">Príspevok bol uverejnený na Facebook.</translation> <translation id="1104948393051856124">Prijať a pokračovať</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Odosielanie údajov o používaní</translation> <translation id="1886928167269928266">Celé obdobie</translation> <translation id="1911619930368729126">Nahrať na Disk Google</translation> +<translation id="191179954310195971">Ďalšie služby Googlu</translation> <translation id="1941314575388338491">Dvojitým klepnutím skopírujete.</translation> <translation id="1952728750904661634">Prihlásenie pomocou spravovaného účtu</translation> <translation id="1974060860693918893">Rozšírené</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Váš čitateľský zoznam je k dispozícii offline. Ak chcete pridať stránku do čitateľského zoznamu, klepnite na položku <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Predbežne načítavať webové stránky</translation> <translation id="3691593122358196899">Uložené ako záložka v priečinku <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Použiť iné heslo</translation> <translation id="3771033907050503522">Karty inkognito</translation> <translation id="3779810277399252432">Internetové pripojenie nie je k dispozícii.</translation> <translation id="3783017676699494206">Uložiť obrázok</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Prehľadný text</translation> <translation id="6346549652287021269">Spustiť nové sťahovanie?</translation> <translation id="6362362396625799311">Žiadne karty inkognito</translation> +<translation id="6363526231572697780">Žiadne používateľské meno</translation> <translation id="6374469231428023295">Skúsiť znova</translation> <translation id="6380866119319257197">Ak prístupovú frázu zabudnete alebo budete chcieť toto nastavenie zmeniť, <ph name="BEGIN_LINK" />resetujte synchronizáciu<ph name="END_LINK" />.</translation> <translation id="6389470377220713856">Meno na karte</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 0331860..495d5629 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Ставка је ажурирана</translation> <translation id="1047726139967079566">Обележи ову страницу...</translation> <translation id="1049743911850919806">Без архивирања</translation> +<translation id="1063454504051558093">Користи другу лозинку...</translation> <translation id="1076421457278169141">Скенирали сте кôд</translation> <translation id="1084365883616172403">Facebook пост је довршен.</translation> <translation id="1104948393051856124">Прихвати и настави</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Шаљи подат. о кориш.</translation> <translation id="1886928167269928266">Одувек</translation> <translation id="1911619930368729126">Отпреми у Google диск</translation> +<translation id="191179954310195971">Друге Google услуге</translation> <translation id="1941314575388338491">Додирните двапут да бисте копирали.</translation> <translation id="1952728750904661634">Пријавите се помоћу налога којим се управља</translation> <translation id="1974060860693918893">Напредне опције</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Листа за читање је доступна офлајн. Да бисте додали страницу на листу за читање, додирните <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Унап. учитај веб-странице</translation> <translation id="3691593122358196899">Обележивач је додат у <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Користи другу лозинку</translation> <translation id="3771033907050503522">Картице Без архивирања</translation> <translation id="3779810277399252432">Нема интернет везе.</translation> <translation id="3783017676699494206">Сачувај слику</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Обриши текст</translation> <translation id="6346549652287021269">Желите ли да започнете ново преузимање?</translation> <translation id="6362362396625799311">Нема картица без архивирања</translation> +<translation id="6363526231572697780">Нема корисничког имена</translation> <translation id="6374469231428023295">Пробај поново</translation> <translation id="6380866119319257197">Ако заборавите приступну фразу или желите да промените ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Име и презиме на картици</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 8ffa8ab..b308583 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Bokmärket har uppdaterats</translation> <translation id="1047726139967079566">Skapa bokmärke för den här sidan...</translation> <translation id="1049743911850919806">Inkognito</translation> +<translation id="1063454504051558093">Använd ett annat lösenord …</translation> <translation id="1076421457278169141">Koden skannades</translation> <translation id="1084365883616172403">Inlägg på Facebook klart.</translation> <translation id="1104948393051856124">Godkänn och fortsätt</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Skicka statistik</translation> <translation id="1886928167269928266">Tidens början</translation> <translation id="1911619930368729126">Ladda upp till Google Drive</translation> +<translation id="191179954310195971">Andra Google-tjänster</translation> <translation id="1941314575388338491">Tryck snabbt två gånger om du vill kopiera informationen.</translation> <translation id="1952728750904661634">Logga in med ett hanterat konto</translation> <translation id="1974060860693918893">Avancerat</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Läslistan är tillgänglig offline. Om du vill lägga till en sida i läslistan trycker du på <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Läs in webbsidor i förväg</translation> <translation id="3691593122358196899">Bokmärkt i <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Använd ett annat lösenord</translation> <translation id="3771033907050503522">Inkognitoflikar</translation> <translation id="3779810277399252432">Ingen internetanslutning.</translation> <translation id="3783017676699494206">Spara bild</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Rensa text</translation> <translation id="6346549652287021269">Starta ny nedladdning?</translation> <translation id="6362362396625799311">Inga inkognitoflikar</translation> +<translation id="6363526231572697780">Inget användarnamn</translation> <translation id="6374469231428023295">Försök igen</translation> <translation id="6380866119319257197">Om du glömmer lösenfrasen eller vill ändra inställningen <ph name="BEGIN_LINK" />återställer du synkroniseringen<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Namn på kort</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 03f4cef..cdb2552 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Umesasisha kipengee</translation> <translation id="1047726139967079566">Alamisha Ukurasa Huu...</translation> <translation id="1049743911850919806">Kichupo fiche</translation> +<translation id="1063454504051558093">Tumia Nenosiri Jingine...</translation> <translation id="1076421457278169141">Msimbo umechanganuliwa</translation> <translation id="1084365883616172403">Chapisho la Facebook limekamilika.</translation> <translation id="1104948393051856124">Kubali na Uendelee</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Tuma Data ya Utumiaji</translation> <translation id="1886928167269928266">Kutoka Mwanzo</translation> <translation id="1911619930368729126">Pakia kwenye Hifadhi ya Google</translation> +<translation id="191179954310195971">Huduma Zingine za Google</translation> <translation id="1941314575388338491">Gusa mara mbili ili unakili.</translation> <translation id="1952728750904661634">Ingia ukitumia akaunti inayodhibitiwa</translation> <translation id="1974060860693918893">Mipangilio ya kina</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Orodha yako ya kusoma inapatikana nje ya mtandao. Ili kuongeza ukurasa kwenye orodha yako ya kusoma, gusa <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Pakia Kurasa za wavuti Mapema</translation> <translation id="3691593122358196899">Imetiwa alamisho kwenye <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Tumia Nenosiri Jingine</translation> <translation id="3771033907050503522">Vichupo Fiche</translation> <translation id="3779810277399252432">Hakuna muunganisho wa intaneti.</translation> <translation id="3783017676699494206">Hifadhi Picha</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Futa Matini</translation> <translation id="6346549652287021269">Ungependa Kuanza Kupakua?</translation> <translation id="6362362396625799311">Hakuna Vichupo Fiche</translation> +<translation id="6363526231572697780">Hakuna Jina la Mtumiaji</translation> <translation id="6374469231428023295">Jaribu Tena</translation> <translation id="6380866119319257197">Ukisahau kauli yako ya siri au ukitaka kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />fanya usawazishaji upya<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Jina lilio kwenye Kadi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 3885b47..5792449e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">புத்தகக்குறி புதுப்பிக்கப்பட்டது</translation> <translation id="1047726139967079566">இந்தப் பக்கத்தை புக்மார்க் செய்க...</translation> <translation id="1049743911850919806">மறைநிலை</translation> +<translation id="1063454504051558093">வேறொரு கடவுச்சொல்லைப் பயன்படுத்தவும்...</translation> <translation id="1076421457278169141">குறியீடு ஸ்கேன் செய்யப்பட்டது</translation> <translation id="1084365883616172403">Facebook இடுகை நிறைவுபெற்றது.</translation> <translation id="1104948393051856124">ஏற்று தொடரவும்</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">பயன்பாடு தரவு அனுப்பு</translation> <translation id="1886928167269928266">தொடக்கத்திலிருந்து</translation> <translation id="1911619930368729126">Google இயக்ககத்தில் பதிவேற்றுக</translation> +<translation id="191179954310195971">பிற Google சேவைகள்</translation> <translation id="1941314575388338491">நகலெடுக்க, இருமுறை தட்டவும்.</translation> <translation id="1952728750904661634">நிர்வகிக்கப்படும் கணக்கில் உள்நுழைக</translation> <translation id="1974060860693918893">மேம்பட்டவை</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">உங்கள் வாசிப்புப் பட்டியலை ஆஃப்லைனில் பயன்படுத்தலாம். வாசிப்புப் பட்டியலில் பக்கத்தைச் சேர்க்க, <ph name="SHARE_OPENING_ICON" /> என்பதைத் தட்டவும்.</translation> <translation id="3638472932233958418">வலைப்பக்கங்களை முன்னதாக ஏற்று</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> இல் புத்தகக்குறியைச் சேர்த்தது</translation> +<translation id="3765471630796399471">வேறொரு கடவுச்சொல்லைப் பயன்படுத்தவும்</translation> <translation id="3771033907050503522">மறைநிலைத் தாவல்கள்</translation> <translation id="3779810277399252432">இணைய இணைப்பு இல்லை.</translation> <translation id="3783017676699494206">படத்தைச் சேமி</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">உரையை அழி</translation> <translation id="6346549652287021269">புதிய பதிவிறக்கத்தை தொடங்கவா?</translation> <translation id="6362362396625799311">மறைநிலைத் தாவல்கள் இல்லை</translation> +<translation id="6363526231572697780">பயனர்பெயர் இல்லை</translation> <translation id="6374469231428023295">மீண்டும் முயலவும்</translation> <translation id="6380866119319257197">கடவுச்சொற்றொடரை மறந்துவிட்டால் அல்லது இந்த அமைப்பை மாற்ற விரும்பினால், <ph name="BEGIN_LINK" />ஒத்திசைவை மீட்டமைக்கவும்<ph name="END_LINK" /></translation> <translation id="6389470377220713856">அட்டையிலுள்ள பெயர்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index abdbd08e..710a7306 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">అంశం నవీకరించబడింది</translation> <translation id="1047726139967079566">ఈ పేజీని బుక్మార్క్ చెయ్యి...</translation> <translation id="1049743911850919806">అజ్ఞాత</translation> +<translation id="1063454504051558093">వేరే పాస్వర్డ్ ఉపయోగించండి...</translation> <translation id="1076421457278169141">కోడ్ స్కాన్ చేయబడింది</translation> <translation id="1084365883616172403">Facebook పోస్ట్ పూర్తయింది.</translation> <translation id="1104948393051856124">అంగీకరించు & కొనసాగు</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">వినియోగ డేటాను పంపు</translation> <translation id="1886928167269928266">ప్రారంభ సమయం</translation> <translation id="1911619930368729126">Google డిస్క్కి అప్. చే.</translation> +<translation id="191179954310195971">ఇతర Google సేవలు</translation> <translation id="1941314575388338491">కాపీ చేయడానికి రెండుసార్లు నొక్కండి.</translation> <translation id="1952728750904661634">నిర్వహిత ఖాతాతో సైన్ ఇన్ చేయండి</translation> <translation id="1974060860693918893">ఆధునిక</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">మీ పఠన జాబితా ఆఫ్లైన్లో అందుబాటులో ఉంది. మీ పఠన జాబితాకు పేజీని జోడించడానికి, <ph name="SHARE_OPENING_ICON" />ని నొక్కండి.</translation> <translation id="3638472932233958418">వెబ్పేజీలను ముందే లోడ్ చేయి</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />కి బుక్మార్క్ చేయబడింది</translation> +<translation id="3765471630796399471">వేరే పాస్వర్డ్ ఉపయోగించండి</translation> <translation id="3771033907050503522">అజ్ఞాత ట్యాబ్లు</translation> <translation id="3779810277399252432">ఇంటర్నెట్ కనెక్షన్ లేదు.</translation> <translation id="3783017676699494206">చిత్రాన్ని సేవ్ చేయి</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">వచనాన్ని క్లియర్ చేయి</translation> <translation id="6346549652287021269">కొత్త డౌన్లోడ్ని ప్రారంభించాలా?</translation> <translation id="6362362396625799311">అజ్ఞాత ట్యాబ్లు ఏవీ తెరిచి లేవు</translation> +<translation id="6363526231572697780">వినియోగదారు పేరు లేదు</translation> <translation id="6374469231428023295">మళ్లీ ప్రయత్నించు</translation> <translation id="6380866119319257197">మీరు మీ రహస్య పదబంధాన్ని మర్చిపోతే లేదా ఈ సెట్టింగ్ను మార్చాలనుకుంటే, <ph name="BEGIN_LINK" />సమకాలీకరణను రీసెట్ చేయండి<ph name="END_LINK" /></translation> <translation id="6389470377220713856">కార్డ్పై ఉన్న పేరు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index ad36ae4..eae47b5a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">อัปเดตรายการแล้ว</translation> <translation id="1047726139967079566">บุ๊กมาร์กหน้านี้...</translation> <translation id="1049743911850919806">โหมดไม่ระบุตัวตน</translation> +<translation id="1063454504051558093">ใช้รหัสผ่านอื่น...</translation> <translation id="1076421457278169141">สแกนโค้ดแล้ว</translation> <translation id="1084365883616172403">โพสต์ใน Facebook แล้ว</translation> <translation id="1104948393051856124">ยอมรับและดำเนินการต่อ</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">ส่งข้อมูลการใช้งาน</translation> <translation id="1886928167269928266">ตั้งแต่ต้น</translation> <translation id="1911619930368729126">อัปโหลดไปยัง Google ไดรฟ์</translation> +<translation id="191179954310195971">บริการอื่นๆ ของ Google</translation> <translation id="1941314575388338491">แตะสองครั้งเพื่อคัดลอก</translation> <translation id="1952728750904661634">ลงชื่อเข้าใช้ด้วยบัญชีที่มีการจัดการ</translation> <translation id="1974060860693918893">ขั้นสูง</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">เรื่องรออ่านของคุณพร้อมใช้งานในแบบออฟไลน์ หากต้องการเพิ่มหน้าลงในเรื่องรออ่าน ให้แตะ<ph name="SHARE_OPENING_ICON" /></translation> <translation id="3638472932233958418">โหลดหน้าเว็บล่วงหน้า</translation> <translation id="3691593122358196899">เพิ่มบุ๊กมาร์กไปยัง <ph name="FOLDER_TITLE" /> แล้ว</translation> +<translation id="3765471630796399471">ใช้รหัสผ่านอื่น</translation> <translation id="3771033907050503522">แท็บที่ไม่ระบุตัวตน</translation> <translation id="3779810277399252432">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</translation> <translation id="3783017676699494206">บันทึกภาพ</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">ข้อความที่ชัดเจน</translation> <translation id="6346549652287021269">เริ่มดาวน์โหลดใหม่ใช่ไหม</translation> <translation id="6362362396625799311">ไม่มีแท็บที่ไม่ระบุตัวตน</translation> +<translation id="6363526231572697780">ไม่มีชื่อผู้ใช้</translation> <translation id="6374469231428023295">ลองอีกครั้ง</translation> <translation id="6380866119319257197">หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ โปรด<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation> <translation id="6389470377220713856">ชื่อบนบัตร</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index e28cebcc..50616d9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Öğe güncellendi</translation> <translation id="1047726139967079566">Bu Sayfaya Yer İşareti Koy...</translation> <translation id="1049743911850919806">Gizli mod</translation> +<translation id="1063454504051558093">Diğer Şifreyi Kullan...</translation> <translation id="1076421457278169141">Kod tarandı</translation> <translation id="1084365883616172403">Facebook yayını tamamlandı.</translation> <translation id="1104948393051856124">Kabul Et ve Devam Et</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Kull. Veril. Gönder</translation> <translation id="1886928167269928266">En Baştan</translation> <translation id="1911619930368729126">Google Drive'a yükle</translation> +<translation id="191179954310195971">Diğer Google Hizmetleri</translation> <translation id="1941314575388338491">Kopyalamak için iki kez dokunun.</translation> <translation id="1952728750904661634">Yönetilen hesapla oturum açın</translation> <translation id="1974060860693918893">Gelişmiş</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Okuma listeniz çevrimdışı olarak kullanılabilir. Okuma listenize sayfa eklemek için <ph name="SHARE_OPENING_ICON" /> simgesine dokunun.</translation> <translation id="3638472932233958418">Web Sayfalarını Önceden Yükle</translation> <translation id="3691593122358196899">Yer işareti <ph name="FOLDER_TITLE" /> klasörüne eklendi</translation> +<translation id="3765471630796399471">Diğer Şifreyi Kullan</translation> <translation id="3771033907050503522">Gizli Sekmeler</translation> <translation id="3779810277399252432">İnternet bağlantısı yok.</translation> <translation id="3783017676699494206">Resmi Kaydet</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Metni Temizle</translation> <translation id="6346549652287021269">Yeni İndirme İşlemi Başlatılsın mı?</translation> <translation id="6362362396625799311">Gizli Sekme Yok</translation> +<translation id="6363526231572697780">Kullanıcı Adı Yok</translation> <translation id="6374469231428023295">Tekrar Dene</translation> <translation id="6380866119319257197">Parolanızı unutursanız veya bu ayarı değiştirmek isterseniz <ph name="BEGIN_LINK" />senkronizasyonu sıfırlayın<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Karttaki Ad</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index e322aa9..0cbe8209 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Закладку оновлено</translation> <translation id="1047726139967079566">Додати цю сторінку до закладок...</translation> <translation id="1049743911850919806">Анонімний перегляд</translation> +<translation id="1063454504051558093">Ввести інший пароль…</translation> <translation id="1076421457278169141">Код зіскановано</translation> <translation id="1084365883616172403">Опубліковано у Facebook</translation> <translation id="1104948393051856124">Прийняти та продовжити</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Надсилати статистику</translation> <translation id="1886928167269928266">Весь період</translation> <translation id="1911619930368729126">Завантажити на Google Диск</translation> +<translation id="191179954310195971">Інші сервіси Google</translation> <translation id="1941314575388338491">Двічі торкніться, щоб скопіювати.</translation> <translation id="1952728750904661634">Увійти в керований обліковий запис</translation> <translation id="1974060860693918893">Розширені</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Ваш список читання доступний офлайн. Щоб додати до нього сторінку, торкніться опції <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Попер.завантаж.стор.</translation> <translation id="3691593122358196899">Закладку збережено в папці "<ph name="FOLDER_TITLE" />"</translation> +<translation id="3765471630796399471">Ввести інший пароль</translation> <translation id="3771033907050503522">Анонімні вкладки</translation> <translation id="3779810277399252432">Немає з’єднання з Інтернетом</translation> <translation id="3783017676699494206">Зберегти зображення</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Очистити текст</translation> <translation id="6346549652287021269">Почати нове завантаження?</translation> <translation id="6362362396625799311">Немає анонімних вкладок</translation> +<translation id="6363526231572697780">Немає імені користувача</translation> <translation id="6374469231428023295">Повторити спробу</translation> <translation id="6380866119319257197">Якщо ви забули парольну фразу або хочете змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Ім’я на картці</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 2cecc01..d0f4be4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">Đã cập nhật mục</translation> <translation id="1047726139967079566">Đánh dấu Trang Này...</translation> <translation id="1049743911850919806">Ẩn danh</translation> +<translation id="1063454504051558093">Dùng mật khẩu khác...</translation> <translation id="1076421457278169141">Đã quét mã</translation> <translation id="1084365883616172403">Đã đăng lên Facebook.</translation> <translation id="1104948393051856124">Chấp nhận và tiếp tục</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">Gửi dữ liệu sử dụng</translation> <translation id="1886928167269928266">Mọi thứ</translation> <translation id="1911619930368729126">Tải lên Google Drive</translation> +<translation id="191179954310195971">Dịch vụ khác của Google</translation> <translation id="1941314575388338491">Nhấn đúp để sao chép.</translation> <translation id="1952728750904661634">Đăng nhập bằng tài khoản được quản lý</translation> <translation id="1974060860693918893">Nâng cao</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">Danh sách đọc của bạn khả dụng khi ngoại tuyến. Để thêm một trang vào danh sách đọc, nhấn <ph name="SHARE_OPENING_ICON" />.</translation> <translation id="3638472932233958418">Tải trước trang web</translation> <translation id="3691593122358196899">Đã đánh dấu trang vào <ph name="FOLDER_TITLE" /></translation> +<translation id="3765471630796399471">Dùng mật khẩu khác</translation> <translation id="3771033907050503522">Tab ẩn danh</translation> <translation id="3779810277399252432">Không có kết nối Internet.</translation> <translation id="3783017676699494206">Lưu hình ảnh</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">Xóa văn bản</translation> <translation id="6346549652287021269">Bắt đầu lượt tải xuống mới?</translation> <translation id="6362362396625799311">Không có tab ẩn danh nào</translation> +<translation id="6363526231572697780">Không có tên người dùng</translation> <translation id="6374469231428023295">Thử lại</translation> <translation id="6380866119319257197">Nếu bạn quên cụm mật khẩu hoặc muốn thay đổi cài đặt này, hãy <ph name="BEGIN_LINK" />đặt lại đồng bộ hóa<ph name="END_LINK" /></translation> <translation id="6389470377220713856">Tên trên thẻ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index e142eaf..4f185de 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">书签已更新</translation> <translation id="1047726139967079566">为此页添加书签...</translation> <translation id="1049743911850919806">隐身</translation> +<translation id="1063454504051558093">使用其他密码…</translation> <translation id="1076421457278169141">已扫描代码</translation> <translation id="1084365883616172403">Facebook 信息发布已完成。</translation> <translation id="1104948393051856124">接受并继续</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">发送使用情况数据</translation> <translation id="1886928167269928266">全部</translation> <translation id="1911619930368729126">上传到Google云端硬盘</translation> +<translation id="191179954310195971">其他 Google 服务</translation> <translation id="1941314575388338491">点按两次即可复制。</translation> <translation id="1952728750904661634">登录受管理的帐号</translation> <translation id="1974060860693918893">高级</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">您的阅读清单可供离线访问。要将某个网页添加到该清单中,请依次点按<ph name="SHARE_OPENING_ICON" />。</translation> <translation id="3638472932233958418">预先加载网页</translation> <translation id="3691593122358196899">已将书签添加到“<ph name="FOLDER_TITLE" />”</translation> +<translation id="3765471630796399471">使用其他密码</translation> <translation id="3771033907050503522">隐身标签页</translation> <translation id="3779810277399252432">无互联网连接。</translation> <translation id="3783017676699494206">保存图片</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">明文</translation> <translation id="6346549652287021269">开始执行新的下载任务?</translation> <translation id="6362362396625799311">没有隐身标签页</translation> +<translation id="6363526231572697780">无用户名</translation> <translation id="6374469231428023295">重试</translation> <translation id="6380866119319257197">如果您忘记了密码或想更改此设置,请<ph name="BEGIN_LINK" />重置同步设置<ph name="END_LINK" /></translation> <translation id="6389470377220713856">持卡人姓名</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 21715f8..55ec9d0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -4,6 +4,7 @@ <translation id="1016495303386450659">項目已更新</translation> <translation id="1047726139967079566">把此頁加入書籤...</translation> <translation id="1049743911850919806">無痕模式</translation> +<translation id="1063454504051558093">使用其他密碼...</translation> <translation id="1076421457278169141">已掃描圖碼/條碼</translation> <translation id="1084365883616172403">已順利發佈到 Facebook。</translation> <translation id="1104948393051856124">接受並繼續</translation> @@ -62,6 +63,7 @@ <translation id="1876721852596493031">傳送使用情況資料</translation> <translation id="1886928167269928266">不限時間</translation> <translation id="1911619930368729126">上傳至 Google 雲端硬碟</translation> +<translation id="191179954310195971">其他 Google 服務</translation> <translation id="1941314575388338491">輕觸兩下即可複製。</translation> <translation id="1952728750904661634">使用受管理的帳戶登入</translation> <translation id="1974060860693918893">進階</translation> @@ -167,6 +169,7 @@ <translation id="3628119975092896051">閱讀清單可供離線存取。如要將網頁加入閱讀清單,請輕觸 <ph name="SHARE_OPENING_ICON" />。</translation> <translation id="3638472932233958418">預先載入網頁</translation> <translation id="3691593122358196899">已將書籤加入「<ph name="FOLDER_TITLE" />」</translation> +<translation id="3765471630796399471">使用其他密碼</translation> <translation id="3771033907050503522">無痕式分頁</translation> <translation id="3779810277399252432">沒有網際網路連線。</translation> <translation id="3783017676699494206">儲存圖片</translation> @@ -315,6 +318,7 @@ <translation id="6344783595350022745">清除文字</translation> <translation id="6346549652287021269">要開始進行新的下載作業嗎?</translation> <translation id="6362362396625799311">沒有已開啟的無痕式分頁</translation> +<translation id="6363526231572697780">沒有使用者名稱</translation> <translation id="6374469231428023295">再試一次</translation> <translation id="6380866119319257197">如果您忘記通關密語,或是想變更這項設定,請<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" /></translation> <translation id="6389470377220713856">持卡人姓名</translation>
diff --git a/ios/chrome/browser/autocomplete/BUILD.gn b/ios/chrome/browser/autocomplete/BUILD.gn index 41991f91..ca801dd1 100644 --- a/ios/chrome/browser/autocomplete/BUILD.gn +++ b/ios/chrome/browser/autocomplete/BUILD.gn
@@ -36,7 +36,6 @@ "//ios/chrome/browser/search_engines", "//ios/chrome/browser/signin", "//ios/chrome/browser/sync", - "//ios/chrome/browser/unified_consent:feature", "//ios/public/provider/chrome/browser", "//ios/web", "//url",
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc index 2eecae97..d068237 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc
@@ -26,7 +26,6 @@ #include "ios/chrome/browser/search_engines/template_url_service_factory.h" #include "ios/chrome/browser/signin/signin_manager_factory.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "services/network/public/cpp/shared_url_loader_factory.h" AutocompleteProviderClientImpl::AutocompleteProviderClientImpl( @@ -34,7 +33,6 @@ : browser_state_(browser_state), url_consent_helper_(unified_consent::UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - IsUnifiedConsentFeatureEnabled(), ProfileSyncServiceFactory::GetForBrowserState( browser_state_))) {}
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm index 285bd6f..d44bc5f 100644 --- a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm +++ b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
@@ -267,7 +267,7 @@ params.type = "type"; params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); EXPECT_TRUE(GetSuggestionView(input_accessory_view_)); // Trigger another page load. The suggestions accessory view should @@ -286,7 +286,7 @@ params.type = "blur"; // blur! params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); EXPECT_FALSE(GetSuggestionView(input_accessory_view_)); } @@ -304,7 +304,7 @@ params.type = "type"; params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); // The suggestions accessory view should be empty. FormSuggestionView* suggestionView = GetSuggestionView(input_accessory_view_); @@ -333,7 +333,7 @@ params.type = "type"; params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); // The providers should each be asked if they have suggestions for the // form in question. @@ -383,7 +383,7 @@ params.type = "type"; params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); // Since the first provider has suggestions available, it and only it // should have been asked. @@ -423,7 +423,7 @@ params.type = "type"; params.value = "value"; params.input_missing = false; - test_form_activity_tab_helper_.OnFormActivity(params); + test_form_activity_tab_helper_.FormActivityRegistered(params); // Selecting a suggestion should notify the delegate. [suggestion_controller_ didSelectSuggestion:suggestions[0]];
diff --git a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h index 13d5c4d9..4b5f86d 100644 --- a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h +++ b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h
@@ -9,16 +9,18 @@ #include <memory> #include <vector> +#include "base/memory/ref_counted.h" + namespace autofill { struct PasswordForm; } // namespace autofill -namespace ios { -class ChromeBrowserState; -} // namespace ios - @class PasswordFetcher; +namespace password_manager { +class PasswordStore; +} // namespace password_manager + // Protocol to receive the passwords fetched asynchronously. @protocol PasswordFetcherDelegate @@ -32,8 +34,10 @@ @interface PasswordFetcher : NSObject // The designated initializer. |browserState| must not be nil. -- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - delegate:(id<PasswordFetcherDelegate>)delegate +- (instancetype)initWithPasswordStore: + (scoped_refptr<password_manager::PasswordStore>) + passwordStore + delegate:(id<PasswordFetcherDelegate>)delegate NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm index 5b2632f..8e53bdc 100644 --- a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm +++ b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm
@@ -5,12 +5,10 @@ #import "ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h" #include "components/autofill/core/common/password_form.h" -#include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_list_sorter.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store_consumer.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #include "ios/chrome/browser/passwords/save_passwords_consumer.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -25,8 +23,6 @@ std::unique_ptr<ios::SavePasswordsConsumer> _savedPasswordsConsumer; // The list of the user's saved passwords. std::vector<std::unique_ptr<autofill::PasswordForm>> _savedForms; - // The current Chrome browser state. - ios::ChromeBrowserState* _browserState; } // Delegate to send the fetchted passwords. @@ -40,16 +36,16 @@ #pragma mark - Initialization -- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - delegate:(id<PasswordFetcherDelegate>)delegate { - DCHECK(browserState); +- (instancetype)initWithPasswordStore: + (scoped_refptr<password_manager::PasswordStore>) + passwordStore + delegate:(id<PasswordFetcherDelegate>)delegate { + DCHECK(passwordStore); + DCHECK(delegate); self = [super init]; if (self) { - _browserState = browserState; _delegate = delegate; - _passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( - _browserState, ServiceAccessType::EXPLICIT_ACCESS); - DCHECK(_passwordStore); + _passwordStore = passwordStore; _savedPasswordsConsumer.reset(new ios::SavePasswordsConsumer(self)); _passwordStore->GetAutofillableLogins(_savedPasswordsConsumer.get()); }
diff --git a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm index 48933089..f46faf6d 100644 --- a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm +++ b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm
@@ -131,9 +131,13 @@ // Tests PasswordFetcher initialization. TEST_F(PasswordFetcherTest, Initialization) { + TestPasswordFetcherDelegate* passwordFetcherDelegate = + [[TestPasswordFetcherDelegate alloc] init]; + auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS); PasswordFetcher* passwordFetcher = - [[PasswordFetcher alloc] initWithBrowserState:chrome_browser_state_.get() - delegate:nil]; + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:passwordFetcherDelegate]; EXPECT_TRUE(passwordFetcher); } @@ -142,9 +146,11 @@ AddSavedForm1(); TestPasswordFetcherDelegate* passwordFetcherDelegate = [[TestPasswordFetcherDelegate alloc] init]; + auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS); PasswordFetcher* passwordFetcher = - [[PasswordFetcher alloc] initWithBrowserState:chrome_browser_state_.get() - delegate:passwordFetcherDelegate]; + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:passwordFetcherDelegate]; WaitUntilCondition( ^bool { return passwordFetcherDelegate.passwordNumber > 0; @@ -161,9 +167,11 @@ AddSavedForm2(); TestPasswordFetcherDelegate* passwordFetcherDelegate = [[TestPasswordFetcherDelegate alloc] init]; + auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS); PasswordFetcher* passwordFetcher = - [[PasswordFetcher alloc] initWithBrowserState:chrome_browser_state_.get() - delegate:passwordFetcherDelegate]; + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:passwordFetcherDelegate]; WaitUntilCondition( ^bool { return passwordFetcherDelegate.passwordNumber > 0; @@ -180,9 +188,11 @@ AddBlacklistedForm(); TestPasswordFetcherDelegate* passwordFetcherDelegate = [[TestPasswordFetcherDelegate alloc] init]; + auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS); PasswordFetcher* passwordFetcher = - [[PasswordFetcher alloc] initWithBrowserState:chrome_browser_state_.get() - delegate:passwordFetcherDelegate]; + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:passwordFetcherDelegate]; WaitUntilCondition( ^bool { return passwordFetcherDelegate.passwordNumber > 0; @@ -201,9 +211,11 @@ AddSavedForm1(); TestPasswordFetcherDelegate* passwordFetcherDelegate = [[TestPasswordFetcherDelegate alloc] init]; + auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS); PasswordFetcher* passwordFetcher = - [[PasswordFetcher alloc] initWithBrowserState:chrome_browser_state_.get() - delegate:passwordFetcherDelegate]; + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:passwordFetcherDelegate]; WaitUntilCondition( ^bool { return passwordFetcherDelegate.passwordNumber > 0;
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn index 22855af..2100a63 100644 --- a/ios/chrome/browser/metrics/BUILD.gn +++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -53,7 +53,6 @@ "//ios/chrome/browser/sync", "//ios/chrome/browser/tabs", "//ios/chrome/browser/translate", - "//ios/chrome/browser/unified_consent:feature", "//ios/chrome/browser/variations", "//ios/chrome/browser/variations:ios_chrome_ui_string_overrider_factory", "//ios/chrome/browser/web_state_list",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm index 256aa1c..7e9cefe 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -59,7 +59,6 @@ #include "ios/chrome/browser/tab_parenting_global_observer.h" #import "ios/chrome/browser/tabs/tab_model_list.h" #include "ios/chrome/browser/translate/translate_ranker_metrics_provider.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/common/channel_info.h" #include "ios/web/public/web_thread.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -294,8 +293,7 @@ ProfileSyncServiceFactory::GetInstance()->GetForBrowserState( browser_state); ObserveServiceForSyncDisables(static_cast<syncer::SyncService*>(sync), - browser_state->GetPrefs(), - IsUnifiedConsentFeatureEnabled()); + browser_state->GetPrefs()); return (history_service != nullptr && sync != nullptr); }
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index a4ca546..e8a0433d 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -727,10 +727,10 @@ ExecuteJavaScript(kClearInputFieldsScript); PasswordFormFillData form_data; - SetPasswordFormFillData(form_data, data.origin, data.action, - data.username_field, data.username_value, - data.password_field, data.password_value, nullptr, - nullptr, false); + SetPasswordFormFillData(data.origin, data.action, data.username_field, + data.username_value, data.password_field, + data.password_value, nullptr, nullptr, false, + &form_data); __block BOOL block_was_called = NO; [passwordController_ fillPasswordForm:form_data @@ -810,8 +810,8 @@ LoadHtml(html); const std::string base_url = BaseUrl(); PasswordFormFillData form_data; - SetPasswordFormFillData(form_data, base_url, base_url, "un0", "test_user", - "pw0", "test_password", nullptr, nullptr, false); + SetPasswordFormFillData(base_url, base_url, "un0", "test_user", "pw0", + "test_password", nullptr, nullptr, false, &form_data); __block BOOL block_was_called = NO; __block BOOL return_value = NO; [passwordController_ fillPasswordForm:form_data @@ -938,8 +938,8 @@ // we can test with an initially-empty username field. Testing with a // username field that contains input is performed by a specific test below. PasswordFormFillData form_data; - SetPasswordFormFillData(form_data, base_url, base_url, "un", "user0", "pw", - "password0", "abc", "def", true); + SetPasswordFormFillData(base_url, base_url, "un", "user0", "pw", "password0", + "abc", "def", true, &form_data); form_data.name = base::ASCIIToUTF16(FormName(0)); __block BOOL block_was_called = NO; @@ -1035,9 +1035,9 @@ const auto& test_data = kTestData[form_i]; PasswordFormFillData form_data; - SetPasswordFormFillData( - form_data, base_url, base_url, test_data.username_element, "user0", - test_data.password_element, "password0", "abc", "def", true); + SetPasswordFormFillData(base_url, base_url, test_data.username_element, + "user0", test_data.password_element, "password0", + "abc", "def", true, &form_data); form_data.name = base::ASCIIToUTF16(test_data.form_name); __block BOOL block_was_called = NO;
diff --git a/ios/chrome/browser/pref_names.cc b/ios/chrome/browser/pref_names.cc index 78a596a..b4893ac 100644 --- a/ios/chrome/browser/pref_names.cc +++ b/ios/chrome/browser/pref_names.cc
@@ -64,8 +64,7 @@ const char kIosBookmarkCachedFolderId[] = "ios.bookmark.cached_folder_id"; // Caches the scroll position of Bookmarks. -const char kIosBookmarkCachedScrollPosition[] = - "ios.bookmark.cached_scroll_position"; +const char kIosBookmarkCachedTopMostRow[] = "ios.bookmark.cached_top_most_row"; // Preference that keep information about where to create a new bookmark. const char kIosBookmarkFolderDefault[] = "ios.bookmark.default_folder";
diff --git a/ios/chrome/browser/pref_names.h b/ios/chrome/browser/pref_names.h index e3b07c1..cecfcd24 100644 --- a/ios/chrome/browser/pref_names.h +++ b/ios/chrome/browser/pref_names.h
@@ -22,7 +22,7 @@ extern const char kEnableDoNotTrack[]; extern const char kHttpServerProperties[]; extern const char kIosBookmarkCachedFolderId[]; -extern const char kIosBookmarkCachedScrollPosition[]; +extern const char kIosBookmarkCachedTopMostRow[]; extern const char kIosBookmarkFolderDefault[]; extern const char kIosBookmarkPromoAlreadySeen[]; extern const char kIosBookmarkSigninPromoDisplayedCount[];
diff --git a/ios/chrome/browser/ssl/insecure_input_tab_helper.h b/ios/chrome/browser/ssl/insecure_input_tab_helper.h index ce1ecf7..62dd9053 100644 --- a/ios/chrome/browser/ssl/insecure_input_tab_helper.h +++ b/ios/chrome/browser/ssl/insecure_input_tab_helper.h
@@ -42,8 +42,8 @@ explicit InsecureInputTabHelper(web::WebState* web_state); // FormActivityObserver implementation. - void OnFormActivity(web::WebState* web_state, - const web::FormActivityParams& params) override; + void FormActivityRegistered(web::WebState* web_state, + const web::FormActivityParams& params) override; // WebStateObserver implementation. void WebStateDestroyed(web::WebState* web_state) override;
diff --git a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm index 06d0a1f..d06fd82b 100644 --- a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm +++ b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm
@@ -120,7 +120,7 @@ ->AddObserver(this); } -void InsecureInputTabHelper::OnFormActivity( +void InsecureInputTabHelper::FormActivityRegistered( web::WebState* web_state, const web::FormActivityParams& params) { DCHECK_EQ(web_state_, web_state);
diff --git a/ios/chrome/browser/sync/BUILD.gn b/ios/chrome/browser/sync/BUILD.gn index b5ba309..c55af33 100644 --- a/ios/chrome/browser/sync/BUILD.gn +++ b/ios/chrome/browser/sync/BUILD.gn
@@ -52,6 +52,7 @@ "//components/sync", "//components/sync_preferences", "//components/sync_sessions", + "//components/unified_consent", "//components/version_info", "//google_apis", "//ios/chrome/browser", @@ -72,7 +73,6 @@ "//ios/chrome/browser/sync/sessions", "//ios/chrome/browser/tabs", "//ios/chrome/browser/undo", - "//ios/chrome/browser/unified_consent:feature", "//ios/chrome/common", "//ios/web", "//net",
diff --git a/ios/chrome/browser/sync/sync_setup_service.cc b/ios/chrome/browser/sync/sync_setup_service.cc index 4a14dff..68e3d89e 100644 --- a/ios/chrome/browser/sync/sync_setup_service.cc +++ b/ios/chrome/browser/sync/sync_setup_service.cc
@@ -12,10 +12,10 @@ #include "components/sync/base/sync_prefs.h" #include "components/sync/driver/sync_service.h" #include "components/sync/protocol/sync_protocol_error.h" +#include "components/unified_consent/feature.h" #include "google_apis/gaia/google_service_auth_error.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/pref_names.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "net/base/network_change_notifier.h" namespace { @@ -35,7 +35,7 @@ DCHECK(prefs_); for (unsigned int i = 0; i < arraysize(kDataTypes); ++i) { if (kDataTypes[i] == syncer::USER_EVENTS && - !IsUnifiedConsentFeatureEnabled()) + !unified_consent::IsUnifiedConsentFeatureEnabled()) continue; user_selectable_types_.Put(kDataTypes[i]); }
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index 57d670d..8a6231af 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -57,10 +57,10 @@ "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/signin_interaction/public", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/unified_consent", - "//ios/chrome/browser/unified_consent:feature", "//ios/chrome/common", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/images",
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm index b63c03de..630746d2 100644 --- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
@@ -22,6 +22,7 @@ #include "components/signin/core/browser/profile_management_switches.h" #include "components/signin/core/browser/signin_metrics.h" #include "components/strings/grit/components_strings.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" @@ -45,7 +46,6 @@ #import "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/chrome/browser/ui/util/label_link_controller.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/browser/unified_consent/unified_consent_service_factory.h" #include "ios/chrome/common/string_util.h" #include "ios/chrome/grit/ios_chromium_strings.h" @@ -201,7 +201,7 @@ dispatcher:(id<ApplicationCommands>)dispatcher { self = [super init]; if (self) { - _unifiedConsentEnabled = IsUnifiedConsentFeatureEnabled(); + _unifiedConsentEnabled = unified_consent::IsUnifiedConsentFeatureEnabled(); _browserState = browserState; _accessPoint = accessPoint; _promoAction = promoAction;
diff --git a/ios/chrome/browser/ui/authentication/signin_account_selector_view_controller.mm b/ios/chrome/browser/ui/authentication/signin_account_selector_view_controller.mm index 76a9bd3..59c0421 100644 --- a/ios/chrome/browser/ui/authentication/signin_account_selector_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin_account_selector_view_controller.mm
@@ -14,13 +14,13 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/common/ui_util/constraints_ui_util.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" #include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm index 316c465..4ba5354 100644 --- a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm
@@ -14,6 +14,7 @@ #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui_util/constraints_ui_util.h" @@ -24,7 +25,6 @@ #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" #include "ios/public/provider/chrome/browser/signin/signin_resources_provider.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm index 416de794..6569a68 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm +++ b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
@@ -143,7 +143,7 @@ #pragma mark - FormActivityObserver - (void)webState:(web::WebState*)webState - registeredFormActivity:(const web::FormActivityParams&)params { + didRegisterFormActivity:(const web::FormActivityParams&)params { DCHECK_EQ(_webState, webState); web::URLVerificationTrustLevel trustLevel; const GURL pageURL(webState->GetCurrentURL(&trustLevel));
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h new file mode 100644 index 0000000..1aebbc4 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h
@@ -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. + +#ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_MANUAL_FILL_INJECTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_MANUAL_FILL_INJECTION_HANDLER_H_ + +#import <Foundation/Foundation.h> + +#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_content_delegate.h" + +class WebStateList; + +// Handler with the common logic for injecting data from manual fill. +@interface ManualFillInjectionHandler : NSObject<ManualFillContentDelegate> + +// Returns a handler using the passed `WebStateList` in order to inject JS in +// the active web state. +- (instancetype)initWithWebStateList:(WebStateList*)webStateList; + +@end + +#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_MANUAL_FILL_INJECTION_HANDLER_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.mm new file mode 100644 index 0000000..791db91 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.mm
@@ -0,0 +1,89 @@ +// 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/autofill/manual_fill/manual_fill_injection_handler.h" + +#include "base/mac/foundation_util.h" +#import "components/autofill/ios/browser/js_suggestion_manager.h" +#import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/web/public/web_state/js/crw_js_injection_receiver.h" +#include "ios/web/public/web_state/web_state.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface ManualFillInjectionHandler () +// The WebStateList with the relevant active web state for the injection. +@property(nonatomic, assign) WebStateList* webStateList; +// Convenience getter for the current injection reciever. +@property(nonatomic, readonly) CRWJSInjectionReceiver* injectionReceiver; +// Convenience getter for the current suggestion manager. +@property(nonatomic, readonly) JsSuggestionManager* suggestionManager; +@end + +@implementation ManualFillInjectionHandler + +@synthesize webStateList = _webStateList; + +- (instancetype)initWithWebStateList:(WebStateList*)webStateList { + self = [super init]; + if (self) { + _webStateList = webStateList; + } + return self; +} + +#pragma mark - ManualFillViewDelegate + +- (void)userDidPickContent:(NSString*)content isSecure:(BOOL)isSecure { + if (isSecure) { + // TODO:(https://crbug.com/878388) implement secure manual fill for + // passwords. + return; + } + [self fillLastSelectedFieldWithString:content]; +} + +#pragma mark - Getters + +- (CRWJSInjectionReceiver*)injectionReceiver { + web::WebState* webState = self.webStateList->GetActiveWebState(); + if (webState) { + return webState->GetJSInjectionReceiver(); + } + return nil; +} + +- (JsSuggestionManager*)suggestionManager { + return base::mac::ObjCCastStrict<JsSuggestionManager>( + [self.injectionReceiver instanceOfClass:[JsSuggestionManager class]]); +} + +#pragma mark - Document Interaction + +// Injects the passed string to the active field and jumps to the next field. +- (void)fillLastSelectedFieldWithString:(NSString*)string { + // TODO:(https://crbug.com/878388) validation / escaping of string. + NSString* javaScriptQuery = + [NSString stringWithFormat: + @"__gCrWeb.fill.setInputElementValue(\"%@\", " + @"document.activeElement);", + string]; + [self.injectionReceiver executeJavaScript:javaScriptQuery + completionHandler:^(id, NSError*) { + [self jumpToNextField]; + }]; +} + +// Attempts to jump to the next field in the current form. +- (void)jumpToNextField { + FormInputAccessoryViewHandler* handler = + [[FormInputAccessoryViewHandler alloc] init]; + handler.JSSuggestionManager = self.suggestionManager; + [handler selectNextElementWithoutButtonPress]; +} + +@end
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_list_delegate.h b/ios/chrome/browser/ui/autofill/manual_fill/password_list_delegate.h new file mode 100644 index 0000000..944c226 --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_list_delegate.h
@@ -0,0 +1,16 @@ +// 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_AUTOFILL_MANUAL_FILL_PASSWORD_LIST_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_PASSWORD_LIST_DELEGATE_H_ + +// Delegate for actions in manual fallback's passwords list. +@protocol PasswordListDelegate +// Dismisses the presented view controller. +- (void)dismissPresentedViewController; +// Requests to open the list of all passwords. +- (void)openAllPasswordsList; +@end + +#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_PASSWORD_LIST_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.h b/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.h new file mode 100644 index 0000000..9fd345b --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.h
@@ -0,0 +1,51 @@ +// 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_AUTOFILL_MANUAL_FILL_PASSWORD_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_PASSWORD_MEDIATOR_H_ + +#import <Foundation/Foundation.h> + +#include "base/memory/ref_counted.h" + +@protocol ManualFillContentDelegate; +@protocol ManualFillPasswordConsumer; +@protocol PasswordListDelegate; + +namespace password_manager { +class PasswordStore; +} // namespace password_manager + +class WebStateList; + +// Object in charge of getting the passwords relevant for the manual fill +// passwords UI. +@interface ManualFillPasswordMediator : NSObject + +// The consumer for passwords updates. Setting it will trigger the consumer +// methods with the current data. +@property(nonatomic, weak) id<ManualFillPasswordConsumer> consumer; +// The delegate in charge of using the content selected by the user. +@property(nonatomic, weak) id<ManualFillContentDelegate> contentDelegate; +// The delegate in charge of navigation. +@property(nonatomic, weak) id<PasswordListDelegate> navigationDelegate; +// If YES disables filtering the fetched passwords with the active web state +// url. Also activates an "All passwords" action if NO. Set this value before +// setting the consumer, since just setting this won't trigger the consumer +// methods. +@property(nonatomic, assign) BOOL disableFilter; + +// The designated initializer. |passwordStore| and |webStateList| must not be +// nil. +- (instancetype)initWithWebStateList:(WebStateList*)webStateList + passwordStore: + (scoped_refptr<password_manager::PasswordStore>) + passwordStore NS_DESIGNATED_INITIALIZER; + +// Unavailable. Use |initWithWebStateList:passwordStore:|. +- (instancetype)init NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_PASSWORD_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.mm new file mode 100644 index 0000000..5dc564ec --- /dev/null +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_mediator.mm
@@ -0,0 +1,177 @@ +// 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/autofill/manual_fill/password_mediator.h" + +#include <vector> + +#include "base/strings/sys_string_conversions.h" +#include "components/password_manager/core/browser/password_store.h" +#import "ios/chrome/browser/autofill/manual_fill/passwords_fetcher.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/action_cell.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/credential.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/credential_password_form.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_content_delegate.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/password_consumer.h" +#import "ios/chrome/browser/ui/autofill/manual_fill/password_list_delegate.h" +#import "ios/chrome/browser/ui/list_model/list_model.h" +#import "ios/chrome/browser/ui/table_view/table_view_model.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#include "ios/chrome/grit/ios_strings.h" +#import "ios/web/public/web_state/web_state.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "ui/base/l10n/l10n_util_mac.h" +#include "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface ManualFillPasswordMediator ()<ManualFillContentDelegate, + PasswordFetcherDelegate> +// The |WebStateList| containing the active web state. Used to filter the list +// of credentials based on the active web state. +@property(nonatomic, assign) WebStateList* webStateList; +// The password fetcher to query the user profile. +@property(nonatomic, strong) PasswordFetcher* passwordFetcher; +// A cache of the credentials fetched from the store, not synced. Useful to +// reuse the mediator. +@property(nonatomic, strong) NSArray<ManualFillCredential*>* credentials; +// If the filter is disabled, the "Show All Passwords" button is not included +// in the model. +@property(nonatomic, assign, readonly) BOOL isAllPasswordButtonEnabled; + +@end + +@implementation ManualFillPasswordMediator + +@synthesize consumer = _consumer; +@synthesize contentDelegate = _contentDelegate; +@synthesize credentials = _credentials; +@synthesize disableFilter = _disableFilter; +@synthesize navigationDelegate = _navigationDelegate; +@synthesize passwordFetcher = _passwordFetcher; +@synthesize webStateList = _webStateList; + +- (instancetype)initWithWebStateList:(WebStateList*)webStateList + passwordStore: + (scoped_refptr<password_manager::PasswordStore>) + passwordStore { + self = [super init]; + if (self) { + _credentials = @[]; + _webStateList = webStateList; + _passwordFetcher = + [[PasswordFetcher alloc] initWithPasswordStore:passwordStore + delegate:self]; + } + return self; +} + +- (void)setConsumer:(id<ManualFillPasswordConsumer>)consumer { + if (consumer == _consumer) { + return; + } + _consumer = consumer; + [self postCredentialsToConsumer]; + [self postActionsToConsumer]; +} + +#pragma mark - PasswordFetcherDelegate + +- (void)passwordFetcher:(PasswordFetcher*)passwordFetcher + didFetchPasswords: + (std::vector<std::unique_ptr<autofill::PasswordForm>>&)passwords { + NSMutableArray<ManualFillCredential*>* credentials = + [[NSMutableArray alloc] initWithCapacity:passwords.size()]; + for (auto it = passwords.begin(); it != passwords.end(); ++it) { + autofill::PasswordForm& form = **it; + ManualFillCredential* credential = + [[ManualFillCredential alloc] initWithPasswordForm:form]; + [credentials addObject:credential]; + } + self.credentials = credentials; + [self postCredentialsToConsumer]; +} + +#pragma mark - Private + +// Posts the credentials to the consumer. If filtered is |YES| it only post the +// ones associated with the active web state. +- (void)postCredentialsToConsumer { + if (!self.consumer) { + return; + } + if (self.disableFilter) { + auto credentials = [self createItemsForCredentials:self.credentials]; + [self.consumer presentCredentials:credentials]; + return; + } + web::WebState* currentWebState = self.webStateList->GetActiveWebState(); + if (!currentWebState) { + return; + } + GURL visibleURL = currentWebState->GetVisibleURL(); + std::string site_name = + net::registry_controlled_domains::GetDomainAndRegistry( + visibleURL.host(), + net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + NSString* siteName = base::SysUTF8ToNSString(site_name); + + NSPredicate* predicate = + [NSPredicate predicateWithFormat:@"siteName = %@", siteName]; + NSArray* filteredCredentials = + [self.credentials filteredArrayUsingPredicate:predicate]; + auto credentials = [self createItemsForCredentials:filteredCredentials]; + [self.consumer presentCredentials:credentials]; +} + +// Creates a table view model with the passed credentials. +- (NSArray<ManualFillCredentialItem*>*)createItemsForCredentials: + (NSArray<ManualFillCredential*>*)credentials { + NSMutableArray* items = + [[NSMutableArray alloc] initWithCapacity:credentials.count]; + for (ManualFillCredential* credential in credentials) { + auto item = [[ManualFillCredentialItem alloc] initWithCredential:credential + delegate:self]; + [items addObject:item]; + } + return items; +} + +- (void)postActionsToConsumer { + if (!self.consumer) { + return; + } + if (self.isAllPasswordButtonEnabled) { + NSString* titleString = l10n_util::GetNSString( + IDS_IOS_MANUAL_FALLBACK_USE_OTHER_PASSWORD_WITH_DOTS); + __weak __typeof(self) weakSelf = self; + + auto otherPasswordsItem = [[ManualFillActionItem alloc] + initWithTitle:titleString + action:^{ + [weakSelf.navigationDelegate openAllPasswordsList]; + }]; + [self.consumer presentActions:@[ otherPasswordsItem ]]; + } else { + [self.consumer presentActions:@[]]; + } +} + +#pragma mark - Getters + +- (BOOL)isAllPasswordButtonEnabled { + return !self.disableFilter; +} + +#pragma mark - ManualFillContentDelegate + +- (void)userDidPickContent:(NSString*)content isSecure:(BOOL)isSecure { + [self.navigationDelegate dismissPresentedViewController]; + [self.contentDelegate userDidPickContent:content isSecure:isSecure]; +} + +@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h index f1d036b5e..f2bb526 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h
@@ -97,9 +97,6 @@ // Desired favicon size, in points. + (CGFloat)desiredFaviconSizePt; -// Cell height, in points. -+ (CGFloat)cellHeightPt; - // Minimium spacing between keyboard and the titleText when creating new folder, // in points. + (CGFloat)keyboardSpacingPt;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm index 3236f2c..15ea79a 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm
@@ -19,9 +19,6 @@ // Desired favicon size, in points. const CGFloat kDesiredFaviconSizePt = 32.0; -// Cell height, in points. -const CGFloat kCellHeightPt = 56.0; - // Minimium spacing between keyboard and the titleText when creating new folder, // in points. const CGFloat kKeyboardSpacingPt = 16.0; @@ -85,10 +82,6 @@ return kDesiredFaviconSizePt; } -+ (CGFloat)cellHeightPt { - return kCellHeightPt; -} - + (CGFloat)keyboardSpacingPt { return kKeyboardSpacingPt; }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm index 94efc81..6e0ae4d5 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -92,6 +92,18 @@ // Grayscale fallback favicon light gray text color. const CGFloat kFallbackIconDefaultTextColorWhitePercentage = 0.66; +// Estimated TableView row height. +const CGFloat kEstimatedRowHeight = 65.0; + +// TableView rows that are hidden by the NavigationBar, causing them to be +// "visible" for the tableView but not for the user. This is used to calculate +// the top most visibile table view indexPath row. +// TODO(crbug.com/879001): This value is aproximate based on the standard (no +// dynamic type) height. If the dynamic font is too large or too small it will +// result in a small offset on the cache, in order to prevent this we need to +// calculate this value dynamically. +const int kRowsHiddenByNavigationBar = 2; + // NetworkTrafficAnnotationTag for fetching favicon from a Google server. const net::NetworkTrafficAnnotationTag kTrafficAnnotation = net::DefineNetworkTrafficAnnotation("bookmarks_get_large_icon", R"( @@ -128,6 +140,7 @@ const CGFloat kShadowOpacity = 0.12f; // Shadow radius for the NavigationController Toolbar. const CGFloat kShadowRadius = 12.0f; + } // namespace // An AlertCoordinator with the "Action Sheet" style that does not provide an @@ -199,9 +212,9 @@ @property(nonatomic, assign) BookmarksContextBarState contextBarState; // When the view is first shown on the screen, this property represents the -// cached value of the y of the content offset of the table view. This +// cached value of the top most visible indexPath row of the table view. This // property is set to nil after it is used. -@property(nonatomic, strong) NSNumber* cachedContentPosition; +@property(nonatomic, assign) int cachedIndexPathRow; // Set to YES, only when this view controller instance is being created // from cached path. Once the view controller is shown, this is set to NO. @@ -242,7 +255,7 @@ @synthesize homeDelegate = _homeDelegate; @synthesize contextBarState = _contextBarState; @synthesize dispatcher = _dispatcher; -@synthesize cachedContentPosition = _cachedContentPosition; +@synthesize cachedIndexPathRow = _cachedIndexPathRow; @synthesize isReconstructingFromCache = _isReconstructingFromCache; @synthesize sharedState = _sharedState; @synthesize mediator = _mediator; @@ -311,15 +324,15 @@ [stack addObject:self]; int64_t cachedFolderID; - double cachedScrollPosition; + int cachedIndexPathRow; // If cache is present then reconstruct the last visited bookmark from // cache. if (![BookmarkPathCache - getBookmarkUIPositionCacheWithPrefService:self.browserState + getBookmarkTopMostRowCacheWithPrefService:self.browserState ->GetPrefs() model:self.bookmarks folderId:&cachedFolderID - scrollPosition:&cachedScrollPosition] || + topMostRow:&cachedIndexPathRow] || cachedFolderID == self.bookmarks->root_node()->id()) { return stack; } @@ -351,9 +364,7 @@ [self setupNavigationForBookmarkHomeViewController:controller usingBookmarkNode:node]; if (nodeID == cachedFolderID) { - [controller - setCachedContentPosition:[NSNumber - numberWithDouble:cachedScrollPosition]]; + controller.cachedIndexPathRow = cachedIndexPathRow; } [stack addObject:controller]; } @@ -409,11 +420,16 @@ - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; - // Set the content position after views are laid out, to ensure the right - // window of rows is shown. Once used, reset self.cachedContentPosition. - if (self.cachedContentPosition) { - [self setContentPosition:self.cachedContentPosition.floatValue]; - self.cachedContentPosition = nil; + // Check that the tableView still contains as many rows, and that + // |self.cachedIndexPathRow| is not 0. + if (self.cachedIndexPathRow && + [self.tableView numberOfRowsInSection:0] > self.cachedIndexPathRow) { + NSIndexPath* indexPath = + [NSIndexPath indexPathForRow:self.cachedIndexPathRow inSection:0]; + [self.tableView scrollToRowAtIndexPath:indexPath + atScrollPosition:UITableViewScrollPositionTop + animated:NO]; + self.cachedIndexPathRow = 0; } } @@ -456,8 +472,7 @@ // Configure the table view. self.sharedState.tableView.accessibilityIdentifier = @"bookmarksTableView"; - self.sharedState.tableView.estimatedRowHeight = - [BookmarkHomeSharedState cellHeightPt]; + self.sharedState.tableView.estimatedRowHeight = kEstimatedRowHeight; self.tableView.sectionHeaderHeight = 0; // Setting a sectionFooterHeight of 0 will be the same as not having a // footerView, which shows a cell separator for the last cell. Removing this @@ -496,13 +511,13 @@ DCHECK([self isViewLoaded]); } -- (void)cachePosition { - // Cache position for BookmarkTableView. +- (void)cacheIndexPathRow { + // Cache IndexPathRow for BookmarkTableView. + int topMostVisibleIndexPathRow = [self topMostVisibleIndexPathRow]; [BookmarkPathCache - cacheBookmarkUIPositionWithPrefService:self.browserState->GetPrefs() + cacheBookmarkTopMostRowWithPrefService:self.browserState->GetPrefs() folderId:_rootNode->id() - scrollPosition:static_cast<double>( - self.contentPosition)]; + topMostRow:topMostVisibleIndexPathRow]; } #pragma mark - BookmarkHomeConsumer @@ -679,7 +694,7 @@ - (void)openAllNodes:(const std::vector<const bookmarks::BookmarkNode*>&)nodes inIncognito:(BOOL)inIncognito newTab:(BOOL)newTab { - [self cachePosition]; + [self cacheIndexPathRow]; std::vector<GURL> urls = GetUrlsToOpen(nodes); [self.homeDelegate bookmarkHomeViewControllerWantsDismissal:self navigationToUrls:urls @@ -853,16 +868,16 @@ return; int64_t unusedFolderId; - double unusedScrollPosition; + int unusedIndexPathRow; // Bookmark Model is loaded after presenting Bookmarks, we need to check // again here if restoring of cache position is needed. It is to prevent // crbug.com/765503. if ([BookmarkPathCache - getBookmarkUIPositionCacheWithPrefService:self.browserState + getBookmarkTopMostRowCacheWithPrefService:self.browserState ->GetPrefs() model:self.bookmarks folderId:&unusedFolderId - scrollPosition:&unusedScrollPosition]) { + topMostRow:&unusedIndexPathRow]) { self.isReconstructingFromCache = YES; } @@ -995,7 +1010,7 @@ // Saves the current position and asks the delegate to open the url, if delegate // is set, otherwise opens the URL using loader. - (void)dismissWithURL:(const GURL&)url { - [self cachePosition]; + [self cacheIndexPathRow]; if (self.homeDelegate) { std::vector<GURL> urls; if (url.is_valid()) @@ -1123,23 +1138,27 @@ return self.sharedState.tableViewDisplayedRootNode != NULL; } -- (CGFloat)contentPosition { +- (int)topMostVisibleIndexPathRow { + // If on root node screen, return 0. if (self.sharedState.tableViewDisplayedRootNode == self.sharedState.bookmarkModel->root_node()) { return 0; } - // Divided the scroll position by cell height so that it will stay correct in - // case the cell height is changed in future. - return self.sharedState.tableView.contentOffset.y / - [BookmarkHomeSharedState cellHeightPt]; -} -- (void)setContentPosition:(CGFloat)position { - // The scroll position was divided by the cell height when stored. - [self.sharedState.tableView - setContentOffset:CGPointMake( - 0, - position * [BookmarkHomeSharedState cellHeightPt])]; + // If no rows in table, return 0. + NSArray* visibleIndexPaths = [self.tableView indexPathsForVisibleRows]; + if (!visibleIndexPaths.count) + return 0; + + // If the first row is still visible, return 0. + NSIndexPath* topMostIndexPath = [visibleIndexPaths objectAtIndex:0]; + if (topMostIndexPath.row == 0) + return 0; + + // Return the first visible row not covered by the NavigationBar. + topMostIndexPath = + [visibleIndexPaths objectAtIndex:kRowsHiddenByNavigationBar]; + return topMostIndexPath.row; } - (void)navigateAway { @@ -1871,7 +1890,7 @@ NSInteger sectionIdentifier = [self.sharedState.tableViewModel sectionIdentifierForSection:indexPath.section]; if (sectionIdentifier == BookmarkHomeSectionIdentifierBookmarks) { - return [BookmarkHomeSharedState cellHeightPt]; + return kEstimatedRowHeight; } return UITableViewAutomaticDimension; }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h index 1ff7931..635686b 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h
@@ -17,28 +17,29 @@ class PrefService; -// Stores and retrieves the bookmark UI position that the user was last viewing. +// Stores and retrieves the bookmark top most row that the user was last +// viewing. @interface BookmarkPathCache : NSObject // Registers the feature preferences. + (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry; -// Caches the bookmark UI position that the user was last viewing. -+ (void)cacheBookmarkUIPositionWithPrefService:(PrefService*)prefService +// Caches the bookmark top most row that the user was last viewing. ++ (void)cacheBookmarkTopMostRowWithPrefService:(PrefService*)prefService folderId:(int64_t)folderId - scrollPosition:(double)scrollPosition; + topMostRow:(int)topMostRow; -// Gets the bookmark UI position that the user was last viewing. Returns YES if -// a valid cache exists. |folderId| and |scrollPosition| are out variables, only +// Gets the bookmark top most row that the user was last viewing. Returns YES if +// a valid cache exists. |folderId| and |topMostRow| are out variables, only // populated if the return is YES. -+ (BOOL)getBookmarkUIPositionCacheWithPrefService:(PrefService*)prefService ++ (BOOL)getBookmarkTopMostRowCacheWithPrefService:(PrefService*)prefService model: (bookmarks::BookmarkModel*)model folderId:(int64_t*)folderId - scrollPosition:(double*)scrollPosition; + topMostRow:(int*)topMostRow; -// Clears the bookmark UI position cache. -+ (void)clearBookmarkUIPositionCacheWithPrefService:(PrefService*)prefService; +// Clears the bookmark top most row cache. ++ (void)clearBookmarkTopMostRowCacheWithPrefService:(PrefService*)prefService; @end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.mm b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.mm index 6e2c6678..2f73ce25 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache.mm
@@ -23,29 +23,24 @@ } // namespace @implementation BookmarkPathCache -// Registers the feature preferences. + + (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry { registry->RegisterInt64Pref(prefs::kIosBookmarkCachedFolderId, kFolderNone); - registry->RegisterDoublePref(prefs::kIosBookmarkCachedScrollPosition, 0); + registry->RegisterIntegerPref(prefs::kIosBookmarkCachedTopMostRow, 0); } -// Caches the bookmark UI position that the user was last viewing. -+ (void)cacheBookmarkUIPositionWithPrefService:(PrefService*)prefService ++ (void)cacheBookmarkTopMostRowWithPrefService:(PrefService*)prefService folderId:(int64_t)folderId - scrollPosition:(double)scrollPosition { + topMostRow:(int)topMostRow { prefService->SetInt64(prefs::kIosBookmarkCachedFolderId, folderId); - prefService->SetDouble(prefs::kIosBookmarkCachedScrollPosition, - scrollPosition); + prefService->SetInteger(prefs::kIosBookmarkCachedTopMostRow, topMostRow); } -// Gets the bookmark UI position that the user was last viewing. Returns YES if -// a valid cache exists. |folderId| and |scrollPosition| are out variables, only -// populated if the return is YES. -+ (BOOL)getBookmarkUIPositionCacheWithPrefService:(PrefService*)prefService ++ (BOOL)getBookmarkTopMostRowCacheWithPrefService:(PrefService*)prefService model: (bookmarks::BookmarkModel*)model folderId:(int64_t*)folderId - scrollPosition:(double*)scrollPosition { + topMostRow:(int*)topMostRow { *folderId = prefService->GetInt64(prefs::kIosBookmarkCachedFolderId); // If the cache was at root node, consider it as nothing was cached. @@ -59,13 +54,11 @@ if (!bookmark) return NO; - *scrollPosition = - prefService->GetDouble(prefs::kIosBookmarkCachedScrollPosition); + *topMostRow = prefService->GetInteger(prefs::kIosBookmarkCachedTopMostRow); return YES; } -// Clears the bookmark UI position cache. -+ (void)clearBookmarkUIPositionCacheWithPrefService:(PrefService*)prefService { ++ (void)clearBookmarkTopMostRowCacheWithPrefService:(PrefService*)prefService { prefService->SetInt64(prefs::kIosBookmarkCachedFolderId, kFolderNone); }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm index 39d7e46..32ad654 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm
@@ -34,19 +34,20 @@ const BookmarkNode* mobileNode = _bookmarkModel->mobile_node(); const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); int64_t folderId = f1->id(); - double position = 23; - [BookmarkPathCache cacheBookmarkUIPositionWithPrefService:&prefs_ + int topMostRow = 23; + [BookmarkPathCache cacheBookmarkTopMostRowWithPrefService:&prefs_ folderId:folderId - scrollPosition:position]; + topMostRow:topMostRow]; int64_t resultFolderId; - double resultPosition; - [BookmarkPathCache getBookmarkUIPositionCacheWithPrefService:&prefs_ - model:_bookmarkModel - folderId:&resultFolderId - scrollPosition:&resultPosition]; + int resultTopMostRow; + [BookmarkPathCache + getBookmarkTopMostRowCacheWithPrefService:&prefs_ + model:_bookmarkModel + folderId:&resultFolderId + topMostRow:&resultTopMostRow]; EXPECT_EQ(folderId, resultFolderId); - EXPECT_EQ(position, resultPosition); + EXPECT_EQ(topMostRow, resultTopMostRow); } TEST_F(BookmarkPathCacheTest, TestPathCacheWhenFolderDeleted) { @@ -54,21 +55,21 @@ const BookmarkNode* mobileNode = _bookmarkModel->mobile_node(); const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); int64_t folderId = f1->id(); - double position = 23; - [BookmarkPathCache cacheBookmarkUIPositionWithPrefService:&prefs_ + int topMostRow = 23; + [BookmarkPathCache cacheBookmarkTopMostRowWithPrefService:&prefs_ folderId:folderId - scrollPosition:position]; + topMostRow:topMostRow]; // Delete the folder. _bookmarkModel->Remove(f1); int64_t unusedFolderId; - double unusedPosition; + int unusedTopMostRow; BOOL result = [BookmarkPathCache - getBookmarkUIPositionCacheWithPrefService:&prefs_ + getBookmarkTopMostRowCacheWithPrefService:&prefs_ model:_bookmarkModel folderId:&unusedFolderId - scrollPosition:&unusedPosition]; + topMostRow:&unusedTopMostRow]; ASSERT_FALSE(result); }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm index 335c675..e8a2773 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -206,7 +206,7 @@ ios::ChromeBrowserState* browser_state = chrome_test_util::GetOriginalBrowserState(); [BookmarkPathCache - clearBookmarkUIPositionCacheWithPrefService:browser_state->GetPrefs()]; + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; } #pragma mark - BookmarksTestCase Tests @@ -852,6 +852,12 @@ } - (void)testCachePositionIsRecreated { + if (!IsUIRefreshPhase1Enabled()) { + EARL_GREY_TEST_SKIPPED( + @"Legacy UI doesn't scroll completely to the bottom, this causes the " + @"cell to be partially hidden by the custom toolbar, making the test " + @"fail."); + } [BookmarksTestCase setupBookmarksWhichExceedsScreenHeight]; [BookmarksTestCase openBookmarks]; [BookmarksTestCase openMobileBookmarks]; @@ -1785,7 +1791,7 @@ ios::ChromeBrowserState* browser_state = chrome_test_util::GetOriginalBrowserState(); [BookmarkPathCache - clearBookmarkUIPositionCacheWithPrefService:browser_state->GetPrefs()]; + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; } #pragma mark - BookmarksTestCaseEntries Tests @@ -2795,7 +2801,7 @@ ios::ChromeBrowserState* browser_state = chrome_test_util::GetOriginalBrowserState(); [BookmarkPathCache - clearBookmarkUIPositionCacheWithPrefService:browser_state->GetPrefs()]; + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; } #pragma mark - BookmarksTestCasePromo Tests @@ -3009,7 +3015,7 @@ ios::ChromeBrowserState* browser_state = chrome_test_util::GetOriginalBrowserState(); [BookmarkPathCache - clearBookmarkUIPositionCacheWithPrefService:browser_state->GetPrefs()]; + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; } #pragma mark - BookmarksTestCaseAccessibility Tests @@ -3185,7 +3191,7 @@ ios::ChromeBrowserState* browser_state = chrome_test_util::GetOriginalBrowserState(); [BookmarkPathCache - clearBookmarkUIPositionCacheWithPrefService:browser_state->GetPrefs()]; + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; } #pragma mark - BookmarksTestFolders Tests
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index 9142dfc2..54302ea 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -233,6 +233,7 @@ #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h" #import "ios/chrome/browser/web/blocked_popup_tab_helper.h" #import "ios/chrome/browser/web/error_page_content.h" +#import "ios/chrome/browser/web/image_fetch_tab_helper.h" #import "ios/chrome/browser/web/load_timing_tab_helper.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #include "ios/chrome/browser/web/print_tab_helper.h" @@ -547,9 +548,6 @@ // when displaying voice search results. UIView<VoiceSearchBar>* _voiceSearchBar; - // The image fetcher used to save images and perform image-based searches. - std::unique_ptr<image_fetcher::IOSImageDataFetcherWrapper> _imageFetcher; - // Cached pointer to the bookmarks model. bookmarks::BookmarkModel* _bookmarkModel; // weak @@ -1030,7 +1028,7 @@ _formInputAccessoryCoordinator = [[FormInputAccessoryCoordinator alloc] initWithBaseViewController:self - browserState:self.browserState + browserState:browserState webStateList:model.webStateList]; [_formInputAccessoryCoordinator start]; @@ -2133,8 +2131,6 @@ for (NSUInteger index = 0; index < count; ++index) [self installDelegatesForTab:[_model tabAtIndex:index]]; - _imageFetcher = std::make_unique<image_fetcher::IOSImageDataFetcherWrapper>( - _browserState->GetSharedURLLoaderFactory()); self.imageSaver = [[ImageSaver alloc] initWithBaseViewController:self]; self.imageCopier = [[ImageCopier alloc] initWithBaseViewController:self]; @@ -3689,7 +3685,6 @@ title = l10n_util::GetNSStringWithFixup(IDS_IOS_CONTENT_CONTEXT_SAVEIMAGE); action = ^{ Record(ACTION_SAVE_IMAGE, isImage, isLink); - DCHECK(imageUrl.is_valid()); [weakSelf.imageSaver saveImageAtURL:imageUrl referrer:referrer webState:weakSelf.currentWebState]; @@ -3701,7 +3696,6 @@ l10n_util::GetNSStringWithFixup(IDS_IOS_CONTENT_CONTEXT_COPYIMAGE); action = ^{ Record(ACTION_COPY_IMAGE, isImage, isLink); - DCHECK(imageUrl.is_valid()); [weakSelf.imageCopier copyImageAtURL:imageUrl referrer:referrer webState:weakSelf.currentWebState]; @@ -3746,7 +3740,12 @@ defaultURL->short_name()); action = ^{ Record(ACTION_SEARCH_BY_IMAGE, isImage, isLink); - [weakSelf searchByImageAtURL:imageUrl referrer:referrer]; + ImageFetchTabHelper* image_fetcher = + ImageFetchTabHelper::FromWebState(self.currentWebState); + DCHECK(image_fetcher); + image_fetcher->GetImageData(imageUrl, referrer, ^(NSData* data) { + [weakSelf searchByImageData:data atURL:imageUrl]; + }); }; [_contextMenuCoordinator addItemWithTitle:title action:action]; } @@ -3798,25 +3797,6 @@ } } -// Performs a search with the image at the given url. The referrer is used to -// download the image. -- (void)searchByImageAtURL:(const GURL&)url - referrer:(const web::Referrer)referrer { - DCHECK(url.is_valid()); - __weak BrowserViewController* weakSelf = self; - const GURL image_source_url = url; - image_fetcher::ImageDataFetcherBlock callback = - ^(NSData* data, const image_fetcher::RequestMetadata& metadata) { - DCHECK(data); - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf searchByImageData:data atURL:image_source_url]; - }); - }; - _imageFetcher->FetchImageDataWebpDecoded( - url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), - web::PolicyForNavigation(url, referrer)); -} - // Performs a search using |data| and |imageURL| as inputs. - (void)searchByImageData:(NSData*)data atURL:(const GURL&)imageURL { NSData* imageData = data;
diff --git a/ios/chrome/browser/ui/collection_view/collection_view_controller.mm b/ios/chrome/browser/ui/collection_view/collection_view_controller.mm index 66884fc..ac2f8f3 100644 --- a/ios/chrome/browser/ui/collection_view/collection_view_controller.mm +++ b/ios/chrome/browser/ui/collection_view/collection_view_controller.mm
@@ -8,8 +8,8 @@ #include "base/mac/foundation_util.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/browser/ui/material_components/utils.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -27,7 +27,7 @@ self = [super initWithCollectionViewLayout:layout]; if (self) { if (style == CollectionViewControllerStyleAppBar) { - _appBarViewController = [[MDCAppBarViewController alloc] init]; + _appBarViewController = [[ChromeAppBarViewController alloc] init]; } } return self;
diff --git a/ios/chrome/browser/ui/material_components/BUILD.gn b/ios/chrome/browser/ui/material_components/BUILD.gn index ac47086..a26ab601 100644 --- a/ios/chrome/browser/ui/material_components/BUILD.gn +++ b/ios/chrome/browser/ui/material_components/BUILD.gn
@@ -9,6 +9,8 @@ "activity_indicator.mm", "app_bar_presenting.h", "app_bar_view_controller_presenting.h", + "chrome_app_bar_view_controller.h", + "chrome_app_bar_view_controller.m", "utils.h", "utils.mm", ]
diff --git a/ios/chrome/browser/ui/material_components/app_bar_view_controller_presenting.h b/ios/chrome/browser/ui/material_components/app_bar_view_controller_presenting.h index 576152dc..6f5b0bb1 100644 --- a/ios/chrome/browser/ui/material_components/app_bar_view_controller_presenting.h +++ b/ios/chrome/browser/ui/material_components/app_bar_view_controller_presenting.h
@@ -7,7 +7,7 @@ #import <UIKit/UIKit.h> -@class MDCAppBarViewController; +@class ChromeAppBarViewController; // An object conforming to this protocol is capable of creating and managing an // MDCAppBar. Typically, UIViewControllers can implement this protocol to @@ -16,7 +16,7 @@ // The installed app bar view controller, if any. @property(nonatomic, readonly, strong) - MDCAppBarViewController* appBarViewController; + ChromeAppBarViewController* appBarViewController; @end
diff --git a/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h b/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h new file mode 100644 index 0000000..55efc82 --- /dev/null +++ b/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h
@@ -0,0 +1,16 @@ +// 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_MATERIAL_COMPONENTS_CHROME_APP_BAR_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_MATERIAL_COMPONENTS_CHROME_APP_BAR_VIEW_CONTROLLER_H_ + +#import "ios/third_party/material_components_ios/src/components/AppBar/src/MDCAppBarViewController.h" + +// Used as substitute to MDCAppBarViewController to prevent default behavior of +// managing accessiblity dismiss gesture itself. Usually the view controller or +// its navigation controller has logic that handles it. +@interface ChromeAppBarViewController : MDCAppBarViewController +@end + +#endif // IOS_CHROME_BROWSER_UI_MATERIAL_COMPONENTS_CHROME_APP_BAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.m b/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.m new file mode 100644 index 0000000..9d37218a --- /dev/null +++ b/ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.m
@@ -0,0 +1,19 @@ +// 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/material_components/chrome_app_bar_view_controller.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation ChromeAppBarViewController + +// Return NO so same method signal can be passed to view controller or its +// navigation controller. +- (BOOL)accessibilityPerformEscape { + return NO; +} + +@end
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h b/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h index 40f4f8a8..2914c65 100644 --- a/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h +++ b/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h
@@ -56,7 +56,8 @@ void OnAutocompleteAccept(const GURL& url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type type) override; + AutocompleteMatchType::Type type, + base::TimeTicks match_selection_timestamp) override; void OnChanged() override; void OnInputInProgress(bool in_progress) override; void OnSetFocus() override;
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.mm b/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.mm index 8799fa0..ce1eaad 100644 --- a/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.mm +++ b/ios/chrome/browser/ui/omnibox/location_bar_controller_impl.mm
@@ -158,7 +158,8 @@ const GURL& gurl, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type type) { + AutocompleteMatchType::Type type, + base::TimeTicks match_selection_timestamp) { if (gurl.is_valid()) { transition = ui::PageTransitionFromInt( transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h index f7ca13a7..41e5da0 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h
@@ -55,7 +55,8 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) override; + size_t selected_line, + base::TimeTicks match_selection_timestamp) override; base::string16 GetText() const override; void SetWindowTextAndCaretPos(const base::string16& text, size_t caret_pos,
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm index 300f29e..e49f99d6 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
@@ -246,14 +246,15 @@ WindowOpenDisposition disposition, const GURL& alternate_nav_url, const base::string16& pasted_text, - size_t selected_line) { + size_t selected_line, + base::TimeTicks match_selection_timestamp) { // It may be unsafe to modify the contents of the field. if (ShouldIgnoreUserInputDueToPendingVoiceSearch()) { return; } OmniboxView::OpenMatch(match, disposition, alternate_nav_url, pasted_text, - selected_line); + selected_line, match_selection_timestamp); } base::string16 OmniboxViewIOS::GetText() const { @@ -1007,5 +1008,6 @@ const GURL& alternate_nav_url, const base::string16& pasted_text, size_t index) { - this->OpenMatch(match, disposition, alternate_nav_url, pasted_text, index); + this->OpenMatch(match, disposition, alternate_nav_url, pasted_text, index, + base::TimeTicks()); }
diff --git a/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.h b/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.h index 8b13020..6d6cf27e 100644 --- a/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.h +++ b/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.h
@@ -33,7 +33,8 @@ void OnAutocompleteAccept(const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type match_type) override; + AutocompleteMatchType::Type match_type, + base::TimeTicks match_selection_timestamp) override; void OnInputInProgress(bool in_progress) override; void OnChanged() override; ToolbarModel* GetToolbarModel() override;
diff --git a/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.mm b/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.mm index 137dd72..bc15f46 100644 --- a/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.mm +++ b/ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.mm
@@ -39,7 +39,8 @@ const GURL& destination_url, WindowOpenDisposition disposition, ui::PageTransition transition, - AutocompleteMatchType::Type match_type) { + AutocompleteMatchType::Type match_type, + base::TimeTicks match_selection_timestamp) { if (destination_url.is_valid()) { transition = ui::PageTransitionFromInt( transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
diff --git a/ios/chrome/browser/ui/payments/payment_request_edit_view_controller.mm b/ios/chrome/browser/ui/payments/payment_request_edit_view_controller.mm index a9d778a..3516c79cc 100644 --- a/ios/chrome/browser/ui/payments/payment_request_edit_view_controller.mm +++ b/ios/chrome/browser/ui/payments/payment_request_edit_view_controller.mm
@@ -232,6 +232,18 @@ return self; } +- (void)viewDidLoad { + [super viewDidLoad]; + + self.collectionView.accessibilityIdentifier = + kPaymentRequestEditCollectionViewAccessibilityID; + + // Customize collection view settings. + self.styler.cellStyle = MDCCollectionViewCellStyleCard; + self.styler.separatorInset = + UIEdgeInsetsMake(0, kSeparatorEdgeInset, 0, kSeparatorEdgeInset); +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [[NSNotificationCenter defaultCenter] @@ -239,6 +251,11 @@ selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil]; + + // Validate the form so that the first field with an invalid value gets focus. + if (_dataSource.state == EditViewControllerStateEdit) { + [self validateForm]; + } } - (void)viewWillDisappear:(BOOL)animated { @@ -361,27 +378,6 @@ [self navigationItem].rightBarButtonItem.enabled = [self isFormValid]; } -- (void)viewDidLoad { - [super viewDidLoad]; - - // Validate the form so that the first field with an invalid value gets focus. - // Perform validation asynchronously to allow for the view to update. - if (_dataSource.state == EditViewControllerStateEdit) { - __weak PaymentRequestEditViewController* weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf validateForm]; - }); - } - - self.collectionView.accessibilityIdentifier = - kPaymentRequestEditCollectionViewAccessibilityID; - - // Customize collection view settings. - self.styler.cellStyle = MDCCollectionViewCellStyleCard; - self.styler.separatorInset = - UIEdgeInsetsMake(0, kSeparatorEdgeInset, 0, kSeparatorEdgeInset); -} - #pragma mark - PaymentRequestEditConsumer - (void)setEditorFields:(NSArray<EditorField*>*)fields {
diff --git a/ios/chrome/browser/ui/payments/payment_request_view_controller.mm b/ios/chrome/browser/ui/payments/payment_request_view_controller.mm index 7938259..d162644 100644 --- a/ios/chrome/browser/ui/payments/payment_request_view_controller.mm +++ b/ios/chrome/browser/ui/payments/payment_request_view_controller.mm
@@ -35,9 +35,9 @@ namespace { const CGFloat kFooterCellHorizontalPadding = 16; - const CGFloat kButtonEdgeInset = 9; const CGFloat kSeparatorEdgeInset = 14; +const CGFloat kSummaryPageInfoRowHeight = 55; typedef NS_ENUM(NSInteger, SectionIdentifier) { SectionIdentifierSummary = kSectionIdentifierEnumZero, @@ -398,6 +398,13 @@ CollectionViewItem* item = [self.collectionViewModel itemAtIndexPath:indexPath]; + // TODO(crbug.com/879588): Remove this when/if cr_preferredHeightForWidth + // works on the next iOS 12 releases. + if (@available(iOS 12, *)) { + if (item.type == ItemTypeSummaryPageInfo) + return kSummaryPageInfoRowHeight; + } + UIEdgeInsets inset = [self collectionView:collectionView layout:collectionView.collectionViewLayout insetForSectionAtIndex:indexPath.section];
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index d085e7ea..c60bf44 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -130,6 +130,7 @@ "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/ui/list_model", + "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/browser/ui/table_view/cells/resources:table_view_cell_check_mark",
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm index 1e0d236..ff29e33 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm
@@ -14,6 +14,7 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" #import "ios/chrome/browser/ui/list_model/list_item+Controller.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/browser/ui/reading_list/empty_reading_list_background_view.h" #import "ios/chrome/browser/ui/reading_list/legacy_reading_list_toolbar.h" #import "ios/chrome/browser/ui/reading_list/reading_list_data_sink.h" @@ -22,7 +23,6 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_list_view_controller_audience.h" #import "ios/chrome/browser/ui/reading_list/reading_list_list_view_controller_delegate.h" #include "ios/chrome/grit/ios_strings.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm index 5d5b74f4..cdefd3c73 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_table_view_controller.mm
@@ -74,6 +74,12 @@ // The action sheet used to confirm whether items should be marked as read or // unread. @property(nonatomic, strong) ActionSheetCoordinator* markConfirmationSheet; +// Whether the table view is being edited after tapping on the edit button in +// the toolbar. +@property(nonatomic, assign, getter=isEditingWithToolbarButtons) + BOOL editingWithToolbarButtons; +// Whether the table view is being edited by the swipe-to-delete button. +@property(nonatomic, readonly, getter=isEditingWithSwipe) BOOL editingWithSwipe; @end @@ -87,6 +93,7 @@ @synthesize selectedUnreadItemCount = _selectedUnreadItemCount; @synthesize selectedReadItemCount = _selectedReadItemCount; @synthesize markConfirmationSheet = _markConfirmationSheet; +@synthesize editingWithToolbarButtons = _editingWithToolbarButtons; - (instancetype)init { self = [super initWithTableViewStyle:UITableViewStylePlain @@ -123,6 +130,8 @@ self.selectedUnreadItemCount = 0; self.selectedReadItemCount = 0; [self updateToolbarItems]; + if (!editing) + self.editingWithToolbarButtons = NO; } - (void)setSelectedUnreadItemCount:(NSUInteger)selectedUnreadItemCount { @@ -151,6 +160,10 @@ _markConfirmationSheet = markConfirmationSheet; } +- (BOOL)isEditingWithSwipe { + return self.editing && !self.editingWithToolbarButtons; +} + #pragma mark - Public - (void)reloadData { @@ -196,6 +209,13 @@ [self.tableView addGestureRecognizer:longPressRecognizer]; } +- (void)viewWillTransitionToSize:(CGSize)size + withTransitionCoordinator: + (id<UIViewControllerTransitionCoordinator>)coordinator { + if (self.editingWithSwipe) + [self exitEditingModeAnimated:YES]; +} + #pragma mark - UITableViewDataSource - (void)tableView:(UITableView*)tableView @@ -362,6 +382,7 @@ - (void)enterReadingListEditMode { if (self.editing) return; + self.editingWithToolbarButtons = YES; [self setEditing:YES animated:YES]; } @@ -830,7 +851,6 @@ - (void)exitEditingModeAnimated:(BOOL)animated { self.markConfirmationSheet = nil; [self setEditing:NO animated:animated]; - [self updateToolbarItems]; } #pragma mark - Emtpy Table Helpers @@ -841,6 +861,8 @@ addEmptyTableViewWithAttributedMessage:GetReadingListEmptyMessage() image:[UIImage imageNamed:kEmptyStateImage]]; + [self updateEmptyTableViewMessageAccessibilityLabel: + GetReadingListEmptyMessageA11yLabel()]; self.tableView.alwaysBounceVertical = NO; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [self.audience readingListHasItems:NO];
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index e74e2272..8ee4ca73 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -192,7 +192,6 @@ "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/browser/ui/table_view/cells/resources:table_view_cell_check_mark", "//ios/chrome/browser/unified_consent", - "//ios/chrome/browser/unified_consent:feature", "//ios/chrome/browser/voice", "//ios/chrome/browser/web:web", "//ios/chrome/common", @@ -314,6 +313,7 @@ "//components/sync_preferences:test_support", "//components/translate/core/browser", "//components/translate/core/common", + "//components/unified_consent", "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/autofill", @@ -338,7 +338,6 @@ "//ios/chrome/browser/ui/icons", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/sync_utils", - "//ios/chrome/browser/unified_consent:feature", "//ios/chrome/browser/voice", "//ios/chrome/browser/web", "//ios/chrome/browser/web:test_support",
diff --git a/ios/chrome/browser/ui/settings/accounts_collection_view_controller.mm b/ios/chrome/browser/ui/settings/accounts_collection_view_controller.mm index cc1a957b..3342a7b 100644 --- a/ios/chrome/browser/ui/settings/accounts_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/accounts_collection_view_controller.mm
@@ -14,6 +14,7 @@ #include "components/signin/core/browser/signin_manager.h" #import "components/signin/ios/browser/oauth2_token_service_observer_bridge.h" #include "components/strings/grit/components_strings.h" +#include "components/unified_consent/feature.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/signin/account_tracker_service_factory.h" #import "ios/chrome/browser/signin/authentication_service.h" @@ -41,7 +42,6 @@ #import "ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/sync_utils/sync_util.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" @@ -136,7 +136,7 @@ _closeSettingsOnAddAccount = closeSettingsOnAddAccount; browser_sync::ProfileSyncService* syncService = ProfileSyncServiceFactory::GetForBrowserState(_browserState); - if (!IsUnifiedConsentFeatureEnabled()) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { // When unified consent flag is enabled, the sync settings are available // in the "Google Services and sync" settings. _syncObserver.reset(new SyncObserverBridge(self, syncService)); @@ -237,7 +237,7 @@ [model addItem:[self addAccountItem] toSectionWithIdentifier:SectionIdentifierAccounts]; - if (!IsUnifiedConsentFeatureEnabled()) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { // Sync and Google Activity section. // When unified consent flag is enabled, those settings are available in // the Google Services and sync settings.
diff --git a/ios/chrome/browser/ui/settings/cells/settings_search_item.h b/ios/chrome/browser/ui/settings/cells/settings_search_item.h index c7e670c..9449f66 100644 --- a/ios/chrome/browser/ui/settings/cells/settings_search_item.h +++ b/ios/chrome/browser/ui/settings/cells/settings_search_item.h
@@ -27,6 +27,9 @@ // The placeholder for the search input field. @property(nonatomic, copy) NSString* placeholder; +// Whether or not the search field is enabled. +@property(nonatomic, assign, getter=isEnabled) BOOL enabled; + @end // Cell representation for SettingsSearchItem.
diff --git a/ios/chrome/browser/ui/settings/cells/settings_search_item.mm b/ios/chrome/browser/ui/settings/cells/settings_search_item.mm index 682decd2..24cd78e 100644 --- a/ios/chrome/browser/ui/settings/cells/settings_search_item.mm +++ b/ios/chrome/browser/ui/settings/cells/settings_search_item.mm
@@ -26,6 +26,8 @@ const CGFloat kBackgroundAlpha = 0.1f; // Input text corner radius. const CGFloat kCornerRadius = 12.0f; +// Input field disabled alpha. +const CGFloat kDisabledAlpha = 0.6f; } // namespace @interface SettingsSearchCell ()<UITextFieldDelegate> @@ -35,12 +37,14 @@ @synthesize delegate = _delegate; @synthesize placeholder = _placeholder; +@synthesize enabled = _enabled; - (instancetype)initWithType:(NSInteger)type { self = [super initWithType:type]; if (self) { self.cellClass = [SettingsSearchCell class]; self.accessibilityTraits |= UIAccessibilityTraitSearchField; + self.enabled = YES; } return self; } @@ -52,6 +56,8 @@ base::mac::ObjCCastStrict<SettingsSearchCell>(cell); [super configureCell:searchCell]; searchCell.textField.placeholder = self.placeholder; + searchCell.textField.enabled = self.isEnabled; + searchCell.textField.alpha = self.isEnabled ? 1.0f : kDisabledAlpha; searchCell.delegate = self.delegate; } @@ -80,6 +86,7 @@ searchIconView.contentMode = UIViewContentModeCenter; _textField = [[UITextField alloc] init]; + _textField.accessibilityIdentifier = @"SettingsSearchCellTextField"; _textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; _textField.backgroundColor = @@ -110,6 +117,15 @@ return self; } +- (void)prepareForReuse { + [super prepareForReuse]; + + self.textField.placeholder = @""; + self.textField.enabled = YES; + self.textField.alpha = 1.0f; + self.delegate = nil; +} + #pragma mark - UITextFieldDelegate - (BOOL)textField:(UITextField*)textField
diff --git a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm index fbfd969..2fc12b9 100644 --- a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
@@ -106,6 +106,11 @@ @"PasswordDetailsCollectionViewController")]; } +// Matcher for a UITextField inside a SettingsSearchCell. +id<GREYMatcher> SearchTextField() { + return grey_accessibilityID(@"SettingsSearchCellTextField"); +} + id<GREYMatcher> SiteHeader() { return grey_allOf( grey_accessibilityLabel( @@ -339,6 +344,38 @@ SaveToPasswordStore(example); } +// Saves two example forms in the store. +void SaveExamplePasswordForms() { + PasswordForm example1; + example1.username_value = base::ASCIIToUTF16("user1"); + example1.password_value = base::ASCIIToUTF16("password1"); + example1.origin = GURL("https://example11.com"); + example1.signon_realm = example1.origin.spec(); + SaveToPasswordStore(example1); + + PasswordForm example2; + example2.username_value = base::ASCIIToUTF16("user2"); + example2.password_value = base::ASCIIToUTF16("password2"); + example2.origin = GURL("https://example12.com"); + example2.signon_realm = example2.origin.spec(); + SaveToPasswordStore(example2); +} + +// Saves two example blacklisted forms in the store. +void SaveExampleBlacklistedForms() { + PasswordForm blacklisted1; + blacklisted1.origin = GURL("https://exclude1.com"); + blacklisted1.signon_realm = blacklisted1.origin.spec(); + blacklisted1.blacklisted_by_user = true; + SaveToPasswordStore(blacklisted1); + + PasswordForm blacklisted2; + blacklisted2.origin = GURL("https://exclude2.com"); + blacklisted2.signon_realm = blacklisted2.origin.spec(); + blacklisted2.blacklisted_by_user = true; + SaveToPasswordStore(blacklisted2); +} + // Removes all credentials stored. void ClearPasswordStore() { GetPasswordStore()->RemoveLoginsCreatedBetween(base::Time(), base::Time(), @@ -1580,4 +1617,85 @@ UIAccessibilityTraitNotEnabled))]; } +// Test that user can type text in search field and that it filters out the +// passwords and blacklisted items. +- (void)testSearchPasswords { + SaveExamplePasswordForms(); + SaveExampleBlacklistedForms(); + + OpenPasswordSettings(); + + [GetInteractionForPasswordEntry(@"example11.com, user1") + assertWithMatcher:grey_notNil()]; + [GetInteractionForPasswordEntry(@"example12.com, user2") + assertWithMatcher:grey_notNil()]; + [GetInteractionForPasswordEntry(@"exclude1.com") + assertWithMatcher:grey_notNil()]; + [GetInteractionForPasswordEntry(@"exclude2.com") + assertWithMatcher:grey_notNil()]; + + [[EarlGrey selectElementWithMatcher:SearchTextField()] + performAction:grey_typeText(@"2")]; + + [GetInteractionForPasswordEntry(@"example11.com, user1") + assertWithMatcher:grey_nil()]; + [GetInteractionForPasswordEntry(@"example12.com, user2") + assertWithMatcher:grey_notNil()]; + [GetInteractionForPasswordEntry(@"exclude1.com") + assertWithMatcher:grey_nil()]; + [GetInteractionForPasswordEntry(@"exclude2.com") + assertWithMatcher:grey_notNil()]; +} + +// Test that user can't search passwords while in edit mode. +- (void)testCantSearchPasswordsWhileInEditMode { + SaveExamplePasswordForms(); + + OpenPasswordSettings(); + TapEdit(); + + // Verify search bar is disabled. + [[EarlGrey selectElementWithMatcher:SearchTextField()] + assertWithMatcher:grey_not(grey_enabled())]; +} + +// Test that the user can edit a password that is part of search results. +- (void)testCanEditPasswordsFromASearch { + SaveExamplePasswordForms(); + OpenPasswordSettings(); + + [[EarlGrey selectElementWithMatcher:SearchTextField()] + performAction:grey_typeText(@"2")]; + + TapEdit(); + + // Select password entry to be edited. + [GetInteractionForPasswordEntry(@"example12.com, user2") + performAction:grey_tap()]; + + // Delete it + [[EarlGrey selectElementWithMatcher:DeleteButtonAtBottom()] + performAction:grey_tap()]; + + // Filter results in nothing. + [GetInteractionForPasswordEntry(@"example11.com, user1") + assertWithMatcher:grey_nil()]; + [GetInteractionForPasswordEntry(@"example12.com, user2") + assertWithMatcher:grey_nil()]; + + // Get out of edit mode. + [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()] + performAction:grey_tap()]; + + // Remove filter search term. + [[EarlGrey selectElementWithMatcher:SearchTextField()] + performAction:grey_clearText()]; + + // Only password 1 should show. + [GetInteractionForPasswordEntry(@"example11.com, user1") + assertWithMatcher:grey_notNil()]; + [GetInteractionForPasswordEntry(@"example12.com, user2") + assertWithMatcher:grey_nil()]; +} + @end
diff --git a/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm b/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm index 90e3799c..50c9497d 100644 --- a/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm
@@ -16,6 +16,7 @@ #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" +#include "components/unified_consent/feature.h" #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/autofill/autofill_controller.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -36,7 +37,6 @@ #import "ios/chrome/browser/ui/settings/settings_utils.h" #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h" #include "ios/chrome/browser/ui/ui_util.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" @@ -115,7 +115,7 @@ self.title = l10n_util::GetNSString(IDS_OPTIONS_ADVANCED_SECTION_TITLE_PRIVACY); self.collectionViewAccessibilityIdentifier = kPrivacyCollectionViewId; - if (!IsUnifiedConsentFeatureEnabled()) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { // When unified consent flag is enabled, the suggestion setting is // available in the "Google Services and sync" settings. _suggestionsEnabled = [[PrefBackedBoolean alloc] @@ -167,7 +167,7 @@ [model addItem:[self handoffDetailItem] toSectionWithIdentifier:SectionIdentifierOtherDevices]; - if (!IsUnifiedConsentFeatureEnabled()) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { // Add "Web services" section only if the unified consent is disabled. // Otherwise the metrics reporting and show suggestions feature are // available in the Google services settings.
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm index fae44e4..24e58bdd 100644 --- a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
@@ -763,6 +763,7 @@ password_manager::features::kPasswordExport)) { [self setExportPasswordsButtonEnabled:NO]; } + [self setSearchPasswordsItemEnabled:NO]; } - (void)collectionViewWillEndEditing:(UICollectionView*)collectionView { @@ -775,6 +776,7 @@ [self setExportPasswordsButtonEnabled:YES]; } } + [self setSearchPasswordsItemEnabled:YES]; } - (void)collectionView:(UICollectionView*)collectionView @@ -1049,6 +1051,25 @@ [self reconfigureCellsForItems:@[ switchItem ]]; } +// Sets the search passwords item's enabled status to |enabled| and +// reconfigures the corresponding cell. +- (void)setSearchPasswordsItemEnabled:(BOOL)enabled { + CollectionViewModel* model = self.collectionViewModel; + + if (![model hasItemForItemType:ItemTypeSearchBox + sectionIdentifier:SectionIdentifierSearchPasswordsBox]) { + return; + } + NSIndexPath* itemPath = + [model indexPathForItemType:ItemTypeSearchBox + sectionIdentifier:SectionIdentifierSearchPasswordsBox]; + SettingsSearchItem* searchItem = + base::mac::ObjCCastStrict<SettingsSearchItem>( + [model itemAtIndexPath:itemPath]); + [searchItem setEnabled:enabled]; + [self reconfigureCellsForItems:@[ searchItem ]]; +} + #pragma mark - Testing - (void)setReauthenticationModuleForExporter:
diff --git a/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm index 5ee606d..d4f54ff 100644 --- a/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm
@@ -20,6 +20,7 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_metrics.h" #include "components/strings/grit/components_strings.h" +#include "components/unified_consent/feature.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/experimental_flags.h" @@ -64,7 +65,6 @@ #import "ios/chrome/browser/ui/signin_interaction/public/signin_presenter.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/browser/voice/speech_input_locale_config.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" @@ -404,7 +404,7 @@ [model addItem:[self accountCellItem] toSectionWithIdentifier:SectionIdentifierAccount]; } - if (IsUnifiedConsentFeatureEnabled()) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { if (![model hasSectionForSectionIdentifier:SectionIdentifierAccount]) { // Add the Account section for the Google services cell, if the user is // signed-out. @@ -454,7 +454,7 @@ toSectionWithIdentifier:SectionIdentifierAdvanced]; [model addItem:[self contentSettingsDetailItem] toSectionWithIdentifier:SectionIdentifierAdvanced]; - if (!IsUnifiedConsentFeatureEnabled()) { + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) { // When unified consent flag is enabled, the bandwidth settings is available // under the Google services and sync settings. [model addItem:[self bandwidthManagementDetailItem]
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm index 6857ebc..ea4072f 100644 --- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
@@ -12,13 +12,13 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/browser/ui/settings/bar_button_activity_indicator.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/chrome/browser/ui/settings/settings_utils.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #import "ios/third_party/material_components_ios/src/components/Collections/src/MaterialCollections.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm index d445e975..8f97ff9 100644 --- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
@@ -14,6 +14,7 @@ #include "components/strings/grit/components_strings.h" #include "components/sync_preferences/pref_service_mock_factory.h" #include "components/sync_preferences/pref_service_syncable.h" +#include "components/unified_consent/feature.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" @@ -29,7 +30,6 @@ #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h" #import "ios/chrome/browser/ui/settings/cells/text_and_error_item.h" #import "ios/chrome/browser/ui/settings/sync_utils/sync_util.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/grit/ios_strings.h" #include "ios/web/public/test/test_web_thread_bundle.h" #import "testing/gtest_mac.h"
diff --git a/ios/chrome/browser/ui/signin_interaction/BUILD.gn b/ios/chrome/browser/ui/signin_interaction/BUILD.gn index b9f40d7..ba2b5d8 100644 --- a/ios/chrome/browser/ui/signin_interaction/BUILD.gn +++ b/ios/chrome/browser/ui/signin_interaction/BUILD.gn
@@ -13,6 +13,7 @@ ] deps = [ "//base", + "//components//unified_consent", "//components/prefs", "//components/signin/core/browser", "//ios/chrome/browser", @@ -22,7 +23,6 @@ "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/unified_consent", - "//ios/chrome/browser/unified_consent:feature", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/signin", ]
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.mm index 6071553b..97eaeab 100644 --- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.mm +++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.mm
@@ -11,6 +11,7 @@ #include "components/signin/core/browser/profile_management_switches.h" #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_pref_names.h" +#include "components/unified_consent/feature.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/signin/authentication_service.h" #include "ios/chrome/browser/signin/authentication_service_factory.h" @@ -19,7 +20,6 @@ #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/chrome_signin_view_controller.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_presenting.h" -#include "ios/chrome/browser/unified_consent/feature.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity_interaction_manager.h" @@ -107,7 +107,7 @@ completionCallback_ = [completion copy]; ios::ChromeIdentityService* identityService = ios::GetChromeBrowserProvider()->GetChromeIdentityService(); - if (IsUnifiedConsentFeatureEnabled()) { + if (unified_consent::IsUnifiedConsentFeatureEnabled()) { [self showSigninViewControllerWithIdentity:identity identityAdded:NO]; } else if (identity) { DCHECK(identityService->IsValidIdentity(identity));
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_empty_state_view.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_empty_state_view.mm index d4b38df..13b36de 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_empty_state_view.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_empty_state_view.mm
@@ -76,16 +76,15 @@ bottomLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:bottomLabel]; [NSLayoutConstraint activateConstraints:@[ + [topLabel.topAnchor constraintEqualToAnchor:self.topAnchor], [topLabel.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], [topLabel.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], [topLabel.bottomAnchor - constraintEqualToAnchor:self.centerYAnchor - constant:-kTabGridEmptyStateVerticalMargin / 2.0f], - [bottomLabel.topAnchor - constraintEqualToAnchor:self.centerYAnchor - constant:kTabGridEmptyStateVerticalMargin / 2.0f], + constraintEqualToAnchor:bottomLabel.topAnchor + constant:-kTabGridEmptyStateVerticalMargin], [bottomLabel.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], [bottomLabel.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], + [bottomLabel.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], ]]; }
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm index 7defdbf24..8b7deb17 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -251,13 +251,9 @@ // current page value. self.currentPage = _currentPage; [self configureViewControllerForCurrentSizeClassesAndPage]; + [self setInsetForRemoteTabs]; }; - auto completion = - ^(id<UIViewControllerTransitionCoordinatorContext> context) { - // Modify Remote Tabs Insets when page appears and during rotation. - [self setInsetForRemoteTabs]; - }; - [coordinator animateAlongsideTransition:animate completion:completion]; + [coordinator animateAlongsideTransition:animate completion:nil]; } - (UIStatusBarStyle)preferredStatusBarStyle {
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h index 242ffe00..eb900a8 100644 --- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h +++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h
@@ -71,6 +71,10 @@ (NSAttributedString*)attributedMessage image:(UIImage*)image; +// Updates the accessibility label of the UILabel displaying the empty table +// view message to |newLabel|. +- (void)updateEmptyTableViewMessageAccessibilityLabel:(NSString*)newLabel; + // Removes the empty table view, if one is present. - (void)removeEmptyTableView;
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm index 8eecae8..139d1c83 100644 --- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm +++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h" #include "base/logging.h" +#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" #import "ios/chrome/browser/ui/material_components/utils.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_header_footer_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_item.h" @@ -13,7 +14,6 @@ #import "ios/chrome/browser/ui/table_view/table_view_loading_view.h" #import "ios/chrome/browser/ui/table_view/table_view_model.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" -#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -40,8 +40,7 @@ _styler = [[ChromeTableViewStyler alloc] init]; if (appBarStyle == ChromeTableViewControllerStyleWithAppBar) { - _appBarViewController = [[MDCAppBarViewController alloc] init]; - [self addChildViewController:_appBarViewController]; + _appBarViewController = [[ChromeAppBarViewController alloc] init]; } } return self; @@ -86,6 +85,7 @@ ConfigureAppBarViewControllerWithCardStyle(self.appBarViewController); self.appBarViewController.headerView.trackingScrollView = self.tableView; // Add the AppBar's views after all other views have been registered. + [self addChildViewController:_appBarViewController]; [self.view addSubview:self.appBarViewController.view]; [self.appBarViewController didMoveToParentViewController:self]; } @@ -132,6 +132,10 @@ image:image]; } +- (void)updateEmptyTableViewMessageAccessibilityLabel:(NSString*)newLabel { + self.emptyView.messageAccessibilityLabel = newLabel; +} + - (void)removeEmptyTableView { if (self.emptyView) { // Check that the tableView.backgroundView hasn't been modified
diff --git a/ios/chrome/browser/ui/table_view/table_view_empty_view.h b/ios/chrome/browser/ui/table_view/table_view_empty_view.h index 734633d..c953a42 100644 --- a/ios/chrome/browser/ui/table_view/table_view_empty_view.h +++ b/ios/chrome/browser/ui/table_view/table_view_empty_view.h
@@ -24,6 +24,10 @@ - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE; - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; +// The accessibility label to use for the message label. Default value is the +// message iteself. +@property(nonatomic, strong) NSString* messageAccessibilityLabel; + // The empty view's accessibility identifier. + (NSString*)accessibilityIdentifier;
diff --git a/ios/chrome/browser/ui/table_view/table_view_empty_view.mm b/ios/chrome/browser/ui/table_view/table_view_empty_view.mm index 0891992..38c6891 100644 --- a/ios/chrome/browser/ui/table_view/table_view_empty_view.mm +++ b/ios/chrome/browser/ui/table_view/table_view_empty_view.mm
@@ -31,14 +31,16 @@ } @interface TableViewEmptyView () -// The message that will be displayed. +// The message that will be displayed and the label that will display it. @property(nonatomic, copy) NSAttributedString* message; +@property(nonatomic, strong) UILabel* messageLabel; // The image that will be displayed. @property(nonatomic, strong) UIImage* image; @end @implementation TableViewEmptyView @synthesize message = _message; +@synthesize messageLabel = _messageLabel; @synthesize image = _image; - (instancetype)initWithFrame:(CGRect)frame @@ -63,6 +65,18 @@ return self; } +#pragma mark - Accessors + +- (NSString*)messageAccessibilityLabel { + return self.messageLabel.accessibilityLabel; +} + +- (void)setMessageAccessibilityLabel:(NSString*)label { + if ([self.messageAccessibilityLabel isEqualToString:label]) + return; + self.messageLabel.accessibilityLabel = label; +} + #pragma mark - Public + (NSString*)accessibilityIdentifier { @@ -83,6 +97,8 @@ UILabel* messageLabel = [[UILabel alloc] init]; messageLabel.numberOfLines = 0; messageLabel.attributedText = self.message; + messageLabel.accessibilityLabel = self.message.string; + self.messageLabel = messageLabel; // Vertical stack view that holds the image and message. UIStackView* verticalStack = [[UIStackView alloc]
diff --git a/ios/chrome/browser/ui/tabs/BUILD.gn b/ios/chrome/browser/ui/tabs/BUILD.gn index 9685745..665bec3 100644 --- a/ios/chrome/browser/ui/tabs/BUILD.gn +++ b/ios/chrome/browser/ui/tabs/BUILD.gn
@@ -43,13 +43,9 @@ "resources:tabstrip_new_tab_legacy", "resources:tabstrip_new_tab_pressed", "resources:tabstrip_new_tab_pressed_legacy", - "resources:tabstrip_tab_close", - "resources:tabstrip_tab_close_incognito", "resources:tabstrip_tab_close_incognito_legacy", - "resources:tabstrip_tab_close_incognito_pressed", "resources:tabstrip_tab_close_incognito_pressed_legacy", "resources:tabstrip_tab_close_legacy", - "resources:tabstrip_tab_close_pressed", "resources:tabstrip_tab_close_pressed_legacy", "resources:tabstrip_toggle_button_gradient", "//base", @@ -69,10 +65,12 @@ "//ios/chrome/browser/ui/fullscreen", "//ios/chrome/browser/ui/image_util", "//ios/chrome/browser/ui/popup_menu/public", + "//ios/chrome/browser/ui/tab_grid/grid/resources:grid_cell_close_button", "//ios/chrome/browser/ui/tabs/requirements", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/web_state_list", "//ios/chrome/common", + "//ios/chrome/common:common_extension", "//ios/third_party/material_components_ios", "//ios/web", "//third_party/google_toolbox_for_mac",
diff --git a/ios/chrome/browser/ui/tabs/resources/BUILD.gn b/ios/chrome/browser/ui/tabs/resources/BUILD.gn index e76f2e6..7ea8180 100644 --- a/ios/chrome/browser/ui/tabs/resources/BUILD.gn +++ b/ios/chrome/browser/ui/tabs/resources/BUILD.gn
@@ -141,38 +141,6 @@ ] } -imageset("tabstrip_tab_close") { - sources = [ - "tabstrip_tab_close.imageset/Contents.json", - "tabstrip_tab_close.imageset/tabstrip_tab_close@2x~ipad.png", - "tabstrip_tab_close.imageset/tabstrip_tab_close~ipad.png", - ] -} - -imageset("tabstrip_tab_close_incognito") { - sources = [ - "tabstrip_tab_close_incognito.imageset/Contents.json", - "tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito@2x~ipad.png", - "tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito~ipad.png", - ] -} - -imageset("tabstrip_tab_close_incognito_pressed") { - sources = [ - "tabstrip_tab_close_incognito_pressed.imageset/Contents.json", - "tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed@2x~ipad.png", - "tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed~ipad.png", - ] -} - -imageset("tabstrip_tab_close_pressed") { - sources = [ - "tabstrip_tab_close_pressed.imageset/Contents.json", - "tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed@2x~ipad.png", - "tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed~ipad.png", - ] -} - imageset("tabstrip_tab_close_legacy") { sources = [ "tabstrip_tab_close_legacy.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/Contents.json b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/Contents.json deleted file mode 100644 index ee084f7e..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "ipad", - "scale": "2x", - "filename": "tabstrip_tab_close@2x~ipad.png" - }, - { - "idiom": "ipad", - "scale": "1x", - "filename": "tabstrip_tab_close~ipad.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close@2x~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close@2x~ipad.png deleted file mode 100644 index e8e8e29..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close@2x~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close~ipad.png deleted file mode 100644 index 020fe3b4..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close.imageset/tabstrip_tab_close~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/Contents.json b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/Contents.json deleted file mode 100644 index 50331861..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "ipad", - "scale": "2x", - "filename": "tabstrip_tab_close_incognito@2x~ipad.png" - }, - { - "idiom": "ipad", - "scale": "1x", - "filename": "tabstrip_tab_close_incognito~ipad.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito@2x~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito@2x~ipad.png deleted file mode 100644 index 08a3bd1..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito@2x~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito~ipad.png deleted file mode 100644 index c33a3d3e6..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito.imageset/tabstrip_tab_close_incognito~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/Contents.json b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/Contents.json deleted file mode 100644 index 3276afd..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "ipad", - "scale": "2x", - "filename": "tabstrip_tab_close_incognito_pressed@2x~ipad.png" - }, - { - "idiom": "ipad", - "scale": "1x", - "filename": "tabstrip_tab_close_incognito_pressed~ipad.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed@2x~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed@2x~ipad.png deleted file mode 100644 index dd5130f..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed@2x~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed~ipad.png deleted file mode 100644 index 61a3fad..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_incognito_pressed.imageset/tabstrip_tab_close_incognito_pressed~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/Contents.json b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/Contents.json deleted file mode 100644 index 359c0694..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "ipad", - "scale": "2x", - "filename": "tabstrip_tab_close_pressed@2x~ipad.png" - }, - { - "idiom": "ipad", - "scale": "1x", - "filename": "tabstrip_tab_close_pressed~ipad.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed@2x~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed@2x~ipad.png deleted file mode 100644 index e337356..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed@2x~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed~ipad.png b/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed~ipad.png deleted file mode 100644 index 8a76f6d..0000000 --- a/ios/chrome/browser/ui/tabs/resources/tabstrip_tab_close_pressed.imageset/tabstrip_tab_close_pressed~ipad.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm index f14857f..353f79f 100644 --- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm +++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -1092,6 +1092,8 @@ if (IsUIRefreshPhase1Enabled()) { [_tabSwitcherButton setTitle:TextForTabCount(model.count) forState:UIControlStateNormal]; + [_tabSwitcherButton + setAccessibilityValue:[NSString stringWithFormat:@"%zd", model.count]]; } }
diff --git a/ios/chrome/browser/ui/tabs/tab_view.mm b/ios/chrome/browser/ui/tabs/tab_view.mm index 7c26df3..1e65733 100644 --- a/ios/chrome/browser/ui/tabs/tab_view.mm +++ b/ios/chrome/browser/ui/tabs/tab_view.mm
@@ -17,6 +17,8 @@ #import "ios/chrome/browser/ui/image_util/image_util.h" #include "ios/chrome/browser/ui/rtl_geometry.h" #include "ios/chrome/browser/ui/ui_util.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" +#import "ios/chrome/common/highlight_button.h" #import "ios/chrome/common/ui_util/constraints_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h" @@ -53,6 +55,9 @@ const CGFloat kCloseButtonSize = 24.0; const CGFloat kFaviconSize = 16.0; + +const int kTabCloseTint = 0x3C4043; +const int kTabCloseTintIncognito = 0xFFFFFF; } @interface TabView ()<DropAndNavigateDelegate> { @@ -167,7 +172,7 @@ // tab_view is not an an accessible element, and making it one would add // several complicated layers to UIA. Instead, simply set active/inactive // here to be used by UIA. - [_closeButton setAccessibilityValue:(selected ? @"active" : @"inactive")]; + [_titleLabel setAccessibilityValue:(selected ? @"active" : @"inactive")]; } - (void)setCollapsed:(BOOL)collapsed { @@ -187,6 +192,7 @@ [_titleLabel setTruncateMode:GTMFadeTruncatingTail]; } _titleLabel.text = title; + [_closeButton setAccessibilityValue:title]; } - (UIImage*)favicon { @@ -289,12 +295,8 @@ } - (void)createButtonsAndLabel { - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _closeButton = [HighlightButton buttonWithType:UIButtonTypeCustom]; [_closeButton setTranslatesAutoresizingMaskIntoConstraints:NO]; - [_closeButton setImage:[UIImage imageNamed:@"tabstrip_tab_close"] - forState:UIControlStateNormal]; - [_closeButton setImage:[UIImage imageNamed:@"tabstrip_tab_close_pressed"] - forState:UIControlStateHighlighted]; [_closeButton setContentEdgeInsets:UIEdgeInsetsMake(kTabCloseTopInset, kTabCloseLeftInset, kTabCloseBottomInset, @@ -396,16 +398,26 @@ } - (void)updateCloseButtonImages { - NSString* refresh = (IsUIRefreshPhase1Enabled() ? @"" : @"_legacy"); - NSString* incognito = self.incognitoStyle ? @"_incognito" : @""; - UIImage* normalImage = - [UIImage imageNamed:[NSString stringWithFormat:@"tabstrip_tab_close%@%@", - incognito, refresh]]; - UIImage* pressedImage = [UIImage - imageNamed:[NSString stringWithFormat:@"tabstrip_tab_close%@_pressed%@", - incognito, refresh]]; - [_closeButton setImage:normalImage forState:UIControlStateNormal]; - [_closeButton setImage:pressedImage forState:UIControlStateHighlighted]; + if (IsUIRefreshPhase1Enabled()) { + [_closeButton + setImage:[[UIImage imageNamed:@"grid_cell_close_button"] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] + forState:UIControlStateNormal]; + _closeButton.tintColor = _incognitoStyle + ? UIColorFromRGB(kTabCloseTintIncognito) + : UIColorFromRGB(kTabCloseTint); + } else { + NSString* incognito = self.incognitoStyle ? @"_incognito" : @""; + UIImage* normalImage = [UIImage + imageNamed:[NSString stringWithFormat:@"tabstrip_tab_close%@_legacy", + incognito]]; + UIImage* pressedImage = [UIImage + imageNamed:[NSString + stringWithFormat:@"tabstrip_tab_close%@_pressed_legacy", + incognito]]; + [_closeButton setImage:normalImage forState:UIControlStateNormal]; + [_closeButton setImage:pressedImage forState:UIControlStateHighlighted]; + } } - (UIImage*)defaultFaviconImage {
diff --git a/ios/chrome/browser/unified_consent/BUILD.gn b/ios/chrome/browser/unified_consent/BUILD.gn index 9777660..37f1254 100644 --- a/ios/chrome/browser/unified_consent/BUILD.gn +++ b/ios/chrome/browser/unified_consent/BUILD.gn
@@ -11,7 +11,6 @@ "unified_consent_service_factory.h", ] deps = [ - ":feature", "//components/browser_sync", "//components/keyed_service/ios", "//components/metrics", @@ -24,14 +23,3 @@ "//ios/chrome/browser/sync", ] } - -source_set("feature") { - configs += [ "//build/config/compiler:enable_arc" ] - sources = [ - "feature.cc", - "feature.h", - ] - deps = [ - "//components/unified_consent", - ] -}
diff --git a/ios/chrome/browser/unified_consent/feature.cc b/ios/chrome/browser/unified_consent/feature.cc deleted file mode 100644 index 3932b37..0000000 --- a/ios/chrome/browser/unified_consent/feature.cc +++ /dev/null
@@ -1,21 +0,0 @@ -// 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 "ios/chrome/browser/unified_consent/feature.h" - -#include "components/unified_consent/feature.h" - -bool IsUnifiedConsentFeatureEnabled() { - unified_consent::UnifiedConsentFeatureState feature_state = - unified_consent::internal::GetUnifiedConsentFeatureState(); - return feature_state != - unified_consent::UnifiedConsentFeatureState::kDisabled; -} - -bool IsUnifiedConsentFeatureWithBumpEnabled() { - unified_consent::UnifiedConsentFeatureState feature_state = - unified_consent::internal::GetUnifiedConsentFeatureState(); - return feature_state == - unified_consent::UnifiedConsentFeatureState::kEnabledWithBump; -}
diff --git a/ios/chrome/browser/unified_consent/feature.h b/ios/chrome/browser/unified_consent/feature.h deleted file mode 100644 index b5d0f02..0000000 --- a/ios/chrome/browser/unified_consent/feature.h +++ /dev/null
@@ -1,17 +0,0 @@ -// 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_UNIFIED_CONSENT_FEATURE_H_ -#define IOS_CHROME_BROWSER_UNIFIED_CONSENT_FEATURE_H_ - -// Returns true if the unified consent feature state is kEnabledNoBump or -// kEnabledWithBump. Note that the bump may not be enabled, even if this returns -// true. To check if the bump is enabled, use -// IsUnifiedConsentFeatureWithBumpEnabled(). -bool IsUnifiedConsentFeatureEnabled(); - -// Returns true if the unified consent feature state is kEnabledWithBump. -bool IsUnifiedConsentFeatureWithBumpEnabled(); - -#endif // IOS_CHROME_BROWSER_UNIFIED_CONSENT_FEATURE_H_
diff --git a/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc b/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc index f8f5c5a..7d61c9b8 100644 --- a/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc +++ b/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc
@@ -7,12 +7,12 @@ #include "components/browser_sync/profile_sync_service.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/sync/driver/sync_service.h" +#include "components/unified_consent/feature.h" #include "components/unified_consent/unified_consent_service.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/signin/identity_manager_factory.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" -#include "ios/chrome/browser/unified_consent/feature.h" #include "ios/chrome/browser/unified_consent/unified_consent_service_client_impl.h" UnifiedConsentServiceFactory::UnifiedConsentServiceFactory() @@ -49,7 +49,7 @@ std::unique_ptr<KeyedService> UnifiedConsentServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - if (!IsUnifiedConsentFeatureEnabled()) + if (!unified_consent::IsUnifiedConsentFeatureEnabled()) return nullptr; ios::ChromeBrowserState* browser_state =
diff --git a/ios/chrome/browser/variations/ios_chrome_variations_service_client.cc b/ios/chrome/browser/variations/ios_chrome_variations_service_client.cc index 84a3c1e4..b4fe151 100644 --- a/ios/chrome/browser/variations/ios_chrome_variations_service_client.cc +++ b/ios/chrome/browser/variations/ios_chrome_variations_service_client.cc
@@ -27,6 +27,10 @@ IOSChromeVariationsServiceClient::~IOSChromeVariationsServiceClient() {} +std::string IOSChromeVariationsServiceClient::GetApplicationLocale() { + return GetApplicationContext()->GetApplicationLocale(); +} + base::Callback<base::Version()> IOSChromeVariationsServiceClient::GetVersionForSimulationCallback() { return base::Bind(&GetVersionForSimulation);
diff --git a/ios/chrome/browser/variations/ios_chrome_variations_service_client.h b/ios/chrome/browser/variations/ios_chrome_variations_service_client.h index a221a7f..61ecb2e 100644 --- a/ios/chrome/browser/variations/ios_chrome_variations_service_client.h +++ b/ios/chrome/browser/variations/ios_chrome_variations_service_client.h
@@ -23,6 +23,7 @@ private: // variations::VariationsServiceClient implementation. + std::string GetApplicationLocale() override; base::Callback<base::Version()> GetVersionForSimulationCallback() override; scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; network_time::NetworkTimeTracker* GetNetworkTimeTracker() override;
diff --git a/ios/web/public/app/mojo/web_browser_manifest.json b/ios/web/public/app/mojo/web_browser_manifest.json index 2662373..1dc73c6 100644 --- a/ios/web/public/app/mojo/web_browser_manifest.json +++ b/ios/web/public/app/mojo/web_browser_manifest.json
@@ -1,6 +1,7 @@ { "name": "web_browser", "display_name": "Web", + "options": { "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { "provides": { @@ -13,8 +14,7 @@ "service_manager": [ "service_manager:client_process", "service_manager:instance_name", - "service_manager:service_manager", - "service_manager:user_id" + "service_manager:service_manager" ] } }
diff --git a/ios/web/public/app/mojo/web_packaged_services_manifest.json b/ios/web/public/app/mojo/web_packaged_services_manifest.json index 9b77052..6a01cba 100644 --- a/ios/web/public/app/mojo/web_packaged_services_manifest.json +++ b/ios/web/public/app/mojo/web_packaged_services_manifest.json
@@ -9,7 +9,8 @@ "name": "web_packaged_services", "display_name": "Web Packaged Services", "options" : { - "instance_sharing" : "shared_instance_across_users" + "instance_sharing" : "shared_instance_across_users", + "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { @@ -21,8 +22,7 @@ "requires": { "web_browser": [], "service_manager": [ - "service_manager:client_process", - "service_manager:user_id" + "service_manager:client_process" ] } }
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm index 721b4a95..be0c728 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -345,7 +345,7 @@ #pragma mark - CRWWebStateObserver - (void)webState:(web::WebState*)webState - registeredFormActivity:(const web::FormActivityParams&)params { + didRegisterFormActivity:(const web::FormActivityParams&)params { DCHECK_EQ(_webState, webState); [_JSSuggestionManager inject]; @@ -389,7 +389,7 @@ } - (void)webState:(web::WebState*)webState - submittedDocumentWithFormNamed:(const std::string&)formName + didSubmitDocumentWithFormNamed:(const std::string&)formName hasUserGesture:(BOOL)userInitiated formInMainFrame:(BOOL)isMainFrame { if ([_delegate respondsToSelector:@selector
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm index ab1a9ba2f..d9ed27d 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm
@@ -214,7 +214,7 @@ params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); params.value = base::SysNSStringToUTF8(kTestFieldValue); params.type = "focus"; - test_form_activity_tab_helper_->OnFormActivity(params); + test_form_activity_tab_helper_->FormActivityRegistered(params); [delegate verify]; } @@ -241,7 +241,7 @@ params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); params.value = base::SysNSStringToUTF8(kTestFieldValue); params.type = "input"; - test_form_activity_tab_helper_->OnFormActivity(params); + test_form_activity_tab_helper_->FormActivityRegistered(params); [delegate verify]; } @@ -267,7 +267,7 @@ params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); params.value = base::SysNSStringToUTF8(kTestFieldValue); params.type = "blur"; - test_form_activity_tab_helper_->OnFormActivity(params); + test_form_activity_tab_helper_->FormActivityRegistered(params); [delegate verify]; } @@ -286,7 +286,7 @@ userInitiated:YES isMainFrame:YES]; - test_form_activity_tab_helper_->OnDocumentSubmitted( + test_form_activity_tab_helper_->DocumentSubmitted( base::SysNSStringToUTF8(kTestFormName), /*user_initiated=*/true, /*is_main_frame=*/true); @@ -296,7 +296,7 @@ userInitiated:NO isMainFrame:YES]; - test_form_activity_tab_helper_->OnDocumentSubmitted( + test_form_activity_tab_helper_->DocumentSubmitted( base::SysNSStringToUTF8(kTestFormName), /*user_initiated=*/false, /*is_main_frame=*/true);
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h index fdec95ff..e71532a 100644 --- a/ios/web_view/public/cwv_web_view.h +++ b/ios/web_view/public/cwv_web_view.h
@@ -135,6 +135,32 @@ // Evaluates a JavaScript string. // The completion handler is invoked when script evaluation completes. +// +// Note that |javaScriptString| is wrapped with: +// if (<implementation defined>) { ... } +// before evaluation, which causes some tricky side effect when you use |let| or +// |const| in the script. +// +// 1. Variables defined with |let| or |const| at the top level of the script +// do NOT become a global variable. i.e., It is accessible neither from +// scripts in the page nor another call to +// -evaluateJavaScript:completionHandler:. Variables defined with |var| +// DOES become a global variable. +// +// 2. Variables defined with |let| or |const| at the top level are not +// accessible from top level functions, even in the same script. Variable +// defined with |var| doesn't have this issue either. e.g., evaluation of +// this script causes an error: +// +// let a = 3; +// function f() { +// console.log(a); // ReferenceError: Can't find variable: a +// } +// f(); +// +// To workaround the issue, you can use |var| instead, or an explicit reference +// to window.xxx. This is because |let| and |const| are scoped by braces while +// |var| isn't, and due to tricky behavior of WebKit in non-strict mode. - (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void (^)(id, NSError*))completionHandler;
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc index eb6023a..0f6f54f80 100644 --- a/ipc/ipc_message_utils.cc +++ b/ipc/ipc_message_utils.cc
@@ -1005,7 +1005,10 @@ void ParamTraits<base::subtle::PlatformSharedMemoryRegion>::Log( const param_type& p, std::string* l) { -#if defined(OS_FUCHSIA) || defined(OS_WIN) +#if defined(OS_FUCHSIA) + l->append("Handle: "); + LogParam(p.GetPlatformHandle()->get(), l); +#elif defined(OS_WIN) l->append("Handle: "); LogParam(p.GetPlatformHandle(), l); #elif defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc index 2d7ad33..ceb8c6e 100644 --- a/media/audio/mac/audio_low_latency_input_mac.cc +++ b/media/audio/mac/audio_low_latency_input_mac.cc
@@ -19,6 +19,7 @@ #include "base/mac/scoped_mach_port.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/strcat.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "base/sys_info.h" @@ -302,6 +303,9 @@ AudioManagerMac::HardwareSampleRateForDevice(input_device_id_); DCHECK_EQ(sample_rate, format_.mSampleRate); + log_callback_.Run(base::StrCat( + {"AU in: Open using ", use_voice_processing_ ? "VPAU" : "AUHAL"})); + const bool success = use_voice_processing_ ? OpenVoiceProcessingAU() : OpenAUHAL();
diff --git a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java index be077e27..2189f27 100644 --- a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java +++ b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java
@@ -71,7 +71,7 @@ private int mLeftSize; class WorkerThread extends Thread { - private volatile boolean mDone = false; + private volatile boolean mDone; public void finish() { mDone = true;
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java b/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java index d0b6e06..36f3df2 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java
@@ -26,7 +26,7 @@ // Output buffers mapping with MediaCodec output buffers for the possible frame-merging. private SparseArray<ByteBuffer> mOutputBuffers = new SparseArray<>(); // SPS and PPS NALs (Config frame). - private ByteBuffer mConfigData = null; + private ByteBuffer mConfigData; protected MediaCodecEncoder(MediaCodec mediaCodec, BitrateAdjuster bitrateAdjuster) { super(mediaCodec, bitrateAdjuster, false);
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java index 72d8d3dd..9dd4ff0 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -104,7 +104,7 @@ private MediaCodecInfo[] mCodecList; private class CodecInfoIterator implements Iterator<MediaCodecInfo> { - private int mPosition = 0; + private int mPosition; @Override public boolean hasNext() {
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java index 05e8db9..f665c60fb 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -105,9 +105,9 @@ private boolean mProvisioningPending; // Boolean to track if 'ORIGIN' is set in MediaDrm. - private boolean mOriginSet = false; + private boolean mOriginSet; - private SessionEventDeferrer mSessionEventDeferrer = null; + private SessionEventDeferrer mSessionEventDeferrer; // Defer the creation of MediaCryptor creation. Only used when mRequiresMediaCrypto is true. private static final MediaCryptoDeferrer sMediaCryptoDeferrer = new MediaCryptoDeferrer();
diff --git a/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java b/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java index 344d148..5b2818ba2 100644 --- a/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java +++ b/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java
@@ -48,7 +48,7 @@ ByteBuffer.allocate(8).putLong(80000000).array(); private static class MockHdrMetadata extends HdrMetadata { - public boolean was_called = false; + public boolean was_called; @Override public void addMetadataToFormat(MediaFormat format) {
diff --git a/media/base/unaligned_shared_memory.cc b/media/base/unaligned_shared_memory.cc index 1386d34..315e209 100644 --- a/media/base/unaligned_shared_memory.cc +++ b/media/base/unaligned_shared_memory.cc
@@ -113,10 +113,7 @@ size_t size, off_t offset) : WritableUnalignedMapping( - mojo::UnwrapUnsafeSharedMemoryRegion(mojo::WrapSharedMemoryHandle( - handle, - handle.GetSize(), - mojo::UnwrappedSharedMemoryHandleProtection::kReadWrite)), + base::UnsafeSharedMemoryRegion::CreateFromHandle(handle), size, offset) {}
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index a5637d7..46a00b44 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -970,8 +970,36 @@ return nullptr; } - scoped_refptr<VideoFrame> frame = new VideoFrame( - format, storage_type, coded_size, visible_rect, natural_size, timestamp); + scoped_refptr<VideoFrame> frame; + switch (NumPlanes(format)) { + case 1: + frame = new VideoFrame( + VideoFrameLayout(format, coded_size, + {RowBytes(kYPlane, format, coded_size.width())}), + storage_type, visible_rect, natural_size, timestamp); + frame->data_[kYPlane] = data; + break; + case 3: + DCHECK_EQ(format, PIXEL_FORMAT_I420); + // TODO(miu): This always rounds widths down, whereas + // VideoFrame::RowBytes() always rounds up. This inconsistency must be + // resolved. Perhaps a CommonAlignment() check should be made in + // IsValidConfig()? + // http://crbug.com/555909 + frame = new VideoFrame( + VideoFrameLayout(format, coded_size, + {RowBytes(kYPlane, format, coded_size.width()), + coded_size.width() / 2, coded_size.width() / 2}), + storage_type, visible_rect, natural_size, timestamp); + frame->data_[kYPlane] = data; + frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); + frame->data_[kUPlane] = data + coded_size.GetArea(); + break; + default: + DLOG(ERROR) << "Invalid number of planes: " << NumPlanes(format) + << " in format: " << VideoPixelFormatToString(format); + return nullptr; + } if (storage_type == STORAGE_SHMEM) { if (read_only_region || unsafe_region) { @@ -992,32 +1020,7 @@ frame->shared_memory_offset_ = data_offset; } } - - switch (NumPlanes(format)) { - case 1: - frame->data_[kYPlane] = data; - frame->layout_.set_strides( - {RowBytes(kYPlane, format, coded_size.width())}); - return frame; - case 3: - DCHECK_EQ(format, PIXEL_FORMAT_I420); - // TODO(miu): This always rounds widths down, whereas - // VideoFrame::RowBytes() always rounds up. This inconsistency must be - // resolved. Perhaps a CommonAlignment() check should be made in - // IsValidConfig()? - // http://crbug.com/555909 - frame->data_[kYPlane] = data; - frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); - frame->data_[kUPlane] = data + coded_size.GetArea(); - frame->layout_.set_strides({RowBytes(kYPlane, format, coded_size.width()), - coded_size.width() / 2, - coded_size.width() / 2}); - return frame; - default: - DLOG(ERROR) << "Invalid number of planes: " << NumPlanes(format) - << " in format: " << VideoPixelFormatToString(format); - return nullptr; - } + return frame; } VideoFrame::VideoFrame(const VideoFrameLayout& layout, @@ -1112,9 +1115,10 @@ // we can pad the requested |coded_size| if necessary if the request does not // line up on sample boundaries. See discussion at http://crrev.com/1240833003 const gfx::Size new_coded_size = DetermineAlignedSize(format, coded_size); - return CreateFrameWithLayout(VideoFrameLayout(format, new_coded_size), - visible_rect, natural_size, timestamp, - zero_initialize_memory); + return CreateFrameWithLayout( + VideoFrameLayout(format, new_coded_size, + ComputeStrides(format, coded_size)), + visible_rect, natural_size, timestamp, zero_initialize_memory); } scoped_refptr<VideoFrame> VideoFrame::CreateFrameWithLayout( @@ -1132,8 +1136,8 @@ return nullptr; } - scoped_refptr<VideoFrame> frame( - new VideoFrame(layout, storage, visible_rect, natural_size, timestamp)); + scoped_refptr<VideoFrame> frame(new VideoFrame( + std::move(layout), storage, visible_rect, natural_size, timestamp)); frame->AllocateMemory(zero_initialize_memory); return frame; } @@ -1210,7 +1214,6 @@ DCHECK_EQ(storage_type_, STORAGE_OWNED_MEMORY); static_assert(0 == kYPlane, "y plane data must be index 0"); - CalculateUnassignedStrides(); std::vector<size_t> plane_size = CalculatePlaneSize(); size_t total_buffer_size = layout_.GetTotalBufferSize(); // If caller does not provide buffer layout, it uses sum of calculated color @@ -1235,21 +1238,20 @@ } } -void VideoFrame::CalculateUnassignedStrides() { - // Note: strides() could be {0,0,0,0}, which is uninitialized. - if (!layout_.strides().empty() && stride(0) != 0) - return; - +// static +std::vector<int32_t> VideoFrame::ComputeStrides(VideoPixelFormat format, + const gfx::Size& coded_size) { std::vector<int32_t> strides; - const size_t num_planes = NumPlanes(format()); + const size_t num_planes = NumPlanes(format); if (num_planes == 1) { - strides.push_back(row_bytes(0)); + strides.push_back(RowBytes(0, format, coded_size.width())); } else { for (size_t plane = 0; plane < num_planes; ++plane) { - strides.push_back(RoundUp(row_bytes(plane), kFrameAddressAlignment)); + strides.push_back(RoundUp(RowBytes(plane, format, coded_size.width()), + kFrameAddressAlignment)); } } - layout_.set_strides(std::move(strides)); + return strides; } std::vector<size_t> VideoFrame::CalculatePlaneSize() const {
diff --git a/media/base/video_frame.h b/media/base/video_frame.h index 0cf015a3..3e691567 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h
@@ -130,7 +130,7 @@ // Creates a new frame in system memory with given parameters. Buffers for the // frame are allocated but not initialized. The caller should specify the - // physical buffer size in |layout| parameter. + // physical buffer size and strides if needed in |layout| parameter. static scoped_refptr<VideoFrame> CreateFrameWithLayout( const VideoFrameLayout& layout, const gfx::Rect& visible_rect, @@ -537,10 +537,6 @@ data_[plane] = ptr; } - void set_strides(std::vector<int32_t> strides) { - layout_.set_strides(std::move(strides)); - } - private: static scoped_refptr<VideoFrame> WrapExternalStorage( VideoPixelFormat format, @@ -574,13 +570,14 @@ // alignment for each individual plane. static gfx::Size CommonAlignment(VideoPixelFormat format); - void AllocateMemory(bool zero_initialize_memory); - // Calculates strides if unassigned. // For the case that plane stride is not assigned, i.e. 0, in the layout_ // object, it calculates strides for each plane based on frame format and // coded size then writes them back. - void CalculateUnassignedStrides(); + static std::vector<int32_t> ComputeStrides(VideoPixelFormat format, + const gfx::Size& coded_size); + + void AllocateMemory(bool zero_initialize_memory); // Calculates plane size. // It first considers buffer size layout_ object provides. If layout's @@ -592,7 +589,7 @@ std::vector<size_t> CalculatePlaneSize() const; // VideFrameLayout (includes format, coded_size, and strides). - VideoFrameLayout layout_; + const VideoFrameLayout layout_; // Storage type for the different planes. StorageType storage_type_; // TODO(mcasas): make const
diff --git a/media/base/video_frame_layout.h b/media/base/video_frame_layout.h index 7b0c413..a3cb70d8 100644 --- a/media/base/video_frame_layout.h +++ b/media/base/video_frame_layout.h
@@ -52,11 +52,6 @@ const std::vector<int32_t>& strides() const { return strides_; } const std::vector<size_t>& buffer_sizes() const { return buffer_sizes_; } - // Sets strides. - void set_strides(std::vector<int32_t> strides) { - strides_ = std::move(strides); - } - // Returns sum of bytes of all buffers. size_t GetTotalBufferSize() const;
diff --git a/media/base/video_frame_layout_unittest.cc b/media/base/video_frame_layout_unittest.cc index 356b987..f6fcf6f2 100644 --- a/media/base/video_frame_layout_unittest.cc +++ b/media/base/video_frame_layout_unittest.cc
@@ -145,17 +145,4 @@ "strides:[0, 0, 0, 0]"); } -TEST(VideoFrameLayout, SetStrideSize) { - gfx::Size coded_size = gfx::Size(320, 180); - VideoFrameLayout layout(PIXEL_FORMAT_NV12, coded_size); - - std::vector<int32_t> strides = {384, 192, 192}; - layout.set_strides(std::move(strides)); - - EXPECT_EQ(layout.ToString(), - "VideoFrameLayout format:PIXEL_FORMAT_NV12 coded_size:320x180 " - "num_buffers:4 buffer_sizes:[0, 0, 0, 0] num_strides:3 " - "strides:[384, 192, 192]"); -} - } // namespace media
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index fea6fb20..62ea0fc 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -3268,8 +3268,8 @@ } void WebMediaPlayerImpl::MaybeSetContainerName() { - // MSE does not provide container information. - if (chunk_demuxer_) + // MSE nor MediaPlayerRenderer provide container information. + if (chunk_demuxer_ || using_media_player_renderer_) return; // Pipeline startup failed before even getting a demuxer setup.
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java index 8f31c048..cbdbf46f 100644 --- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java +++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -858,7 +858,7 @@ private CameraCaptureSession mPreviewSession; private CaptureRequest mPreviewRequest; private CaptureRequest.Builder mPreviewRequestBuilder; - private ImageReader mImageReader = null; + private ImageReader mImageReader; // We create a dedicated HandlerThread for operating the camera on. This // is needed, because the camera APIs requires a Looper for posting // asynchronous callbacks to. The native thread that calls the constructor
diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc index b6ed2cd..35a9c569 100644 --- a/media/capture/video/win/video_capture_device_win.cc +++ b/media/capture/video/win/video_capture_device_win.cc
@@ -19,6 +19,7 @@ #include "base/win/scoped_variant.h" #include "media/base/media_switches.h" #include "media/base/timestamp_constants.h" +#include "media/capture/mojom/image_capture_types.h" #include "media/capture/video/blob_utils.h" #include "media/capture/video/win/metrics.h" #include "media/capture/video/win/video_capture_device_utils_win.h" @@ -653,7 +654,7 @@ return; } - auto photo_capabilities = mojom::PhotoState::New(); + auto photo_capabilities = mojo::CreateEmptyPhotoState(); photo_capabilities->exposure_compensation = RetrieveControlRangeAndCurrent( [this](auto... args) {
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index ab621515..568058c 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn
@@ -194,6 +194,8 @@ sources += [ "android/media_codec_audio_decoder.cc", "android/media_codec_audio_decoder.h", + "android/video_frame_extractor.cc", + "android/video_frame_extractor.h", ] deps += [ "//media/base/android" ] } @@ -279,6 +281,10 @@ "vp9_raw_bits_reader_unittest.cc", ] + if (is_android) { + sources += [ "android/video_frame_extractor_unittest.cc" ] + } + deps = [ "//base/test:test_support", "//media:test_support",
diff --git a/media/filters/android/video_frame_extractor.cc b/media/filters/android/video_frame_extractor.cc new file mode 100644 index 0000000..3c7b8bf --- /dev/null +++ b/media/filters/android/video_frame_extractor.cc
@@ -0,0 +1,141 @@ +// 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 "media/filters/android/video_frame_extractor.h" + +#include "base/android/build_info.h" +#include "base/bind.h" +#include "base/threading/thread.h" +#include "base/threading/thread_task_runner_handle.h" +#include "media/base/android/media_codec_bridge_impl.h" +#include "media/base/data_source.h" +#include "media/ffmpeg/ffmpeg_common.h" +#include "media/filters/blocking_url_protocol.h" +#include "media/filters/ffmpeg_bitstream_converter.h" +#include "media/filters/ffmpeg_demuxer.h" +#include "media/filters/ffmpeg_glue.h" + +#if BUILDFLAG(ENABLE_HEVC_DEMUXING) +#include "media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h" +#endif + +#if BUILDFLAG(USE_PROPRIETARY_CODECS) +#include "media/base/android/extract_sps_and_pps.h" +#include "media/filters/ffmpeg_aac_bitstream_converter.h" +#include "media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h" +#endif + +namespace media { + +VideoFrameExtractor::VideoFrameExtractor(DataSource* data_source) + : data_source_(data_source), video_stream_index_(-1), weak_factory_(this) {} + +VideoFrameExtractor::~VideoFrameExtractor() = default; + +void VideoFrameExtractor::Start(VideoFrameCallback video_frame_callback) { + video_frame_callback_ = std::move(video_frame_callback); + protocol_ = std::make_unique<BlockingUrlProtocol>( + data_source_, base::BindRepeating(&VideoFrameExtractor::OnError, + weak_factory_.GetWeakPtr())); + glue_ = std::make_unique<FFmpegGlue>(protocol_.get()); + + // This will gradually read media data through |data_source_|. + if (!glue_->OpenContext()) { + OnError(); + return; + } + + // Extract the video stream. + AVFormatContext* format_context = glue_->format_context(); + for (unsigned int i = 0; i < format_context->nb_streams; ++i) { + AVStream* stream = format_context->streams[i]; + if (!stream) + continue; + const AVCodecParameters* codec_parameters = stream->codecpar; + const AVMediaType codec_type = codec_parameters->codec_type; + + // Pick the first video stream. + if (codec_type == AVMEDIA_TYPE_VIDEO) { + video_stream_ = stream; + video_stream_index_ = i; + DCHECK_EQ(video_stream_index_, stream->index); + break; + } + } + + if (!video_stream_) { + OnError(); + return; + } + + // Get the config for decoding the video frame later. + if (!AVStreamToVideoDecoderConfig(video_stream_, &video_config_)) { + OnError(); + return; + } + + auto packet = ReadVideoFrame(); + ConvertPacket(packet.get()); + NotifyComplete( + std::vector<uint8_t>(packet->data, packet->data + packet->size), + video_config_); +} + +void VideoFrameExtractor::ConvertPacket(AVPacket* packet) { +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + DCHECK(video_stream_ && video_stream_->codecpar); + // TODO(xingliu): Create the bitstream converter in an utility function. This + // logic is shared with FFmpegDemuxer. + switch (video_stream_->codecpar->codec_id) { + case AV_CODEC_ID_H264: + video_config_.SetExtraData(std::vector<uint8_t>()); + bitstream_converter_.reset( + new FFmpegH264ToAnnexBBitstreamConverter(video_stream_->codecpar)); + break; +#if BUILDFLAG(ENABLE_HEVC_DEMUXING) + case AV_CODEC_ID_HEVC: + bitstream_converter_.reset( + new FFmpegH265ToAnnexBBitstreamConverter(video_stream_->codecpar)); + break; +#endif + case AV_CODEC_ID_AAC: + bitstream_converter_.reset( + new FFmpegAACBitstreamConverter(video_stream_->codecpar)); + break; + default: + break; + } + + bitstream_converter_->ConvertPacket(packet); +#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) +} + +ScopedAVPacket VideoFrameExtractor::ReadVideoFrame() { + AVFormatContext* format_context = glue_->format_context(); + ScopedAVPacket packet(new AVPacket()); + while (av_read_frame(format_context, packet.get()) >= 0) { + // Skip frames from streams other than video. + if (packet->stream_index != video_stream_index_) + continue; + + DCHECK(packet->flags & AV_PKT_FLAG_KEY); + return packet; + } + return nullptr; +} + +void VideoFrameExtractor::NotifyComplete(std::vector<uint8_t> encoded_frame, + const VideoDecoderConfig& config) { + // Return the encoded video key frame. + DCHECK(video_frame_callback_); + std::move(video_frame_callback_).Run(true, std::move(encoded_frame), config); +} + +void VideoFrameExtractor::OnError() { + DCHECK(video_frame_callback_); + std::move(video_frame_callback_) + .Run(false, std::vector<uint8_t>(), VideoDecoderConfig()); +} + +} // namespace media
diff --git a/media/filters/android/video_frame_extractor.h b/media/filters/android/video_frame_extractor.h new file mode 100644 index 0000000..21731394 --- /dev/null +++ b/media/filters/android/video_frame_extractor.h
@@ -0,0 +1,85 @@ +// 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 MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_ +#define MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_ + +#include <stdint.h> +#include <memory> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "media/base/media_export.h" +#include "media/filters/ffmpeg_demuxer.h" + +struct AVPacket; +struct AVStream; + +namespace media { + +class BlockingUrlProtocol; +class DataSource; +class FFmpegBitstreamConverter; +class FFmpegGlue; +class VideoDecoderConfig; + +// This class synchronously extracts a video key frame. Should be used in +// sandboxed process since the media data is user input. +// Work flow: +// 1. Demuxes one video frame with FFMPEG, into an AVPacket. +// 2. Adds the bitstream filter, so decoder can understand the input data. +// 3. Returns the encoded video key frame and the decoding configuration for +// later decoding. On Android, currently decoding needs to happen in privileged +// process to access low level graphic card driver on disk. +class MEDIA_EXPORT VideoFrameExtractor { + public: + using VideoFrameCallback = + base::OnceCallback<void(bool success, + const std::vector<uint8_t>& data, + const VideoDecoderConfig& decoder_config)>; + + explicit VideoFrameExtractor(DataSource* data_source); + ~VideoFrameExtractor(); + + // Starts to retrieve thumbnail from video frame. + void Start(VideoFrameCallback video_frame_callback); + + private: + // Reads one video frame from video stream. + ScopedAVPacket ReadVideoFrame(); + + // Converts the video frame to something that the decoder can understand. + void ConvertPacket(AVPacket* packet); + + // Called when video frame is successfully extracted. + void NotifyComplete(std::vector<uint8_t> encoded_frame, + const VideoDecoderConfig& config); + + // Called when error happens. + void OnError(); + + // Objects to read video data. + DataSource* data_source_; + std::unique_ptr<BlockingUrlProtocol> protocol_; + std::unique_ptr<FFmpegGlue> glue_; + + // FFMPEG related objects to prepare video frame to decode. + ScopedAVPacket packet_; + int video_stream_index_; + AVStream* video_stream_ = nullptr; + VideoDecoderConfig video_config_; + std::unique_ptr<FFmpegBitstreamConverter> bitstream_converter_; + + VideoFrameCallback video_frame_callback_; + + base::WeakPtrFactory<VideoFrameExtractor> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(VideoFrameExtractor); +}; + +} // namespace media + +#endif // MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_
diff --git a/media/filters/android/video_frame_extractor_unittest.cc b/media/filters/android/video_frame_extractor_unittest.cc new file mode 100644 index 0000000..ce7dc5bfc --- /dev/null +++ b/media/filters/android/video_frame_extractor_unittest.cc
@@ -0,0 +1,76 @@ +// 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 "media/filters/android/video_frame_extractor.h" + +#include <memory> + +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "base/test/test_mock_time_task_runner.h" +#include "media/base/test_data_util.h" +#include "media/filters/file_data_source.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { +namespace { + +struct ExtractVideoFrameResult { + bool success = false; + std::vector<uint8_t> encoded_frame; + VideoDecoderConfig decoder_config; +}; + +void OnThumbnailGenerated(ExtractVideoFrameResult* result, + base::RepeatingClosure quit_closure, + bool success, + const std::vector<uint8_t>& encoded_frame, + const VideoDecoderConfig& decoder_config) { + result->success = success; + result->encoded_frame = encoded_frame; + result->decoder_config = decoder_config; + + quit_closure.Run(); +} + +class VideoFrameExtractorTest : public testing::Test { + public: + VideoFrameExtractorTest() {} + ~VideoFrameExtractorTest() override {} + + protected: + void SetUp() override { + data_source_ = std::make_unique<FileDataSource>(); + + CHECK(data_source_->Initialize(GetTestDataFilePath("bear.mp4"))); + extractor_ = std::make_unique<VideoFrameExtractor>(data_source_.get()); + } + + void TearDown() override { extractor_.reset(); } + + VideoFrameExtractor* extractor() { return extractor_.get(); } + + private: + std::unique_ptr<FileDataSource> data_source_; + std::unique_ptr<VideoFrameExtractor> extractor_; + base::test::ScopedTaskEnvironment scoped_task_environment_; + + DISALLOW_COPY_AND_ASSIGN(VideoFrameExtractorTest); +}; + +// Verifies the encoded video frame is extracted correctly. +TEST_F(VideoFrameExtractorTest, ExtractVideoFrame) { + ExtractVideoFrameResult result; + base::RunLoop loop; + extractor()->Start( + base::BindOnce(&OnThumbnailGenerated, &result, loop.QuitClosure())); + loop.Run(); + EXPECT_TRUE(result.success); + EXPECT_GT(result.encoded_frame.size(), 0u); + EXPECT_EQ(result.decoder_config.codec(), VideoCodec::kCodecH264); +} + +} // namespace +} // namespace media
diff --git a/media/gpu/android/avda_surface_bundle.cc b/media/gpu/android/avda_surface_bundle.cc index 38c1320..1326186 100644 --- a/media/gpu/android/avda_surface_bundle.cc +++ b/media/gpu/android/avda_surface_bundle.cc
@@ -59,6 +59,10 @@ } void AVDASurfaceBundle::ScheduleLayout(gfx::Rect rect) { + if (layout_rect_ == rect) + return; + layout_rect_ = rect; + if (overlay) overlay->ScheduleLayout(rect); }
diff --git a/media/gpu/android/avda_surface_bundle.h b/media/gpu/android/avda_surface_bundle.h index 9ea45fa..4772a76 100644 --- a/media/gpu/android/avda_surface_bundle.h +++ b/media/gpu/android/avda_surface_bundle.h
@@ -51,6 +51,8 @@ void ScheduleLayout(gfx::Rect rect); + // The last updated layout rect position for the |overlay|. + gfx::Rect layout_rect_; base::WeakPtrFactory<AVDASurfaceBundle> weak_factory_; DISALLOW_COPY_AND_ASSIGN(AVDASurfaceBundle);
diff --git a/media/gpu/jpeg_decode_accelerator_unittest.cc b/media/gpu/jpeg_decode_accelerator_unittest.cc index 299fe68..fe691796 100644 --- a/media/gpu/jpeg_decode_accelerator_unittest.cc +++ b/media/gpu/jpeg_decode_accelerator_unittest.cc
@@ -212,20 +212,6 @@ DISALLOW_COPY_AND_ASSIGN(JpegClient); }; -// Returns a base::ScopedClosureRunner that can be used to automatically destroy -// an instance of JpegClient in a given task runner. Takes ownership of -// |client|. -base::ScopedClosureRunner CreateClientDestroyer( - scoped_refptr<base::SingleThreadTaskRunner> task_runner, - std::unique_ptr<JpegClient> client) { - return base::ScopedClosureRunner(base::BindOnce( - [](scoped_refptr<base::SingleThreadTaskRunner> destruction_runner, - std::unique_ptr<JpegClient> client_to_delete) { - destruction_runner->DeleteSoon(FROM_HERE, std::move(client_to_delete)); - }, - task_runner, std::move(client))); -} - JpegClient::JpegClient( const std::vector<ParsedJpegImage*>& test_image_files, std::unique_ptr<ClientStateNotification<ClientState>> note, @@ -535,6 +521,26 @@ } } +// This class holds a |client| that will be deleted on |task_runner|. This is +// necessary because |client->decoder_| expects to be destroyed on the thread on +// which it was created. +class ScopedJpegClient { + public: + ScopedJpegClient(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + std::unique_ptr<JpegClient> client) + : task_runner_(task_runner), client_(std::move(client)) {} + ~ScopedJpegClient() { + task_runner_->DeleteSoon(FROM_HERE, std::move(client_)); + } + JpegClient* client() const { return client_.get(); } + + private: + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + std::unique_ptr<JpegClient> client_; + + DISALLOW_COPY_AND_ASSIGN(ScopedJpegClient); +}; + class JpegDecodeAcceleratorTest : public ::testing::Test { protected: JpegDecodeAcceleratorTest() = default; @@ -557,44 +563,37 @@ base::Thread decoder_thread("DecoderThread"); ASSERT_TRUE(decoder_thread.Start()); - // The raw pointer to a client should not be used after a task to destroy the - // client is posted to |decoder_thread| by the corresponding element in - // |client_destroyers|. It's necessary to destroy the client in that thread - // because |client->decoder_| expects to be destroyed in the thread in which - // it was created. - std::vector<JpegClient*> clients; - std::vector<base::ScopedClosureRunner> client_destroyers; + std::vector<std::unique_ptr<ScopedJpegClient>> scoped_clients; for (size_t i = 0; i < num_concurrent_decoders; i++) { auto client = std::make_unique<JpegClient>( test_image_files_, std::make_unique<ClientStateNotification<ClientState>>(), false /* is_skip */); - clients.push_back(client.get()); - client_destroyers.emplace_back( - CreateClientDestroyer(decoder_thread.task_runner(), std::move(client))); + scoped_clients.emplace_back( + new ScopedJpegClient(decoder_thread.task_runner(), std::move(client))); + decoder_thread.task_runner()->PostTask( - FROM_HERE, base::Bind(&JpegClient::CreateJpegDecoder, - base::Unretained(clients.back()))); - ASSERT_EQ(clients[i]->note()->Wait(), CS_INITIALIZED); + FROM_HERE, + base::BindOnce(&JpegClient::CreateJpegDecoder, + base::Unretained(scoped_clients.back()->client()))); + ASSERT_EQ(scoped_clients.back()->client()->note()->Wait(), CS_INITIALIZED); } for (size_t index = 0; index < test_image_files_.size(); index++) { - for (size_t i = 0; i < num_concurrent_decoders; i++) { + for (const auto& scoped_client : scoped_clients) { decoder_thread.task_runner()->PostTask( FROM_HERE, base::BindOnce(&JpegClient::StartDecode, - base::Unretained(clients[i]), index, true)); + base::Unretained(scoped_client->client()), + index, true)); } if (index < expected_status_.size()) { - for (size_t i = 0; i < num_concurrent_decoders; i++) { - ASSERT_EQ(clients[i]->note()->Wait(), expected_status_[index]); + for (const auto& scoped_client : scoped_clients) { + ASSERT_EQ(scoped_client->client()->note()->Wait(), + expected_status_[index]); } } } - - // Doing this will destroy each client in the right thread (|decoder_thread|). - client_destroyers.clear(); - decoder_thread.Stop(); } void JpegDecodeAcceleratorTest::PerfDecodeByJDA(int decode_times) { @@ -606,33 +605,23 @@ test_image_files_, std::make_unique<ClientStateNotification<ClientState>>(), true /* is_skip */); - - // The raw pointer to the client should not be used after a task to destroy - // the client is posted to |decoder_thread| by the |client_destroyer|. It's - // necessary to destroy the client in that thread because |client->decoder_| - // expects to be destroyed in the thread in which it was created. - JpegClient* client_raw = client.get(); - base::ScopedClosureRunner client_destroyer = - CreateClientDestroyer(decoder_thread.task_runner(), std::move(client)); + auto scoped_client = std::make_unique<ScopedJpegClient>( + decoder_thread.task_runner(), std::move(client)); decoder_thread.task_runner()->PostTask( FROM_HERE, base::BindOnce(&JpegClient::CreateJpegDecoder, - base::Unretained(client_raw))); - ASSERT_EQ(client_raw->note()->Wait(), CS_INITIALIZED); + base::Unretained(scoped_client->client()))); + ASSERT_EQ(scoped_client->client()->note()->Wait(), CS_INITIALIZED); const int32_t bitstream_buffer_id = 0; - client_raw->PrepareMemory(bitstream_buffer_id); + scoped_client->client()->PrepareMemory(bitstream_buffer_id); for (int index = 0; index < decode_times; index++) { decoder_thread.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&JpegClient::StartDecode, base::Unretained(client_raw), - bitstream_buffer_id, false)); - ASSERT_EQ(client_raw->note()->Wait(), CS_DECODE_PASS); + FROM_HERE, base::BindOnce(&JpegClient::StartDecode, + base::Unretained(scoped_client->client()), + bitstream_buffer_id, false)); + ASSERT_EQ(scoped_client->client()->note()->Wait(), CS_DECODE_PASS); } - - // Doing this will destroy the client in the right thread (|decoder_thread|). - client_destroyer.RunAndReset(); - decoder_thread.Stop(); } void JpegDecodeAcceleratorTest::PerfDecodeBySW(int decode_times) {
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc index c74e0fb..fa56ddd 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -134,6 +134,7 @@ input_memory_type_(V4L2_MEMORY_USERPTR), output_streamon_(false), output_buffer_queued_count_(0), + is_flush_supported_(false), encoder_thread_("V4L2EncoderThread"), device_poll_thread_("V4L2EncoderDevicePollThread"), weak_this_ptr_factory_(this) { @@ -176,6 +177,13 @@ return false; } + // Ask if V4L2_ENC_CMD_STOP (Flush) is supported. + struct v4l2_encoder_cmd cmd = {}; + cmd.cmd = V4L2_ENC_CMD_STOP; + is_flush_supported_ = (device_->Ioctl(VIDIOC_TRY_ENCODER_CMD, &cmd) == 0); + if (!is_flush_supported_) + VLOGF(2) << "V4L2_ENC_CMD_STOP is not supported."; + struct v4l2_capability caps; memset(&caps, 0, sizeof(caps)); const __u32 kCapsRequired = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; @@ -395,6 +403,10 @@ EncodeTask(nullptr, false); } +bool V4L2VideoEncodeAccelerator::IsFlushSupported() { + return is_flush_supported_; +} + VideoEncodeAccelerator::SupportedProfiles V4L2VideoEncodeAccelerator::GetSupportedProfiles() { scoped_refptr<V4L2Device> device = V4L2Device::Create();
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h index 8c78f86..f52173ce 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
@@ -55,6 +55,7 @@ uint32_t framerate) override; void Destroy() override; void Flush(FlushCallback flush_callback) override; + bool IsFlushSupported() override; private: // Auto-destroy reference for BitstreamBuffer, for tracking buffers passed to @@ -291,6 +292,10 @@ // The completion callback of the Flush() function. FlushCallback flush_callback_; + // Indicates whether the V4L2 device supports flush. + // This is set in Initialize(). + bool is_flush_supported_; + // Image processor, if one is in use. std::unique_ptr<ImageProcessor> image_processor_; // Indexes of free image processor output buffers. Only accessed on child
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index 59ef085..a6a033b 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -626,6 +626,10 @@ EncodePendingInputs(); } +bool VaapiVideoEncodeAccelerator::IsFlushSupported() { + return true; +} + void VaapiVideoEncodeAccelerator::Destroy() { DVLOGF(2); DCHECK(child_task_runner_->BelongsToCurrentThread());
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h index 3e0f7cee..75f8ee0 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -45,6 +45,7 @@ uint32_t framerate) override; void Destroy() override; void Flush(FlushCallback flush_callback) override; + bool IsFlushSupported() override; private: class H264Accelerator;
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc index a544744..0602a87 100644 --- a/media/gpu/video_encode_accelerator_unittest.cc +++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -172,11 +172,6 @@ bool g_fake_encoder = false; -// Skip checking the flush functionality. Currently only Chrome OS devices -// support flush, so we need this to skip the check. This is set by the -// command line switch "--disable_flush". -bool g_disable_flush = false; - // Environment to store test stream data for all test cases. class VideoEncodeAcceleratorTestEnvironment; VideoEncodeAcceleratorTestEnvironment* g_env; @@ -1300,6 +1295,8 @@ // time delay from input of each VideoFrame (VEA::Encode()) to output of the // corresponding BitstreamBuffer (VEA::Client::BitstreamBufferReady()). std::vector<base::TimeDelta> encode_latencies_; + // The 0-based indices of frames that we force as key frames. + std::queue<size_t> keyframe_indices_; // Ids for output BitstreamBuffers. typedef std::map<int32_t, base::SharedMemory*> IdToSHM; @@ -1325,21 +1322,12 @@ // Frames since last bitrate verification. unsigned int num_frames_since_last_check_; - // True if received a keyframe while processing current bitstream buffer. - bool seen_keyframe_in_this_buffer_; - // True if we are to save the encoded stream to a file. bool save_to_file_; // Request a keyframe every keyframe_period_ frames. const unsigned int keyframe_period_; - // Number of keyframes requested by now. - unsigned int num_keyframes_requested_; - - // Next keyframe expected before next_keyframe_at_ + kMaxKeyframeDelay. - unsigned int next_keyframe_at_; - // True if we are asking encoder for a particular bitrate. bool force_bitrate_; @@ -1420,11 +1408,8 @@ num_frames_submitted_to_encoder_(0), num_encoded_frames_(0), num_frames_since_last_check_(0), - seen_keyframe_in_this_buffer_(false), save_to_file_(save_to_file), keyframe_period_(keyframe_period), - num_keyframes_requested_(0), - next_keyframe_at_(0), force_bitrate_(force_bitrate), current_requested_bitrate_(0), current_framerate_(0), @@ -1691,8 +1676,10 @@ static_cast<int>(metadata.payload_size_bytes))); quality_validator_->AddDecodeBuffer(buffer); } - // If flush is disabled, pretend flush is done when all frames are received. - if (g_disable_flush && num_encoded_frames_ == num_frames_to_encode_) { + // If the encoder does not support flush, pretend flush is done when all + // frames are received. + if (!encoder_->IsFlushSupported() && + num_encoded_frames_ == num_frames_to_encode_) { FlushEncoderSuccessfully(); } @@ -1708,9 +1695,6 @@ } } - EXPECT_EQ(metadata.key_frame, seen_keyframe_in_this_buffer_); - seen_keyframe_in_this_buffer_ = false; - FeedEncoderWithOutput(shm); } @@ -1825,12 +1809,6 @@ frame_timestamps_.push(video_frame->timestamp()); pos_in_input_stream_ += static_cast<off_t>(test_stream_->aligned_buffer_size); - bool force_keyframe = false; - if (keyframe_period_ && input_id % keyframe_period_ == 0) { - force_keyframe = true; - ++num_keyframes_requested_; - } - if (input_id == 0) { first_frame_start_time_ = base::TimeTicks::Now(); } @@ -1840,6 +1818,12 @@ encode_start_time_.push_back(base::TimeTicks::Now()); } + bool force_keyframe = (keyframe_period_ && input_id % keyframe_period_ == 0); + if (force_keyframe) { + // Because we increase |num_frames_submitted_to_encoder_| after calling + // Encode(), the value here is actually 0-based frame index. + keyframe_indices_.push(num_frames_submitted_to_encoder_); + } encoder_->Encode(video_frame, force_keyframe); ++num_frames_submitted_to_encoder_; if (num_frames_submitted_to_encoder_ == num_frames_to_encode_) { @@ -1898,17 +1882,18 @@ // earlier than we requested one (in time), and not later than // kMaxKeyframeDelay frames after the frame, for which we requested // it, comes back encoded. - if (keyframe) { - if (num_keyframes_requested_ > 0) { - --num_keyframes_requested_; - next_keyframe_at_ += keyframe_period_; + if (!keyframe_indices_.empty()) { + // Convert to 0-based index for encoded frame. + const unsigned int frame_index = num_encoded_frames_ - 1; + if (keyframe) { + EXPECT_LE(frame_index, keyframe_indices_.front() + kMaxKeyframeDelay); + keyframe_indices_.pop(); + } else { + EXPECT_LT(frame_index, keyframe_indices_.front() + kMaxKeyframeDelay); } - seen_keyframe_in_this_buffer_ = true; } - EXPECT_EQ(test_stream_->visible_size, visible_size); - if (num_keyframes_requested_ > 0) - EXPECT_LE(num_encoded_frames_, next_keyframe_at_ + kMaxKeyframeDelay); + EXPECT_EQ(test_stream_->visible_size, visible_size); if (num_encoded_frames_ == num_frames_to_encode_ / 2) { VerifyStreamProperties(); @@ -1967,7 +1952,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); LOG_ASSERT(num_frames_submitted_to_encoder_ == num_frames_to_encode_); - if (g_disable_flush) + if (!encoder_->IsFlushSupported()) return; encoder_->Flush( @@ -2037,14 +2022,6 @@ EXPECT_NEAR(bitrate, current_requested_bitrate_, kBitrateTolerance * current_requested_bitrate_); } - - // All requested keyframes should've been provided. Allow the last requested - // frame to remain undelivered if we haven't reached the maximum frame number - // by which it should have arrived. - if (num_encoded_frames_ < next_keyframe_at_ + kMaxKeyframeDelay) - EXPECT_LE(num_keyframes_requested_, 1UL); - else - EXPECT_EQ(0UL, num_keyframes_requested_); } void VEAClient::WriteIvfFileHeader() { @@ -2598,13 +2575,6 @@ const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); DCHECK(cmd_line); -#if defined(OS_CHROMEOS) - // Currently only ARC++ uses flush function, we only verify it on Chrome OS. - media::g_disable_flush = false; -#else - media::g_disable_flush = true; -#endif - base::CommandLine::SwitchMap switches = cmd_line->GetSwitches(); for (base::CommandLine::SwitchMap::const_iterator it = switches.begin(); it != switches.end(); ++it) { @@ -2635,10 +2605,6 @@ media::g_run_at_fps = true; continue; } - if (it->first == "disable_flush") { - media::g_disable_flush = true; - continue; - } if (it->first == "verify_all_output") { media::g_verify_all_output = true; continue;
diff --git a/media/gpu/windows/d3d11_h264_accelerator.cc b/media/gpu/windows/d3d11_h264_accelerator.cc index 6c21797..58641de73 100644 --- a/media/gpu/windows/d3d11_h264_accelerator.cc +++ b/media/gpu/windows/d3d11_h264_accelerator.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/trace_event/trace_event.h" #include "media/base/cdm_proxy_context.h" +#include "media/base/media_log.h" #include "media/gpu/h264_decoder.h" #include "media/gpu/h264_dpb.h" #include "media/gpu/windows/d3d11_picture_buffer.h" @@ -62,11 +63,13 @@ D3D11H264Accelerator::D3D11H264Accelerator( D3D11VideoDecoderClient* client, + MediaLog* media_log, CdmProxyContext* cdm_proxy_context, Microsoft::WRL::ComPtr<ID3D11VideoDecoder> video_decoder, Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device, Microsoft::WRL::ComPtr<ID3D11VideoContext1> video_context) : client_(client), + media_log_(media_log), cdm_proxy_context_(cdm_proxy_context), video_decoder_(video_decoder), video_device_(video_device), @@ -92,7 +95,7 @@ const scoped_refptr<H264Picture>& pic) { const bool is_encrypted = pic->decrypt_config(); if (is_encrypted && !cdm_proxy_context_) { - DVLOG(1) << "The input is encrypted but there is no proxy context."; + RecordFailure("The input is encrypted but there is no proxy context."); return Status::kFail; } @@ -104,7 +107,7 @@ decrypt_context = cdm_proxy_context_->GetD3D11DecryptContext( pic->decrypt_config()->key_id()); if (!decrypt_context) { - DVLOG(1) << "Cannot find decrypt context for the frame."; + RecordFailure("Cannot find decrypt context for the frame."); return Status::kTryAgain; } @@ -132,8 +135,7 @@ // TODO(liberato): For now, just busy wait. ; } else if (!SUCCEEDED(hr)) { - LOG(ERROR) << "DecoderBeginFrame failed: " - << logging::SystemErrorCodeToString(hr); + RecordFailure("DecoderBeginFrame failed", hr); return Status::kFail; } else { break; @@ -184,7 +186,7 @@ video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_BITSTREAM, &buffer_size, &buffer); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "GetDecoderBuffer (Bitstream) failed"; + RecordFailure("GetDecoderBuffer (Bitstream) failed", hr); return false; } bitstream_buffer_bytes_ = (uint8_t*)buffer; @@ -304,7 +306,7 @@ video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS, &buffer_size, &buffer); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "ReleaseDecoderBuffer (PictureParams) failed"; + RecordFailure("ReleaseDecoderBuffer (PictureParams) failed", hr); return Status::kFail; } @@ -312,7 +314,7 @@ hr = video_context_->ReleaseDecoderBuffer( video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "ReleaseDecoderBuffer (PictureParams) failed"; + RecordFailure("ReleaseDecoderBuffer (PictureParams) failed", hr); return Status::kFail; } @@ -344,7 +346,7 @@ D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX, &buffer_size, &buffer); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "GetDecoderBuffer (QuantMatrix) failed"; + RecordFailure("GetDecoderBuffer (QuantMatrix) failed", hr); return Status::kFail; } memcpy(buffer, &iq_matrix_buf, sizeof(iq_matrix_buf)); @@ -352,7 +354,7 @@ video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "ReleaseDecoderBuffer (QuantMatrix) failed"; + RecordFailure("ReleaseDecoderBuffer (QuantMatrix) failed", hr); return Status::kFail; } @@ -371,9 +373,9 @@ // For now, the entire frame has to fit into the bitstream buffer. This way // the subsample ClearSize adjustment below should work. if (bitstream_buffer_size_ < remaining_bitstream) { - LOG(ERROR) << "Input slice NALU (" << remaining_bitstream - << ") too big to fit in the bistream buffer (" - << bitstream_buffer_size_ << ")."; + RecordFailure("Input slice NALU (" + std::to_string(remaining_bitstream) + + ") too big to fit in the bistream buffer (" + + std::to_string(bitstream_buffer_size_) + ")."); return Status::kFail; } @@ -394,12 +396,12 @@ if (bitstream_buffer_size_ < remaining_bitstream && slice_info_.size() > 0) { if (!SubmitSliceData()) { - LOG(ERROR) << "SubmitSliceData failed"; + RecordFailure("SubmitSliceData failed"); return Status::kFail; } if (!RetrieveBitstreamBuffer()) { - LOG(ERROR) << "RetrieveBitstreamBuffer failed"; + RecordFailure("RetrieveBitstreamBuffer failed"); return Status::kFail; } } @@ -455,7 +457,7 @@ video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL, &buffer_size, &buffer); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "GetDecoderBuffer (SliceControl) failed"; + RecordFailure("GetDecoderBuffer (SliceControl) failed", hr); return false; } @@ -464,14 +466,14 @@ hr = video_context_->ReleaseDecoderBuffer( video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "ReleaseDecoderBuffer (SliceControl) failed"; + RecordFailure("ReleaseDecoderBuffer (SliceControl) failed", hr); return false; } hr = video_context_->ReleaseDecoderBuffer( video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_BITSTREAM); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "ReleaseDecoderBuffer (BitStream) failed"; + RecordFailure("ReleaseDecoderBuffer (BitStream) failed", hr); return false; } @@ -509,8 +511,7 @@ frame_iv_.clear(); subsamples_.clear(); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "SubmitDecoderBuffers failed: " - << logging::SystemErrorCodeToString(hr); + RecordFailure("SubmitDecoderBuffers failed", hr); return false; } @@ -520,13 +521,13 @@ Status D3D11H264Accelerator::SubmitDecode( const scoped_refptr<H264Picture>& pic) { if (!SubmitSliceData()) { - LOG(ERROR) << "SubmitSliceData failed"; + RecordFailure("SubmitSliceData failed"); return Status::kFail; } HRESULT hr = video_context_->DecoderEndFrame(video_decoder_.Get()); if (!SUCCEEDED(hr)) { - LOG(ERROR) << "DecoderEndFrame failed"; + RecordFailure("DecoderEndFrame failed", hr); return Status::kFail; } @@ -555,4 +556,17 @@ return true; } +void D3D11H264Accelerator::RecordFailure(const std::string& reason, + HRESULT hr) const { + std::string hr_string; + if (!SUCCEEDED(hr)) + hr_string = ": " + logging::SystemErrorCodeToString(hr); + + DLOG(ERROR) << reason << hr_string; + if (media_log_) { + media_log_->AddEvent(media_log_->CreateStringEvent( + MediaLogEvent::MEDIA_ERROR_LOG_ENTRY, "error", hr_string + reason)); + } +} + } // namespace media
diff --git a/media/gpu/windows/d3d11_h264_accelerator.h b/media/gpu/windows/d3d11_h264_accelerator.h index 11825d57..efef197 100644 --- a/media/gpu/windows/d3d11_h264_accelerator.h +++ b/media/gpu/windows/d3d11_h264_accelerator.h
@@ -26,6 +26,7 @@ class CdmProxyContext; class D3D11H264Accelerator; class D3D11PictureBuffer; +class MediaLog; class D3D11VideoDecoderClient { public: @@ -39,6 +40,7 @@ // |cdm_proxy_context| may be null for clear content. D3D11H264Accelerator( D3D11VideoDecoderClient* client, + MediaLog* media_log, CdmProxyContext* cdm_proxy_context, Microsoft::WRL::ComPtr<ID3D11VideoDecoder> video_decoder, Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device, @@ -70,7 +72,11 @@ bool SubmitSliceData(); bool RetrieveBitstreamBuffer(); + // Record a failure to DVLOG and |media_log_|. + void RecordFailure(const std::string& reason, HRESULT hr = S_OK) const; + D3D11VideoDecoderClient* client_; + MediaLog* media_log_ = nullptr; CdmProxyContext* const cdm_proxy_context_; Microsoft::WRL::ComPtr<ID3D11VideoDecoder> video_decoder_;
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index 3d051cc..628ebb581 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -11,6 +11,7 @@ #include "base/metrics/histogram_macros.h" #include "media/base/bind_to_current_loop.h" #include "media/base/decoder_buffer.h" +#include "media/base/media_log.h" #include "media/base/video_codecs.h" #include "media/base/video_decoder_config.h" #include "media/base/video_frame.h" @@ -49,6 +50,7 @@ std::unique_ptr<VideoDecoder> D3D11VideoDecoder::Create( scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, + std::unique_ptr<MediaLog> media_log, const gpu::GpuPreferences& gpu_preferences, const gpu::GpuDriverBugWorkarounds& gpu_workarounds, base::RepeatingCallback<gpu::CommandBufferStub*()> get_stub_cb) { @@ -58,17 +60,22 @@ // when it's released. // Note that we WrapUnique<VideoDecoder> rather than D3D11VideoDecoder to make // this castable; the deleters have to match. - return base::WrapUnique<VideoDecoder>(new D3D11VideoDecoder( - std::move(gpu_task_runner), gpu_preferences, gpu_workarounds, - std::make_unique<D3D11VideoDecoderImpl>(get_stub_cb))); + std::unique_ptr<MediaLog> cloned_media_log = media_log->Clone(); + return base::WrapUnique<VideoDecoder>( + new D3D11VideoDecoder(std::move(gpu_task_runner), std::move(media_log), + gpu_preferences, gpu_workarounds, + std::make_unique<D3D11VideoDecoderImpl>( + std::move(cloned_media_log), get_stub_cb))); } D3D11VideoDecoder::D3D11VideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, + std::unique_ptr<MediaLog> media_log, const gpu::GpuPreferences& gpu_preferences, const gpu::GpuDriverBugWorkarounds& gpu_workarounds, std::unique_ptr<D3D11VideoDecoderImpl> impl) - : impl_(std::move(impl)), + : media_log_(std::move(media_log)), + impl_(std::move(impl)), impl_task_runner_(std::move(gpu_task_runner)), gpu_preferences_(gpu_preferences), gpu_workarounds_(gpu_workarounds), @@ -174,6 +181,34 @@ void D3D11VideoDecoder::SetWasSupportedReason( D3D11VideoNotSupportedReason enum_value) { UMA_HISTOGRAM_ENUMERATION("Media.D3D11.WasVideoSupported", enum_value); + + const char* reason = nullptr; + switch (enum_value) { + case D3D11VideoNotSupportedReason::kVideoIsSupported: + reason = "Playback is supported by D3D11VideoDecoder"; + break; + case D3D11VideoNotSupportedReason::kInsufficientD3D11FeatureLevel: + reason = "Insufficient D3D11 feature level"; + break; + case D3D11VideoNotSupportedReason::kProfileNotSupported: + reason = "Video profile is not supported by D3D11VideoDecoder"; + break; + case D3D11VideoNotSupportedReason::kCodecNotSupported: + reason = "H264 is required for D3D11VideoDecoder"; + break; + case D3D11VideoNotSupportedReason::kZeroCopyNv12Required: + reason = "Must allow zero-copy NV12 for D3D11VideoDecoder"; + break; + case D3D11VideoNotSupportedReason::kZeroCopyVideoRequired: + reason = "Must allow zero-copy video for D3D11VideoDecoder"; + break; + } + + DVLOG(2) << reason; + if (media_log_) { + media_log_->AddEvent(media_log_->CreateStringEvent( + MediaLogEvent::MEDIA_INFO_LOG_ENTRY, "info", reason)); + } } bool D3D11VideoDecoder::IsPotentiallySupported( @@ -192,7 +227,6 @@ if (FAILED(hr)) { SetWasSupportedReason( D3D11VideoNotSupportedReason::kInsufficientD3D11FeatureLevel); - DVLOG(2) << "Insufficient D3D11 feature level"; return false; } @@ -205,11 +239,10 @@ if (config.profile() == H264PROFILE_HIGH10PROFILE) { // Must use NV12, which excludes HDR. SetWasSupportedReason(D3D11VideoNotSupportedReason::kProfileNotSupported); - DVLOG(2) << "High 10 profile is not supported."; return false; } } else { - DVLOG(2) << "Profile is not H264."; + SetWasSupportedReason(D3D11VideoNotSupportedReason::kCodecNotSupported); return false; } @@ -217,24 +250,14 @@ // have the target colorspace. It's commented as being for vpx, though, so // we skip it here for now. - // Must use the validating decoder. - // TODO(tmathmeyer): support passthrough decoder. No logging to UMA since - // this condition should go away soon. - if (gpu_preferences_.use_passthrough_cmd_decoder) { - DVLOG(2) << "Must use validating decoder."; - return false; - } - // Must allow zero-copy of nv12 textures. if (!gpu_preferences_.enable_zero_copy_dxgi_video) { SetWasSupportedReason(D3D11VideoNotSupportedReason::kZeroCopyNv12Required); - DVLOG(2) << "Must allow zero-copy NV12."; return false; } if (gpu_workarounds_.disable_dxgi_zero_copy_video) { SetWasSupportedReason(D3D11VideoNotSupportedReason::kZeroCopyVideoRequired); - DVLOG(2) << "Must allow zero-copy video."; return false; }
diff --git a/media/gpu/windows/d3d11_video_decoder.h b/media/gpu/windows/d3d11_video_decoder.h index a8c79a7f..93771b9b 100644 --- a/media/gpu/windows/d3d11_video_decoder.h +++ b/media/gpu/windows/d3d11_video_decoder.h
@@ -23,6 +23,7 @@ class D3D11VideoDecoderImpl; class D3D11VideoDecoderTest; +class MediaLog; // Thread-hopping implementation of D3D11VideoDecoder. It's meant to run on // a random thread, and hop to the gpu main thread. It does this so that it @@ -34,6 +35,7 @@ public: static std::unique_ptr<VideoDecoder> Create( scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, + std::unique_ptr<MediaLog> media_log, const gpu::GpuPreferences& gpu_preferences, const gpu::GpuDriverBugWorkarounds& gpu_workarounds, base::RepeatingCallback<gpu::CommandBufferStub*()> get_stub_cb); @@ -71,6 +73,7 @@ friend class D3D11VideoDecoderTest; D3D11VideoDecoder(scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, + std::unique_ptr<MediaLog> media_log, const gpu::GpuPreferences& gpu_preferences, const gpu::GpuDriverBugWorkarounds& gpu_workarounds, std::unique_ptr<D3D11VideoDecoderImpl> impl); @@ -81,7 +84,7 @@ // D3D11 version 11.1 required. kInsufficientD3D11FeatureLevel = 1, - // The video profile for a supported codec is not supported. + // The video profile is not supported . kProfileNotSupported = 2, // GPU options: require zero copy. @@ -90,12 +93,19 @@ // GPU options: require zero copy. kZeroCopyVideoRequired = 4, + // The video codec must be H264. + kCodecNotSupported = 5, + // For UMA. Must be the last entry. It should be initialized to the // numerically largest value above; if you add more entries, then please // update this to the last one. - kMaxValue = kZeroCopyVideoRequired + kMaxValue = kCodecNotSupported }; + std::unique_ptr<MediaLog> media_log_; + + // Record a UMA about why IsPotentiallySupported returned false, or that it + // returned true. Also will add a MediaLog entry, etc. void SetWasSupportedReason(D3D11VideoNotSupportedReason enum_value); // The implementation, which we trampoline to the impl thread.
diff --git a/media/gpu/windows/d3d11_video_decoder_impl.cc b/media/gpu/windows/d3d11_video_decoder_impl.cc index 459ffba..eed52b2 100644 --- a/media/gpu/windows/d3d11_video_decoder_impl.cc +++ b/media/gpu/windows/d3d11_video_decoder_impl.cc
@@ -14,6 +14,7 @@ #include "media/base/bind_to_current_loop.h" #include "media/base/cdm_context.h" #include "media/base/decoder_buffer.h" +#include "media/base/media_log.h" #include "media/base/video_decoder_config.h" #include "media/base/video_frame.h" #include "media/base/video_util.h" @@ -32,8 +33,11 @@ } // namespace D3D11VideoDecoderImpl::D3D11VideoDecoderImpl( + std::unique_ptr<MediaLog> media_log, base::RepeatingCallback<gpu::CommandBufferStub*()> get_stub_cb) - : get_stub_cb_(get_stub_cb), weak_factory_(this) {} + : media_log_(std::move(media_log)), + get_stub_cb_(get_stub_cb), + weak_factory_(this) {} D3D11VideoDecoderImpl::~D3D11VideoDecoderImpl() { // TODO(liberato): be sure to clear |picture_buffers_| on the main thread. @@ -175,7 +179,8 @@ #endif accelerated_video_decoder_ = std::make_unique<H264Decoder>( - std::make_unique<D3D11H264Accelerator>(this, proxy_context, video_decoder, + std::make_unique<D3D11H264Accelerator>(this, media_log_.get(), + proxy_context, video_decoder, video_device_, video_context_), config.color_space_info()); @@ -446,6 +451,11 @@ void D3D11VideoDecoderImpl::NotifyError(const char* reason) { state_ = State::kError; DLOG(ERROR) << reason; + if (media_log_) { + media_log_->AddEvent(media_log_->CreateStringEvent( + MediaLogEvent::MEDIA_ERROR_LOG_ENTRY, "error", reason)); + } + if (init_cb_) std::move(init_cb_).Run(false);
diff --git a/media/gpu/windows/d3d11_video_decoder_impl.h b/media/gpu/windows/d3d11_video_decoder_impl.h index a62c8fd..f6350bc 100644 --- a/media/gpu/windows/d3d11_video_decoder_impl.h +++ b/media/gpu/windows/d3d11_video_decoder_impl.h
@@ -27,10 +27,13 @@ namespace media { +class MediaLog; + class MEDIA_GPU_EXPORT D3D11VideoDecoderImpl : public VideoDecoder, public D3D11VideoDecoderClient { public: explicit D3D11VideoDecoderImpl( + std::unique_ptr<MediaLog> media_log, base::RepeatingCallback<gpu::CommandBufferStub*()> get_stub_cb); ~D3D11VideoDecoderImpl() override; @@ -89,6 +92,8 @@ // pending decode as well. void NotifyError(const char* reason); + std::unique_ptr<MediaLog> media_log_; + base::RepeatingCallback<gpu::CommandBufferStub*()> get_stub_cb_; gpu::CommandBufferStub* stub_ = nullptr;
diff --git a/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc index 86dd1e5..ccddfb8a 100644 --- a/media/gpu/windows/d3d11_video_decoder_unittest.cc +++ b/media/gpu/windows/d3d11_video_decoder_unittest.cc
@@ -15,6 +15,7 @@ #include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "media/base/decoder_buffer.h" +#include "media/base/media_log.h" #include "media/base/test_helpers.h" #include "media/gpu/windows/d3d11_mocks.h" #include "media/gpu/windows/d3d11_video_decoder_impl.h" @@ -32,6 +33,7 @@ public: MockD3D11VideoDecoderImpl() : D3D11VideoDecoderImpl( + nullptr, base::RepeatingCallback<gpu::CommandBufferStub*()>()) {} MOCK_METHOD6( @@ -75,9 +77,9 @@ // We store it in a std::unique_ptr<VideoDecoder> so that the default // deleter works. The dtor is protected. decoder_ = base::WrapUnique<VideoDecoder>( - d3d11_decoder_raw_ = - new D3D11VideoDecoder(gpu_task_runner_, gpu_preferences_, - gpu_workarounds_, std::move(impl))); + d3d11_decoder_raw_ = new D3D11VideoDecoder( + gpu_task_runner_, nullptr /* MediaLog */, gpu_preferences_, + gpu_workarounds_, std::move(impl))); d3d11_decoder_raw_->SetCreateDeviceCallbackForTesting( base::BindRepeating(&D3D11CreateDeviceMock::Create, base::Unretained(&create_device_mock_))); @@ -181,12 +183,6 @@ InitializeDecoder(supported_config_, kExpectFailure); } -TEST_F(D3D11VideoDecoderTest, FailsIfUsingPassthroughDecoder) { - gpu_preferences_.use_passthrough_cmd_decoder = true; - CreateDecoder(); - InitializeDecoder(supported_config_, kExpectFailure); -} - TEST_F(D3D11VideoDecoderTest, FailsIfZeroCopyWorkaround) { gpu_workarounds_.disable_dxgi_zero_copy_video = true; CreateDecoder();
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc index 4c58b03e..e497bf1e 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.cc +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
@@ -280,12 +280,14 @@ D3D11_VIDEO_DECODER_CONFIG config = {}; hr = video_device->GetVideoDecoderConfig(&desc, 0, &config); + UMA_HISTOGRAM_BOOLEAN("Media.DXVAVDA.GetDecoderConfigStatus", SUCCEEDED(hr)); if (FAILED(hr)) return false; Microsoft::WRL::ComPtr<ID3D11VideoDecoder> video_decoder; hr = video_device->CreateVideoDecoder(&desc, &config, video_decoder.GetAddressOf()); + UMA_HISTOGRAM_BOOLEAN("Media.DXVAVDA.CreateDecoderStatus", !!video_decoder); return !!video_decoder; }
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc index e481398..c7b4b55 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc +++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -46,15 +46,17 @@ allocation_size); DoInitialize(config.input_format, config.input_visible_size, - config.output_profile, config.initial_bitrate, &client); + config.output_profile, config.initial_bitrate, + config.content_type, &client); } std::move(success_callback).Run(initialization_success_); } - MOCK_METHOD5(DoInitialize, + MOCK_METHOD6(DoInitialize, void(media::VideoPixelFormat, const gfx::Size&, media::VideoCodecProfile, uint32_t, + media::VideoEncodeAccelerator::Config::ContentType, mojom::VideoEncodeAcceleratorClientPtr*)); void Encode(const scoped_refptr<VideoFrame>& frame, @@ -149,10 +151,12 @@ void Initialize(MockVideoEncodeAcceleratorClient* mock_vea_client) { const VideoCodecProfile kOutputProfile = VIDEO_CODEC_PROFILE_UNKNOWN; const uint32_t kInitialBitrate = 100000u; + const VideoEncodeAccelerator::Config::ContentType kContentType = + VideoEncodeAccelerator::Config::ContentType::kDisplay; EXPECT_CALL(*mock_mojo_vea(), DoInitialize(PIXEL_FORMAT_I420, kInputVisibleSize, - kOutputProfile, kInitialBitrate, _)); + kOutputProfile, kInitialBitrate, kContentType, _)); EXPECT_CALL( *mock_vea_client, RequireBitstreamBuffers( @@ -160,7 +164,8 @@ VideoFrame::AllocationSize(PIXEL_FORMAT_I420, kInputVisibleSize))); const VideoEncodeAccelerator::Config config( - PIXEL_FORMAT_I420, kInputVisibleSize, kOutputProfile, kInitialBitrate); + PIXEL_FORMAT_I420, kInputVisibleSize, kOutputProfile, kInitialBitrate, + base::nullopt, base::nullopt, kContentType); EXPECT_TRUE(mojo_vea()->Initialize(config, mock_vea_client)); base::RunLoop().RunUntilIdle(); }
diff --git a/media/mojo/common/mojo_shared_buffer_video_frame.cc b/media/mojo/common/mojo_shared_buffer_video_frame.cc index bd7df5f8..82891ce 100644 --- a/media/mojo/common/mojo_shared_buffer_video_frame.cc +++ b/media/mojo/common/mojo_shared_buffer_video_frame.cc
@@ -137,11 +137,10 @@ // Now allocate the frame and initialize it. scoped_refptr<MojoSharedBufferVideoFrame> frame( - new MojoSharedBufferVideoFrame(format, coded_size, visible_rect, - natural_size, std::move(handle), data_size, - timestamp)); - if (!frame->Init(y_stride, u_stride, v_stride, y_offset, u_offset, - v_offset)) { + new MojoSharedBufferVideoFrame( + VideoFrameLayout(format, coded_size, {y_stride, u_stride, v_stride}), + visible_rect, natural_size, std::move(handle), data_size, timestamp)); + if (!frame->Init(y_offset, u_offset, v_offset)) { DLOG(ERROR) << __func__ << " MojoSharedBufferVideoFrame::Init failed."; return nullptr; } @@ -150,16 +149,14 @@ } MojoSharedBufferVideoFrame::MojoSharedBufferVideoFrame( - VideoPixelFormat format, - const gfx::Size& coded_size, + const VideoFrameLayout& layout, const gfx::Rect& visible_rect, const gfx::Size& natural_size, mojo::ScopedSharedBufferHandle handle, size_t mapped_size, base::TimeDelta timestamp) - : VideoFrame(format, + : VideoFrame(layout, STORAGE_MOJO_SHARED_BUFFER, - coded_size, visible_rect, natural_size, timestamp), @@ -168,10 +165,7 @@ DCHECK(shared_buffer_handle_.is_valid()); } -bool MojoSharedBufferVideoFrame::Init(int32_t y_stride, - int32_t u_stride, - int32_t v_stride, - size_t y_offset, +bool MojoSharedBufferVideoFrame::Init(size_t y_offset, size_t u_offset, size_t v_offset) { DCHECK(!shared_buffer_mapping_); @@ -179,7 +173,6 @@ if (!shared_buffer_mapping_) return false; - set_strides({y_stride, u_stride, v_stride}); offsets_[kYPlane] = y_offset; offsets_[kUPlane] = u_offset; offsets_[kVPlane] = v_offset;
diff --git a/media/mojo/common/mojo_shared_buffer_video_frame.h b/media/mojo/common/mojo_shared_buffer_video_frame.h index beee425..bc690bf0 100644 --- a/media/mojo/common/mojo_shared_buffer_video_frame.h +++ b/media/mojo/common/mojo_shared_buffer_video_frame.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "media/base/video_frame.h" +#include "media/base/video_frame_layout.h" #include "mojo/public/cpp/system/buffer.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -76,8 +77,7 @@ private: friend class MojoDecryptorService; - MojoSharedBufferVideoFrame(VideoPixelFormat format, - const gfx::Size& coded_size, + MojoSharedBufferVideoFrame(const VideoFrameLayout& layout, const gfx::Rect& visible_rect, const gfx::Size& natural_size, mojo::ScopedSharedBufferHandle handle, @@ -86,13 +86,8 @@ ~MojoSharedBufferVideoFrame() override; // Initializes the MojoSharedBufferVideoFrame by creating a mapping onto - // the shared memory, and then setting the strides and offsets as specified. - bool Init(int32_t y_stride, - int32_t u_stride, - int32_t v_stride, - size_t y_offset, - size_t u_offset, - size_t v_offset); + // the shared memory, and then setting offsets as specified. + bool Init(size_t y_offset, size_t u_offset, size_t v_offset); uint8_t* shared_buffer_data() { return reinterpret_cast<uint8_t*>(shared_buffer_mapping_.get());
diff --git a/media/mojo/interfaces/video_encode_accelerator.mojom b/media/mojo/interfaces/video_encode_accelerator.mojom index 4ff5a0fe..0f44b6f 100644 --- a/media/mojo/interfaces/video_encode_accelerator.mojom +++ b/media/mojo/interfaces/video_encode_accelerator.mojom
@@ -45,6 +45,12 @@ // This defines a mojo transport format for // media::VideoEncodeAccelerator::Config. struct VideoEncodeAcceleratorConfig { + // See media::VideoEncodeAccelerator::Config::ContentType + enum ContentType { + kCamera, + kDisplay + }; + VideoPixelFormat input_format; gfx.mojom.Size input_visible_size; VideoCodecProfile output_profile; @@ -53,6 +59,7 @@ bool has_initial_framerate; // Whether or not config has initial framerate uint8 h264_output_level; bool has_h264_output_level; // Whether or not config has H264 output level + ContentType content_type; }; interface VideoEncodeAccelerator {
diff --git a/media/mojo/interfaces/video_encode_accelerator_mojom_traits.cc b/media/mojo/interfaces/video_encode_accelerator_mojom_traits.cc index fdf0098b..edfcf3f 100644 --- a/media/mojo/interfaces/video_encode_accelerator_mojom_traits.cc +++ b/media/mojo/interfaces/video_encode_accelerator_mojom_traits.cc
@@ -117,6 +117,37 @@ } // static +media::mojom::VideoEncodeAcceleratorConfig::ContentType +EnumTraits<media::mojom::VideoEncodeAcceleratorConfig::ContentType, + media::VideoEncodeAccelerator::Config::ContentType>:: + ToMojom(media::VideoEncodeAccelerator::Config::ContentType input) { + switch (input) { + case media::VideoEncodeAccelerator::Config::ContentType::kDisplay: + return media::mojom::VideoEncodeAcceleratorConfig::ContentType::kDisplay; + case media::VideoEncodeAccelerator::Config::ContentType::kCamera: + return media::mojom::VideoEncodeAcceleratorConfig::ContentType::kCamera; + } + NOTREACHED(); + return media::mojom::VideoEncodeAcceleratorConfig::ContentType::kCamera; +} +// static +bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig::ContentType, + media::VideoEncodeAccelerator::Config::ContentType>:: + FromMojom(media::mojom::VideoEncodeAcceleratorConfig::ContentType input, + media::VideoEncodeAccelerator::Config::ContentType* output) { + switch (input) { + case media::mojom::VideoEncodeAcceleratorConfig::ContentType::kCamera: + *output = media::VideoEncodeAccelerator::Config::ContentType::kCamera; + return true; + case media::mojom::VideoEncodeAcceleratorConfig::ContentType::kDisplay: + *output = media::VideoEncodeAccelerator::Config::ContentType::kDisplay; + return true; + } + NOTREACHED(); + return false; +} + +// static bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, media::VideoEncodeAccelerator::Config>:: Read(media::mojom::VideoEncodeAcceleratorConfigDataView input, @@ -134,18 +165,20 @@ return false; base::Optional<uint32_t> initial_framerate; - if (input.has_initial_framerate()) { + if (input.has_initial_framerate()) initial_framerate = input.initial_framerate(); - } base::Optional<uint8_t> h264_output_level; - if (input.has_h264_output_level()) { + if (input.has_h264_output_level()) h264_output_level = input.h264_output_level(); - } + + media::VideoEncodeAccelerator::Config::ContentType content_type; + if (!input.ReadContentType(&content_type)) + return false; *output = media::VideoEncodeAccelerator::Config( input_format, input_visible_size, output_profile, input.initial_bitrate(), - initial_framerate, h264_output_level); + initial_framerate, h264_output_level, content_type); return true; }
diff --git a/media/mojo/interfaces/video_encode_accelerator_mojom_traits.h b/media/mojo/interfaces/video_encode_accelerator_mojom_traits.h index 170cd4c..78787dcf 100644 --- a/media/mojo/interfaces/video_encode_accelerator_mojom_traits.h +++ b/media/mojo/interfaces/video_encode_accelerator_mojom_traits.h
@@ -76,6 +76,17 @@ }; template <> +struct EnumTraits<media::mojom::VideoEncodeAcceleratorConfig::ContentType, + media::VideoEncodeAccelerator::Config::ContentType> { + static media::mojom::VideoEncodeAcceleratorConfig::ContentType ToMojom( + media::VideoEncodeAccelerator::Config::ContentType input); + + static bool FromMojom( + media::mojom::VideoEncodeAcceleratorConfig::ContentType, + media::VideoEncodeAccelerator::Config::ContentType* output); +}; + +template <> struct StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, media::VideoEncodeAccelerator::Config> { static media::VideoPixelFormat input_format( @@ -118,6 +129,11 @@ return input.h264_output_level.has_value(); } + static media::VideoEncodeAccelerator::Config::ContentType content_type( + const media::VideoEncodeAccelerator::Config& input) { + return input.content_type; + } + static bool Read(media::mojom::VideoEncodeAcceleratorConfigDataView input, media::VideoEncodeAccelerator::Config* output); };
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc index fab176b..6b2bcd2 100644 --- a/media/mojo/services/gpu_mojo_media_client.cc +++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -120,7 +120,8 @@ #if defined(OS_WIN) if (base::FeatureList::IsEnabled(kD3D11VideoDecoder)) { return D3D11VideoDecoder::Create( - gpu_task_runner_, gpu_preferences_, gpu_workarounds_, + gpu_task_runner_, media_log->Clone(), gpu_preferences_, + gpu_workarounds_, base::BindRepeating(&GetCommandBufferStub, media_gpu_channel_manager_, command_buffer_id->channel_token, command_buffer_id->route_id));
diff --git a/media/video/video_encode_accelerator.cc b/media/video/video_encode_accelerator.cc index 64d9fce..e351e188 100644 --- a/media/video/video_encode_accelerator.cc +++ b/media/video/video_encode_accelerator.cc
@@ -27,7 +27,12 @@ timestamp(timestamp) {} BitstreamBufferMetadata::~BitstreamBufferMetadata() = default; -VideoEncodeAccelerator::Config::Config() = default; +VideoEncodeAccelerator::Config::Config() + : input_format(PIXEL_FORMAT_UNKNOWN), + output_profile(VIDEO_CODEC_PROFILE_UNKNOWN), + initial_bitrate(0), + content_type(ContentType::kCamera) {} + VideoEncodeAccelerator::Config::Config(const Config& config) = default; VideoEncodeAccelerator::Config::Config( @@ -36,13 +41,15 @@ VideoCodecProfile output_profile, uint32_t initial_bitrate, base::Optional<uint32_t> initial_framerate, - base::Optional<uint8_t> h264_output_level) + base::Optional<uint8_t> h264_output_level, + ContentType content_type) : input_format(input_format), input_visible_size(input_visible_size), output_profile(output_profile), initial_bitrate(initial_bitrate), initial_framerate(initial_framerate), - h264_output_level(h264_output_level) {} + h264_output_level(h264_output_level), + content_type(content_type) {} VideoEncodeAccelerator::Config::~Config() = default; @@ -80,6 +87,10 @@ std::move(flush_callback).Run(false); } +bool VideoEncodeAccelerator::IsFlushSupported() { + return false; +} + void VideoEncodeAccelerator::RequestEncodingParametersChange( const VideoBitrateAllocation& bitrate_allocation, uint32_t framerate) {
diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h index 58d6254e..2ea66e2 100644 --- a/media/video/video_encode_accelerator.h +++ b/media/video/video_encode_accelerator.h
@@ -95,6 +95,10 @@ // Parameters required for VEA initialization. struct MEDIA_EXPORT Config { + // Indicates if video content should be treated as a "normal" camera feed + // or as generated (e.g. screen capture). + enum class ContentType { kCamera, kDisplay }; + Config(); Config(const Config& config); @@ -103,7 +107,8 @@ VideoCodecProfile output_profile, uint32_t initial_bitrate, base::Optional<uint32_t> initial_framerate = base::nullopt, - base::Optional<uint8_t> h264_output_level = base::nullopt); + base::Optional<uint8_t> h264_output_level = base::nullopt, + ContentType content_type = ContentType::kCamera); ~Config(); @@ -133,6 +138,13 @@ // |h264_output_level|=9 for Level 1b, which should set level_idc to 11 and // constraint_set3_flag to 1. (Spec A.3.1 and A.3.2) base::Optional<uint8_t> h264_output_level; + + // Indicates captured video (from a camera) or generated (screen grabber). + // Screen content has a number of special properties such as lack of noise, + // burstiness of motion and requirements for readability of small text in + // bright colors. With this content hint the encoder may choose to optimize + // for the given use case. + ContentType content_type; }; // Interface for clients that use VideoEncodeAccelerator. These callbacks will @@ -242,6 +254,10 @@ // previous Flush() is not finished yet. virtual void Flush(FlushCallback flush_callback); + // Returns true if the encoder support flush. This method must be called after + // VEA has been initialized. + virtual bool IsFlushSupported(); + protected: // Do not delete directly; use Destroy() or own it with a scoped_ptr, which // will Destroy() it properly by default.
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/MojoTestRule.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/MojoTestRule.java index 7d40e13..68a6e6a 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/MojoTestRule.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/MojoTestRule.java
@@ -27,7 +27,7 @@ int INITIALIZE = 1; } - private static boolean sIsCoreInitialized = false; + private static boolean sIsCoreInitialized; private final boolean mShouldInitCore; private long mTestEnvironmentPointer;
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java index ac5cfb5..8efd2ad 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java
@@ -59,7 +59,7 @@ * {@link ConnectionErrorHandler} that records any error it received. */ public static class CapturingErrorHandler implements ConnectionErrorHandler { - private MojoException mLastMojoException = null; + private MojoException mLastMojoException; /** * @see ConnectionErrorHandler#onConnectionError(MojoException)
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java index fcd6121..96b6075 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java
@@ -37,9 +37,9 @@ * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom. */ class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor { - private long mValue = 0; - private int mEnum = 0; - private boolean mEncounteredError = false; + private long mValue; + private int mEnum; + private boolean mEncounteredError; /** * @see ConnectionErrorHandler#onConnectionError(MojoException)
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java index 4338739..468b1f49 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java
@@ -105,7 +105,7 @@ * Basic implementation of {@link Factory}. */ public class MockFactoryImpl extends CapturingErrorHandler implements Factory { - private boolean mClosed = false; + private boolean mClosed; public boolean isClosed() { return mClosed; @@ -156,7 +156,7 @@ * Implementation of DoStuffResponse that keeps track of if the response is called. */ public static class DoStuffResponseImpl implements Factory.DoStuffResponse { - private boolean mResponseCalled = false; + private boolean mResponseCalled; public boolean wasResponseCalled() { return mResponseCalled;
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni index 5c3c59f..f653481 100644 --- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni +++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -14,7 +14,6 @@ "//chromeos/services/device_sync/public/mojom/typemaps.gni", "//chromeos/services/secure_channel/public/mojom/typemaps.gni", "//components/arc/common/typemaps.gni", - "//components/metrics/public/cpp/typemaps.gni", "//components/sync/mojo/typemaps.gni", "//components/typemaps.gni", "//content/common/bluetooth/typemaps.gni",
diff --git a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java index 425f8a1..2cdeb96 100644 --- a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java +++ b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java
@@ -67,7 +67,7 @@ */ private static class NetworkChangeNotifierTestObserver implements NetworkChangeNotifier.ConnectionTypeObserver { - private boolean mReceivedNotification = false; + private boolean mReceivedNotification; @Override public void onConnectionTypeChanged(int connectionType) { @@ -100,7 +100,7 @@ mReceivedConnectionSubtypeNotification = false; } - private boolean mReceivedConnectionSubtypeNotification = false; + private boolean mReceivedConnectionSubtypeNotification; } private static class Helper {
diff --git a/net/dns/host_resolver_source.h b/net/dns/host_resolver_source.h index 4985dfc..96af9b2 100644 --- a/net/dns/host_resolver_source.h +++ b/net/dns/host_resolver_source.h
@@ -5,6 +5,8 @@ #ifndef NET_DNS_HOST_RESOLVER_SOURCE_H_ #define NET_DNS_HOST_RESOLVER_SOURCE_H_ +namespace net { + // Enumeration to specify the allowed results source for HostResolver // requests. enum class HostResolverSource { @@ -22,4 +24,6 @@ // TODO(crbug.com/846423): Add MDNS support. }; +} // namespace net + #endif // NET_DNS_HOST_RESOLVER_SOURCE_H_
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc index 9d33d4c..a7200ae6 100644 --- a/net/dns/mock_host_resolver.cc +++ b/net/dns/mock_host_resolver.cc
@@ -19,6 +19,8 @@ #include "base/strings/string_util.h" #include "base/threading/platform_thread.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/time/default_tick_clock.h" +#include "base/time/tick_clock.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" @@ -323,7 +325,8 @@ ondemand_mode_(false), next_request_id_(1), num_resolve_(0), - num_resolve_from_cache_(0) { + num_resolve_from_cache_(0), + tick_clock_(base::DefaultTickClock::GetInstance()) { rules_map_[HostResolverSource::ANY] = CreateCatchAllHostResolverProc(); rules_map_[HostResolverSource::SYSTEM] = CreateCatchAllHostResolverProc(); rules_map_[HostResolverSource::DNS] = CreateCatchAllHostResolverProc(); @@ -405,9 +408,9 @@ HostCache::Key key(host.host(), requested_address_family, flags, source); const HostCache::Entry* entry; if (stale_info) - entry = cache_->LookupStale(key, base::TimeTicks::Now(), stale_info); + entry = cache_->LookupStale(key, tick_clock_->NowTicks(), stale_info); else - entry = cache_->Lookup(key, base::TimeTicks::Now()); + entry = cache_->Lookup(key, tick_clock_->NowTicks()); if (entry) { rv = entry->error(); if (rv == OK) @@ -435,7 +438,7 @@ ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); cache_->Set(key, HostCache::Entry(rv, addr, HostCache::Entry::SOURCE_UNKNOWN), - base::TimeTicks::Now(), ttl); + tick_clock_->NowTicks(), ttl); } if (rv == OK) *addresses = AddressList::CopyWithPort(addr, host.port()); @@ -462,14 +465,13 @@ //----------------------------------------------------------------------------- -RuleBasedHostResolverProc::Rule::Rule( - ResolverType resolver_type, - const std::string& host_pattern, - AddressFamily address_family, - HostResolverFlags host_resolver_flags, - const std::string& replacement, - const std::string& canonical_name, - int latency_ms) +RuleBasedHostResolverProc::Rule::Rule(ResolverType resolver_type, + const std::string& host_pattern, + AddressFamily address_family, + HostResolverFlags host_resolver_flags, + const std::string& replacement, + const std::string& canonical_name, + int latency_ms) : resolver_type(resolver_type), host_pattern(host_pattern), address_family(address_family), @@ -495,14 +497,9 @@ const std::string& replacement) { DCHECK(!replacement.empty()); HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | - HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; - Rule rule(Rule::kResolverTypeSystem, - host_pattern, - address_family, - flags, - replacement, - std::string(), - 0); + HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; + Rule rule(Rule::kResolverTypeSystem, host_pattern, address_family, flags, + replacement, std::string(), 0); AddRuleInternal(rule); } @@ -526,7 +523,7 @@ IPAddress ip_address; DCHECK(!ip_address.AssignFromIPLiteral(host_pattern)); HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | - HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; + HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; if (!canonical_name.empty()) flags |= HOST_RESOLVER_CANONNAME; @@ -541,42 +538,27 @@ int latency_ms) { DCHECK(!replacement.empty()); HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | - HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; - Rule rule(Rule::kResolverTypeSystem, - host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, - flags, - replacement, - std::string(), - latency_ms); + HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; + Rule rule(Rule::kResolverTypeSystem, host_pattern, ADDRESS_FAMILY_UNSPECIFIED, + flags, replacement, std::string(), latency_ms); AddRuleInternal(rule); } void RuleBasedHostResolverProc::AllowDirectLookup( const std::string& host_pattern) { HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | - HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; - Rule rule(Rule::kResolverTypeSystem, - host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, - flags, - std::string(), - std::string(), - 0); + HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; + Rule rule(Rule::kResolverTypeSystem, host_pattern, ADDRESS_FAMILY_UNSPECIFIED, + flags, std::string(), std::string(), 0); AddRuleInternal(rule); } void RuleBasedHostResolverProc::AddSimulatedFailure( const std::string& host_pattern) { HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | - HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; - Rule rule(Rule::kResolverTypeFail, - host_pattern, - ADDRESS_FAMILY_UNSPECIFIED, - flags, - std::string(), - std::string(), - 0); + HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; + Rule rule(Rule::kResolverTypeFail, host_pattern, ADDRESS_FAMILY_UNSPECIFIED, + flags, std::string(), std::string(), 0); AddRuleInternal(rule); } @@ -637,10 +619,9 @@ #if defined(OS_WIN) EnsureWinsockInit(); #endif - return SystemHostResolverCall(effective_host, - address_family, - host_resolver_flags, - addrlist, os_error); + return SystemHostResolverCall(effective_host, address_family, + host_resolver_flags, addrlist, + os_error); case Rule::kResolverTypeIPLiteral: { AddressList raw_addr_list; int result = ParseAddressList( @@ -667,8 +648,8 @@ } } } - return ResolveUsingPrevious(host, address_family, - host_resolver_flags, addrlist, os_error); + return ResolveUsingPrevious(host, address_family, host_resolver_flags, + addrlist, os_error); } RuleBasedHostResolverProc::~RuleBasedHostResolverProc() = default;
diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h index 892025d..6874961 100644 --- a/net/dns/mock_host_resolver.h +++ b/net/dns/mock_host_resolver.h
@@ -22,6 +22,10 @@ #include "net/dns/host_resolver_proc.h" #include "net/dns/host_resolver_source.h" +namespace base { +class TickClock; +} // namespace base + namespace net { class HostCache; @@ -153,6 +157,10 @@ return last_request_priority_; } + void set_tick_clock(const base::TickClock* tick_clock) { + tick_clock_ = tick_clock; + } + protected: explicit MockHostResolverBase(bool use_caching); @@ -194,6 +202,8 @@ size_t num_resolve_; size_t num_resolve_from_cache_; + const base::TickClock* tick_clock_; + THREAD_CHECKER(thread_checker_); DISALLOW_COPY_AND_ASSIGN(MockHostResolverBase);
diff --git a/net/dns/serial_worker.cc b/net/dns/serial_worker.cc index f650605..815c0d8 100644 --- a/net/dns/serial_worker.cc +++ b/net/dns/serial_worker.cc
@@ -11,7 +11,7 @@ namespace net { -SerialWorker::SerialWorker() : state_(IDLE) {} +SerialWorker::SerialWorker() : state_(IDLE), weak_factory_(this) {} SerialWorker::~SerialWorker() = default; @@ -19,11 +19,16 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (state_) { case IDLE: + // We are posting weak pointer to OnWorkJobFinished to avoid leak when + // PostTaskWithTraitsAndReply fails to post task back to the original + // task runner. In this case the callback is not destroyed, and the + // weak reference allows SerialWorker instance to be deleted. base::PostTaskWithTraitsAndReply( FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, base::BindOnce(&SerialWorker::DoWork, this), - base::BindOnce(&SerialWorker::OnWorkJobFinished, this)); + base::BindOnce(&SerialWorker::OnWorkJobFinished, + weak_factory_.GetWeakPtr())); state_ = WORKING; return; case WORKING:
diff --git a/net/dns/serial_worker.h b/net/dns/serial_worker.h index 6d2571f..dd2a4f8 100644 --- a/net/dns/serial_worker.h +++ b/net/dns/serial_worker.h
@@ -10,6 +10,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/task/task_traits.h" #include "net/base/net_export.h" @@ -74,6 +75,8 @@ State state_; + base::WeakPtrFactory<SerialWorker> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(SerialWorker); };
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index acb1ef83..4e9c375f 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -57092,6 +57092,18 @@ { "name": "apprenticeship.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, { "name": "apprenticeships.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, { "name": "ai.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "cityofeastpointemi.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "cityofwadley-ga.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "elbaal.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "hig.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "joinamericacorps.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "mimm.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "mycolorado.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "republicmo.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "rincon-nsn.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "safemt.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "sequatchiecounty-tn.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, + { "name": "usagm.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, { "name": "bmoattachments.org", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true }, // END OF ETLD-OWNER REQUESTED ENTRIES
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h index 63029fb..ca1429f4 100644 --- a/net/log/net_log_event_type_list.h +++ b/net/log/net_log_event_type_list.h
@@ -1668,6 +1668,11 @@ // } EVENT_TYPE(QUIC_STREAM_FACTORY_JOB_CONNECT) +// This event indicates that the connection on the default network has failed +// before the handshake completed and a new connection on the alternate network +// will be attempted soon. +EVENT_TYPE(QUIC_STREAM_FACTORY_JOB_RETRY_ON_ALTERNATE_NETWORK) + // ------------------------------------------------------------------------ // quic::QuicSession // ------------------------------------------------------------------------
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index d23cb2a..c5aab4c 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -618,6 +618,9 @@ DCHECK(network_ != NetworkChangeNotifier::kInvalidNetworkHandle); network_ = factory_->FindAlternateNetwork(network_); if (network_ != NetworkChangeNotifier::kInvalidNetworkHandle) { + net_log_.AddEvent( + NetLogEventType:: + QUIC_STREAM_FACTORY_JOB_RETRY_ON_ALTERNATE_NETWORK); DVLOG(1) << "Retry connection on alternate network"; session_ = nullptr; io_state_ = STATE_CONNECT;
diff --git a/net/socket/tcp_server_socket.cc b/net/socket/tcp_server_socket.cc index 93d56c47..36b0090d 100644 --- a/net/socket/tcp_server_socket.cc +++ b/net/socket/tcp_server_socket.cc
@@ -16,34 +16,40 @@ namespace net { TCPServerSocket::TCPServerSocket(NetLog* net_log, const NetLogSource& source) - : socket_(nullptr, net_log, source), pending_accept_(false) {} + : TCPServerSocket( + std::make_unique<TCPSocket>(nullptr /* socket_performance_watcher */, + net_log, + source)) {} + +TCPServerSocket::TCPServerSocket(std::unique_ptr<TCPSocket> socket) + : socket_(std::move(socket)), pending_accept_(false) {} int TCPServerSocket::AdoptSocket(SocketDescriptor socket) { - return socket_.AdoptUnconnectedSocket(socket); + return socket_->AdoptUnconnectedSocket(socket); } TCPServerSocket::~TCPServerSocket() = default; int TCPServerSocket::Listen(const IPEndPoint& address, int backlog) { - int result = socket_.Open(address.GetFamily()); + int result = socket_->Open(address.GetFamily()); if (result != OK) return result; - result = socket_.SetDefaultOptionsForServer(); + result = socket_->SetDefaultOptionsForServer(); if (result != OK) { - socket_.Close(); + socket_->Close(); return result; } - result = socket_.Bind(address); + result = socket_->Bind(address); if (result != OK) { - socket_.Close(); + socket_->Close(); return result; } - result = socket_.Listen(backlog); + result = socket_->Listen(backlog); if (result != OK) { - socket_.Close(); + socket_->Close(); return result; } @@ -51,7 +57,7 @@ } int TCPServerSocket::GetLocalAddress(IPEndPoint* address) const { - return socket_.GetLocalAddress(address); + return socket_->GetLocalAddress(address); } int TCPServerSocket::Accept(std::unique_ptr<StreamSocket>* socket, @@ -69,8 +75,8 @@ CompletionOnceCallback accept_callback = base::BindOnce(&TCPServerSocket::OnAcceptCompleted, base::Unretained(this), socket, std::move(callback)); - int result = socket_.Accept(&accepted_socket_, &accepted_address_, - std::move(accept_callback)); + int result = socket_->Accept(&accepted_socket_, &accepted_address_, + std::move(accept_callback)); if (result != ERR_IO_PENDING) { // |accept_callback| won't be called so we need to run // ConvertAcceptedSocket() ourselves in order to do the conversion from @@ -84,7 +90,7 @@ } void TCPServerSocket::DetachFromThread() { - socket_.DetachFromThread(); + socket_->DetachFromThread(); } int TCPServerSocket::ConvertAcceptedSocket(
diff --git a/net/socket/tcp_server_socket.h b/net/socket/tcp_server_socket.h index 96a0bad..d8a204be 100644 --- a/net/socket/tcp_server_socket.h +++ b/net/socket/tcp_server_socket.h
@@ -24,6 +24,10 @@ class NET_EXPORT TCPServerSocket : public ServerSocket { public: TCPServerSocket(NetLog* net_log, const NetLogSource& source); + + // Adopts the provided socket, which must not be a connected socket. + explicit TCPServerSocket(std::unique_ptr<TCPSocket> socket); + ~TCPServerSocket() override; // Takes ownership of |socket|, which has been opened, but may or may not be @@ -56,7 +60,7 @@ CompletionOnceCallback forward_callback, int result); - TCPSocket socket_; + std::unique_ptr<TCPSocket> socket_; std::unique_ptr<TCPSocket> accepted_socket_; IPEndPoint accepted_address_;
diff --git a/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java b/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java index 87ccf4c1..82cf22b6 100644 --- a/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java +++ b/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java
@@ -268,7 +268,7 @@ void handleRequest(HTTPRequest request, OutputStream stream); } - private RequestHandler mRequestHandler = null; + private RequestHandler mRequestHandler; /** Sets the request handler. */ public void setRequestHandler(RequestHandler handler) {
diff --git a/net/tools/quic/synchronous_host_resolver.cc b/net/tools/quic/synchronous_host_resolver.cc index bcb2b761..75a21ad 100644 --- a/net/tools/quic/synchronous_host_resolver.cc +++ b/net/tools/quic/synchronous_host_resolver.cc
@@ -37,21 +37,17 @@ void Run() override; private: - void OnResolutionComplete(int rv); + void OnResolutionComplete(base::OnceClosure on_done, int rv); AddressList* addresses_; std::string host_; int rv_; - base::WeakPtrFactory<ResolverThread> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(ResolverThread); }; ResolverThread::ResolverThread() - : SimpleThread("resolver_thread"), - rv_(ERR_UNEXPECTED), - weak_factory_(this) {} + : SimpleThread("resolver_thread"), rv_(ERR_UNEXPECTED) {} ResolverThread::~ResolverThread() = default; @@ -67,17 +63,18 @@ std::unique_ptr<net::HostResolver::Request> request; HostPortPair host_port_pair(host_, 80); - rv_ = resolver->Resolve(HostResolver::RequestInfo(host_port_pair), - DEFAULT_PRIORITY, addresses_, - base::Bind(&ResolverThread::OnResolutionComplete, - weak_factory_.GetWeakPtr()), - &request, NetLogWithSource()); + base::RunLoop run_loop; + rv_ = resolver->Resolve( + HostResolver::RequestInfo(host_port_pair), DEFAULT_PRIORITY, addresses_, + base::Bind(&ResolverThread::OnResolutionComplete, base::Unretained(this), + run_loop.QuitClosure()), + &request, NetLogWithSource()); if (rv_ != ERR_IO_PENDING) return; // Run the mesage loop until OnResolutionComplete quits it. - base::RunLoop().Run(); + run_loop.Run(); } int ResolverThread::Resolve(const std::string& host, AddressList* addresses) { @@ -88,10 +85,9 @@ return rv_; } -void ResolverThread::OnResolutionComplete(int rv) { +void ResolverThread::OnResolutionComplete(base::OnceClosure on_done, int rv) { rv_ = rv; - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); + std::move(on_done).Run(); } } // namespace
diff --git a/net/tools/quic/synchronous_host_resolver.h b/net/tools/quic/synchronous_host_resolver.h index d41f0af..0b8777439 100644 --- a/net/tools/quic/synchronous_host_resolver.h +++ b/net/tools/quic/synchronous_host_resolver.h
@@ -12,7 +12,6 @@ namespace net { - class SynchronousHostResolver { public: static int Resolve(const std::string& host, AddressList* addresses);
diff --git a/pdf/pdfium/pdfium_mem_buffer_file_write.h b/pdf/pdfium/pdfium_mem_buffer_file_write.h index 03c54bb..82e82d2 100644 --- a/pdf/pdfium/pdfium_mem_buffer_file_write.h +++ b/pdf/pdfium/pdfium_mem_buffer_file_write.h
@@ -6,6 +6,7 @@ #define PDF_PDFIUM_PDFIUM_MEM_BUFFER_FILE_WRITE_H_ #include <stddef.h> +#include <stdint.h> #include <vector>
diff --git a/ppapi/BUILD.gn b/ppapi/BUILD.gn index 950eb43c..ddfc675 100644 --- a/ppapi/BUILD.gn +++ b/ppapi/BUILD.gn
@@ -131,12 +131,8 @@ "tests/test_var_resource.h", "tests/test_video_decoder.cc", "tests/test_video_decoder.h", - "tests/test_video_destination.cc", - "tests/test_video_destination.h", "tests/test_video_encoder.cc", "tests/test_video_encoder.h", - "tests/test_video_source.cc", - "tests/test_video_source.h", "tests/test_view.cc", "tests/test_view.h", "tests/test_websocket.cc",
diff --git a/ppapi/api/private/ppb_video_destination_private.idl b/ppapi/api/private/ppb_video_destination_private.idl deleted file mode 100644 index a37cbd5..0000000 --- a/ppapi/api/private/ppb_video_destination_private.idl +++ /dev/null
@@ -1,95 +0,0 @@ -/* Copyright (c) 2013 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/** - * This file defines the <code>PPB_VideoDestination_Private</code> interface - * for a video destination resource, which sends video frames to a MediaStream - * video track in the browser. - */ - - label Chrome { - M28 = 0.1 - }; - -/** - * The <code>PPB_VideoDestination_Private</code> interface contains pointers to - * several functions for creating video destination resources and using them to - * send video frames to a MediaStream video track in the browser. - */ -interface PPB_VideoDestination_Private { - /** - * Creates a video destination resource. - * - * @param[in] instance A <code>PP_Instance</code> identifying an instance of - * a module. - * - * @return A <code>PP_Resource</code> with a nonzero ID on success or zero on - * failure. Failure means the instance was invalid. - */ - PP_Resource Create([in] PP_Instance instance); - - /** - * Determines if a resource is a video destination resource. - * - * @param[in] resource The <code>PP_Resource</code> to test. - * - * @return A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given - * resource is a video destination resource or <code>PP_FALSE</code> - * otherwise. - */ - PP_Bool IsVideoDestination([in] PP_Resource resource); - - /** - * Opens a video destination for putting frames. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination resource. - * @param[in] stream_url A <code>PP_Var</code> string holding a URL - * identifying a MediaStream. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of Open(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - * destination. - * Returns PP_ERROR_INPROGRESS if destination is already open. - * Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - * some other browser error. - */ - int32_t Open([in] PP_Resource destination, - [in] PP_Var stream_url, - [in] PP_CompletionCallback callback); - - /** - * Puts a frame to the video destination. - * - * After this call, you should take care to release your references to the - * image embedded in the video frame. If you paint to the image after - * PutFame(), there is the possibility of artifacts because the browser may - * still be copying the frame to the stream. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination resource. - * @param[in] frame A <code>PP_VideoFrame_Private</code> holding the video - * frame to send to the destination. - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - * destination. - * Returns PP_ERROR_FAILED if destination is not open, if the video frame has - * an invalid image data resource, or if some other browser error occurs. - */ - int32_t PutFrame([in] PP_Resource destination, - [in] PP_VideoFrame_Private frame); - - /** - * Closes the video destination. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination. - */ - void Close([in] PP_Resource destination); -}; -
diff --git a/ppapi/api/private/ppb_video_source_private.idl b/ppapi/api/private/ppb_video_source_private.idl deleted file mode 100644 index e57eedd..0000000 --- a/ppapi/api/private/ppb_video_source_private.idl +++ /dev/null
@@ -1,93 +0,0 @@ -/* Copyright (c) 2013 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/** - * This file defines the <code>PPB_VideoSource_Private</code> interface for a - * video source resource, which receives video frames from a MediaStream video - * track in the browser. - */ - - label Chrome { - M28 = 0.1 - }; - -/** - * The <code>PPB_VideoSource_Private</code> interface contains pointers to - * several functions for creating video source resources and using them to - * receive video frames from a MediaStream video track in the browser. - */ -interface PPB_VideoSource_Private { - /** - * Creates a video source resource. - * - * @param[in] instance A <code>PP_Instance</code> identifying an instance of - * a module. - * - * @return A <code>PP_Resource</code> with a nonzero ID on success or zero on - * failure. Failure means the instance was invalid. - */ - PP_Resource Create([in] PP_Instance instance); - - /** - * Determines if a resource is a video source resource. - * - * @param[in] resource The <code>PP_Resource</code> to test. - * - * @return A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given - * resource is a video source resource or <code>PP_FALSE</code> otherwise. - */ - PP_Bool IsVideoSource([in] PP_Resource resource); - - /** - * Opens a video source for getting frames. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - * @param[in] stream_url A <code>PP_Var</code> string holding a URL - * identifying a MediaStream. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of Open(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - * Returns PP_ERROR_INPROGRESS if source is already open. - * Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - * some other browser error. - */ - int32_t Open([in] PP_Resource source, - [in] PP_Var stream_url, - [in] PP_CompletionCallback callback); - - /** - * Gets a frame from the video source. The returned image data is only valid - * until the next call to GetFrame. - * The image data resource inside the returned frame will have its reference - * count incremented by one and must be managed by the plugin. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - * @param[out] frame A <code>PP_VideoFrame_Private</code> to hold a video - * frame from the source. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of GetNextFrame(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - * Returns PP_ERROR_FAILED if the source is not open, or if some other - * browser error occurs. - */ - int32_t GetFrame([in] PP_Resource source, - [out] PP_VideoFrame_Private frame, - [in] PP_CompletionCallback callback); - - /** - * Closes the video source. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - */ - void Close([in] PP_Resource source); -}; -
diff --git a/ppapi/c/BUILD.gn b/ppapi/c/BUILD.gn index c2db534..8c23e16 100644 --- a/ppapi/c/BUILD.gn +++ b/ppapi/c/BUILD.gn
@@ -143,8 +143,6 @@ "private/ppb_testing_private.h", "private/ppb_udp_socket_private.h", "private/ppb_uma_private.h", - "private/ppb_video_destination_private.h", - "private/ppb_video_source_private.h", "private/ppb_x509_certificate_private.h", "private/ppp_find_private.h", "private/ppp_flash_browser_operations.h",
diff --git a/ppapi/c/private/ppb_video_destination_private.h b/ppapi/c/private/ppb_video_destination_private.h deleted file mode 100644 index 775ec961..0000000 --- a/ppapi/c/private/ppb_video_destination_private.h +++ /dev/null
@@ -1,122 +0,0 @@ -/* Copyright (c) 2013 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* From private/ppb_video_destination_private.idl, - * modified Thu Apr 25 11:51:30 2013. - */ - -#ifndef PPAPI_C_PRIVATE_PPB_VIDEO_DESTINATION_PRIVATE_H_ -#define PPAPI_C_PRIVATE_PPB_VIDEO_DESTINATION_PRIVATE_H_ - -#include "ppapi/c/pp_bool.h" -#include "ppapi/c/pp_completion_callback.h" -#include "ppapi/c/pp_instance.h" -#include "ppapi/c/pp_macros.h" -#include "ppapi/c/pp_resource.h" -#include "ppapi/c/pp_stdint.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/c/pp_var.h" -#include "ppapi/c/private/pp_video_frame_private.h" - -#define PPB_VIDEODESTINATION_PRIVATE_INTERFACE_0_1 \ - "PPB_VideoDestination_Private;0.1" -#define PPB_VIDEODESTINATION_PRIVATE_INTERFACE \ - PPB_VIDEODESTINATION_PRIVATE_INTERFACE_0_1 - -/** - * @file - * This file defines the <code>PPB_VideoDestination_Private</code> interface - * for a video destination resource, which sends video frames to a MediaStream - * video track in the browser. - */ - - -/** - * @addtogroup Interfaces - * @{ - */ -/** - * The <code>PPB_VideoDestination_Private</code> interface contains pointers to - * several functions for creating video destination resources and using them to - * send video frames to a MediaStream video track in the browser. - */ -struct PPB_VideoDestination_Private_0_1 { - /** - * Creates a video destination resource. - * - * @param[in] instance A <code>PP_Instance</code> identifying an instance of - * a module. - * - * @return A <code>PP_Resource</code> with a nonzero ID on success or zero on - * failure. Failure means the instance was invalid. - */ - PP_Resource (*Create)(PP_Instance instance); - /** - * Determines if a resource is a video destination resource. - * - * @param[in] resource The <code>PP_Resource</code> to test. - * - * @return A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given - * resource is a video destination resource or <code>PP_FALSE</code> - * otherwise. - */ - PP_Bool (*IsVideoDestination)(PP_Resource resource); - /** - * Opens a video destination for putting frames. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination resource. - * @param[in] stream_url A <code>PP_Var</code> string holding a URL - * identifying a MediaStream. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of Open(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - * destination. - * Returns PP_ERROR_INPROGRESS if destination is already open. - * Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - * some other browser error. - */ - int32_t (*Open)(PP_Resource destination, - struct PP_Var stream_url, - struct PP_CompletionCallback callback); - /** - * Puts a frame to the video destination. - * - * After this call, you should take care to release your references to the - * image embedded in the video frame. If you paint to the image after - * PutFame(), there is the possibility of artifacts because the browser may - * still be copying the frame to the stream. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination resource. - * @param[in] frame A <code>PP_VideoFrame_Private</code> holding the video - * frame to send to the destination. - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - * destination. - * Returns PP_ERROR_FAILED if destination is not open, if the video frame has - * an invalid image data resource, or if some other browser error occurs. - */ - int32_t (*PutFrame)(PP_Resource destination, - const struct PP_VideoFrame_Private* frame); - /** - * Closes the video destination. - * - * @param[in] destination A <code>PP_Resource</code> corresponding to a video - * destination. - */ - void (*Close)(PP_Resource destination); -}; - -typedef struct PPB_VideoDestination_Private_0_1 PPB_VideoDestination_Private; -/** - * @} - */ - -#endif /* PPAPI_C_PRIVATE_PPB_VIDEO_DESTINATION_PRIVATE_H_ */ -
diff --git a/ppapi/c/private/ppb_video_source_private.h b/ppapi/c/private/ppb_video_source_private.h deleted file mode 100644 index e2c715b..0000000 --- a/ppapi/c/private/ppb_video_source_private.h +++ /dev/null
@@ -1,118 +0,0 @@ -/* Copyright (c) 2013 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* From private/ppb_video_source_private.idl, - * modified Mon Oct 27 16:13:24 2014. - */ - -#ifndef PPAPI_C_PRIVATE_PPB_VIDEO_SOURCE_PRIVATE_H_ -#define PPAPI_C_PRIVATE_PPB_VIDEO_SOURCE_PRIVATE_H_ - -#include "ppapi/c/pp_bool.h" -#include "ppapi/c/pp_completion_callback.h" -#include "ppapi/c/pp_instance.h" -#include "ppapi/c/pp_macros.h" -#include "ppapi/c/pp_resource.h" -#include "ppapi/c/pp_stdint.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/c/pp_var.h" -#include "ppapi/c/private/pp_video_frame_private.h" - -#define PPB_VIDEOSOURCE_PRIVATE_INTERFACE_0_1 "PPB_VideoSource_Private;0.1" -#define PPB_VIDEOSOURCE_PRIVATE_INTERFACE PPB_VIDEOSOURCE_PRIVATE_INTERFACE_0_1 - -/** - * @file - * This file defines the <code>PPB_VideoSource_Private</code> interface for a - * video source resource, which receives video frames from a MediaStream video - * track in the browser. - */ - - -/** - * @addtogroup Interfaces - * @{ - */ -/** - * The <code>PPB_VideoSource_Private</code> interface contains pointers to - * several functions for creating video source resources and using them to - * receive video frames from a MediaStream video track in the browser. - */ -struct PPB_VideoSource_Private_0_1 { - /** - * Creates a video source resource. - * - * @param[in] instance A <code>PP_Instance</code> identifying an instance of - * a module. - * - * @return A <code>PP_Resource</code> with a nonzero ID on success or zero on - * failure. Failure means the instance was invalid. - */ - PP_Resource (*Create)(PP_Instance instance); - /** - * Determines if a resource is a video source resource. - * - * @param[in] resource The <code>PP_Resource</code> to test. - * - * @return A <code>PP_Bool</code> with <code>PP_TRUE</code> if the given - * resource is a video source resource or <code>PP_FALSE</code> otherwise. - */ - PP_Bool (*IsVideoSource)(PP_Resource resource); - /** - * Opens a video source for getting frames. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - * @param[in] stream_url A <code>PP_Var</code> string holding a URL - * identifying a MediaStream. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of Open(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - * Returns PP_ERROR_INPROGRESS if source is already open. - * Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - * some other browser error. - */ - int32_t (*Open)(PP_Resource source, - struct PP_Var stream_url, - struct PP_CompletionCallback callback); - /** - * Gets a frame from the video source. The returned image data is only valid - * until the next call to GetFrame. - * The image data resource inside the returned frame will have its reference - * count incremented by one and must be managed by the plugin. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - * @param[out] frame A <code>PP_VideoFrame_Private</code> to hold a video - * frame from the source. - * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon - * completion of GetNextFrame(). - * - * @return An int32_t containing a result code from <code>pp_errors.h</code>. - * Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - * Returns PP_ERROR_FAILED if the source is not open, or if some other - * browser error occurs. - */ - int32_t (*GetFrame)(PP_Resource source, - struct PP_VideoFrame_Private* frame, - struct PP_CompletionCallback callback); - /** - * Closes the video source. - * - * @param[in] source A <code>PP_Resource</code> corresponding to a video - * source resource. - */ - void (*Close)(PP_Resource source); -}; - -typedef struct PPB_VideoSource_Private_0_1 PPB_VideoSource_Private; -/** - * @} - */ - -#endif /* PPAPI_C_PRIVATE_PPB_VIDEO_SOURCE_PRIVATE_H_ */ -
diff --git a/ppapi/cpp/BUILD.gn b/ppapi/cpp/BUILD.gn index fa74c3f..a5d692b 100644 --- a/ppapi/cpp/BUILD.gn +++ b/ppapi/cpp/BUILD.gn
@@ -250,12 +250,8 @@ "private/uma_private.h", "private/var_private.cc", "private/var_private.h", - "private/video_destination_private.cc", - "private/video_destination_private.h", "private/video_frame_private.cc", "private/video_frame_private.h", - "private/video_source_private.cc", - "private/video_source_private.h", "private/x509_certificate_private.cc", "private/x509_certificate_private.h",
diff --git a/ppapi/cpp/private/video_destination_private.cc b/ppapi/cpp/private/video_destination_private.cc deleted file mode 100644 index 5233b5f0..0000000 --- a/ppapi/cpp/private/video_destination_private.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/cpp/private/video_destination_private.h" - -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/cpp/instance_handle.h" -#include "ppapi/cpp/module.h" -#include "ppapi/cpp/module_impl.h" -#include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/var.h" - -namespace pp { - -namespace { - -template <> const char* interface_name<PPB_VideoDestination_Private_0_1>() { - return PPB_VIDEODESTINATION_PRIVATE_INTERFACE_0_1; -} - -} // namespace - -VideoDestination_Private::VideoDestination_Private() { -} - -VideoDestination_Private::VideoDestination_Private( - const InstanceHandle& instance) { - if (!has_interface<PPB_VideoDestination_Private_0_1>()) - return; - PassRefFromConstructor( - get_interface<PPB_VideoDestination_Private_0_1>()->Create( - instance.pp_instance())); -} - -VideoDestination_Private::VideoDestination_Private( - const VideoDestination_Private& other) - : Resource(other) { -} - -VideoDestination_Private::VideoDestination_Private(PassRef, - PP_Resource resource) - : Resource(PASS_REF, resource) { -} - -int32_t VideoDestination_Private::Open(const Var& stream_url, - const CompletionCallback& cc) { - if (has_interface<PPB_VideoDestination_Private_0_1>()) { - int32_t result = - get_interface<PPB_VideoDestination_Private_0_1>()->Open( - pp_resource(), - stream_url.pp_var(), - cc.pp_completion_callback()); - return result; - } - return cc.MayForce(PP_ERROR_NOINTERFACE); -} - -int32_t VideoDestination_Private::PutFrame( - const VideoFrame_Private& frame) { - if (has_interface<PPB_VideoDestination_Private_0_1>()) { - return get_interface<PPB_VideoDestination_Private_0_1>()->PutFrame( - pp_resource(), - &frame.pp_video_frame()); - } - return PP_ERROR_NOINTERFACE; -} - -void VideoDestination_Private::Close() { - if (has_interface<PPB_VideoDestination_Private_0_1>()) { - get_interface<PPB_VideoDestination_Private_0_1>()->Close(pp_resource()); - } -} - -} // namespace pp
diff --git a/ppapi/cpp/private/video_destination_private.h b/ppapi/cpp/private/video_destination_private.h deleted file mode 100644 index 7e2bd5b..0000000 --- a/ppapi/cpp/private/video_destination_private.h +++ /dev/null
@@ -1,89 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_CPP_PRIVATE_VIDEO_DESTINATION_PRIVATE_H_ -#define PPAPI_CPP_PRIVATE_VIDEO_DESTINATION_PRIVATE_H_ - -#include <stdint.h> - -#include <string> - -#include "ppapi/c/pp_time.h" -#include "ppapi/cpp/completion_callback.h" -#include "ppapi/cpp/pass_ref.h" -#include "ppapi/cpp/resource.h" - -/// @file -/// This file defines the <code>PPB_VideoDestination_Private</code> interface -/// for a video destination resource, which sends video frames to a MediaStream -/// video track in the browser. - -namespace pp { - -class InstanceHandle; -class VideoFrame_Private; - -/// The <code>VideoDestination_Private</code> class contains methods for -/// creating video destination resources and using them to send video frames to -/// a MediaStream video track in the browser. -class VideoDestination_Private : public Resource { - public: - /// Default constructor for creating a <code>VideoDestination_Private</code> - /// object. - VideoDestination_Private(); - - /// Constructor for creating a <code>VideoDestination_Private</code> for an - /// instance. - explicit VideoDestination_Private(const InstanceHandle& instance); - - /// The copy constructor for <code>VideoDestination_Private</code>. - /// - /// @param[in] other A reference to a <code>VideoDestination_Private</code>. - VideoDestination_Private(const VideoDestination_Private& other); - - /// A constructor used when you have received a PP_Resource as a return - /// value that has had its reference count incremented for you. - /// - /// @param[in] resource A PP_Resource corresponding to a video destination. - VideoDestination_Private(PassRef, PP_Resource resource); - - /// Opens a video destination for putting frames. - /// - /// @param[in] stream_url A <code>Var</code> string holding a URL identifying - /// a MediaStream. - /// @param[in] callback A <code>CompletionCallback</code> to be - /// called upon completion of Open(). - /// - /// @return An int32_t containing a result code from <code>pp_errors.h</code>. - /// Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - /// destination. - /// Returns PP_ERROR_INPROGRESS if destination is already open. - /// Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - /// some other browser error. - int32_t Open(const Var& stream_url, const CompletionCallback& cc); - - /// Puts a frame to the video destination. - /// - /// After this call, you should take care to release your references to the - /// image embedded in the video frame. If you paint to the image after - /// PutFrame(), there is the possibility of artifacts because the browser may - /// still be copying the frame to the stream. - /// - /// @param[in] frame A <code>VideoFrame_Private</code> holding the video - /// frame to send to the destination. - /// - /// @return An int32_t containing a result code from <code>pp_errors.h</code>. - /// Returns PP_ERROR_BADRESOURCE if destination isn't a valid video - /// destination. - /// Returns PP_ERROR_FAILED if destination is not open, if the video frame has - /// an invalid image data resource, or if some other browser error occurs. - int32_t PutFrame(const VideoFrame_Private& frame); - - /// Closes the video destination. - void Close(); -}; - -} // namespace pp - -#endif // PPAPI_CPP_PRIVATE_VIDEO_DESTINATION_PRIVATE_H_
diff --git a/ppapi/cpp/private/video_source_private.cc b/ppapi/cpp/private/video_source_private.cc deleted file mode 100644 index 264c001..0000000 --- a/ppapi/cpp/private/video_source_private.cc +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/cpp/private/video_source_private.h" - -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/ppb_video_source_private.h" -#include "ppapi/cpp/instance_handle.h" -#include "ppapi/cpp/module.h" -#include "ppapi/cpp/module_impl.h" -#include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/var.h" - -namespace pp { - -namespace { - -template <> const char* interface_name<PPB_VideoSource_Private_0_1>() { - return PPB_VIDEOSOURCE_PRIVATE_INTERFACE_0_1; -} - -} // namespace - -VideoSource_Private::VideoSource_Private() { -} - -VideoSource_Private::VideoSource_Private(const InstanceHandle& instance) { - if (!has_interface<PPB_VideoSource_Private_0_1>()) - return; - PassRefFromConstructor(get_interface<PPB_VideoSource_Private_0_1>()->Create( - instance.pp_instance())); -} - -VideoSource_Private::VideoSource_Private(const VideoSource_Private& other) - : Resource(other) { -} - -VideoSource_Private::VideoSource_Private(PassRef, PP_Resource resource) - : Resource(PASS_REF, resource) { -} - -int32_t VideoSource_Private::Open(const Var& stream_url, - const CompletionCallback& cc) { - if (has_interface<PPB_VideoSource_Private_0_1>()) { - int32_t result = - get_interface<PPB_VideoSource_Private_0_1>()->Open( - pp_resource(), - stream_url.pp_var(), cc.pp_completion_callback()); - return result; - } - return cc.MayForce(PP_ERROR_NOINTERFACE); -} - -int32_t VideoSource_Private::GetFrame( - const CompletionCallbackWithOutput<VideoFrame_Private>& cc) { - if (has_interface<PPB_VideoSource_Private_0_1>()) { - return get_interface<PPB_VideoSource_Private_0_1>()->GetFrame( - pp_resource(), - cc.output(), cc.pp_completion_callback()); - } - return cc.MayForce(PP_ERROR_NOINTERFACE); -} - -void VideoSource_Private::Close() { - if (has_interface<PPB_VideoSource_Private_0_1>()) { - get_interface<PPB_VideoSource_Private_0_1>()->Close(pp_resource()); - } -} - -} // namespace pp
diff --git a/ppapi/cpp/private/video_source_private.h b/ppapi/cpp/private/video_source_private.h deleted file mode 100644 index b62e030..0000000 --- a/ppapi/cpp/private/video_source_private.h +++ /dev/null
@@ -1,87 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_CPP_PRIVATE_VIDEO_SOURCE_PRIVATE_H_ -#define PPAPI_CPP_PRIVATE_VIDEO_SOURCE_PRIVATE_H_ - -#include <stdint.h> - -#include <string> - -#include "ppapi/c/pp_time.h" -#include "ppapi/cpp/completion_callback.h" -#include "ppapi/cpp/pass_ref.h" -#include "ppapi/cpp/resource.h" - -/// @file -/// This file defines the <code>PPB_VideoSource_Private</code> interface for a -/// video source resource, which receives video frames from a MediaStream video -/// track in the browser. - -namespace pp { - -class InstanceHandle; -class VideoFrame_Private; - -/// The <code>VideoSource_Private</code> class contains methods for creating -/// video source resources and using them to receive video frames from a -/// MediaStream video track in the browser. -class VideoSource_Private : public Resource { - public: - /// Default constructor for creating a <code>VideoSource_Private</code> - /// object. - VideoSource_Private(); - - /// Constructor for creating a <code>VideoSource_Private</code> for an - /// instance. - explicit VideoSource_Private(const InstanceHandle& instance); - - /// The copy constructor for <code>VideoSource_Private</code>. - /// - /// @param[in] other A reference to a <code>VideoSource_Private</code>. - VideoSource_Private(const VideoSource_Private& other); - - /// A constructor used when you have received a PP_Resource as a return - /// value that has had its reference count incremented for you. - /// - /// @param[in] resource A PP_Resource corresponding to a video source. - VideoSource_Private(PassRef, PP_Resource resource); - - /// Opens a video source for getting frames. - /// - /// @param[in] stream_url A <code>Var</code> string holding a URL identifying - /// a MediaStream. - /// @param[in] callback A <code>CompletionCallback</code> to be called upon - /// completion of Open(). - /// - /// @return An int32_t containing a result code from <code>pp_errors.h</code>. - /// Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - /// Returns PP_ERROR_INPROGRESS if source is already open. - /// Returns PP_ERROR_FAILED if the MediaStream doesn't exist or if there is - /// some other browser error. - int32_t Open(const Var& stream_url, - const CompletionCallback& cc); - - /// Gets a frame from the video source. The returned frame is only valid - /// until the next call to GetFrame. - /// - /// @param[out] frame A <code>VideoFrame_Private</code> to hold a video - /// frame from the source. - /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be - /// called upon completion of ReceiveFrame(). - /// - /// @return An int32_t containing a result code from <code>pp_errors.h</code>. - /// Returns PP_ERROR_BADRESOURCE if source isn't a valid video source. - /// Returns PP_ERROR_FAILED if the source is not open, or if some other - /// browser error occurs. - int32_t GetFrame( - const CompletionCallbackWithOutput<VideoFrame_Private>& cc); - - /// Closes the video source. - void Close(); -}; - -} // namespace pp - -#endif // PPAPI_CPP_PRIVATE_VIDEO_SOURCE_PRIVATE_H_
diff --git a/ppapi/examples/BUILD.gn b/ppapi/examples/BUILD.gn index 65eb4645..b80d5f93 100644 --- a/ppapi/examples/BUILD.gn +++ b/ppapi/examples/BUILD.gn
@@ -32,7 +32,6 @@ "//ppapi/examples/url_loader", "//ppapi/examples/video_capture", "//ppapi/examples/video_decode", - "//ppapi/examples/video_effects", "//ppapi/examples/video_encode", ] }
diff --git a/ppapi/examples/video_effects/BUILD.gn b/ppapi/examples/video_effects/BUILD.gn deleted file mode 100644 index a93a08d..0000000 --- a/ppapi/examples/video_effects/BUILD.gn +++ /dev/null
@@ -1,15 +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. - -import("//ppapi/examples/ppapi_example.gni") - -ppapi_example("video_effects") { - output_name = "video_effects" - sources = [ - "video_effects.cc", - ] - deps = [ - "//ppapi/cpp", - ] -}
diff --git a/ppapi/examples/video_effects/video_effects.cc b/ppapi/examples/video_effects/video_effects.cc deleted file mode 100644 index ab6dc35..0000000 --- a/ppapi/examples/video_effects/video_effects.cc +++ /dev/null
@@ -1,180 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdint.h> -#include <string.h> -#include <iterator> -#include <sstream> -#include <string> -#include <vector> - -#include "ppapi/c/pp_errors.h" -#include "ppapi/cpp/instance.h" -#include "ppapi/cpp/message_loop.h" -#include "ppapi/cpp/module.h" -#include "ppapi/cpp/private/video_destination_private.h" -#include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/private/video_source_private.h" -#include "ppapi/cpp/var.h" -#include "ppapi/utility/completion_callback_factory.h" - -// When compiling natively on Windows, PostMessage can be #define-d to -// something else. -#ifdef PostMessage -#undef PostMessage -#endif - -namespace { - -// Helper functions -std::vector<std::string> SplitStringBySpace(const std::string& str) { - std::istringstream buf(str); - std::istream_iterator<std::string> begin(buf), end; - std::vector<std::string> tokens(begin, end); - return tokens; -} - -// This object is the global object representing this plugin library as long -// as it is loaded. -class VEDemoModule : public pp::Module { - public: - VEDemoModule() : pp::Module() {} - virtual ~VEDemoModule() {} - - virtual pp::Instance* CreateInstance(PP_Instance instance); -}; - -class VEDemoInstance : public pp::Instance { - public: - VEDemoInstance(PP_Instance instance, pp::Module* module); - virtual ~VEDemoInstance(); - - // pp::Instance implementation (see PPP_Instance). - virtual void HandleMessage(const pp::Var& message_data); - - private: - void DestinationOpenDone(int32_t result, const std::string& src_url); - void SourceOpenDone(int32_t result); - void GetFrameDone(int32_t result, pp::VideoFrame_Private video_frame); - void KickoffEffect(int32_t result); - pp::VideoSource_Private video_source_; - pp::VideoDestination_Private video_destination_; - bool effect_on_; - pp::CompletionCallbackFactory<VEDemoInstance> factory_; - pp::MessageLoop message_loop_; -}; - -VEDemoInstance::VEDemoInstance(PP_Instance instance, pp::Module* module) - : pp::Instance(instance), - video_source_(this), - video_destination_(this), - effect_on_(false), - message_loop_(pp::MessageLoop::GetCurrent()) { - factory_.Initialize(this); -} - -VEDemoInstance::~VEDemoInstance() { - video_source_.Close(); - video_destination_.Close(); -} - -void VEDemoInstance::HandleMessage(const pp::Var& message_data) { - if (message_data.is_string()) { - std::vector<std::string> messages; - messages = SplitStringBySpace(message_data.AsString()); - if (messages.empty()) { - PostMessage(pp::Var("Ignored empty message.")); - return; - } - if (messages[0] == "registerStream") { - if (messages.size() < 3) { - PostMessage(pp::Var("Got 'registerStream' with incorrect parameters.")); - return; - } - // Open destination stream for write. - video_destination_.Open( - messages[2], - factory_.NewCallback(&VEDemoInstance::DestinationOpenDone, - messages[1])); - } else if (messages[0] == "effectOn") { - effect_on_ = true; - PostMessage(pp::Var("Effect ON.")); - } else if (messages[0] == "effectOff") { - effect_on_ = false; - PostMessage(pp::Var("Effect OFF.")); - } - } -} - -void VEDemoInstance::DestinationOpenDone(int32_t result, - const std::string& src_url) { - if (result != PP_OK) { - PostMessage(pp::Var("Failed to open destination stream.")); - return; - } - // Open source stream for read. - video_source_.Open(src_url, - factory_.NewCallback(&VEDemoInstance::SourceOpenDone)); -} - -void VEDemoInstance::SourceOpenDone(int32_t result) { - if (result != PP_OK) { - PostMessage(pp::Var("Failed to open source stream.")); - return; - } - // Done with the stream register. - PostMessage(pp::Var("DoneRegistering")); - - // Kick off the processing loop. - message_loop_.PostWork(factory_.NewCallback(&VEDemoInstance::KickoffEffect)); -} - -void VEDemoInstance::GetFrameDone(int32_t result, - pp::VideoFrame_Private video_frame) { - if (result != PP_OK) { - PostMessage(pp::Var("Failed to get frame.")); - return; - } - - // Apply the effect to the received frame. - if (effect_on_) { - pp::ImageData image_data = video_frame.image_data(); - pp::Size size = image_data.size(); - std::vector<uint8_t> tmp_row(image_data.stride()); - uint8_t* image = static_cast<uint8_t*>(image_data.data()); - for (int i = 0; i < size.height() / 2; ++i) { - uint8_t* top = image + i * image_data.stride(); - uint8_t* bottom = image + (size.height() - 1 - i) * image_data.stride(); - memcpy(&tmp_row[0], top, image_data.stride()); - memcpy(top, bottom, image_data.stride()); - memcpy(bottom, &tmp_row[0], image_data.stride()); - } - } - - // Put frame back to destination stream - video_destination_.PutFrame(video_frame); - - // Trigger for the next frame. - message_loop_.PostWork(factory_.NewCallback(&VEDemoInstance::KickoffEffect)); -} - -void VEDemoInstance::KickoffEffect(int32_t /* result */) { - // Get the frame from the source stream. - video_source_.GetFrame( - factory_.NewCallbackWithOutput<pp::VideoFrame_Private>( - &VEDemoInstance::GetFrameDone)); -} - -pp::Instance* VEDemoModule::CreateInstance(PP_Instance instance) { - return new VEDemoInstance(instance, this); -} - -} // anonymous namespace - -namespace pp { -// Factory function for your specialization of the Module object. -Module* CreateModule() { - return new VEDemoModule(); -} -} // namespace pp
diff --git a/ppapi/examples/video_effects/video_effects.html b/ppapi/examples/video_effects/video_effects.html deleted file mode 100644 index a1128c0a..0000000 --- a/ppapi/examples/video_effects/video_effects.html +++ /dev/null
@@ -1,205 +0,0 @@ -<!DOCTYPE html> -<html> - <!-- - Copyright (c) 2013 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. - --> -<head> -<title>Video Effects Demo</title> -<style> -video { - border:5px solid black; - width:480px; - height:360px; -} -button { - font: 18px sans-serif; - padding: 8px; -} -textarea { - font-family: monospace; - margin: 2px; - width:480px; - height:640px; -} -</style> -</head> -<body> -<table> -<tr> -<td><video id="vidlocal" autoplay></video></td> -<td><video id="vidprocessedlocal" autoplay></video></td> -<td><video id="vidremote" autoplay></video></td> -</tr> -<tr> -<td>Local Media Stream</td> -<td>Local Media Stream After Effect</td> -<td>Remote Media Stream</td> -</tr> -<tr> -</table> -<br> -<button id="startButton" onclick="start()">Start</button> -<button id="toggleEffectButton" onclick="toggleEffect()">Enable Effect</button> -<button id="callButton" onclick="call()">Call</button> -<button id="hangupButton" onclick="hangup()">Hang Up</button> -<br> -<embed id="plugin" type="application/x-ppapi-example-video-effects" - width="320" height="240"/> - -<script> -var getUserMedia = navigator.webkitGetUserMedia.bind(navigator); -var attachMediaStream = function(element, stream) { - element.srcObject = stream; -}; -var startButton = document.getElementById('startButton'); -var toggleEffectButton = document.getElementById('toggleEffectButton'); -var callButton = document.getElementById('callButton'); -var hangupButton = document.getElementById('hangupButton'); - -callButton.disabled = true; -hangupButton.disabled = true; -toggleEffectButton.disabled = true; -var pc1 = null; -var pc2 = null; -var localstream = null; -var processedLocalstream = null; -var effectsPlugin = null; -var effectsEnabled = false; - -function trace(text) { - // This function is used for logging. - if (text[text.length - 1] == '\n') { - text = text.substring(0, text.length - 1); - } - console.log((performance.now() / 1000).toFixed(3) + ": " + text); -} - -function gotStream(stream){ - trace("Received local stream"); - // Call the polyfill wrapper to attach the media stream to this element. - attachMediaStream(vidlocal, stream); - localstream = stream; - callButton.disabled = false; - initEffect(); -} - -function start() { - trace("Requesting local stream"); - startButton.disabled = true; - // Call into getUserMedia via the polyfill (adapter.js). - getUserMedia({audio:false, video:true}, - gotStream, function() {}); -} - -function onRegisterStreamDone() { - vidprocessedlocal.srcObject = processedLocalstream; - toggleEffectButton.disabled = false; -} - -function HandleMessage(message_event) { - if (message_event.data) { - if (message_event.data == 'DoneRegistering') { - onRegisterStreamDone(); - } else { - trace(message_event.data); - } - } -} - -function initEffect() { - var url = URL.createObjectURL(localstream); - processedLocalstream = new MediaStream([]); - var processedStreamUrl = URL.createObjectURL(processedLocalstream); - effectsPlugin.postMessage( - 'registerStream' + ' ' + url + ' ' + processedStreamUrl); -} - -function toggleEffect() { - effectsEnabled = !effectsEnabled; - if (effectsEnabled) { - toggleEffectButton.innerHTML = 'Disable Effect'; - effectsPlugin.postMessage('effectOn'); - } else { - toggleEffectButton.innerHTML = 'Enable Effect'; - effectsPlugin.postMessage('effectOff'); - } -} - -function call() { - callButton.disabled = true; - hangupButton.disabled = false; - trace("Starting call"); - var servers = null; - pc1 = new RTCPeerConnection(servers); - trace("Created local peer connection object pc1"); - pc1.onicecandidate = iceCallback1; - pc2 = new RTCPeerConnection(servers); - trace("Created remote peer connection object pc2"); - pc2.onicecandidate = iceCallback2; - pc2.onaddstream = gotRemoteStream; - - pc1.addStream(processedLocalstream); - trace("Adding Local Stream to peer connection"); - - pc1.createOffer(gotDescription1); -} - -function gotDescription1(desc){ - pc1.setLocalDescription(desc); - trace("Offer from pc1 \n" + desc.sdp); - pc2.setRemoteDescription(desc); - // Since the "remote" side has no media stream we need - // to pass in the right constraints in order for it to - // accept the incoming offer of audio and video. - var sdpConstraints = {'mandatory': { - 'OfferToReceiveAudio':true, - 'OfferToReceiveVideo':true }}; - pc2.createAnswer(gotDescription2, null, sdpConstraints); -} - -function gotDescription2(desc){ - pc2.setLocalDescription(desc); - trace("Answer from pc2 \n" + desc.sdp); - pc1.setRemoteDescription(desc); -} - -function hangup() { - trace("Ending call"); - pc1.close(); - pc2.close(); - pc1 = null; - pc2 = null; - hangupButton.disabled = true; - callButton.disabled = false; -} - -function gotRemoteStream(e){ - vidremote.srcObject = e.stream; - trace("Received remote stream"); -} - -function iceCallback1(event){ - if (event.candidate) { - pc2.addIceCandidate(new RTCIceCandidate(event.candidate)); - trace("Local ICE candidate: \n" + event.candidate.candidate); - } -} - -function iceCallback2(event){ - if (event.candidate) { - pc1.addIceCandidate(new RTCIceCandidate(event.candidate)); - trace("Remote ICE candidate: \n " + event.candidate.candidate); - } -} - -function InitializePlugin() { - effectsPlugin = document.getElementById('plugin'); - effectsPlugin.addEventListener('message', HandleMessage, false); -} - -document.addEventListener('DOMContentLoaded', InitializePlugin, false); -</script> -</body> -</html>
diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c index 2390423..41cb623 100644 --- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c +++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
@@ -71,8 +71,6 @@ #include "ppapi/c/private/ppb_testing_private.h" #include "ppapi/c/private/ppb_udp_socket_private.h" #include "ppapi/c/private/ppb_uma_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" #include "ppapi/c/private/ppb_x509_certificate_private.h" #include "ppapi/c/private/ppp_instance_private.h" @@ -195,8 +193,6 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UMA_Private_0_3; -static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1; -static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_X509Certificate_Private_0_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPP_Instance_Private_0_1; /* END Declarations for all Wrapper Infos. */ @@ -4434,64 +4430,6 @@ /* End wrapper methods for PPB_UMA_Private_0_3 */ -/* Begin wrapper methods for PPB_VideoDestination_Private_0_1 */ - -static PP_Resource Pnacl_M28_PPB_VideoDestination_Private_Create(PP_Instance instance) { - const struct PPB_VideoDestination_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1.real_iface; - return iface->Create(instance); -} - -static PP_Bool Pnacl_M28_PPB_VideoDestination_Private_IsVideoDestination(PP_Resource resource) { - const struct PPB_VideoDestination_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1.real_iface; - return iface->IsVideoDestination(resource); -} - -static int32_t Pnacl_M28_PPB_VideoDestination_Private_Open(PP_Resource destination, struct PP_Var* stream_url, struct PP_CompletionCallback* callback) { - const struct PPB_VideoDestination_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1.real_iface; - return iface->Open(destination, *stream_url, *callback); -} - -static int32_t Pnacl_M28_PPB_VideoDestination_Private_PutFrame(PP_Resource destination, const struct PP_VideoFrame_Private* frame) { - const struct PPB_VideoDestination_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1.real_iface; - return iface->PutFrame(destination, frame); -} - -static void Pnacl_M28_PPB_VideoDestination_Private_Close(PP_Resource destination) { - const struct PPB_VideoDestination_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1.real_iface; - iface->Close(destination); -} - -/* End wrapper methods for PPB_VideoDestination_Private_0_1 */ - -/* Begin wrapper methods for PPB_VideoSource_Private_0_1 */ - -static PP_Resource Pnacl_M28_PPB_VideoSource_Private_Create(PP_Instance instance) { - const struct PPB_VideoSource_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1.real_iface; - return iface->Create(instance); -} - -static PP_Bool Pnacl_M28_PPB_VideoSource_Private_IsVideoSource(PP_Resource resource) { - const struct PPB_VideoSource_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1.real_iface; - return iface->IsVideoSource(resource); -} - -static int32_t Pnacl_M28_PPB_VideoSource_Private_Open(PP_Resource source, struct PP_Var* stream_url, struct PP_CompletionCallback* callback) { - const struct PPB_VideoSource_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1.real_iface; - return iface->Open(source, *stream_url, *callback); -} - -static int32_t Pnacl_M28_PPB_VideoSource_Private_GetFrame(PP_Resource source, struct PP_VideoFrame_Private* frame, struct PP_CompletionCallback* callback) { - const struct PPB_VideoSource_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1.real_iface; - return iface->GetFrame(source, frame, *callback); -} - -static void Pnacl_M28_PPB_VideoSource_Private_Close(PP_Resource source) { - const struct PPB_VideoSource_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1.real_iface; - iface->Close(source); -} - -/* End wrapper methods for PPB_VideoSource_Private_0_1 */ - /* Begin wrapper methods for PPB_X509Certificate_Private_0_1 */ static PP_Resource Pnacl_M19_PPB_X509Certificate_Private_Create(PP_Instance instance) { @@ -5709,22 +5647,6 @@ .IsCrashReportingEnabled = (int32_t (*)(PP_Instance instance, struct PP_CompletionCallback callback))&Pnacl_M35_PPB_UMA_Private_IsCrashReportingEnabled }; -static const struct PPB_VideoDestination_Private_0_1 Pnacl_Wrappers_PPB_VideoDestination_Private_0_1 = { - .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M28_PPB_VideoDestination_Private_Create, - .IsVideoDestination = (PP_Bool (*)(PP_Resource resource))&Pnacl_M28_PPB_VideoDestination_Private_IsVideoDestination, - .Open = (int32_t (*)(PP_Resource destination, struct PP_Var stream_url, struct PP_CompletionCallback callback))&Pnacl_M28_PPB_VideoDestination_Private_Open, - .PutFrame = (int32_t (*)(PP_Resource destination, const struct PP_VideoFrame_Private* frame))&Pnacl_M28_PPB_VideoDestination_Private_PutFrame, - .Close = (void (*)(PP_Resource destination))&Pnacl_M28_PPB_VideoDestination_Private_Close -}; - -static const struct PPB_VideoSource_Private_0_1 Pnacl_Wrappers_PPB_VideoSource_Private_0_1 = { - .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M28_PPB_VideoSource_Private_Create, - .IsVideoSource = (PP_Bool (*)(PP_Resource resource))&Pnacl_M28_PPB_VideoSource_Private_IsVideoSource, - .Open = (int32_t (*)(PP_Resource source, struct PP_Var stream_url, struct PP_CompletionCallback callback))&Pnacl_M28_PPB_VideoSource_Private_Open, - .GetFrame = (int32_t (*)(PP_Resource source, struct PP_VideoFrame_Private* frame, struct PP_CompletionCallback callback))&Pnacl_M28_PPB_VideoSource_Private_GetFrame, - .Close = (void (*)(PP_Resource source))&Pnacl_M28_PPB_VideoSource_Private_Close -}; - static const struct PPB_X509Certificate_Private_0_1 Pnacl_Wrappers_PPB_X509Certificate_Private_0_1 = { .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M19_PPB_X509Certificate_Private_Create, .IsX509CertificatePrivate = (PP_Bool (*)(PP_Resource resource))&Pnacl_M19_PPB_X509Certificate_Private_IsX509CertificatePrivate, @@ -6376,18 +6298,6 @@ .real_iface = NULL }; -static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1 = { - .iface_macro = PPB_VIDEODESTINATION_PRIVATE_INTERFACE_0_1, - .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_VideoDestination_Private_0_1, - .real_iface = NULL -}; - -static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1 = { - .iface_macro = PPB_VIDEOSOURCE_PRIVATE_INTERFACE_0_1, - .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_VideoSource_Private_0_1, - .real_iface = NULL -}; - static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_X509Certificate_Private_0_1 = { .iface_macro = PPB_X509CERTIFICATE_PRIVATE_INTERFACE_0_1, .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_X509Certificate_Private_0_1, @@ -6505,8 +6415,6 @@ &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3, &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4, &Pnacl_WrapperInfo_PPB_UMA_Private_0_3, - &Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1, - &Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1, &Pnacl_WrapperInfo_PPB_X509Certificate_Private_0_1, NULL };
diff --git a/ppapi/proxy/BUILD.gn b/ppapi/proxy/BUILD.gn index 2b8db74..075e81e 100644 --- a/ppapi/proxy/BUILD.gn +++ b/ppapi/proxy/BUILD.gn
@@ -183,14 +183,10 @@ "var_serialization_rules.h", "video_decoder_resource.cc", "video_decoder_resource.h", - "video_destination_resource.cc", - "video_destination_resource.h", "video_encoder_resource.cc", "video_encoder_resource.h", "video_frame_resource.cc", "video_frame_resource.h", - "video_source_resource.cc", - "video_source_resource.h", "vpn_provider_resource.cc", "vpn_provider_resource.h", "websocket_resource.cc",
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc index 3acb3d7..8e4c9d33 100644 --- a/ppapi/proxy/interface_list.cc +++ b/ppapi/proxy/interface_list.cc
@@ -98,8 +98,6 @@ #include "ppapi/c/private/ppb_testing_private.h" #include "ppapi/c/private/ppb_udp_socket_private.h" #include "ppapi/c/private/ppb_uma_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" #include "ppapi/c/private/ppb_x509_certificate_private.h" #include "ppapi/c/trusted/ppb_broker_trusted.h" #include "ppapi/c/trusted/ppb_browser_font_trusted.h"
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index 0c492d4..6e7890d 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h
@@ -1923,30 +1923,6 @@ int /* host_handle_id */, ppapi::proxy::SerializedHandle /* plugin_handle */) -// MediaStream ----------------------------------------------------------------- - -// VideoDestination Private. -IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoDestination_Create) -IPC_MESSAGE_CONTROL1(PpapiHostMsg_VideoDestination_Open, - std::string /* stream_url */) -IPC_MESSAGE_CONTROL0(PpapiPluginMsg_VideoDestination_OpenReply) -IPC_MESSAGE_CONTROL2(PpapiHostMsg_VideoDestination_PutFrame, - ppapi::HostResource /* image_data */, - PP_TimeTicks /* timestamp */) -IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoDestination_Close) - -// VideoSource Private. -IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoSource_Create) -IPC_MESSAGE_CONTROL1(PpapiHostMsg_VideoSource_Open, - std::string /* stream_url */) -IPC_MESSAGE_CONTROL0(PpapiPluginMsg_VideoSource_OpenReply) -IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoSource_GetFrame) -IPC_MESSAGE_CONTROL3(PpapiPluginMsg_VideoSource_GetFrameReply, - ppapi::HostResource /* resource_id */, - PP_ImageDataDesc /* image_data_desc */, - PP_TimeTicks /* timestamp */) -IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoSource_Close) - // VpnProvider ---------------------------------------------------------------- IPC_MESSAGE_CONTROL0(PpapiHostMsg_VpnProvider_Create)
diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc index 5fad2078..65a92ede 100644 --- a/ppapi/proxy/resource_creation_proxy.cc +++ b/ppapi/proxy/resource_creation_proxy.cc
@@ -50,9 +50,7 @@ #include "ppapi/proxy/url_response_info_resource.h" #include "ppapi/proxy/video_capture_resource.h" #include "ppapi/proxy/video_decoder_resource.h" -#include "ppapi/proxy/video_destination_resource.h" #include "ppapi/proxy/video_encoder_resource.h" -#include "ppapi/proxy/video_source_resource.h" #include "ppapi/proxy/vpn_provider_resource.h" #include "ppapi/proxy/websocket_resource.h" #include "ppapi/shared_impl/api_id.h" @@ -388,21 +386,10 @@ return (new VideoDecoderResource(GetConnection(), instance))->GetReference(); } -PP_Resource ResourceCreationProxy::CreateVideoDestination( - PP_Instance instance) { - return (new VideoDestinationResource(GetConnection(), - instance))->GetReference(); -} - PP_Resource ResourceCreationProxy::CreateVideoEncoder(PP_Instance instance) { return (new VideoEncoderResource(GetConnection(), instance))->GetReference(); } -PP_Resource ResourceCreationProxy::CreateVideoSource( - PP_Instance instance) { - return (new VideoSourceResource(GetConnection(), instance))->GetReference(); -} - PP_Resource ResourceCreationProxy::CreateVpnProvider(PP_Instance instance) { return (new VpnProviderResource(GetConnection(), instance))->GetReference(); }
diff --git a/ppapi/proxy/resource_creation_proxy.h b/ppapi/proxy/resource_creation_proxy.h index 777b516..36dd4e0 100644 --- a/ppapi/proxy/resource_creation_proxy.h +++ b/ppapi/proxy/resource_creation_proxy.h
@@ -154,9 +154,7 @@ PP_Resource CreateUDPSocket(PP_Instance instance) override; PP_Resource CreateUDPSocketPrivate(PP_Instance instance) override; PP_Resource CreateVideoDecoder(PP_Instance instance) override; - PP_Resource CreateVideoDestination(PP_Instance instance) override; PP_Resource CreateVideoEncoder(PP_Instance instance) override; - PP_Resource CreateVideoSource(PP_Instance instance) override; PP_Resource CreateVpnProvider(PP_Instance instance) override; PP_Resource CreateWebSocket(PP_Instance instance) override; PP_Resource CreateX509CertificatePrivate(PP_Instance instance) override;
diff --git a/ppapi/proxy/video_destination_resource.cc b/ppapi/proxy/video_destination_resource.cc deleted file mode 100644 index 5175705..0000000 --- a/ppapi/proxy/video_destination_resource.cc +++ /dev/null
@@ -1,102 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/proxy/video_destination_resource.h" - -#include "base/bind.h" -#include "ipc/ipc_message.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/pp_video_frame_private.h" -#include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/shared_impl/ppapi_globals.h" -#include "ppapi/shared_impl/resource_tracker.h" -#include "ppapi/shared_impl/var.h" -#include "ppapi/thunk/enter.h" -#include "ppapi/thunk/ppb_image_data_api.h" - -using ppapi::thunk::EnterResourceNoLock; -using ppapi::thunk::PPB_VideoDestination_Private_API; - -namespace ppapi { -namespace proxy { - -VideoDestinationResource::VideoDestinationResource( - Connection connection, - PP_Instance instance) - : PluginResource(connection, instance), - is_open_(false) { - SendCreate(RENDERER, PpapiHostMsg_VideoDestination_Create()); -} - -VideoDestinationResource::~VideoDestinationResource() { -} - -PPB_VideoDestination_Private_API* - VideoDestinationResource::AsPPB_VideoDestination_Private_API() { - return this; -} - -int32_t VideoDestinationResource::Open( - const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) { - if (TrackedCallback::IsPending(open_callback_)) - return PP_ERROR_INPROGRESS; - - open_callback_ = callback; - - scoped_refptr<StringVar> stream_url_var = StringVar::FromPPVar(stream_url); - const uint32_t kMaxStreamIdSizeInBytes = 16384; - if (!stream_url_var.get() || - stream_url_var->value().size() > kMaxStreamIdSizeInBytes) - return PP_ERROR_BADARGUMENT; - Call<PpapiPluginMsg_VideoDestination_OpenReply>(RENDERER, - PpapiHostMsg_VideoDestination_Open(stream_url_var->value()), - base::Bind(&VideoDestinationResource::OnPluginMsgOpenComplete, this)); - return PP_OK_COMPLETIONPENDING; -} - -int32_t VideoDestinationResource::PutFrame( - const PP_VideoFrame_Private& frame) { - if (!is_open_) - return PP_ERROR_FAILED; - - thunk::EnterResourceNoLock<thunk::PPB_ImageData_API> enter_image( - frame.image_data, true); - if (enter_image.failed()) - return PP_ERROR_BADRESOURCE; - - // Check that the PP_Instance matches. - Resource* image_object = - PpapiGlobals::Get()->GetResourceTracker()->GetResource(frame.image_data); - if (!image_object || pp_instance() != image_object->pp_instance()) { - Log(PP_LOGLEVEL_ERROR, - "VideoDestinationPrivateResource.PutFrame: Bad image resource."); - return PP_ERROR_BADRESOURCE; - } - - Post(RENDERER, - PpapiHostMsg_VideoDestination_PutFrame(image_object->host_resource(), - frame.timestamp)); - return PP_OK; -} - -void VideoDestinationResource::Close() { - Post(RENDERER, PpapiHostMsg_VideoDestination_Close()); - - if (TrackedCallback::IsPending(open_callback_)) - open_callback_->PostAbort(); -} - -void VideoDestinationResource::OnPluginMsgOpenComplete( - const ResourceMessageReplyParams& params) { - if (TrackedCallback::IsPending(open_callback_)) { - int32_t result = params.result(); - if (result == PP_OK) - is_open_ = true; - open_callback_->Run(result); - } -} - -} // namespace proxy -} // namespace ppapi
diff --git a/ppapi/proxy/video_destination_resource.h b/ppapi/proxy/video_destination_resource.h deleted file mode 100644 index a74450e..0000000 --- a/ppapi/proxy/video_destination_resource.h +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_PROXY_VIDEO_DESTINATION_RESOURCE_H_ -#define PPAPI_PROXY_VIDEO_DESTINATION_RESOURCE_H_ - -#include <stdint.h> - -#include <string> - -#include "base/macros.h" -#include "ppapi/c/pp_var.h" -#include "ppapi/proxy/connection.h" -#include "ppapi/proxy/plugin_resource.h" -#include "ppapi/proxy/ppapi_proxy_export.h" -#include "ppapi/thunk/ppb_video_destination_private_api.h" - -struct PP_VideoFrame_Private; - -namespace ppapi { - -class TrackedCallback; - -namespace proxy { - -class PPAPI_PROXY_EXPORT VideoDestinationResource - : public PluginResource, - public thunk::PPB_VideoDestination_Private_API { - public: - VideoDestinationResource(Connection connection, - PP_Instance instance); - ~VideoDestinationResource() override; - - // Resource overrides. - thunk::PPB_VideoDestination_Private_API* AsPPB_VideoDestination_Private_API() - override; - - // PPB_VideoDestination_Private_API implementation. - int32_t Open( - const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) override; - int32_t PutFrame(const PP_VideoFrame_Private& frame) override; - void Close() override; - - private: - void OnPluginMsgOpenComplete( - const ResourceMessageReplyParams& params); - - scoped_refptr<TrackedCallback> open_callback_; - bool is_open_; - - DISALLOW_COPY_AND_ASSIGN(VideoDestinationResource); -}; - -} // namespace proxy -} // namespace ppapi - -#endif // PPAPI_PROXY_VIDEO_DESTINATION_RESOURCE_H_
diff --git a/ppapi/proxy/video_source_resource.cc b/ppapi/proxy/video_source_resource.cc deleted file mode 100644 index c294903..0000000 --- a/ppapi/proxy/video_source_resource.cc +++ /dev/null
@@ -1,120 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/proxy/video_source_resource.h" - -#include "base/bind.h" -#include "ipc/ipc_message.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/pp_video_frame_private.h" -#include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_image_data_proxy.h" -#include "ppapi/shared_impl/ppapi_globals.h" -#include "ppapi/shared_impl/resource_tracker.h" -#include "ppapi/shared_impl/var.h" -#include "ppapi/thunk/enter.h" - -using ppapi::thunk::EnterResourceNoLock; -using ppapi::thunk::PPB_VideoSource_Private_API; - -namespace ppapi { -namespace proxy { - -VideoSourceResource::VideoSourceResource( - Connection connection, - PP_Instance instance) - : PluginResource(connection, instance), - is_open_(false) { - SendCreate(RENDERER, PpapiHostMsg_VideoSource_Create()); -} - -VideoSourceResource::~VideoSourceResource() { -} - -PPB_VideoSource_Private_API* - VideoSourceResource::AsPPB_VideoSource_Private_API() { - return this; -} - -int32_t VideoSourceResource::Open( - const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) { - if (TrackedCallback::IsPending(open_callback_)) - return PP_ERROR_INPROGRESS; - - open_callback_ = callback; - - scoped_refptr<StringVar> stream_url_var = StringVar::FromPPVar(stream_url); - const uint32_t kMaxStreamIdSizeInBytes = 16384; - if (!stream_url_var.get() || - stream_url_var->value().size() > kMaxStreamIdSizeInBytes) - return PP_ERROR_BADARGUMENT; - Call<PpapiPluginMsg_VideoSource_OpenReply>(RENDERER, - PpapiHostMsg_VideoSource_Open(stream_url_var->value()), - base::Bind(&VideoSourceResource::OnPluginMsgOpenComplete, this)); - return PP_OK_COMPLETIONPENDING; -} - -int32_t VideoSourceResource::GetFrame( - PP_VideoFrame_Private* frame, - scoped_refptr<TrackedCallback> callback) { - if (!is_open_) - return PP_ERROR_FAILED; - - if (TrackedCallback::IsPending(get_frame_callback_)) - return PP_ERROR_INPROGRESS; - - get_frame_callback_ = callback; - Call<PpapiPluginMsg_VideoSource_GetFrameReply>(RENDERER, - PpapiHostMsg_VideoSource_GetFrame(), - base::Bind(&VideoSourceResource::OnPluginMsgGetFrameComplete, this, - frame)); - return PP_OK_COMPLETIONPENDING; -} - -void VideoSourceResource::Close() { - Post(RENDERER, PpapiHostMsg_VideoSource_Close()); - - if (TrackedCallback::IsPending(open_callback_)) - open_callback_->PostAbort(); - if (TrackedCallback::IsPending(get_frame_callback_)) - get_frame_callback_->PostAbort(); -} - -void VideoSourceResource::OnPluginMsgOpenComplete( - const ResourceMessageReplyParams& reply_params) { - if (TrackedCallback::IsPending(open_callback_)) { - int32_t result = reply_params.result(); - if (result == PP_OK) - is_open_ = true; - open_callback_->Run(result); - } -} - -void VideoSourceResource::OnPluginMsgGetFrameComplete( - PP_VideoFrame_Private* frame, - const ResourceMessageReplyParams& reply_params, - const HostResource& image_data, - const PP_ImageDataDesc& image_desc, - PP_TimeTicks timestamp) { - // The callback may have been aborted by Close(). - if (TrackedCallback::IsPending(get_frame_callback_)) { - int32_t result = reply_params.result(); - if (result == PP_OK && - PPB_ImageData_Shared::IsImageDataDescValid(image_desc)) { - frame->timestamp = timestamp; - - base::SharedMemoryHandle handle; - if (!reply_params.TakeSharedMemoryHandleAtIndex(0, &handle)) - frame->image_data = 0; - frame->image_data = - (new SimpleImageData( - image_data, image_desc, handle))->GetReference(); - } - get_frame_callback_->Run(result); - } -} - -} // namespace proxy -} // namespace ppapi
diff --git a/ppapi/proxy/video_source_resource.h b/ppapi/proxy/video_source_resource.h deleted file mode 100644 index bbc85b4..0000000 --- a/ppapi/proxy/video_source_resource.h +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_PROXY_VIDEO_SOURCE_RESOURCE_H_ -#define PPAPI_PROXY_VIDEO_SOURCE_RESOURCE_H_ - -#include <stdint.h> - -#include <string> - -#include "base/macros.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/c/pp_var.h" -#include "ppapi/proxy/connection.h" -#include "ppapi/proxy/plugin_resource.h" -#include "ppapi/proxy/ppapi_proxy_export.h" -#include "ppapi/thunk/ppb_video_source_private_api.h" - -struct PP_ImageDataDesc; -struct PP_VideoFrame_Private; - -namespace ppapi { - -class TrackedCallback; - -namespace proxy { - -class PPAPI_PROXY_EXPORT VideoSourceResource - : public PluginResource, - public thunk::PPB_VideoSource_Private_API { - public: - VideoSourceResource(Connection connection, - PP_Instance instance); - ~VideoSourceResource() override; - - // Resource overrides. - thunk::PPB_VideoSource_Private_API* AsPPB_VideoSource_Private_API() override; - - // PPB_VideoSource_Private_API implementation. - int32_t Open( - const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) override; - int32_t GetFrame( - PP_VideoFrame_Private* frame, - scoped_refptr<TrackedCallback> callback) override; - void Close() override; - - private: - void OnPluginMsgOpenComplete( - const ResourceMessageReplyParams& reply_params); - void OnPluginMsgGetFrameComplete( - PP_VideoFrame_Private* frame, - const ResourceMessageReplyParams& reply_params, - const HostResource& image_data, - const PP_ImageDataDesc& image_desc_data, - PP_TimeTicks timestamp); - - scoped_refptr<TrackedCallback> open_callback_; - scoped_refptr<TrackedCallback> get_frame_callback_; - bool is_open_; - - DISALLOW_COPY_AND_ASSIGN(VideoSourceResource); -}; - -} // namespace proxy -} // namespace ppapi - -#endif // PPAPI_PROXY_VIDEO_SOURCE_RESOURCE_H_
diff --git a/ppapi/shared_impl/resource.h b/ppapi/shared_impl/resource.h index 2a264805..3044118fd 100644 --- a/ppapi/shared_impl/resource.h +++ b/ppapi/shared_impl/resource.h
@@ -82,11 +82,9 @@ F(PPB_VideoCapture_API) \ F(PPB_VideoDecoder_API) \ F(PPB_VideoDecoder_Dev_API) \ - F(PPB_VideoDestination_Private_API) \ F(PPB_VideoEncoder_API) \ F(PPB_VideoFrame_API) \ F(PPB_VideoLayer_API) \ - F(PPB_VideoSource_Private_API) \ F(PPB_View_API) \ F(PPB_VpnProvider_API) \ F(PPB_WebSocket_API) \
diff --git a/ppapi/tests/all_c_includes.h b/ppapi/tests/all_c_includes.h index ddbc81e..c7500be 100644 --- a/ppapi/tests/all_c_includes.h +++ b/ppapi/tests/all_c_includes.h
@@ -117,8 +117,6 @@ #include "ppapi/c/private/ppb_testing_private.h" #include "ppapi/c/private/ppb_udp_socket_private.h" #include "ppapi/c/private/ppb_uma_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" #include "ppapi/c/private/ppb_x509_certificate_private.h" #include "ppapi/c/private/ppp_find_private.h" #include "ppapi/c/private/ppp_instance_private.h"
diff --git a/ppapi/tests/all_cpp_includes.h b/ppapi/tests/all_cpp_includes.h index 3387a0f..59b1e45 100644 --- a/ppapi/tests/all_cpp_includes.h +++ b/ppapi/tests/all_cpp_includes.h
@@ -52,14 +52,11 @@ #include "ppapi/cpp/private/flash_font_file.h" #include "ppapi/cpp/private/flash_fullscreen.h" #include "ppapi/cpp/private/instance_private.h" -#include "ppapi/cpp/private/instance_private.h" #include "ppapi/cpp/private/net_address_private.h" #include "ppapi/cpp/private/tcp_socket_private.h" #include "ppapi/cpp/private/udp_socket_private.h" #include "ppapi/cpp/private/var_private.h" -#include "ppapi/cpp/private/video_destination_private.h" #include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/private/video_source_private.h" #include "ppapi/cpp/rect.h" #include "ppapi/cpp/resource.h" #include "ppapi/cpp/size.h"
diff --git a/ppapi/tests/test_tcp_socket.cc b/ppapi/tests/test_tcp_socket.cc index 877b469e..620bd4e 100644 --- a/ppapi/tests/test_tcp_socket.cc +++ b/ppapi/tests/test_tcp_socket.cc
@@ -49,7 +49,7 @@ if (!GetLocalHostPort(instance_->pp_instance(), &host, &port)) return false; - if (!ResolveHost(instance_->pp_instance(), host, port, &addr_)) + if (!ResolveHost(instance_->pp_instance(), host, port, &test_server_addr_)) return false; return true; @@ -62,6 +62,7 @@ RUN_CALLBACK_TEST(TestTCPSocket, Listen, filter); RUN_CALLBACK_TEST(TestTCPSocket, Backlog, filter); RUN_CALLBACK_TEST(TestTCPSocket, Interface_1_0, filter); + RUN_CALLBACK_TEST(TestTCPSocket, UnexpectedCalls, filter); } std::string TestTCPSocket::TestConnect() { @@ -70,7 +71,7 @@ pp::TCPSocket socket(instance_); TestCompletionCallback cb(instance_->pp_instance(), callback_type()); - cb.WaitForResult(socket.Connect(addr_, cb.GetCallback())); + cb.WaitForResult(socket.Connect(test_server_addr_, cb.GetCallback())); CHECK_CALLBACK_BEHAVIOR(cb); ASSERT_EQ(PP_OK, cb.result()); @@ -80,7 +81,7 @@ ASSERT_NE(0, local_addr.pp_resource()); ASSERT_NE(0, remote_addr.pp_resource()); - ASSERT_TRUE(EqualNetAddress(addr_, remote_addr)); + ASSERT_TRUE(EqualNetAddress(test_server_addr_, remote_addr)); socket.Close(); } @@ -97,7 +98,7 @@ CHECK_CALLBACK_BEHAVIOR(cb); ASSERT_EQ(PP_OK, cb.result()); - cb.WaitForResult(socket.Connect(addr_, cb.GetCallback())); + cb.WaitForResult(socket.Connect(test_server_addr_, cb.GetCallback())); CHECK_CALLBACK_BEHAVIOR(cb); ASSERT_EQ(PP_OK, cb.result()); @@ -107,7 +108,7 @@ ASSERT_NE(0, local_addr.pp_resource()); ASSERT_NE(0, remote_addr.pp_resource()); - ASSERT_TRUE(EqualNetAddress(addr_, remote_addr)); + ASSERT_TRUE(EqualNetAddress(test_server_addr_, remote_addr)); ASSERT_NE(0u, GetPort(local_addr)); socket.Close(); @@ -120,7 +121,7 @@ pp::TCPSocket socket(instance_); TestCompletionCallback cb(instance_->pp_instance(), callback_type()); - cb.WaitForResult(socket.Connect(addr_, cb.GetCallback())); + cb.WaitForResult(socket.Connect(test_server_addr_, cb.GetCallback())); CHECK_CALLBACK_BEHAVIOR(cb); ASSERT_EQ(PP_OK, cb.result()); @@ -131,6 +132,47 @@ ASSERT_SUBTEST_SUCCESS(ReadFirstLineFromSocket(&socket, &s)); ASSERT_TRUE(ValidateHttpResponse(s)); + // Read until the server closes the socket. + std::string read_data; + int read_error; + ASSERT_SUBTEST_SUCCESS( + ReadFromSocketUntilError(&socket, &read_data, &read_error)); + ASSERT_EQ(PP_OK, read_error); + + // Reading again from the socket after getting an EOF should result in an + // error. + read_data = ""; + ASSERT_SUBTEST_SUCCESS( + ReadFromSocketUntilError(&socket, &read_data, &read_error)); + ASSERT_EQ(PP_ERROR_FAILED, read_error); + ASSERT_EQ("", read_data); + + char write_data[32 * 1024] = {0}; + // Write to the socket until there's an error, just to make sure the error + // handling code works. As with the read case, go through two failures + // (which may or may not fail with the same error code). + int failures = 0; + while (true) { + TestCompletionCallback cb(instance_->pp_instance(), callback_type()); + cb.WaitForResult(socket.Write(write_data, + static_cast<int32_t>(sizeof(write_data)), + cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + if (cb.result() > 0) { + ASSERT_EQ(0, failures); + continue; + } + // While this will most likely be PP_ERROR_CONNECTION_ABORTED, it seems best + // not to rely on that, as write errors can be a bit finicky. + ASSERT_LT(cb.result(), 0); + ASSERT_NE(PP_ERROR_FAILED, cb.result()); + ASSERT_NE(PP_OK_COMPLETIONPENDING, cb.result()); + ++failures; + + if (failures == 2) + break; + } + PASS(); } @@ -160,7 +202,7 @@ CHECK_CALLBACK_BEHAVIOR(cb_3); ASSERT_EQ(PP_OK, cb_3.result()); - cb_1.WaitForResult(socket.Connect(addr_, cb_1.GetCallback())); + cb_1.WaitForResult(socket.Connect(test_server_addr_, cb_1.GetCallback())); CHECK_CALLBACK_BEHAVIOR(cb_1); ASSERT_EQ(PP_OK, cb_1.result()); @@ -187,6 +229,9 @@ } std::string TestTCPSocket::TestListen() { + // TODO(mmenke): Whenever this test is run, the PPAPI process DCHECKs on + // shutdown when a ref count is decremented on the wrong thread. Someone + // should probably look into that. static const int kBacklog = 2; pp::TCPSocket server_socket(instance_); @@ -231,18 +276,20 @@ ASSERT_TRUE(EqualNetAddress(client_local_addr, accepted_remote_addr)); - const char kSentByte = 'a'; - ASSERT_SUBTEST_SUCCESS(WriteToSocket(&client_socket, - std::string(1, kSentByte))); + const std::string kSentData = "a"; + ASSERT_SUBTEST_SUCCESS(WriteToSocket(&client_socket, kSentData)); - char received_byte; - ASSERT_SUBTEST_SUCCESS(ReadFromSocket(&accepted_socket, - &received_byte, - sizeof(received_byte))); - ASSERT_EQ(kSentByte, received_byte); + // Close the client socket to be able to read until EOF. + client_socket.Close(); + + std::string read_data; + int read_error; + ASSERT_SUBTEST_SUCCESS( + ReadFromSocketUntilError(&accepted_socket, &read_data, &read_error)); + ASSERT_EQ(kSentData, read_data); + ASSERT_EQ(PP_OK, read_error); accepted_socket.Close(); - client_socket.Close(); server_socket.Close(); PASS(); @@ -319,7 +366,8 @@ TestCompletionCallback cb(instance_->pp_instance(), callback_type()); cb.WaitForResult(socket_interface_1_0_->Connect( - socket, addr_.pp_resource(), cb.GetCallback().pp_completion_callback())); + socket, test_server_addr_.pp_resource(), + cb.GetCallback().pp_completion_callback())); CHECK_CALLBACK_BEHAVIOR(cb); ASSERT_EQ(PP_OK, cb.result()); @@ -334,6 +382,88 @@ PASS(); } +std::string TestTCPSocket::TestUnexpectedCalls() { + // Tests that calls that are not expected given a sockets current state fail + // with PP_ERROR_FAILED without breaking future operations on the socket. + + // Test a listen socket. + { + pp::TCPSocket socket(instance_); + ASSERT_SUBTEST_SUCCESS( + RunCommandsExpendingFailures(&socket, kListen | kAccept | kReadWrite)); + + // Connect + TestCompletionCallback cb(instance_->pp_instance(), callback_type()); + cb.WaitForResult(socket.Connect(test_server_addr_, cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + ASSERT_EQ(PP_OK, cb.result()); + ASSERT_SUBTEST_SUCCESS( + RunCommandsExpendingFailures(&socket, kListen | kAccept | kConnect)); + + // Write + ASSERT_SUBTEST_SUCCESS(WriteToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); + ASSERT_SUBTEST_SUCCESS( + RunCommandsExpendingFailures(&socket, kListen | kAccept | kConnect)); + + // Read + std::string s; + ASSERT_SUBTEST_SUCCESS(ReadFirstLineFromSocket(&socket, &s)); + ASSERT_TRUE(ValidateHttpResponse(s)); + ASSERT_SUBTEST_SUCCESS( + RunCommandsExpendingFailures(&socket, kListen | kAccept | kConnect)); + + socket.Close(); + ASSERT_SUBTEST_SUCCESS(RunCommandsExpendingFailures( + &socket, kListen | kAccept | kConnect | kReadWrite)); + } + + // Test a server socket. + { + pp::TCPSocket server_socket(instance_); + + // Bind + pp::NetAddress any_port_address; + ASSERT_SUBTEST_SUCCESS(GetAddressToBind(&any_port_address)); + TestCompletionCallback callback(instance_->pp_instance(), callback_type()); + callback.WaitForResult( + server_socket.Bind(any_port_address, callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(callback); + ASSERT_EQ(PP_OK, callback.result()); + ASSERT_SUBTEST_SUCCESS(RunCommandsExpendingFailures( + &server_socket, kBind | kAccept | kReadWrite)); + + // Listen + callback.WaitForResult( + server_socket.Listen(1 /* backlog */, callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(callback); + ASSERT_EQ(PP_OK, callback.result()); + ASSERT_SUBTEST_SUCCESS(RunCommandsExpendingFailures( + &server_socket, kBind | kListen | kConnect | kReadWrite)); + + // Accept + pp::TCPSocket client_socket(instance_); + TestCompletionCallback connect_callback(instance_->pp_instance(), + callback_type()); + client_socket.Connect(server_socket.GetLocalAddress(), + connect_callback.GetCallback()); + TestCompletionCallbackWithOutput<pp::TCPSocket> accept_callback( + instance_->pp_instance(), callback_type()); + accept_callback.WaitForResult( + server_socket.Accept(accept_callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(accept_callback); + ASSERT_EQ(PP_OK, accept_callback.result()); + pp::TCPSocket accepted_socket(accept_callback.output()); + ASSERT_SUBTEST_SUCCESS(RunCommandsExpendingFailures( + &server_socket, kBind | kListen | kConnect | kReadWrite)); + + client_socket.Close(); + accepted_socket.Close(); + server_socket.Close(); + } + + PASS(); +} + std::string TestTCPSocket::ReadFirstLineFromSocket(pp::TCPSocket* socket, std::string* s) { char buffer[1000]; @@ -395,6 +525,30 @@ PASS(); } +// Reads from the socket until an error (Or 0-byte read) occurs. Populates +// |read_data| and |error| with that information. Doesn't return a std::string +// to distinguish it from a subtest. +std::string TestTCPSocket::ReadFromSocketUntilError(pp::TCPSocket* socket, + std::string* read_data, + int* read_error) { + // Set |read_error| to a value that a read should never complete with. + *read_error = PP_OK_COMPLETIONPENDING; + while (true) { + char buffer[1024]; + TestCompletionCallback callback(instance_->pp_instance(), callback_type()); + callback.WaitForResult( + socket->Read(buffer, sizeof(buffer), callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(callback); + ASSERT_LE(callback.result(), static_cast<int32_t>(sizeof(buffer))); + ASSERT_NE(PP_OK_COMPLETIONPENDING, callback.result()); + if (callback.result() <= 0) { + *read_error = callback.result(); + PASS(); + } + read_data->append(buffer, callback.result()); + } +} + std::string TestTCPSocket::WriteToSocket(pp::TCPSocket* socket, const std::string& s) { const char* buffer = s.data(); @@ -433,9 +587,12 @@ } std::string TestTCPSocket::GetAddressToBind(pp::NetAddress* address) { + // Connect to |test_server_addr_| and then sets |address| to the local address + // used by that connection, replacing the port with 0 to use a random port. pp::TCPSocket socket(instance_); TestCompletionCallback callback(instance_->pp_instance(), callback_type()); - callback.WaitForResult(socket.Connect(addr_, callback.GetCallback())); + callback.WaitForResult( + socket.Connect(test_server_addr_, callback.GetCallback())); CHECK_CALLBACK_BEHAVIOR(callback); ASSERT_EQ(PP_OK, callback.result()); @@ -462,3 +619,57 @@ PASS(); } + +std::string TestTCPSocket::RunCommandsExpendingFailures(pp::TCPSocket* socket, + int commands) { + ASSERT_NE(0, commands); + + if (commands & kBind) { + TestCompletionCallback cb(instance_->pp_instance(), callback_type()); + pp::NetAddress any_port_address; + ASSERT_SUBTEST_SUCCESS(GetAddressToBind(&any_port_address)); + cb.WaitForResult(socket->Bind(any_port_address, cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + ASSERT_EQ(PP_ERROR_FAILED, cb.result()); + } + + if (commands & kListen) { + TestCompletionCallback callback(instance_->pp_instance(), callback_type()); + callback.WaitForResult( + socket->Listen(1 /* backlog */, callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(callback); + ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + } + + if (commands & kAccept) { + TestCompletionCallbackWithOutput<pp::TCPSocket> accept_callback( + instance_->pp_instance(), callback_type()); + accept_callback.WaitForResult( + socket->Accept(accept_callback.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(accept_callback); + ASSERT_EQ(PP_ERROR_FAILED, accept_callback.result()); + } + + if (commands & kConnect) { + TestCompletionCallback cb(instance_->pp_instance(), callback_type()); + cb.WaitForResult(socket->Connect(test_server_addr_, cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + ASSERT_EQ(PP_ERROR_FAILED, cb.result()); + } + + if (commands & kReadWrite) { + // Check that a read on a new socket fails. + char buffer[1] = {'1'}; + TestCompletionCallback cb(instance_->pp_instance(), callback_type()); + cb.WaitForResult(socket->Read(buffer, sizeof(buffer), cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + ASSERT_EQ(PP_ERROR_FAILED, cb.result()); + + // Check that a write on a new socket fails. + cb.WaitForResult(socket->Write(buffer, sizeof(buffer), cb.GetCallback())); + CHECK_CALLBACK_BEHAVIOR(cb); + ASSERT_EQ(PP_ERROR_FAILED, cb.result()); + } + + PASS(); +}
diff --git a/ppapi/tests/test_tcp_socket.h b/ppapi/tests/test_tcp_socket.h index 92fe2ae..80d3742 100644 --- a/ppapi/tests/test_tcp_socket.h +++ b/ppapi/tests/test_tcp_socket.h
@@ -33,20 +33,46 @@ std::string TestListen(); std::string TestBacklog(); std::string TestInterface_1_0(); + std::string TestUnexpectedCalls(); std::string ReadFirstLineFromSocket(pp::TCPSocket* socket, std::string* s); std::string ReadFirstLineFromSocket_1_0(PP_Resource socket, std::string* s); + // Expects to read exactly |num_bytes| from the socket. Stops once exactly + // |num_bytes| have been read. std::string ReadFromSocket(pp::TCPSocket* socket, char* buffer, size_t num_bytes); + // Reads from |socket| until a read error occurs, and sets |read_data| and + // |error| accordingly. Only fails if a Read() call returns more data than the + // buffer that was passed in to it. + std::string ReadFromSocketUntilError(pp::TCPSocket* socket, + std::string* read_data, + int* error); std::string WriteToSocket(pp::TCPSocket* socket, const std::string& s); std::string WriteToSocket_1_0(PP_Resource socket, const std::string& s); + // Sets |address| to an address usable for Bind(). Returned address uses the + // IP address used to talk to |test_server_addr_| and a port of 0, so Bind() + // calls to it should succeed. std::string GetAddressToBind(pp::NetAddress* address); + std::string StartListen(pp::TCPSocket* socket, int32_t backlog); - pp::NetAddress addr_; + enum Command { + kBind = 0x1, + kListen = 0x2, + kAccept = 0x4, + kConnect = 0x8, + kReadWrite = 0x10, + }; + // Runs |commands|, consisting of one or more Command values on |socket|, + // expecting all of them to fail with PP_ERROR_FAILED. Useful for testing + // invalid state transitions. + std::string RunCommandsExpendingFailures(pp::TCPSocket* socket, int commands); + + // Address of the EmbeddedTestServer set up by the browser test fixture. + pp::NetAddress test_server_addr_; const PPB_TCPSocket_1_0* socket_interface_1_0_; };
diff --git a/ppapi/tests/test_utils.h b/ppapi/tests/test_utils.h index 8f04775..d2e641a 100644 --- a/ppapi/tests/test_utils.h +++ b/ppapi/tests/test_utils.h
@@ -24,6 +24,9 @@ const PPB_Testing_Private* GetTestingInterface(); std::string ReportError(const char* method, int32_t error); void PlatformSleep(int duration_ms); + +// Returns the host and port of the current document's URL (Which is generally +// served by an EmbeddedTestServer). Returns false on failure. bool GetLocalHostPort(PP_Instance instance, std::string* host, uint16_t* port); uint16_t ConvertFromNetEndian16(uint16_t x);
diff --git a/ppapi/tests/test_video_destination.cc b/ppapi/tests/test_video_destination.cc deleted file mode 100644 index 367b0029..0000000 --- a/ppapi/tests/test_video_destination.cc +++ /dev/null
@@ -1,126 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Tests PPB_VideoDestination_Private interface. - -#include "ppapi/tests/test_video_destination.h" - -#include <algorithm> -#include <limits> -#include <string> - -#include "ppapi/c/private/ppb_testing_private.h" -#include "ppapi/cpp/completion_callback.h" -#include "ppapi/cpp/instance.h" -#include "ppapi/cpp/private/video_destination_private.h" -#include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/var.h" -#include "ppapi/tests/test_utils.h" -#include "ppapi/tests/testing_instance.h" - -REGISTER_TEST_CASE(VideoDestination); - -namespace { - -const PP_Resource kInvalidResource = 0; -const PP_Instance kInvalidInstance = 0; - -} - -TestVideoDestination::TestVideoDestination(TestingInstance* instance) - : TestCase(instance), - ppb_video_destination_private_interface_(NULL), - ppb_core_interface_(NULL), - event_(instance_->pp_instance()) { -} - -bool TestVideoDestination::Init() { - ppb_video_destination_private_interface_ = - static_cast<const PPB_VideoDestination_Private*>( - pp::Module::Get()->GetBrowserInterface( - PPB_VIDEODESTINATION_PRIVATE_INTERFACE)); - if (!ppb_video_destination_private_interface_) - instance_->AppendError( - "PPB_VideoDestination_Private interface not available"); - - ppb_core_interface_ = static_cast<const PPB_Core*>( - pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); - if (!ppb_core_interface_) - instance_->AppendError("PPB_Core interface not available"); - - return - ppb_video_destination_private_interface_ && - ppb_core_interface_; -} - -TestVideoDestination::~TestVideoDestination() { -} - -void TestVideoDestination::RunTests(const std::string& filter) { - RUN_TEST(Create, filter); - RUN_TEST(PutFrame, filter); -} - -void TestVideoDestination::HandleMessage(const pp::Var& message_data) { - if (message_data.AsString().find("blob:") == 0) { - stream_url_ = message_data.AsString(); - event_.Signal(); - } -} - -std::string TestVideoDestination::TestCreate() { - PP_Resource video_destination; - // Creating a destination from an invalid instance returns an invalid - // resource. - video_destination = - ppb_video_destination_private_interface_->Create(kInvalidInstance); - ASSERT_EQ(kInvalidResource, video_destination); - ASSERT_FALSE( - ppb_video_destination_private_interface_->IsVideoDestination( - video_destination)); - - // Creating a destination from a valid instance returns a valid resource. - video_destination = - ppb_video_destination_private_interface_->Create( - instance_->pp_instance()); - ASSERT_NE(kInvalidResource, video_destination); - ASSERT_TRUE( - ppb_video_destination_private_interface_->IsVideoDestination( - video_destination)); - - ppb_core_interface_->ReleaseResource(video_destination); - // Once released, the resource shouldn't be a video destination. - ASSERT_FALSE( - ppb_video_destination_private_interface_->IsVideoDestination( - video_destination)); - - PASS(); -} - -std::string TestVideoDestination::TestPutFrame() { - std::string js_code; - js_code += "var test_stream = new MediaStream([]);" - "var url = URL.createObjectURL(test_stream);" - "var plugin = document.getElementById('plugin');" - "plugin.postMessage(url);"; - instance_->EvalScript(js_code); - event_.Wait(); - - pp::VideoDestination_Private video_destination(instance_); - TestCompletionCallback cc1(instance_->pp_instance(), false); - cc1.WaitForResult(video_destination.Open(stream_url_, cc1.GetCallback())); - ASSERT_EQ(PP_OK, cc1.result()); - - pp::ImageData image_data(instance_, - PP_IMAGEDATAFORMAT_BGRA_PREMUL, - pp::Size(640, 480), - false /* init_to_zero */); - pp::VideoFrame_Private video_frame(image_data, - 0.0 /* timestamp */); - ASSERT_EQ(PP_OK, video_destination.PutFrame(video_frame)); - - video_destination.Close(); - - PASS(); -}
diff --git a/ppapi/tests/test_video_destination.h b/ppapi/tests/test_video_destination.h deleted file mode 100644 index c085b8be..0000000 --- a/ppapi/tests/test_video_destination.h +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PAPPI_TESTS_TEST_VIDEO_DESTINATION_H_ -#define PAPPI_TESTS_TEST_VIDEO_DESTINATION_H_ - -#include <string> - -#include "ppapi/c/ppb_core.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/tests/test_case.h" - -class TestVideoDestination : public TestCase { - public: - explicit TestVideoDestination(TestingInstance* instance); - virtual ~TestVideoDestination(); - - private: - // TestCase implementation. - virtual bool Init(); - virtual void RunTests(const std::string& filter); - - // Overrides. - virtual void HandleMessage(const pp::Var& message_data); - - std::string TestCreate(); - std::string TestPutFrame(); - - const PPB_VideoDestination_Private* ppb_video_destination_private_interface_; - const PPB_Core* ppb_core_interface_; - NestedEvent event_; - std::string stream_url_; -}; - -#endif // PAPPI_TESTS_TEST_VIDEO_DESTINATION_H_
diff --git a/ppapi/tests/test_video_source.cc b/ppapi/tests/test_video_source.cc deleted file mode 100644 index a6b72998..0000000 --- a/ppapi/tests/test_video_source.cc +++ /dev/null
@@ -1,121 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Tests PPB_VideoSource_Private interface. - -#include "ppapi/tests/test_video_source.h" - -#include <string.h> -#include <algorithm> -#include <limits> - -#include "ppapi/c/private/ppb_testing_private.h" -#include "ppapi/cpp/completion_callback.h" -#include "ppapi/cpp/instance.h" -#include "ppapi/cpp/private/video_frame_private.h" -#include "ppapi/cpp/private/video_source_private.h" -#include "ppapi/cpp/var.h" -#include "ppapi/tests/test_utils.h" -#include "ppapi/tests/testing_instance.h" - -REGISTER_TEST_CASE(VideoSource); - -namespace { - -const PP_Resource kInvalidResource = 0; -const PP_Instance kInvalidInstance = 0; - -} - -TestVideoSource::TestVideoSource(TestingInstance* instance) - : TestCase(instance), - ppb_video_source_private_interface_(NULL), - ppb_core_interface_(NULL), - event_(instance_->pp_instance()) { -} - -bool TestVideoSource::Init() { - ppb_video_source_private_interface_ = - static_cast<const PPB_VideoSource_Private*>( - pp::Module::Get()->GetBrowserInterface( - PPB_VIDEOSOURCE_PRIVATE_INTERFACE)); - if (!ppb_video_source_private_interface_) - instance_->AppendError("PPB_VideoSource_Private interface not available"); - - ppb_core_interface_ = static_cast<const PPB_Core*>( - pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); - if (!ppb_core_interface_) - instance_->AppendError("PPB_Core interface not available"); - - return ppb_video_source_private_interface_ && ppb_core_interface_; -} - -TestVideoSource::~TestVideoSource() { -} - -void TestVideoSource::RunTests(const std::string& filter) { - RUN_TEST(Create, filter); - RUN_TEST(GetFrame, filter); -} - -void TestVideoSource::HandleMessage(const pp::Var& message_data) { - if (message_data.AsString().find("blob:") == 0) { - stream_url_ = message_data.AsString(); - event_.Signal(); - } -} - -std::string TestVideoSource::TestCreate() { - PP_Resource video_source; - // Creating a source from an invalid instance returns an invalid resource. - video_source = ppb_video_source_private_interface_->Create(kInvalidInstance); - ASSERT_EQ(kInvalidResource, video_source); - ASSERT_FALSE( - ppb_video_source_private_interface_->IsVideoSource(video_source)); - - // Creating a source from a valid instance returns a valid resource. - video_source = - ppb_video_source_private_interface_->Create(instance_->pp_instance()); - ASSERT_NE(kInvalidResource, video_source); - ASSERT_TRUE( - ppb_video_source_private_interface_->IsVideoSource(video_source)); - - ppb_core_interface_->ReleaseResource(video_source); - // Once released, the resource shouldn't be a video source. - ASSERT_FALSE( - ppb_video_source_private_interface_->IsVideoSource(video_source)); - - PASS(); -} - -std::string TestVideoSource::TestGetFrame() { - std::string js_code; - js_code += "var test_stream;" - "function gotStream(stream){" - " test_stream = stream;" - " var url = URL.createObjectURL(test_stream);" - " var plugin = document.getElementById('plugin');" - " plugin.postMessage(url);" - "}" - "navigator.webkitGetUserMedia(" - "{audio:false, video:true}, gotStream, function() {});"; - instance_->EvalScript(js_code); - event_.Wait(); - - pp::VideoSource_Private video_source(instance_); - TestCompletionCallback cc1(instance_->pp_instance(), false); - cc1.WaitForResult(video_source.Open(stream_url_, cc1.GetCallback())); - ASSERT_EQ(PP_OK, cc1.result()); - TestCompletionCallbackWithOutput<pp::VideoFrame_Private> cc2( - instance_->pp_instance(), false); - cc2.WaitForResult(video_source.GetFrame(cc2.GetCallback())); - ASSERT_EQ(PP_OK, cc2.result()); - const pp::VideoFrame_Private video_frame = cc2.output(); - ASSERT_FALSE(video_frame.image_data().is_null()); - - video_source.Close(); - - PASS(); -} -
diff --git a/ppapi/tests/test_video_source.h b/ppapi/tests/test_video_source.h deleted file mode 100644 index 4edfc61..0000000 --- a/ppapi/tests/test_video_source.h +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PAPPI_TESTS_TEST_VIDEO_SOURCE_H_ -#define PAPPI_TESTS_TEST_VIDEO_SOURCE_H_ - -#include <string> - -#include "ppapi/c/ppb_core.h" -#include "ppapi/c/private/ppb_video_source_private.h" -#include "ppapi/tests/test_case.h" - -class TestVideoSource : public TestCase { - public: - explicit TestVideoSource(TestingInstance* instance); - virtual ~TestVideoSource(); - - private: - // TestCase implementation. - virtual bool Init(); - virtual void RunTests(const std::string& filter); - - // Overrides. - virtual void HandleMessage(const pp::Var& message_data); - - std::string TestCreate(); - std::string TestGetFrame(); - - const PPB_VideoSource_Private* ppb_video_source_private_interface_; - const PPB_Core* ppb_core_interface_; - NestedEvent event_; - std::string stream_url_; -}; - -#endif // PAPPI_TESTS_TEST_VIDEO_SOURCE_H_
diff --git a/ppapi/thunk/BUILD.gn b/ppapi/thunk/BUILD.gn index 73a7447..e1299f6 100644 --- a/ppapi/thunk/BUILD.gn +++ b/ppapi/thunk/BUILD.gn
@@ -137,14 +137,10 @@ "ppb_video_decoder_api.h", "ppb_video_decoder_dev_api.h", "ppb_video_decoder_thunk.cc", - "ppb_video_destination_private_api.h", - "ppb_video_destination_private_thunk.cc", "ppb_video_encoder_api.h", "ppb_video_encoder_thunk.cc", "ppb_video_frame_api.h", "ppb_video_frame_thunk.cc", - "ppb_video_source_private_api.h", - "ppb_video_source_private_thunk.cc", "ppb_view_api.h", "ppb_view_dev_thunk.cc", "ppb_view_thunk.cc",
diff --git a/ppapi/thunk/interfaces_ppb_private_no_permissions.h b/ppapi/thunk/interfaces_ppb_private_no_permissions.h index 2b64de2..5029225 100644 --- a/ppapi/thunk/interfaces_ppb_private_no_permissions.h +++ b/ppapi/thunk/interfaces_ppb_private_no_permissions.h
@@ -48,11 +48,6 @@ PROXIED_IFACE(PPB_ISOLATEDFILESYSTEM_PRIVATE_INTERFACE_0_2, PPB_IsolatedFileSystem_Private_0_2) -PROXIED_IFACE(PPB_VIDEODESTINATION_PRIVATE_INTERFACE_0_1, - PPB_VideoDestination_Private_0_1) -PROXIED_IFACE(PPB_VIDEOSOURCE_PRIVATE_INTERFACE_0_1, - PPB_VideoSource_Private_0_1) - PROXIED_IFACE(PPB_UMA_PRIVATE_INTERFACE_0_3, PPB_UMA_Private_0_3)
diff --git a/ppapi/thunk/ppb_video_destination_private_api.h b/ppapi/thunk/ppb_video_destination_private_api.h deleted file mode 100644 index 08b8cb7..0000000 --- a/ppapi/thunk/ppb_video_destination_private_api.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_THUNK_PPB_VIDEO_DESTINATION_PRIVATE_API_H_ -#define PPAPI_THUNK_PPB_VIDEO_DESTINATION_PRIVATE_API_H_ - -#include <stdint.h> - -#include "base/memory/ref_counted.h" -#include "ppapi/thunk/ppapi_thunk_export.h" - -struct PP_VideoFrame_Private; - -namespace ppapi { - -class TrackedCallback; - -namespace thunk { - -class PPAPI_THUNK_EXPORT PPB_VideoDestination_Private_API { - public: - virtual ~PPB_VideoDestination_Private_API() {} - - virtual int32_t Open(const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) = 0; - virtual int32_t PutFrame(const PP_VideoFrame_Private& frame) = 0; - virtual void Close() = 0; -}; - -} // namespace thunk -} // namespace ppapi - -#endif // PPAPI_THUNK_PPB_VIDEO_DESTINATION_PRIVATE_API_H_
diff --git a/ppapi/thunk/ppb_video_destination_private_thunk.cc b/ppapi/thunk/ppb_video_destination_private_thunk.cc deleted file mode 100644 index 78c38ad..0000000 --- a/ppapi/thunk/ppb_video_destination_private_thunk.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdint.h> - -#include "ppapi/c/pp_completion_callback.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/pp_video_frame_private.h" -#include "ppapi/c/private/ppb_video_destination_private.h" -#include "ppapi/shared_impl/tracked_callback.h" -#include "ppapi/thunk/enter.h" -#include "ppapi/thunk/ppb_instance_api.h" -#include "ppapi/thunk/ppb_video_destination_private_api.h" -#include "ppapi/thunk/resource_creation_api.h" -#include "ppapi/thunk/thunk.h" - -namespace ppapi { -namespace thunk { - -namespace { - -PP_Resource Create(PP_Instance instance) { - EnterResourceCreation enter(instance); - if (enter.failed()) - return 0; - return enter.functions()->CreateVideoDestination(instance); -} - -PP_Bool IsVideoDestination(PP_Resource resource) { - EnterResource<PPB_VideoDestination_Private_API> enter(resource, false); - return PP_FromBool(enter.succeeded()); -} - -int32_t Open(PP_Resource destination, - PP_Var stream_url, - PP_CompletionCallback callback) { - EnterResource<PPB_VideoDestination_Private_API> enter(destination, - callback, true); - if (enter.failed()) - return enter.retval(); - return enter.SetResult(enter.object()->Open(stream_url, enter.callback())); -} - -int32_t PutFrame(PP_Resource destination, - const PP_VideoFrame_Private* frame) { - EnterResource<PPB_VideoDestination_Private_API> enter(destination, true); - if (enter.failed()) - return enter.retval(); - return enter.object()->PutFrame(*frame); -} - -void Close(PP_Resource destination) { - EnterResource<PPB_VideoDestination_Private_API> enter(destination, true); - if (enter.succeeded()) - enter.object()->Close(); -} - -const PPB_VideoDestination_Private_0_1 - g_ppb_video_destination_private_thunk_0_1 = { - &Create, - &IsVideoDestination, - &Open, - &PutFrame, - &Close -}; - -} // namespace - -const PPB_VideoDestination_Private_0_1* - GetPPB_VideoDestination_Private_0_1_Thunk() { - return &g_ppb_video_destination_private_thunk_0_1; -} - -} // namespace thunk -} // namespace ppapi
diff --git a/ppapi/thunk/ppb_video_source_private_api.h b/ppapi/thunk/ppb_video_source_private_api.h deleted file mode 100644 index 3726030..0000000 --- a/ppapi/thunk/ppb_video_source_private_api.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_THUNK_PPB_VIDEO_SOURCE_PRIVATE_API_H_ -#define PPAPI_THUNK_PPB_VIDEO_SOURCE_PRIVATE_API_H_ - -#include <stdint.h> - -#include "base/memory/ref_counted.h" -#include "ppapi/thunk/ppapi_thunk_export.h" - -struct PP_VideoFrame_Private; - -namespace ppapi { - -class TrackedCallback; - -namespace thunk { - -class PPAPI_THUNK_EXPORT PPB_VideoSource_Private_API { - public: - virtual ~PPB_VideoSource_Private_API() {} - - virtual int32_t Open(const PP_Var& stream_url, - scoped_refptr<TrackedCallback> callback) = 0; - virtual int32_t GetFrame(PP_VideoFrame_Private* frame, - scoped_refptr<TrackedCallback> callback) = 0; - virtual void Close() = 0; -}; - -} // namespace thunk -} // namespace ppapi - -#endif // PPAPI_THUNK_PPB_VIDEO_SOURCE_PRIVATE_API_H_
diff --git a/ppapi/thunk/ppb_video_source_private_thunk.cc b/ppapi/thunk/ppb_video_source_private_thunk.cc deleted file mode 100644 index c507ab8c..0000000 --- a/ppapi/thunk/ppb_video_source_private_thunk.cc +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdint.h> - -#include "ppapi/c/pp_completion_callback.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/pp_video_frame_private.h" -#include "ppapi/c/private/ppb_video_source_private.h" -#include "ppapi/shared_impl/tracked_callback.h" -#include "ppapi/thunk/enter.h" -#include "ppapi/thunk/ppb_video_source_private_api.h" -#include "ppapi/thunk/resource_creation_api.h" -#include "ppapi/thunk/thunk.h" - -namespace ppapi { -namespace thunk { - -namespace { - -PP_Resource Create(PP_Instance instance) { - EnterResourceCreation enter(instance); - if (enter.failed()) - return 0; - return enter.functions()->CreateVideoSource(instance); -} - -PP_Bool IsVideoSource(PP_Resource resource) { - EnterResource<PPB_VideoSource_Private_API> enter(resource, false); - return PP_FromBool(enter.succeeded()); -} - -int32_t Open(PP_Resource source, - PP_Var stream_url, - PP_CompletionCallback callback) { - EnterResource<PPB_VideoSource_Private_API> enter(source, callback, true); - if (enter.failed()) - return enter.retval(); - return enter.SetResult(enter.object()->Open(stream_url, enter.callback())); -} - -int32_t GetFrame(PP_Resource source, - PP_VideoFrame_Private* frame, - PP_CompletionCallback callback) { - EnterResource<PPB_VideoSource_Private_API> enter(source, callback, true); - if (enter.failed()) - return enter.retval(); - return enter.SetResult(enter.object()->GetFrame(frame, enter.callback())); -} - -void Close(PP_Resource source) { - EnterResource<PPB_VideoSource_Private_API> enter(source, true); - if (enter.succeeded()) - enter.object()->Close(); -} - -const PPB_VideoSource_Private_0_1 g_ppb_video_source_private_thunk_0_1 = { - &Create, - &IsVideoSource, - &Open, - &GetFrame, - &Close -}; - -} // namespace - -const PPB_VideoSource_Private_0_1* GetPPB_VideoSource_Private_0_1_Thunk() { - return &g_ppb_video_source_private_thunk_0_1; -} - -} // namespace thunk -} // namespace ppapi
diff --git a/ppapi/thunk/resource_creation_api.h b/ppapi/thunk/resource_creation_api.h index 637414a..3c2080d1 100644 --- a/ppapi/thunk/resource_creation_api.h +++ b/ppapi/thunk/resource_creation_api.h
@@ -179,9 +179,7 @@ virtual PP_Resource CreateUDPSocket(PP_Instance instace) = 0; virtual PP_Resource CreateUDPSocketPrivate(PP_Instance instace) = 0; virtual PP_Resource CreateVideoDecoder(PP_Instance instance) = 0; - virtual PP_Resource CreateVideoDestination(PP_Instance instance) = 0; virtual PP_Resource CreateVideoEncoder(PP_Instance instance) = 0; - virtual PP_Resource CreateVideoSource(PP_Instance instance) = 0; virtual PP_Resource CreateVpnProvider(PP_Instance instance) = 0; virtual PP_Resource CreateWebSocket(PP_Instance instance) = 0; virtual PP_Resource CreateX509CertificatePrivate(PP_Instance instance) = 0;
diff --git a/remoting/android/java/src/org/chromium/chromoting/Desktop.java b/remoting/android/java/src/org/chromium/chromoting/Desktop.java index 37dc380..ea90844 100644 --- a/remoting/android/java/src/org/chromium/chromoting/Desktop.java +++ b/remoting/android/java/src/org/chromium/chromoting/Desktop.java
@@ -76,10 +76,10 @@ private ActivityLifecycleListener mActivityLifecycleListener; /** Indicates whether a Soft Input UI (such as a keyboard) is visible. */ - private boolean mSoftInputVisible = false; + private boolean mSoftInputVisible; /** Indicates whether resize-to-client is enabled. */ - private boolean mResizeToClientEnabled = false; + private boolean mResizeToClientEnabled; /** Holds the scheduled task object which will be called to hide the ActionBar. */ private Runnable mActionBarAutoHideTask; @@ -105,7 +105,7 @@ private boolean mHasPhysicalKeyboard; /** Tracks whether the activity is in windowed mode. */ - private boolean mIsInWindowedMode = false; + private boolean mIsInWindowedMode; /** Called when the activity is first created. */ @Override
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java b/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java index e48a51c..0310fe8 100644 --- a/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java +++ b/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java
@@ -58,7 +58,7 @@ * viewport center is mapped to the center of the screen. If true, then System UI sizes will be * used to determine the center of the viewport. */ - private boolean mAdjustViewportSizeForSystemUi = false; + private boolean mAdjustViewportSizeForSystemUi; /* Used to perform per-frame rendering tasks. */ private Event.ParameterCallback<Boolean, Void> mFrameRenderedCallback; @@ -444,7 +444,7 @@ private final Interpolator mInterpolator = new DecelerateInterpolator(); - private long mStartTime = 0; + private long mStartTime; private final float mOriginalX = mViewportOffset.x - targetOffset.x; private final float mOriginalY = mViewportOffset.y - targetOffset.y;
diff --git a/remoting/android/java/src/org/chromium/chromoting/RenderData.java b/remoting/android/java/src/org/chromium/chromoting/RenderData.java index 673efa3..2d6c940 100644 --- a/remoting/android/java/src/org/chromium/chromoting/RenderData.java +++ b/remoting/android/java/src/org/chromium/chromoting/RenderData.java
@@ -14,13 +14,13 @@ /** Stores pan and zoom configuration and converts image coordinates to screen coordinates. */ public Matrix transform = new Matrix(); - public int screenWidth = 0; - public int screenHeight = 0; - public int imageWidth = 0; - public int imageHeight = 0; + public int screenWidth; + public int screenHeight; + public int imageWidth; + public int imageHeight; /** Determines whether the local cursor should be drawn. */ - public boolean drawCursor = false; + public boolean drawCursor; /** * Specifies the position, in image coordinates, at which the cursor image will be drawn.
diff --git a/remoting/android/java/src/org/chromium/chromoting/SimulatedTouchInputStrategy.java b/remoting/android/java/src/org/chromium/chromoting/SimulatedTouchInputStrategy.java index 6abcf29f..722158d 100644 --- a/remoting/android/java/src/org/chromium/chromoting/SimulatedTouchInputStrategy.java +++ b/remoting/android/java/src/org/chromium/chromoting/SimulatedTouchInputStrategy.java
@@ -25,7 +25,7 @@ /** * Stores the time of the most recent left button single tap processed. */ - private long mLastTapTimeInMs = 0; + private long mLastTapTimeInMs; /** * Stores the position of the last left button single tap processed.
diff --git a/remoting/android/java/src/org/chromium/chromoting/SwipePinchDetector.java b/remoting/android/java/src/org/chromium/chromoting/SwipePinchDetector.java index 8f3b17f5..5d634fc7 100644 --- a/remoting/android/java/src/org/chromium/chromoting/SwipePinchDetector.java +++ b/remoting/android/java/src/org/chromium/chromoting/SwipePinchDetector.java
@@ -32,7 +32,7 @@ * The initial coordinates above are valid when this flag is set. Used to determine whether a * MotionEvent's pointer coordinates are the first ones of the gesture. */ - private boolean mInGesture = false; + private boolean mInGesture; /** * Threshold squared-distance, in pixels, to use for motion-detection.
diff --git a/remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java b/remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java index 0fa56fa..57e7aba5 100644 --- a/remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java +++ b/remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java
@@ -60,13 +60,13 @@ private final int mTouchSlopSquare; /** The maximum number of fingers seen in the gesture. */ - private int mPointerCount = 0; + private int mPointerCount; /** The coordinates of the first finger down seen in the gesture. */ private PointF mInitialPoint; /** Set to true whenever motion is detected in the gesture, or a long-touch is triggered. */ - private boolean mTapCancelled = false; + private boolean mTapCancelled; // This static inner class holds a WeakReference to the outer object, to avoid triggering the // lint HandlerLeak warning.
diff --git a/remoting/android/java/src/org/chromium/chromoting/TouchInputHandler.java b/remoting/android/java/src/org/chromium/chromoting/TouchInputHandler.java index f160987..130b4e20 100644 --- a/remoting/android/java/src/org/chromium/chromoting/TouchInputHandler.java +++ b/remoting/android/java/src/org/chromium/chromoting/TouchInputHandler.java
@@ -49,7 +49,7 @@ * Used for tracking swipe gestures. Only the Y-direction is needed for responding to swipe-up * or swipe-down. */ - private float mTotalMotionY = 0; + private float mTotalMotionY; /** * Distance in pixels beyond which a motion gesture is considered to be a swipe. This is @@ -73,31 +73,31 @@ * Set to true to prevent any further movement of the cursor, for example, when showing the * keyboard to prevent the cursor wandering from the area where keystrokes should be sent. */ - private boolean mSuppressCursorMovement = false; + private boolean mSuppressCursorMovement; /** * Set to true to suppress the fling animation at the end of a gesture, for example, when * dragging whilst a button is held down. */ - private boolean mSuppressFling = false; + private boolean mSuppressFling; /** * Set to true when 2-finger fling (scroll gesture with final velocity) is detected to trigger * a scrolling animation. */ - private boolean mScrollFling = false; + private boolean mScrollFling; /** * Set to true when 3-finger swipe gesture is complete, so that further movement doesn't * trigger more swipe actions. */ - private boolean mSwipeCompleted = false; + private boolean mSwipeCompleted; /** * Set to true when a 1 finger pan gesture originates with a longpress. This means the user * is performing a drag operation. */ - private boolean mIsDragging = false; + private boolean mIsDragging; private Event.ParameterCallback<Boolean, Void> mProcessAnimationCallback;
diff --git a/remoting/android/java/src/org/chromium/chromoting/TouchInputStrategy.java b/remoting/android/java/src/org/chromium/chromoting/TouchInputStrategy.java index 0d0550ac..6ffff21e 100644 --- a/remoting/android/java/src/org/chromium/chromoting/TouchInputStrategy.java +++ b/remoting/android/java/src/org/chromium/chromoting/TouchInputStrategy.java
@@ -39,13 +39,13 @@ /** * Indicates that the events received should be treated as part of an active remote gesture. */ - private boolean mInRemoteGesture = false; + private boolean mInRemoteGesture; /** * Indicates whether MotionEvents and gestures should be acted upon or ignored. This flag is * set when we believe that the current sequence of events is not something we should remote. */ - private boolean mIgnoreTouchEvents = false; + private boolean mIgnoreTouchEvents; private final RenderData mRenderData; private final InputEventSender mInjector;
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java b/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java index a608b59..b9b6f31b 100644 --- a/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java +++ b/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java
@@ -34,7 +34,7 @@ private long mNativeJniGlDisplay; private InputFeedbackRadiusMapper mFeedbackRadiusMapper; - private float mScaleFactor = 0; + private float mScaleFactor; private GlDisplay(long nativeJniGlDisplay) { mNativeJniGlDisplay = nativeJniGlDisplay;
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc index 36b76e9..520489cd 100644 --- a/remoting/host/remoting_me2me_host.cc +++ b/remoting/host/remoting_me2me_host.cc
@@ -1729,10 +1729,10 @@ // Create the main message loop and start helper threads. base::MessageLoopForUI message_loop; + base::RunLoop run_loop; std::unique_ptr<ChromotingHostContext> context = ChromotingHostContext::Create(new AutoThreadTaskRunner( - message_loop.task_runner(), - base::RunLoop::QuitCurrentWhenIdleClosureDeprecated())); + message_loop.task_runner(), run_loop.QuitClosure())); if (!context) return kInitializationFailed; @@ -1749,7 +1749,7 @@ new HostProcess(std::move(context), &exit_code, &shutdown_watchdog); // Run the main (also UI) message loop until the host no longer needs it. - base::RunLoop().Run(); + run_loop.Run(); // Block until tasks blocking shutdown have completed their execution. base::TaskScheduler::GetInstance()->Shutdown();
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb index ea630a5d..bdb42f6 100644 --- a/remoting/resources/remoting_strings_am.xtb +++ b/remoting/resources/remoting_strings_am.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">እንዴት እንደሆነ ይወቁ</translation> <translation id="3718805989288361841">በChrome የርቀት ዴስክቶፕ የመመሪያ ቅንብሮች ውስጥ አንድ ስህተት አለ። እገዛ ለማግኘት የሥርዓት አስተዳዳሪዎን ያነጋግሩ።</translation> <translation id="3776024066357219166">የChrome የርቀት ዴስክቶፕ ክፍለ-ጊዜው ተጠናቅቋል።</translation> +<translation id="3846148461359626420">• በiPhone X ላይ የተሻለ የማንፏቀቅ እና የማጉላት ተሞክሮ። +• የእርጋታ ማሻሻያዎች እና የሳንካ ጥገናዎች።</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">እባክዎ በChrome የርቀት ዴስክቶፕ መዳረሻ ለመፍቀድ መለያዎን እና ፒንዎን ከዚህ በታች ያረጋግጡ።</translation> <translation id="3897092660631435901">ምናሌ</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb index 5a437823..91a4e44a 100644 --- a/remoting/resources/remoting_strings_ar.xtb +++ b/remoting/resources/remoting_strings_ar.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">تعرَّف على كيفية إجراء ذلك</translation> <translation id="3718805989288361841">هناك خطأ في إعدادات السياسة لسطح المكتب البعيد من Chrome. اتصل بمشرف النظام لتلقي المساعدة.</translation> <translation id="3776024066357219166">انتهت جلسة سطح المكتب البعيد من Chrome.</translation> +<translation id="3846148461359626420">• تجربة أفضل للتحريك والتكبير/التصغير على iPhone X +• تحسينات الثبات وإصلاح الأخطاء</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">يُرجى التأكيد على حسابك ورقم تعريفك الشخصي أدناه للسماح بالدخول من خلال سطح المكتب البعيد من Chrome.</translation> <translation id="3897092660631435901">قائمة</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb index 929785c..5c436ef 100644 --- a/remoting/resources/remoting_strings_bg.xtb +++ b/remoting/resources/remoting_strings_bg.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Научете как</translation> <translation id="3718805989288361841">В настройките на правилата за Отдалечен работен плот на Chrome има грешка. Свържете се със системния си администратор за съдействие.</translation> <translation id="3776024066357219166">Сесията ви в отдалечения работен плот на Chrome приключи.</translation> +<translation id="3846148461359626420">• По-добро панорамно придвижване и промяна на мащаба под iPhone X. +• Подобрения в стабилността и поправки на програмни грешки.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Моля, потвърдете профила и ПИН кода си по-долу, за да разрешите достъпа чрез отдалечения работен плот на Chrome.</translation> <translation id="3897092660631435901">Меню</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb index 2304bf17..e80695c 100644 --- a/remoting/resources/remoting_strings_ca.xtb +++ b/remoting/resources/remoting_strings_ca.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Més informació</translation> <translation id="3718805989288361841">S'ha produït un error amb la configuració de la política de l'escriptori remot de Chrome. Contacta amb l'administrador del sistema per obtenir assistència.</translation> <translation id="3776024066357219166">La sessió de l'escriptori remot de Chrome ha finalitzat.</translation> +<translation id="3846148461359626420">• Millores en les funcions de panoràmica i zoom a iPhone X. +• Millores d'estabilitat i correcció d'errors.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirmeu el vostre compte i PIN a continuació per permetre l'accés per l'escriptori remot de Chrome.</translation> <translation id="3897092660631435901">Menú</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb index 227eb171..b8009241 100644 --- a/remoting/resources/remoting_strings_cs.xtb +++ b/remoting/resources/remoting_strings_cs.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Postup</translation> <translation id="3718805989288361841">Nastavení zásad Vzdálené plochy Chrome je chybné. Požádejte o pomoc administrátora systému.</translation> <translation id="3776024066357219166">Relace Vzdálené plochy Chrome byla ukončena.</translation> +<translation id="3846148461359626420">• Zdokonalení posouvání a změny velikosti zobrazení v telefonu iPhone X +• Vylepšení stability a opravy chyb</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">K povolení přístupu prostřednictvím Vzdálené plochy Chrome je třeba potvrdit účet a kód PIN níže.</translation> <translation id="3897092660631435901">Nabídka</translation>
diff --git a/remoting/resources/remoting_strings_da.xtb b/remoting/resources/remoting_strings_da.xtb index 2a0b6c6..32eeccd 100644 --- a/remoting/resources/remoting_strings_da.xtb +++ b/remoting/resources/remoting_strings_da.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Få flere oplysninger om, hvordan du gør</translation> <translation id="3718805989288361841">Der er en fejl i politikindstillingerne for Chrome Fjernskrivebord. Kontakt din systemadministrator for at få hjælp.</translation> <translation id="3776024066357219166">Din session med Chrome Fjernskrivebord er afsluttet.</translation> +<translation id="3846148461359626420">• Bedre panorering og zoom på iPhone X. +• Forbedret stabilitet og fejlrettelser.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekræft din konto og pinkode nedenfor for at tillade adgang via Chrome Fjernskrivebord.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb index f1cdba5..ccd0783 100644 --- a/remoting/resources/remoting_strings_de.xtb +++ b/remoting/resources/remoting_strings_de.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Weitere Informationen</translation> <translation id="3718805989288361841">Die Richtlinieneinstellungen für Chrome Remote Desktop sind fehlerhaft. Wenden Sie sich an Ihren Systemadministrator.</translation> <translation id="3776024066357219166">Ihre Chrome Remote Desktop-Sitzung wurde beendet.</translation> +<translation id="3846148461359626420">• Verbessertes Schwenken und Zoomen auf iPhone X. +• Stabilitätsverbesserungen und Fehlerkorrekturen.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bestätigen Sie unten Ihr Konto und Ihre PIN, um Zugriff über Chrome Remote Desktop zu gewähren.</translation> <translation id="3897092660631435901">Menü</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb index 45efb28..b1ebf72 100644 --- a/remoting/resources/remoting_strings_el.xtb +++ b/remoting/resources/remoting_strings_el.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Μάθετε πώς</translation> <translation id="3718805989288361841">Παρουσιάστηκε σφάλμα με τις ρυθμίσεις πολιτικής για την Απομακρυσμένη επιφάνεια εργασίας Chrome. Επικοινωνήστε με τον διαχειριστή του συστήματός σας για βοήθεια.</translation> <translation id="3776024066357219166">Η περίοδος σύνδεσης στην Απομακρυσμένη επιφάνεια εργασίας Chrome τερματίστηκε.</translation> +<translation id="3846148461359626420">• Καλύτερη εμπειρία μετακίνησης και εστίασης στο iPhone X. +• Βελτιώσεις σταθερότητας και διόρθωση σφαλμάτων.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Επιβεβαιώστε το λογαριασμό σας και τον κωδικό σας PIN παρακάτω, για να επιτρέψετε την πρόσβαση μέσω Απομακρυσμένης επιφάνειας εργασίας Chrome.</translation> <translation id="3897092660631435901">Μενού</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb index b199e3bd..225ef34e 100644 --- a/remoting/resources/remoting_strings_en-GB.xtb +++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -102,7 +102,6 @@ <translation id="3171922709365450819">This device is not supported by this client because it requires third-party authentication.</translation> <translation id="3194245623920924351">Chrome Remote Desktop</translation> <translation id="3197730452537982411">Remote Desktop</translation> -<translation id="3212472844831225214">• Added support for Android 9.0 Pie.</translation> <translation id="324272851072175193">Email these instructions</translation> <translation id="3258789396564295715">You may securely access this computer using Chrome Remote Desktop.</translation> <translation id="3286521253923406898">Chromoting Host Controller</translation>
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb index 7b4cb55..15b6313 100644 --- a/remoting/resources/remoting_strings_es.xtb +++ b/remoting/resources/remoting_strings_es.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Descubre cómo hacerlo</translation> <translation id="3718805989288361841">Se ha producido un error relacionado con la configuración de políticas de Escritorio Remoto de Chrome. Ponte en contacto con el administrador de tu sistema para obtener ayuda.</translation> <translation id="3776024066357219166">Ha finalizado tu sesión en Escritorio Remoto de Chrome.</translation> +<translation id="3846148461359626420">• Se ha mejorado la experiencia de ver panorámicas y hacer zoom en iPhone X. +• Mejoras de estabilidad y corrección de errores.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirma la cuenta y el PIN a continuación para permitir el acceso de Escritorio Remoto de Chrome.</translation> <translation id="3897092660631435901">Menú</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb index ab34792d..edd67283 100644 --- a/remoting/resources/remoting_strings_et.xtb +++ b/remoting/resources/remoting_strings_et.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Lisateave</translation> <translation id="3718805989288361841">Chrome Remote Desktopi reegli seadetes on viga. Abi saamiseks võtke ühendust süsteemiadministraatoriga.</translation> <translation id="3776024066357219166">Teie Chrome Remote Desktopi seanss on lõppenud.</translation> +<translation id="3846148461359626420">• Parem paanimis- ja suumimisfunktsioon iPhone X-is. +• Stabiilsuse täiustused ja veaparandused.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome Remote Desktopi abil juurdepääsu lubamiseks kinnitage allpool oma konto ja PIN-kood.</translation> <translation id="3897092660631435901">Menüü</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb index 709863c5..b511213c 100644 --- a/remoting/resources/remoting_strings_fa.xtb +++ b/remoting/resources/remoting_strings_fa.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">با نحوه انجام کار آشنا شوید</translation> <translation id="3718805989288361841">خطایی در تنظیمات خطمشی «کنترل رایانه ازراهدور Chrome» وجود دارد. برای راهنمایی با سرپرست سیستم خود تماس بگیرید.</translation> <translation id="3776024066357219166">جلسه "کنترل رایانه ازراهدور Chrome" تمام شد.</translation> +<translation id="3846148461359626420">• تجربه حرکت و بزرگنمایی بهتر در iPhone X. +• بهبود پایداری و رفع اشکالات.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">برای اجازه دسترسی ازطریق برنامه کنترل رایانه ازراهدور Chrome، لطفاً حساب و پین خود را در زیر تأیید کنید.</translation> <translation id="3897092660631435901">منو</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb index 0eb12f6c..c208c53 100644 --- a/remoting/resources/remoting_strings_fi.xtb +++ b/remoting/resources/remoting_strings_fi.xtb
@@ -102,7 +102,6 @@ <translation id="3171922709365450819">Asiakassovellus ei tue laitetta, koska laite edellyttää kolmannen osapuolen todennusta.</translation> <translation id="3194245623920924351">Chrome-etäkäyttö</translation> <translation id="3197730452537982411">Etäkäyttö</translation> -<translation id="3212472844831225214">• Lisätty Android 9.0 Pie ‑tuki</translation> <translation id="324272851072175193">Lähetä nämä ohjeet sähköpostilla</translation> <translation id="3258789396564295715">Tähän tietokoneeseen voi muodostaa suojatun yhteyden Chrome-etäkäytön avulla.</translation> <translation id="3286521253923406898">Chromoting-isännän hallinta</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb index be68f77c..67a9c5d 100644 --- a/remoting/resources/remoting_strings_fil.xtb +++ b/remoting/resources/remoting_strings_fil.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Alamin kung paano</translation> <translation id="3718805989288361841">Mayroong error sa mga setting ng patakaran para sa Remote na Desktop ng Chrome. Makipag-ugnayan sa iyong system administrator para sa tulong.</translation> <translation id="3776024066357219166">Natapos na ang iyong session sa Remote na Desktop ng Chrome.</translation> +<translation id="3846148461359626420">• Mas magandang karanasan sa pag-pan at pag-zoom sa iPhone X. +• Mga pagpapahusay sa katatagan at pag-aayos ng bug.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Pakikumpirma ang iyong account at PIN sa ibaba upang payagan ang pag-access ng Remote na Desktop ng Chrome.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb index dde4481..54aefae1 100644 --- a/remoting/resources/remoting_strings_fr.xtb +++ b/remoting/resources/remoting_strings_fr.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Comment procéder</translation> <translation id="3718805989288361841">Erreur dans les paramètres des règles pour le bureau à distance Chrome. Veuillez contacter votre administrateur système pour obtenir de l'aide.</translation> <translation id="3776024066357219166">La session du bureau à distance Google Chrome est terminée.</translation> +<translation id="3846148461359626420">• Amélioration du panoramique et du zoom sur iPhone X. +• Correction de bugs et amélioration de la stabilité.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Veuillez confirmer le compte et le code d'accès ci-dessous pour autoriser l'accès du Bureau à distance Google Chrome à votre compte.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb index dd245c3..8ae46745 100644 --- a/remoting/resources/remoting_strings_gu.xtb +++ b/remoting/resources/remoting_strings_gu.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">જાણો કેવી રીતે</translation> <translation id="3718805989288361841">Chrome રિમોટ ડેસ્કટૉપ માટેની નીતિ સેટિંગ્સમાં એક ભૂલ આવી છે. સહાય માટે તમારા સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="3776024066357219166">તમારું Chrome રીમોટ ડેસ્કટૉપ સત્ર સમાપ્ત થયું.</translation> +<translation id="3846148461359626420">• iPhone X પર ફેરવવા અને ઝૂમ કરવાનો વધુ સારો અનુભવ. +• સ્થિરતા સુધારા અને ખામીના સુધારા.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome રીમોટ ડેસ્કટૉપ દ્વારા ઍક્સેસની મંજૂરી આપવા માટે કૃપા કરીને નીચે તમારા એકાઉન્ટ અને પિનની પુષ્ટિ કરો.</translation> <translation id="3897092660631435901">મેનૂ</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb index 9295946..8ebed0c 100644 --- a/remoting/resources/remoting_strings_hi.xtb +++ b/remoting/resources/remoting_strings_hi.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">तरीका जानें</translation> <translation id="3718805989288361841">Chrome दूरस्थ डेस्कटॉप की नीति सेटिंग में कोई गड़बड़ी है. सहायता के लिए अपने सिस्टम व्यवस्थापक से संपर्क करें.</translation> <translation id="3776024066357219166">आपका Chrome दूरस्थ डेस्कटॉप सत्र समाप्त हो चुका है.</translation> +<translation id="3846148461359626420">• iPhone X पर बेहतर पैन करने और ज़ूम करने का अनुभव. +• स्थिरता सुधार और गड़बड़ी ठीक करना.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome दूरस्थ डेस्कटॉप द्वारा एक्सेस की अनुमति देने के लिए कृपया नीचे अपने खाते और PIN की दुबारा पूछें.</translation> <translation id="3897092660631435901">मेनू</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb index c53cfed..9a92580 100644 --- a/remoting/resources/remoting_strings_hr.xtb +++ b/remoting/resources/remoting_strings_hr.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Saznajte kako</translation> <translation id="3718805989288361841">Došlo je do pogreške s postavkama pravila za Udaljenu radnu površinu Chrome. Obratite se administratoru sustava za pomoć.</translation> <translation id="3776024066357219166">Završila je vaša sesija u aplikaciji Udaljena radna površina Chrome.</translation> +<translation id="3846148461359626420">• Bolji doživljaj pomicanja i zumiranja na uređaju iPhone X. +• Poboljšanja stabilnosti i ispravci programskih pogrešaka.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Potvrdite svoj račun i PIN u nastavku da biste usluzi Udaljena radna površina Chrome dozvolili pristup.</translation> <translation id="3897092660631435901">Izbornik</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb index e902a04..cc5231a6b 100644 --- a/remoting/resources/remoting_strings_hu.xtb +++ b/remoting/resources/remoting_strings_hu.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Tudnivalók</translation> <translation id="3718805989288361841">Hibát észleltünk a Chrome távoliasztal-szolgáltatás házirend-beállításaival kapcsolatban. Segítségért forduljon a rendszergazdához.</translation> <translation id="3776024066357219166">A Chrome távoliasztal-szolgáltatás munkamenet véget ért.</translation> +<translation id="3846148461359626420">• Jobb pásztázási és kicsinyítési/nagyítási élmény iPhone X eszközön. +• Stabilitási fejlesztések és programhiba-javítások.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Kérjük, erősítse meg a fiókot és a PIN kódot alább a Chrome távoliasztal-szolgáltatás hozzáférésének engedélyezéséhez.</translation> <translation id="3897092660631435901">Menü</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb index 080288c..1b9e621 100644 --- a/remoting/resources/remoting_strings_id.xtb +++ b/remoting/resources/remoting_strings_id.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Pelajari caranya</translation> <translation id="3718805989288361841">Terjadi error pada setelan kebijakan untuk Chrome Desktop Jarak Jauh. Hubungi administrator sistem untuk mendapatkan bantuan.</translation> <translation id="3776024066357219166">Sesi Chrome Desktop Jarak Jauh Anda telah berakhir.</translation> +<translation id="3846148461359626420">• Pengalaman menggeser dan zoom yang lebih baik di iPhone X. +• Penyempurnaan stabilitas dan perbaikan bug.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Konfirmasi akun dan PIN Anda di bawah guna mengizinkan akses oleh Chrome Desktop Jarak Jauh</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb index f92a761..9586dd0 100644 --- a/remoting/resources/remoting_strings_it.xtb +++ b/remoting/resources/remoting_strings_it.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Scopri come</translation> <translation id="3718805989288361841">Si è verificato un errore con le impostazioni delle norme per Chrome Remote Desktop. Contatta l'amministratore di sistema per ricevere assistenza.</translation> <translation id="3776024066357219166">La sessione Chrome Remote Desktop è terminata.</translation> +<translation id="3846148461359626420">• Panoramica e zoom migliorati su iPhone X. +• Stabilità migliorata e correzioni di bug.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Conferma il tuo account e il PIN per consentire l'accesso tramite Chrome Remote Desktop.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb index 26270be..4e4eef3 100644 --- a/remoting/resources/remoting_strings_iw.xtb +++ b/remoting/resources/remoting_strings_iw.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">איך עושים זאת</translation> <translation id="3718805989288361841">אירעה שגיאה בהגדרות המדיניות לשולחן העבודה המרוחק של Chrome. פנה למנהל המערכת כדי לקבל עזרה.</translation> <translation id="3776024066357219166">הפעילות של 'שולחן עבודה מרוחק של Chrome' הסתיימה.</translation> +<translation id="3846148461359626420">• חוויה משופרת בהזזת התצוגה ובזום ב-iPhone X. +• שיפורי יציבות ותיקוני באגים.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">אשר את החשבון ומספר ה-PIN שלך שמפורטים למטה כדי לאפשר גישה באמצעות שולחן העבודה המרוחק של Chrome.</translation> <translation id="3897092660631435901">תפריט</translation>
diff --git a/remoting/resources/remoting_strings_ja.xtb b/remoting/resources/remoting_strings_ja.xtb index 65207636..cb79a72 100644 --- a/remoting/resources/remoting_strings_ja.xtb +++ b/remoting/resources/remoting_strings_ja.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">詳細</translation> <translation id="3718805989288361841">Chrome リモート デスクトップのポリシー設定にエラーがあります。不明点はシステム管理者にお問い合わせください。</translation> <translation id="3776024066357219166">Chrome リモート デスクトップ セッションが終了しました。</translation> +<translation id="3846148461359626420">• iPhone X でのパンとズームの操作性が向上しました。 +• 安定性を高め、バグを修正しました。</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome リモート デスクトップによるアクセスを許可するには、下記でアカウントと PIN の確認を行ってください。</translation> <translation id="3897092660631435901">メニュー</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb index f5ffd45..99f6fb1 100644 --- a/remoting/resources/remoting_strings_kn.xtb +++ b/remoting/resources/remoting_strings_kn.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">ಹೇಗೆ ಎಂಬುದನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ</translation> <translation id="3718805989288361841">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್ಟಾಪ್ಗೆ ನೀತಿ ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೂಲಕ ದೋಷ ಕಂಡುಬಂದಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="3776024066357219166">ನಿಮ್ಮ Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅವಧಿಯು ಕೊನೆಗೊಂಡಿದೆ.</translation> +<translation id="3846148461359626420">• iPhone X ನಲ್ಲಿ ಪ್ಯಾನ್ ಮತ್ತು ಝೂಮ್ ಮಾಡುವ ಅನುಭವವನ್ನು ಉತ್ತಮಪಡಿಸಲಾಗಿದೆ. +• ಸ್ಥಿರತೆ ಸುಧಾರಣೆಗಳು ಮತ್ತು ದೋಷ ಪರಿಹಾರಗಳು.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್ಟಾಪ್ ಮೂಲಕ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು, ಕೆಳಗೆ ನಿಮ್ಮ ಖಾತೆ ಮತ್ತು PIN ಅನ್ನು ದೃಢೀಕರಿಸಿ.</translation> <translation id="3897092660631435901">ಮೆನು</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb index c9ce61f..d0f8a5a 100644 --- a/remoting/resources/remoting_strings_ko.xtb +++ b/remoting/resources/remoting_strings_ko.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">자세히 알아보기</translation> <translation id="3718805989288361841">Chrome 원격 데스크톱 관련 정책 설정에 오류가 있습니다. 시스템 관리자에게 도움을 요청하세요.</translation> <translation id="3776024066357219166">Chrome 원격 데스크톱 세션이 종료되었습니다.</translation> +<translation id="3846148461359626420">• iPhone X 화면 이동 및 확대/축소 개선 +• 안정성 개선 및 버그 수정</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome 원격 데스크톱스으로 액세스할 수 있도록 아래 계정 및 PIN을 확인하세요.</translation> <translation id="3897092660631435901">메뉴</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb index 91df9487..667ad1e 100644 --- a/remoting/resources/remoting_strings_lt.xtb +++ b/remoting/resources/remoting_strings_lt.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Sužinokite kaip</translation> <translation id="3718805989288361841">Įvyko „Chrome“ nuotolinio kompiuterio valdymo politikos nustatymų klaida. Kreipkitės pagalbos į sistemos administratorių.</translation> <translation id="3776024066357219166">Baigėsi „Chrome“ nuotolinio kompiuterio valdymo sesija.</translation> +<translation id="3846148461359626420">• Geriau stumdoma ir keičiamas mastelis „iPhone X“. +• Stabilumo patobulinimai ir riktų pataisymai.</translation> <translation id="3870154837782082782">„Google Inc.“</translation> <translation id="3884839335308961732">Kad leistumėte prieigą naudojant „Chrome“ nuotolinį kompiuterio valdymą, toliau patvirtinkite savo paskyrą ir PIN kodą.</translation> <translation id="3897092660631435901">Meniu</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb index cfebdb92..363ade0c 100644 --- a/remoting/resources/remoting_strings_lv.xtb +++ b/remoting/resources/remoting_strings_lv.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Uzzināt vairāk</translation> <translation id="3718805989288361841">Radās kļūda Chrome attālās darbvirsmas politikas iestatījumos. Sazinieties ar sistēmas administratoru, lai saņemtu palīdzību.</translation> <translation id="3776024066357219166">Jūsu Chrome attālās darbvirsmas sesija ir pārtraukta.</translation> +<translation id="3846148461359626420">• Uzlabota pārvietošanas un tālummaiņas funkciju darbība iPhone X ierīcēs. +• Stabilitātes uzlabojumi un kļūdu labojumi.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Lai atļautu piekļuvi, izmantojot Chrome attālo darbvirsmu, lūdzu, apstipriniet kontu un PIN kodu.</translation> <translation id="3897092660631435901">Izvēlne</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb index a7a15693..4e0fee3 100644 --- a/remoting/resources/remoting_strings_ml.xtb +++ b/remoting/resources/remoting_strings_ml.xtb
@@ -121,6 +121,8 @@ <translation id="3695446226812920698">എങ്ങനെയെന്നറിയുക</translation> <translation id="3718805989288361841">Chrome വിദൂര ഡെസ്ക്ടോപ്പിനായുള്ള നയങ്ങളുടെ ക്രമീകരണത്തിൽ പിശകുണ്ടായി. സഹായത്തിന് നിങ്ങളുടെ സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.</translation> <translation id="3776024066357219166">നിങ്ങളുടെ Chrome വിദൂര ഡെസ്ക്ടോപ്പ് സെഷന് അവസാനിച്ചു.</translation> +<translation id="3846148461359626420">• iPhone X-ൽ കൂടുതൽ നല്ല പാൻ ചെയ്യൽ, സൂം ചെയ്യൽ അനുഭവം. +• സ്ഥിരത മെച്ചപ്പെടുത്തലും ബഗ് പരിഹരിക്കലും.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome വിദൂര ഡെസ്ക്ടോപ്പിലൂടെ ആക്സസ്സ് അനുവദിക്കുന്നതിന് ചുവടെയുള്ള നിങ്ങളുടെ അക്കൗണ്ടും PIN-ഉം സ്ഥിരീകരിക്കുക.</translation> <translation id="3897092660631435901">മെനു</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb index 07a5191..da67cc355 100644 --- a/remoting/resources/remoting_strings_mr.xtb +++ b/remoting/resources/remoting_strings_mr.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">कसे ते जाणून घ्या</translation> <translation id="3718805989288361841">Chrome रिमोट डेस्कटॉपच्या धोरण सेटिंग्जमध्ये एरर आली आहे. साहाय्यासाठी तुमच्या सिस्टम प्रशसकाशी संपर्क साधा.</translation> <translation id="3776024066357219166">आपले Chrome रिमोट डेस्कटॉप सत्र समाप्त झाले आहे.</translation> +<translation id="3846148461359626420">• iPhone X वर आणखी चांगला पॅनिंग आणि झूमिंग अनुभव. +• स्थिरता सुधारणा आणि बग फिक्स.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">कृपया Chrome दूरस्थ डेस्कटॉपद्वारे प्रवेश करण्यास अनुमती देण्यासाठी आपल्या खात्याची आणि पिन ची खाली पुष्टी करा.</translation> <translation id="3897092660631435901">मेनू</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb index ae5e7af9..b220180 100644 --- a/remoting/resources/remoting_strings_ms.xtb +++ b/remoting/resources/remoting_strings_ms.xtb
@@ -102,7 +102,6 @@ <translation id="3171922709365450819">Peranti ini tidak disokong oleh pelanggan ini kerana peranti memerlukan pengesahan pihak ketiga.</translation> <translation id="3194245623920924351">Desktop Jauh Chrome</translation> <translation id="3197730452537982411">Desktop Jauh</translation> -<translation id="3212472844831225214">• Sokongan tambahan untuk Android 9.0 Pie.</translation> <translation id="324272851072175193">E-melkan arahan ini</translation> <translation id="3258789396564295715">Anda boleh mengakses komputer ini dengan selamat menggunakan Desktop Jauh Chrome.</translation> <translation id="3286521253923406898">Alat Kawalan Hos Chromoting</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb index 8caaed9..2c57c64 100644 --- a/remoting/resources/remoting_strings_nl.xtb +++ b/remoting/resources/remoting_strings_nl.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Meer informatie</translation> <translation id="3718805989288361841">Er is een probleem met de beleidsinstellingen voor Chrome Remote Desktop. Neem contact op met je systeembeheerder voor hulp.</translation> <translation id="3776024066357219166">Je Chrome Remote Desktop-sessie is beëindigd.</translation> +<translation id="3846148461359626420">• Schuiven en zoomen is verbeterd op de iPhone X. +• Stabiliteitsverbeteringen en bugfixes.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bevestig je account en pincode hieronder om toegang door Chrome Remote Desktop toe te staan.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb index 7478cfb..14b2aa3 100644 --- a/remoting/resources/remoting_strings_no.xtb +++ b/remoting/resources/remoting_strings_no.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Sånn gjør du det</translation> <translation id="3718805989288361841">Det er noe feil med innstillingene for retningslinjene for Chrome Eksternt skrivebord. Kontakt systemadministratoren din for å få hjelp.</translation> <translation id="3776024066357219166">Chrome Eksternt skrivebord-økten din er avsluttet.</translation> +<translation id="3846148461359626420">• Bedre panorering og zooming på iPhone X. +• Stabilitetsforbedringer og feilrettinger.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekreft kontoen og PIN-koden din nedenfor for å tillate tilgang via Chrome Eksternt skrivebord.</translation> <translation id="3897092660631435901">Meny</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb index 9a1332545..c32050d 100644 --- a/remoting/resources/remoting_strings_pl.xtb +++ b/remoting/resources/remoting_strings_pl.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Instrukcje</translation> <translation id="3718805989288361841">Wystąpił błąd związany z ustawieniami zasad dla Pulpitu zdalnego Chrome. Aby uzyskać pomoc, skontaktuj się z administratorem systemu.</translation> <translation id="3776024066357219166">Sesja Pulpitu zdalnego Chrome została zakończona.</translation> +<translation id="3846148461359626420">• Lepsze działanie przesuwania i powiększania na iPhonie X. +• Zwiększona stabilność i poprawki błędów.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Potwierdź poniżej swoje konto i kod PIN, by pozwolić na dostęp przez Pulpit zdalny Chrome.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb index dfeaa082..4728f3e 100644 --- a/remoting/resources/remoting_strings_pt-BR.xtb +++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Saiba como</translation> <translation id="3718805989288361841">Ocorreu um erro nas configurações de políticas da Área de trabalho remota do Google Chrome. Entre em contato com o administrador do sistema para receber ajuda.</translation> <translation id="3776024066357219166">Sua sessão na Área de trabalho remota do Google Chrome foi encerrada.</translation> +<translation id="3846148461359626420">• Melhor experiência de movimentação e zoom no iPhone X. +• Melhorias de estabilidade e correção de bugs.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirme sua conta e seu PIN abaixo para permitir acesso pela Área de trabalho remota do Google Chrome.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb index 558f932..ef8b068 100644 --- a/remoting/resources/remoting_strings_pt-PT.xtb +++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Saiba como</translation> <translation id="3718805989288361841">As definições de política do Ambiente de Trabalho Remoto do Chrome têm um erro. Contacte o seu gestor de sistema para obter assistência.</translation> <translation id="3776024066357219166">A sessão do Ambiente de Trabalho Remoto do Chrome terminou.</translation> +<translation id="3846148461359626420">• Melhor experiência de deslocar e aumentar/diminuir zoom no iPhone X. +• Melhorias de estabilidade e correção de erros.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirme a sua conta e PIN abaixo para permitir o acesso do Ambiente de Trabalho Remoto do Chrome.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb index 462e017..3f860c4 100644 --- a/remoting/resources/remoting_strings_ro.xtb +++ b/remoting/resources/remoting_strings_ro.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Află cum</translation> <translation id="3718805989288361841">A apărut o eroare la setările politicii pentru Desktop la distanță Chrome. Contactează administratorul de sistem pentru asistență.</translation> <translation id="3776024066357219166">Sesiunea Desktop la distanță Chrome s-a încheiat.</translation> +<translation id="3846148461359626420">• Funcții de deplasare și zoom îmbunătățite pe iPhone X. +• Stabilitate îmbunătățită și erori remediate.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Confirmați mai jos contul și codul PIN pentru a permite accesarea prin intermediul aplicației Desktop la distanță Chrome.</translation> <translation id="3897092660631435901">Meniu</translation>
diff --git a/remoting/resources/remoting_strings_ru.xtb b/remoting/resources/remoting_strings_ru.xtb index dfdf8255..9d4e964 100644 --- a/remoting/resources/remoting_strings_ru.xtb +++ b/remoting/resources/remoting_strings_ru.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Подробнее</translation> <translation id="3718805989288361841">При настройке правил для Удаленного рабочего стола Chrome произошла ошибка. Обратитесь за помощью к системному администратору.</translation> <translation id="3776024066357219166">Сеанс Удаленного рабочего стола Chrome завершен.</translation> +<translation id="3846148461359626420">• Улучшено панорамирование и масштабирование на iPhone X. +• Исправлены ошибки, повышена стабильность работы.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Для доступа через Удаленный рабочий стол Chrome подтвердите свой аккаунт и PIN-код.</translation> <translation id="3897092660631435901">Меню</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb index ba08aba..966e576 100644 --- a/remoting/resources/remoting_strings_sk.xtb +++ b/remoting/resources/remoting_strings_sk.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Ako na to</translation> <translation id="3718805989288361841">V súvislosti s nastaveniami pravidiel pre Vzdialenú plochu Chrome sa vyskytla chyba. Požiadajte o pomoc správcu systému.</translation> <translation id="3776024066357219166">Vaša relácia Vzdialenej plochy Chrome bola ukončená.</translation> +<translation id="3846148461359626420">• Lepšie posúvanie zobrazenia a priblíženie/oddialenie v iPhone X. +• Vylepšenia stability a opravy chýb.</translation> <translation id="3870154837782082782">Spoločnosť Google Inc.</translation> <translation id="3884839335308961732">Ak chcete povoliť prístup k Vzdialenej ploche Chrome, potvrďte svoj účet a kód PIN nižšie.</translation> <translation id="3897092660631435901">Ponuka</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb index 3931c78..45e274af 100644 --- a/remoting/resources/remoting_strings_sl.xtb +++ b/remoting/resources/remoting_strings_sl.xtb
@@ -100,7 +100,6 @@ <translation id="3171922709365450819">Te naprave ne podpira odjemalec, ker zahteva preverjanje pristnosti tretje osebe.</translation> <translation id="3194245623920924351">Oddaljeno namizje za Chrome</translation> <translation id="3197730452537982411">Oddaljeno namizje</translation> -<translation id="3212472844831225214">• Dodana podpora za Android 9.0 Pie.</translation> <translation id="324272851072175193">Pošlji ta navodila po e-pošti</translation> <translation id="3258789396564295715">Oddaljeno namizje za Chrome omogoča varen dostop do tega računalnika.</translation> <translation id="3286521253923406898">Krmilnik gostitelja za Oddaljeno povezovanje s Chromom</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb index 1c57129..766c8b2 100644 --- a/remoting/resources/remoting_strings_sr.xtb +++ b/remoting/resources/remoting_strings_sr.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Сазнајте како</translation> <translation id="3718805989288361841">Дошло је до грешке до са подешавањима смерница за Chrome удаљени рачунар. Контактирајте администратора система да бисте добили помоћ.</translation> <translation id="3776024066357219166">Сесија Chrome удаљеног рачунара је завршена.</translation> +<translation id="3846148461359626420">• Боље померање и зумирање за iPhone X. +• Побољшања стабилности и исправке грешака.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Потврдите налог и PIN у наставку да бисте омогућили приступ за Chrome удаљени рачунар.</translation> <translation id="3897092660631435901">Мени</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb index ee768c9..125b091 100644 --- a/remoting/resources/remoting_strings_sv.xtb +++ b/remoting/resources/remoting_strings_sv.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Läs mer</translation> <translation id="3718805989288361841">Det finns ett fel i principinställningarna för Chrome Remote Desktop. Kontakta systemadministratören om du behöver hjälp.</translation> <translation id="3776024066357219166">Chrome Remote Desktop-sessionen har avslutats.</translation> +<translation id="3846148461359626420">• Förbättrad panorering och zoomning på iPhone X. +• Stabilitetsförbättringar och felkorrigeringar.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Bekräfta ditt konto och pinkoden nedan för att tillåta åtkomst via Chrome Remote Desktop.</translation> <translation id="3897092660631435901">Meny</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb index 9297130..ce10c23 100644 --- a/remoting/resources/remoting_strings_sw.xtb +++ b/remoting/resources/remoting_strings_sw.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Pata maelezo</translation> <translation id="3718805989288361841">Kuna hitilafu ya mipangilio ya sera ya Programu ya Chrome ya Ufikiaji wa Kompyuta kutoka Mbali. Wasiliana na msimamizi wako ili upate usaidizi.</translation> <translation id="3776024066357219166">Kipindi chako cha Eneo-kazi la Mbali la Chrome kimekamilika.</translation> +<translation id="3846148461359626420">• Tumeboresha hali ya kugeuza upande na kukuza kwenye iPhone X. +• Tumerekebisha hitilafu na kuboresha uthabiti.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Tafadhali thibitisha akaunti yako na PIN hapa chini ili kuruhusu ufikiaji kwa Kompyuta ya Mbali ya Chrome</translation> <translation id="3897092660631435901">Menyu</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb index c82748a..78c3464 100644 --- a/remoting/resources/remoting_strings_ta.xtb +++ b/remoting/resources/remoting_strings_ta.xtb
@@ -35,13 +35,13 @@ <translation id="1841799852846221389">இந்தக் கணினிக்கான தொலைநிலை இணைப்புகளை முடக்குகிறது...</translation> <translation id="1897488610212723051">நீக்கு</translation> <translation id="195619862187186579">விசைப்பலகைத் தளவமைப்புகள்</translation> -<translation id="1996161829609978754">Chrome ஆனது குரோமோட்டிங் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குகிறது. பதிவிறக்கம் முடிந்ததும், தொடர்வதற்கு முன் நிறுவியை இயக்கவும்.</translation> +<translation id="1996161829609978754">Chromoting ஹோஸ்ட் நிறுவியை Chrome பதிவிறக்குகிறது. பதிவிறக்கம் முடிந்ததும், தொடர்வதற்கு முன் நிறுவியை இயக்கவும்.</translation> <translation id="2009755455353575666">இணைப்புத் தோல்வி</translation> -<translation id="2013884659108657024">Chrome ஆனது Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குகிறது. பதிவிறக்கம் முடிந்ததும், தொடர்வதற்கு முன், நிறுவியை இயக்கவும்.</translation> +<translation id="2013884659108657024">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவியை Chrome பதிவிறக்குகிறது. பதிவிறக்கம் முடிந்ததும், தொடர்வதற்கு முன், நிறுவியை இயக்கவும்.</translation> <translation id="2013996867038862849">இணைக்கப்பட்ட எல்லா க்ளையன்ட்களும் நீக்கப்பட்டன.</translation> <translation id="2038229918502634450">கொள்கை மாற்றத்தின் காரணமாக, ஹோஸ்ட் மீண்டும் தொடங்குகிறது.</translation> <translation id="2046651113449445291">இந்தக் கணினியுடன் பின்வரும் கிளையன்ட்கள் இணைக்கப்பட்டுள்ளன, மேலும், PIN ஐ வழங்காமல் இவற்றை இணைக்க முடியும். நீங்கள் எப்போது வேண்டுமானாலும் இந்த அனுமதியைத் தனித்தனியாகவோ அல்லது எல்லா க்ளையன்ட்களுக்கும் திரும்பப் பெறலாம்.</translation> -<translation id="2078880767960296260">புரவன் செயல்முறை</translation> +<translation id="2078880767960296260">ஹோஸ்ட் செயல்முறை</translation> <translation id="20876857123010370">டிராக்பேடு பயன்முறை</translation> <translation id="2089514346391228378">இந்தக் கணினிக்கான தொலைநிலை இணைப்புகள் இயக்கப்பட்டன.</translation> <translation id="2118549242412205620">உங்கள் Android சாதனத்திலிருந்து பாதுகாப்பாக உங்கள் கணினிகளை அணுகவும். @@ -51,7 +51,7 @@ தனியுரிமை பற்றிய தகவலுக்கு, Google தனியுரிமைக் கொள்கை (http://goo.gl/SyrVzj) மற்றும் Chrome தனியுரிமைக் கொள்கை (http://goo.gl/0uXE5d) ஆகியவற்றைப் பார்க்கவும்.</translation> <translation id="2124408767156847088">உங்கள் Android சாதனத்திலிருந்து பாதுகாப்பாக உங்கள் கணினிகளை அணுகவும்.</translation> -<translation id="2208514473086078157">கொள்கை அமைப்புகளானது இந்தக் கணினியை Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட்டாகப் பகிர்வதை அனுமதிக்காது. உதவிக்கு உங்கள் கணினி நிர்வாகியைத் தொடர்புகொள்க.</translation> +<translation id="2208514473086078157">கொள்கை அமைப்புகள் இந்தக் கம்ப்யூட்டரை Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட்டாகப் பகிர்வதை அனுமதிக்காது. உதவிக்கு உங்கள் கம்ப்யூட்டர் நிர்வாகியைத் தொடர்புகொள்க.</translation> <translation id="2220529011494928058">சிக்கல் குறித்துப் புகார் செய்</translation> <translation id="2221097377466213233">Win விசைக்குப் பதில் வலது Ctrlஐப் பயன்படுத்து (Mac இல் ⌘)</translation> <translation id="2235518894410572517">பிறர் பார்க்கவும் கட்டுப்படுத்தவும் இந்தக் கணினியைப் பகிரலாம்.</translation> @@ -64,14 +64,14 @@ <translation id="2320166752086256636">விசைப்பலகையை மறை</translation> <translation id="2353140552984634198">குரோமோட்டிங்கைப் பயன்படுத்தி இந்தக் கணினியைப் பாதுகாப்பாக நீங்கள் அணுகலாம்.</translation> <translation id="2359808026110333948">தொடர்க</translation> -<translation id="2366718077645204424">ஹோஸ்ட்டை அடைய முடியவில்லை. இது, ஒரு வேளை நீங்கள் பயன்படுத்தும் பிணையத்தின் உள்ளமைப்பு காரணமாக இருக்கலாம்.</translation> +<translation id="2366718077645204424">ஹோஸ்ட்டை அடைய முடியவில்லை. இததற்கு நீங்கள் பயன்படுத்தும் நெட்வொர்க்கின் உள்ளமைவு காரணமாக இருக்கலாம்.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> கடைசியாக ஆன்லைனில் <ph name="RELATIVE_TIMESTAMP" />.</translation> <translation id="2405928220797050937">இந்தப் பயன்பாடு இனி ஆதரிக்கப்படாது. சமீபத்திய அம்சங்களையும் பாதுகாப்புப் புதுப்பிப்புகளையும் பெற, <ph name="LINK_BEGIN" />Chrome தொலைநிலை டெஸ்க்டாப் இணையப் பயன்பாட்டைப்<ph name="LINK_END" /> பயன்படுத்தவும்.</translation> <translation id="2499160551253595098">பயன்பாட்டு புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் சேகரிக்க எங்களை அனுமதித்து Chrome தொலைநிலை டெஸ்க்டாப்பை மேம்படுத்த உதவவும்.</translation> <translation id="2509394361235492552"><ph name="HOSTNAME" /> உடன் இணைக்கப்பட்டது</translation> <translation id="2512228156274966424">குறிப்பு: எல்லா விசைப்பலகைக் குறுக்குவழிகளும் இருப்பதை உறுதிப்படுத்த, ‘சாளரமாக திற" என்பதற்கு Chrome தொலைநிலை டெஸ்க்டாப்பை உள்ளமைக்கலாம்.</translation> <translation id="2540992418118313681">பிறர் இந்தக் கணினியைப் பார்க்க மற்றும் கட்டுப்படுத்த, அதைப் பகிர்ந்து கொள்ள விரும்புகிறீர்களா?</translation> -<translation id="2579271889603567289">ஹோஸ்ட் சிதைந்தது அல்லது தொடங்க முடியவில்லை.</translation> +<translation id="2579271889603567289">ஹோஸ்ட் சிதைந்தது அல்லது தொடங்கவே இல்லை.</translation> <translation id="2599300881200251572">இந்தச் சேவை Chrome தொலைநிலை டெஸ்க்டாப் க்ளையன்ட்களிடமிருந்து வரும் இணைப்புகளை இயக்குகிறது.</translation> <translation id="2647232381348739934">குரோமோட்டிங் சேவை</translation> <translation id="2676780859508944670">இயங்கி கொண்டுள்ளது...</translation> @@ -81,7 +81,7 @@ <translation id="2803375539583399270">பின்னை உள்ளிடவும்</translation> <translation id="2841013758207633010">நேரம்</translation> <translation id="2851754573186462851">Chromium பயன்பாட்டின் அறிவிப்புகள்</translation> -<translation id="2888969873284818612">நெட்வொர்க் பிழை ஏற்பட்டது. உங்கள் சாதனம் மீண்டும் ஆன்லைன் வரும்போது பயன்பாட்டை மீண்டும் தொடங்குவோம்.</translation> +<translation id="2888969873284818612">நெட்வொர்க் பிழை ஏற்பட்டது. உங்கள் சாதனம் மீண்டும் ஆன்லைன் வரும்போது ஆப்ஸை மீண்டும் தொடங்குவோம்.</translation> <translation id="289405675947420287">உங்கள் iOS சாதனத்திலிருந்து, உங்கள் கணினியைப் பாதுகாப்பாக அணுகலாம். இது விரைவானது, எளிதானது மற்றும் இலவசமானது. • தொலைநிலையில் அணுக விரும்பும் கணினியில், Chrome இணைய அங்காடியிலிருந்து Chrome தொலைநிலை டெஸ்க்டாப் பயன்பாட்டைப் பதிவிறக்கவும். @@ -92,7 +92,7 @@ <translation id="2921543551052660690">இதற்கு முன்பு <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) என உள்நுழைந்துள்ளீர்கள். அந்தக் கணக்கில் உங்கள் கணினிகளை அணுக, அந்தக் கணக்கினைக் கொண்டு <ph name="LINK_BEGIN" />Chromium இல் உள்நுழைக<ph name="LINK_END" /> மற்றும் Chromotingஐ மீண்டும் நிறுவுக.</translation> <translation id="2926340305933667314">இந்தக் கணினிக்கான தொலைநிலை அணுகலை முடக்குவது தோல்வியடைந்தது. பின்னர் மீண்டும் முயலவும்.</translation> <translation id="2930135165929238380">தேவையான சில உறுப்புகளைக் காணவில்லை. chrome://plugins என்பதற்குச் சென்று நேட்டிவ் கிளையன்ட் இயக்கப்பட்டிருப்பதை உறுதிப்படுத்தவும்.</translation> -<translation id="2939145106548231838">ஹோஸ்டிற்கு அனுமதி வழங்கவும்</translation> +<translation id="2939145106548231838">ஹோஸ்ட்டிற்கு அனுமதி வழங்குதல்</translation> <translation id="3020807351229499221">PIN ஐப் புதுப்பிப்பது தோல்வியடைந்தது. பின்னர் மீண்டும் முயலவும்.</translation> <translation id="3025388528294795783">உங்கள் சிக்கலைத் தீர்ப்பதில் எங்களுக்கு உதவ, என்ன தவறு நேர்ந்தது எனக் கூறவும்:</translation> <translation id="3027681561976217984">தொடுதல் பயன்முறை</translation> @@ -104,7 +104,7 @@ <translation id="3197730452537982411">தொலைநிலை டெஸ்க்டாப்</translation> <translation id="324272851072175193">இந்த வழிமுறைகளை மின்னஞ்சலில் அனுப்பு</translation> <translation id="3258789396564295715">Chrome தொலைநிலை டெஸ்க்டாப்பைப் பயன்படுத்தி இந்தக் கணினியை பாதுகாப்பாக அணுகலாம்.</translation> -<translation id="3286521253923406898">குரோமோட்டிங் புரவன் கட்டுப்படுத்தி</translation> +<translation id="3286521253923406898">Chromoting ஹோஸ்ட் கண்ட்ரோலர்</translation> <translation id="3305934114213025800"><ph name="PRODUCT_NAME" /> மாற்றங்களைச் செய்ய விரும்புகிறது.</translation> <translation id="332624996707057614">கணினி பெயரைத் திருத்தவும்</translation> <translation id="3339299787263251426">இணையம் மூலம் உங்கள் கணினியைப் பாதுகாப்பாக அணுகலாம்</translation> @@ -112,9 +112,9 @@ <translation id="3362124771485993931">PIN ஐ மீண்டும் தட்டச்சு செய்க</translation> <translation id="337167041784729019">புள்ளிவிவரங்களைக் காட்டு</translation> <translation id="3385242214819933234">தவறான ஹோஸ்ட் உரிமையாளர்.</translation> -<translation id="3403830762023901068">கொள்கை அமைப்புகளானது இந்தக் கணினியை குரோமோட்டிங் ஹோஸ்ட்டாக பகிர்வதை அனுமதிக்காது. உதவிக்கு உங்கள் கணினி நிர்வாகியைத் தொடர்புகொள்க.</translation> +<translation id="3403830762023901068">கொள்கை அமைப்புகள் இந்தக் கம்ப்யூட்டரை Chromoting ஹோஸ்ட்டாகப் பகிர்வதை அனுமதிக்காது. உதவிக்கு உங்கள் கம்ப்யூட்டர் நிர்வாகியைத் தொடர்புகொள்க.</translation> <translation id="3423542133075182604">பாதுகாப்பு விசையின் தொலைநிலை செயல்முறை</translation> -<translation id="3581045510967524389">பிணையத்துடன் இணைக்க முடியவில்லை. உங்கள் சாதனம் ஆன்லைனில் இருப்பதைச் சரிபார்க்கவும்.</translation> +<translation id="3581045510967524389">நெட்வொர்க்குடன் இணைக்க முடியவில்லை. உங்கள் சாதனம் ஆன்லைனில் இருப்பதைச் சரிபார்க்கவும்.</translation> <translation id="3596628256176442606">இந்தச் சேவை குரோமோட்டிங் க்ளையன்ட்களிடமிருந்து வரும் இணைப்புகளை இயக்குகிறது.</translation> <translation id="3606997049964069799">Chromium இல் உள்நுழையவில்லை. உள்நுழைந்து, முயற்சிக்கவும்.</translation> <translation id="3649256019230929621">சாளரத்தை சிறிதாக்கு</translation> @@ -122,6 +122,8 @@ <translation id="3695446226812920698">எப்படி என அறிக</translation> <translation id="3718805989288361841">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கான கொள்கை அமைப்புகளில் பிழை ஏற்பட்டது. உதவிக்கு, உங்கள் சாதன நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="3776024066357219166">உங்கள் Chrome தொலைநிலை டெஸ்க்டாப் அமர்வு முடிந்தது.</translation> +<translation id="3846148461359626420">• iPhone Xஸில் திரையை நகர்த்தும் மற்றும் அளவை மாற்றும் அம்சங்கள் மேம்படுத்தப்பட்டுள்ளன. +• நிலைத்தன்மை மேம்பாடுகளும் பிழைத் திருத்தங்களும் செய்யப்பட்டுள்ளன.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome தொலைநிலை டெஸ்க்டாப் மூலம் அணுகலை அனுமதிக்க, கீழே உங்கள் கணக்கையும், PIN ஐயும் உறுதிப்படுத்தவும்.</translation> <translation id="3897092660631435901">மெனு</translation> @@ -132,9 +134,9 @@ <translation id="3950820424414687140">உள்நுழைக</translation> <translation id="3989511127559254552">தொடர்வதற்கு, உங்கள் கணினிக்கு நீட்டிக்கப்பட்ட அணுகல் அனுமதிகளை முதலில் வழங்க வேண்டும். இதை நீங்கள் ஒரு முறை மட்டுமே செய்ய வேண்டியிருக்கும்.</translation> <translation id="4006787130661126000">இந்தக் கணினியை அணுகுவதற்கு, Chrome தொலைநிலை டெஸ்க்டாப்பைப் பயன்படுத்த விரும்பினால், தொலைநிலை இணைப்புகளை இயக்க வேண்டும்.</translation> -<translation id="405887016757208221">தொலைநிலைக் கணினியால் அமர்வைத் தொடங்க முடியவில்லை. சிக்கல் நீடித்தால் ஹோஸ்ட்டை மீண்டும் உள்ளமைக்க முயலவும்.</translation> +<translation id="405887016757208221">தொலைநிலைக் கம்ப்யூட்டரால் அமர்வைத் தொடங்க முடியவில்லை. சிக்கல் நீடித்தால் ஹோஸ்ட்டை மீண்டும் உள்ளமைக்க முயலவும்.</translation> <translation id="4068946408131579958">எல்லா இணைப்புகளும்</translation> -<translation id="409800995205263688">குறிப்பு: உங்கள் பிணையத்தில் உள்ள கணினிகளுக்கு இடையில் மட்டுமே இணைப்புகளை கொள்கை அமைப்புகள் அனுமதிக்கின்றன.</translation> +<translation id="409800995205263688">குறிப்பு: கொள்கை அமைப்புகள் உங்கள் நெட்வொர்க்கில் உள்ள கம்ப்யூட்டர்களுக்கு இடையில் மட்டுமே இணைப்புகளை அனுமதிக்கின்றன.</translation> <translation id="4126409073460786861">அமைவு முடிந்ததும், இந்தப் பக்கத்தைப் புதுப்பிக்கவும். அதன் பின்னர், உங்கள் சாதனத்தைத் தேர்வுசெய்து, பின் எண்ணை உள்ளிட்டு, கம்ப்யூட்டரை அணுகலாம்</translation> <translation id="4145029455188493639">உள்நுழைந்துள்ள முகவரி: <ph name="EMAIL_ADDRESS" />.</translation> <translation id="4155497795971509630">தேவையான சில உறுப்புகள் காணவில்லை. மென்பொருளின் சமீபத்திய பதிப்பை நிறுவியுள்ளீர்கள் என்பதை உறுதிசெய்து, மீண்டும் முயற்சிக்கவும்.</translation> @@ -142,8 +144,8 @@ <translation id="4169432154993690151">சுயவிவரப் படத்தைத் தேர்வுசெய்ய, உங்கள் கேமராவை அணுகுவதற்கு Chrome தொலைநிலை டெஸ்க்டாப்பை அனுமதிக்கவும்</translation> <translation id="4176825807642096119">அணுகல் குறியீடு</translation> <translation id="4207623512727273241">தொடர்வதற்கு முன், நிறுவியை இயக்கவும்.</translation> -<translation id="4227991223508142681">ஹோஸ்ட் புரொவிஷனிங் யூட்டிலிட்டி</translation> -<translation id="4240294130679914010">குரோமோட்டிங் புரவன் நிறுவல் நீக்கி</translation> +<translation id="4227991223508142681">Host Provisioning Utility</translation> +<translation id="4240294130679914010">Chromoting ஹோஸ்ட் நிறுவல்நீக்கி</translation> <translation id="4277463233460010382">PIN ஐ உள்ளிடாமல் இணைக்கப்படுவதற்கு ஒன்று அல்லது அதற்கு மேற்பட்ட க்ளையன்ட்களை அனுமதிக்கும் வகையில் இந்தக் கணினி உள்ளமைக்கப்பட்டுள்ளது.</translation> <translation id="4277736576214464567">அணுகல் குறியீடு தவறானது. மீண்டும் முயலவும்.</translation> <translation id="4361728918881830843">வேறு கணினிக்குத் தொலைநிலை இணைப்புகளை இயக்க, Chrome தொலைநிலை டெஸ்க்டாப்பை நிறுவி “<ph name="BUTTON_NAME" />” ஐக் கிளிக் செய்க.</translation> @@ -157,7 +159,7 @@ <translation id="4517233780764084060">குறிப்பு: எல்லா விசைப்பலகைக் குறுக்குவழிகளும் இருப்பதை உறுதிப்படுத்த, ‘சாளரமாக திற" என்பதற்கு குரோமோட்டிங்கை உள்ளமைக்கலாம்.</translation> <translation id="4563926062592110512">க்ளையன்ட் துண்டிக்கப்பட்டது: <ph name="CLIENT_USERNAME" />.</translation> <translation id="4572065712096155137">அணுகு</translation> -<translation id="4592037108270173918">மொபைல் நெட்வொர்க் மூலம் சாதனத்துடன் இணைக்கும் போது டேட்டா பேமெண்ட்கள் விதிக்கப்படலாம். தொடர வேண்டுமா?</translation> +<translation id="4592037108270173918">மொபைல் நெட்வொர்க் மூலம் சாதனத்துடன் இணைக்கும் போது டேட்டா கட்டணங்கள் விதிக்கப்படலாம். தொடர வேண்டுமா?</translation> <translation id="4619978527973181021">ஏற்று நிறுவு</translation> <translation id="4635770493235256822">தொலைநிலைச் சாதனங்கள்</translation> <translation id="4660011489602794167">விசைப்பலகையைக் காட்டு</translation> @@ -178,16 +180,16 @@ <translation id="4798680868612952294">மவுஸ் விருப்பங்கள்</translation> <translation id="4804818685124855865">தொடர்பைத் துண்டி</translation> <translation id="4808503597364150972"><ph name="HOSTNAME" /> க்கான உங்கள் PIN ஐ உள்ளிடுக.</translation> -<translation id="4812684235631257312">புரவன்</translation> +<translation id="4812684235631257312">ஹோஸ்ட்</translation> <translation id="4867841927763172006">PrtScn ஐ அனுப்பு</translation> <translation id="4913529628896049296">இணைப்பிற்காகக் காத்திருக்கிறது...</translation> <translation id="4918086044614829423">ஏற்கிறேன்</translation> <translation id="492843737083352574">எனது விசைப்பலகை அல்லது மவுஸில் சிக்கல்கள் உள்ளன.</translation> -<translation id="4973800994433240357">குரோமோட்டிங் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குவதன் மூலம், Google இன் <ph name="LINK_BEGIN" />சேவை விதிமுறைகளை<ph name="LINK_END" /> ஏற்றுக்கொள்கிறீர்கள்.</translation> +<translation id="4973800994433240357">Chromoting ஹோஸ்ட் நிறுவியைப் பதிவிறக்குவதன் மூலம், Googleளின் <ph name="LINK_BEGIN" />சேவை விதிமுறைகளை<ph name="LINK_END" /> ஏற்றுக்கொள்கிறீர்கள்.</translation> <translation id="4974476491460646149"><ph name="HOSTNAME" /> இன் இணைப்பு நிறுத்தப்பட்டது</translation> <translation id="4985296110227979402">முதலில் உங்கள் கணினியை தொலைநிலை அணுகலுக்கு அமைக்க வேண்டும்</translation> <translation id="5064360042339518108"><ph name="HOSTNAME" /> (ஆஃப்லைன்)</translation> -<translation id="5070121137485264635">ஒரு மூன்றாம் தரப்பு இணையதளத்தை நீங்கள் அங்கீகரிக்க வேண்டும் என்று தொலைநிலை ஹோஸ்ட் கேட்கிறது. தொடர்வதற்கு, இந்த முகவரியை அணுக Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு கூடுதல் அனுமதிகளை நீங்கள் வழங்க வேண்டும்:</translation> +<translation id="5070121137485264635">ஒரு மூன்றாம் தரப்பு இணையதளத்தை நீங்கள் அங்கீகரிக்க வேண்டும் என்று தொலைநிலை ஹோஸ்ட் கேட்கிறது. தொடர்வதற்கு, இந்த முகவரியை அணுக Chrome தொலைநிலை டெஸ்க்டாப்பிற்குக் கூடுதல் அனுமதிகளை வழங்க வேண்டும்:</translation> <translation id="507204348399810022"><ph name="HOSTNAME" />க்கான ரிமோட் இணைப்புகளை முடக்க விரும்புகிறீர்களா?</translation> <translation id="5081343395220691640">சேவையகத்தைத் தொடர்புகொள்ள முடியவில்லை: <ph name="ERROR" /></translation> <translation id="5156271271724754543">இரண்டு பெட்டிகளிலும் ஒரே PIN ஐ உள்ளிடுக.</translation> @@ -200,7 +202,7 @@ <translation id="533625276787323658">இணைப்பதற்கு எதுவுமில்லை</translation> <translation id="5363265567587775042">நீங்கள் அணுக விரும்பும் கணினியின் பயனரிடம், “<ph name="SHARE" />”ஐக் கிளிக் செய்து அணுகல் குறியீட்டை அளிக்கும்படி கேட்கவும்.</translation> <translation id="5379087427956679853">இணையத்தில் உங்கள் கணினியைப் பாதுகாப்பாக பகிர Chrome தொலைநிலை டெஸ்க்டாப் அனுமதிக்கிறது. இரு பயனர்களும் Chrome தொலைநிலை டெஸ்க்டாப் பயன்பாட்டில் இயக்க வேண்டும், அதை <ph name="URL" /> இல் காணலாம்.</translation> -<translation id="5397086374758643919">Chrome தொலைநிலை டெஸ்க்டாப் புரவன் நிறுவல் நீக்கி</translation> +<translation id="5397086374758643919">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவல்நீக்கி</translation> <translation id="5419185025274123272">பயன்பாட்டை மீட்டமைக்க முடியவில்லை. தொடர்ந்து நீங்கள் பிழைத் தொடர்பான புகாரை அனுப்பலாம்.</translation> <translation id="5419418238395129586">கடைசியாக ஆன்லைனில் இருந்தது: <ph name="DATE" /></translation> <translation id="544077782045763683">ஹோஸ்ட் இயங்கவில்லை.</translation> @@ -228,13 +230,13 @@ <translation id="6122191549521593678">ஆன்லைன்</translation> <translation id="6167788864044230298">Chrome பயன்பாட்டின் அறிவிப்புகள்</translation> <translation id="6173536234069435147">எனது Google இயக்ககக் கோப்புகளைத் திறக்க முடியவில்லை.</translation> -<translation id="6178645564515549384">தொலைநிலை உதவிக்கான நேட்டிவ் செய்தியிடல் ஹோஸ்ட்</translation> +<translation id="6178645564515549384">தொலைநிலை உதவிக்கான நேட்டிவ் மெசேஜிங் ஹோஸ்ட்</translation> <translation id="618120821413932081">சாளரத்துடன் பொருந்தும்படி, தொலைநிலைக் கணினியின் தெளிவுத்திறனை மாற்று</translation> <translation id="6193698048504518729"><ph name="HOSTNAME" /> இல் இணைக்கவும்</translation> <translation id="6198252989419008588">PIN ஐ மாற்றவும்</translation> <translation id="6204583485351780592"><ph name="HOSTNAME" /> (காலாவதியானது)</translation> <translation id="6221358653751391898">Chrome இல் உள்நுழையவில்லை. உள்நுழைந்து, மீண்டும் முயற்சிக்கவும்.</translation> -<translation id="6284412385303060032">பயனர்-சார்ந்த அமர்வில் இயங்கும் ஹோஸ்ட்டை மாற்றுவதன் மூலம், கர்ட்டைன் பயன்முறையை ஆதரிப்பதற்காக, கன்சோல் லாஜிக் திரையில் இயக்கப்படும் ஹோஸ்ட் நிறுத்தப்பட்டது.</translation> +<translation id="6284412385303060032">திரைப் பயன்முறையை ஆதரிப்பதற்காக, பயனர்-சார்ந்த அமர்வில் இயங்கும் ஹோஸ்ட்டுக்கு மாறி, கன்சோல் லாஜிக் திரையில் இயங்கும் ஹோஸ்ட் முடங்கியது.</translation> <translation id="629730747756840877">கணக்கு</translation> <translation id="6304318647555713317">க்ளையன்ட்</translation> <translation id="6381670701864002291">பிற விஷயங்கள்.</translation> @@ -256,7 +258,7 @@ <translation id="6705482892455291412">குறியீட்டை உள்ளிட்ட பின், இணைப்பை ஏற்றுக்கொண்டு, பகிர்தல் அமர்வைத் தொடங்கும்படி கேட்கப்படுவீர்கள்.</translation> <translation id="6746493157771801606">வரலாற்றை அழி</translation> <translation id="6748108480210050150">அனுப்புநர்</translation> -<translation id="677755392401385740">பயனருக்கான புரவன் தொடங்கியது: <ph name="HOST_USERNAME" />.</translation> +<translation id="677755392401385740">ஹோஸ்ட் தொடங்கிய பயனர்: <ph name="HOST_USERNAME" />.</translation> <translation id="6865175692670882333">பார்/திருத்து</translation> <translation id="6913710942997637770">சுயவிவரப் படத்தைத் தேர்வுசெய்ய, உங்கள் படங்களை அணுகுவதற்கு Chrome தொலைநிலை டெஸ்க்டாப்பை அனுமதிக்கவும்</translation> <translation id="6930242544192836755">மொத்த நேரம்</translation> @@ -275,7 +277,7 @@ <translation id="7067321367069083429">டச் ஸ்கிரீன் போல திரை செயல்படும்</translation> <translation id="7116737094673640201">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு வரவேற்கிறோம்</translation> <translation id="7144878232160441200">மீண்டும் முயலவும்</translation> -<translation id="7149517134817561223">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட்டிற்கு கட்டளைகளை வழங்கும் பயன்பாடு.</translation> +<translation id="7149517134817561223">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட்டிற்குக் கட்டளைகளை வழங்கும் ஆப்ஸ்.</translation> <translation id="7215059001581613786">நான்கு அல்லது அதற்கு மேற்பட்ட இலக்கங்களைக் கொண்ட PIN ஐ உள்ளிடுக.</translation> <translation id="7312846573060934304">ஹோஸ்ட் ஆஃப்லைனில் உள்ளது.</translation> <translation id="7319983568955948908">பகிர்தலை நிறுத்து</translation> @@ -304,14 +306,14 @@ <translation id="7970576581263377361">அங்கீகரிக்க முடியவில்லை. Chromium இல் மீண்டும் உள்நுழையவும்.</translation> <translation id="7981525049612125370">தொலைநிலை அமர்வு காலாவதியானது.</translation> <translation id="8041089156583427627">கருத்துத் தெரிவிக்கவும்</translation> -<translation id="8041721485428375115">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குவதன் மூலம், Google இன் <ph name="LINK_BEGIN" />சேவை விதிமுறைகளை<ph name="LINK_END" /> ஏற்றுக்கொள்கிறீர்கள்.</translation> +<translation id="8041721485428375115">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவியைப் பதிவிறக்குவதன் மூலம், Googleளின் <ph name="LINK_BEGIN" />சேவை விதிமுறைகளை<ph name="LINK_END" /> ஏற்றுக்கொள்கிறீர்கள்.</translation> <translation id="8060029310790625334">உதவி மையம்</translation> <translation id="806699900641041263"><ph name="HOSTNAME" /> உடன் இணைக்கிறது</translation> <translation id="8073845705237259513">Chrome தொலைநிலை டெஸ்க்டாபைப் பயன்படுத்த, உங்கள் சாதனத்தில் Google கணக்கைச் சேர்க்க வேண்டும்.</translation> -<translation id="80739703311984697">ஒரு மூன்றாம் தரப்பு இணையதளத்தை நீங்கள் அங்கீகரிக்க வேண்டும் என்று தொலைநிலை ஹோஸ்ட் கேட்கிறது. தொடர்வதற்கு, இந்த முகவரியை அணுக குரோமோட்டிங்கிற்கு கூடுதல் அனுமதிகளை நீங்கள் வழங்க வேண்டும்:</translation> +<translation id="80739703311984697">ஒரு மூன்றாம் தரப்பு இணையதளத்தை நீங்கள் அங்கீகரிக்க வேண்டும் என்று தொலைநிலை ஹோஸ்ட் கேட்கிறது. தொடர்வதற்கு, இந்த முகவரியை அணுக Chromotingகிற்குக் கூடுதல் அனுமதிகளை வழங்க வேண்டும்:</translation> <translation id="809687642899217504">எனது கணினிகள்</translation> <translation id="811307782653349804">எங்கிருந்தும் உங்கள் சொந்தக் கணினியை அணுகலாம்.</translation> -<translation id="8116630183974937060">பிணையப் பிழை ஏற்பட்டது. உங்கள் சாதனம் ஆன்லைனில் உள்ளதா என்பதைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்.</translation> +<translation id="8116630183974937060">நெட்வொர்க் பிழை ஏற்பட்டது. உங்கள் சாதனம் ஆன்லைனில் உள்ளதா என்பதைச் சரிபார்த்து மீண்டும் முயலவும்.</translation> <translation id="8178433417677596899">ஒருவரிடமிருந்து இன்னொருவருக்கு திரையைப் பகிர்தல், தொலைநிலை தொழில்நுட்ப ஆதரவில் சிறப்பாக செயல்படும்.</translation> <translation id="8187079423890319756">பதிப்புரிமை 2013 Chromium உருவாக்குநர்கள். அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டவை.</translation> <translation id="8196755618196986400">மேற்கொண்டு உங்களைத் தொடர்புகொள்வதற்கு, நீங்கள் சமர்ப்பிக்கும் எந்தவொரு கருத்திலும் உங்கள் மின்னஞ்சல் முகவரி இணைக்கப்படும்.</translation> @@ -321,11 +323,11 @@ <translation id="8355485110405946777">உங்கள் சிக்கலைத் தீர்ப்பதற்கு உதவ, பயன்பாட்டுப் பதிவுகளைச் சேர்க்கவும் (பதிவுகள் தனிப்பட்ட தகவலைக் கொண்டிருக்கலாம்).</translation> <translation id="837021510621780684">இந்தக் கணினியிலிருந்து</translation> <translation id="8383794970363966105">குரோமோட்டிங்கைப் பயன்படுத்த, உங்கள் சாதனத்தில் Google கணக்கைச் சேர்க்க வேண்டும்.</translation> -<translation id="8386846956409881180">தவறான OAuth நற்சான்றுகளுடன் ஹோஸ்ட் உள்ளமைக்கப்பட்டுள்ளது.</translation> +<translation id="8386846956409881180">தவறான OAuth அனுமதிச் சான்றுகளுடன் ஹோஸ்ட் உள்ளமைக்கப்பட்டுள்ளது.</translation> <translation id="8428213095426709021">அமைப்புகள்</translation> <translation id="8445362773033888690">Google Play Store இல் காட்டு</translation> <translation id="8509907436388546015">டெஸ்க்டாப் ஒருங்கிணைப்புச் செயல்முறை</translation> -<translation id="8513093439376855948">தொலைநிலை ஹோஸ்ட் மேலாண்மைக்கான நேட்டிவ் செய்தியிடல் ஹோஸ்ட்</translation> +<translation id="8513093439376855948">தொலைநிலை ஹோஸ்ட் மேலாண்மைக்கான நேட்டிவ் மெசேஜிங் ஹோஸ்ட்</translation> <translation id="8525306231823319788">முழுத்திரை</translation> <translation id="8548209692293300397">நீங்கள் இதற்கு முன்பு <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) என உள்நுழைந்துள்ளீர்கள். அந்தக் கணக்கில் உங்கள் கணினிகளை அணுக, அந்தக் கணக்கினைக் கொண்டு <ph name="LINK_BEGIN" />Google Chrome இல் உள்நுழைக<ph name="LINK_END" /> மற்றும் Chrome தொலைநிலை டெஸ்க்டாப்பை மீண்டும் நிறுவுக.</translation> <translation id="8642984861538780905">மோசமில்லை</translation> @@ -333,15 +335,15 @@ <translation id="8743328882720071828">உங்கள் கணினியைப் பார்க்கவும் கட்டுப்படுத்தவும் <ph name="CLIENT_USERNAME" />ஐ அனுமதிக்கவா?</translation> <translation id="8747048596626351634">அமர்வு சிதைந்தது அல்லது தொடங்க முடியவில்லை. தொலைநிலைக் கணினியில் ~/.chrome-remote-desktop-session இருந்தால், டெஸ்க்டாப் சூழல் அல்லது சாளர நிர்வாகி போன்ற நீண்ட நேரம் இயங்கும் முன்புலச் செயல்முறையை அது தொடங்குவதை உறுதிப்படுத்தவும்.</translation> <translation id="8759753423332885148">மேலும் அறிக.</translation> -<translation id="8791202241915690908">குரோமோட்டிங் ஹோஸ்ட் நிறுவியைப் பதிவிறக்கு</translation> +<translation id="8791202241915690908">Chromoting ஹோஸ்ட் நிறுவியைப் பதிவிறக்கு</translation> <translation id="894763922177556086">நன்று</translation> <translation id="895780780740011433">Windows 7 மற்றும் அதற்குப் பிந்தைய பதிப்புக்கானது</translation> <translation id="897805526397249209">வேறு கணினிக்குத் தொலைநிலை இணைப்புகளைச் செயலாக்க, குரோமோட்டிங்கை நிறுவி “<ph name="BUTTON_NAME" />” ஐக் கிளிக் செய்க.</translation> -<translation id="8998327464021325874">Chrome தொலைநிலை டெஸ்க்டாப் புரவன் கட்டுப்படுத்தி</translation> +<translation id="8998327464021325874">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் கண்ட்ரோலர்</translation> <translation id="9016232822027372900">எப்படியும் இணை</translation> <translation id="906458777597946297">சாளரத்தை பெரிதாக்கு</translation> <translation id="9111855907838866522">உங்கள் தொலைநிலைச் சாதனத்துடன் இணைக்கப்பட்டுள்ளீர்கள். மெனுவைத் திறக்க, நான்கு விரல்களால் திரையைத் தட்டவும்.</translation> -<translation id="9126115402994542723">இந்தச் சாதனத்தை, இந்த ஹோஸ்டுடன் இணைக்கும்போது PIN ஐ மீண்டும் கேட்க வேண்டாம்.</translation> +<translation id="9126115402994542723">இந்தச் சாதனத்திலிருந்து இந்த ஹோஸ்ட்டுடன் மீண்டும் இணைக்கும்போது PIN கேட்க வேண்டாம்.</translation> <translation id="9149580767411232853">தொலைநிலை டெஸ்க்டாப்பின் முழுத்திரையும் தெரியும்படி வை</translation> <translation id="9149992051684092333">உங்கள் டெஸ்க்டாப் பகிர்தலைத் தொடங்க, கீழே உள்ள அணுகல் குறியீட்டை உங்களுக்கு உதவுபவரிடம் வழங்குக.</translation> <translation id="9188433529406846933">அங்கீகரி</translation>
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb index 987b8a1..ce2351b 100644 --- a/remoting/resources/remoting_strings_te.xtb +++ b/remoting/resources/remoting_strings_te.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">ఎలాగో తెలుసుకోండి</translation> <translation id="3718805989288361841">Chrome రిమోట్ డెస్క్టాప్ యొక్క విధాన సెట్టింగ్లలో లోపం ఉంది. సహాయం కావాలంటే మీ సిస్టమ్ నిర్వాహకులను సంప్రదించండి.</translation> <translation id="3776024066357219166">మీ Chrome రిమోట్ డెస్క్టాప్ సెషన్ ముగిసింది.</translation> +<translation id="3846148461359626420">• iPhone Xలో మరింత మెరుగ్గా ప్యాన్ చేసే, జూమ్ చేసే అనుభవం. +• స్థిరమైన మెరుగుదలలు మరియు బగ్ పరిష్కారాలు.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">దయచేసి Chrome రిమోట్ డెస్క్టాప్ ద్వారా ప్రాప్యతను అనుమతించడానికి దిగువ మీ ఖాతా మరియు PINను నిర్ధారించండి.</translation> <translation id="3897092660631435901">మెను</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb index 0b7eea6..03a217a 100644 --- a/remoting/resources/remoting_strings_th.xtb +++ b/remoting/resources/remoting_strings_th.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">เรียนรู้วิธี</translation> <translation id="3718805989288361841">การตั้งค่านโยบายของ Chrome Remote Desktop มีข้อผิดพลาด โปรดติดต่อขอรับความช่วยเหลือจากผู้ดูแลระบบของคุณ</translation> <translation id="3776024066357219166">เซสชัน Chrome Remote Desktop ของคุณสิ้นสุดแล้ว</translation> +<translation id="3846148461359626420">• ประสบการณ์ในการเลื่อนและซูมใน iPhone X ดีขึ้น +• การปรับปรุงความเสถียรและการแก้ไขข้อบกพร่อง</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">โปรดยืนยันบัญชีและ PIN ของคุณด้านล่างเพื่ออนุญาตให้ Chrome Remote Desktop สามารถเข้าถึง</translation> <translation id="3897092660631435901">เมนู</translation>
diff --git a/remoting/resources/remoting_strings_tr.xtb b/remoting/resources/remoting_strings_tr.xtb index 10a93fcc..0d19e1f 100644 --- a/remoting/resources/remoting_strings_tr.xtb +++ b/remoting/resources/remoting_strings_tr.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Nasıl yapacağınızı öğrenin</translation> <translation id="3718805989288361841">Chrome Uzaktan Masaüstü politika ayarında bir hata oluştu. Yardım için sistem yöneticinizle görüşün.</translation> <translation id="3776024066357219166">Chrome Uzaktan Masaüstü oturumunuz sonlandı.</translation> +<translation id="3846148461359626420">• iPhone X'da daha iyi kaydırma ve yakınlaştırma deneyimi. +• Kararlılıkla ilgili iyileştirmeler ve hata düzeltmeleri.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Chrome Uzaktan Masaüstü tarafından erişime izin vermek için lütfen aşağıda hesabınızı ve PIN kodunuzu onaylayın.</translation> <translation id="3897092660631435901">Menü</translation>
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb index 14503b46..c0ea9b1 100644 --- a/remoting/resources/remoting_strings_uk.xtb +++ b/remoting/resources/remoting_strings_uk.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Докладніше</translation> <translation id="3718805989288361841">Сталася помилка в налаштуваннях правил Віддаленого керування Chrome. Зверніться по допомогу до свого системного адміністратора.</translation> <translation id="3776024066357219166">Сеанс програми Віддалене керування Chrome закінчено.</translation> +<translation id="3846148461359626420">• Покращено панорамування й масштабування на iPhone X. +• Покращено стабільність і виправлено помилки.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Підтвердьте свій обліковий запис і PIN-код нижче, щоб дозволити Віддалене керування Chrome.</translation> <translation id="3897092660631435901">Меню</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb index a69977f..cadde1b 100644 --- a/remoting/resources/remoting_strings_vi.xtb +++ b/remoting/resources/remoting_strings_vi.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">Tìm hiểu cách thức</translation> <translation id="3718805989288361841">Đã xảy ra lỗi với cài đặt chính sách cho Chrome Remote Desktop. Hãy liên hệ với quản trị viên hệ thống của bạn để được hỗ trợ.</translation> <translation id="3776024066357219166">Phiên Chrome Remote Desktop của bạn đã kết thúc.</translation> +<translation id="3846148461359626420">• Trải nghiệm xoay và thu phóng tốt hơn trên iPhone X. +• Cải thiện độ ổn định và sửa lỗi.</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">Vui lòng xác nhận tài khoản và mã PIN của bạn bên dưới để cho phép Chrome Remote Desktop truy cập.</translation> <translation id="3897092660631435901">Menu</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb index 49e0b2f..fbbc3f5 100644 --- a/remoting/resources/remoting_strings_zh-CN.xtb +++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">如何解决</translation> <translation id="3718805989288361841">Chrome 远程桌面的政策设置有误。请与您的系统管理员联系寻求帮助。</translation> <translation id="3776024066357219166">您的 Chrome 远程桌面会话已结束。</translation> +<translation id="3846148461359626420">• 改进了在 iPhone X 上的平移和缩放体验。 +• 提升了稳定性,并更正了多项错误。</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">请在下方确认您的帐号和 PIN,以便允许通过 Chrome 远程桌面进行访问。</translation> <translation id="3897092660631435901">菜单</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb index 094507e1..9ab4d6f 100644 --- a/remoting/resources/remoting_strings_zh-TW.xtb +++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -122,6 +122,8 @@ <translation id="3695446226812920698">操作說明</translation> <translation id="3718805989288361841">Chrome 遠端桌面的政策設定有誤。如需協助,請與系統管理員聯絡。</translation> <translation id="3776024066357219166">你的 Chrome 遠端桌面工作階段已結束。</translation> +<translation id="3846148461359626420">• 改善在 iPhone X 上平移和縮放的操作體驗。 +• 提升穩定性並修正各項錯誤。</translation> <translation id="3870154837782082782">Google Inc.</translation> <translation id="3884839335308961732">請在下方確認你的帳戶和 PIN,以便授予 Chrome 遠端桌面存取權限。</translation> <translation id="3897092660631435901">選單</translation>
diff --git a/services/audio/BUILD.gn b/services/audio/BUILD.gn index e3a2d7d..bd04a85 100644 --- a/services/audio/BUILD.gn +++ b/services/audio/BUILD.gn
@@ -31,8 +31,6 @@ source_set("lib") { sources = [ - "audio_sandbox_win.cc", - "audio_sandbox_win.h", "debug_recording.cc", "debug_recording.h", "delay_buffer.cc", @@ -106,9 +104,25 @@ "//services/service_manager/sandbox:sandbox", ] + if (is_linux) { + sources += [ + "audio_sandbox_hook_linux.cc", + "audio_sandbox_hook_linux.h", + ] + public_deps += [ "//sandbox/linux:sandbox_services" ] + } + if (is_win) { + sources += [ + "audio_sandbox_win.cc", + "audio_sandbox_win.h", + ] public_deps += [ "//sandbox/win:sandbox" ] } + configs += [ + "//media:media_config", + "//media/audio:platform_config", + ] } source_set("tests") {
diff --git a/services/audio/DEPS b/services/audio/DEPS index 4e45e6d0..5c8ac887 100644 --- a/services/audio/DEPS +++ b/services/audio/DEPS
@@ -5,4 +5,5 @@ "+media/webrtc", "+sandbox", "+services/audio/public", + "+services/service_manager/sandbox", ]
diff --git a/services/audio/OWNERS b/services/audio/OWNERS index 596e00e..3c9700a1 100644 --- a/services/audio/OWNERS +++ b/services/audio/OWNERS
@@ -6,6 +6,7 @@ per-file manifest.json=set noparent per-file manifest.json=file://ipc/SECURITY_OWNERS +per-file audio_sandbox_hook_linux.*=file://sandbox/linux/OWNERS per-file audio_sandbox_win.*=file://sandbox/win/OWNERS # COMPONENT: Internals>Media>Audio
diff --git a/services/audio/audio_sandbox_hook_linux.cc b/services/audio/audio_sandbox_hook_linux.cc new file mode 100644 index 0000000..859e66b5 --- /dev/null +++ b/services/audio/audio_sandbox_hook_linux.cc
@@ -0,0 +1,131 @@ +// 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 "services/audio/audio_sandbox_hook_linux.h" + +#include <dlfcn.h> +#include <string> +#include <vector> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/strings/stringprintf.h" +#include "sandbox/linux/syscall_broker/broker_command.h" +#include "sandbox/linux/syscall_broker/broker_file_permission.h" + +using sandbox::syscall_broker::BrokerFilePermission; +using sandbox::syscall_broker::MakeBrokerCommandSet; + +namespace audio { + +namespace { + +#if defined(USE_ALSA) +void AddAlsaFilePermissions(std::vector<BrokerFilePermission>* permissions) { + base::FilePath home_dir; + base::PathService::Get(base::DIR_HOME, &home_dir); + const base::FilePath kAsoundrc = + home_dir.Append(FILE_PATH_LITERAL(".asoundrc")); + const std::string kReadOnlyFilenames[]{"/etc/asound.conf", "/proc/cpuinfo", + "/etc/group", "/etc/nsswitch.conf", + kAsoundrc.value()}; + for (const auto& filename : kReadOnlyFilenames) + permissions->push_back(BrokerFilePermission::ReadOnly(filename)); + + permissions->push_back( + BrokerFilePermission::ReadOnlyRecursive("/usr/share/alsa/")); + permissions->push_back( + BrokerFilePermission::ReadWriteCreateRecursive("/dev/snd/")); + + static const base::FilePath::CharType kDevAloadPath[] = + FILE_PATH_LITERAL("/dev/aloadC"); + for (int i = 0; i <= 31; ++i) { + permissions->push_back(BrokerFilePermission::ReadWrite( + base::StringPrintf("%s%d", kDevAloadPath, i))); + } +} +#endif + +#if defined(USE_PULSEAUDIO) +void AddPulseAudioFilePermissions( + std::vector<BrokerFilePermission>* permissions) { + base::FilePath home_dir; + base::PathService::Get(base::DIR_HOME, &home_dir); + const base::FilePath kXauthorityPath = + home_dir.Append(FILE_PATH_LITERAL(".Xauthority")); + + // Calling read() system call on /proc/self/exe returns broker process' path, + // and it's used by pulse audio for creating a new context. + const std::string kReadOnlyFilenames[]{ + "/etc/machine-id", "/proc/self/exe", + "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", + "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules", kXauthorityPath.value()}; + for (const auto& filename : kReadOnlyFilenames) + permissions->push_back(BrokerFilePermission::ReadOnly(filename)); + + const base::FilePath kPulsePath = + home_dir.Append(FILE_PATH_LITERAL(".pulse/")); + const base::FilePath kConfigPulsePath = + home_dir.Append(FILE_PATH_LITERAL(".config/pulse/")); + const std::string kReadOnlyRecursivePaths[]{"/etc/pulse/", kPulsePath.value(), + kConfigPulsePath.value()}; + for (const auto& path : kReadOnlyRecursivePaths) + permissions->push_back(BrokerFilePermission::ReadOnlyRecursive(path)); +} +#endif + +std::vector<BrokerFilePermission> GetAudioFilePermissions() { + std::vector<BrokerFilePermission> permissions{ + BrokerFilePermission::ReadOnly("/dev/urandom"), + BrokerFilePermission::ReadOnly("/sys/devices/system/cpu"), + BrokerFilePermission::ReadOnlyRecursive("/usr/share/locale/"), + BrokerFilePermission::ReadWriteCreateRecursive("/dev/shm/")}; + +#if defined(USE_PULSEAUDIO) + AddPulseAudioFilePermissions(&permissions); +#endif +#if defined(USE_ALSA) + AddAlsaFilePermissions(&permissions); +#endif + + return permissions; +} + +void LoadAudioLibraries() { + const std::string kLibraries[]{"libasound.so.2", "libpulse.so.0", + "libpulsecommon-11.1.so", "libnss_files.so.2"}; + for (const auto& library_name : kLibraries) { + if (nullptr == + dlopen(library_name.c_str(), RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE)) { + LOG(WARNING) << "dlopen: failed to open " << library_name + << " with error: " << dlerror(); + } + } +} + +} // namespace + +bool AudioPreSandboxHook(service_manager::SandboxLinux::Options options) { + LoadAudioLibraries(); + auto* instance = service_manager::SandboxLinux::GetInstance(); + instance->StartBrokerProcess(MakeBrokerCommandSet({ + sandbox::syscall_broker::COMMAND_ACCESS, + sandbox::syscall_broker::COMMAND_OPEN, + sandbox::syscall_broker::COMMAND_READLINK, + sandbox::syscall_broker::COMMAND_STAT, + sandbox::syscall_broker::COMMAND_UNLINK, + }), + GetAudioFilePermissions(), + service_manager::SandboxLinux::PreSandboxHook(), + options); + + // TODO(https://crbug.com/850878) enable namespace sandbox. Currently, if + // enabled, connect() on pulse native socket fails with ENOENT (called from + // pa_context_connect). + + return true; +} + +} // namespace audio
diff --git a/services/audio/audio_sandbox_hook_linux.h b/services/audio/audio_sandbox_hook_linux.h new file mode 100644 index 0000000..528ceaa --- /dev/null +++ b/services/audio/audio_sandbox_hook_linux.h
@@ -0,0 +1,18 @@ +// 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 SERVICES_AUDIO_AUDIO_SANDBOX_HOOK_LINUX_H_ +#define SERVICES_AUDIO_AUDIO_SANDBOX_HOOK_LINUX_H_ + +#include "services/service_manager/sandbox/linux/sandbox_linux.h" + +namespace audio { + +// Load audio shared libraries and setup allowed commands and filesystem +// permissions for audio service sandboxed process. +bool AudioPreSandboxHook(service_manager::SandboxLinux::Options options); + +} // namespace audio + +#endif // SERVICES_AUDIO_AUDIO_SANDBOX_HOOK_LINUX_H_
diff --git a/services/catalog/entry.cc b/services/catalog/entry.cc index 682bf02..b79dbfa0 100644 --- a/services/catalog/entry.cc +++ b/services/catalog/entry.cc
@@ -184,10 +184,10 @@ << instance_sharing; } - if (const base::Value* allow_other_user_ids_value = - options->FindKey("allow_other_user_ids")) - options_struct.allow_other_user_ids = - allow_other_user_ids_value->GetBool(); + if (const base::Value* can_connect_to_other_services_as_any_user_value = + options->FindKey("can_connect_to_other_services_as_any_user")) + options_struct.can_connect_to_other_services_as_any_user = + can_connect_to_other_services_as_any_user_value->GetBool(); if (const base::Value* allow_other_instance_names_value = options->FindKey("allow_other_instance_names"))
diff --git a/services/catalog/entry_unittest.cc b/services/catalog/entry_unittest.cc index eb0429a..ec360c6 100644 --- a/services/catalog/entry_unittest.cc +++ b/services/catalog/entry_unittest.cc
@@ -75,7 +75,7 @@ EXPECT_EQ(ServiceOptions::InstanceSharingType::SINGLETON, entry->options().instance_sharing); - EXPECT_TRUE(entry->options().allow_other_user_ids); + EXPECT_TRUE(entry->options().can_connect_to_other_services_as_any_user); EXPECT_TRUE(entry->options().allow_other_instance_names); EXPECT_TRUE(entry->options().instance_for_client_process);
diff --git a/services/catalog/service_options.h b/services/catalog/service_options.h index 4499b4b3..b5f14fe 100644 --- a/services/catalog/service_options.h +++ b/services/catalog/service_options.h
@@ -15,7 +15,7 @@ }; InstanceSharingType instance_sharing = InstanceSharingType::NONE; - bool allow_other_user_ids = false; + bool can_connect_to_other_services_as_any_user = false; bool allow_other_instance_names = false; bool instance_for_client_process = false; };
diff --git a/services/catalog/test_data/options b/services/catalog/test_data/options index 64ee0778..1917633 100644 --- a/services/catalog/test_data/options +++ b/services/catalog/test_data/options
@@ -3,7 +3,7 @@ "display_name": "Foo", "options": { "instance_sharing": "singleton", - "allow_other_user_ids": true, + "can_connect_to_other_services_as_any_user": true, "allow_other_instance_names": true, "instance_for_client_process": true },
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn index 83dce91..3702579 100644 --- a/services/device/BUILD.gn +++ b/services/device/BUILD.gn
@@ -27,6 +27,7 @@ deps = [ "//base", + "//services/device/bluetooth", "//services/device/fingerprint", "//services/device/generic_sensor", "//services/device/geolocation", @@ -109,6 +110,7 @@ "//mojo/public/cpp/bindings", "//net", "//net:test_support", + "//services/device/bluetooth:tests", "//services/device/generic_sensor", "//services/device/geolocation", "//services/device/geolocation:test_support",
diff --git a/services/device/bluetooth/BUILD.gn b/services/device/bluetooth/BUILD.gn new file mode 100644 index 0000000..645c2fc --- /dev/null +++ b/services/device/bluetooth/BUILD.gn
@@ -0,0 +1,42 @@ +# 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("//build/config/features.gni") + +source_set("bluetooth") { + visibility = [ + "//services/device:lib", + "//services/device/bluetooth:tests", + ] + + sources = [ + "bluetooth_system.cc", + "bluetooth_system.h", + "bluetooth_system_factory.cc", + "bluetooth_system_factory.h", + ] + + public_deps = [ + "//services/device/public/mojom", + ] + + deps = [ + "//base", + ] +} + +source_set("tests") { + testonly = true + + sources = [ + "bluetooth_system_unittest.cc", + ] + + deps = [ + ":bluetooth", + "//net", + "//services/device:test_support", + "//testing/gtest", + ] +}
diff --git a/services/device/bluetooth/bluetooth_system.cc b/services/device/bluetooth/bluetooth_system.cc new file mode 100644 index 0000000..86ea59b --- /dev/null +++ b/services/device/bluetooth/bluetooth_system.cc
@@ -0,0 +1,26 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/device/bluetooth/bluetooth_system.h" + +#include <memory> +#include <utility> + +#include "mojo/public/cpp/bindings/strong_binding.h" + +namespace device { + +void BluetoothSystem::Create(mojom::BluetoothSystemRequest request, + mojom::BluetoothSystemClientPtr client) { + mojo::MakeStrongBinding(std::make_unique<BluetoothSystem>(std::move(client)), + std::move(request)); +} + +BluetoothSystem::BluetoothSystem(mojom::BluetoothSystemClientPtr client) { + client_ptr_ = std::move(client); +} + +BluetoothSystem::~BluetoothSystem() = default; + +} // namespace device
diff --git a/services/device/bluetooth/bluetooth_system.h b/services/device/bluetooth/bluetooth_system.h new file mode 100644 index 0000000..99412f39 --- /dev/null +++ b/services/device/bluetooth/bluetooth_system.h
@@ -0,0 +1,29 @@ +// 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 SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_H_ +#define SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_H_ + +#include "base/macros.h" +#include "services/device/public/mojom/bluetooth_system.mojom.h" + +namespace device { + +class BluetoothSystem : public mojom::BluetoothSystem { + public: + static void Create(mojom::BluetoothSystemRequest request, + mojom::BluetoothSystemClientPtr client); + + explicit BluetoothSystem(mojom::BluetoothSystemClientPtr client); + ~BluetoothSystem() override; + + private: + mojom::BluetoothSystemClientPtr client_ptr_; + + DISALLOW_COPY_AND_ASSIGN(BluetoothSystem); +}; + +} // namespace device + +#endif // SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_H_
diff --git a/services/device/bluetooth/bluetooth_system_factory.cc b/services/device/bluetooth/bluetooth_system_factory.cc new file mode 100644 index 0000000..47f731c --- /dev/null +++ b/services/device/bluetooth/bluetooth_system_factory.cc
@@ -0,0 +1,31 @@ +// 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 "services/device/bluetooth/bluetooth_system_factory.h" + +#include <memory> +#include <utility> + +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "services/device/bluetooth/bluetooth_system.h" + +namespace device { + +void BluetoothSystemFactory::CreateFactory( + mojom::BluetoothSystemFactoryRequest request) { + mojo::MakeStrongBinding(std::make_unique<BluetoothSystemFactory>(), + std::move(request)); +} + +BluetoothSystemFactory::BluetoothSystemFactory() = default; + +BluetoothSystemFactory::~BluetoothSystemFactory() = default; + +void BluetoothSystemFactory::Create( + mojom::BluetoothSystemRequest system_request, + mojom::BluetoothSystemClientPtr system_client) { + BluetoothSystem::Create(std::move(system_request), std::move(system_client)); +} + +} // namespace device
diff --git a/services/device/bluetooth/bluetooth_system_factory.h b/services/device/bluetooth/bluetooth_system_factory.h new file mode 100644 index 0000000..05c4b821 --- /dev/null +++ b/services/device/bluetooth/bluetooth_system_factory.h
@@ -0,0 +1,30 @@ +// 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 SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_FACTORY_H_ +#define SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_FACTORY_H_ + +#include "base/macros.h" +#include "services/device/public/mojom/bluetooth_system.mojom.h" + +namespace device { + +class BluetoothSystemFactory : public mojom::BluetoothSystemFactory { + public: + static void CreateFactory(mojom::BluetoothSystemFactoryRequest request); + + BluetoothSystemFactory(); + ~BluetoothSystemFactory() override; + + // mojom::BluetoothSystemFactory + void Create(mojom::BluetoothSystemRequest system_request, + mojom::BluetoothSystemClientPtr system_client) override; + + private: + DISALLOW_COPY_AND_ASSIGN(BluetoothSystemFactory); +}; + +} // namespace device + +#endif // SERVICES_DEVICE_BLUETOOTH_BLUETOOTH_SYSTEM_FACTORY_H_
diff --git a/services/device/bluetooth/bluetooth_system_unittest.cc b/services/device/bluetooth/bluetooth_system_unittest.cc new file mode 100644 index 0000000..220499f6 --- /dev/null +++ b/services/device/bluetooth/bluetooth_system_unittest.cc
@@ -0,0 +1,53 @@ +// 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 "services/device/bluetooth/bluetooth_system.h" + +#include <utility> + +#include "base/run_loop.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "services/device/device_service_test_base.h" +#include "services/device/public/mojom/bluetooth_system.mojom.h" +#include "services/device/public/mojom/constants.mojom.h" + +namespace device { + +class BluetoothSystemTest : public DeviceServiceTestBase, + public mojom::BluetoothSystemClient { + public: + BluetoothSystemTest() = default; + ~BluetoothSystemTest() override = default; + + void SetUp() override { + DeviceServiceTestBase::SetUp(); + connector()->BindInterface(mojom::kServiceName, &system_factory_); + } + + protected: + mojom::BluetoothSystemFactoryPtr system_factory_; + + private: + DISALLOW_COPY_AND_ASSIGN(BluetoothSystemTest); +}; + +TEST_F(BluetoothSystemTest, FactoryCreate) { + mojom::BluetoothSystemPtr system_ptr; + mojo::Binding<mojom::BluetoothSystemClient> client_binding(this); + + mojom::BluetoothSystemClientPtr client_ptr; + client_binding.Bind(mojo::MakeRequest(&client_ptr)); + + EXPECT_FALSE(system_ptr.is_bound()); + + system_factory_->Create(mojo::MakeRequest(&system_ptr), + std::move(client_ptr)); + base::RunLoop run_loop; + system_ptr.FlushAsyncForTesting(run_loop.QuitClosure()); + run_loop.Run(); + + EXPECT_TRUE(system_ptr.is_bound()); +} + +} // namespace device
diff --git a/services/device/device_service.cc b/services/device/device_service.cc index 7be23bc..da54224 100644 --- a/services/device/device_service.cc +++ b/services/device/device_service.cc
@@ -12,6 +12,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "mojo/public/cpp/system/message_pipe.h" +#include "services/device/bluetooth/bluetooth_system_factory.h" #include "services/device/fingerprint/fingerprint.h" #include "services/device/generic_sensor/sensor_provider_impl.h" #include "services/device/geolocation/geolocation_config.h" @@ -113,6 +114,9 @@ } void DeviceService::OnStart() { + registry_.AddInterface<mojom::BluetoothSystemFactory>( + base::BindRepeating(&DeviceService::BindBluetoothSystemFactoryRequest, + base::Unretained(this))); registry_.AddInterface<mojom::Fingerprint>(base::Bind( &DeviceService::BindFingerprintRequest, base::Unretained(this))); registry_.AddInterface<mojom::GeolocationConfig>(base::BindRepeating( @@ -178,6 +182,11 @@ registry_.BindInterface(interface_name, std::move(interface_pipe)); } +void DeviceService::BindBluetoothSystemFactoryRequest( + mojom::BluetoothSystemFactoryRequest request) { + BluetoothSystemFactory::CreateFactory(std::move(request)); +} + #if !defined(OS_ANDROID) void DeviceService::BindBatteryMonitorRequest( mojom::BatteryMonitorRequest request) {
diff --git a/services/device/device_service.h b/services/device/device_service.h index 2eae9a4..64b9e36 100644 --- a/services/device/device_service.h +++ b/services/device/device_service.h
@@ -15,6 +15,7 @@ #include "services/device/geolocation/geolocation_provider_impl.h" #include "services/device/geolocation/public_ip_address_geolocation_provider.h" #include "services/device/public/mojom/battery_monitor.mojom.h" +#include "services/device/public/mojom/bluetooth_system.mojom.h" #include "services/device/public/mojom/fingerprint.mojom.h" #include "services/device/public/mojom/geolocation.mojom.h" #include "services/device/public/mojom/geolocation_config.mojom.h" @@ -113,6 +114,8 @@ const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) override; + void BindBluetoothSystemFactoryRequest( + mojom::BluetoothSystemFactoryRequest request); void BindFingerprintRequest(mojom::FingerprintRequest request); void BindGeolocationConfigRequest(mojom::GeolocationConfigRequest request); void BindGeolocationContextRequest(mojom::GeolocationContextRequest request);
diff --git a/services/device/generic_sensor/fake_platform_sensor_and_provider.cc b/services/device/generic_sensor/fake_platform_sensor_and_provider.cc index 0d53e3bc..a9badf7 100644 --- a/services/device/generic_sensor/fake_platform_sensor_and_provider.cc +++ b/services/device/generic_sensor/fake_platform_sensor_and_provider.cc
@@ -80,7 +80,8 @@ mojom::SensorType type, SensorReadingSharedBuffer* reading_buffer, const CreateSensorCallback& callback) { - DCHECK(type >= mojom::SensorType::FIRST && type <= mojom::SensorType::LAST); + DCHECK(type >= mojom::SensorType::kMinValue && + type <= mojom::SensorType::kMaxValue); auto sensor = base::MakeRefCounted<FakePlatformSensor>(type, reading_buffer, this); DoCreateSensorInternal(type, std::move(sensor), callback);
diff --git a/services/device/generic_sensor/linux/sensor_device_manager.cc b/services/device/generic_sensor/linux/sensor_device_manager.cc index 526b4b3..b13c8a8 100644 --- a/services/device/generic_sensor/linux/sensor_device_manager.cc +++ b/services/device/generic_sensor/linux/sensor_device_manager.cc
@@ -81,9 +81,9 @@ if (device_node.empty()) return; - const uint32_t first = static_cast<uint32_t>(mojom::SensorType::FIRST); - const uint32_t last = static_cast<uint32_t>(mojom::SensorType::LAST); - for (uint32_t i = first; i < last; ++i) { + const uint32_t first = static_cast<uint32_t>(mojom::SensorType::kMinValue); + const uint32_t last = static_cast<uint32_t>(mojom::SensorType::kMaxValue); + for (uint32_t i = first; i <= last; ++i) { SensorPathsLinux data; mojom::SensorType type = static_cast<mojom::SensorType>(i); if (!InitSensorData(type, &data))
diff --git a/services/device/generic_sensor/platform_sensor_provider_base.cc b/services/device/generic_sensor/platform_sensor_provider_base.cc index 011e6e7..f5cb25c 100644 --- a/services/device/generic_sensor/platform_sensor_provider_base.cc +++ b/services/device/generic_sensor/platform_sensor_provider_base.cc
@@ -15,7 +15,8 @@ const uint64_t kReadingBufferSize = sizeof(SensorReadingSharedBuffer); const uint64_t kSharedBufferSizeInBytes = - kReadingBufferSize * static_cast<uint64_t>(mojom::SensorType::LAST); + kReadingBufferSize * + (static_cast<uint64_t>(mojom::SensorType::kMaxValue) + 1); } // namespace
diff --git a/services/device/manifest.json b/services/device/manifest.json index 254f9ef5..f9f38255 100644 --- a/services/device/manifest.json +++ b/services/device/manifest.json
@@ -8,6 +8,7 @@ "service_manager:connector": { "provides": { "device:battery_monitor": [ "device.mojom.BatteryMonitor" ], + "device:bluetooth_system": [ "device.mojom.BluetoothSystemFactory" ], "device:fingerprint": [ "device.mojom.Fingerprint" ], "device:generic_sensor": [ "device.mojom.SensorProvider" ], "device:geolocation": [ "device.mojom.GeolocationContext" ],
diff --git a/services/device/public/cpp/generic_sensor/sensor_reading.cc b/services/device/public/cpp/generic_sensor/sensor_reading.cc index 9d9b5cf6..bc98c33 100644 --- a/services/device/public/cpp/generic_sensor/sensor_reading.cc +++ b/services/device/public/cpp/generic_sensor/sensor_reading.cc
@@ -40,9 +40,7 @@ // static uint64_t SensorReadingSharedBuffer::GetOffset(mojom::SensorType type) { - return (static_cast<uint64_t>(mojom::SensorType::LAST) - - static_cast<uint64_t>(type)) * - sizeof(SensorReadingSharedBuffer); + return static_cast<uint64_t>(type) * sizeof(SensorReadingSharedBuffer); } } // namespace device
diff --git a/services/device/public/cpp/generic_sensor/sensor_traits.cc b/services/device/public/cpp/generic_sensor/sensor_traits.cc index 849b1dc..a191142 100644 --- a/services/device/public/cpp/generic_sensor/sensor_traits.cc +++ b/services/device/public/cpp/generic_sensor/sensor_traits.cc
@@ -40,7 +40,7 @@ // No default so the compiler will warn us if a new type is added. } NOTREACHED() << "Unknown sensor type " << type; - return SensorTraits<SensorType::LAST>::kMaxAllowedFrequency; + return SensorTraits<SensorType::kMaxValue>::kMaxAllowedFrequency; } double GetSensorDefaultFrequency(mojom::SensorType type) { @@ -74,7 +74,7 @@ // No default so the compiler will warn us if a new type is added. } NOTREACHED() << "Unknown sensor type " << type; - return SensorTraits<SensorType::LAST>::kDefaultFrequency; + return SensorTraits<SensorType::kMaxValue>::kDefaultFrequency; } } // namespace device
diff --git a/services/device/public/cpp/test/fake_sensor_and_provider.cc b/services/device/public/cpp/test/fake_sensor_and_provider.cc index 80976ef..c8363fb 100644 --- a/services/device/public/cpp/test/fake_sensor_and_provider.cc +++ b/services/device/public/cpp/test/fake_sensor_and_provider.cc
@@ -18,7 +18,8 @@ const uint64_t kReadingBufferSize = sizeof(device::SensorReadingSharedBuffer); const uint64_t kSharedBufferSizeInBytes = - kReadingBufferSize * static_cast<uint64_t>(device::mojom::SensorType::LAST); + kReadingBufferSize * + (static_cast<uint64_t>(device::mojom::SensorType::kMaxValue) + 1); } // namespace
diff --git a/services/device/public/mojom/BUILD.gn b/services/device/public/mojom/BUILD.gn index 212fb1b..4a786db 100644 --- a/services/device/public/mojom/BUILD.gn +++ b/services/device/public/mojom/BUILD.gn
@@ -9,6 +9,7 @@ sources = [ "battery_monitor.mojom", "battery_status.mojom", + "bluetooth_system.mojom", "fingerprint.mojom", "geolocation.mojom", "geolocation_config.mojom",
diff --git a/services/device/public/mojom/bluetooth_system.mojom b/services/device/public/mojom/bluetooth_system.mojom new file mode 100644 index 0000000..69d3a3a85 --- /dev/null +++ b/services/device/public/mojom/bluetooth_system.mojom
@@ -0,0 +1,26 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module device.mojom; + +// Factory to get an instance of the BluetoothSystem interface. +interface BluetoothSystemFactory { + Create(BluetoothSystem& system, BluetoothSystemClient system_client); +}; + +// High level interface targeted towards UI level components that: +// - Show the BT Radio state and allow users to change it. +// - Show a list of nearby, connected and paired BT Devices. +// - Start and stop BT scans. +// - Connect to and pair with BT devices. +// +// This interface is implemented only on Chrome OS and lives in the Device +// Service. +interface BluetoothSystem { +}; + +// Interface used by clients of BluetoothSystem to get notified of events +// like Bluetooth State changes. +interface BluetoothSystemClient { +};
diff --git a/services/device/public/mojom/sensor.mojom b/services/device/public/mojom/sensor.mojom index 19e9fe8..ed8bd83 100644 --- a/services/device/public/mojom/sensor.mojom +++ b/services/device/public/mojom/sensor.mojom
@@ -8,8 +8,7 @@ // When adding new sensor type, update the documentation of sensor data values // in SensorReading struct at sensor_reading.h file. enum SensorType { - FIRST = 1, - AMBIENT_LIGHT = FIRST, + AMBIENT_LIGHT, PROXIMITY, ACCELEROMETER, LINEAR_ACCELERATION, @@ -24,7 +23,6 @@ RELATIVE_ORIENTATION_EULER_ANGLES, // Recommended for new code. RELATIVE_ORIENTATION_QUATERNION, - LAST = RELATIVE_ORIENTATION_QUATERNION // Note: LAST is also equal to the types count. }; // Reporting mode supported by the Sensor.
diff --git a/services/device/unittest_manifest.json b/services/device/unittest_manifest.json index b6889ea..ce96a0e 100644 --- a/services/device/unittest_manifest.json +++ b/services/device/unittest_manifest.json
@@ -10,6 +10,7 @@ }, "requires": { "device": [ + "device:bluetooth_system", "device:battery_monitor", "device:generic_sensor", "device:geolocation_config",
diff --git a/services/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java b/services/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java index 354bf74..0c5be4d 100644 --- a/services/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java +++ b/services/device/vibration/android/java/src/org/chromium/device/vibration/VibrationManagerImpl.java
@@ -33,7 +33,7 @@ private final boolean mHasVibratePermission; private static long sVibrateMilliSecondsForTesting = -1; - private static boolean sVibrateCancelledForTesting = false; + private static boolean sVibrateCancelledForTesting; public VibrationManagerImpl() { Context appContext = ContextUtils.getApplicationContext();
diff --git a/services/identity/public/objc/BUILD.gn b/services/identity/public/objc/BUILD.gn new file mode 100644 index 0000000..0e9cf2d --- /dev/null +++ b/services/identity/public/objc/BUILD.gn
@@ -0,0 +1,15 @@ +# 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. + +source_set("objc") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "identity_manager_observer_bridge.h", + "identity_manager_observer_bridge.mm", + ] + + public_deps = [ + "//services/identity/public/cpp", + ] +}
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.h b/services/identity/public/objc/identity_manager_observer_bridge.h new file mode 100644 index 0000000..9285e4f --- /dev/null +++ b/services/identity/public/objc/identity_manager_observer_bridge.h
@@ -0,0 +1,67 @@ +// 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 SERVICES_IDENTITY_PUBLIC_OBJC_IDENTITY_MANAGER_OBSERVER_BRIDGE_H_ +#define SERVICES_IDENTITY_PUBLIC_OBJC_IDENTITY_MANAGER_OBSERVER_BRIDGE_H_ + +#import <Foundation/Foundation.h> +#include <vector> + +#include "services/identity/public/cpp/identity_manager.h" + +// Implement this protocol and pass your implementation into an +// IdentityManagerObserverBridge object to receive IdentityManager observer +// callbacks in Objective-C. +@protocol IdentityManagerObserverBridgeDelegate<NSObject> + +@optional + +// These callbacks follow the semantics of the corresponding +// IdentityManager::Observer callbacks. See the comments on +// IdentityManager::Observer in identity_manager.h for the specification of +// these semantics. + +- (void)onPrimaryAccountSet:(const AccountInfo&)primaryAccountInfo; +- (void)onPrimaryAccountCleared:(const AccountInfo&)previousPrimaryAccountInfo; +- (void)onRefreshTokenUpdatedForAccount:(const AccountInfo&)accountInfo + valid:(BOOL)isValid; +- (void)onRefreshTokenRemovedForAccount:(const AccountInfo&)accountInfo; +- (void)onAccountsInCookieUpdated:(const std::vector<AccountInfo>&)accounts; + +@end + +namespace identity { + +// Bridge class that listens for |IdentityManager| notifications and +// passes them to its Objective-C delegate. +class IdentityManagerObserverBridge : public IdentityManager::Observer { + public: + IdentityManagerObserverBridge( + IdentityManager* identity_manager, + id<IdentityManagerObserverBridgeDelegate> delegate); + ~IdentityManagerObserverBridge() override; + + // IdentityManager::Observer. + void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override; + void OnPrimaryAccountCleared( + const AccountInfo& previous_primary_account_info) override; + void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info, + bool is_valid) override; + void OnRefreshTokenRemovedForAccount( + const AccountInfo& account_info) override; + void OnAccountsInCookieUpdated( + const std::vector<AccountInfo>& accounts) override; + + private: + // Identity manager to observe. + IdentityManager* identity_manager_; + // Delegate to call. + __weak id<IdentityManagerObserverBridgeDelegate> delegate_; + + DISALLOW_COPY_AND_ASSIGN(IdentityManagerObserverBridge); +}; + +} // namespace identity + +#endif // SERVICES_IDENTITY_PUBLIC_OBJC_IDENTITY_MANAGER_OBSERVER_BRIDGE_H_
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.mm b/services/identity/public/objc/identity_manager_observer_bridge.mm new file mode 100644 index 0000000..3880b14 --- /dev/null +++ b/services/identity/public/objc/identity_manager_observer_bridge.mm
@@ -0,0 +1,62 @@ +// 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 "services/identity/public/objc/identity_manager_observer_bridge.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace identity { + +IdentityManagerObserverBridge::IdentityManagerObserverBridge( + IdentityManager* identity_manager, + id<IdentityManagerObserverBridgeDelegate> delegate) + : identity_manager_(identity_manager), delegate_(delegate) { + identity_manager_->AddObserver(this); +} + +IdentityManagerObserverBridge::~IdentityManagerObserverBridge() { + identity_manager_->RemoveObserver(this); +} + +void IdentityManagerObserverBridge::OnPrimaryAccountSet( + const AccountInfo& primary_account_info) { + if ([delegate_ respondsToSelector:@selector(onPrimaryAccountSet:)]) { + [delegate_ onPrimaryAccountSet:primary_account_info]; + } +} + +void IdentityManagerObserverBridge::OnPrimaryAccountCleared( + const AccountInfo& previous_primary_account_info) { + if ([delegate_ respondsToSelector:@selector(onPrimaryAccountCleared:)]) { + [delegate_ onPrimaryAccountCleared:previous_primary_account_info]; + } +} + +void IdentityManagerObserverBridge::OnRefreshTokenUpdatedForAccount( + const AccountInfo& account_info, + bool is_valid) { + if ([delegate_ respondsToSelector:@selector + (onRefreshTokenUpdatedForAccount:valid:)]) { + [delegate_ onRefreshTokenUpdatedForAccount:account_info valid:is_valid]; + } +} + +void IdentityManagerObserverBridge::OnRefreshTokenRemovedForAccount( + const AccountInfo& account_info) { + if ([delegate_ + respondsToSelector:@selector(onRefreshTokenRemovedForAccount:)]) { + [delegate_ onRefreshTokenRemovedForAccount:account_info]; + } +} + +void IdentityManagerObserverBridge::OnAccountsInCookieUpdated( + const std::vector<AccountInfo>& accounts) { + if ([delegate_ respondsToSelector:@selector(onAccountsInCookieUpdated:)]) { + [delegate_ onAccountsInCookieUpdated:accounts]; + } +} + +} // namespace identity
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index 16aecf4..f5986d7 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -114,6 +114,8 @@ "ssl_config_service_mojo.h", "ssl_config_type_converter.cc", "ssl_config_type_converter.h", + "tcp_bound_socket.cc", + "tcp_bound_socket.h", "tcp_connected_socket.cc", "tcp_connected_socket.h", "tcp_server_socket.cc", @@ -134,6 +136,8 @@ "throttling/throttling_upload_data_stream.h", "tls_client_socket.cc", "tls_client_socket.h", + "tls_socket_factory.cc", + "tls_socket_factory.h", "transitional_url_loader_factory_owner.cc", "transitional_url_loader_factory_owner.h", "udp_socket.cc", @@ -261,6 +265,7 @@ "session_cleanup_cookie_store_unittest.cc", "socket_data_pump_unittest.cc", "ssl_config_service_mojo_unittest.cc", + "tcp_bound_socket_unittest.cc", "tcp_socket_unittest.cc", "test/test_url_loader_factory_unittest.cc", "test_chunked_data_pipe_getter.cc",
diff --git a/services/network/chunked_data_pipe_upload_data_stream_unittest.cc b/services/network/chunked_data_pipe_upload_data_stream_unittest.cc index 3c2cd63..77aaf02 100644 --- a/services/network/chunked_data_pipe_upload_data_stream_unittest.cc +++ b/services/network/chunked_data_pipe_upload_data_stream_unittest.cc
@@ -76,8 +76,8 @@ std::string read_data; while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(consumer_read_size)); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(consumer_read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); if (read_data.size() == 0) @@ -91,8 +91,8 @@ EXPECT_EQ(read_data, kData); } - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(consumer_read_size)); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(consumer_read_size); net::TestCompletionCallback callback; int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); @@ -121,8 +121,8 @@ std::string read_data; while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(consumer_read_size)); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(consumer_read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); ASSERT_LT(0, result); @@ -137,8 +137,8 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(consumer_read_size)); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(consumer_read_size); EXPECT_EQ(net::OK, chunked_upload_stream_->Read(io_buffer.get(), io_buffer->size(), callback.callback())); @@ -174,8 +174,8 @@ std::string read_data; while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(kData.size())); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(kData.size()); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -191,8 +191,7 @@ EXPECT_EQ(kData, read_data); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::OK, callback.GetResult(result)); @@ -232,8 +231,8 @@ std::string read_data; while (read_data.size() < num_bytes_to_read) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(kData.size())); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(kData.size()); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -253,7 +252,7 @@ } net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::OK, callback.GetResult(result)); @@ -286,8 +285,8 @@ std::string read_data; while (read_data.size() < num_bytes_to_read) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(kData.size())); + auto io_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(kData.size()); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -305,7 +304,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::OK, callback.GetResult(result)); @@ -339,8 +338,7 @@ while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; int read_size = kData.size() - read_data.size(); - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(read_size)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -362,8 +360,7 @@ while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; int read_size = kData.size() - read_data.size(); - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(read_size)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -390,8 +387,7 @@ while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; int read_size = kData.size() - read_data.size(); - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(read_size)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -433,8 +429,7 @@ while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; int read_size = kData.size() - read_data.size(); - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(read_size)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -467,7 +462,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -483,7 +478,7 @@ // GetSizeCallback is invoked. TEST_F(ChunkedDataPipeUploadDataStreamTest, CloseBodyPipeBeforeSuccess2) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -510,7 +505,7 @@ EXPECT_FALSE(chunked_upload_stream_->IsEOF()); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::OK, callback.GetResult(result)); @@ -525,7 +520,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -536,7 +531,7 @@ TEST_F(ChunkedDataPipeUploadDataStreamTest, CloseBodyPipeBeforeTruncation2) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -556,7 +551,7 @@ std::move(get_size_callback_).Run(net::OK, 1); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::ERR_FAILED, callback.GetResult(result)); @@ -569,7 +564,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -580,7 +575,7 @@ TEST_F(ChunkedDataPipeUploadDataStreamTest, CloseBodyPipeBeforeFailure2) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -600,7 +595,7 @@ std::move(get_size_callback_).Run(net::ERR_ACCESS_DENIED, 0); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::ERR_ACCESS_DENIED, callback.GetResult(result)); @@ -614,7 +609,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -625,7 +620,7 @@ TEST_F(ChunkedDataPipeUploadDataStreamTest, CloseBodyPipeBeforeCloseGetter2) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -645,7 +640,7 @@ chunked_data_pipe_getter_.reset(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::ERR_FAILED, callback.GetResult(result)); @@ -660,8 +655,7 @@ std::string read_data; while (read_data.size() < kData.size()) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(kData.size())); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(kData.size()); int result = chunked_upload_stream_->Read( io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -672,7 +666,7 @@ } net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(result, net::ERR_IO_PENDING); @@ -689,7 +683,7 @@ // Read first byte. mojo::BlockingCopyFromString(kData.substr(0, 1), write_pipe_); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), io_buffer->size(), callback.callback()); result = callback.GetResult(result); @@ -737,7 +731,7 @@ base::RunLoop().RunUntilIdle(); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::ERR_FAILED, callback.GetResult(result)); @@ -746,7 +740,7 @@ TEST_F(ChunkedDataPipeUploadDataStreamTest, ClosePipeGetterWithoutCallingGetSizeCallbackPendingRead) { net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(1)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(1); int result = chunked_upload_stream_->Read(io_buffer.get(), 1, callback.callback()); EXPECT_EQ(net::ERR_IO_PENDING, result); @@ -762,8 +756,7 @@ const char kData[] = "1"; const int kDataLen = strlen(kData); net::TestCompletionCallback callback; - scoped_refptr<net::IOBufferWithSize> io_buffer( - new net::IOBufferWithSize(kDataLen)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(kDataLen); std::move(get_size_callback_).Run(net::OK, kDataLen); // Destroy the DataPipeGetter pipe, which is the pipe used for // GetSizeCallback.
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc index 25b615b7a..0bd18b7 100644 --- a/services/network/cors/cors_url_loader.cc +++ b/services/network/cors/cors_url_loader.cc
@@ -8,6 +8,7 @@ #include "net/base/load_flags.h" #include "services/network/cors/preflight_controller.h" #include "services/network/public/cpp/cors/cors.h" +#include "services/network/public/cpp/cors/origin_access_list.h" #include "url/url_util.h" namespace network { @@ -16,25 +17,6 @@ namespace { -// This should be identical to CalculateCORSFlag defined in -// //third_party/blink/renderer/platform/loader/cors/cors.cc. -bool CalculateCORSFlag(const ResourceRequest& request) { - if (request.fetch_request_mode == mojom::FetchRequestMode::kNavigate || - request.fetch_request_mode == mojom::FetchRequestMode::kNoCORS) { - return false; - } - // CORS needs a proper origin (including a unique opaque origin). If the - // request doesn't have one, CORS should not work. - DCHECK(request.request_initiator); - - if (request.url.SchemeIs(url::kDataScheme)) - return false; - - url::Origin url_origin = url::Origin::Create(request.url); - url::Origin security_origin(request.request_initiator.value()); - return !security_origin.IsSameOriginWith(url_origin); -} - base::Optional<std::string> GetHeaderString( const scoped_refptr<net::HttpResponseHeaders>& headers, const std::string& header_name) { @@ -85,7 +67,8 @@ mojom::URLLoaderClientPtr client, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojom::URLLoaderFactory* network_loader_factory, - const base::RepeatingCallback<void(int)>& request_finalizer) + const base::RepeatingCallback<void(int)>& request_finalizer, + const OriginAccessList* origin_access_list) : binding_(this, std::move(loader_request)), routing_id_(routing_id), request_id_(request_id), @@ -95,13 +78,14 @@ network_client_binding_(this), request_(resource_request), forwarding_client_(std::move(client)), - fetch_cors_flag_(CalculateCORSFlag(resource_request)), request_finalizer_(request_finalizer), traffic_annotation_(traffic_annotation), + origin_access_list_(origin_access_list), weak_factory_(this) { binding_.set_connection_error_handler(base::BindOnce( &CORSURLLoader::OnConnectionError, base::Unretained(this))); DCHECK(network_loader_factory_); + SetCORSFlagIfNeeded(); } CORSURLLoader::~CORSURLLoader() = default; @@ -148,8 +132,14 @@ request_.method = redirect_info_.new_method; request_.referrer = GURL(redirect_info_.new_referrer); request_.referrer_policy = redirect_info_.new_referrer_policy; + + // The request method can be changed to "GET". In this case we need to + // reset the request body manually. + if (request_.method == net::HttpRequestHeaders::kGetMethod) + request_.request_body = nullptr; + const bool original_fetch_cors_flag = fetch_cors_flag_; - fetch_cors_flag_ = fetch_cors_flag_ || CalculateCORSFlag(request_); + SetCORSFlagIfNeeded(); // We cannot use FollowRedirect for a request with preflight (i.e., when both // |fetch_cors_flag_| and |NeedsPreflight(request_)| are true). @@ -457,6 +447,38 @@ HandleComplete(URLLoaderCompletionStatus(net::ERR_FAILED)); } +// This should be identical to CalculateCORSFlag defined in +// //third_party/blink/renderer/platform/loader/cors/cors.cc. +void CORSURLLoader::SetCORSFlagIfNeeded() { + if (fetch_cors_flag_) + return; + + if (request_.fetch_request_mode == mojom::FetchRequestMode::kNavigate || + request_.fetch_request_mode == mojom::FetchRequestMode::kNoCORS) { + return; + } + + if (request_.url.SchemeIs(url::kDataScheme)) + return; + + // CORS needs a proper origin (including a unique opaque origin). If the + // request doesn't have one, CORS should not work. + DCHECK(request_.request_initiator); + + // The source origin and destination URL pair may be in the allow list. + if (origin_access_list_ && origin_access_list_->IsAllowed( + *request_.request_initiator, request_.url)) { + return; + } + + if (request_.request_initiator->IsSameOriginWith( + url::Origin::Create(request_.url))) { + return; + } + + fetch_cors_flag_ = true; +} + } // namespace cors } // namespace network
diff --git a/services/network/cors/cors_url_loader.h b/services/network/cors/cors_url_loader.h index 9714a34..3793bd08d 100644 --- a/services/network/cors/cors_url_loader.h +++ b/services/network/cors/cors_url_loader.h
@@ -19,6 +19,8 @@ namespace cors { +class OriginAccessList; + // Wrapper class that adds cross-origin resource sharing capabilities // (https://fetch.spec.whatwg.org/#http-cors-protocol), delegating requests as // well as potential preflight requests to the supplied @@ -43,7 +45,8 @@ mojom::URLLoaderClientPtr client, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojom::URLLoaderFactory* network_loader_factory, - const base::RepeatingCallback<void(int)>& request_finalizer); + const base::RepeatingCallback<void(int)>& request_finalizer, + const OriginAccessList* origin_access_list); ~CORSURLLoader() override; @@ -89,6 +92,8 @@ void OnConnectionError(); + void SetCORSFlagIfNeeded(); + mojo::Binding<mojom::URLLoader> binding_; // We need to save these for redirect. @@ -125,7 +130,7 @@ bool is_waiting_follow_redirect_call_ = false; // Corresponds to the Fetch spec, https://fetch.spec.whatwg.org/. - bool fetch_cors_flag_; + bool fetch_cors_flag_ = false; net::RedirectInfo redirect_info_; @@ -142,6 +147,9 @@ // We need to save this for redirect. net::MutableNetworkTrafficAnnotationTag traffic_annotation_; + // Outlives |this|. + const OriginAccessList* const origin_access_list_; + // Used to run asynchronous class instance bound callbacks safely. base::WeakPtrFactory<CORSURLLoader> weak_factory_;
diff --git a/services/network/cors/cors_url_loader_factory.cc b/services/network/cors/cors_url_loader_factory.cc index 47e0854..06c1780d 100644 --- a/services/network/cors/cors_url_loader_factory.cc +++ b/services/network/cors/cors_url_loader_factory.cc
@@ -23,14 +23,16 @@ NetworkContext* context, mojom::URLLoaderFactoryParamsPtr params, scoped_refptr<ResourceSchedulerClient> resource_scheduler_client, - mojom::URLLoaderFactoryRequest request) + mojom::URLLoaderFactoryRequest request, + const OriginAccessList* origin_access_list) : context_(context), disable_web_security_(params && params->disable_web_security), network_loader_factory_(std::make_unique<network::URLLoaderFactory>( context, std::move(params), std::move(resource_scheduler_client), - this)) { + this)), + origin_access_list_(origin_access_list) { DCHECK(context_); bindings_.AddBinding(this, std::move(request)); bindings_.set_connection_error_handler(base::BindRepeating( @@ -40,10 +42,12 @@ CORSURLLoaderFactory::CORSURLLoaderFactory( bool disable_web_security, std::unique_ptr<mojom::URLLoaderFactory> network_loader_factory, - const base::RepeatingCallback<void(int)>& preflight_finalizer) + const base::RepeatingCallback<void(int)>& preflight_finalizer, + const OriginAccessList* origin_access_list) : disable_web_security_(disable_web_security), network_loader_factory_(std::move(network_loader_factory)), - preflight_finalizer_(preflight_finalizer) {} + preflight_finalizer_(preflight_finalizer), + origin_access_list_(origin_access_list) {} CORSURLLoaderFactory::~CORSURLLoaderFactory() = default; @@ -80,7 +84,8 @@ base::BindOnce(&CORSURLLoaderFactory::DestroyURLLoader, base::Unretained(this)), resource_request, std::move(client), traffic_annotation, - network_loader_factory_.get(), preflight_finalizer_); + network_loader_factory_.get(), preflight_finalizer_, + origin_access_list_); auto* raw_loader = loader.get(); OnLoaderCreated(std::move(loader)); raw_loader->Start();
diff --git a/services/network/cors/cors_url_loader_factory.h b/services/network/cors/cors_url_loader_factory.h index 61db987..0e5d71d4 100644 --- a/services/network/cors/cors_url_loader_factory.h +++ b/services/network/cors/cors_url_loader_factory.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/strong_binding_set.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/cors/origin_access_list.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" @@ -31,18 +32,21 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) CORSURLLoaderFactory final : public mojom::URLLoaderFactory { public: + // |origin_access_list| should always outlive this factory instance. // Used by network::NetworkContext. CORSURLLoaderFactory( NetworkContext* context, mojom::URLLoaderFactoryParamsPtr params, scoped_refptr<ResourceSchedulerClient> resource_scheduler_client, - mojom::URLLoaderFactoryRequest request); + mojom::URLLoaderFactoryRequest request, + const OriginAccessList* origin_access_list); // Used by content::ResourceMessageFilter. // TODO(yhirano): Remove this once when the network service is fully enabled. CORSURLLoaderFactory( bool disable_web_security, std::unique_ptr<mojom::URLLoaderFactory> network_loader_factory, - const base::RepeatingCallback<void(int)>& preflight_finalizer); + const base::RepeatingCallback<void(int)>& preflight_finalizer, + const OriginAccessList* origin_access_list); ~CORSURLLoaderFactory() override; void OnLoaderCreated(std::unique_ptr<mojom::URLLoader> loader); @@ -83,6 +87,10 @@ // Used when constructed by ResourceMessageFilter. base::RepeatingCallback<void(int)> preflight_finalizer_; + // Accessed by instances in |loaders_| too. Since the factory outlives them, + // it's safe. + const OriginAccessList* const origin_access_list_; + DISALLOW_COPY_AND_ASSIGN(CORSURLLoaderFactory); };
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc index 16ef0cab..08fed01 100644 --- a/services/network/cors/cors_url_loader_unittest.cc +++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -121,7 +121,8 @@ std::make_unique<TestURLLoaderFactory>(); test_url_loader_factory_ = factory->GetWeakPtr(); cors_url_loader_factory_ = std::make_unique<CORSURLLoaderFactory>( - false, std::move(factory), base::RepeatingCallback<void(int)>()); + false, std::move(factory), base::RepeatingCallback<void(int)>(), + &origin_access_list_); } protected: @@ -214,6 +215,14 @@ test_cors_loader_client_.RunUntilRedirectReceived(); } + void AddAllowListEntryForOrigin(const url::Origin& source_origin, + const std::string& protocol, + const std::string& domain, + bool allow_subdomains) { + origin_access_list_.AddAllowListEntryForOrigin(source_origin, protocol, + domain, allow_subdomains); + } + static net::RedirectInfo CreateRedirectInfo( int status_code, base::StringPiece method, @@ -248,6 +257,9 @@ // TestURLLoaderClient that records callback activities. TestURLLoaderClient test_cors_loader_client_; + // Holds for allowed origin access lists. + OriginAccessList origin_access_list_; + DISALLOW_COPY_AND_ASSIGN(CORSURLLoaderTest); }; @@ -980,6 +992,32 @@ EXPECT_EQ(net::ERR_FAILED, client().completion_status().error_code); } +// Tests if OriginAccessList is actually used to decide the cors flag. +// Does not verify detailed functionalities that are verified in +// OriginAccessListTest. +TEST_F(CORSURLLoaderTest, OriginAccessList) { + const GURL origin("http://example.com"); + const GURL url("http://other.com/foo.png"); + + // Adds an entry to allow the cross origin request beyond the CORS + // rules. + AddAllowListEntryForOrigin(url::Origin::Create(origin), url.scheme(), + url.host(), false); + + CreateLoaderAndStart(origin, url, mojom::FetchRequestMode::kCORS); + + NotifyLoaderClientOnReceiveResponse(); + NotifyLoaderClientOnComplete(net::OK); + + RunUntilComplete(); + + EXPECT_TRUE(IsNetworkLoaderStarted()); + EXPECT_FALSE(client().has_received_redirect()); + EXPECT_TRUE(client().has_received_response()); + EXPECT_TRUE(client().has_received_completion()); + EXPECT_EQ(net::OK, client().completion_status().error_code); +} + } // namespace } // namespace cors
diff --git a/services/network/data_pipe_element_reader_unittest.cc b/services/network/data_pipe_element_reader_unittest.cc index eae5fc4..cc13e67b 100644 --- a/services/network/data_pipe_element_reader_unittest.cc +++ b/services/network/data_pipe_element_reader_unittest.cc
@@ -143,7 +143,7 @@ EXPECT_FALSE(element_reader_.IsInMemory()); // Try to read from the body. - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(10)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(10); net::TestCompletionCallback read_callback; EXPECT_EQ(net::ERR_IO_PENDING, element_reader_.Read(io_buffer.get(), io_buffer->size(), @@ -177,8 +177,7 @@ ASSERT_EQ(net::OK, first_init_callback.WaitForResult()); - scoped_refptr<net::IOBufferWithSize> first_io_buffer( - new net::IOBufferWithSize(10)); + auto first_io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(10); net::TestCompletionCallback first_read_callback; EXPECT_EQ(net::ERR_IO_PENDING, element_reader_.Read(first_io_buffer.get(), first_io_buffer->size(), @@ -209,7 +208,7 @@ EXPECT_FALSE(element_reader_.IsInMemory()); // Try to read from the body. - scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(10)); + auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(10); net::TestCompletionCallback second_read_callback; EXPECT_EQ(net::ERR_IO_PENDING, element_reader_.Read(io_buffer.get(), io_buffer->size(),
diff --git a/services/network/host_resolver.cc b/services/network/host_resolver.cc index ddc12783..e151eb13 100644 --- a/services/network/host_resolver.cc +++ b/services/network/host_resolver.cc
@@ -31,6 +31,8 @@ net::HostResolver::ResolveHostParameters parameters; parameters.dns_query_type = mojo_parameters->dns_query_type; parameters.initial_priority = mojo_parameters->initial_priority; + parameters.source = mojo_parameters->source; + parameters.allow_cached_response = mojo_parameters->allow_cached_response; parameters.include_canonical_name = mojo_parameters->include_canonical_name; parameters.loopback_only = mojo_parameters->loopback_only; parameters.is_speculative = mojo_parameters->is_speculative;
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc index 11f9965..5ea1358 100644 --- a/services/network/host_resolver_unittest.cc +++ b/services/network/host_resolver_unittest.cc
@@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "base/test/bind_test_util.h" #include "base/test/scoped_task_environment.h" +#include "base/test/simple_test_tick_clock.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "net/base/address_list.h" @@ -198,6 +199,260 @@ EXPECT_EQ(net::HIGHEST, inner_resolver->last_request_priority()); } +// Make requests specifying a source for host resolution and ensure the correct +// source is requested from the inner resolver. +TEST_F(HostResolverTest, Source) { + constexpr char kDomain[] = "example.com"; + constexpr char kAnyResult[] = "1.2.3.4"; + constexpr char kSystemResult[] = "127.0.0.1"; + constexpr char kDnsResult[] = "168.100.12.23"; + auto inner_resolver = std::make_unique<net::MockHostResolver>(); + inner_resolver->rules_map()[net::HostResolverSource::ANY]->AddRule( + kDomain, kAnyResult); + inner_resolver->rules_map()[net::HostResolverSource::SYSTEM]->AddRule( + kDomain, kSystemResult); + inner_resolver->rules_map()[net::HostResolverSource::DNS]->AddRule( + kDomain, kDnsResult); + + net::NetLog net_log; + HostResolver resolver(inner_resolver.get(), &net_log); + + base::RunLoop any_run_loop; + mojom::ResolveHostClientPtr any_client_ptr; + TestResolveHostClient any_client(&any_client_ptr, &any_run_loop); + mojom::ResolveHostParametersPtr any_parameters = + mojom::ResolveHostParameters::New(); + any_parameters->source = net::HostResolverSource::ANY; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(any_parameters), std::move(any_client_ptr)); + + base::RunLoop system_run_loop; + mojom::ResolveHostClientPtr system_client_ptr; + TestResolveHostClient system_client(&system_client_ptr, &system_run_loop); + mojom::ResolveHostParametersPtr system_parameters = + mojom::ResolveHostParameters::New(); + system_parameters->source = net::HostResolverSource::SYSTEM; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(system_parameters), + std::move(system_client_ptr)); + + base::RunLoop dns_run_loop; + mojom::ResolveHostClientPtr dns_client_ptr; + TestResolveHostClient dns_client(&dns_client_ptr, &dns_run_loop); + mojom::ResolveHostParametersPtr dns_parameters = + mojom::ResolveHostParameters::New(); + dns_parameters->source = net::HostResolverSource::DNS; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(dns_parameters), std::move(dns_client_ptr)); + + any_run_loop.Run(); + system_run_loop.Run(); + dns_run_loop.Run(); + + EXPECT_EQ(net::OK, any_client.result_error()); + EXPECT_THAT(any_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kAnyResult, 80))); + EXPECT_EQ(net::OK, system_client.result_error()); + EXPECT_THAT(system_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kSystemResult, 80))); + EXPECT_EQ(net::OK, dns_client.result_error()); + EXPECT_THAT(dns_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kDnsResult, 80))); +} + +// Test that cached results are properly keyed by requested source. +TEST_F(HostResolverTest, SeparateCacheBySource) { + constexpr char kDomain[] = "example.com"; + constexpr char kAnyResultOriginal[] = "1.2.3.4"; + constexpr char kSystemResultOriginal[] = "127.0.0.1"; + auto inner_resolver = std::make_unique<net::MockCachingHostResolver>(); + inner_resolver->rules_map()[net::HostResolverSource::ANY]->AddRule( + kDomain, kAnyResultOriginal); + inner_resolver->rules_map()[net::HostResolverSource::SYSTEM]->AddRule( + kDomain, kSystemResultOriginal); + base::SimpleTestTickClock test_clock; + inner_resolver->set_tick_clock(&test_clock); + + net::NetLog net_log; + HostResolver resolver(inner_resolver.get(), &net_log); + + // Load SYSTEM result into cache. + base::RunLoop system_run_loop; + mojom::ResolveHostClientPtr system_client_ptr; + TestResolveHostClient system_client(&system_client_ptr, &system_run_loop); + mojom::ResolveHostParametersPtr system_parameters = + mojom::ResolveHostParameters::New(); + system_parameters->source = net::HostResolverSource::SYSTEM; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(system_parameters), + std::move(system_client_ptr)); + system_run_loop.Run(); + ASSERT_EQ(net::OK, system_client.result_error()); + EXPECT_THAT( + system_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kSystemResultOriginal, 80))); + + // Change |inner_resolver| rules to ensure results are coming from cache or + // not based on whether they resolve to the old or new value. + constexpr char kAnyResultFresh[] = "111.222.1.1"; + constexpr char kSystemResultFresh[] = "111.222.1.2"; + inner_resolver->rules_map()[net::HostResolverSource::ANY]->ClearRules(); + inner_resolver->rules_map()[net::HostResolverSource::ANY]->AddRule( + kDomain, kAnyResultFresh); + inner_resolver->rules_map()[net::HostResolverSource::SYSTEM]->ClearRules(); + inner_resolver->rules_map()[net::HostResolverSource::SYSTEM]->AddRule( + kDomain, kSystemResultFresh); + + base::RunLoop cached_run_loop; + mojom::ResolveHostClientPtr cached_client_ptr; + TestResolveHostClient cached_client(&cached_client_ptr, &cached_run_loop); + mojom::ResolveHostParametersPtr cached_parameters = + mojom::ResolveHostParameters::New(); + cached_parameters->source = net::HostResolverSource::SYSTEM; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(cached_parameters), + std::move(cached_client_ptr)); + + base::RunLoop uncached_run_loop; + mojom::ResolveHostClientPtr uncached_client_ptr; + TestResolveHostClient uncached_client(&uncached_client_ptr, + &uncached_run_loop); + mojom::ResolveHostParametersPtr uncached_parameters = + mojom::ResolveHostParameters::New(); + uncached_parameters->source = net::HostResolverSource::ANY; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(uncached_parameters), + std::move(uncached_client_ptr)); + + cached_run_loop.Run(); + uncached_run_loop.Run(); + + EXPECT_EQ(net::OK, cached_client.result_error()); + EXPECT_THAT( + cached_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kSystemResultOriginal, 80))); + EXPECT_EQ(net::OK, uncached_client.result_error()); + EXPECT_THAT( + uncached_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kAnyResultFresh, 80))); +} + +TEST_F(HostResolverTest, CacheDisabled) { + constexpr char kDomain[] = "example.com"; + constexpr char kResultOriginal[] = "1.2.3.4"; + auto inner_resolver = std::make_unique<net::MockCachingHostResolver>(); + inner_resolver->rules()->AddRule(kDomain, kResultOriginal); + base::SimpleTestTickClock test_clock; + inner_resolver->set_tick_clock(&test_clock); + + net::NetLog net_log; + HostResolver resolver(inner_resolver.get(), &net_log); + + // Load result into cache. + base::RunLoop run_loop; + mojom::ResolveHostClientPtr client_ptr; + TestResolveHostClient client(&client_ptr, &run_loop); + resolver.ResolveHost(net::HostPortPair(kDomain, 80), nullptr, + std::move(client_ptr)); + run_loop.Run(); + ASSERT_EQ(net::OK, client.result_error()); + EXPECT_THAT( + client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kResultOriginal, 80))); + + // Change |inner_resolver| rules to ensure results are coming from cache or + // not based on whether they resolve to the old or new value. + constexpr char kResultFresh[] = "111.222.1.1"; + inner_resolver->rules()->ClearRules(); + inner_resolver->rules()->AddRule(kDomain, kResultFresh); + + base::RunLoop cached_run_loop; + mojom::ResolveHostClientPtr cached_client_ptr; + TestResolveHostClient cached_client(&cached_client_ptr, &cached_run_loop); + mojom::ResolveHostParametersPtr cached_parameters = + mojom::ResolveHostParameters::New(); + cached_parameters->allow_cached_response = true; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(cached_parameters), + std::move(cached_client_ptr)); + cached_run_loop.Run(); + + EXPECT_EQ(net::OK, cached_client.result_error()); + EXPECT_THAT( + cached_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kResultOriginal, 80))); + + base::RunLoop uncached_run_loop; + mojom::ResolveHostClientPtr uncached_client_ptr; + TestResolveHostClient uncached_client(&uncached_client_ptr, + &uncached_run_loop); + mojom::ResolveHostParametersPtr uncached_parameters = + mojom::ResolveHostParameters::New(); + uncached_parameters->allow_cached_response = false; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(uncached_parameters), + std::move(uncached_client_ptr)); + uncached_run_loop.Run(); + + EXPECT_EQ(net::OK, uncached_client.result_error()); + EXPECT_THAT(uncached_client.result_addresses().value().endpoints(), + testing::ElementsAre(CreateExpectedEndPoint(kResultFresh, 80))); +} + +// Test for a resolve with a result only in the cache and error if the cache is +// disabled. +TEST_F(HostResolverTest, CacheDisabled_ErrorResults) { + constexpr char kDomain[] = "example.com"; + constexpr char kResult[] = "1.2.3.4"; + auto inner_resolver = std::make_unique<net::MockCachingHostResolver>(); + inner_resolver->rules()->AddRule(kDomain, kResult); + base::SimpleTestTickClock test_clock; + inner_resolver->set_tick_clock(&test_clock); + + net::NetLog net_log; + HostResolver resolver(inner_resolver.get(), &net_log); + + // Load initial result into cache. + base::RunLoop run_loop; + mojom::ResolveHostClientPtr client_ptr; + TestResolveHostClient client(&client_ptr, &run_loop); + resolver.ResolveHost(net::HostPortPair(kDomain, 80), nullptr, + std::move(client_ptr)); + run_loop.Run(); + ASSERT_EQ(net::OK, client.result_error()); + + // Change |inner_resolver| rules to an error. + inner_resolver->rules()->ClearRules(); + inner_resolver->rules()->AddSimulatedFailure(kDomain); + + // Resolves for |kFreshErrorDomain| should result in error only when cache is + // disabled because success was cached. + base::RunLoop cached_run_loop; + mojom::ResolveHostClientPtr cached_client_ptr; + TestResolveHostClient cached_client(&cached_client_ptr, &cached_run_loop); + mojom::ResolveHostParametersPtr cached_parameters = + mojom::ResolveHostParameters::New(); + cached_parameters->allow_cached_response = true; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(cached_parameters), + std::move(cached_client_ptr)); + cached_run_loop.Run(); + EXPECT_EQ(net::OK, cached_client.result_error()); + + base::RunLoop uncached_run_loop; + mojom::ResolveHostClientPtr uncached_client_ptr; + TestResolveHostClient uncached_client(&uncached_client_ptr, + &uncached_run_loop); + mojom::ResolveHostParametersPtr uncached_parameters = + mojom::ResolveHostParameters::New(); + uncached_parameters->allow_cached_response = false; + resolver.ResolveHost(net::HostPortPair(kDomain, 80), + std::move(uncached_parameters), + std::move(uncached_client_ptr)); + uncached_run_loop.Run(); + EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, uncached_client.result_error()); +} + TEST_F(HostResolverTest, IncludeCanonicalName) { auto inner_resolver = std::make_unique<net::MockHostResolver>(); inner_resolver->rules()->AddRuleWithFlags("example.com", "123.0.12.24",
diff --git a/services/network/mojo_net_log.cc b/services/network/mojo_net_log.cc index 42f6962..736bf3a 100644 --- a/services/network/mojo_net_log.cc +++ b/services/network/mojo_net_log.cc
@@ -28,6 +28,7 @@ if (file_net_log_observer_) { file_net_log_observer_->StopObserving(nullptr /*polled_data*/, base::OnceClosure()); + file_net_log_observer_.reset(); } }
diff --git a/services/network/mojo_net_log.h b/services/network/mojo_net_log.h index 2753457..66a63ca 100644 --- a/services/network/mojo_net_log.h +++ b/services/network/mojo_net_log.h
@@ -30,6 +30,7 @@ ~MojoNetLog() override; // Finalizes the logfile created by any call to ObserveFileWithConstants(). + // It is safe to call this multiple times. void ShutDown(); // If specified by the command line, stream network events (NetLog) to a
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 21efb1e..0b2e66f9 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -521,7 +521,7 @@ scoped_refptr<ResourceSchedulerClient> resource_scheduler_client) { url_loader_factories_.emplace(std::make_unique<cors::CORSURLLoaderFactory>( this, std::move(params), std::move(resource_scheduler_client), - std::move(request))); + std::move(request), nullptr)); } void NetworkContext::CreateURLLoaderFactory( @@ -817,6 +817,17 @@ std::move(request), std::move(observer), std::move(callback)); } +void NetworkContext::CreateTCPBoundSocket( + const net::IPEndPoint& local_addr, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPBoundSocketRequest request, + CreateTCPBoundSocketCallback callback) { + socket_factory_->CreateTCPBoundSocket( + local_addr, + static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), + std::move(request), std::move(callback)); +} + void NetworkContext::CreateProxyResolvingSocketFactory( mojom::ProxyResolvingSocketFactoryRequest request) { proxy_resolving_socket_factories_.AddBinding(
diff --git a/services/network/network_context.h b/services/network/network_context.h index bc55508..2b688ab 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -198,6 +198,11 @@ mojom::TCPConnectedSocketRequest request, mojom::SocketObserverPtr observer, CreateTCPConnectedSocketCallback callback) override; + void CreateTCPBoundSocket( + const net::IPEndPoint& local_addr, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPBoundSocketRequest request, + CreateTCPBoundSocketCallback callback) override; void CreateProxyResolvingSocketFactory( mojom::ProxyResolvingSocketFactoryRequest request) override; void CreateWebSocket(mojom::WebSocketRequest request,
diff --git a/services/network/p2p/socket.cc b/services/network/p2p/socket.cc index 73b1002..8c65a4d 100644 --- a/services/network/p2p/socket.cc +++ b/services/network/p2p/socket.cc
@@ -9,13 +9,10 @@ #include "net/base/net_errors.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" -#include "services/network/p2p/socket_manager.h" #include "services/network/p2p/socket_tcp.h" #include "services/network/p2p/socket_tcp_server.h" #include "services/network/p2p/socket_udp.h" #include "services/network/proxy_resolving_client_socket_factory.h" -#include "third_party/webrtc/media/base/rtputils.h" -#include "third_party/webrtc/media/base/turnutils.h" namespace { @@ -33,22 +30,6 @@ }; const uint32_t kStunMagicCookie = 0x2112A442; -const size_t kMinRtcpHeaderLength = 8; -const size_t kDtlsRecordHeaderLength = 13; - -bool IsDtlsPacket(const int8_t* data, size_t length) { - const uint8_t* u = reinterpret_cast<const uint8_t*>(data); - return (length >= kDtlsRecordHeaderLength && (u[0] > 19 && u[0] < 64)); -} - -bool IsRtcpPacket(const int8_t* data, size_t length) { - if (length < kMinRtcpHeaderLength) { - return false; - } - - int type = (static_cast<uint8_t>(data[1]) & 0x7F); - return (type >= 64 && type < 96); -} // Map the network error to SocketErrorCode for the UMA histogram. // static @@ -79,16 +60,14 @@ namespace network { -P2PSocket::P2PSocket(P2PSocketManager* socket_manager, +P2PSocket::P2PSocket(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, ProtocolType protocol_type) - : socket_manager_(socket_manager), + : delegate_(delegate), client_(std::move(client)), binding_(this, std::move(socket)), state_(STATE_UNINITIALIZED), - dump_incoming_rtp_packet_(false), - dump_outgoing_rtp_packet_(false), protocol_type_(protocol_type), send_packets_delayed_total_(0), send_packets_total_(0), @@ -96,7 +75,7 @@ send_bytes_delayed_cur_(0), weak_ptr_factory_(this) { binding_.set_connection_error_handler( - base::BindOnce(&P2PSocket::OnConnectionError, base::Unretained(this))); + base::BindOnce(&P2PSocket::OnError, base::Unretained(this))); } P2PSocket::~P2PSocket() { @@ -122,7 +101,7 @@ // Verifies that the packet |data| has a valid STUN header. // static -bool P2PSocket::GetStunPacketType(const int8_t* data, +bool P2PSocket::GetStunPacketType(const uint8_t* data, int data_size, StunMessageType* type) { if (data_size < kStunHeaderSize) { @@ -182,7 +161,7 @@ // static P2PSocket* P2PSocket::Create( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, @@ -191,28 +170,27 @@ P2PMessageThrottler* throttler) { switch (type) { case P2P_SOCKET_UDP: - return new P2PSocketUdp(socket_manager, std::move(client), - std::move(socket), throttler, net_log); + return new P2PSocketUdp(delegate, std::move(client), std::move(socket), + throttler, net_log); case P2P_SOCKET_TCP_SERVER: - return new P2PSocketTcpServer(socket_manager, std::move(client), + return new P2PSocketTcpServer(delegate, std::move(client), std::move(socket), P2P_SOCKET_TCP_CLIENT); case P2P_SOCKET_STUN_TCP_SERVER: - return new P2PSocketTcpServer(socket_manager, std::move(client), + return new P2PSocketTcpServer(delegate, std::move(client), std::move(socket), P2P_SOCKET_STUN_TCP_CLIENT); case P2P_SOCKET_TCP_CLIENT: case P2P_SOCKET_SSLTCP_CLIENT: case P2P_SOCKET_TLS_CLIENT: - return new P2PSocketTcp(socket_manager, std::move(client), - std::move(socket), type, - proxy_resolving_socket_factory); + return new P2PSocketTcp(delegate, std::move(client), std::move(socket), + type, proxy_resolving_socket_factory); case P2P_SOCKET_STUN_TCP_CLIENT: case P2P_SOCKET_STUN_SSLTCP_CLIENT: case P2P_SOCKET_STUN_TLS_CLIENT: - return new P2PSocketStunTcp(socket_manager, std::move(client), + return new P2PSocketStunTcp(delegate, std::move(client), std::move(socket), type, proxy_resolving_socket_factory); } @@ -221,30 +199,6 @@ return nullptr; } -void P2PSocket::StartRtpDump(bool incoming, bool outgoing) { - DCHECK(incoming || outgoing); - - if (incoming) { - dump_incoming_rtp_packet_ = true; - } - - if (outgoing) { - dump_outgoing_rtp_packet_ = true; - } -} - -void P2PSocket::StopRtpDump(bool incoming, bool outgoing) { - DCHECK(incoming || outgoing); - - if (incoming) { - dump_incoming_rtp_packet_ = false; - } - - if (outgoing) { - dump_outgoing_rtp_packet_ = false; - } -} - mojom::P2PSocketClientPtr P2PSocket::ReleaseClientForTesting() { return std::move(client_); } @@ -253,36 +207,6 @@ return binding_.Unbind(); } -void P2PSocket::DumpRtpPacket(const int8_t* packet, - size_t length, - bool incoming) { - if (!socket_manager_ || IsDtlsPacket(packet, length) || - IsRtcpPacket(packet, length)) { - return; - } - - size_t rtp_packet_pos = 0; - size_t rtp_packet_length = length; - if (!cricket::UnwrapTurnPacket(reinterpret_cast<const uint8_t*>(packet), - length, &rtp_packet_pos, &rtp_packet_length)) { - return; - } - - packet += rtp_packet_pos; - - size_t header_length = 0; - bool valid = - cricket::ValidateRtpHeader(reinterpret_cast<const uint8_t*>(packet), - rtp_packet_length, &header_length); - if (!valid) { - NOTREACHED(); - return; - } - - socket_manager_->DumpPacket(packet, header_length, rtp_packet_length, - incoming); -} - void P2PSocket::IncrementDelayedPackets() { send_packets_delayed_total_++; } @@ -303,9 +227,10 @@ DCHECK_GE(send_bytes_delayed_cur_, 0); } -void P2PSocket::OnConnectionError() { - if (socket_manager_) - socket_manager_->DestroySocket(this); +void P2PSocket::OnError() { + binding_.Close(); + client_.reset(); + delegate_->DestroySocket(this); } } // namespace network
diff --git a/services/network/p2p/socket.h b/services/network/p2p/socket.h index 0a480d6..f6c42681 100644 --- a/services/network/p2p/socket.h +++ b/services/network/p2p/socket.h
@@ -9,7 +9,9 @@ #include <stdint.h> #include <memory> + #include "base/component_export.h" +#include "base/containers/span.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/binding.h" @@ -24,18 +26,38 @@ } namespace network { + class ProxyResolvingClientSocketFactory; -class P2PSocketManager; class P2PMessageThrottler; // Base class for P2P sockets. class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocket : public mojom::P2PSocket { public: + // Interface implemented in P2PSocketManager. + class Delegate { + public: + Delegate() = default; + + // Destroys |socket| and removes it from the list of sockets. + virtual void DestroySocket(P2PSocket* socket) = 0; + + // Called by P2PSocketTcpServer after a new socket is created for an + // incoming connection. + virtual void AddAcceptedConnection(std::unique_ptr<P2PSocket> socket) = 0; + + // Called for each incoming/outgoing packet. + virtual void DumpPacket(base::span<const uint8_t> data, bool incoming) = 0; + + protected: + virtual ~Delegate() = default; + }; + static const int kStunHeaderSize = 20; static const size_t kMaximumPacketSize = 32768; + // Creates P2PSocket of the specific type. static P2PSocket* Create( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, @@ -45,7 +67,7 @@ ~P2PSocket() override; - // Initalizes the socket. Returns false when initialization fails. + // Initializes the socket. Returns false when initialization fails. // |min_port| and |max_port| specify the valid range of allowed ports. // |min_port| must be less than or equal to |max_port|. // If |min_port| is zero, |max_port| must also be zero and it means all ports @@ -54,14 +76,11 @@ // in the valid range. // If |local_address.port()| is nonzero and not in the valid range, // initialization will fail. - virtual bool Init(const net::IPEndPoint& local_address, + virtual void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) = 0; - void StartRtpDump(bool incoming, bool outgoing); - void StopRtpDump(bool incoming, bool outgoing); - mojom::P2PSocketClientPtr ReleaseClientForTesting(); mojom::P2PSocketRequest ReleaseBindingForTesting(); @@ -101,25 +120,26 @@ STATE_UNINITIALIZED, STATE_CONNECTING, STATE_OPEN, - STATE_ERROR, }; - P2PSocket(P2PSocketManager* socket_manager, + P2PSocket(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, ProtocolType protocol_type); // Verifies that the packet |data| has a valid STUN header. In case // of success stores type of the message in |type|. - static bool GetStunPacketType(const int8_t* data, + static bool GetStunPacketType(const uint8_t* data, int data_size, StunMessageType* type); static bool IsRequestOrResponse(StunMessageType type); static void ReportSocketError(int result, const char* histogram_name); - // Calls |socket_manager_| to record the RTP header. - void DumpRtpPacket(const int8_t* packet, size_t length, bool incoming); + // Should be called by subclasses on protocol errors. Closes P2PSocket and + // P2PSocketClient channels and calls delegate_->DestroySocket() to + // destroy the socket. + void OnError(); // Used by subclasses to track the metrics of delayed bytes and packets. void IncrementDelayedPackets(); @@ -127,17 +147,14 @@ void IncrementDelayedBytes(uint32_t size); void DecrementDelayedBytes(uint32_t size); - P2PSocketManager* socket_manager_; + Delegate* delegate_; mojom::P2PSocketClientPtr client_; mojo::Binding<mojom::P2PSocket> binding_; State state_; - bool dump_incoming_rtp_packet_; - bool dump_outgoing_rtp_packet_; ProtocolType protocol_type_; private: - void OnConnectionError(); // Track total delayed packets for calculating how many packets are // delayed by system at the end of call. uint32_t send_packets_delayed_total_;
diff --git a/services/network/p2p/socket_manager.cc b/services/network/p2p/socket_manager.cc index bde4835f..9c16446 100644 --- a/services/network/p2p/socket_manager.cc +++ b/services/network/p2p/socket_manager.cc
@@ -26,6 +26,8 @@ #include "services/network/p2p/socket.h" #include "services/network/proxy_resolving_client_socket_factory.h" #include "services/network/public/cpp/p2p_param_traits.h" +#include "third_party/webrtc/media/base/rtputils.h" +#include "third_party/webrtc/media/base/turnutils.h" namespace network { @@ -43,6 +45,22 @@ // Trouble has been seen on Linux at 3479 sockets in test, so leave a margin. const int kMaxSimultaneousSockets = 3000; +const size_t kMinRtcpHeaderLength = 8; +const size_t kDtlsRecordHeaderLength = 13; + +bool IsDtlsPacket(base::span<const uint8_t> data) { + return data.size() >= kDtlsRecordHeaderLength && + (data[0] > 19 && data[0] < 64); +} + +bool IsRtcpPacket(base::span<const uint8_t> data) { + if (data.size() < kMinRtcpHeaderLength) + return false; + + int type = data[1] & 0x7F; + return type >= 64 && type < 96; +} + } // namespace class P2PSocketManager::DnsRequest { @@ -165,13 +183,36 @@ sockets_.erase(iter); } -void P2PSocketManager::DumpPacket(const int8_t* packet_header, - size_t header_length, - size_t packet_length, +void P2PSocketManager::DumpPacket(base::span<const uint8_t> packet, bool incoming) { - std::vector<uint8_t> header_buffer(header_length); - memcpy(&header_buffer[0], packet_header, header_length); - trusted_socket_manager_client_->DumpPacket(header_buffer, packet_length, + if ((incoming && !dump_incoming_rtp_packet_) || + (!incoming && !dump_outgoing_rtp_packet_)) { + return; + } + + if (IsDtlsPacket(packet) || IsRtcpPacket(packet)) + return; + + size_t rtp_packet_pos = 0; + size_t rtp_packet_size = packet.size(); + if (!cricket::UnwrapTurnPacket(packet.data(), packet.size(), &rtp_packet_pos, + &rtp_packet_size)) { + return; + } + + auto rtp_packet = packet.subspan(rtp_packet_pos, rtp_packet_size); + + size_t header_size = 0; + bool valid = cricket::ValidateRtpHeader(rtp_packet.data(), rtp_packet.size(), + &header_size); + if (!valid) { + NOTREACHED(); + return; + } + + std::vector<uint8_t> header_buffer(rtp_packet.data(), + rtp_packet.data() + header_size); + trusted_socket_manager_client_->DumpPacket(header_buffer, rtp_packet.size(), incoming); } @@ -257,42 +298,23 @@ if (!socket) return; - if (socket->Init(local_address, port_range.min_port, port_range.max_port, - remote_address)) { - if (dump_incoming_rtp_packet_ || dump_outgoing_rtp_packet_) { - socket->StartRtpDump(dump_incoming_rtp_packet_, - dump_outgoing_rtp_packet_); - } - sockets_[socket.get()] = std::move(socket); - } + P2PSocket* socket_ptr = socket.get(); + sockets_[socket_ptr] = std::move(socket); + + // Init() may call SocketManager::DestroySocket(), so it must be called after + // adding the socket to |sockets_|. + socket_ptr->Init(local_address, port_range.min_port, port_range.max_port, + remote_address); } void P2PSocketManager::StartRtpDump(bool incoming, bool outgoing) { - if ((!dump_incoming_rtp_packet_ && incoming) || - (!dump_outgoing_rtp_packet_ && outgoing)) { - if (incoming) - dump_incoming_rtp_packet_ = true; - - if (outgoing) - dump_outgoing_rtp_packet_ = true; - - for (auto& it : sockets_) - it.first->StartRtpDump(incoming, outgoing); - } + dump_incoming_rtp_packet_ |= incoming; + dump_outgoing_rtp_packet_ |= outgoing; } void P2PSocketManager::StopRtpDump(bool incoming, bool outgoing) { - if ((dump_incoming_rtp_packet_ && incoming) || - (dump_outgoing_rtp_packet_ && outgoing)) { - if (incoming) - dump_incoming_rtp_packet_ = false; - - if (outgoing) - dump_outgoing_rtp_packet_ = false; - - for (auto& it : sockets_) - it.first->StopRtpDump(incoming, outgoing); - } + dump_incoming_rtp_packet_ &= !incoming; + dump_outgoing_rtp_packet_ &= !outgoing; } void P2PSocketManager::NetworkNotificationClientConnectionError() {
diff --git a/services/network/p2p/socket_manager.h b/services/network/p2p/socket_manager.h index e7f30427..9ed8bd1 100644 --- a/services/network/p2p/socket_manager.h +++ b/services/network/p2p/socket_manager.h
@@ -22,6 +22,7 @@ #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/base/network_change_notifier.h" +#include "services/network/p2p/socket.h" #include "services/network/p2p/socket_throttler.h" #include "services/network/public/cpp/p2p_socket_type.h" #include "services/network/public/mojom/p2p.mojom.h" @@ -37,14 +38,14 @@ namespace network { -class P2PSocket; // Owns all the P2P socket instances and dispatches Mojo calls from the // (untrusted) child and (trusted) browser process. class P2PSocketManager : public net::NetworkChangeNotifier::NetworkChangeObserver, public mojom::P2PSocketManager, - public mojom::P2PTrustedSocketManager { + public mojom::P2PTrustedSocketManager, + public P2PSocket::Delegate { public: using DeleteCallback = base::OnceCallback<void(P2PSocketManager* socket_manager)>; @@ -64,20 +65,6 @@ void OnNetworkChanged( net::NetworkChangeNotifier::ConnectionType type) override; - // The following methods are called by the socket implementations. - - // Called when a new socket is created due to an incoming connection. - void AddAcceptedConnection(std::unique_ptr<P2PSocket> accepted_connection); - - // Tells the SocketManager to destroy the given socket. - void DestroySocket(P2PSocket* socket); - - // Called when packet logging is enabled. - void DumpPacket(const int8_t* packet_header, - size_t header_length, - size_t packet_length, - bool incoming); - private: class DnsRequest; @@ -88,6 +75,12 @@ const net::IPAddress& default_ipv4_local_address, const net::IPAddress& default_ipv6_local_address); + // P2PSocket::Delegate. + void AddAcceptedConnection( + std::unique_ptr<P2PSocket> accepted_connection) override; + void DestroySocket(P2PSocket* socket) override; + void DumpPacket(base::span<const uint8_t> data, bool incoming) override; + // mojom::P2PSocketManager overrides: void StartNetworkNotifications( mojom::P2PNetworkNotificationClientPtr client) override;
diff --git a/services/network/p2p/socket_tcp.cc b/services/network/p2p/socket_tcp.cc index aa2991d..d1fc56a 100644 --- a/services/network/p2p/socket_tcp.cc +++ b/services/network/p2p/socket_tcp.cc
@@ -7,8 +7,6 @@ #include <stddef.h> #include <utility> -#include "base/location.h" -#include "base/single_thread_task_runner.h" #include "base/sys_byteorder.h" #include "base/threading/thread_task_runner_handle.h" #include "jingle/glue/fake_ssl_client_socket.h" @@ -18,7 +16,6 @@ #include "net/socket/client_socket_handle.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/tcp_client_socket.h" -#include "services/network/p2p/socket_manager.h" #include "services/network/proxy_resolving_client_socket.h" #include "services/network/proxy_resolving_client_socket_factory.h" #include "services/network/public/cpp/p2p_param_traits.h" @@ -59,15 +56,12 @@ P2PSocketTcp::SendBuffer::~SendBuffer() {} P2PSocketTcpBase::P2PSocketTcpBase( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory) - : P2PSocket(socket_manager, - std::move(client), - std::move(socket), - P2PSocket::TCP), + : P2PSocket(delegate, std::move(client), std::move(socket), P2PSocket::TCP), write_pending_(false), connected_(false), type_(type), @@ -80,7 +74,7 @@ } } -bool P2PSocketTcpBase::InitAccepted(const net::IPEndPoint& remote_address, +void P2PSocketTcpBase::InitAccepted(const net::IPEndPoint& remote_address, std::unique_ptr<net::StreamSocket> socket) { DCHECK(socket); DCHECK_EQ(state_, STATE_UNINITIALIZED); @@ -90,10 +84,9 @@ socket_ = std::move(socket); state_ = STATE_OPEN; DoRead(); - return state_ != STATE_ERROR; } -bool P2PSocketTcpBase::Init(const net::IPEndPoint& local_address, +void P2PSocketTcpBase::Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) { @@ -131,29 +124,8 @@ int status = socket_->Connect( base::BindOnce(&P2PSocketTcpBase::OnConnected, base::Unretained(this))); - if (status != net::ERR_IO_PENDING) { - // We defer execution of ProcessConnectDone instead of calling it - // directly here as the caller may not expect an error/close to - // happen here. This is okay, as from the caller's point of view, - // the connect always happens asynchronously. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&P2PSocketTcpBase::OnConnected, - base::Unretained(this), status)); - } - - return state_ != STATE_ERROR; -} - -void P2PSocketTcpBase::OnError() { - socket_.reset(); - - if (state_ == STATE_UNINITIALIZED || state_ == STATE_CONNECTING || - state_ == STATE_OPEN) { - binding_.Close(); - client_.reset(); - } - - state_ = STATE_ERROR; + if (status != net::ERR_IO_PENDING) + OnConnected(status); } void P2PSocketTcpBase::OnConnected(int result) { @@ -237,7 +209,7 @@ int result; do { if (!read_buffer_.get()) { - read_buffer_ = new net::GrowableIOBuffer(); + read_buffer_ = base::MakeRefCounted<net::GrowableIOBuffer>(); read_buffer_->SetCapacity(kTcpReadBufferSize); } else if (read_buffer_->RemainingCapacity() < kTcpReadBufferSize) { // Make sure that we always have at least kTcpReadBufferSize of @@ -261,10 +233,11 @@ } } -void P2PSocketTcpBase::OnPacket(const std::vector<int8_t>& data) { +void P2PSocketTcpBase::OnPacket(std::vector<int8_t> data) { if (!connected_) { P2PSocket::StunMessageType type; - bool stun = GetStunPacketType(&*data.begin(), data.size(), &type); + bool stun = GetStunPacketType(reinterpret_cast<uint8_t*>(&*data.begin()), + data.size(), &type); if (stun && IsRequestOrResponse(type)) { connected_ = true; } else if (!stun || type == STUN_DATA_INDICATION) { @@ -280,8 +253,9 @@ client_->DataReceived(remote_address_.ip_address, data, base::TimeTicks::Now()); - if (dump_incoming_rtp_packet_) - DumpRtpPacket(&data[0], data.size(), true); + delegate_->DumpPacket( + base::make_span(reinterpret_cast<const uint8_t*>(&data[0]), data.size()), + true); } void P2PSocketTcpBase::WriteOrQueue(SendBuffer& send_buffer) { @@ -377,26 +351,10 @@ } } -void P2PSocketTcpBase::AcceptIncomingTcpConnection( - const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest socket) { - NOTREACHED(); - OnError(); -} - void P2PSocketTcpBase::Send( const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { - // Note: dscp is not actually used on TCP sockets as this point, - // but may be honored in the future. - if (!socket_) { - // The Send message may be sent after the an OnError message was - // sent by hasn't been processed the renderer. - return; - } - // Renderer should use this socket only to send data to |remote_address_|. if (data.size() > kMaximumPacketSize || !(packet_info.destination == remote_address_.ip_address)) { @@ -407,7 +365,8 @@ if (!connected_) { P2PSocket::StunMessageType type = P2PSocket::StunMessageType(); - bool stun = GetStunPacketType(&*data.begin(), data.size(), &type); + bool stun = GetStunPacketType( + reinterpret_cast<const uint8_t*>(&*data.begin()), data.size(), &type); if (!stun || type == STUN_DATA_INDICATION) { LOG(ERROR) << "Page tried to send a data packet to " << packet_info.destination.ToString() @@ -422,11 +381,6 @@ } void P2PSocketTcpBase::SetOption(P2PSocketOption option, int32_t value) { - if (state_ != STATE_OPEN) { - DCHECK_EQ(state_, STATE_ERROR); - return; - } - switch (option) { case P2P_SOCKET_OPT_RCVBUF: socket_->SetReceiveBufferSize(value); @@ -443,12 +397,12 @@ } P2PSocketTcp::P2PSocketTcp( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory) - : P2PSocketTcpBase(socket_manager, + : P2PSocketTcpBase(delegate, std::move(client), std::move(socket), type, @@ -468,8 +422,7 @@ int consumed = kPacketHeaderSize; char* cur = input + consumed; - std::vector<int8_t> data(cur, cur + packet_size); - OnPacket(data); + OnPacket(std::vector<int8_t>(cur, cur + packet_size)); consumed += packet_size; return consumed; } @@ -500,12 +453,12 @@ // P2PSocketStunTcp P2PSocketStunTcp::P2PSocketStunTcp( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory) - : P2PSocketTcpBase(socket_manager, + : P2PSocketTcpBase(delegate, std::move(client), std::move(socket), type, @@ -523,7 +476,7 @@ int pad_bytes; int packet_size = GetExpectedPacketSize( - reinterpret_cast<const int8_t*>(input), input_len, &pad_bytes); + reinterpret_cast<const uint8_t*>(input), input_len, &pad_bytes); if (input_len < packet_size + pad_bytes) return 0; @@ -531,8 +484,7 @@ // We have a complete packet. Read through it. int consumed = 0; char* cur = input; - std::vector<int8_t> data(cur, cur + packet_size); - OnPacket(data); + OnPacket(std::vector<int8_t>(cur, cur + packet_size)); consumed += packet_size; consumed += pad_bytes; return consumed; @@ -552,8 +504,8 @@ } int pad_bytes; - size_t expected_len = - GetExpectedPacketSize(&data[0], data.size(), &pad_bytes); + size_t expected_len = GetExpectedPacketSize( + reinterpret_cast<const uint8_t*>(&data[0]), data.size(), &pad_bytes); // Accepts only complete STUN/TURN packets. if (data.size() != expected_len) { @@ -583,12 +535,13 @@ } WriteOrQueue(send_buffer); - if (dump_outgoing_rtp_packet_) - DumpRtpPacket(reinterpret_cast<const int8_t*>(send_buffer.buffer->data()), - data.size(), false); + delegate_->DumpPacket( + base::make_span(reinterpret_cast<uint8_t*>(send_buffer.buffer->data()), + data.size()), + false); } -int P2PSocketStunTcp::GetExpectedPacketSize(const int8_t* data, +int P2PSocketStunTcp::GetExpectedPacketSize(const uint8_t* data, int len, int* pad_bytes) { DCHECK_LE(kTurnChannelDataHeaderSize, len);
diff --git a/services/network/p2p/socket_tcp.h b/services/network/p2p/socket_tcp.h index 6087f33..5e847fc 100644 --- a/services/network/p2p/socket_tcp.h +++ b/services/network/p2p/socket_tcp.h
@@ -32,26 +32,23 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpBase : public P2PSocket { public: P2PSocketTcpBase( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory); ~P2PSocketTcpBase() override; - bool InitAccepted(const net::IPEndPoint& remote_address, + void InitAccepted(const net::IPEndPoint& remote_address, std::unique_ptr<net::StreamSocket> socket); // P2PSocket overrides. - bool Init(const net::IPEndPoint& local_address, + void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) override; // mojom::P2PSocket implementation: - void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest socket) override; void Send(const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) @@ -81,8 +78,7 @@ const net::NetworkTrafficAnnotationTag traffic_annotation) = 0; void WriteOrQueue(SendBuffer& send_buffer); - void OnPacket(const std::vector<int8_t>& data); - void OnError(); + void OnPacket(std::vector<int8_t> data); private: friend class P2PSocketTcpTestBase; @@ -122,7 +118,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcp : public P2PSocketTcpBase { public: P2PSocketTcp( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, @@ -150,7 +146,7 @@ : public P2PSocketTcpBase { public: P2PSocketStunTcp( - P2PSocketManager* socket_manager, + Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType type, @@ -167,7 +163,7 @@ const net::NetworkTrafficAnnotationTag traffic_annotation) override; private: - int GetExpectedPacketSize(const int8_t* data, int len, int* pad_bytes); + int GetExpectedPacketSize(const uint8_t* data, int len, int* pad_bytes); DISALLOW_COPY_AND_ASSIGN(P2PSocketStunTcp); };
diff --git a/services/network/p2p/socket_tcp_server.cc b/services/network/p2p/socket_tcp_server.cc index a43580c..3f9ec135 100644 --- a/services/network/p2p/socket_tcp_server.cc +++ b/services/network/p2p/socket_tcp_server.cc
@@ -22,14 +22,11 @@ namespace network { -P2PSocketTcpServer::P2PSocketTcpServer(P2PSocketManager* socket_manager, +P2PSocketTcpServer::P2PSocketTcpServer(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType client_type) - : P2PSocket(socket_manager, - std::move(client), - std::move(socket), - P2PSocket::TCP), + : P2PSocket(delegate, std::move(client), std::move(socket), P2PSocket::TCP), client_type_(client_type), socket_(new net::TCPServerSocket(nullptr, net::NetLogSource())), accept_callback_(base::BindRepeating(&P2PSocketTcpServer::OnAccepted, @@ -43,7 +40,7 @@ } // TODO(guidou): Add support for port range. -bool P2PSocketTcpServer::Init(const net::IPEndPoint& local_address, +void P2PSocketTcpServer::Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) { @@ -53,7 +50,7 @@ if (result < 0) { LOG(ERROR) << "Listen() failed: " << result; OnError(); - return false; + return; } result = socket_->GetLocalAddress(&local_address_); @@ -61,7 +58,7 @@ LOG(ERROR) << "P2PSocketTcpServer::Init(): can't to get local address: " << result; OnError(); - return false; + return; } VLOG(1) << "Local address: " << local_address_.ToString(); @@ -70,45 +67,6 @@ // in this state. client_->SocketCreated(local_address_, remote_address.ip_address); DoAccept(); - return true; -} - -std::unique_ptr<P2PSocketTcpBase> -P2PSocketTcpServer::AcceptIncomingTcpConnectionInternal( - const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest request) { - auto it = accepted_sockets_.find(remote_address); - if (it == accepted_sockets_.end()) - return nullptr; - - std::unique_ptr<net::StreamSocket> socket = std::move(it->second); - accepted_sockets_.erase(it); - - std::unique_ptr<P2PSocketTcpBase> result; - if (client_type_ == P2P_SOCKET_TCP_CLIENT) { - result.reset(new P2PSocketTcp(socket_manager_, std::move(client), - std::move(request), client_type_, nullptr)); - } else { - result.reset(new P2PSocketStunTcp(socket_manager_, std::move(client), - std::move(request), client_type_, - nullptr)); - } - if (!result->InitAccepted(remote_address, std::move(socket))) - return nullptr; - - return result; -} - -void P2PSocketTcpServer::OnError() { - socket_.reset(); - - if (state_ == STATE_UNINITIALIZED || state_ == STATE_OPEN) { - binding_.Close(); - client_.reset(); - } - - state_ = STATE_ERROR; } void P2PSocketTcpServer::DoAccept() { @@ -129,14 +87,39 @@ return; } - net::IPEndPoint address; - if (accept_socket_->GetPeerAddress(&address) != net::OK) { + net::IPEndPoint remote_address; + if (accept_socket_->GetPeerAddress(&remote_address) != net::OK) { LOG(ERROR) << "Failed to get address of an accepted socket."; accept_socket_.reset(); return; } - accepted_sockets_[address] = std::move(accept_socket_); - client_->IncomingTcpConnection(address); + + mojom::P2PSocketPtr socket_ptr; + auto socket_request = mojo::MakeRequest(&socket_ptr); + + mojom::P2PSocketClientPtr client; + auto client_request = mojo::MakeRequest(&client); + + client_->IncomingTcpConnection(remote_address, std::move(socket_ptr), + std::move(client_request)); + + std::unique_ptr<P2PSocketTcpBase> p2p_socket; + if (client_type_ == P2P_SOCKET_TCP_CLIENT) { + p2p_socket = std::make_unique<P2PSocketTcp>(delegate_, std::move(client), + std::move(socket_request), + client_type_, nullptr); + } else { + p2p_socket = std::make_unique<P2PSocketStunTcp>( + delegate_, std::move(client), std::move(socket_request), client_type_, + nullptr); + } + + P2PSocketTcpBase* p2p_socket_ptr = p2p_socket.get(); + delegate_->AddAcceptedConnection(std::move(p2p_socket)); + + // InitAccepted() may call delegate_->DestroySocket(), so it must be + // called after AddAcceptedConnection(). + p2p_socket_ptr->InitAccepted(remote_address, std::move(accept_socket_)); } void P2PSocketTcpServer::OnAccepted(int result) { @@ -145,23 +128,11 @@ DoAccept(); } -void P2PSocketTcpServer::AcceptIncomingTcpConnection( - const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest request) { - std::unique_ptr<P2PSocketTcpBase> socket = - AcceptIncomingTcpConnectionInternal(remote_address, std::move(client), - std::move(request)); - if (socket) - socket_manager_->AddAcceptedConnection(std::move(socket)); -} - void P2PSocketTcpServer::Send( const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { - NOTREACHED(); - delete this; + OnError(); } void P2PSocketTcpServer::SetOption(P2PSocketOption option, int32_t value) {
diff --git a/services/network/p2p/socket_tcp_server.h b/services/network/p2p/socket_tcp_server.h index 0d1015c..4ff367c 100644 --- a/services/network/p2p/socket_tcp_server.h +++ b/services/network/p2p/socket_tcp_server.h
@@ -7,7 +7,6 @@ #include <stdint.h> -#include <map> #include <memory> #include <vector> @@ -25,26 +24,22 @@ } // namespace net namespace network { -class P2PSocketTcpBase; class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpServer : public P2PSocket { public: - P2PSocketTcpServer(P2PSocketManager* socket_manager, + P2PSocketTcpServer(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PSocketType client_type); ~P2PSocketTcpServer() override; // P2PSocket overrides. - bool Init(const net::IPEndPoint& local_address, + void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) override; // mojom::P2PSocket implementation: - void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest request) override; void Send(const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) @@ -54,13 +49,6 @@ private: friend class P2PSocketTcpServerTest; - std::unique_ptr<P2PSocketTcpBase> AcceptIncomingTcpConnectionInternal( - const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest request); - - void OnError(); - void DoAccept(); void HandleAcceptResult(int result); @@ -72,8 +60,6 @@ net::IPEndPoint local_address_; std::unique_ptr<net::StreamSocket> accept_socket_; - std::map<net::IPEndPoint, std::unique_ptr<net::StreamSocket>> - accepted_sockets_; const net::CompletionRepeatingCallback accept_callback_;
diff --git a/services/network/p2p/socket_tcp_server_unittest.cc b/services/network/p2p/socket_tcp_server_unittest.cc index b4371e8..0a8e6274 100644 --- a/services/network/p2p/socket_tcp_server_unittest.cc +++ b/services/network/p2p/socket_tcp_server_unittest.cc
@@ -96,42 +96,32 @@ std::move(socket_client_request))); socket_ = new FakeServerSocket(); - socket_host_.reset(new P2PSocketTcpServer(nullptr, std::move(socket_client), - std::move(socket_request), - P2P_SOCKET_TCP_CLIENT)); - socket_host_->socket_.reset(socket_); + p2p_socket_ = std::make_unique<P2PSocketTcpServer>( + &socket_delegate_, std::move(socket_client), std::move(socket_request), + P2P_SOCKET_TCP_CLIENT); + p2p_socket_->socket_.reset(socket_); EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1); P2PHostAndIPEndPoint dest; dest.ip_address = ParseAddress(kTestIpAddress1, kTestPort1); - socket_host_->Init(ParseAddress(kTestLocalIpAddress, 0), 0, 0, dest); + p2p_socket_->Init(ParseAddress(kTestLocalIpAddress, 0), 0, 0, dest); EXPECT_TRUE(socket_->listening()); base::RunLoop().RunUntilIdle(); } // Needed by the child classes because only this class is a friend // of P2PSocketTcp. - net::StreamSocket* GetSocketFormTcpSocket(P2PSocketTcpBase* host) { + net::StreamSocket* GetSocketFromTcpSocket(P2PSocketTcpBase* host) { return host->socket_.get(); } - std::unique_ptr<P2PSocketTcpBase> AcceptIncomingTcpConnection( - const net::IPEndPoint& address) { - mojom::P2PSocketClientPtr socket_client; - auto socket_client_request = mojo::MakeRequest(&socket_client); - mojom::P2PSocketPtr socket; - auto socket_request = mojo::MakeRequest(&socket); - - return socket_host_->AcceptIncomingTcpConnectionInternal( - address, std::move(socket_client), std::move(socket_request)); - } - base::test::ScopedTaskEnvironment scoped_task_environment_; - FakeServerSocket* socket_; // Owned by |socket_host_|. + FakeServerSocket* socket_; // Owned by |p2p_socket_|. std::unique_ptr<FakeSocketClient> fake_client_; - std::unique_ptr<P2PSocketTcpServer> socket_host_; + FakeP2PSocketDelegate socket_delegate_; + std::unique_ptr<P2PSocketTcpServer> p2p_socket_; }; // Accept incoming connection. @@ -141,14 +131,22 @@ net::IPEndPoint addr = ParseAddress(kTestIpAddress1, kTestPort1); incoming->SetPeerAddress(addr); - EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr)).Times(1); + network::mojom::P2PSocketPtr socket; + network::mojom::P2PSocketClientRequest client_request; + + EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr, _, _)).Times(1); socket_->AddIncoming(incoming); - std::unique_ptr<P2PSocketTcpBase> new_host(AcceptIncomingTcpConnection(addr)); - ASSERT_TRUE(new_host.get() != nullptr); - EXPECT_EQ(incoming, GetSocketFormTcpSocket(new_host.get())); + std::unique_ptr<P2PSocket> accepted_socket = + socket_delegate_.pop_accepted_socket(); + ASSERT_TRUE(accepted_socket); + EXPECT_EQ(incoming, GetSocketFromTcpSocket(reinterpret_cast<P2PSocketTcp*>( + accepted_socket.get()))); base::RunLoop().RunUntilIdle(); + + // IncomingTcpConnection() dropped the sockets. + socket_delegate_.ExpectDestroyed(accepted_socket.get()); } // Accept 2 simultaneous connections. @@ -162,23 +160,28 @@ net::IPEndPoint addr2 = ParseAddress(kTestIpAddress2, kTestPort2); incoming2->SetPeerAddress(addr2); - EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr1)).Times(1); - EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr2)).Times(1); + EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr1, _, _)).Times(1); + EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr2, _, _)).Times(1); socket_->AddIncoming(incoming1); socket_->AddIncoming(incoming2); - std::unique_ptr<P2PSocketTcpBase> new_host1( - AcceptIncomingTcpConnection(addr1)); - ASSERT_TRUE(new_host1.get() != nullptr); - EXPECT_EQ(incoming1, GetSocketFormTcpSocket( - reinterpret_cast<P2PSocketTcp*>(new_host1.get()))); - std::unique_ptr<P2PSocketTcpBase> new_host2( - AcceptIncomingTcpConnection(addr2)); - ASSERT_TRUE(new_host2.get() != nullptr); - EXPECT_EQ(incoming2, GetSocketFormTcpSocket( - reinterpret_cast<P2PSocketTcp*>(new_host2.get()))); + std::unique_ptr<P2PSocket> accepted_socket_1 = + socket_delegate_.pop_accepted_socket(); + ASSERT_TRUE(accepted_socket_1.get() != nullptr); + EXPECT_EQ(incoming1, GetSocketFromTcpSocket(reinterpret_cast<P2PSocketTcp*>( + accepted_socket_1.get()))); + + std::unique_ptr<P2PSocket> accepted_socket_2 = + socket_delegate_.pop_accepted_socket(); + ASSERT_TRUE(accepted_socket_2.get() != nullptr); + EXPECT_EQ(incoming2, GetSocketFromTcpSocket(reinterpret_cast<P2PSocketTcp*>( + accepted_socket_2.get()))); base::RunLoop().RunUntilIdle(); + + // IncomingTcpConnection() dropped the sockets. + socket_delegate_.ExpectDestroyed(accepted_socket_1.get()); + socket_delegate_.ExpectDestroyed(accepted_socket_2.get()); } } // namespace network
diff --git a/services/network/p2p/socket_tcp_unittest.cc b/services/network/p2p/socket_tcp_unittest.cc index 130a889..5890c09 100644 --- a/services/network/p2p/socket_tcp_unittest.cc +++ b/services/network/p2p/socket_tcp_unittest.cc
@@ -46,26 +46,26 @@ EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1); if (socket_type_ == P2P_SOCKET_TCP_CLIENT) { - socket_host_.reset(new P2PSocketTcp(nullptr, std::move(socket_client), - std::move(socket_request), - P2P_SOCKET_TCP_CLIENT, nullptr)); + socket_impl_ = std::make_unique<P2PSocketTcp>( + &socket_delegate_, std::move(socket_client), + std::move(socket_request), P2P_SOCKET_TCP_CLIENT, nullptr); } else { - socket_host_.reset(new P2PSocketStunTcp( - nullptr, std::move(socket_client), std::move(socket_request), - P2P_SOCKET_STUN_TCP_CLIENT, nullptr)); + socket_impl_ = std::make_unique<P2PSocketStunTcp>( + &socket_delegate_, std::move(socket_client), + std::move(socket_request), P2P_SOCKET_STUN_TCP_CLIENT, nullptr); } socket_ = new FakeSocket(&sent_data_); socket_->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1)); - socket_host_->socket_.reset(socket_); + socket_impl_->socket_.reset(socket_); dest_.ip_address = ParseAddress(kTestIpAddress1, kTestPort1); local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1); - socket_host_->remote_address_ = dest_; - socket_host_->state_ = P2PSocket::STATE_CONNECTING; - socket_host_->OnConnected(net::OK); + socket_impl_->remote_address_ = dest_; + socket_impl_->state_ = P2PSocket::STATE_CONNECTING; + socket_impl_->OnConnected(net::OK); base::RunLoop().RunUntilIdle(); } @@ -79,8 +79,9 @@ base::test::ScopedTaskEnvironment scoped_task_environment_; std::string sent_data_; - FakeSocket* socket_; // Owned by |socket_host_|. - std::unique_ptr<P2PSocketTcpBase> socket_host_; + FakeSocket* socket_; // Owned by |socket_impl_|. + std::unique_ptr<P2PSocketTcpBase> socket_impl_; + FakeP2PSocketDelegate socket_delegate_; std::unique_ptr<FakeSocketClient> fake_client_; net::IPEndPoint local_address_; @@ -106,19 +107,19 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet3; CreateStunError(&packet3); - socket_host_->Send( + socket_impl_->Send( packet3, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -143,19 +144,19 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet3; CreateStunError(&packet3); - socket_host_->Send( + socket_impl_->Send( packet3, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -191,10 +192,11 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + socket_delegate_.ExpectDestroyed(socket_impl_.get()); EXPECT_EQ(0U, sent_data_.size()); base::RunLoop().RunUntilIdle(); @@ -202,21 +204,6 @@ EXPECT_TRUE(fake_client_->connection_error()); } -// Verify that SetOption() doesn't crash after an error. -TEST_F(P2PSocketTcpTest, SetOptionAfterError) { - // Get the sender into the error state. - socket_host_->Send( - {1, 2, 3, 4}, P2PPacketInfo(dest_.ip_address, rtc::PacketOptions(), 0), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - - // Verify that SetOptions() fails, but doesn't crash. - socket_host_->SetOption(P2P_SOCKET_OPT_RCVBUF, 2048); - - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(fake_client_->connection_error()); -} - // Verify that we can send data after we've received STUN response // from the other side. TEST_F(P2PSocketTcpTest, SendAfterStunRequest) { @@ -237,7 +224,7 @@ // Now we should be able to send any data to |dest_|. std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -260,13 +247,13 @@ std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -299,7 +286,7 @@ std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -331,7 +318,7 @@ CreateRandomPacket(&packet); // Make it a RTP packet. *reinterpret_cast<uint16_t*>(&*packet.begin()) = base::HostToNet16(0x8000); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -352,19 +339,19 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet3; CreateStunError(&packet3); - socket_host_->Send( + socket_impl_->Send( packet3, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -386,19 +373,19 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet3; CreateStunError(&packet3); - socket_host_->Send( + socket_impl_->Send( packet3, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -431,10 +418,11 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + socket_delegate_.ExpectDestroyed(socket_impl_.get()); EXPECT_EQ(0U, sent_data_.size()); base::RunLoop().RunUntilIdle(); @@ -451,13 +439,13 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest_.ip_address, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -508,14 +496,13 @@ net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); mock_socket_factory.AddSocketDataProvider(&data_provider); - P2PSocketTcp host(nullptr, std::move(socket_client), + FakeP2PSocketDelegate socket_delegate; + P2PSocketTcp host(&socket_delegate, std::move(socket_client), std::move(socket_request), P2P_SOCKET_SSLTCP_CLIENT, &factory); P2PHostAndIPEndPoint dest; dest.ip_address = server_addr; - bool success = host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), - 0, 0, dest); - EXPECT_TRUE(success); + host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data_provider.AllReadDataConsumed()); @@ -566,21 +553,20 @@ mock_socket_factory.AddSocketDataProvider(&data_provider); mock_socket_factory.AddSSLSocketDataProvider(&ssl_socket_provider); + FakeP2PSocketDelegate socket_delegate; std::unique_ptr<P2PSocketTcpBase> host; if (socket_type == P2P_SOCKET_STUN_TLS_CLIENT) { - host = std::make_unique<P2PSocketStunTcp>(nullptr, std::move(socket_client), - std::move(socket_request), - socket_type, &factory); + host = std::make_unique<P2PSocketStunTcp>( + &socket_delegate, std::move(socket_client), std::move(socket_request), + socket_type, &factory); } else { - host = std::make_unique<P2PSocketTcp>(nullptr, std::move(socket_client), - std::move(socket_request), - socket_type, &factory); + host = std::make_unique<P2PSocketTcp>( + &socket_delegate, std::move(socket_client), std::move(socket_request), + socket_type, &factory); } P2PHostAndIPEndPoint dest; dest.ip_address = server_addr; - bool success = host->Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), - 0, 0, dest); - EXPECT_TRUE(success); + host->Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data_provider.AllReadDataConsumed());
diff --git a/services/network/p2p/socket_test_utils.cc b/services/network/p2p/socket_test_utils.cc index c59048cd..62f3426 100644 --- a/services/network/p2p/socket_test_utils.cc +++ b/services/network/p2p/socket_test_utils.cc
@@ -22,6 +22,36 @@ const uint16_t kStunBindingError = 0x0111; const uint32_t kStunMagicCookie = 0x2112A442; +FakeP2PSocketDelegate::FakeP2PSocketDelegate() = default; +FakeP2PSocketDelegate::~FakeP2PSocketDelegate() { + CHECK(destroyed_sockets_.empty()); +} + +void FakeP2PSocketDelegate::DestroySocket(P2PSocket* socket) { + destroyed_sockets_.insert(socket); +} + +void FakeP2PSocketDelegate::DumpPacket(base::span<const uint8_t> data, + bool incoming) {} + +void FakeP2PSocketDelegate::AddAcceptedConnection( + std::unique_ptr<P2PSocket> accepted) { + accepted_.push_back(std::move(accepted)); +} + +void FakeP2PSocketDelegate::ExpectDestroyed(P2PSocket* socket) { + auto erased = destroyed_sockets_.erase(socket); + CHECK(erased); +} + +std::unique_ptr<P2PSocket> FakeP2PSocketDelegate::pop_accepted_socket() { + if (accepted_.empty()) + return nullptr; + auto result = std::move(accepted_.front()); + accepted_.pop_front(); + return result; +} + FakeSocket::FakeSocket(std::string* written_data) : read_pending_(false), input_pos_(0),
diff --git a/services/network/p2p/socket_test_utils.h b/services/network/p2p/socket_test_utils.h index fb4da3a..874faef 100644 --- a/services/network/p2p/socket_test_utils.h +++ b/services/network/p2p/socket_test_utils.h
@@ -16,6 +16,7 @@ #include "net/log/net_log_with_source.h" #include "net/socket/stream_socket.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "services/network/p2p/socket.h" #include "services/network/public/cpp/p2p_param_traits.h" #include "services/network/public/mojom/p2p.mojom.h" #include "testing/gmock/include/gmock/gmock.h" @@ -29,6 +30,25 @@ const char kTestIpAddress2[] = "133.11.22.33"; const uint16_t kTestPort2 = 543; +class FakeP2PSocketDelegate : public P2PSocket::Delegate { + public: + FakeP2PSocketDelegate(); + ~FakeP2PSocketDelegate() override; + + // P2PSocket::Delegate interface. + void DestroySocket(P2PSocket* socket) override; + void DumpPacket(base::span<const uint8_t> data, bool incoming) override; + void AddAcceptedConnection(std::unique_ptr<P2PSocket> accepted) override; + + void ExpectDestroyed(P2PSocket* socket); + + std::unique_ptr<P2PSocket> pop_accepted_socket(); + + private: + std::set<P2PSocket*> destroyed_sockets_; + std::list<std::unique_ptr<P2PSocket>> accepted_; +}; + class FakeSocket : public net::StreamSocket { public: FakeSocket(std::string* written_data); @@ -103,7 +123,10 @@ MOCK_METHOD2(SocketCreated, void(const net::IPEndPoint&, const net::IPEndPoint&)); MOCK_METHOD1(SendComplete, void(const P2PSendPacketMetrics&)); - MOCK_METHOD1(IncomingTcpConnection, void(const net::IPEndPoint&)); + MOCK_METHOD3(IncomingTcpConnection, + void(const net::IPEndPoint&, + network::mojom::P2PSocketPtr socket, + network::mojom::P2PSocketClientRequest client_request)); MOCK_METHOD3(DataReceived, void(const net::IPEndPoint&, const std::vector<int8_t>&,
diff --git a/services/network/p2p/socket_udp.cc b/services/network/p2p/socket_udp.cc index 6269f68..e2c6774 100644 --- a/services/network/p2p/socket_udp.cc +++ b/services/network/p2p/socket_udp.cc
@@ -77,7 +77,7 @@ uint64_t id, const net::NetworkTrafficAnnotationTag traffic_annotation) : to(to), - data(new net::IOBuffer(content.size())), + data(base::MakeRefCounted<net::IOBuffer>(content.size())), size(content.size()), packet_options(options), id(id), @@ -90,16 +90,13 @@ P2PSocketUdp::PendingPacket::~PendingPacket() {} -P2PSocketUdp::P2PSocketUdp(P2PSocketManager* socket_manager, +P2PSocketUdp::P2PSocketUdp(Delegate* Delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PMessageThrottler* throttler, net::NetLog* net_log, const DatagramServerSocketFactory& socket_factory) - : P2PSocket(socket_manager, - std::move(client), - std::move(socket), - P2PSocket::UDP), + : P2PSocket(Delegate, std::move(client), std::move(socket), P2PSocket::UDP), socket_(socket_factory.Run(net_log)), send_pending_(false), last_dscp_(net::DSCP_CS0), @@ -107,12 +104,12 @@ net_log_(net_log), socket_factory_(socket_factory) {} -P2PSocketUdp::P2PSocketUdp(P2PSocketManager* socket_manager, +P2PSocketUdp::P2PSocketUdp(Delegate* Delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PMessageThrottler* throttler, net::NetLog* net_log) - : P2PSocketUdp(socket_manager, + : P2PSocketUdp(Delegate, std::move(client), std::move(socket), throttler, @@ -126,7 +123,7 @@ } } -bool P2PSocketUdp::Init(const net::IPEndPoint& local_address, +void P2PSocketUdp::Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) { @@ -155,7 +152,7 @@ max_port)) << " failed: " << result; OnError(); - return false; + return; } // Setting recv socket buffer size. @@ -176,7 +173,7 @@ LOG(ERROR) << "P2PSocketUdp::Init(): unable to get local address: " << result; OnError(); - return false; + return; } VLOG(1) << "Local address: " << address.ToString(); @@ -185,22 +182,8 @@ // NOTE: Remote address will be same as what renderer provided. client_->SocketCreated(address, remote_address.ip_address); - recv_buffer_ = new net::IOBuffer(kUdpReadBufferSize); + recv_buffer_ = base::MakeRefCounted<net::IOBuffer>(kUdpReadBufferSize); DoRead(); - - return true; -} - -void P2PSocketUdp::OnError() { - socket_.reset(); - send_queue_.clear(); - - if (state_ == STATE_UNINITIALIZED || state_ == STATE_OPEN) { - binding_.Close(); - client_.reset(); - } - - state_ = STATE_ERROR; } void P2PSocketUdp::DoRead() { @@ -231,8 +214,8 @@ if (!base::ContainsKey(connected_peers_, recv_address_)) { P2PSocket::StunMessageType type; - bool stun = GetStunPacketType( - reinterpret_cast<const int8_t*>(&*data.begin()), data.size(), &type); + bool stun = GetStunPacketType(reinterpret_cast<uint8_t*>(&*data.begin()), + data.size(), &type); if ((stun && IsRequestOrResponse(type))) { connected_peers_.insert(recv_address_); } else if (!stun || type == STUN_DATA_INDICATION) { @@ -245,8 +228,9 @@ client_->DataReceived(recv_address_, data, base::TimeTicks::Now()); - if (dump_incoming_rtp_packet_) - DumpRtpPacket(&data[0], data.size(), true); + delegate_->DumpPacket( + base::make_span(reinterpret_cast<uint8_t*>(&data[0]), data.size()), + true); } else if (result < 0 && !IsTransientError(result)) { LOG(ERROR) << "Error when reading from UDP socket: " << result; OnError(); @@ -264,7 +248,7 @@ if (!base::ContainsKey(connected_peers_, packet.to)) { P2PSocket::StunMessageType type = P2PSocket::StunMessageType(); bool stun = - GetStunPacketType(reinterpret_cast<const int8_t*>(packet.data->data()), + GetStunPacketType(reinterpret_cast<const uint8_t*>(packet.data->data()), packet.size, &type); if (!stun || type == STUN_DATA_INDICATION) { LOG(ERROR) << "Page tried to send a data packet to " @@ -334,9 +318,10 @@ result); } - if (dump_outgoing_rtp_packet_) - DumpRtpPacket(reinterpret_cast<const int8_t*>(packet.data->data()), - packet.size, false); + delegate_->DumpPacket( + base::make_span(reinterpret_cast<const uint8_t*>(packet.data->data()), + packet.size), + false); } void P2PSocketUdp::OnSend(uint64_t packet_id, @@ -386,14 +371,6 @@ P2PSendPacketMetrics(packet_id, transport_sequence_number, send_time)); } -void P2PSocketUdp::AcceptIncomingTcpConnection( - const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest socket) { - NOTREACHED(); - OnError(); -} - void P2PSocketUdp::Send( const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, @@ -404,12 +381,6 @@ return; } - if (!socket_) { - // The Send message may be sent after the an OnError message was - // sent by hasn't been processed the renderer. - return; - } - IncrementTotalSentPackets(); if (send_pending_) { @@ -428,10 +399,6 @@ } void P2PSocketUdp::SetOption(P2PSocketOption option, int32_t value) { - if (state_ != STATE_OPEN) { - DCHECK_EQ(state_, STATE_ERROR); - return; - } switch (option) { case P2P_SOCKET_OPT_RCVBUF: socket_->SetReceiveBufferSize(value);
diff --git a/services/network/p2p/socket_udp.h b/services/network/p2p/socket_udp.h index 4a25fd96..876515cd 100644 --- a/services/network/p2p/socket_udp.h +++ b/services/network/p2p/socket_udp.h
@@ -39,13 +39,13 @@ typedef base::Callback<std::unique_ptr<net::DatagramServerSocket>( net::NetLog* net_log)> DatagramServerSocketFactory; - P2PSocketUdp(P2PSocketManager* socket_manager, + P2PSocketUdp(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PMessageThrottler* throttler, net::NetLog* net_log, const DatagramServerSocketFactory& socket_factory); - P2PSocketUdp(P2PSocketManager* socket_manager, + P2PSocketUdp(Delegate* delegate, mojom::P2PSocketClientPtr client, mojom::P2PSocketRequest socket, P2PMessageThrottler* throttler, @@ -53,15 +53,12 @@ ~P2PSocketUdp() override; // P2PSocket overrides. - bool Init(const net::IPEndPoint& local_address, + void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, const P2PHostAndIPEndPoint& remote_address) override; // mojom::P2PSocket implementation: - void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address, - mojom::P2PSocketClientPtr client, - mojom::P2PSocketRequest socket) override; void Send(const std::vector<int8_t>& data, const P2PPacketInfo& packet_info, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) @@ -89,8 +86,6 @@ const net::NetworkTrafficAnnotationTag traffic_annotation; }; - void OnError(); - void DoRead(); void OnRecv(int result); void HandleReadResult(int result);
diff --git a/services/network/p2p/socket_udp_unittest.cc b/services/network/p2p/socket_udp_unittest.cc index 050d323..a97824a1 100644 --- a/services/network/p2p/socket_udp_unittest.cc +++ b/services/network/p2p/socket_udp_unittest.cc
@@ -212,22 +212,23 @@ mojom::P2PSocketPtr socket; auto socket_request = mojo::MakeRequest(&socket); - fake_client_.reset(new FakeSocketClient(std::move(socket), - std::move(socket_client_request))); + fake_client_ = std::make_unique<FakeSocketClient>( + std::move(socket), std::move(socket_client_request)); EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1); - socket_host_.reset(new P2PSocketUdp( - nullptr, std::move(socket_client), std::move(socket_request), + socket_impl_ = std::make_unique<P2PSocketUdp>( + &socket_delegate_, std::move(socket_client), std::move(socket_request), &throttler_, /*net_log=*/nullptr, - base::Bind(&CreateFakeDatagramServerSocket, &sent_packets_, nullptr))); + base::BindRepeating(&CreateFakeDatagramServerSocket, &sent_packets_, + nullptr)); local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1); - socket_host_->Init( + socket_impl_->Init( local_address_, 0, 0, P2PHostAndIPEndPoint(std::string(), ParseAddress(kTestIpAddress1, kTestPort1))); - socket_ = GetSocketFromHost(socket_host_.get()); + socket_ = GetSocketFromHost(socket_impl_.get()); dest1_ = ParseAddress(kTestIpAddress1, kTestPort1); dest2_ = ParseAddress(kTestIpAddress2, kTestPort2); @@ -242,8 +243,9 @@ P2PMessageThrottler throttler_; ScopedFakeClock fake_clock_; base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets_; - FakeDatagramServerSocket* socket_; // Owned by |socket_host_|. - std::unique_ptr<P2PSocketUdp> socket_host_; + FakeDatagramServerSocket* socket_; // Owned by |socket_impl_|. + FakeP2PSocketDelegate socket_delegate_; + std::unique_ptr<P2PSocketUdp> socket_impl_; std::unique_ptr<FakeSocketClient> fake_client_; net::IPEndPoint local_address_; @@ -260,19 +262,19 @@ rtc::PacketOptions options; std::vector<int8_t> packet1; CreateStunRequest(&packet1); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet2; CreateStunResponse(&packet2); - socket_host_->Send( + socket_impl_->Send( packet2, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); std::vector<int8_t> packet3; CreateStunError(&packet3); - socket_host_->Send( + socket_impl_->Send( packet3, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -290,10 +292,12 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + socket_delegate_.ExpectDestroyed(socket_impl_.get()); ASSERT_EQ(sent_packets_.size(), 0U); base::RunLoop().RunUntilIdle(); @@ -301,21 +305,6 @@ EXPECT_TRUE(fake_client_->connection_error()); } -// Verify that SetOption() doesn't crash after an error. -TEST_F(P2PSocketUdpTest, SetOptionAfterError) { - // Get the sender into the error state. - socket_host_->Send( - {1, 2, 3, 4}, P2PPacketInfo(dest1_, rtc::PacketOptions(), 0), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - - // Verify that SetOptions() fails, but doesn't crash. - socket_host_->SetOption(P2P_SOCKET_OPT_RCVBUF, 2048); - - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(fake_client_->connection_error()); -} - // Verify that we can send data after we've received STUN request // from the other side. TEST_F(P2PSocketUdpTest, SendAfterStunRequest) { @@ -332,7 +321,7 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -358,7 +347,7 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -382,10 +371,13 @@ rtc::PacketOptions options; std::vector<int8_t> packet; CreateRandomPacket(&packet); - socket_host_->Send( + + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + socket_delegate_.ExpectDestroyed(socket_impl_.get()); + base::RunLoop().RunUntilIdle(); EXPECT_TRUE(fake_client_->connection_error()); @@ -400,16 +392,16 @@ std::vector<int8_t> packet1; CreateStunRequest(&packet1); throttler_.SetSendIceBandwidth(packet1.size() * 2); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2222); // This packet must be dropped by the throttler. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest3, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); ASSERT_EQ(sent_packets_.size(), 2U); @@ -434,31 +426,31 @@ CreateStunRequest(&packet1); throttler_.SetSendIceBandwidth(packet1.size()); // |dest1_| is known address, throttling will not be applied. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); // Trying to send the packet to dest1_ in the same window. It should go. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); // Throttler should allow this packet to go through. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2223); // This packet will be dropped, as limit only for a single packet. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest3, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); net::IPEndPoint dest4 = ParseAddress(kTestIpAddress1, 2224); // This packet should also be dropped. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest4, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); // |dest1| is known, we can send as many packets to it. - socket_host_->Send( + socket_impl_->Send( packet1, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); ASSERT_EQ(sent_packets_.size(), 4U); @@ -484,20 +476,20 @@ CreateStunRequest(&packet); // Limit of 2 packets per second. throttler_.SetSendIceBandwidth(packet.size() * 2); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(2U, sent_packets_.size()); // These packets must be dropped by the throttler since the limit was hit and // the time hasn't advanced. - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(2U, sent_packets_.size()); @@ -505,10 +497,10 @@ // Advance the time to 0.999 seconds; throttling should still just barely be // active. fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 999); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(2U, sent_packets_.size()); @@ -516,32 +508,32 @@ // After hitting the second mark, we should be able to send again. // Add an extra millisecond to account for rounding errors. fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1001); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(3U, sent_packets_.size()); // This time, hit the limit in the middle of the period. fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1500); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(4U, sent_packets_.size()); // Again, throttling should be active until the next second mark. fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1999); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(4U, sent_packets_.size()); fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 2002); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest1_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - socket_host_->Send( + socket_impl_->Send( packet, P2PPacketInfo(dest2_, options, 0), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); EXPECT_EQ(6U, sent_packets_.size()); @@ -557,7 +549,8 @@ base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets; std::vector<uint16_t> used_ports; P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory = - base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports); + base::BindRepeating(&CreateFakeDatagramServerSocket, &sent_packets, + &used_ports); P2PMessageThrottler throttler; mojom::P2PSocketClientPtr socket_client; @@ -570,36 +563,38 @@ EXPECT_CALL(fake_client2, SocketCreated(_, _)).Times(max_port - min_port + 1); for (unsigned port = min_port; port <= max_port; ++port) { - std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp( - nullptr, std::move(socket_client), std::move(socket_request), + std::unique_ptr<P2PSocketUdp> socket_impl(new P2PSocketUdp( + &socket_delegate_, std::move(socket_client), std::move(socket_request), &throttler, /*net_log=*/nullptr, fake_socket_factory)); net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0); - bool rv = socket_host->Init( + socket_impl->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), ParseAddress(kTestIpAddress1, kTestPort1))); - EXPECT_TRUE(rv); - FakeDatagramServerSocket* socket = GetSocketFromHost(socket_host.get()); + FakeDatagramServerSocket* socket = GetSocketFromHost(socket_impl.get()); net::IPEndPoint bound_address; socket->GetLocalAddress(&bound_address); EXPECT_EQ(port, bound_address.port()); base::RunLoop().RunUntilIdle(); - socket_client = socket_host->ReleaseClientForTesting(); - socket_request = socket_host->ReleaseBindingForTesting(); + socket_client = socket_impl->ReleaseClientForTesting(); + socket_request = socket_impl->ReleaseBindingForTesting(); } - std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp( - nullptr, std::move(socket_client), std::move(socket_request), &throttler, - /*net_log=*/nullptr, std::move(fake_socket_factory))); + std::unique_ptr<P2PSocketUdp> socket_impl( + new P2PSocketUdp(&socket_delegate_, std::move(socket_client), + std::move(socket_request), &throttler, + /*net_log=*/nullptr, std::move(fake_socket_factory))); net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0); - bool rv = socket_host->Init( + + socket_impl->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), ParseAddress(kTestIpAddress1, kTestPort1))); - EXPECT_FALSE(rv); + + socket_delegate_.ExpectDestroyed(socket_impl.get()); base::RunLoop().RunUntilIdle(); @@ -615,7 +610,8 @@ base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets; std::vector<uint16_t> used_ports; P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory = - base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports); + base::BindRepeating(&CreateFakeDatagramServerSocket, &sent_packets, + &used_ports); P2PMessageThrottler throttler; mojom::P2PSocketClientPtr socket_client; @@ -628,15 +624,15 @@ EXPECT_CALL(fake_client2, SocketCreated(_, _)).Times(1); - std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp( - nullptr, std::move(socket_client), std::move(socket_request), &throttler, - /*net_log=*/nullptr, std::move(fake_socket_factory))); + std::unique_ptr<P2PSocketUdp> socket_host( + new P2PSocketUdp(&socket_delegate_, std::move(socket_client), + std::move(socket_request), &throttler, + /*net_log=*/nullptr, std::move(fake_socket_factory))); net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, valid_port); - bool rv = socket_host->Init( + socket_host->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), ParseAddress(kTestIpAddress1, kTestPort1))); - EXPECT_TRUE(rv); FakeDatagramServerSocket* fake_socket = GetSocketFromHost(socket_host.get()); net::IPEndPoint bound_address; @@ -655,27 +651,30 @@ base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets; std::vector<uint16_t> used_ports; P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory = - base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports); + base::BindRepeating(&CreateFakeDatagramServerSocket, &sent_packets, + &used_ports); P2PMessageThrottler throttler; mojom::P2PSocketClientPtr socket_client; auto socket_client_request = mojo::MakeRequest(&socket_client); - mojom::P2PSocketPtr socket; - auto socket_request = mojo::MakeRequest(&socket); + mojom::P2PSocketPtr socket_ptr; + auto socket_request = mojo::MakeRequest(&socket_ptr); - FakeSocketClient fake_client2(std::move(socket), + FakeSocketClient fake_client2(std::move(socket_ptr), std::move(socket_client_request)); - std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp( - nullptr, std::move(socket_client), std::move(socket_request), &throttler, - /*net_log=*/nullptr, std::move(fake_socket_factory))); + auto p2p_socket = std::make_unique<P2PSocketUdp>( + &socket_delegate_, std::move(socket_client), std::move(socket_request), + &throttler, /*net_log=*/nullptr, std::move(fake_socket_factory)); net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, invalid_port); - bool rv = socket_host->Init( + + p2p_socket->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), ParseAddress(kTestIpAddress1, kTestPort1))); - EXPECT_FALSE(rv); + + socket_delegate_.ExpectDestroyed(p2p_socket.get()); base::RunLoop().RunUntilIdle();
diff --git a/services/network/proxy_resolving_client_socket_factory.h b/services/network/proxy_resolving_client_socket_factory.h index 21bf179..653ecf9b 100644 --- a/services/network/proxy_resolving_client_socket_factory.h +++ b/services/network/proxy_resolving_client_socket_factory.h
@@ -27,7 +27,8 @@ // Constructs a ProxyResolvingClientSocketFactory. This factory shares // network session params with |request_context|, but keeps separate socket // pools by instantiating and owning a separate |network_session_|. - ProxyResolvingClientSocketFactory(net::URLRequestContext* request_context); + explicit ProxyResolvingClientSocketFactory( + net::URLRequestContext* request_context); ~ProxyResolvingClientSocketFactory(); // Creates a socket. |url|'s host and port specify where a connection will be @@ -41,6 +42,10 @@ std::unique_ptr<ProxyResolvingClientSocket> CreateSocket(const GURL& url, bool use_tls); + const net::HttpNetworkSession* network_session() const { + return network_session_.get(); + } + private: std::unique_ptr<net::HttpNetworkSession> network_session_; net::URLRequestContext* request_context_;
diff --git a/services/network/proxy_resolving_client_socket_unittest.cc b/services/network/proxy_resolving_client_socket_unittest.cc index 9ca2204..5f3be86 100644 --- a/services/network/proxy_resolving_client_socket_unittest.cc +++ b/services/network/proxy_resolving_client_socket_unittest.cc
@@ -326,9 +326,9 @@ net::TestCompletionCallback read_write_callback; int read_write_result; std::string test_data_string("test data"); - scoped_refptr<net::IOBuffer> read_buffer(new net::IOBufferWithSize(10)); - scoped_refptr<net::IOBuffer> write_buffer( - new net::StringIOBuffer(test_data_string)); + auto read_buffer = base::MakeRefCounted<net::IOBufferWithSize>(10); + auto write_buffer = + base::MakeRefCounted<net::StringIOBuffer>(test_data_string); if (test.is_read_error) { read_write_result = socket->Read(read_buffer.get(), 10, read_write_callback.callback());
diff --git a/services/network/proxy_resolving_socket_factory_mojo.cc b/services/network/proxy_resolving_socket_factory_mojo.cc index 114c8c4..d6bcfc3 100644 --- a/services/network/proxy_resolving_socket_factory_mojo.cc +++ b/services/network/proxy_resolving_socket_factory_mojo.cc
@@ -16,8 +16,9 @@ ProxyResolvingSocketFactoryMojo::ProxyResolvingSocketFactoryMojo( net::URLRequestContext* request_context) - : factory_impl_(std::make_unique<ProxyResolvingClientSocketFactory>( - request_context)) {} + : factory_impl_(request_context), + tls_socket_factory_(request_context, + &factory_impl_.network_session()->context()) {} ProxyResolvingSocketFactoryMojo::~ProxyResolvingSocketFactoryMojo() {} @@ -28,8 +29,9 @@ mojom::ProxyResolvingSocketRequest request, CreateProxyResolvingSocketCallback callback) { auto socket = std::make_unique<ProxyResolvingSocketMojo>( - factory_impl_->CreateSocket(url, use_tls), - static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation)); + factory_impl_.CreateSocket(url, use_tls), + static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), + &tls_socket_factory_); ProxyResolvingSocketMojo* socket_raw = socket.get(); proxy_resolving_socket_bindings_.AddBinding(std::move(socket), std::move(request));
diff --git a/services/network/proxy_resolving_socket_factory_mojo.h b/services/network/proxy_resolving_socket_factory_mojo.h index fdd1f83e..f1974e82 100644 --- a/services/network/proxy_resolving_socket_factory_mojo.h +++ b/services/network/proxy_resolving_socket_factory_mojo.h
@@ -12,7 +12,9 @@ #include "base/memory/ref_counted.h" #include "mojo/public/cpp/bindings/strong_binding_set.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/proxy_resolving_client_socket_factory.h" #include "services/network/public/mojom/proxy_resolving_socket.mojom.h" +#include "services/network/tls_socket_factory.h" namespace net { class URLRequestContext; @@ -20,8 +22,6 @@ namespace network { -class ProxyResolvingClientSocketFactory; - class COMPONENT_EXPORT(NETWORK_SERVICE) ProxyResolvingSocketFactoryMojo : public mojom::ProxyResolvingSocketFactory { public: @@ -37,7 +37,8 @@ CreateProxyResolvingSocketCallback callback) override; private: - std::unique_ptr<ProxyResolvingClientSocketFactory> factory_impl_; + ProxyResolvingClientSocketFactory factory_impl_; + TLSSocketFactory tls_socket_factory_; mojo::StrongBindingSet<mojom::ProxyResolvingSocket> proxy_resolving_socket_bindings_;
diff --git a/services/network/proxy_resolving_socket_mojo.cc b/services/network/proxy_resolving_socket_mojo.cc index 040dc35e7..cf78785 100644 --- a/services/network/proxy_resolving_socket_mojo.cc +++ b/services/network/proxy_resolving_socket_mojo.cc
@@ -15,8 +15,11 @@ ProxyResolvingSocketMojo::ProxyResolvingSocketMojo( std::unique_ptr<ProxyResolvingClientSocket> socket, - const net::NetworkTrafficAnnotationTag& traffic_annotation) - : socket_(std::move(socket)), traffic_annotation_(traffic_annotation) {} + const net::NetworkTrafficAnnotationTag& traffic_annotation, + TLSSocketFactory* tls_socket_factory) + : tls_socket_factory_(tls_socket_factory), + socket_(std::move(socket)), + traffic_annotation_(traffic_annotation) {} ProxyResolvingSocketMojo::~ProxyResolvingSocketMojo() { if (connect_callback_) { @@ -44,6 +47,36 @@ OnConnectCompleted(result); } +void ProxyResolvingSocketMojo::UpgradeToTLS( + const net::HostPortPair& host_port_pair, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TLSClientSocketRequest request, + mojom::SocketObserverPtr observer, + mojom::ProxyResolvingSocket::UpgradeToTLSCallback callback) { + // Wait for data pipes to be closed by the client before doing the upgrade. + if (socket_data_pump_) { + pending_upgrade_to_tls_callback_ = base::BindOnce( + &ProxyResolvingSocketMojo::UpgradeToTLS, base::Unretained(this), + host_port_pair, traffic_annotation, std::move(request), + std::move(observer), std::move(callback)); + return; + } + tls_socket_factory_->UpgradeToTLS( + this, host_port_pair, nullptr /* sockt_options */, traffic_annotation, + std::move(request), std::move(observer), + base::BindOnce( + [](mojom::ProxyResolvingSocket::UpgradeToTLSCallback callback, + int32_t net_error, + mojo::ScopedDataPipeConsumerHandle receive_stream, + mojo::ScopedDataPipeProducerHandle send_stream, + const base::Optional<net::SSLInfo>& ssl_info) { + DCHECK(!ssl_info); + std::move(callback).Run(net_error, std::move(receive_stream), + std::move(send_stream)); + }, + std::move(callback))); +} + void ProxyResolvingSocketMojo::OnConnectCompleted(int result) { DCHECK(!connect_callback_.is_null()); DCHECK(!socket_data_pump_); @@ -68,8 +101,7 @@ mojo::DataPipe send_pipe; mojo::DataPipe receive_pipe; socket_data_pump_ = std::make_unique<SocketDataPump>( - socket_.get(), nullptr /*delegate*/, - std::move(receive_pipe.producer_handle), + socket_.get(), this /*delegate*/, std::move(receive_pipe.producer_handle), std::move(send_pipe.consumer_handle), traffic_annotation_); std::move(connect_callback_) .Run(net::OK, local_addr, @@ -80,4 +112,20 @@ std::move(send_pipe.producer_handle)); } +void ProxyResolvingSocketMojo::OnNetworkReadError(int net_error) {} +void ProxyResolvingSocketMojo::OnNetworkWriteError(int net_error) {} +void ProxyResolvingSocketMojo::OnShutdown() { + socket_data_pump_ = nullptr; + if (!pending_upgrade_to_tls_callback_.is_null()) + std::move(pending_upgrade_to_tls_callback_).Run(); +} + +const net::StreamSocket* ProxyResolvingSocketMojo::BorrowSocket() { + return socket_.get(); +} + +std::unique_ptr<net::StreamSocket> ProxyResolvingSocketMojo::TakeSocket() { + return std::move(socket_); +} + } // namespace network
diff --git a/services/network/proxy_resolving_socket_mojo.h b/services/network/proxy_resolving_socket_mojo.h index d90a569..ba6aa82 100644 --- a/services/network/proxy_resolving_socket_mojo.h +++ b/services/network/proxy_resolving_socket_mojo.h
@@ -13,29 +13,53 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/proxy_resolving_client_socket.h" #include "services/network/public/mojom/proxy_resolving_socket.mojom.h" +#include "services/network/socket_data_pump.h" +#include "services/network/tls_socket_factory.h" namespace network { class SocketDataPump; class COMPONENT_EXPORT(NETWORK_SERVICE) ProxyResolvingSocketMojo - : public mojom::ProxyResolvingSocket { + : public mojom::ProxyResolvingSocket, + public SocketDataPump::Delegate, + public TLSSocketFactory::Delegate { public: ProxyResolvingSocketMojo( std::unique_ptr<ProxyResolvingClientSocket> socket, - const net::NetworkTrafficAnnotationTag& traffic_annotation); + const net::NetworkTrafficAnnotationTag& traffic_annotation, + TLSSocketFactory* tls_socket_factory); ~ProxyResolvingSocketMojo() override; void Connect( mojom::ProxyResolvingSocketFactory::CreateProxyResolvingSocketCallback callback); + // mojom::ProxyResolvingSocket implementation. + void UpgradeToTLS( + const net::HostPortPair& host_port_pair, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TLSClientSocketRequest request, + mojom::SocketObserverPtr observer, + mojom::ProxyResolvingSocket::UpgradeToTLSCallback callback) override; + private: void OnConnectCompleted(int net_result); + // SocketDataPump::Delegate implementation. + void OnNetworkReadError(int net_error) override; + void OnNetworkWriteError(int net_error) override; + void OnShutdown() override; + + // TLSSocketFactory::Delegate implementation. + const net::StreamSocket* BorrowSocket() override; + std::unique_ptr<net::StreamSocket> TakeSocket() override; + + TLSSocketFactory* tls_socket_factory_; std::unique_ptr<ProxyResolvingClientSocket> socket_; const net::NetworkTrafficAnnotationTag traffic_annotation_; mojom::ProxyResolvingSocketFactory::CreateProxyResolvingSocketCallback connect_callback_; + base::OnceClosure pending_upgrade_to_tls_callback_; std::unique_ptr<SocketDataPump> socket_data_pump_; DISALLOW_COPY_AND_ASSIGN(ProxyResolvingSocketMojo);
diff --git a/services/network/public/cpp/cors/origin_access_list.h b/services/network/public/cpp/cors/origin_access_list.h index 518f5ef..781b2367 100644 --- a/services/network/public/cpp/cors/origin_access_list.h +++ b/services/network/public/cpp/cors/origin_access_list.h
@@ -19,9 +19,8 @@ namespace cors { -// A class to manage origin access whitelisting. It manages two lists for -// whitelisting and blacklisting. If these lists conflict, blacklisting will be -// respected. These lists are managed per source-origin basis. +// A class to manage origin access allow / block lists. If these lists conflict, +// blacklisting is respected. These lists are managed per source-origin basis. class COMPONENT_EXPORT(NETWORK_CPP) OriginAccessList { public: OriginAccessList();
diff --git a/services/network/public/cpp/host_resolver.typemap b/services/network/public/cpp/host_resolver.typemap index 14f2edb0..f4054b0 100644 --- a/services/network/public/cpp/host_resolver.typemap +++ b/services/network/public/cpp/host_resolver.typemap
@@ -12,4 +12,7 @@ public_deps = [ "//net", ] -type_mappings = [ "network.mojom.ResolveHostParameters.DnsQueryType=net::HostResolver::DnsQueryType" ] +type_mappings = [ + "network.mojom.ResolveHostParameters.DnsQueryType=net::HostResolver::DnsQueryType", + "network.mojom.ResolveHostParameters.Source=net::HostResolverSource", +]
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.cc b/services/network/public/cpp/host_resolver_mojom_traits.cc index d8085bc..4814649 100644 --- a/services/network/public/cpp/host_resolver_mojom_traits.cc +++ b/services/network/public/cpp/host_resolver_mojom_traits.cc
@@ -41,4 +41,35 @@ } } +// static +ResolveHostParameters::Source +EnumTraits<ResolveHostParameters::Source, net::HostResolverSource>::ToMojom( + net::HostResolverSource input) { + switch (input) { + case net::HostResolverSource::ANY: + return ResolveHostParameters::Source::ANY; + case net::HostResolverSource::SYSTEM: + return ResolveHostParameters::Source::SYSTEM; + case net::HostResolverSource::DNS: + return ResolveHostParameters::Source::DNS; + } +} + +// static +bool EnumTraits<ResolveHostParameters::Source, net::HostResolverSource>:: + FromMojom(ResolveHostParameters::Source input, + net::HostResolverSource* output) { + switch (input) { + case ResolveHostParameters::Source::ANY: + *output = net::HostResolverSource::ANY; + return true; + case ResolveHostParameters::Source::SYSTEM: + *output = net::HostResolverSource::SYSTEM; + return true; + case ResolveHostParameters::Source::DNS: + *output = net::HostResolverSource::DNS; + return true; + } +} + } // namespace mojo
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.h b/services/network/public/cpp/host_resolver_mojom_traits.h index c0daabd..fab0ed1 100644 --- a/services/network/public/cpp/host_resolver_mojom_traits.h +++ b/services/network/public/cpp/host_resolver_mojom_traits.h
@@ -21,6 +21,15 @@ net::HostResolver::DnsQueryType* output); }; +template <> +struct EnumTraits<network::mojom::ResolveHostParameters::Source, + net::HostResolverSource> { + static network::mojom::ResolveHostParameters::Source ToMojom( + net::HostResolverSource input); + static bool FromMojom(network::mojom::ResolveHostParameters::Source input, + net::HostResolverSource* output); +}; + } // namespace mojo #endif // SERVICES_NETWORK_PUBLIC_CPP_HOST_RESOLVER_MOJOM_TRAITS_H_
diff --git a/services/network/public/mojom/host_resolver.mojom b/services/network/public/mojom/host_resolver.mojom index 91e010e7..769b872 100644 --- a/services/network/public/mojom/host_resolver.mojom +++ b/services/network/public/mojom/host_resolver.mojom
@@ -33,7 +33,7 @@ }; // Parameter-grouping struct for additional optional parameters for -// HostResolver::CreateRequest() calls. All fields are optional and have a +// HostResolver::ResolveHost() calls. All fields are optional and have a // reasonable default. struct ResolveHostParameters { // DNS query type for a ResolveHostRequest. @@ -52,6 +52,32 @@ // The initial net priority for the host resolution request. RequestPriority initial_priority = RequestPriority.kLowest; + // Enumeration to specify the allowed results source for requests. + enum Source { + // Resolver will pick an appropriate source. Results could come from DNS, + // MulticastDNS, HOSTS file, etc. + ANY, + + // Results will only be retrieved from the system or OS, e.g. via the + // getaddrinfo() system call. + SYSTEM, + + // Results will only come from DNS queries. + DNS, + + // TODO(crbug.com/846423): Add MDNS support. + }; + + // The source to use for resolved addresses. Default allows the resolver to + // pick an appropriate source. Only affects use of big external sources (eg + // calling the system for resolution or using DNS). Even if a source is + // specified, results can still come from cache, resolving "localhost" or IP + // literals, etc. + Source source = Source.ANY; + + // If |false|, results will not come from the host cache. + bool allow_cached_response = true; + // If set, the outstanding request can be controlled, eg cancelled, via the // handle. ResolveHostHandle&? control_handle;
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index ef4f7a1..d474f6f 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -499,11 +499,28 @@ MutableNetworkTrafficAnnotationTag traffic_annotation, TCPConnectedSocket& socket, SocketObserver? observer) - => (int32 result, - net.interfaces.IPEndPoint? local_addr, - net.interfaces.IPEndPoint? peer_addr, - handle<data_pipe_consumer>? receive_stream, - handle<data_pipe_producer>? send_stream); + => (int32 result, + net.interfaces.IPEndPoint? local_addr, + net.interfaces.IPEndPoint? peer_addr, + handle<data_pipe_consumer>? receive_stream, + handle<data_pipe_producer>? send_stream); + + // Creates a TCPSocket bound to |local_addr|. The socket created can only be + // used for the purpose specified in |traffic_annotation|, and cannot be + // re-used for other purposes. |local_addr| is treated the same as in + // CreateTCPServerSocket(). + // + // On success, the resulting local address will be written to |local_addr_out| + // and |result| is net::OK. On failure, |result| is a network error code. + // + // It's recommended consumers use CreateTCPServerSocket() or + // CreateTCPConnectedSocket(). This method is just provided so legacy + // consumers can mimic Berkeley sockets semantics. + CreateTCPBoundSocket(net.interfaces.IPEndPoint local_addr, + MutableNetworkTrafficAnnotationTag traffic_annotation, + TCPBoundSocket& socket) + => (int32 result, + net.interfaces.IPEndPoint? local_addr); // Creates a ProxyResolvingSocketFactory that shares some configuration params // with this NetworkContext, but uses separate socket pools.
diff --git a/services/network/public/mojom/p2p.mojom b/services/network/public/mojom/p2p.mojom index 70e0257..ed16c38 100644 --- a/services/network/public/mojom/p2p.mojom +++ b/services/network/public/mojom/p2p.mojom
@@ -52,9 +52,6 @@ }; interface P2PSocket { - AcceptIncomingTcpConnection(net.interfaces.IPEndPoint remote_address, - P2PSocketClient client, - P2PSocket& socket); // TODO(sergeyu): Use shared memory to pass the data. Send(array<int8> data, P2PPacketInfo packet_info, @@ -66,7 +63,9 @@ SocketCreated(net.interfaces.IPEndPoint local_address, net.interfaces.IPEndPoint remote_address); SendComplete(P2PSendPacketMetrics send_metrics); - IncomingTcpConnection(net.interfaces.IPEndPoint socket_address); + IncomingTcpConnection(net.interfaces.IPEndPoint socket_address, + P2PSocket socket, + P2PSocketClient& client); DataReceived(net.interfaces.IPEndPoint socket_address, array<int8> data, mojo_base.mojom.TimeTicks timestamp);
diff --git a/services/network/public/mojom/proxy_resolving_socket.mojom b/services/network/public/mojom/proxy_resolving_socket.mojom index 59cd312b..6b82d3ee 100644 --- a/services/network/public/mojom/proxy_resolving_socket.mojom +++ b/services/network/public/mojom/proxy_resolving_socket.mojom
@@ -6,15 +6,34 @@ import "net/interfaces/ip_endpoint.mojom"; import "services/network/public/mojom/mutable_network_traffic_annotation_tag.mojom"; +import "services/network/public/mojom/network_param.mojom"; +import "services/network/public/mojom/ssl_config.mojom"; +import "services/network/public/mojom/tcp_socket.mojom"; +import "services/network/public/mojom/tls_socket.mojom"; import "url/mojom/url.mojom"; // Represents a connected socket that respects system's proxy settings. Writes // and Reads are through the data pipes supplied upon construction. Consumer // can close the socket by destroying the interface pointer. -interface ProxyResolvingSocket{ +interface ProxyResolvingSocket { // TODO(xunjieli): Add methods to configure the socket connection and allow // consumers to specify whether they want to disconnect or return the socket // to socket pools. + + // Upgrades a proxy socket to a TLS client socket. + // IMPORTANT: Caller needs close the previous send and receive pipes before + // this method can complete asynchronously. + // + // On success, |net_error| is net::OK. Caller is to use |send_stream| to send + // data and |receive_stream| to receive data over the connection. On failure, + // |result| is a network error code. + UpgradeToTLS(HostPortPair host_port_pair, + MutableNetworkTrafficAnnotationTag traffic_annotation, + TLSClientSocket& request, + SocketObserver? observer) + => (int32 net_error, + handle<data_pipe_consumer>? receive_stream, + handle<data_pipe_producer>? send_stream); }; // Factory interface for creating ProxyResolvingSocket. Each factory instance
diff --git a/services/network/public/mojom/tcp_socket.mojom b/services/network/public/mojom/tcp_socket.mojom index c6c5d6a..8128bc2 100644 --- a/services/network/public/mojom/tcp_socket.mojom +++ b/services/network/public/mojom/tcp_socket.mojom
@@ -4,12 +4,39 @@ module network.mojom; +import "net/interfaces/address_list.mojom"; import "net/interfaces/ip_endpoint.mojom"; import "services/network/public/mojom/ssl_config.mojom"; import "services/network/public/mojom/tls_socket.mojom"; import "services/network/public/mojom/network_param.mojom"; import "services/network/public/mojom/mutable_network_traffic_annotation_tag.mojom"; +// Represents a bound TCP socket. Once a call succeeds, cannot be reused. +interface TCPBoundSocket { + // Starts listening on the socket. |net_error| is set to net::OK on success, + // or a network error code on failure. Works just like + // NetworkContext::CreateServerSocket, except it operates on an already bound + // socket. The TCPBoundSocket will be destroyed on completion, whether the + // call succeeds or not. + Listen(uint32 backlog, TCPServerSocket& socket) + => (int32 net_error); + + // Attempts to connect the socket to |remote_addr_list|. |net_error| is set to + // net::OK on success, or a network error code on failure. Works just like + // NetworkContext::CreateTCPConnectedSocket(), except it operates on an + // already bound socket. The TCPBoundSocket will be destroyed on completion, + // whether the call succeeds or not. + Connect( + net.interfaces.IPEndPoint remote_addr, + TCPConnectedSocket& socket, + SocketObserver? observer) + => (int32 net_error, + net.interfaces.IPEndPoint? local_addr, + net.interfaces.IPEndPoint? peer_addr, + handle<data_pipe_consumer>? receive_stream, + handle<data_pipe_producer>? send_stream); +}; + // Represents a connected TCP socket. Writes and Reads are through the data // pipes supplied upon construction. Consumer should use // SocketObserver interface to get notified about any error occurred
diff --git a/services/network/socket_factory.cc b/services/network/socket_factory.cc index 43fbb75a..787d909 100644 --- a/services/network/socket_factory.cc +++ b/services/network/socket_factory.cc
@@ -22,43 +22,16 @@ #include "net/ssl/ssl_config_service.h" #include "net/url_request/url_request_context.h" #include "services/network/ssl_config_type_converter.h" -#include "services/network/tcp_connected_socket.h" #include "services/network/tls_client_socket.h" #include "services/network/udp_socket.h" namespace network { -namespace { -// Cert verifier which blindly accepts all certificates, regardless of validity. -class FakeCertVerifier : public net::CertVerifier { - public: - FakeCertVerifier() {} - ~FakeCertVerifier() override {} - - int Verify(const RequestParams& params, - net::CertVerifyResult* verify_result, - net::CompletionOnceCallback, - std::unique_ptr<Request>*, - const net::NetLogWithSource&) override { - verify_result->Reset(); - verify_result->verified_cert = params.certificate(); - return net::OK; - } - void SetConfig(const Config& config) override {} -}; -} // namespace SocketFactory::SocketFactory(net::NetLog* net_log, net::URLRequestContext* url_request_context) : net_log_(net_log), - ssl_client_socket_context_( - url_request_context->cert_verifier(), - nullptr, /* TODO(rkn): ChannelIDService is not thread safe. */ - url_request_context->transport_security_state(), - url_request_context->cert_transparency_verifier(), - url_request_context->ct_policy_enforcer(), - std::string() /* TODO(rsleevi): Ensure a proper unique shard. */), client_socket_factory_(nullptr), - ssl_config_service_(url_request_context->ssl_config_service()) { + tls_socket_factory_(url_request_context, nullptr /*http_context*/) { if (url_request_context->GetNetworkSessionContext()) { client_socket_factory_ = url_request_context->GetNetworkSessionContext()->client_socket_factory; @@ -102,65 +75,52 @@ mojom::SocketObserverPtr observer, mojom::NetworkContext::CreateTCPConnectedSocketCallback callback) { auto socket = std::make_unique<TCPConnectedSocket>( - std::move(observer), net_log_, this, client_socket_factory_, - traffic_annotation); + std::move(observer), net_log_, &tls_socket_factory_, + client_socket_factory_, traffic_annotation); TCPConnectedSocket* socket_raw = socket.get(); tcp_connected_socket_bindings_.AddBinding(std::move(socket), std::move(request)); socket_raw->Connect(local_addr, remote_addr_list, std::move(callback)); } -void SocketFactory::CreateTLSClientSocket( - const net::HostPortPair& host_port_pair, - mojom::TLSClientSocketOptionsPtr socket_options, - mojom::TLSClientSocketRequest request, - std::unique_ptr<net::ClientSocketHandle> tcp_socket, - mojom::SocketObserverPtr observer, +void SocketFactory::CreateTCPBoundSocket( + const net::IPEndPoint& local_addr, const net::NetworkTrafficAnnotationTag& traffic_annotation, - mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) { - auto socket = std::make_unique<TLSClientSocket>( - std::move(request), std::move(observer), - static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation)); - TLSClientSocket* socket_raw = socket.get(); - tls_socket_bindings_.AddBinding(std::move(socket), std::move(request)); - - net::SSLConfig ssl_config; - ssl_config_service_->GetSSLConfig(&ssl_config); - net::SSLClientSocketContext& ssl_client_socket_context = - ssl_client_socket_context_; - - bool send_ssl_info = false; - if (socket_options) { - ssl_config.version_min = - mojo::MojoSSLVersionToNetSSLVersion(socket_options->version_min); - ssl_config.version_max = - mojo::MojoSSLVersionToNetSSLVersion(socket_options->version_max); - - if (socket_options->skip_cert_verification) { - if (!no_verification_cert_verifier_) { - no_verification_cert_verifier_ = base::WrapUnique(new FakeCertVerifier); - no_verification_transport_security_state_.reset( - new net::TransportSecurityState); - no_verification_cert_transparency_verifier_.reset( - new net::MultiLogCTVerifier()); - no_verification_ct_policy_enforcer_.reset( - new net::DefaultCTPolicyEnforcer()); - no_verification_ssl_client_socket_context_.cert_verifier = - no_verification_cert_verifier_.get(); - no_verification_ssl_client_socket_context_.transport_security_state = - no_verification_transport_security_state_.get(); - no_verification_ssl_client_socket_context_.cert_transparency_verifier = - no_verification_cert_transparency_verifier_.get(); - no_verification_ssl_client_socket_context_.ct_policy_enforcer = - no_verification_ct_policy_enforcer_.get(); - } - ssl_client_socket_context = no_verification_ssl_client_socket_context_; - send_ssl_info = true; - } + mojom::TCPBoundSocketRequest request, + mojom::NetworkContext::CreateTCPBoundSocketCallback callback) { + auto socket = + std::make_unique<TCPBoundSocket>(this, net_log_, traffic_annotation); + net::IPEndPoint local_addr_out; + int result = socket->Bind(local_addr, &local_addr_out); + if (result != net::OK) { + std::move(callback).Run(result, base::nullopt); + return; } - socket_raw->Connect(host_port_pair, ssl_config, std::move(tcp_socket), - ssl_client_socket_context, client_socket_factory_, - std::move(callback), send_ssl_info); + socket->set_id(tcp_bound_socket_bindings_.AddBinding(std::move(socket), + std::move(request))); + std::move(callback).Run(result, local_addr_out); +} + +void SocketFactory::DestroyBoundSocket(mojo::BindingId bound_socket_id) { + tcp_bound_socket_bindings_.RemoveBinding(bound_socket_id); +} + +void SocketFactory::OnBoundSocketListening( + mojo::BindingId bound_socket_id, + std::unique_ptr<TCPServerSocket> server_socket, + mojom::TCPServerSocketRequest server_socket_request) { + tcp_server_socket_bindings_.AddBinding(std::move(server_socket), + std::move(server_socket_request)); + tcp_bound_socket_bindings_.RemoveBinding(bound_socket_id); +} + +void SocketFactory::OnBoundSocketConnected( + mojo::BindingId bound_socket_id, + std::unique_ptr<TCPConnectedSocket> connected_socket, + mojom::TCPConnectedSocketRequest connected_socket_request) { + tcp_connected_socket_bindings_.AddBinding( + std::move(connected_socket), std::move(connected_socket_request)); + tcp_bound_socket_bindings_.RemoveBinding(bound_socket_id); } void SocketFactory::OnAccept(std::unique_ptr<TCPConnectedSocket> socket,
diff --git a/services/network/socket_factory.h b/services/network/socket_factory.h index 31297409..14e0a46 100644 --- a/services/network/socket_factory.h +++ b/services/network/socket_factory.h
@@ -16,16 +16,15 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/tcp_socket.mojom.h" -#include "services/network/public/mojom/tls_socket.mojom.h" #include "services/network/public/mojom/udp_socket.mojom.h" +#include "services/network/tcp_bound_socket.h" #include "services/network/tcp_connected_socket.h" #include "services/network/tcp_server_socket.h" +#include "services/network/tls_socket_factory.h" namespace net { -class ClientSocketHandle; class ClientSocketFactory; class NetLog; -class SSLConfigService; } // namespace net namespace network { @@ -33,8 +32,7 @@ // Helper class that handles socket requests. It takes care of destroying // socket implementation instances when mojo pipes are broken. class COMPONENT_EXPORT(NETWORK_SERVICE) SocketFactory - : public TCPServerSocket::Delegate, - public TCPConnectedSocket::Delegate { + : public TCPServerSocket::Delegate { public: // 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 @@ -43,6 +41,7 @@ net::URLRequestContext* url_request_context); virtual ~SocketFactory(); + // These all correspond to the NetworkContext methods of the same name. void CreateUDPSocket(mojom::UDPSocketRequest request, mojom::UDPSocketReceiverPtr receiver); void CreateTCPServerSocket( @@ -58,41 +57,45 @@ mojom::TCPConnectedSocketRequest request, mojom::SocketObserverPtr observer, mojom::NetworkContext::CreateTCPConnectedSocketCallback callback); + void CreateTCPBoundSocket( + const net::IPEndPoint& local_addr, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPBoundSocketRequest request, + mojom::NetworkContext::CreateTCPBoundSocketCallback callback); + + // Destroys the specified BoundSocket object. + void DestroyBoundSocket(mojo::BindingId bound_socket_id); + + // Invoked when a BoundSocket successfully starts listening. Destroys the + // BoundSocket object, adding a binding for the provided TCPServerSocket in + // its place. + void OnBoundSocketListening( + mojo::BindingId bound_socket_id, + std::unique_ptr<TCPServerSocket> server_socket, + mojom::TCPServerSocketRequest server_socket_request); + + // Invoked when a BoundSocket successfully establishes a connection. Destroys + // the BoundSocket object, adding a binding for the provided + // TCPConnectedSocket in its place. + void OnBoundSocketConnected( + mojo::BindingId bound_socket_id, + std::unique_ptr<TCPConnectedSocket> connected_socket, + mojom::TCPConnectedSocketRequest connected_socket_request); private: // TCPServerSocket::Delegate implementation: void OnAccept(std::unique_ptr<TCPConnectedSocket> socket, mojom::TCPConnectedSocketRequest request) override; - // TCPConnectedSocket::Delegate implementation: - void CreateTLSClientSocket( - const net::HostPortPair& host_port_pair, - mojom::TLSClientSocketOptionsPtr socket_options, - mojom::TLSClientSocketRequest request, - std::unique_ptr<net::ClientSocketHandle> tcp_socket, - mojom::SocketObserverPtr observer, - const net::NetworkTrafficAnnotationTag& traffic_annotation, - mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) override; - net::NetLog* const net_log_; - // The following are used when |skip_cert_verification| is specified in - // upgrade options. - net::SSLClientSocketContext no_verification_ssl_client_socket_context_; - std::unique_ptr<net::CertVerifier> no_verification_cert_verifier_; - std::unique_ptr<net::TransportSecurityState> - no_verification_transport_security_state_; - std::unique_ptr<net::CTVerifier> no_verification_cert_transparency_verifier_; - std::unique_ptr<net::CTPolicyEnforcer> no_verification_ct_policy_enforcer_; - - net::SSLClientSocketContext ssl_client_socket_context_; net::ClientSocketFactory* client_socket_factory_; - net::SSLConfigService* const ssl_config_service_; + TLSSocketFactory tls_socket_factory_; mojo::StrongBindingSet<mojom::UDPSocket> udp_socket_bindings_; mojo::StrongBindingSet<mojom::TCPServerSocket> tcp_server_socket_bindings_; mojo::StrongBindingSet<mojom::TCPConnectedSocket> tcp_connected_socket_bindings_; - mojo::StrongBindingSet<mojom::TLSClientSocket> tls_socket_bindings_; + mojo::StrongBindingSet<mojom::TCPBoundSocket> tcp_bound_socket_bindings_; DISALLOW_COPY_AND_ASSIGN(SocketFactory); };
diff --git a/services/network/tcp_bound_socket.cc b/services/network/tcp_bound_socket.cc new file mode 100644 index 0000000..3eb1054 --- /dev/null +++ b/services/network/tcp_bound_socket.cc
@@ -0,0 +1,155 @@ +// 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 "services/network/tcp_bound_socket.h" + +#include <utility> + +#include "base/bind.h" +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/optional.h" +#include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" +#include "net/log/net_log.h" +#include "net/socket/tcp_client_socket.h" +#include "net/socket/tcp_server_socket.h" +#include "net/socket/tcp_socket.h" +#include "services/network/socket_factory.h" +#include "services/network/tcp_connected_socket.h" + +namespace network { + +TCPBoundSocket::TCPBoundSocket( + SocketFactory* socket_factory, + net::NetLog* net_log, + const net::NetworkTrafficAnnotationTag& traffic_annotation) + : socket_factory_(socket_factory), + socket_(std::make_unique<net::TCPSocket>( + nullptr /*socket_performance_watcher*/, + net_log, + net::NetLogSource())), + traffic_annotation_(traffic_annotation), + weak_factory_(this) {} + +TCPBoundSocket::~TCPBoundSocket() = default; + +int TCPBoundSocket::Bind(const net::IPEndPoint& local_addr, + net::IPEndPoint* local_addr_out) { + int result = socket_->Open(local_addr.GetFamily()); + if (result != net::OK) + return result; + + // This is primarily intended for use with server sockets. + result = socket_->SetDefaultOptionsForServer(); + if (result != net::OK) + return result; + + result = socket_->Bind(local_addr); + if (result != net::OK) + return result; + + return socket_->GetLocalAddress(local_addr_out); +} + +void TCPBoundSocket::Listen(uint32_t backlog, + mojom::TCPServerSocketRequest request, + ListenCallback callback) { + DCHECK(socket_->IsValid()); + + if (connect_callback_) { + // Drop unexpected calls on the floor. Could destroy |this|, but as this is + // currently only reachable from more trusted processes, doesn't seem too + // useful. + NOTREACHED(); + return; + } + + int result = socket_->Listen(backlog); + + // Succeed or fail, pass the result back to the caller. + std::move(callback).Run(result); + + // Tear down everything on error. + if (result != net::OK) { + socket_factory_->DestroyBoundSocket(binding_id_); + return; + } + + // On success, also set up the TCPServerSocket. + std::unique_ptr<TCPServerSocket> server_socket = + std::make_unique<TCPServerSocket>( + std::make_unique<net::TCPServerSocket>(std::move(socket_)), backlog, + socket_factory_, traffic_annotation_); + socket_factory_->OnBoundSocketListening(binding_id_, std::move(server_socket), + std::move(request)); + // The above call will have destroyed |this|. +} + +void TCPBoundSocket::Connect(const net::IPEndPoint& remote_addr, + mojom::TCPConnectedSocketRequest request, + mojom::SocketObserverPtr observer, + ConnectCallback callback) { + DCHECK(socket_->IsValid()); + + if (connect_callback_) { + // Drop unexpected calls on the floor. Could destroy |this|, but as this is + // currently only reachable from more trusted processes, doesn't seem too + // useful. + NOTREACHED(); + return; + } + + connected_socket_request_ = std::move(request); + socket_observer_ = std::move(observer); + connect_callback_ = std::move(callback); + int result = socket_->Connect( + remote_addr, base::BindOnce(&TCPBoundSocket::OnConnectComplete, + base::Unretained(this))); + + if (result == net::ERR_IO_PENDING) + return; + + OnConnectComplete(result); +} + +void TCPBoundSocket::OnConnectComplete(int result) { + DCHECK(connect_callback_); + + net::IPEndPoint peer_addr; + net::IPEndPoint local_addr; + if (result == net::OK) + result = socket_->GetLocalAddress(&local_addr); + if (result == net::OK) + result = socket_->GetPeerAddress(&peer_addr); + + if (result != net::OK) { + std::move(connect_callback_) + .Run(result, base::nullopt /* local_addr */, + base::nullopt /* peer_addr */, + mojo::ScopedDataPipeConsumerHandle(), + mojo::ScopedDataPipeProducerHandle()); + socket_factory_->DestroyBoundSocket(binding_id_); + return; + } + + mojo::DataPipe send_pipe; + mojo::DataPipe receive_pipe; + std::unique_ptr<TCPConnectedSocket> connected_socket = + std::make_unique<TCPConnectedSocket>( + std::move(socket_observer_), + std::make_unique<net::TCPClientSocket>(std::move(socket_), peer_addr), + std::move(receive_pipe.producer_handle), + std::move(send_pipe.consumer_handle), traffic_annotation_); + std::move(connect_callback_) + .Run(result, local_addr, peer_addr, + std::move(receive_pipe.consumer_handle), + std::move(send_pipe.producer_handle)); + socket_factory_->OnBoundSocketConnected(binding_id_, + std::move(connected_socket), + std::move(connected_socket_request_)); + // The above call will have destroyed |this|. +} + +} // namespace network
diff --git a/services/network/tcp_bound_socket.h b/services/network/tcp_bound_socket.h new file mode 100644 index 0000000..fea82ce --- /dev/null +++ b/services/network/tcp_bound_socket.h
@@ -0,0 +1,79 @@ +// 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 SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ +#define SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ + +#include <memory> + +#include "base/component_export.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/interface_request.h" +#include "net/socket/tcp_socket.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/mojom/tcp_socket.mojom.h" +#include "services/network/tcp_server_socket.h" + +namespace net { +class IPEndPoint; +class NetLog; +} // namespace net + +namespace network { +class SocketFactory; + +// A socket bound to an address. Can be converted into either a TCPServerSocket +// or a TCPConnectedSocket. +class COMPONENT_EXPORT(NETWORK_SERVICE) TCPBoundSocket + : public mojom::TCPBoundSocket { + public: + // Constructs a TCPBoundSocket. |socket_factory| must outlive |this|. When a + // new connection is accepted, |socket_factory| will be notified to take + // ownership of the connection. + TCPBoundSocket(SocketFactory* socket_factory, + net::NetLog* net_log, + const net::NetworkTrafficAnnotationTag& traffic_annotation); + ~TCPBoundSocket() override; + + // Attempts to bind a socket to the specified address. Returns net::OK on + // success, setting |local_addr_out| to the bound address. Returns a network + // error code on failure. Must be called before Listen() or Connect(). + int Bind(const net::IPEndPoint& local_addr, net::IPEndPoint* local_addr_out); + + // Sets the id used to remove the socket from the owning BindingSet. Must be + // called before Listen() or Connect(). + void set_id(mojo::BindingId binding_id) { binding_id_ = binding_id; } + + // mojom::TCPBoundSocket implementation. + void Listen(uint32_t backlog, + mojom::TCPServerSocketRequest request, + ListenCallback callback) override; + void Connect(const net::IPEndPoint& remote_addr, + mojom::TCPConnectedSocketRequest request, + mojom::SocketObserverPtr observer, + ConnectCallback callback) override; + + private: + void OnConnectComplete(int result); + + mojo::BindingId binding_id_ = -1; + SocketFactory* const socket_factory_; + std::unique_ptr<net::TCPSocket> socket_; + const net::NetworkTrafficAnnotationTag traffic_annotation_; + + mojom::TCPConnectedSocketRequest connected_socket_request_; + mojom::SocketObserverPtr socket_observer_; + ConnectCallback connect_callback_; + + base::WeakPtrFactory<TCPBoundSocket> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(TCPBoundSocket); +}; + +} // namespace network + +#endif // SERVICES_NETWORK_TCP_BOUND_SOCKET_H_
diff --git a/services/network/tcp_bound_socket_unittest.cc b/services/network/tcp_bound_socket_unittest.cc new file mode 100644 index 0000000..6d8ba7e5 --- /dev/null +++ b/services/network/tcp_bound_socket_unittest.cc
@@ -0,0 +1,353 @@ +// 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 <stdint.h> + +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/run_loop.h" +#include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" +#include "build/build_config.h" +#include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/system/data_pipe_utils.h" +#include "mojo/public/cpp/system/simple_watcher.h" +#include "mojo/public/cpp/system/wait.h" +#include "net/base/ip_address.h" +#include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "net/url_request/url_request_test_util.h" +#include "services/network/mojo_socket_test_util.h" +#include "services/network/public/mojom/tcp_socket.mojom.h" +#include "services/network/socket_factory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace network { +namespace { + +class TCPBoundSocketTest : public testing::Test { + public: + TCPBoundSocketTest() + : scoped_task_environment_( + base::test::ScopedTaskEnvironment::MainThreadType::IO), + factory_(nullptr /* net_log */, &url_request_context_) {} + ~TCPBoundSocketTest() override {} + + SocketFactory* factory() { return &factory_; } + + int BindSocket(const net::IPEndPoint& ip_endpoint_in, + network::mojom::TCPBoundSocketPtr* bound_socket, + net::IPEndPoint* ip_endpoint_out) { + base::RunLoop run_loop; + int bind_result = net::ERR_IO_PENDING; + factory()->CreateTCPBoundSocket( + ip_endpoint_in, TRAFFIC_ANNOTATION_FOR_TESTS, + mojo::MakeRequest(bound_socket), + base::BindLambdaForTesting( + [&](int net_error, + const base::Optional<net::IPEndPoint>& local_addr) { + bind_result = net_error; + if (net_error == net::OK) { + *ip_endpoint_out = *local_addr; + } else { + EXPECT_FALSE(local_addr); + } + run_loop.Quit(); + })); + run_loop.Run(); + + // On error, |bound_socket| should be closed. + if (bind_result != net::OK && !bound_socket->encountered_error()) { + base::RunLoop close_pipe_run_loop; + bound_socket->set_connection_error_handler( + close_pipe_run_loop.QuitClosure()); + close_pipe_run_loop.Run(); + } + return bind_result; + } + + int Listen(network::mojom::TCPBoundSocketPtr bound_socket, + network::mojom::TCPServerSocketPtr* server_socket) { + base::RunLoop bound_socket_destroyed_run_loop; + bound_socket.set_connection_error_handler( + bound_socket_destroyed_run_loop.QuitClosure()); + + base::RunLoop run_loop; + int listen_result = net::ERR_IO_PENDING; + bound_socket->Listen(1 /* backlog */, mojo::MakeRequest(server_socket), + base::BindLambdaForTesting([&](int net_error) { + listen_result = net_error; + run_loop.Quit(); + })); + run_loop.Run(); + + // Whether Bind() fails or succeeds, |bound_socket| is destroyed. + bound_socket_destroyed_run_loop.Run(); + + // On error, |server_socket| should be closed. + if (listen_result != net::OK && !server_socket->encountered_error()) { + base::RunLoop close_pipe_run_loop; + server_socket->set_connection_error_handler( + close_pipe_run_loop.QuitClosure()); + close_pipe_run_loop.Run(); + } + + return listen_result; + } + + int Connect(network::mojom::TCPBoundSocketPtr bound_socket, + const net::IPEndPoint& expected_local_addr, + const net::IPEndPoint& connect_to_addr, + network::mojom::TCPConnectedSocketPtr* connected_socket, + network::mojom::SocketObserverPtr socket_observer, + mojo::ScopedDataPipeConsumerHandle* client_socket_receive_handle, + mojo::ScopedDataPipeProducerHandle* client_socket_send_handle) { + base::RunLoop bound_socket_destroyed_run_loop; + bound_socket.set_connection_error_handler( + bound_socket_destroyed_run_loop.QuitClosure()); + + int connect_result = net::ERR_IO_PENDING; + base::RunLoop run_loop; + bound_socket->Connect( + connect_to_addr, mojo::MakeRequest(connected_socket), + std::move(socket_observer), + base::BindLambdaForTesting( + [&](int net_error, + const base::Optional<net::IPEndPoint>& local_addr, + const base::Optional<net::IPEndPoint>& remote_addr, + mojo::ScopedDataPipeConsumerHandle receive_stream, + mojo::ScopedDataPipeProducerHandle send_stream) { + connect_result = net_error; + if (net_error == net::OK) { + EXPECT_EQ(expected_local_addr, *local_addr); + EXPECT_EQ(connect_to_addr, *remote_addr); + *client_socket_receive_handle = std::move(receive_stream); + *client_socket_send_handle = std::move(send_stream); + } else { + EXPECT_FALSE(local_addr); + EXPECT_FALSE(remote_addr); + EXPECT_FALSE(receive_stream.is_valid()); + EXPECT_FALSE(send_stream.is_valid()); + } + run_loop.Quit(); + })); + run_loop.Run(); + + // Whether Bind() fails or succeeds, |bound_socket| is destroyed. + bound_socket_destroyed_run_loop.Run(); + + // On error, |connected_socket| should be closed. + if (connect_result != net::OK && !connected_socket->encountered_error()) { + base::RunLoop close_pipe_run_loop; + connected_socket->set_connection_error_handler( + close_pipe_run_loop.QuitClosure()); + close_pipe_run_loop.Run(); + } + + return connect_result; + } + + // Attempts to read exactly |expected_bytes| from |receive_handle|. + std::string ReadData(mojo::DataPipeConsumerHandle receive_handle, + uint32_t expected_bytes) { + std::string read_data; + while (read_data.size() < expected_bytes) { + const void* buffer; + uint32_t num_bytes = expected_bytes - read_data.size(); + MojoResult result = receive_handle.BeginReadData( + &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE); + if (result == MOJO_RESULT_SHOULD_WAIT) { + scoped_task_environment_.RunUntilIdle(); + continue; + } + if (result != MOJO_RESULT_OK) { + ADD_FAILURE() << "Read failed"; + return read_data; + } + read_data.append(static_cast<const char*>(buffer), num_bytes); + receive_handle.EndReadData(num_bytes); + } + + return read_data; + } + + static net::IPEndPoint LocalHostWithAnyPort() { + return net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0 /* port */); + } + + base::test::ScopedTaskEnvironment* scoped_task_environment() { + return &scoped_task_environment_; + } + + private: + base::test::ScopedTaskEnvironment scoped_task_environment_; + net::TestURLRequestContext url_request_context_; + SocketFactory factory_; + + DISALLOW_COPY_AND_ASSIGN(TCPBoundSocketTest); +}; + +// Try to bind a socket to an address already being listened on, which should +// fail. +TEST_F(TCPBoundSocketTest, DISABLED_BindError) { + // Set up a listening socket. + network::mojom::TCPBoundSocketPtr bound_socket1; + net::IPEndPoint bound_address1; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket1, + &bound_address1)); + network::mojom::TCPServerSocketPtr server_socket; + ASSERT_EQ(net::OK, Listen(std::move(bound_socket1), &server_socket)); + + // Try to bind another socket to the listening socket's address. + network::mojom::TCPBoundSocketPtr bound_socket2; + net::IPEndPoint bound_address2; + EXPECT_EQ(net::ERR_ADDRESS_IN_USE, + BindSocket(bound_address1, &bound_socket2, &bound_address2)); +} + +// Test the case of a connect error. To cause a connect error, bind a socket, +// but don't listen on it, and then try connecting to it using another bound +// socket. +// +// Don't run on Apple platforms because this pattern ends in a connect timeout +// on OSX (after 25+ seconds) instead of connection refused. +#if !defined(OS_MACOSX) && !defined(OS_IOS) +TEST_F(TCPBoundSocketTest, ConnectError) { + network::mojom::TCPBoundSocketPtr bound_socket1; + net::IPEndPoint bound_address1; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket1, + &bound_address1)); + + // Trying to bind to an address currently being used for listening should + // fail. + network::mojom::TCPBoundSocketPtr bound_socket2; + net::IPEndPoint bound_address2; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket2, + &bound_address2)); + network::mojom::TCPConnectedSocketPtr connected_socket; + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + EXPECT_EQ(net::ERR_CONNECTION_REFUSED, + Connect(std::move(bound_socket2), bound_address2, bound_address1, + &connected_socket, network::mojom::SocketObserverPtr(), + &client_socket_receive_handle, &client_socket_send_handle)); +} +#endif // !defined(OS_MACOSX) && !defined(OS_IOS) + +// Test listen failure. + +// All platforms except Windows use SO_REUSEADDR on server sockets by default, +// which allows binding multiple sockets to the same port at once, as long as +// nothing is listening on it yet. +// +// Apple platforms don't allow binding multiple TCP sockets to the same port +// even with SO_REUSEADDR enabled. +#if !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_IOS) +TEST_F(TCPBoundSocketTest, DISABLED_ListenError) { + // Bind a socket. + network::mojom::TCPBoundSocketPtr bound_socket1; + net::IPEndPoint bound_address1; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket1, + &bound_address1)); + + // Bind another socket to the same address, which should succeed, due to + // SO_REUSEADDR. + network::mojom::TCPBoundSocketPtr bound_socket2; + net::IPEndPoint bound_address2; + ASSERT_EQ(net::OK, + BindSocket(bound_address1, &bound_socket2, &bound_address2)); + + // Listen on the first socket, which should also succeed. + network::mojom::TCPServerSocketPtr server_socket1; + ASSERT_EQ(net::OK, Listen(std::move(bound_socket1), &server_socket1)); + + // Listen on the second socket should fail. + network::mojom::TCPServerSocketPtr server_socket2; + ASSERT_EQ(net::ERR_ADDRESS_IN_USE, + Listen(std::move(bound_socket2), &server_socket2)); +} +#endif // !defined(OS_WIN) && !defined(OS_MACOSX) && !defined(OS_IOS) + +// Test the case bind succeeds, and transfer some data. +TEST_F(TCPBoundSocketTest, ReadWrite) { + // Set up a listening socket. + network::mojom::TCPBoundSocketPtr bound_socket1; + net::IPEndPoint server_address; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket1, + &server_address)); + network::mojom::TCPServerSocketPtr server_socket; + ASSERT_EQ(net::OK, Listen(std::move(bound_socket1), &server_socket)); + + // Connect to the socket with another socket. + network::mojom::TCPBoundSocketPtr bound_socket2; + net::IPEndPoint client_address; + ASSERT_EQ(net::OK, BindSocket(LocalHostWithAnyPort(), &bound_socket2, + &client_address)); + network::mojom::TCPConnectedSocketPtr client_socket; + TestSocketObserver socket_observer; + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + EXPECT_EQ(net::OK, + Connect(std::move(bound_socket2), client_address, server_address, + &client_socket, socket_observer.GetObserverPtr(), + &client_socket_receive_handle, &client_socket_send_handle)); + + base::RunLoop run_loop; + network::mojom::TCPConnectedSocketPtr accept_socket; + mojo::ScopedDataPipeConsumerHandle accept_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle accept_socket_send_handle; + server_socket->Accept( + nullptr /* ovserver */, + base::BindLambdaForTesting( + [&](int net_error, const base::Optional<net::IPEndPoint>& remote_addr, + network::mojom::TCPConnectedSocketPtr connected_socket, + mojo::ScopedDataPipeConsumerHandle receive_stream, + mojo::ScopedDataPipeProducerHandle send_stream) { + EXPECT_EQ(net_error, net::OK); + EXPECT_EQ(*remote_addr, client_address); + accept_socket = std::move(connected_socket); + accept_socket_receive_handle = std::move(receive_stream); + accept_socket_send_handle = std::move(send_stream); + run_loop.Quit(); + })); + run_loop.Run(); + + const std::string kData = "Jumbo Shrimp"; + ASSERT_TRUE(mojo::BlockingCopyFromString(kData, client_socket_send_handle)); + EXPECT_EQ(kData, ReadData(accept_socket_receive_handle.get(), kData.size())); + + ASSERT_TRUE(mojo::BlockingCopyFromString(kData, accept_socket_send_handle)); + EXPECT_EQ(kData, ReadData(client_socket_receive_handle.get(), kData.size())); + + // Close the accept socket. + accept_socket.reset(); + + // Wait for read error on the client socket. + EXPECT_EQ(net::OK, socket_observer.WaitForReadError()); + + // Write data to the client socket until there's an error. + while (true) { + void* buffer = nullptr; + uint32_t buffer_num_bytes = 0; + MojoResult result = client_socket_send_handle->BeginWriteData( + &buffer, &buffer_num_bytes, MOJO_WRITE_DATA_FLAG_NONE); + if (result == MOJO_RESULT_SHOULD_WAIT) { + scoped_task_environment()->RunUntilIdle(); + continue; + } + if (result != MOJO_RESULT_OK) + break; + memset(buffer, 0, buffer_num_bytes); + client_socket_send_handle->EndWriteData(buffer_num_bytes); + } + // Wait for write error on the client socket. Don't check exact error, out of + // paranoia. + EXPECT_LT(socket_observer.WaitForWriteError(), 0); +} + +} // namespace +} // namespace network
diff --git a/services/network/tcp_connected_socket.cc b/services/network/tcp_connected_socket.cc index e6bbbbf..125eca2 100644 --- a/services/network/tcp_connected_socket.cc +++ b/services/network/tcp_connected_socket.cc
@@ -20,13 +20,13 @@ TCPConnectedSocket::TCPConnectedSocket( mojom::SocketObserverPtr observer, net::NetLog* net_log, - Delegate* delegate, + TLSSocketFactory* tls_socket_factory, net::ClientSocketFactory* client_socket_factory, const net::NetworkTrafficAnnotationTag& traffic_annotation) : observer_(std::move(observer)), net_log_(net_log), - delegate_(delegate), client_socket_factory_(client_socket_factory), + tls_socket_factory_(tls_socket_factory), traffic_annotation_(traffic_annotation) {} TCPConnectedSocket::TCPConnectedSocket( @@ -37,8 +37,8 @@ const net::NetworkTrafficAnnotationTag& traffic_annotation) : observer_(std::move(observer)), net_log_(nullptr), - delegate_(nullptr), client_socket_factory_(nullptr), + tls_socket_factory_(nullptr), socket_(std::move(socket)), traffic_annotation_(traffic_annotation) { socket_data_pump_ = std::make_unique<SocketDataPump>( @@ -87,7 +87,7 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojom::TLSClientSocketRequest request, mojom::SocketObserverPtr observer, - UpgradeToTLSCallback callback) { + mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) { // Wait for data pipes to be closed by the client before doing the upgrade. if (socket_data_pump_) { pending_upgrade_to_tls_callback_ = base::BindOnce( @@ -96,19 +96,9 @@ std::move(request), std::move(observer), std::move(callback)); return; } - if (!socket_ || !socket_->IsConnected()) { - std::move(callback).Run( - net::ERR_SOCKET_NOT_CONNECTED, mojo::ScopedDataPipeConsumerHandle(), - mojo::ScopedDataPipeProducerHandle(), base::nullopt); - return; - } - auto socket_handle = std::make_unique<net::ClientSocketHandle>(); - socket_handle->SetSocket(std::move(socket_)); - delegate_->CreateTLSClientSocket( - host_port_pair, std::move(socket_options), std::move(request), - std::move(socket_handle), std::move(observer), - static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), - std::move(callback)); + tls_socket_factory_->UpgradeToTLS( + this, host_port_pair, std::move(socket_options), traffic_annotation, + std::move(request), std::move(observer), std::move(callback)); } void TCPConnectedSocket::SetNoDelay(bool no_delay, @@ -176,4 +166,12 @@ std::move(pending_upgrade_to_tls_callback_).Run(); } +const net::StreamSocket* TCPConnectedSocket::BorrowSocket() { + return socket_.get(); +} + +std::unique_ptr<net::StreamSocket> TCPConnectedSocket::TakeSocket() { + return std::move(socket_); +} + } // namespace network
diff --git a/services/network/tcp_connected_socket.h b/services/network/tcp_connected_socket.h index 3f37d79..94fa8cc8 100644 --- a/services/network/tcp_connected_socket.h +++ b/services/network/tcp_connected_socket.h
@@ -21,11 +21,11 @@ #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/tcp_socket.mojom.h" #include "services/network/socket_data_pump.h" +#include "services/network/tls_socket_factory.h" namespace net { class NetLog; class ClientSocketFactory; -class ClientSocketHandle; class TransportClientSocket; } // namespace net @@ -33,25 +33,13 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) TCPConnectedSocket : public mojom::TCPConnectedSocket, - public SocketDataPump::Delegate { + public SocketDataPump::Delegate, + public TLSSocketFactory::Delegate { public: - // Interface to handle a mojom::TLSClientSocketRequest. - class Delegate { - public: - // Handles a mojom::TLSClientSocketRequest. - virtual void CreateTLSClientSocket( - const net::HostPortPair& host_port_pair, - mojom::TLSClientSocketOptionsPtr socket_options, - mojom::TLSClientSocketRequest request, - std::unique_ptr<net::ClientSocketHandle> tcp_socket, - mojom::SocketObserverPtr observer, - const net::NetworkTrafficAnnotationTag& traffic_annotation, - mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) = 0; - }; TCPConnectedSocket( mojom::SocketObserverPtr observer, net::NetLog* net_log, - Delegate* delegate, + TLSSocketFactory* tls_socket_factory, net::ClientSocketFactory* client_socket_factory, const net::NetworkTrafficAnnotationTag& traffic_annotation); TCPConnectedSocket( @@ -73,7 +61,7 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojom::TLSClientSocketRequest request, mojom::SocketObserverPtr observer, - UpgradeToTLSCallback callback) override; + mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) override; void SetNoDelay(bool no_delay, SetNoDelayCallback callback) override; void SetKeepAlive(bool enable, int32_t delay_secs, @@ -88,11 +76,15 @@ void OnNetworkWriteError(int net_error) override; void OnShutdown() override; + // TLSSocketFactory::Delegate implementation. + const net::StreamSocket* BorrowSocket() override; + std::unique_ptr<net::StreamSocket> TakeSocket() override; + const mojom::SocketObserverPtr observer_; net::NetLog* const net_log_; - Delegate* const delegate_; net::ClientSocketFactory* const client_socket_factory_; + TLSSocketFactory* tls_socket_factory_; std::unique_ptr<net::TransportClientSocket> socket_;
diff --git a/services/network/tcp_server_socket.cc b/services/network/tcp_server_socket.cc index 58ebfe81..a84778ff 100644 --- a/services/network/tcp_server_socket.cc +++ b/services/network/tcp_server_socket.cc
@@ -22,10 +22,20 @@ Delegate* delegate, net::NetLog* net_log, const net::NetworkTrafficAnnotationTag& traffic_annotation) + : TCPServerSocket( + std::make_unique<net::TCPServerSocket>(net_log, net::NetLogSource()), + 0 /*backlog*/, + delegate, + traffic_annotation) {} + +TCPServerSocket::TCPServerSocket( + std::unique_ptr<net::ServerSocket> server_socket, + int backlog, + Delegate* delegate, + const net::NetworkTrafficAnnotationTag& traffic_annotation) : delegate_(delegate), - socket_( - std::make_unique<net::TCPServerSocket>(net_log, net::NetLogSource())), - backlog_(0), + socket_(std::move(server_socket)), + backlog_(backlog), traffic_annotation_(traffic_annotation), weak_factory_(this) {}
diff --git a/services/network/tcp_server_socket.h b/services/network/tcp_server_socket.h index 6fde43c..42e5f04 100644 --- a/services/network/tcp_server_socket.h +++ b/services/network/tcp_server_socket.h
@@ -47,6 +47,13 @@ TCPServerSocket(Delegate* delegate, net::NetLog* net_log, const net::NetworkTrafficAnnotationTag& traffic_annotation); + + // As above, but takes an already listening socket. + TCPServerSocket(std::unique_ptr<net::ServerSocket> server_socket, + int backlog, + Delegate* delegate, + const net::NetworkTrafficAnnotationTag& traffic_annotation); + ~TCPServerSocket() override; int Listen(const net::IPEndPoint& local_addr,
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h index 769ea99..bb39d991 100644 --- a/services/network/test/test_network_context.h +++ b/services/network/test/test_network_context.h
@@ -94,6 +94,11 @@ mojom::TCPConnectedSocketRequest socket, mojom::SocketObserverPtr observer, CreateTCPConnectedSocketCallback callback) override {} + void CreateTCPBoundSocket( + const net::IPEndPoint& local_addr, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPBoundSocketRequest request, + CreateTCPBoundSocketCallback callback) override {} void CreateProxyResolvingSocketFactory( mojom::ProxyResolvingSocketFactoryRequest request) override {} void CreateWebSocket(mojom::WebSocketRequest request,
diff --git a/services/network/throttling/throttling_controller_unittest.cc b/services/network/throttling/throttling_controller_unittest.cc index c23ad02f..1f7b1e5 100644 --- a/services/network/throttling/throttling_controller_unittest.cc +++ b/services/network/throttling/throttling_controller_unittest.cc
@@ -62,7 +62,7 @@ completion_callback_(base::BindRepeating(&TestCallback::Run, base::Unretained(&callback_))), mock_transaction_(kSimpleGET_Transaction), - buffer_(new net::IOBuffer(64)), + buffer_(base::MakeRefCounted<net::IOBuffer>(64)), net_log_(std::make_unique<net::NetLog>()), net_log_with_source_( net::NetLogWithSource::Make(net_log_.get(),
diff --git a/services/network/tls_client_socket_unittest.cc b/services/network/tls_client_socket_unittest.cc index 8a27192..a3fef6e 100644 --- a/services/network/tls_client_socket_unittest.cc +++ b/services/network/tls_client_socket_unittest.cc
@@ -25,6 +25,7 @@ #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request_test_util.h" #include "services/network/mojo_socket_test_util.h" +#include "services/network/proxy_resolving_socket_factory_mojo.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/socket_factory.h" #include "testing/gtest/include/gtest/gtest.h" @@ -43,24 +44,47 @@ class TLSClientSocketTestBase { public: - TLSClientSocketTestBase() - : scoped_task_environment_( + enum Mode { kDirect, kProxyResolving }; + + explicit TLSClientSocketTestBase(Mode mode) + : mode_(mode), + scoped_task_environment_( base::test::ScopedTaskEnvironment::MainThreadType::IO), url_request_context_(true) {} ~TLSClientSocketTestBase() {} protected: + // One of the two fields will be set, depending on the mode. + struct SocketHandle { + mojom::TCPConnectedSocketPtr tcp_socket; + mojom::ProxyResolvingSocketPtr proxy_socket; + }; + + struct SocketRequest { + mojom::TCPConnectedSocketRequest tcp_socket_request; + mojom::ProxyResolvingSocketRequest proxy_socket_request; + }; + // Initializes the test fixture. If |use_mock_sockets|, mock client socket // factory will be used. - void Init(bool use_mock_sockets) { + void Init(bool use_mock_sockets, bool configure_proxy) { if (use_mock_sockets) { mock_client_socket_factory_.set_enable_read_if_ready(true); url_request_context_.set_client_socket_factory( &mock_client_socket_factory_); } + if (configure_proxy) { + proxy_resolution_service_ = net::ProxyResolutionService::CreateFixed( + "http://proxy:8080", TRAFFIC_ANNOTATION_FOR_TESTS); + url_request_context_.set_proxy_resolution_service( + proxy_resolution_service_.get()); + } url_request_context_.Init(); factory_ = std::make_unique<SocketFactory>(nullptr /*net_log*/, &url_request_context_); + proxy_resolving_factory_ = + std::make_unique<ProxyResolvingSocketFactoryMojo>( + &url_request_context_); } // Reads |num_bytes| from |handle| or reads until an error occurs. Returns the @@ -83,6 +107,33 @@ return received_contents; } + SocketRequest MakeRequest(SocketHandle* handle) { + SocketRequest result; + if (mode_ == kDirect) + result.tcp_socket_request = mojo::MakeRequest(&handle->tcp_socket); + else + result.proxy_socket_request = mojo::MakeRequest(&handle->proxy_socket); + return result; + } + + void ResetSocket(SocketHandle* handle) { + if (mode_ == kDirect) + handle->tcp_socket.reset(); + else + handle->proxy_socket.reset(); + } + + int CreateSocketSync(SocketRequest request, + const net::IPEndPoint& remote_addr) { + if (mode_ == kDirect) { + return CreateTCPConnectedSocketSync(std::move(request.tcp_socket_request), + remote_addr); + } else { + return CreateProxyResolvingSocketSync( + std::move(request.proxy_socket_request), remote_addr); + } + } + int CreateTCPConnectedSocketSync(mojom::TCPConnectedSocketRequest request, const net::IPEndPoint& remote_addr) { net::AddressList remote_addr_list(remote_addr); @@ -107,10 +158,48 @@ return net_error; } - void UpgradeToTLS(mojom::TCPConnectedSocket* client_socket, + int CreateProxyResolvingSocketSync(mojom::ProxyResolvingSocketRequest request, + const net::IPEndPoint& remote_addr) { + GURL url("https://" + remote_addr.ToString()); + base::RunLoop run_loop; + int net_error = net::ERR_FAILED; + proxy_resolving_factory_->CreateProxyResolvingSocket( + url, false /* use_tls */, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), + std::move(request), + base::BindLambdaForTesting( + [&](int result, + const base::Optional<net::IPEndPoint>& actual_local_addr, + const base::Optional<net::IPEndPoint>& peer_addr, + mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, + mojo::ScopedDataPipeProducerHandle send_pipe_handle) { + net_error = result; + pre_tls_recv_handle_ = std::move(receive_pipe_handle); + pre_tls_send_handle_ = std::move(send_pipe_handle); + run_loop.Quit(); + })); + run_loop.Run(); + return net_error; + } + + void UpgradeToTLS(SocketHandle* handle, const net::HostPortPair& host_port_pair, mojom::TLSClientSocketRequest request, net::CompletionOnceCallback callback) { + if (mode_ == kDirect) { + UpgradeTCPConnectedSocketToTLS(handle->tcp_socket.get(), host_port_pair, + std::move(request), std::move(callback)); + } else { + UpgradeProxyResolvingSocketToTLS(handle->proxy_socket.get(), + host_port_pair, std::move(request), + std::move(callback)); + } + } + + void UpgradeTCPConnectedSocketToTLS(mojom::TCPConnectedSocket* client_socket, + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketRequest request, + net::CompletionOnceCallback callback) { client_socket->UpgradeToTLS( host_port_pair, nullptr /* ssl_config_ptr */, net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), @@ -130,6 +219,29 @@ &post_tls_send_handle_)); } + void UpgradeProxyResolvingSocketToTLS( + mojom::ProxyResolvingSocket* client_socket, + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketRequest request, + net::CompletionOnceCallback callback) { + client_socket->UpgradeToTLS( + host_port_pair, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), + std::move(request), post_tls_observer()->GetObserverPtr(), + base::BindOnce( + [](net::CompletionOnceCallback cb, + mojo::ScopedDataPipeConsumerHandle* consumer_handle, + mojo::ScopedDataPipeProducerHandle* producer_handle, int result, + mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, + mojo::ScopedDataPipeProducerHandle send_pipe_handle) { + *consumer_handle = std::move(receive_pipe_handle); + *producer_handle = std::move(send_pipe_handle); + std::move(cb).Run(result); + }, + std::move(callback), &post_tls_recv_handle_, + &post_tls_send_handle_)); + } + TestSocketObserver* pre_tls_observer() { return &pre_tls_observer_; } TestSocketObserver* post_tls_observer() { return &post_tls_observer_; } @@ -153,7 +265,10 @@ return &mock_client_socket_factory_; } + Mode mode() const { return mode_; } + private: + Mode mode_; base::test::ScopedTaskEnvironment scoped_task_environment_; // Mojo data handles obtained from CreateTCPConnectedSocket. @@ -164,9 +279,11 @@ mojo::ScopedDataPipeConsumerHandle post_tls_recv_handle_; mojo::ScopedDataPipeProducerHandle post_tls_send_handle_; + std::unique_ptr<net::ProxyResolutionService> proxy_resolution_service_; net::TestURLRequestContext url_request_context_; net::MockClientSocketFactory mock_client_socket_factory_; std::unique_ptr<SocketFactory> factory_; + std::unique_ptr<ProxyResolvingSocketFactoryMojo> proxy_resolving_factory_; TestSocketObserver pre_tls_observer_; TestSocketObserver post_tls_observer_; mojo::StrongBindingSet<mojom::TCPServerSocket> tcp_server_socket_bindings_; @@ -177,11 +294,12 @@ }; } // namespace -class TLSClientSocketTest : public TLSClientSocketTestBase, - public testing::Test { +class TLSClientSocketTest + : public ::testing::TestWithParam<TLSClientSocketTestBase::Mode>, + public TLSClientSocketTestBase { public: - TLSClientSocketTest() : TLSClientSocketTestBase() { - Init(true /* use_mock_sockets */); + TLSClientSocketTest() : TLSClientSocketTestBase(GetParam()) { + Init(true /* use_mock_sockets */, false /* configure_proxy */); } ~TLSClientSocketTest() override {} @@ -192,7 +310,7 @@ // Basic test to call UpgradeToTLS, and then read/write after UpgradeToTLS is // successful. -TEST_F(TLSClientSocketTest, UpgradeToTLS) { +TEST_P(TLSClientSocketTest, UpgradeToTLS) { const net::MockRead kReads[] = {net::MockRead(net::ASYNC, kMsg, kMsgSize, 1), net::MockRead(net::SYNCHRONOUS, net::OK, 2)}; const net::MockWrite kWrites[] = { @@ -203,20 +321,20 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); uint32_t num_bytes = strlen(kMsg); EXPECT_EQ(MOJO_RESULT_OK, post_tls_send_handle()->get().WriteData( @@ -230,7 +348,7 @@ // Same as the UpgradeToTLS test above, except this test calls // base::RunLoop().RunUntilIdle() after destroying the pre-tls data pipes. -TEST_F(TLSClientSocketTest, ClosePipesRunUntilIdleAndUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ClosePipesRunUntilIdleAndUpgradeToTLS) { const net::MockRead kReads[] = {net::MockRead(net::ASYNC, kMsg, kMsgSize, 1), net::MockRead(net::SYNCHRONOUS, net::OK, 2)}; const net::MockWrite kWrites[] = { @@ -241,10 +359,10 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); @@ -256,10 +374,10 @@ net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); uint32_t num_bytes = strlen(kMsg); EXPECT_EQ(MOJO_RESULT_OK, post_tls_send_handle()->get().WriteData( @@ -273,7 +391,7 @@ // Calling UpgradeToTLS on the same TCPConnectedSocketPtr is illegal and should // receive an error. -TEST_F(TLSClientSocketTest, UpgradeToTLSTwice) { +TEST_P(TLSClientSocketTest, UpgradeToTLSTwice) { const net::MockRead kReads[] = {net::MockRead(net::ASYNC, net::OK, 0)}; net::SequencedSocketData data_provider(kReads, base::span<net::MockWrite>()); data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); @@ -281,10 +399,10 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); @@ -293,26 +411,40 @@ // First UpgradeToTLS should complete successfully. net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); // Second time UpgradeToTLS is called, it should fail. mojom::TLSClientSocketPtr tls_socket2; base::RunLoop run_loop; int net_error = net::ERR_FAILED; - client_socket->UpgradeToTLS( - host_port_pair, nullptr /* ssl_config_ptr */, - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), - mojo::MakeRequest(&tls_socket2), nullptr /*observer */, - base::BindLambdaForTesting( - [&](int result, - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, - mojo::ScopedDataPipeProducerHandle send_pipe_handle, - const base::Optional<net::SSLInfo>& ssl_info) { - net_error = result; - run_loop.Quit(); - })); + if (mode() == kDirect) { + auto upgrade2_callback = base::BindLambdaForTesting( + [&](int result, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, + mojo::ScopedDataPipeProducerHandle send_pipe_handle, + const base::Optional<net::SSLInfo>& ssl_info) { + net_error = result; + run_loop.Quit(); + }); + client_socket.tcp_socket->UpgradeToTLS( + host_port_pair, nullptr /* ssl_config_ptr */, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), + mojo::MakeRequest(&tls_socket2), nullptr /*observer */, + std::move(upgrade2_callback)); + } else { + auto upgrade2_callback = base::BindLambdaForTesting( + [&](int result, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, + mojo::ScopedDataPipeProducerHandle send_pipe_handle) { + net_error = result; + run_loop.Quit(); + }); + client_socket.proxy_socket->UpgradeToTLS( + host_port_pair, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), + mojo::MakeRequest(&tls_socket2), nullptr /*observer */, + std::move(upgrade2_callback)); + } run_loop.Run(); ASSERT_EQ(net::ERR_SOCKET_NOT_CONNECTED, net_error); @@ -322,7 +454,10 @@ EXPECT_TRUE(data_provider.AllWriteDataConsumed()); } -TEST_F(TLSClientSocketTest, UpgradeToTLSWithCustomSSLConfig) { +TEST_P(TLSClientSocketTest, UpgradeToTLSWithCustomSSLConfig) { + // No custom options in the proxy-resolving case. + if (mode() != kDirect) + return; const net::MockRead kReads[] = {net::MockRead(net::ASYNC, net::OK, 0)}; net::SequencedSocketData data_provider(kReads, base::span<net::MockWrite>()); data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); @@ -332,10 +467,10 @@ ssl_socket.expected_ssl_version_max = net::SSL_PROTOCOL_VERSION_TLS1_2; mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); @@ -348,18 +483,18 @@ options->version_min = mojom::SSLVersion::kTLS11; options->version_max = mojom::SSLVersion::kTLS12; int net_error = net::ERR_FAILED; - client_socket->UpgradeToTLS( + auto upgrade_callback = base::BindLambdaForTesting( + [&](int result, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, + mojo::ScopedDataPipeProducerHandle send_pipe_handle, + const base::Optional<net::SSLInfo>& ssl_info) { + net_error = result; + run_loop.Quit(); + }); + client_socket.tcp_socket->UpgradeToTLS( host_port_pair, std::move(options), net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), mojo::MakeRequest(&tls_socket), nullptr /*observer */, - base::BindLambdaForTesting( - [&](int result, - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, - mojo::ScopedDataPipeProducerHandle send_pipe_handle, - const base::Optional<net::SSLInfo>& ssl_info) { - net_error = result; - run_loop.Quit(); - })); + std::move(upgrade_callback)); run_loop.Run(); ASSERT_EQ(net::OK, net_error); @@ -371,7 +506,7 @@ // Same as the UpgradeToTLS test, except this also reads and writes to the tcp // connection before UpgradeToTLS is called. -TEST_F(TLSClientSocketTest, ReadWriteBeforeUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ReadWriteBeforeUpgradeToTLS) { const net::MockRead kReads[] = { net::MockRead(net::SYNCHRONOUS, kMsg, kMsgSize, 0), net::MockRead(net::ASYNC, kSecretMsg, kSecretMsgSize, 3), @@ -386,10 +521,10 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); EXPECT_EQ(kMsg, Read(pre_tls_recv_handle(), kMsgSize)); @@ -402,10 +537,10 @@ pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -420,7 +555,7 @@ // Tests that a read error is encountered after UpgradeToTLS completes // successfully. -TEST_F(TLSClientSocketTest, ReadErrorAfterUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ReadErrorAfterUpgradeToTLS) { const net::MockRead kReads[] = { net::MockRead(net::ASYNC, kSecretMsg, kSecretMsgSize, 1), net::MockRead(net::SYNCHRONOUS, net::ERR_CONNECTION_CLOSED, 2)}; @@ -432,20 +567,20 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); uint32_t num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -463,7 +598,7 @@ // Tests that a read error is encountered after UpgradeToTLS completes // successfully. -TEST_F(TLSClientSocketTest, WriteErrorAfterUpgradeToTLS) { +TEST_P(TLSClientSocketTest, WriteErrorAfterUpgradeToTLS) { const net::MockRead kReads[] = {net::MockRead(net::ASYNC, net::OK, 0)}; const net::MockWrite kWrites[] = { net::MockWrite(net::SYNCHRONOUS, net::ERR_CONNECTION_CLOSED, 1)}; @@ -473,20 +608,20 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); uint32_t num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -503,7 +638,7 @@ // Tests that reading from the pre-tls data pipe is okay even after UpgradeToTLS // is called. -TEST_F(TLSClientSocketTest, ReadFromPreTlsDataPipeAfterUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ReadFromPreTlsDataPipeAfterUpgradeToTLS) { const net::MockRead kReads[] = { net::MockRead(net::ASYNC, kMsg, kMsgSize, 0), net::MockRead(net::ASYNC, kSecretMsg, kSecretMsgSize, 2), @@ -516,17 +651,17 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); base::RunLoop().RunUntilIdle(); EXPECT_EQ(kMsg, Read(pre_tls_recv_handle(), kMsgSize)); @@ -534,7 +669,7 @@ // Reset pre-tls receive pipe now and UpgradeToTLS should complete. pre_tls_recv_handle()->reset(); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); uint32_t num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -549,7 +684,7 @@ // Tests that writing to the pre-tls data pipe is okay even after UpgradeToTLS // is called. -TEST_F(TLSClientSocketTest, WriteToPreTlsDataPipeAfterUpgradeToTLS) { +TEST_P(TLSClientSocketTest, WriteToPreTlsDataPipeAfterUpgradeToTLS) { const net::MockRead kReads[] = { net::MockRead(net::ASYNC, kSecretMsg, kSecretMsgSize, 2), net::MockRead(net::SYNCHRONOUS, net::OK, 3)}; @@ -562,17 +697,17 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); base::RunLoop().RunUntilIdle(); uint32_t num_bytes = strlen(kMsg); @@ -582,7 +717,7 @@ // Reset pre-tls send pipe now and UpgradeToTLS should complete. pre_tls_send_handle()->reset(); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -597,7 +732,7 @@ // Tests that reading from and writing to pre-tls data pipe is okay even after // UpgradeToTLS is called. -TEST_F(TLSClientSocketTest, ReadAndWritePreTlsDataPipeAfterUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ReadAndWritePreTlsDataPipeAfterUpgradeToTLS) { const net::MockRead kReads[] = { net::MockRead(net::ASYNC, kMsg, kMsgSize, 0), net::MockRead(net::ASYNC, kSecretMsg, kSecretMsgSize, 3), @@ -611,17 +746,17 @@ net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); base::RunLoop run_loop; net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); EXPECT_EQ(kMsg, Read(pre_tls_recv_handle(), kMsgSize)); uint32_t num_bytes = strlen(kMsg); EXPECT_EQ(MOJO_RESULT_OK, pre_tls_send_handle()->get().WriteData( @@ -631,7 +766,7 @@ pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); num_bytes = strlen(kSecretMsg); EXPECT_EQ(MOJO_RESULT_OK, @@ -645,7 +780,11 @@ } // Tests that a read error is encountered before UpgradeToTLS completes. -TEST_F(TLSClientSocketTest, ReadErrorBeforeUpgradeToTLS) { +TEST_P(TLSClientSocketTest, ReadErrorBeforeUpgradeToTLS) { + // This requires pre_tls_observer(), which is not provided by proxy resolving + // sockets. + if (mode() != kDirect) + return; const net::MockRead kReads[] = { net::MockRead(net::ASYNC, kMsg, kMsgSize, 0), net::MockRead(net::SYNCHRONOUS, net::ERR_CONNECTION_CLOSED, 1)}; @@ -653,17 +792,17 @@ data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); mock_client_socket_factory()->AddSocketDataProvider(&data_provider); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); EXPECT_EQ(kMsg, Read(pre_tls_recv_handle(), kMsgSize)); EXPECT_EQ(net::ERR_CONNECTION_CLOSED, pre_tls_observer()->WaitForReadError()); @@ -671,7 +810,7 @@ // Reset pre-tls receive pipe now and UpgradeToTLS should complete. pre_tls_recv_handle()->reset(); ASSERT_EQ(net::ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data_provider.AllReadDataConsumed()); @@ -679,7 +818,12 @@ } // Tests that a write error is encountered before UpgradeToTLS completes. -TEST_F(TLSClientSocketTest, WriteErrorBeforeUpgradeToTLS) { +TEST_P(TLSClientSocketTest, WriteErrorBeforeUpgradeToTLS) { + // This requires pre_tls_observer(), which is not provided by proxy resolving + // sockets. + if (mode() != kDirect) + return; + const net::MockRead kReads[] = {net::MockRead(net::ASYNC, net::OK, 1)}; const net::MockWrite kWrites[] = { net::MockWrite(net::SYNCHRONOUS, net::ERR_CONNECTION_CLOSED, 0)}; @@ -687,17 +831,17 @@ data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); mock_client_socket_factory()->AddSocketDataProvider(&data_provider); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); net::HostPortPair host_port_pair("example.org", 443); pre_tls_recv_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); uint32_t num_bytes = strlen(kMsg); EXPECT_EQ(MOJO_RESULT_OK, pre_tls_send_handle()->get().WriteData( &kMsg, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE)); @@ -707,7 +851,7 @@ // Reset pre-tls send pipe now and UpgradeToTLS should complete. pre_tls_send_handle()->reset(); ASSERT_EQ(net::ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); base::RunLoop().RunUntilIdle(); // Write failed before the mock read can be consumed. @@ -715,25 +859,91 @@ EXPECT_TRUE(data_provider.AllWriteDataConsumed()); } -class TLSClientSocketParameterizedTest - : public TLSClientSocketTestBase, - public testing::TestWithParam<net::IoMode> { +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + TLSClientSocketTest, + ::testing::Values(TLSClientSocketTestBase::kDirect, + TLSClientSocketTestBase::kProxyResolving)); + +// Tests with proxy resolving socket and a proxy actually configured. +class TLSCLientSocketProxyTest : public ::testing::Test, + public TLSClientSocketTestBase { public: - TLSClientSocketParameterizedTest() : TLSClientSocketTestBase() { - Init(true /* use_mock_sockets*/); + TLSCLientSocketProxyTest() + : TLSClientSocketTestBase(TLSClientSocketTestBase::kProxyResolving) { + Init(true /* use_mock_sockets*/, true /* configure_proxy */); } - ~TLSClientSocketParameterizedTest() override {} + ~TLSCLientSocketProxyTest() override {} private: - DISALLOW_COPY_AND_ASSIGN(TLSClientSocketParameterizedTest); + DISALLOW_COPY_AND_ASSIGN(TLSCLientSocketProxyTest); +}; + +TEST_F(TLSCLientSocketProxyTest, UpgradeToTLS) { + const char kConnectRequest[] = + "CONNECT 127.0.0.1:1234 HTTP/1.1\r\n" + "Host: 127.0.0.1:1234\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const char kConnectResponse[] = "HTTP/1.1 200 OK\r\n\r\n"; + + const net::MockRead kReads[] = { + net::MockRead(net::ASYNC, kConnectResponse, strlen(kConnectResponse), 1), + net::MockRead(net::ASYNC, kMsg, kMsgSize, 3), + net::MockRead(net::SYNCHRONOUS, net::OK, 4)}; + const net::MockWrite kWrites[] = { + net::MockWrite(net::ASYNC, kConnectRequest, strlen(kConnectRequest), 0), + net::MockWrite(net::SYNCHRONOUS, kMsg, kMsgSize, 2)}; + net::SequencedSocketData data_provider(kReads, kWrites); + data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); + mock_client_socket_factory()->AddSocketDataProvider(&data_provider); + net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK); + mock_client_socket_factory()->AddSSLSocketDataProvider(&ssl_socket); + + SocketHandle client_socket; + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); + + net::HostPortPair host_port_pair("example.org", 443); + pre_tls_recv_handle()->reset(); + pre_tls_send_handle()->reset(); + net::TestCompletionCallback callback; + mojom::TLSClientSocketPtr tls_socket; + UpgradeToTLS(&client_socket, host_port_pair, mojo::MakeRequest(&tls_socket), + callback.callback()); + ASSERT_EQ(net::OK, callback.WaitForResult()); + ResetSocket(&client_socket); + + uint32_t num_bytes = strlen(kMsg); + EXPECT_EQ(MOJO_RESULT_OK, post_tls_send_handle()->get().WriteData( + &kMsg, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE)); + EXPECT_EQ(kMsg, Read(post_tls_recv_handle(), kMsgSize)); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(ssl_socket.ConnectDataConsumed()); + EXPECT_TRUE(data_provider.AllReadDataConsumed()); + EXPECT_TRUE(data_provider.AllWriteDataConsumed()); +} + +class TLSClientSocketIoModeTest : public TLSClientSocketTestBase, + public testing::TestWithParam<net::IoMode> { + public: + TLSClientSocketIoModeTest() + : TLSClientSocketTestBase(TLSClientSocketTestBase::kDirect) { + Init(true /* use_mock_sockets*/, false /* configure_proxy */); + } + + ~TLSClientSocketIoModeTest() override {} + + private: + DISALLOW_COPY_AND_ASSIGN(TLSClientSocketIoModeTest); }; INSTANTIATE_TEST_CASE_P(/* no prefix */, - TLSClientSocketParameterizedTest, + TLSClientSocketIoModeTest, testing::Values(net::SYNCHRONOUS, net::ASYNC)); -TEST_P(TLSClientSocketParameterizedTest, MultipleWriteToTLSSocket) { +TEST_P(TLSClientSocketIoModeTest, MultipleWriteToTLSSocket) { const int kNumIterations = 3; std::vector<net::MockRead> reads; std::vector<net::MockWrite> writes; @@ -768,8 +978,9 @@ pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), host_port_pair, - mojo::MakeRequest(&tls_socket), callback.callback()); + UpgradeTCPConnectedSocketToTLS(client_socket.get(), host_port_pair, + mojo::MakeRequest(&tls_socket), + callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); client_socket.reset(); @@ -794,11 +1005,12 @@ } class TLSClientSocketTestWithEmbeddedTestServer - : public TLSClientSocketTestBase, - public testing::Test { + : public ::testing::TestWithParam<TLSClientSocketTestBase::Mode>, + public TLSClientSocketTestBase { public: - TLSClientSocketTestWithEmbeddedTestServer() : TLSClientSocketTestBase() { - Init(false /* use_mock_sockets */); + TLSClientSocketTestWithEmbeddedTestServer() + : TLSClientSocketTestBase(GetParam()) { + Init(false /* use_mock_sockets */, false /* configure_proxy */); } ~TLSClientSocketTestWithEmbeddedTestServer() override {} @@ -807,7 +1019,7 @@ DISALLOW_COPY_AND_ASSIGN(TLSClientSocketTestWithEmbeddedTestServer); }; -TEST_F(TLSClientSocketTestWithEmbeddedTestServer, Basic) { +TEST_P(TLSClientSocketTestWithEmbeddedTestServer, Basic) { net::EmbeddedTestServer server(net::EmbeddedTestServer::TYPE_HTTPS); server.RegisterRequestHandler( base::BindRepeating([](const net::test_server::HttpRequest& request) { @@ -822,19 +1034,19 @@ server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); ASSERT_TRUE(server.Start()); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), server.port()); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), server.host_port_pair(), + UpgradeToTLS(&client_socket, server.host_port_pair(), mojo::MakeRequest(&tls_socket), callback.callback()); ASSERT_EQ(net::OK, callback.WaitForResult()); - client_socket.reset(); + ResetSocket(&client_socket); const char kTestMsg[] = "GET /secret HTTP/1.1\r\n\r\n"; uint32_t num_bytes = strlen(kTestMsg); @@ -845,23 +1057,29 @@ EXPECT_EQ(kResponse, Read(post_tls_recv_handle(), strlen(kResponse))); } -TEST_F(TLSClientSocketTestWithEmbeddedTestServer, ServerCertError) { +TEST_P(TLSClientSocketTestWithEmbeddedTestServer, ServerCertError) { net::EmbeddedTestServer server(net::EmbeddedTestServer::TYPE_HTTPS); server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); ASSERT_TRUE(server.Start()); - mojom::TCPConnectedSocketPtr client_socket; + SocketHandle client_socket; net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), server.port()); - EXPECT_EQ(net::OK, CreateTCPConnectedSocketSync( - mojo::MakeRequest(&client_socket), server_addr)); + EXPECT_EQ(net::OK, + CreateSocketSync(MakeRequest(&client_socket), server_addr)); pre_tls_recv_handle()->reset(); pre_tls_send_handle()->reset(); net::TestCompletionCallback callback; mojom::TLSClientSocketPtr tls_socket; - UpgradeToTLS(client_socket.get(), server.host_port_pair(), + UpgradeToTLS(&client_socket, server.host_port_pair(), mojo::MakeRequest(&tls_socket), callback.callback()); ASSERT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult()); } +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + TLSClientSocketTestWithEmbeddedTestServer, + ::testing::Values(TLSClientSocketTestBase::kDirect, + TLSClientSocketTestBase::kProxyResolving)); + } // namespace network
diff --git a/services/network/tls_socket_factory.cc b/services/network/tls_socket_factory.cc new file mode 100644 index 0000000..a5010ad --- /dev/null +++ b/services/network/tls_socket_factory.cc
@@ -0,0 +1,151 @@ +// 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 "services/network/tls_socket_factory.h" + +#include <string> +#include <utility> + +#include "base/optional.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/type_converter.h" +#include "net/base/completion_once_callback.h" +#include "net/base/net_errors.h" +#include "net/cert/cert_verifier.h" +#include "net/cert/ct_policy_enforcer.h" +#include "net/cert/multi_log_ct_verifier.h" +#include "net/socket/client_socket_factory.h" +#include "net/socket/client_socket_handle.h" +#include "net/ssl/ssl_config.h" +#include "net/ssl/ssl_config_service.h" +#include "net/url_request/url_request_context.h" +#include "services/network/ssl_config_type_converter.h" +#include "services/network/tls_client_socket.h" + +namespace network { +namespace { +// Cert verifier which blindly accepts all certificates, regardless of validity. +class FakeCertVerifier : public net::CertVerifier { + public: + FakeCertVerifier() {} + ~FakeCertVerifier() override {} + + int Verify(const RequestParams& params, + net::CertVerifyResult* verify_result, + net::CompletionOnceCallback, + std::unique_ptr<Request>*, + const net::NetLogWithSource&) override { + verify_result->Reset(); + verify_result->verified_cert = params.certificate(); + return net::OK; + } + void SetConfig(const Config& config) override {} +}; +} // namespace + +TLSSocketFactory::TLSSocketFactory( + net::URLRequestContext* url_request_context, + const net::HttpNetworkSession::Context* http_context) + : ssl_client_socket_context_( + url_request_context->cert_verifier(), + nullptr, /* TODO(rkn): ChannelIDService is not thread safe. */ + url_request_context->transport_security_state(), + url_request_context->cert_transparency_verifier(), + url_request_context->ct_policy_enforcer(), + std::string() /* TODO(rsleevi): Ensure a proper unique shard. */), + client_socket_factory_(nullptr), + ssl_config_service_(url_request_context->ssl_config_service()) { + if (http_context) { + client_socket_factory_ = http_context->client_socket_factory; + } + + if (!client_socket_factory_ && + url_request_context->GetNetworkSessionContext()) { + client_socket_factory_ = + url_request_context->GetNetworkSessionContext()->client_socket_factory; + } + if (!client_socket_factory_) + client_socket_factory_ = net::ClientSocketFactory::GetDefaultFactory(); +} + +TLSSocketFactory::~TLSSocketFactory() {} + +void TLSSocketFactory::UpgradeToTLS( + Delegate* socket_delegate, + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketOptionsPtr socket_options, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TLSClientSocketRequest request, + mojom::SocketObserverPtr observer, + UpgradeToTLSCallback callback) { + const net::StreamSocket* socket = socket_delegate->BorrowSocket(); + if (!socket || !socket->IsConnected()) { + std::move(callback).Run( + net::ERR_SOCKET_NOT_CONNECTED, mojo::ScopedDataPipeConsumerHandle(), + mojo::ScopedDataPipeProducerHandle(), base::nullopt); + return; + } + auto socket_handle = std::make_unique<net::ClientSocketHandle>(); + socket_handle->SetSocket(socket_delegate->TakeSocket()); + CreateTLSClientSocket( + host_port_pair, std::move(socket_options), std::move(request), + std::move(socket_handle), std::move(observer), + static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), + std::move(callback)); +} + +void TLSSocketFactory::CreateTLSClientSocket( + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketOptionsPtr socket_options, + mojom::TLSClientSocketRequest request, + std::unique_ptr<net::ClientSocketHandle> underlying_socket, + mojom::SocketObserverPtr observer, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPConnectedSocket::UpgradeToTLSCallback callback) { + auto socket = std::make_unique<TLSClientSocket>( + std::move(request), std::move(observer), + static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation)); + TLSClientSocket* socket_raw = socket.get(); + tls_socket_bindings_.AddBinding(std::move(socket), std::move(request)); + + net::SSLConfig ssl_config; + ssl_config_service_->GetSSLConfig(&ssl_config); + net::SSLClientSocketContext& ssl_client_socket_context = + ssl_client_socket_context_; + + bool send_ssl_info = false; + if (socket_options) { + ssl_config.version_min = + mojo::MojoSSLVersionToNetSSLVersion(socket_options->version_min); + ssl_config.version_max = + mojo::MojoSSLVersionToNetSSLVersion(socket_options->version_max); + + if (socket_options->skip_cert_verification) { + if (!no_verification_cert_verifier_) { + no_verification_cert_verifier_ = base::WrapUnique(new FakeCertVerifier); + no_verification_transport_security_state_.reset( + new net::TransportSecurityState); + no_verification_cert_transparency_verifier_.reset( + new net::MultiLogCTVerifier()); + no_verification_ct_policy_enforcer_.reset( + new net::DefaultCTPolicyEnforcer()); + no_verification_ssl_client_socket_context_.cert_verifier = + no_verification_cert_verifier_.get(); + no_verification_ssl_client_socket_context_.transport_security_state = + no_verification_transport_security_state_.get(); + no_verification_ssl_client_socket_context_.cert_transparency_verifier = + no_verification_cert_transparency_verifier_.get(); + no_verification_ssl_client_socket_context_.ct_policy_enforcer = + no_verification_ct_policy_enforcer_.get(); + } + ssl_client_socket_context = no_verification_ssl_client_socket_context_; + send_ssl_info = true; + } + } + socket_raw->Connect(host_port_pair, ssl_config, std::move(underlying_socket), + ssl_client_socket_context, client_socket_factory_, + std::move(callback), send_ssl_info); +} + +} // namespace network
diff --git a/services/network/tls_socket_factory.h b/services/network/tls_socket_factory.h new file mode 100644 index 0000000..437c8df --- /dev/null +++ b/services/network/tls_socket_factory.h
@@ -0,0 +1,96 @@ +// 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 SERVICES_NETWORK_TLS_SOCKET_FACTORY_H_ +#define SERVICES_NETWORK_TLS_SOCKET_FACTORY_H_ + +#include <memory> +#include <vector> + +#include "base/component_export.h" +#include "base/macros.h" +#include "mojo/public/cpp/bindings/strong_binding_set.h" +#include "net/http/http_network_session.h" +#include "net/socket/ssl_client_socket.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/mojom/network_service.mojom.h" +#include "services/network/public/mojom/tls_socket.mojom.h" + +namespace net { +class ClientSocketHandle; +class ClientSocketFactory; +class SSLConfigService; +} // namespace net + +namespace network { + +// Helper class that handles TLS socket requests. +class COMPONENT_EXPORT(NETWORK_SERVICE) TLSSocketFactory { + public: + class Delegate { + public: + virtual const net::StreamSocket* BorrowSocket() = 0; + virtual std::unique_ptr<net::StreamSocket> TakeSocket() = 0; + }; + + // See documentation of UpgradeToTLS in tcp_socket.mojom for + // the semantics of the results. + using UpgradeToTLSCallback = + base::OnceCallback<void(int32_t net_error, + mojo::ScopedDataPipeConsumerHandle receive_stream, + mojo::ScopedDataPipeProducerHandle send_stream, + const base::Optional<net::SSLInfo>& ssl_info)>; + + // Constructs a TLSSocketFactory. If |net_log| is non-null, it is used to + // log NetLog events when logging is enabled. |net_log| used to must outlive + // |this|. Sockets will be created using, the earliest available from: + // 1) A ClientSocketFactory set on a non-null |http_context|. + // 2) A ClientSocketFactory set on |url_request_context|'s + // HttpNetworkSession::Context + // 3) The default ClientSocketFactory. + TLSSocketFactory(net::URLRequestContext* url_request_context, + const net::HttpNetworkSession::Context* http_context); + virtual ~TLSSocketFactory(); + + // Upgrades an existing socket to TLS. The previous pipes and data pump + // must already have been destroyed before the call to this method. + void UpgradeToTLS( + Delegate* socket_delegate, + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketOptionsPtr socket_options, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + mojom::TLSClientSocketRequest request, + mojom::SocketObserverPtr observer, + UpgradeToTLSCallback callback); + + private: + void CreateTLSClientSocket( + const net::HostPortPair& host_port_pair, + mojom::TLSClientSocketOptionsPtr socket_options, + mojom::TLSClientSocketRequest request, + std::unique_ptr<net::ClientSocketHandle> socket, + mojom::SocketObserverPtr observer, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + mojom::TCPConnectedSocket::UpgradeToTLSCallback callback); + + // The following are used when |skip_cert_verification| is specified in + // upgrade options. + net::SSLClientSocketContext no_verification_ssl_client_socket_context_; + std::unique_ptr<net::CertVerifier> no_verification_cert_verifier_; + std::unique_ptr<net::TransportSecurityState> + no_verification_transport_security_state_; + std::unique_ptr<net::CTVerifier> no_verification_cert_transparency_verifier_; + std::unique_ptr<net::CTPolicyEnforcer> no_verification_ct_policy_enforcer_; + + net::SSLClientSocketContext ssl_client_socket_context_; + net::ClientSocketFactory* client_socket_factory_; + net::SSLConfigService* const ssl_config_service_; + mojo::StrongBindingSet<mojom::TLSClientSocket> tls_socket_bindings_; + + DISALLOW_COPY_AND_ASSIGN(TLSSocketFactory); +}; + +} // namespace network + +#endif // SERVICES_NETWORK_SOCKET_FACTORY_H_
diff --git a/services/network/udp_socket.cc b/services/network/udp_socket.cc index 6eea7f1..7902b60 100644 --- a/services/network/udp_socket.cc +++ b/services/network/udp_socket.cc
@@ -332,7 +332,8 @@ DCHECK_GT(remaining_recv_slots_, 0u); DCHECK_GE(kMaxReadSize, buffer_size); - recvfrom_buffer_ = new net::IOBuffer(static_cast<size_t>(buffer_size)); + recvfrom_buffer_ = + base::MakeRefCounted<net::IOBuffer>(static_cast<size_t>(buffer_size)); // base::Unretained(this) is safe because socket is owned by |this|. int net_result = wrapped_socket_->RecvFrom( @@ -360,8 +361,7 @@ // |data| points to a range of bytes in the received message and will be // freed when this method returns, so copy out the bytes now. - scoped_refptr<net::IOBufferWithSize> buffer = - new net::IOBufferWithSize(data.size()); + auto buffer = base::MakeRefCounted<net::IOBufferWithSize>(data.size()); memcpy(buffer.get()->data(), data.begin(), data.size()); if (send_buffer_.get()) {
diff --git a/services/network/websocket.cc b/services/network/websocket.cc index ed70e6ce..55e853a 100644 --- a/services/network/websocket.cc +++ b/services/network/websocket.cc
@@ -385,7 +385,7 @@ DCHECK(IsKnownEnumValue(type)); // TODO(darin): Avoid this copy. - scoped_refptr<net::IOBuffer> data_to_pass(new net::IOBuffer(data.size())); + auto data_to_pass = base::MakeRefCounted<net::IOBuffer>(data.size()); std::copy(data.begin(), data.end(), data_to_pass->data()); channel_->SendFrame(fin, MessageTypeToOpCode(type), std::move(data_to_pass),
diff --git a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.cc b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.cc index e8fd4c0..9ccd80d 100644 --- a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.cc +++ b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.cc
@@ -65,8 +65,10 @@ } void PageCoordinationUnitImpl::OnMainFrameNavigationCommitted( + base::TimeTicks navigation_committed_time, int64_t navigation_id, const std::string& url) { + navigation_committed_time_ = navigation_committed_time; main_frame_url_ = url; navigation_id_ = navigation_id; SendEvent(mojom::Event::kNavigationCommitted); @@ -144,9 +146,6 @@ } void PageCoordinationUnitImpl::OnEventReceived(mojom::Event event) { - if (event == mojom::Event::kNavigationCommitted) { - navigation_committed_time_ = ResourceCoordinatorClock::NowTicks(); - } for (auto& observer : observers()) observer.OnPageEventReceived(this, event); }
diff --git a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h index b5de73a..89d8fcd 100644 --- a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h +++ b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h
@@ -35,7 +35,8 @@ void SetUKMSourceId(int64_t ukm_source_id) override; void OnFaviconUpdated() override; void OnTitleUpdated() override; - void OnMainFrameNavigationCommitted(int64_t navigation_id, + void OnMainFrameNavigationCommitted(base::TimeTicks navigation_committed_time, + int64_t navigation_id, const std::string& url) override; // There is no direct relationship between processes and pages. However,
diff --git a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl_unittest.cc b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl_unittest.cc index cf4075dc..491bd0d 100644 --- a/services/resource_coordinator/coordination_unit/page_coordination_unit_impl_unittest.cc +++ b/services/resource_coordinator/coordination_unit/page_coordination_unit_impl_unittest.cc
@@ -173,7 +173,8 @@ EXPECT_TRUE(cu_graph.page->TimeSinceLastNavigation().is_zero()); // 1st navigation. - cu_graph.page->OnMainFrameNavigationCommitted(10u, "http://www.example.org"); + cu_graph.page->OnMainFrameNavigationCommitted( + ResourceCoordinatorClock::NowTicks(), 10u, "http://www.example.org"); EXPECT_EQ("http://www.example.org", cu_graph.page->main_frame_url()); EXPECT_EQ(10u, cu_graph.page->navigation_id()); AdvanceClock(base::TimeDelta::FromSeconds(11)); @@ -182,7 +183,8 @@ // 2nd navigation. cu_graph.page->OnMainFrameNavigationCommitted( - 20u, "http://www.example.org/bobcat"); + ResourceCoordinatorClock::NowTicks(), 20u, + "http://www.example.org/bobcat"); EXPECT_EQ("http://www.example.org/bobcat", cu_graph.page->main_frame_url()); EXPECT_EQ(20u, cu_graph.page->navigation_id()); AdvanceClock(base::TimeDelta::FromSeconds(17));
diff --git a/services/resource_coordinator/observers/ipc_volume_reporter_unittest.cc b/services/resource_coordinator/observers/ipc_volume_reporter_unittest.cc index 8d35567..a1604034 100644 --- a/services/resource_coordinator/observers/ipc_volume_reporter_unittest.cc +++ b/services/resource_coordinator/observers/ipc_volume_reporter_unittest.cc
@@ -55,7 +55,8 @@ cu_graph.page->SetUKMSourceId(1); cu_graph.page->OnFaviconUpdated(); cu_graph.page->OnTitleUpdated(); - cu_graph.page->OnMainFrameNavigationCommitted(1u, "http://example.org"); + cu_graph.page->OnMainFrameNavigationCommitted( + ResourceCoordinatorClock::NowTicks(), 1u, "http://example.org"); cu_graph.process->SetCPUUsage(1.0); cu_graph.process->SetExpectedTaskQueueingDuration(
diff --git a/services/resource_coordinator/observers/metrics_collector_unittest.cc b/services/resource_coordinator/observers/metrics_collector_unittest.cc index 861d14c..38eae02e 100644 --- a/services/resource_coordinator/observers/metrics_collector_unittest.cc +++ b/services/resource_coordinator/observers/metrics_collector_unittest.cc
@@ -67,7 +67,8 @@ auto frame_cu = CreateCoordinationUnit<FrameCoordinationUnitImpl>(); page_cu->AddFrame(frame_cu->id()); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); AdvanceClock(kTestMetricsReportDelayTimeout); page_cu->SetVisibility(true); @@ -119,7 +120,8 @@ page_cu->AddFrame(frame_cu->id()); page_cu->SetVisibility(false); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); frame_cu->SetAudibility(true); // The page is within 5 minutes after main frame navigation was committed, // thus no metrics recorded. @@ -135,7 +137,8 @@ TEST_F(MAYBE_MetricsCollectorTest, FromBackgroundedToFirstTitleUpdatedUMA) { auto page_cu = CreateCoordinationUnit<PageCoordinationUnitImpl>(); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); AdvanceClock(kTestMetricsReportDelayTimeout); page_cu->SetVisibility(true); @@ -167,7 +170,8 @@ FromBackgroundedToFirstTitleUpdatedUMA5MinutesTimeout) { auto page_cu = CreateCoordinationUnit<PageCoordinationUnitImpl>(); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); page_cu->SetVisibility(false); page_cu->OnTitleUpdated(); // The page is within 5 minutes after main frame navigation was committed, @@ -185,7 +189,8 @@ auto frame_cu = CreateCoordinationUnit<FrameCoordinationUnitImpl>(); page_cu->AddFrame(frame_cu->id()); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); AdvanceClock(kTestMetricsReportDelayTimeout); page_cu->SetVisibility(true); @@ -219,7 +224,8 @@ auto frame_cu = CreateCoordinationUnit<FrameCoordinationUnitImpl>(); page_cu->AddFrame(frame_cu->id()); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); page_cu->SetVisibility(false); frame_cu->OnAlertFired(); // The page is within 5 minutes after main frame navigation was committed, @@ -238,7 +244,8 @@ auto frame_cu = CreateCoordinationUnit<FrameCoordinationUnitImpl>(); page_cu->AddFrame(frame_cu->id()); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); AdvanceClock(kTestMetricsReportDelayTimeout); page_cu->SetVisibility(true); @@ -273,7 +280,8 @@ auto frame_cu = CreateCoordinationUnit<FrameCoordinationUnitImpl>(); page_cu->AddFrame(frame_cu->id()); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); page_cu->SetVisibility(false); frame_cu->OnNonPersistentNotificationCreated(); // The page is within 5 minutes after main frame navigation was committed, @@ -289,7 +297,8 @@ TEST_F(MAYBE_MetricsCollectorTest, FromBackgroundedToFirstFaviconUpdatedUMA) { auto page_cu = CreateCoordinationUnit<PageCoordinationUnitImpl>(); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); AdvanceClock(kTestMetricsReportDelayTimeout); page_cu->SetVisibility(true); @@ -321,7 +330,8 @@ FromBackgroundedToFirstFaviconUpdatedUMA5MinutesTimeout) { auto page_cu = CreateCoordinationUnit<PageCoordinationUnitImpl>(); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); page_cu->SetVisibility(false); page_cu->OnFaviconUpdated(); // The page is within 5 minutes after main frame navigation was committed, @@ -350,7 +360,8 @@ GURL url = GURL("https://google.com/foobar"); ukm_recorder.UpdateSourceURL(id, url); page_cu->SetUKMSourceId(id); - page_cu->OnMainFrameNavigationCommitted(kDummyID, kDummyUrl); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + kDummyID, kDummyUrl); for (int count = 1; count < kDefaultFrequencyUkmEQTReported; ++count) { process_cu->SetExpectedTaskQueueingDuration(
diff --git a/services/resource_coordinator/observers/page_signal_generator_impl.cc b/services/resource_coordinator/observers/page_signal_generator_impl.cc index ea9c4bd..e6d19a2b 100644 --- a/services/resource_coordinator/observers/page_signal_generator_impl.cc +++ b/services/resource_coordinator/observers/page_signal_generator_impl.cc
@@ -242,6 +242,7 @@ data->last_state_change < measurement_start) { DispatchPageSignal( page, &mojom::PageSignalReceiver::OnLoadTimePerformanceEstimate, + page->TimeSinceLastNavigation(), page->cumulative_cpu_usage_estimate(), page->private_footprint_kb_estimate()); data->performance_estimate_issued = true;
diff --git a/services/resource_coordinator/observers/page_signal_generator_impl_unittest.cc b/services/resource_coordinator/observers/page_signal_generator_impl_unittest.cc index d11af0c..1ba999f 100644 --- a/services/resource_coordinator/observers/page_signal_generator_impl_unittest.cc +++ b/services/resource_coordinator/observers/page_signal_generator_impl_unittest.cc
@@ -63,8 +63,9 @@ void(const PageNavigationIdentity& page_navigation_id)); MOCK_METHOD1(NotifyRendererIsBloated, void(const PageNavigationIdentity& page_navigation_id)); - MOCK_METHOD3(OnLoadTimePerformanceEstimate, + MOCK_METHOD4(OnLoadTimePerformanceEstimate, void(const PageNavigationIdentity& page_navigation_id, + base::TimeDelta load_duration, base::TimeDelta cpu_usage_estimate, uint64_t private_footprint_kb_estimate)); @@ -308,7 +309,8 @@ EXPECT_FALSE(page_data->idling_timer.IsRunning()); // Post a navigation. The state should reset. - page_cu->OnMainFrameNavigationCommitted(1, "https://www.example.org"); + page_cu->OnMainFrameNavigationCommitted(ResourceCoordinatorClock::NowTicks(), + 1, "https://www.example.org"); EXPECT_EQ(LIS::kLoadingNotStarted, page_data->GetLoadIdleState()); EXPECT_FALSE(page_data->idling_timer.IsRunning()); } @@ -426,7 +428,10 @@ PageSignalGeneratorImpl::PageData* page_data = psg->GetPageData(page_cu); page_data->idling_timer.SetTaskRunner(task_env().GetMainThreadTaskRunner()); - page_cu->OnMainFrameNavigationCommitted(1, "https://www.google.com/"); + base::TimeTicks navigation_committed_time = + ResourceCoordinatorClock::NowTicks(); + page_cu->OnMainFrameNavigationCommitted(navigation_committed_time, 1, + "https://www.google.com/"); DrivePageToLoadedAndIdle(&cu_graph); base::TimeTicks event_time = ResourceCoordinatorClock::NowTicks(); @@ -449,6 +454,7 @@ EXPECT_CALL(mock_receiver, OnLoadTimePerformanceEstimate( IdentityMatches(cu_graph.page->id(), 1u, "https://www.google.com/"), + event_time - navigation_committed_time, base::TimeDelta::FromMicroseconds(15), 150)) .WillOnce( ::testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); @@ -459,7 +465,9 @@ ::testing::Mock::VerifyAndClear(&mock_receiver); // Make sure a second run around the state machine generates a second event. - page_cu->OnMainFrameNavigationCommitted(2, "https://example.org/bobcat"); + navigation_committed_time = ResourceCoordinatorClock::NowTicks(); + page_cu->OnMainFrameNavigationCommitted(navigation_committed_time, 2, + "https://example.org/bobcat"); task_env().FastForwardUntilNoTasksRemain(); EXPECT_NE(LIS::kLoadedAndIdle, page_data->GetLoadIdleState()); @@ -477,6 +485,7 @@ OnLoadTimePerformanceEstimate( IdentityMatches(cu_graph.page->id(), 2u, "https://example.org/bobcat"), + event_time - navigation_committed_time, base::TimeDelta::FromMicroseconds(25), 250)) .WillOnce( ::testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
diff --git a/services/resource_coordinator/public/cpp/page_resource_coordinator.cc b/services/resource_coordinator/public/cpp/page_resource_coordinator.cc index 911be476..ddf98d4 100644 --- a/services/resource_coordinator/public/cpp/page_resource_coordinator.cc +++ b/services/resource_coordinator/public/cpp/page_resource_coordinator.cc
@@ -47,11 +47,13 @@ } void PageResourceCoordinator::OnMainFrameNavigationCommitted( + base::TimeTicks navigation_committed_time, uint64_t navigation_id, const std::string& url) { if (!service_) return; - service_->OnMainFrameNavigationCommitted(navigation_id, url); + service_->OnMainFrameNavigationCommitted(navigation_committed_time, + navigation_id, url); } void PageResourceCoordinator::AddFrame(const FrameResourceCoordinator& frame) {
diff --git a/services/resource_coordinator/public/cpp/page_resource_coordinator.h b/services/resource_coordinator/public/cpp/page_resource_coordinator.h index fad8831..d475e208 100644 --- a/services/resource_coordinator/public/cpp/page_resource_coordinator.h +++ b/services/resource_coordinator/public/cpp/page_resource_coordinator.h
@@ -7,6 +7,7 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" +#include "base/time/time.h" #include "services/resource_coordinator/public/cpp/frame_resource_coordinator.h" #include "services/resource_coordinator/public/cpp/resource_coordinator_interface.h" #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h" @@ -25,7 +26,8 @@ void SetUKMSourceId(int64_t ukm_source_id); void OnFaviconUpdated(); void OnTitleUpdated(); - void OnMainFrameNavigationCommitted(uint64_t navigation_id, + void OnMainFrameNavigationCommitted(base::TimeTicks navigation_committed_time, + uint64_t navigation_id, const std::string& url); void AddFrame(const FrameResourceCoordinator& frame);
diff --git a/services/resource_coordinator/public/mojom/coordination_unit.mojom b/services/resource_coordinator/public/mojom/coordination_unit.mojom index a07ee41..b2fb5bb 100644 --- a/services/resource_coordinator/public/mojom/coordination_unit.mojom +++ b/services/resource_coordinator/public/mojom/coordination_unit.mojom
@@ -89,9 +89,12 @@ OnFaviconUpdated(); OnTitleUpdated(); + // |navigation_committed_time| is the time when the commit occurred. // |navigation_id| is the unique ID of the navigation handle that was // committed. - OnMainFrameNavigationCommitted(int64 navigation_id, string url); + OnMainFrameNavigationCommitted( + mojo_base.mojom.TimeTicks navigation_committed_time, + int64 navigation_id, string url); }; interface ProcessCoordinationUnit {
diff --git a/services/resource_coordinator/public/mojom/page_signal.mojom b/services/resource_coordinator/public/mojom/page_signal.mojom index 584dfc1..ecb2c2c 100644 --- a/services/resource_coordinator/public/mojom/page_signal.mojom +++ b/services/resource_coordinator/public/mojom/page_signal.mojom
@@ -53,7 +53,17 @@ // This notification needs the url that was loaded, as by the time the // notification comes back around, the WebContents may have navigated to // another site altogether. + // |load_duration| is the wall-clock duration from navigation commit, until + // the page is considered loaded (currently almost idle). + // |cpu_usage_estimate| is an estimate of how much CPU time was consumed by + // this page load across all the the processes involved. This is approximate + // primarily because it's impossible to accurately approportion the cost + // of shared processes to individual pages. Other considerations involve + // the timing of measurement, as well as the fact that there's no accounting + // for processes that contributed to a page in the past, but no longer do + // so at the time of measurement. OnLoadTimePerformanceEstimate(PageNavigationIdentity page_navigation_id, + mojo_base.mojom.TimeDelta load_duration, mojo_base.mojom.TimeDelta cpu_usage_estimate, uint64 private_footprint_kb_estimate); };
diff --git a/services/service_manager/manifest.json b/services/service_manager/manifest.json index 368a0a6..15feb7b 100644 --- a/services/service_manager/manifest.json +++ b/services/service_manager/manifest.json
@@ -10,9 +10,6 @@ // TODO(rockot): Fix this. We can bake this file into ServiceManager at // build time or something. Same with service:catalog. "provides": { - // Clients requesting this class are able to connect to other clients as - // specific users other than their own. - "service_manager:user_id": [ ], // Clients requesting this class are allowed to register clients for // processes they launch themselves. "service_manager:client_process": [ ],
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn index 941a65b..d6568cf5 100644 --- a/services/service_manager/sandbox/BUILD.gn +++ b/services/service_manager/sandbox/BUILD.gn
@@ -33,6 +33,8 @@ ] if (is_linux) { sources += [ + "linux/bpf_audio_policy_linux.cc", + "linux/bpf_audio_policy_linux.h", "linux/bpf_base_policy_linux.cc", "linux/bpf_base_policy_linux.h", "linux/bpf_broker_policy_linux.cc", @@ -62,6 +64,10 @@ "linux/sandbox_seccomp_bpf_linux.cc", "linux/sandbox_seccomp_bpf_linux.h", ] + configs += [ + "//media:media_config", + "//media/audio:platform_config", + ] deps += [ ":chromecast_sandbox_whitelist_buildflags", "//sandbox:sandbox_buildflags",
diff --git a/services/service_manager/sandbox/linux/bpf_audio_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_audio_policy_linux.cc new file mode 100644 index 0000000..af8906fd6 --- /dev/null +++ b/services/service_manager/sandbox/linux/bpf_audio_policy_linux.cc
@@ -0,0 +1,107 @@ +// 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 "services/service_manager/sandbox/linux/bpf_audio_policy_linux.h" + +#include <sys/socket.h> + +#include "sandbox/linux/bpf_dsl/bpf_dsl.h" +#include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h" +#include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" +#include "sandbox/linux/syscall_broker/broker_process.h" +#include "sandbox/linux/system_headers/linux_futex.h" +#include "sandbox/linux/system_headers/linux_syscalls.h" +#include "services/service_manager/sandbox/linux/sandbox_linux.h" + +using sandbox::bpf_dsl::Allow; +using sandbox::bpf_dsl::Arg; +using sandbox::bpf_dsl::Error; +using sandbox::bpf_dsl::If; +using sandbox::bpf_dsl::ResultExpr; +using sandbox::bpf_dsl::Trap; +using sandbox::syscall_broker::BrokerProcess; + +namespace service_manager { + +AudioProcessPolicy::AudioProcessPolicy() = default; + +AudioProcessPolicy::~AudioProcessPolicy() = default; + +ResultExpr AudioProcessPolicy::EvaluateSyscall(int system_call_number) const { + switch (system_call_number) { +#if defined(__NR_connect) + case __NR_connect: +#endif +#if defined(__NR_ftruncate) + case __NR_ftruncate: +#endif +#if defined(__NR_getdents) + case __NR_getdents: +#endif +#if defined(__NR_getpeername) + case __NR_getpeername: +#endif +#if defined(__NR_getsockopt) + case __NR_getsockopt: +#endif +#if defined(__NR_getsockname) + case __NR_getsockname: +#endif +#if defined(__NR_ioctl) + case __NR_ioctl: +#endif +#if defined(__NR_memfd_create) + case __NR_memfd_create: +#endif +#if defined(__NR_sched_setscheduler) + case __NR_sched_setscheduler: +#endif +#if defined(__NR_setsockopt) + case __NR_setsockopt: +#endif +#if defined(__NR_uname) + case __NR_uname: +#endif + return Allow(); +#if defined(__NR_futex) + case __NR_futex: { + const Arg<int> op(1); +#if defined(USE_PULSEAUDIO) + return Switch(op & ~FUTEX_PRIVATE_FLAG) + .SANDBOX_BPF_DSL_CASES( + (FUTEX_CMP_REQUEUE, FUTEX_LOCK_PI, FUTEX_UNLOCK_PI, FUTEX_WAIT, + FUTEX_WAIT_BITSET, FUTEX_WAKE), + Allow()) + .Default(Error(EPERM)); +#else + return sandbox::RestrictFutex(); +#endif + } +#endif +#if defined(__NR_socket) + case __NR_socket: { + const Arg<int> domain(0); + return If(domain == AF_UNIX, Allow()).Else(Error(EPERM)); + } +#endif + default: +#if defined(__x86_64__) + if (sandbox::SyscallSets::IsSystemVSemaphores(system_call_number) || + sandbox::SyscallSets::IsSystemVSharedMemory(system_call_number)) { + return Allow(); + } +#elif defined(__i386__) + if (sandbox::SyscallSets::IsSystemVIpc(system_call_number)) + return Allow(); +#endif + + auto* broker_process = SandboxLinux::GetInstance()->broker_process(); + if (broker_process->IsSyscallAllowed(system_call_number)) + return Trap(BrokerProcess::SIGSYS_Handler, broker_process); + + return BPFBasePolicy::EvaluateSyscall(system_call_number); + } +} + +} // namespace service_manager
diff --git a/services/service_manager/sandbox/linux/bpf_audio_policy_linux.h b/services/service_manager/sandbox/linux/bpf_audio_policy_linux.h new file mode 100644 index 0000000..afbab1f9 --- /dev/null +++ b/services/service_manager/sandbox/linux/bpf_audio_policy_linux.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 SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_AUDIO_POLICY_LINUX_H_ +#define SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_AUDIO_POLICY_LINUX_H_ + +#include "sandbox/linux/bpf_dsl/bpf_dsl.h" +#include "services/service_manager/sandbox/export.h" +#include "services/service_manager/sandbox/linux/bpf_base_policy_linux.h" + +namespace service_manager { + +class SERVICE_MANAGER_SANDBOX_EXPORT AudioProcessPolicy : public BPFBasePolicy { + public: + AudioProcessPolicy(); + ~AudioProcessPolicy() override; + + sandbox::bpf_dsl::ResultExpr EvaluateSyscall( + int system_call_number) const override; + + private: + DISALLOW_COPY_AND_ASSIGN(AudioProcessPolicy); +}; + +} // namespace service_manager + +#endif // SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_AUDIO_POLICY_LINUX_H_
diff --git a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc index 42dd173..0d30c1d 100644 --- a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc +++ b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
@@ -11,6 +11,7 @@ #include <sys/types.h> #include <memory> +#include <utility> #include "base/command_line.h" #include "base/logging.h" @@ -32,6 +33,7 @@ #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" #include "sandbox/linux/system_headers/linux_syscalls.h" +#include "services/service_manager/sandbox/linux/bpf_audio_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_base_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_cdm_policy_linux.h" #include "services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.h" @@ -165,6 +167,8 @@ return std::make_unique<PdfCompositorProcessPolicy>(); case SANDBOX_TYPE_NETWORK: return std::make_unique<NetworkProcessPolicy>(); + case SANDBOX_TYPE_AUDIO: + return std::make_unique<AudioProcessPolicy>(); case SANDBOX_TYPE_NO_SANDBOX: default: NOTREACHED();
diff --git a/services/service_manager/sandbox/sandbox_type.cc b/services/service_manager/sandbox/sandbox_type.cc index 9a9568a..3db45b3 100644 --- a/services/service_manager/sandbox/sandbox_type.cc +++ b/services/service_manager/sandbox/sandbox_type.cc
@@ -21,7 +21,7 @@ return true; #endif case SANDBOX_TYPE_AUDIO: -#if defined(OS_WIN) || defined(OS_MACOSX) +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) return !base::FeatureList::IsEnabled( service_manager::features::kAudioServiceSandbox); #else
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc index 31e8182..90e9538 100644 --- a/services/service_manager/service_manager.cc +++ b/services/service_manager/service_manager.cc
@@ -47,7 +47,6 @@ namespace { -const char kCapability_UserID[] = "service_manager:user_id"; const char kCapability_ClientProcess[] = "service_manager:client_process"; const char kCapability_InstanceName[] = "service_manager:instance_name"; const char kCapability_ServiceManager[] = "service_manager:service_manager"; @@ -614,7 +613,7 @@ options_.instance_sharing == catalog::ServiceOptions::InstanceSharingType:: SHARED_INSTANCE_ACROSS_USERS || - HasCapability(connection_spec, kCapability_UserID); + options_.can_connect_to_other_services_as_any_user; if (!skip_user_check && target.user_id() != identity_.user_id() && target.user_id() != mojom::kRootUserID) {
diff --git a/services/service_manager/tests/connect/connect_test_app_manifest.json b/services/service_manager/tests/connect/connect_test_app_manifest.json index 23b68c4..075126b 100644 --- a/services/service_manager/tests/connect/connect_test_app_manifest.json +++ b/services/service_manager/tests/connect/connect_test_app_manifest.json
@@ -1,6 +1,7 @@ { "name": "connect_test_app", "display_name": "Connect Test App", + "options": { "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { "provides": { @@ -18,8 +19,7 @@ "connect_test_class_app": [ "connect_unittests:class", "connect_unittests:connect_test_service" - ], - "service_manager": [ "service_manager:user_id" ] + ] } } }
diff --git a/services/service_manager/tests/connect/connect_test_sandboxed_app_manifest.json b/services/service_manager/tests/connect/connect_test_sandboxed_app_manifest.json index 5da4f33..af49639 100644 --- a/services/service_manager/tests/connect/connect_test_sandboxed_app_manifest.json +++ b/services/service_manager/tests/connect/connect_test_sandboxed_app_manifest.json
@@ -2,13 +2,9 @@ "name": "connect_test_sandboxed_app", "display_name": "Sandboxed Connect Test App", "sandbox_type": "superduper", + "options": { "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { - "provides": { - }, - "requires": { - "service_manager": [ "service_manager:user_id" ] - } } } }
diff --git a/services/service_manager/tests/connect/connect_unittests_manifest.json b/services/service_manager/tests/connect/connect_unittests_manifest.json index 736c570..5434489 100644 --- a/services/service_manager/tests/connect/connect_unittests_manifest.json +++ b/services/service_manager/tests/connect/connect_unittests_manifest.json
@@ -1,6 +1,7 @@ { "name": "connect_unittests", "display_name": "Connect Unittests", + "options": { "can_connect_to_other_services_as_any_user": true }, "interface_provider_specs": { "service_manager:connector": { "provides": { @@ -27,8 +28,7 @@ ], "connect_test_singleton_app": [], "service_manager": [ - "service_manager:instance_name", - "service_manager:user_id" + "service_manager:instance_name" ] } }
diff --git a/services/ws/BUILD.gn b/services/ws/BUILD.gn index e22d19b..e2dd1d7 100644 --- a/services/ws/BUILD.gn +++ b/services/ws/BUILD.gn
@@ -83,6 +83,10 @@ "//ui/wm/public", ] + deps = [ + "//services/ws/public/cpp", + ] + defines = [ "IS_WINDOW_SERVICE_IMPL" ] }
diff --git a/services/ws/public/cpp/property_type_converters.cc b/services/ws/public/cpp/property_type_converters.cc index 8e0300d..aa61e57 100644 --- a/services/ws/public/cpp/property_type_converters.cc +++ b/services/ws/public/cpp/property_type_converters.cc
@@ -206,4 +206,18 @@ return !input.empty() && (input[0] == 1); } +// static +std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, uint64_t>::Convert( + uint64_t input) { + return TypeConverter<std::vector<uint8_t>, int64_t>::Convert( + static_cast<int64_t>(input)); +} + +// static +ws::Id TypeConverter<uint64_t, std::vector<uint8_t>>::Convert( + const std::vector<uint8_t>& input) { + return static_cast<uint64_t>( + TypeConverter<int64_t, std::vector<uint8_t>>::Convert(input)); +} + } // namespace mojo
diff --git a/services/ws/public/cpp/property_type_converters.h b/services/ws/public/cpp/property_type_converters.h index 2ed9b54..ad9f923 100644 --- a/services/ws/public/cpp/property_type_converters.h +++ b/services/ws/public/cpp/property_type_converters.h
@@ -10,6 +10,7 @@ #include "base/strings/string16.h" #include "mojo/public/cpp/bindings/type_converter.h" +#include "services/ws/common/types.h" class SkBitmap; @@ -109,6 +110,15 @@ static base::UnguessableToken Convert(const std::vector<uint8_t>& input); }; +template <> +struct TypeConverter<std::vector<uint8_t>, uint64_t> { + static std::vector<uint8_t> Convert(uint64_t input); +}; +template <> +struct TypeConverter<uint64_t, std::vector<uint8_t>> { + static uint64_t Convert(const std::vector<uint8_t>& input); +}; + } // namespace mojo #endif // SERVICES_WS_PUBLIC_CPP_PROPERTY_TYPE_CONVERTERS_H_
diff --git a/services/ws/public/mojom/window_manager.mojom b/services/ws/public/mojom/window_manager.mojom index 91e433d..b047b23 100644 --- a/services/ws/public/mojom/window_manager.mojom +++ b/services/ws/public/mojom/window_manager.mojom
@@ -78,6 +78,9 @@ // "com.google.Photos". Type: mojom::String. const string kArcPackageName_Property = "prop:arc-package-name"; + // The modal parent of a child modal window. Type: window Id. + const string kChildModalParent_Property = "prop:child-modal-parent"; + // Whether the window is trying to draw attention to itself (e.g. pulsing its // shelf icon). Type: bool. const string kDrawAttention_Property = "prop:draw-attention";
diff --git a/services/ws/public/mojom/window_tree.mojom b/services/ws/public/mojom/window_tree.mojom index 6fc6e0b..c9505cee 100644 --- a/services/ws/public/mojom/window_tree.mojom +++ b/services/ws/public/mojom/window_tree.mojom
@@ -126,10 +126,12 @@ gfx.mojom.Insets insets, array<gfx.mojom.Rect>? additional_client_areas); - // Mouse events outside a hit test mask do not hit the window. The |mask| is - // in window local coordinates. Pass null to clear the mask. - // TODO(jamescook): Convert |mask| to a path. http://crbug.com/613210 - SetHitTestMask(uint64 window_id, gfx.mojom.Rect? mask); + // Insets the hit test of a window by the specified values. The insets must be + // positive (or zero). |mouse| applies to events originating from the mouse, + // and |touch| from a non-mouse pointer device (such as tap). + SetHitTestInsets(uint64 window_id, + gfx.mojom.Insets mouse, + gfx.mojom.Insets touch); // Called by clients that want to accept drag and drops. Windows default to // this being disabled; a window must actively opt-in to receiving OnDrag*() @@ -197,12 +199,6 @@ // . Client does not have a valid user id (i.e., it is an embedded app). SetModalType(uint32 change_id, uint64 window_id, ui.mojom.ModalType type); - // Sets the modal parent of a CHILD_MODAL window. This is the modal parent of - // the window, which is not necessarily the same as the parent of the window. - SetChildModalParent(uint32 change_id, - uint64 window_id, - uint64 parent_window_id); - // Reorders a window in its parent, relative to |relative_window_id| according // to |direction|. Only the connection that created the window's parent can // reorder its children.
diff --git a/services/ws/server_window.cc b/services/ws/server_window.cc index 72f86d97..f756f45 100644 --- a/services/ws/server_window.cc +++ b/services/ws/server_window.cc
@@ -482,11 +482,9 @@ client_area_ = insets; } -void ServerWindow::SetHitTestMask(const base::Optional<gfx::Rect>& mask) { - gfx::Insets insets; - if (mask) - insets = gfx::Rect(window_->bounds().size()).InsetsFrom(mask.value()); - window_targeter_->SetInsets(insets); +void ServerWindow::SetHitTestInsets(const gfx::Insets& mouse, + const gfx::Insets& touch) { + window_targeter_->SetInsets(mouse, touch); } void ServerWindow::SetCaptureOwner(WindowTree* owner) {
diff --git a/services/ws/server_window.h b/services/ws/server_window.h index 3d193ae..206bd51 100644 --- a/services/ws/server_window.h +++ b/services/ws/server_window.h
@@ -82,7 +82,7 @@ void SetClientArea(const gfx::Insets& insets, const std::vector<gfx::Rect>& additional_client_areas); - void SetHitTestMask(const base::Optional<gfx::Rect>& mask); + void SetHitTestInsets(const gfx::Insets& mouse, const gfx::Insets& touch); void SetCaptureOwner(WindowTree* owner); WindowTree* capture_owner() const { return capture_owner_; }
diff --git a/services/ws/server_window_unittest.cc b/services/ws/server_window_unittest.cc index 2522f7a..1e61b7c 100644 --- a/services/ws/server_window_unittest.cc +++ b/services/ws/server_window_unittest.cc
@@ -21,8 +21,7 @@ WindowServiceTestSetup setup; std::unique_ptr<wm::EasyResizeWindowTargeter> easy_resize_window_targeter = std::make_unique<wm::EasyResizeWindowTargeter>( - setup.root(), gfx::Insets(-10, -10, -10, -10), - gfx::Insets(-10, -10, -10, -10)); + gfx::Insets(-10, -10, -10, -10), gfx::Insets(-10, -10, -10, -10)); setup.root()->SetEventTargeter(std::move(easy_resize_window_targeter)); aura::Window* top_level = setup.window_tree_test_helper()->NewTopLevelWindow();
diff --git a/services/ws/window_tree.cc b/services/ws/window_tree.cc index c25ec04a..da9de5b 100644 --- a/services/ws/window_tree.cc +++ b/services/ws/window_tree.cc
@@ -20,6 +20,7 @@ #include "services/ws/drag_drop_delegate.h" #include "services/ws/embedding.h" #include "services/ws/pointer_watcher.h" +#include "services/ws/public/cpp/property_type_converters.h" #include "services/ws/server_window.h" #include "services/ws/topmost_window_observer.h" #include "services/ws/window_delegate_impl.h" @@ -43,6 +44,7 @@ #include "ui/compositor/layer_type.h" #include "ui/display/display.h" #include "ui/display/screen.h" +#include "ui/events/event_utils.h" #include "ui/gfx/image/image_skia.h" #include "ui/wm/core/capture_controller.h" #include "ui/wm/core/window_modality_controller.h" @@ -67,6 +69,11 @@ return 0x1000000 | (rand() & 0xffffff); } +gfx::Insets MakeInsetsPositive(const gfx::Insets& insets) { + return gfx::Insets(std::max(0, insets.top()), std::max(0, insets.left()), + std::max(0, insets.bottom()), std::max(0, insets.right())); +} + } // namespace // Used to track events sent to the client. @@ -196,6 +203,9 @@ event_to_send->AsLocatedEvent()->set_root_location_f(root_location); } } + DVLOG(4) << "SendEventToClient window=" + << ServerWindow::GetMayBeNull(window)->GetIdForDebugging() + << " event_type=" << ui::EventTypeName(event.type()); window_tree_client_->OnWindowInputEvent( event_id, TransportIdForWindow(window), display_id, std::move(event_to_send), matches_pointer_watcher); @@ -932,28 +942,6 @@ return true; } -bool WindowTree::SetChildModalParentImpl(const ClientWindowId& child_id, - const ClientWindowId& parent_id) { - DVLOG(3) << "setting child window modal parent client=" << client_id_ - << " child_id=" << child_id << " parent_id=" << parent_id; - aura::Window* child = GetWindowByClientId(child_id); - aura::Window* parent = GetWindowByClientId(parent_id); - // A value of null for |parent_id| resets the modal parent. - if (!child) { - DVLOG(1) << "SetChildModalParent failed (invalid id)"; - return false; - } - - if (!IsClientCreatedWindow(child) || - (parent && !IsClientCreatedWindow(parent))) { - DVLOG(1) << "SetChildModalParent failed (access denied)"; - return false; - } - - wm::SetModalParent(child, parent); - return true; -} - bool WindowTree::SetWindowVisibilityImpl(const ClientWindowId& window_id, bool visible) { aura::Window* window = GetWindowByClientId(window_id); @@ -988,7 +976,9 @@ DVLOG(1) << "SetWindowProperty failed (no window)"; return false; } - DCHECK(window_service_->property_converter()->IsTransportNameRegistered(name)) + aura::PropertyConverter* property_converter = + window_service_->property_converter(); + DCHECK(property_converter->IsTransportNameRegistered(name)) << "Attempting to set an unregistered property; this is not implemented. " << "property name=" << name; if (!IsClientCreatedWindow(window) && !IsClientRootWindow(window)) { @@ -998,11 +988,22 @@ ClientChange change(property_change_tracker_.get(), window, ClientChangeType::kProperty); + // Special handle the property whose value is a pointer to aura::Window since + // property converter can't convert the transported value. + const aura::WindowProperty<aura::Window*>* property = + property_converter->GetWindowPtrProperty(name); + if (property) { + aura::Window* prop_window = nullptr; + if (value.has_value()) + prop_window = GetWindowByTransportId(mojo::ConvertTo<Id>(value.value())); + window->SetProperty(property, prop_window); + return true; + } + std::unique_ptr<std::vector<uint8_t>> data; if (value.has_value()) data = std::make_unique<std::vector<uint8_t>>(value.value()); - window_service_->property_converter()->SetPropertyFromTransportValue( - window, name, data.get()); + property_converter->SetPropertyFromTransportValue(window, name, data.get()); return true; } @@ -1420,29 +1421,26 @@ insets, additional_client_areas.value_or(std::vector<gfx::Rect>())); } -void WindowTree::SetHitTestMask(Id transport_window_id, - const base::Optional<gfx::Rect>& mask) { +void WindowTree::SetHitTestInsets(Id transport_window_id, + const gfx::Insets& mouse, + const gfx::Insets& touch) { const ClientWindowId window_id = MakeClientWindowId(transport_window_id); aura::Window* window = GetWindowByClientId(window_id); - DVLOG(3) << "SetHitTestMask client window_id=" << window_id.ToString() - << " mask=" << (mask ? mask.value().ToString() : "null"); + DVLOG(3) << "SetHitTestInsets client window_id=" << window_id.ToString() + << " mouse=" << mouse.ToString() << " touch=" << touch.ToString(); if (!window) { - DVLOG(1) << "SetHitTestMask failed (invalid window id)"; + DVLOG(1) << "SetHitTestInsets failed (invalid window id)"; return; } if (!IsClientCreatedWindow(window)) { - DVLOG(1) << "SetHitTestMask failed (access denied)"; - return; - } - const gfx::Rect window_local_bounds(window->bounds().size()); - if (mask && !window_local_bounds.Contains(mask.value())) { - DVLOG(1) << "SetHitTestMask failed (mask extends beyond window bounds)"; + DVLOG(1) << "SetHitTestInsets failed (access denied)"; return; } ServerWindow* server_window = ServerWindow::GetMayBeNull(window); DCHECK(server_window); // Must exist because of preceding conditionals. - server_window->SetHitTestMask(mask); + server_window->SetHitTestInsets(MakeInsetsPositive(mouse), + MakeInsetsPositive(touch)); } void WindowTree::SetCanAcceptDrops(Id window_id, bool accepts_drops) { @@ -1555,14 +1553,6 @@ change_id, SetModalTypeImpl(MakeClientWindowId(window_id), type)); } -void WindowTree::SetChildModalParent(uint32_t change_id, - Id window_id, - Id parent_window_id) { - window_tree_client_->OnChangeCompleted( - change_id, SetChildModalParentImpl(MakeClientWindowId(window_id), - MakeClientWindowId(parent_window_id))); -} - void WindowTree::ReorderWindow(uint32_t change_id, Id transport_window_id, Id transport_relative_window_id,
diff --git a/services/ws/window_tree.h b/services/ws/window_tree.h index 69a95ea..ab59af0 100644 --- a/services/ws/window_tree.h +++ b/services/ws/window_tree.h
@@ -288,8 +288,6 @@ bool RemoveTransientWindowFromParentImpl(const ClientWindowId& transient_id); bool SetModalTypeImpl(const ClientWindowId& client_window_id, ui::ModalType type); - bool SetChildModalParentImpl(const ClientWindowId& child_id, - const ClientWindowId& parent_id); bool SetWindowVisibilityImpl(const ClientWindowId& window_id, bool visible); bool SetWindowPropertyImpl(const ClientWindowId& window_id, const std::string& name, @@ -355,8 +353,9 @@ const gfx::Insets& insets, const base::Optional<std::vector<gfx::Rect>>& additional_client_areas) override; - void SetHitTestMask(Id transport_window_id, - const base::Optional<gfx::Rect>& mask) override; + void SetHitTestInsets(Id transport_window_id, + const gfx::Insets& mouse, + const gfx::Insets& touch) override; void SetCanAcceptDrops(Id window_id, bool accepts_drops) override; void SetWindowVisibility(uint32_t change_id, Id transport_window_id, @@ -383,9 +382,6 @@ void SetModalType(uint32_t change_id, Id window_id, ui::ModalType type) override; - void SetChildModalParent(uint32_t change_id, - Id window_id, - Id parent_window_id) override; void ReorderWindow(uint32_t change_id, Id transport_window_id, Id transport_relative_window_id,
diff --git a/services/ws/window_tree_test_helper.cc b/services/ws/window_tree_test_helper.cc index c03e8754..e74dd6b 100644 --- a/services/ws/window_tree_test_helper.cc +++ b/services/ws/window_tree_test_helper.cc
@@ -95,9 +95,10 @@ additional_client_areas); } -void WindowTreeTestHelper::SetHitTestMask(aura::Window* window, - base::Optional<gfx::Rect> mask) { - window_tree_->SetHitTestMask(TransportIdForWindow(window), mask); +void WindowTreeTestHelper::SetHitTestInsets(aura::Window* window, + const gfx::Insets& mouse, + const gfx::Insets& touch) { + window_tree_->SetHitTestInsets(TransportIdForWindow(window), mouse, touch); } void WindowTreeTestHelper::SetWindowProperty(aura::Window* window,
diff --git a/services/ws/window_tree_test_helper.h b/services/ws/window_tree_test_helper.h index 4a95a965..62907305f 100644 --- a/services/ws/window_tree_test_helper.h +++ b/services/ws/window_tree_test_helper.h
@@ -80,7 +80,9 @@ const gfx::Insets& insets, base::Optional<std::vector<gfx::Rect>> additional_client_areas = base::Optional<std::vector<gfx::Rect>>()); - void SetHitTestMask(aura::Window* window, base::Optional<gfx::Rect> mask); + void SetHitTestInsets(aura::Window* window, + const gfx::Insets& mouse, + const gfx::Insets& touch); void SetWindowProperty(aura::Window* window, const std::string& name, const std::vector<uint8_t>& value,
diff --git a/services/ws/window_tree_unittest.cc b/services/ws/window_tree_unittest.cc index a3f5b615..c33843d 100644 --- a/services/ws/window_tree_unittest.cc +++ b/services/ws/window_tree_unittest.cc
@@ -37,6 +37,9 @@ namespace ws { namespace { +DEFINE_UI_CLASS_PROPERTY_KEY(aura::Window*, kTestPropertyKey, nullptr); +const char kTestPropertyServerKey[] = "test-property-server"; + // Passed to Embed() to give the default behavior (see kEmbedFlag* in mojom for // details). constexpr uint32_t kDefaultEmbedFlags = 0; @@ -351,6 +354,55 @@ data->properties[mojom::WindowManager::kAlwaysOnTop_Property])); } +TEST(WindowTreeTest, SetWindowPointerProperty) { + WindowServiceTestSetup setup; + setup.service()->property_converter()->RegisterWindowPtrProperty( + kTestPropertyKey, kTestPropertyServerKey); + + WindowTreeTestHelper* helper = setup.window_tree_test_helper(); + aura::Window* top_level1 = helper->NewTopLevelWindow(); + aura::Window* top_level2 = helper->NewTopLevelWindow(); + Id id1 = helper->TransportIdForWindow(top_level1); + Id id2 = helper->TransportIdForWindow(top_level2); + + base::Optional<std::vector<uint8_t>> value = + mojo::ConvertTo<std::vector<uint8_t>>(id2); + setup.window_tree_test_helper()->window_tree()->SetWindowProperty( + 1, id1, kTestPropertyServerKey, value); + EXPECT_EQ(top_level2, top_level1->GetProperty(kTestPropertyKey)); + + value.reset(); + setup.window_tree_test_helper()->window_tree()->SetWindowProperty( + 1, id1, kTestPropertyServerKey, value); + EXPECT_FALSE(top_level1->GetProperty(kTestPropertyKey)); +} + +TEST(WindowTreeTest, SetWindowPointerPropertyWithInvalidValues) { + WindowServiceTestSetup setup; + setup.service()->property_converter()->RegisterWindowPtrProperty( + kTestPropertyKey, kTestPropertyServerKey); + + WindowTreeTestHelper* helper = setup.window_tree_test_helper(); + aura::Window* top_level = helper->NewTopLevelWindow(); + Id id = helper->TransportIdForWindow(top_level); + base::Optional<std::vector<uint8_t>> value = + mojo::ConvertTo<std::vector<uint8_t>>(kInvalidTransportId); + setup.window_tree_test_helper()->window_tree()->SetWindowProperty( + 1, id, kTestPropertyServerKey, value); + EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey)); + + value = mojo::ConvertTo<std::vector<uint8_t>>(10); + setup.window_tree_test_helper()->window_tree()->SetWindowProperty( + 1, id, kTestPropertyServerKey, value); + EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey)); + + value->clear(); + value->push_back(1); + setup.window_tree_test_helper()->window_tree()->SetWindowProperty( + 1, id, kTestPropertyServerKey, value); + EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey)); +} + TEST(WindowTreeTest, EventLocation) { WindowServiceTestSetup setup; TestWindowTreeClient* window_tree_client = setup.window_tree_client(); @@ -698,7 +750,7 @@ EXPECT_TRUE(window_tree_client->input_events().empty()); } -TEST(WindowTreeTest, SetHitTestMask) { +TEST(WindowTreeTest, SetHitTestInsets) { EventRecordingWindowDelegate window_delegate; WindowServiceTestSetup setup; setup.delegate()->set_delegate_for_next_top_level(&window_delegate); @@ -712,17 +764,17 @@ window_tree_client->ClearInputEvents(); window_delegate.ClearEvents(); - // Set a hit test mask in the window's bounds that excludes the top half. - setup.window_tree_test_helper()->SetHitTestMask(top_level, - gfx::Rect(0, 50, 100, 50)); + // Set the hit test insets in the window's bounds that excludes the top half. + setup.window_tree_test_helper()->SetHitTestInsets( + top_level, gfx::Insets(50, 0, 0, 0), gfx::Insets(50, 0, 0, 0)); - // Events outside the hit test mask are not seen by the delegate or client. + // Events outside the hit test insets are not seen by the delegate or client. ui::test::EventGenerator event_generator(setup.root()); event_generator.MoveMouseTo(50, 30); EXPECT_TRUE(window_tree_client->input_events().empty()); EXPECT_TRUE(window_delegate.events().empty()); - // Events in the hit test mask are seen by the delegate and client. + // Events in the hit test insets are seen by the delegate and client. event_generator.MoveMouseTo(50, 80); EXPECT_EQ("POINTER_MOVED 40,70", LocatedEventToEventTypeAndLocation(
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 92625df..7349d5c4 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -167,10 +167,6 @@ #define SK_IGNORE_MATRIX_IMAGE_FILTER_FIX #endif -#ifndef SK_DISABLE_MASKFILTERED_MASK_CACHING -#define SK_DISABLE_MASKFILTERED_MASK_CACHING -#endif - // remove after rebaselining svg layout tests #ifndef SK_SUPPORT_LEGACY_SVG_ARC_TO #define SK_SUPPORT_LEGACY_SVG_ARC_TO @@ -187,10 +183,6 @@ #define SK_SUPPORT_LEGACY_AAA_CHOICE #endif -#ifndef SK_USE_LEGACY_PRIMARIES_TO_XYZ -#define SK_USE_LEGACY_PRIMARIES_TO_XYZ -#endif - ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn index 4e5f9628..75fa738 100644 --- a/storage/browser/BUILD.gn +++ b/storage/browser/BUILD.gn
@@ -1,9 +1,10 @@ # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/jumbo.gni") import("//testing/test.gni") -component("browser") { +jumbo_component("browser") { output_name = "storage_browser" sources = [ "blob/blob_builder_from_stream.cc", @@ -319,7 +320,7 @@ ] } -static_library("test_support") { +jumbo_static_library("test_support") { testonly = true sources = [
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java index 3e27274..d161758 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
@@ -44,7 +44,7 @@ private String mCommandLineFilePath; private StringBuilder mCommandLineFlags = new StringBuilder(); private TestStatusReporter mReporter; - private boolean mRunInSubThread = false; + private boolean mRunInSubThread; private String mStdoutFilePath; private static class ReportingUncaughtExceptionHandler
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 508e992..8015cad 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1424,6 +1424,17 @@ }, { "args": [ + "--enable-features=SingleProcessMash", + "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter" + ], + "name": "single_process_mash_fyi_exo_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "exo_unittests" + }, + { + "args": [ "--enable-features=VizDisplayCompositor" ], "name": "viz_interactive_ui_tests",
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 3cf98b7..d5148a5 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -12558,7 +12558,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12575,7 +12575,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12592,7 +12592,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12608,7 +12608,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12628,7 +12628,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12650,7 +12650,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12667,7 +12667,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12685,7 +12685,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12701,7 +12701,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12717,7 +12717,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12735,7 +12735,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12754,7 +12754,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12767,7 +12767,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12780,7 +12780,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12799,7 +12799,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12818,7 +12818,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12843,7 +12843,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12866,7 +12866,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12889,7 +12889,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12912,7 +12912,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12939,7 +12939,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -12969,7 +12969,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13007,7 +13007,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13031,7 +13031,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13054,7 +13054,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13079,7 +13079,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13105,7 +13105,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13131,7 +13131,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13155,7 +13155,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13179,7 +13179,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" } @@ -13203,7 +13203,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:5912-24.20.100.6025", + "gpu": "8086:5912-24.20.100.6286", "os": "Windows-10", "pool": "Chrome-GPU" }
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index 30ab19a..e8736dd 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -2214,7 +2214,7 @@ { "swarming": { "can_use_on_swarming_builders": true, - "shards": 10 + "shards": 15 }, "test": "browser_tests" },
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 702a8ce..7c02cb6 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -64,6 +64,14 @@ ] } +source_set("exo_unittests_filters") { + testonly = true + + data = [ + "//testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter", + ] +} + source_set("fuchsia_filters") { data = [ "//testing/buildbot/filters/fuchsia.content_unittests.filter",
diff --git a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter index 8257a71..319167b 100644 --- a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter +++ b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter
@@ -39,6 +39,13 @@ -BrowserNonClientFrameViewAshTest.ImmersiveModeTopViewInset/* -BrowserNonClientFrameViewAshTest.TopViewInset/* +# Touch gestures don't work in webcontents. https://crbug.com/866991. +-TopControlsSlideControllerTest.TestScrollingPage +-TopControlsSlideControllerTest.TestScrollingPageAndSwitchingToNTP +-TopControlsSlideControllerTest.TestClosingATab +-TopControlsSlideControllerTest.TestFocusEditableElements +-TopControlsSlideControllerTest.DisplayRotation + # Direct access to ash window frames, tablet mode, overview mode, etc. -NonHomeLauncherBrowserNonClientFrameViewAshTest.* @@ -47,9 +54,6 @@ -ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInAppImmersiveMode* -ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInBrowserImmersiveMode* -# Null immersive_fullscreen_controller_. --ChromeNativeAppWindowViewsAuraAshBrowserTest.* - # ash::Shell access from ChromeViewsDelegate::CreateDefaultNonClientFrameView() # e.g. from chromeos::CaptivePortalWindowProxy::Show(). # See https://crbug.com/838974
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.fyi.ash_unittests.filter b/testing/buildbot/filters/chromeos.single_process_mash.fyi.ash_unittests.filter index bb1f920..b5168a9 100644 --- a/testing/buildbot/filters/chromeos.single_process_mash.fyi.ash_unittests.filter +++ b/testing/buildbot/filters/chromeos.single_process_mash.fyi.ash_unittests.filter
@@ -1,8 +1,7 @@ -# These tests fail. +# These tests fail. https://crbug.com/646565 -AppListPresenterDelegateTest.TapAppListWithVirtualKeyboardDismissesVirtualKeyboard/0 -AppListPresenterDelegateTest.TapAppListWithVirtualKeyboardDismissesVirtualKeyboard/1 -LockActionHandlerLayoutManagerTest.KeyboardBounds --ShelfWindowWatcherTest.CreateAndRemoveShelfItemProperties -ShellTest.KeyboardCreation -SystemModalContainerLayoutManagerTest.SystemModalDialogGetPushedButNotCroppedFromKeyboard -SystemModalContainerLayoutManagerTest.SystemModalDialogGetPushedButNotCroppedFromKeyboardIfNotCentered @@ -10,7 +9,7 @@ -VirtualKeyboardControllerTest.ForceToShowKeyboardWithKeysetWhenKeyboardIsDisabled -VirtualKeyboardRootWindowControllerTest.ClickWithActiveModalDialog -# These tests crash. +# These tests crash. https://crbug.com/646565 -LockContentsViewKeyboardUnitTest.AutoLayoutExtraSmallUsersListForKeyboard -LockContentsViewKeyboardUnitTest.AutoLayoutSmallUsersListForKeyboard -LockContentsViewKeyboardUnitTest.PinSubmitWithVirtualKeyboardShown @@ -19,6 +18,8 @@ -LockLayoutManagerTest.KeyboardBounds -LockWindowVirtualKeyboardTest.VirtualKeyboardDoesNotCoverAuthView -MagnificationControllerTest.TextfieldFocusedWithKeyboard +# Crashes in ui::FakeContextFactory::GetLastCompositorFrame(). +-NonClientFrameControllerMashTest.ContentRegionNotDrawnForClient -ShelfLayoutManagerKeyboardTest.ShelfIgnoreWorkAreaChangeInNonStickyMode -ShelfLayoutManagerKeyboardTest.ShelfNotMoveOnKeyboardOpen -ShelfLayoutManagerKeyboardTest.ShelfShouldChangeWorkAreaInStickyMode
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.fyi.browser_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.fyi.browser_tests.filter index f078cf64..55f4a1a 100644 --- a/testing/buildbot/filters/chromeos.single_process_mash.fyi.browser_tests.filter +++ b/testing/buildbot/filters/chromeos.single_process_mash.fyi.browser_tests.filter
@@ -23,10 +23,17 @@ # Automation manager tests. -AutomationManagerAuraBrowserTest.WebAppearsOnce +# Flaky tests. crbug.com/880584 +-AutoplayMetricsBrowserTest.RecordAutoplayAttemptUkm + # Blub Arc tests. -Blub/UnaffiliatedArcAllowedTest.ProfileTest/0 -Blub/UnaffiliatedArcAllowedTest.ProfileTest/1 +# PictureinPicture does not work with mash because VideoSurfaceLayer is +# disabled. https://crbug.com/827327 +-BrowserActionApiTest.TestPictureInPictureOnBrowserActionIconClick + # Browser command controller tests. -BrowserCommandControllerBrowserTest.LockedFullscreen @@ -132,6 +139,9 @@ -ManagedWithPermission/ManagedWithPermissionPlatformKeysTest.PolicyGrantsAccessToCorporateKey/1 -ManagedWithPermission/ManagedWithPermissionPlatformKeysTest.PolicyGrantsAccessToCorporateKey/2 +# Flaky tests. crbug.com/880584 +-MSE_ClearKey/EncryptedMediaTest.Playback_Multiple_VideoAudio_WebM/0 + # Ash frame view tests. -NonHomeLauncherBrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/material -NonHomeLauncherBrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/material_refresh @@ -174,6 +184,10 @@ -PictureInPictureWindowControllerBrowserTest.TabIconUpdated -PictureInPictureWindowControllerBrowserTest.UpdateVideoSrcKeepsPictureInPictureWindowOpened +# Picture-in-Picture does not work with mash because VideoSurfaceLayer is +# disabled. https://crbug.com/827327 +-PlatformAppBrowserTest.PictureInPicture + # Display rotation tests. -PolicyDisplayRotationDefault/DisplayRotationDefaultTest.ConnectSecondDisplay/0 -PolicyDisplayRotationDefault/DisplayRotationDefaultTest.ConnectSecondDisplay/1 @@ -259,6 +273,13 @@ -TabCaptureApiPixelTest.OffscreenTabEndToEnd -TabCaptureApiPixelTest.OffscreenTabEvilTests +# Touch gestures don't work in webcontents. https://crbug.com/866991. +-TopControlsSlideControllerTest.DisplayRotation +-TopControlsSlideControllerTest.TestScrollingPage +-TopControlsSlideControllerTest.TestScrollingPageAndSwitchingToNTP +-TopControlsSlideControllerTest.TestClosingATab +-TopControlsSlideControllerTest.TestFocusEditableElements + # Unmanaged platform keys tests. -Unmanaged/UnmanagedPlatformKeysTest.Basic/0 -Unmanaged/UnmanagedPlatformKeysTest.Basic/1 @@ -269,6 +290,10 @@ -Unmanaged/UnmanagedPlatformKeysTest.Permissions/2 -Unmanaged/UnmanagedPlatformKeysTest.Permissions/3 +# Flaky tests. crbug.com/880584 +-UnifiedAutoplaySettingBrowserTest.Allow +-UnifiedAutoplaySettingBrowserTest.Block + # Virtual keyboard tests. -VirtualKeyboardAppWindowTest.DisableOverscrollForImeWindow -VirtualKeyboardStateTest.DisablingKeyboardGoesToInitialState
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter b/testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter new file mode 100644 index 0000000..744bf6c1 --- /dev/null +++ b/testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter
@@ -0,0 +1,2 @@ +# System tray bubble should activate after tab pressed. https://crbug.com/880515 +-ClientControlledShellSurfaceTest.KeyboardNavigationWithUnifiedSystemTray
diff --git a/testing/buildbot/filters/webui_polymer2_browser_tests.filter b/testing/buildbot/filters/webui_polymer2_browser_tests.filter index fde20ab0..c53693a 100644 --- a/testing/buildbot/filters/webui_polymer2_browser_tests.filter +++ b/testing/buildbot/filters/webui_polymer2_browser_tests.filter
@@ -308,6 +308,7 @@ NTP4WebUITest.* PrintPreviewAdvancedDialogTest.* PrintPreviewAdvancedItemTest.* +PrintPreviewBaseSettingsSectionTest.* PrintPreviewCustomMarginsTest.* PrintPreviewDestinationDialogTest.* PrintPreviewDestinationItemTest.*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index b9cbccc..54540a6d 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -214,6 +214,13 @@ }, }, # chromium.win + 'Win7 Tests (1)': { + # This is for slow test execution that often becomes a critical path of + # swarming jobs. crbug.com/868114 + 'swarming': { + 'shards': 15, + }, + }, 'Win7 Tests (dbg)(1)': { 'swarming': { 'shards': 20,
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 71297bb6..64f55f0 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1758,7 +1758,6 @@ 'shards': 10, }, }, - 'single_process_mash_fyi_ash_unittests': { 'test': 'ash_unittests', 'args': [ @@ -1766,6 +1765,13 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.fyi.ash_unittests.filter', ], }, + 'single_process_mash_fyi_exo_unittests': { + 'test': 'exo_unittests', + 'args': [ + '--enable-features=SingleProcessMash', + '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.fyi.exo_unittests.filter', + ], + }, }, # These can be folded into linux_chromeos_specific_gtests once we stop moving
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index f0bc755..30d82cb0 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1987,7 +1987,7 @@ 'dimension_sets': [ { # WIN10_INTEL_HD_630_EXPERIMENTAL_DRIVER - 'gpu': '8086:5912-24.20.100.6025', + 'gpu': '8086:5912-24.20.100.6286', 'os': 'Windows-10', 'pool': 'Chrome-GPU', },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index c614ce1..dd246aa 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -443,6 +443,8 @@ "AudioService": [ { "platforms": [ + "linux", + "mac", "windows" ], "experiments": [ @@ -461,23 +463,6 @@ }, { "platforms": [ - "linux", - "mac" - ], - "experiments": [ - { - "name": "AudioServiceStreams_v6", - "params": { - "teardown_timeout_s": "0" - }, - "enable_features": [ - "AudioServiceAudioStreams" - ] - } - ] - }, - { - "platforms": [ "android", "chromeos" ], @@ -2421,21 +2406,6 @@ ] } ], - "NTPArticleSuggestionsExpandableHeader": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "NTPArticleSuggestionsExpandableHeader" - ] - } - ] - } - ], "NTPBirthdayFeatures": [ { "platforms": [ @@ -2897,9 +2867,6 @@ "OmniboxRichEntitySuggestions", "OmniboxTabSwitchSuggestions", "OmniboxTailSuggestions", - "OmniboxUIExperimentShowSuggestionFavicons", - "OmniboxUIExperimentSwapTitleAndUrl", - "OmniboxUIExperimentVerticalMargin", "ZeroSuggestRedirectToChrome", "ZeroSuggestSwapTitleAndUrl" ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=HeapIncrementalMarkingStress b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=HeapIncrementalMarkingStress index b57fc18..32387e9c 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=HeapIncrementalMarkingStress +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=HeapIncrementalMarkingStress
@@ -1,2 +1,4 @@ crbug.com/831541 inspector-protocol/css/css-collect-class-names.js [ Pass Failure ] crbug.com/865348 http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] +crbug.com/865348 virtual/outofblink-cors/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] +crbug.com/865348 virtual/outofblink-cors-ns/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index ea4509d2..143d3ee 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -60,7 +60,7 @@ crbug.com/591099 external/wpt/css/css-writing-modes/two-levels-of-orthogonal-flows-percentage.html [ Pass ] crbug.com/855279 fast/css/text-overflow-ellipsis-vertical-hittest.html [ Pass ] crbug.com/591099 fast/dom/inner-text-first-letter.html [ Pass ] -crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure Pass ] +crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ] # New failures are appended below by the script. crbug.com/591099 animations/rotate-transform-equivalent.html [ Failure ] @@ -71,6 +71,7 @@ crbug.com/591099 css3/filters/composited-layer-child-bounds-after-composited-to-sw-shadow-change.html [ Failure ] crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ] crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ] +crbug.com/591099 external/wpt/css/CSS2/floats/float-nowrap-3.html [ Pass ] crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001.xht [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004.xht [ Pass ] @@ -195,7 +196,9 @@ crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001s.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001t.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001.xht [ Pass ] -crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-013.xht [ Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-001.xht [ Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-001.xht [ Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004.xht [ Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-003.xht [ Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Pass ] crbug.com/591099 external/wpt/css/cssom/cssstyledeclaration-mutationrecord-001.html [ Pass ] @@ -270,7 +273,7 @@ crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrack/removeCue.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/id.html [ Pass ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/pauseOnExit.html [ Failure Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/pauseOnExit.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/startTime.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/track.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/cloneNode.html [ Pass ] @@ -285,9 +288,11 @@ crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Failure ] crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Failure ] crbug.com/591099 external/wpt/offscreen-canvas/convert-to-blob/offscreencanvas.convert.to.blob.html [ Pass ] +crbug.com/591099 external/wpt/payment-handler/idlharness.https.any.serviceworker.html [ Pass ] crbug.com/591099 external/wpt/performance-timeline/po-observe.html [ Timeout ] -crbug.com/591099 external/wpt/picture-in-picture/request-picture-in-picture-twice.html [ Pass ] +crbug.com/591099 external/wpt/picture-in-picture/request-picture-in-picture-twice.html [ Pass Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/push-api/idlharness.https.any.serviceworker.html [ Pass ] crbug.com/591099 external/wpt/quirks/line-height-calculation.html [ Failure ] crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass Timeout ] crbug.com/591099 external/wpt/requestidlecallback/callback-timeout-when-busy.html [ Timeout ] @@ -350,7 +355,6 @@ crbug.com/591099 external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ] crbug.com/591099 external/wpt/xhr/send-content-type-string.htm [ Pass ] crbug.com/591099 external/wpt/xhr/send-entity-body-document.htm [ Pass ] -crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure Pass ] crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ] crbug.com/591099 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ] crbug.com/591099 fast/block/basic/quirk-percent-height-table-cell.html [ Failure ] @@ -381,7 +385,6 @@ crbug.com/591099 fast/forms/select/menulist-appearance-rtl.html [ Failure ] crbug.com/591099 fast/frames/crash-frameset-CSS-content-property.html [ Crash Pass ] crbug.com/591099 fast/inline-block/tricky-baseline.html [ Failure ] -crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ] crbug.com/835484 fast/inline/continuation-outlines-with-layers-2.html [ Failure ] crbug.com/835484 fast/inline/continuation-outlines-with-layers.html [ Failure ] crbug.com/835484 fast/inline/continuation-outlines.html [ Failure ] @@ -401,8 +404,8 @@ crbug.com/591099 fast/table/dynamic-descendant-percentage-height.html [ Failure ] crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] -crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ] -crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ] +crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ] +crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ] crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ] crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ] crbug.com/591099 fast/table/unbreakable-images-quirk.html [ Failure ] @@ -430,7 +433,6 @@ crbug.com/855039 html/details_summary/details-writing-mode-align-left.html [ Failure ] crbug.com/855039 html/details_summary/details-writing-mode-align-right.html [ Failure ] crbug.com/855039 html/details_summary/details-writing-mode.html [ Failure ] -crbug.com/591099 html/dialog/form-method-dialog.html [ Failure Pass ] crbug.com/591099 http/tests/devtools/console-resource-errors.js [ Failure Pass ] crbug.com/591099 http/tests/devtools/console/console-correct-suggestions.js [ Pass ] crbug.com/591099 http/tests/devtools/elements/shadow/shadow-distribution.js [ Failure ] @@ -448,8 +450,13 @@ crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ] crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ] crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] +crbug.com/591099 virtual/outofblink-cors/http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ] +crbug.com/591099 virtual/outofblink-cors/http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ] +crbug.com/591099 virtual/outofblink-cors/http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] +crbug.com/591099 virtual/outofblink-cors-ns/http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ] +crbug.com/591099 virtual/outofblink-cors-ns/http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ] +crbug.com/591099 virtual/outofblink-cors-ns/http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Crash Pass ] -crbug.com/714962 images/color-profile-background-clip-text.html [ Failure Pass ] crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ] crbug.com/591099 images/rendering-broken-block-flow-images.html [ Failure ] crbug.com/591099 images/rendering-broken-images.html [ Failure ] @@ -481,7 +488,7 @@ crbug.com/591099 paint/invalidation/line-flow-with-floats-9.html [ Failure ] crbug.com/835484 paint/invalidation/outline/focus-continuations.html [ Failure ] crbug.com/835484 paint/invalidation/outline/focus-enable-continuations.html [ Failure ] -crbug.com/835484 paint/invalidation/outline/focus-layers.html [ Crash Failure ] +crbug.com/835484 paint/invalidation/outline/focus-layers.html [ Failure ] crbug.com/835484 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ] crbug.com/835484 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ] crbug.com/835484 paint/invalidation/outline/inline-focus.html [ Failure ] @@ -497,7 +504,6 @@ crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ] crbug.com/591099 paint/invalidation/table/table-extra-bottom-grow.html [ Failure ] crbug.com/591099 paint/invalidation/table/table-two-pass-layout-overpaint.html [ Failure ] -crbug.com/591099 paint/overflow/background-mask-should-be-recorded-full.html [ Failure Pass ] crbug.com/591099 printing/absolute-position-headers-and-footers.html [ Failure ] crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ] crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ] @@ -570,4 +576,4 @@ crbug.com/591099 virtual/threaded/ [ Skip ] crbug.com/591099 virtual/user-activation-v2/fast/events/mouse-cursor.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] -crbug.com/591099 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Pass ] +crbug.com/591099 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees index 03d329b..ab19f90 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
@@ -237,8 +237,4 @@ crbug.com/879610 fast/dom/scroll-reveal-top-overflow.html [ Failure ] Bug(none) virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad.html [ Failure ] - -# Scroll snap data missing. -crbug.com/853945 fast/scroll-snap/snap-scrolls-visual-viewport.html [ Failure ] - -crbug.com/879169 transforms/3d/point-mapping/3d-point-mapping-2.html [ Failure ] \ No newline at end of file +crbug.com/879169 transforms/3d/point-mapping/3d-point-mapping-2.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation index c7c0f72..7ec6085 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
@@ -3,6 +3,8 @@ # These tests are flaky. Bug(none) http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ] +Bug(none) virtual/outofblink-cors/http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ] +Bug(none) virtual/outofblink-cors-ns/http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ] # Not disclosing |source_location| and/or |blocked url| between cross-origin # renderers when a CSP policy is violated regresses the quality of console @@ -11,6 +13,12 @@ Bug(718942) http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Failure ] Bug(718942) http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ] Bug(718942) http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ] +Bug(718942) virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Failure ] +Bug(718942) virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ] +Bug(718942) virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ] +Bug(718942) virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Failure ] +Bug(718942) virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ] +Bug(718942) virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ] # Console error message source location is present with PlzNavigate. It means # that URLs are potentially disclosed across cross-origin renderers. @@ -26,6 +34,22 @@ Bug(726178) http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure ] Bug(726178) http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure ] Bug(726178) http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/insecure-frame-in-data-iframe-in-main-frame-blocked.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/insecure-iframe-in-main-frame-allowed.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/insecure-iframe-in-main-frame-blocked.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors/http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-frame-in-data-iframe-in-main-frame-blocked.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-iframe-in-main-frame-allowed.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-iframe-in-main-frame-blocked.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure ] +Bug(726178) virtual/outofblink-cors-ns/http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure ] # ------------------------------------------------------------ # These tests are correct with PlzNavigate but not without it
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index bb197d7..1bd27b57 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -5,6 +5,10 @@ Bug(none) http/tests/security/cors-rfc1918 [ Crash Timeout ] Bug(none) http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin.html [ Pass Timeout ] +Bug(none) virtual/outofblink-cors/http/tests/security/cors-rfc1918 [ Crash Timeout ] +Bug(none) virtual/outofblink-cors/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin.html [ Pass Timeout ] +Bug(none) virtual/outofblink-cors-ns/http/tests/security/cors-rfc1918 [ Crash Timeout ] +Bug(none) virtual/outofblink-cors-ns/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin.html [ Pass Timeout ] # Only passes with Network Servce enabled (unfortunately these expectations still # allow Failure or Timeout from the top-level expectations though). @@ -22,3 +26,9 @@ # because content_shell does not add the about: handler. With network service # enabled this fails in both content_shell and chrome. Bug(none) http/tests/misc/redirect-to-about-blank.html [ Timeout ] + +# PlzWorker: These are tentatively failing because of unimplemented code. +crbug.com/715632 external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub.html [ Failure ] +crbug.com/715632 fast/workers/shared-worker-load-error.html [ Timeout ] +crbug.com/715632 http/tests/fetch/chromium/data-saver.html [ Failure ] +crbug.com/715632 fast/workers/chromium/worker-crash-with-invalid-location.html [ Crash ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process index d658980..f1d40e3 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process +++ b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
@@ -3,6 +3,8 @@ # https://crbug.com/793127: NOTREACHED() from clamy@ tickled by frame consolidation CL? crbug.com/793127 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ] +crbug.com/793127 virtual/outofblink-cors/http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ] +crbug.com/793127 virtual/outofblink-cors-ns/http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ] crbug.com/793127 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash ] # https://crbug.com/769508: PlzNavigate-related, not-yet-investigated failures. @@ -19,12 +21,16 @@ # https://crbug.com/669083: console messages mismatch (origin-only VS full-URI) crbug.com/669083 http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html [ Failure ] +crbug.com/669083 virtual/outofblink-cors/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html [ Failure ] +crbug.com/669083 virtual/outofblink-cors-ns/http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html [ Failure ] # https://crbug.com/608015 - node.contentDocument is undefined. crbug.com/608015 http/tests/inspector-protocol/access-inspected-object.js [ Failure Timeout ] # https://crbug.com/771003 - Dump history from all processes in layout tests crbug.com/771003 http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ] +crbug.com/771003 virtual/outofblink-cors/http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ] +crbug.com/771003 virtual/outofblink-cors-ns/http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ] # https://crbug.com/585188 - testRunner.addOriginAccessAllowListEntry is not replicated to OOPIFs. crbug.com/585188 http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] @@ -42,6 +48,8 @@ # https://crbug.com/619662 - Expected console output differences. crbug.com/619662 http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] +crbug.com/619662 virtual/outofblink-cors/http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] +crbug.com/619662 virtual/outofblink-cors-ns/http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] crbug.com/619662 virtual/stable/http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] # https://crbug.com/623268 - Can't inspect OOPIFs from main page's DevTools window.
diff --git a/third_party/WebKit/LayoutTests/LeakExpectations b/third_party/WebKit/LayoutTests/LeakExpectations index 442bcb1c..9766b72 100644 --- a/third_party/WebKit/LayoutTests/LeakExpectations +++ b/third_party/WebKit/LayoutTests/LeakExpectations
@@ -28,6 +28,10 @@ crbug.com/672740 http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker-allowed.html [ Leak Pass ] crbug.com/672740 http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker.html [ Leak Pass ] +crbug.com/672740 virtual/outofblink-cors/http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker-allowed.html [ Leak Pass ] +crbug.com/672740 virtual/outofblink-cors/http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker.html [ Leak Pass ] +crbug.com/672740 virtual/outofblink-cors-ns/http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker-allowed.html [ Leak Pass ] +crbug.com/672740 virtual/outofblink-cors-ns/http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker.html [ Leak Pass ] crbug.com/786995 virtual/threaded/http/tests/devtools/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.js [ Leak Pass ] crbug.com/859640 http/tests/devtools/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.js [ Leak Pass ] @@ -52,6 +56,8 @@ # Not revert suspected CL as jam@ request, expected to be fixed soon. # ----------------------------------------------------------------- crbug.com/765721 [ Linux ] http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Leak ] +crbug.com/765721 [ Linux ] virtual/outofblink-cors/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Leak ] +crbug.com/765721 [ Linux ] virtual/outofblink-cors-ns/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Leak ] crbug.com/765721 [ Linux ] virtual/stable/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Leak ] crbug.com/809609 [ Linux ] editing/pasteboard/drop-file-svg.html [ Pass Leak ]
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests index 683254e..b47e3b0d3 100644 --- a/third_party/WebKit/LayoutTests/NeverFixTests +++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -1031,7 +1031,11 @@ external/wpt/webstorage/storage_local-manual.html [ WontFix ] external/wpt/webstorage/storage_session-manual.html [ WontFix ] external/wpt/xhr/send-authentication-existing-session-manual.htm [ WontFix ] +virtual/outofblink-cors/external/wpt/xhr/send-authentication-existing-session-manual.htm [ WontFix ] +virtual/outofblink-cors-ns/external/wpt/xhr/send-authentication-existing-session-manual.htm [ WontFix ] external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ] +virtual/outofblink-cors/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ] +virtual/outofblink-cors-ns/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-end-manual.https.html [ WontFix ] virtual/layout_ng/external/wpt/css/CSS2/linebox/inline-formatting-context-010b.xht [ WontFix ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-replaced-height-008.xht [ WontFix ]
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests index 2e0edbc..9da27bbb 100644 --- a/third_party/WebKit/LayoutTests/SlowTests +++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -173,6 +173,8 @@ crbug.com/522646 http/tests/media/encrypted-media/encrypted-media-encrypted-event-different-origin.html [ Slow ] crbug.com/411164 [ Win ] http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Slow ] +crbug.com/411164 [ Win ] virtual/outofblink-cors/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Slow ] +crbug.com/411164 [ Win ] virtual/outofblink-cors-ns/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Slow ] crbug.com/510337 http/tests/devtools/console/console-format.js [ Slow ] crbug.com/357427 http/tests/workers/terminate-during-sync-operation-file.html [ Slow ] crbug.com/357427 http/tests/workers/terminate-during-sync-operation-filesystem.html [ Slow ] @@ -205,39 +207,6 @@ crbug.com/658211 [ Win7 Debug ] fast/text/line-break-ascii.html [ Slow ] crbug.com/802029 fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/backcolor.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/bold.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/createlink.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/delete.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/fontname.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/fontsize.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/forecolor.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/formatblock.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/forwarddelete.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/hilitecolor.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/indent.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/inserthorizontalrule.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/inserthtml.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/insertimage.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/insertlinebreak.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/insertorderedlist.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/insertparagraph.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/inserttext.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/insertunorderedlist.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/italic.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/justifycenter.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/justifyfull.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/justifyleft.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/justifyright.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/misc.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/multitest.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/outdent.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/removeformat.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/strikethrough.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/subscript.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/superscript.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/underline.html [ Slow ] -crbug.com/697735 external/wpt/editing/run/unlink.html [ Slow ] crbug.com/592183 external/wpt/webusb/usbDevice.https.html [ Slow ] @@ -1017,6 +986,14 @@ crbug.com/874695 http/tests/security/cross-frame-mouse-source-capabilities.html [ Slow ] crbug.com/874695 http/tests/security/frameNavigation/xss-ALLOWED-same-origin-top-navigation-without-user-gesture.html [ Slow ] crbug.com/874695 http/tests/security/video-poster-cross-origin-crash2.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors/http/tests/security/cross-frame-mouse-source-capabilities.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors/http/tests/security/frameNavigation/xss-ALLOWED-same-origin-top-navigation-without-user-gesture.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors/http/tests/security/video-poster-cross-origin-crash2.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors-ns/http/tests/security/cross-frame-mouse-source-capabilities.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors-ns/http/tests/security/frameNavigation/xss-ALLOWED-same-origin-top-navigation-without-user-gesture.html [ Slow ] +crbug.com/874695 virtual/outofblink-cors-ns/http/tests/security/video-poster-cross-origin-crash2.html [ Slow ] crbug.com/874695 http/tests/webfont/crbug-655076.html [ Slow ] crbug.com/874695 http/tests/webfont/slow-loading.html [ Slow ] crbug.com/874695 http/tests/webmidi/midi-default-feature-policy.https.sub.html [ Slow ] @@ -1160,7 +1137,6 @@ crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/overridemimetype-blob.html [ Slow ] crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/progress-events-response-data-gzip.htm [ Slow ] crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/response-data-progress.htm [ Slow ] -crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/send-authentication-existing-session-manual.htm [ Slow ] crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/sync-no-progress.any.html [ Slow ] crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/sync-no-progress.any.worker.html [ Slow ] crbug.com/874695 virtual/outofblink-cors/external/wpt/xhr/xmlhttprequest-timeout-reused.html [ Slow ] @@ -1295,7 +1271,6 @@ crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/overridemimetype-blob.html [ Slow ] crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/progress-events-response-data-gzip.htm [ Slow ] crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/response-data-progress.htm [ Slow ] -crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/send-authentication-existing-session-manual.htm [ Slow ] crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/sync-no-progress.any.html [ Slow ] crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/sync-no-progress.any.worker.html [ Slow ] crbug.com/874695 virtual/outofblink-cors-ns/external/wpt/xhr/xmlhttprequest-timeout-reused.html [ Slow ] @@ -1475,19 +1450,4 @@ crbug.com/878650 [ Release ] inspector-protocol/heap-profiler/heap-snapshot-merged-nodes.js [ Slow ] crbug.com/878650 [ Release ] inspector-protocol/heap-profiler/heap-snapshot-with-no-detached-iframe.js [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?1-1000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?1001-2000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?2001-3000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?3001-4000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?4001-5000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?5001-6000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/delete.html?6001-last [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?1-1000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?1001-2000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?2001-3000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?3001-4000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?4001-5000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?5001-6000 [ Slow ] -crbug.com/877104 external/wpt/editing/run/forwarddelete.html?6001-last [ Slow ] - crbug.com/878995 [ Win ] external/wpt/async-local-storage/key-types.tentative.https.html [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 36f679a..e5492a6 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -170,6 +170,8 @@ # Sheriff 2018/05/25 crbug.com/846747 http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] +crbug.com/846747 virtual/outofblink-cors/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] +crbug.com/846747 virtual/outofblink-cors-ns/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] crbug.com/846747 virtual/stable/http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] crbug.com/849459 fragmentation/repeating-thead-under-repeating-thead.html [ Failure ] @@ -1630,6 +1632,22 @@ # V8 will break this and needs rebaseline. crbug.com/855582 http/tests/devtools/sources/debugger-ui/last-execution-context.js [ Failure Pass ] +# Tests that need rebaselining once `globalThis` ships in V8. +# TODO(mathias): Mark as `NeedsRebaseline` once V8 with `globalThis` rolls into Chromium. +crbug.com/v8/5537 external/wpt/background-fetch/fetch.https.window.html [ Failure Pass ] +crbug.com/v8/5537 http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope.html [ Failure Pass ] +crbug.com/v8/5537 http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Failure Pass ] +crbug.com/v8/5537 virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope.html [ Failure Pass ] +crbug.com/v8/5537 virtual/service-worker-servicification/http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Failure Pass ] +crbug.com/v8/5537 virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Failure Pass ] +crbug.com/v8/5537 virtual/stable/webexposed/global-interface-listing-dedicated-worker.html [ Failure Pass ] +crbug.com/v8/5537 virtual/stable/webexposed/global-interface-listing-shared-worker.html [ Failure Pass ] +crbug.com/v8/5537 virtual/stable/webexposed/global-interface-listing.html [ Failure Pass ] +crbug.com/v8/5537 virtual/threaded/http/tests/worklet/webexposed/global-interface-listing-paint-worklet.html [ Failure Pass ] +crbug.com/v8/5537 webexposed/global-interface-listing-dedicated-worker.html [ Failure Pass ] +crbug.com/v8/5537 webexposed/global-interface-listing-shared-worker.html [ Failure Pass ] +crbug.com/v8/5537 webexposed/global-interface-listing.html [ Failure Pass ] + ### sheriff 2018-05-28 crbug.com/840238 http/tests/devtools/elements/shadow/shadow-distribution.js [ Failure ] @@ -1667,48 +1685,55 @@ # virtual/outofblink-cors and virtual/outofblink-cors-ns. # These are entries specific to outofblink-cors. Entries having the same # expectations with the base tests (without virtual/outofblink-cors, for -# example) are not listed here. +# example) are not listed here. crbug.com/870173 is used to track failing tests +# that fail only for our virtual tests, and do not have a specific bug entry. # -# ./third_party/blink/tools/run_web_tests.py virtual/outofblink-cors -# Passed 2005 -# Total 2098 -# Counts skip: 2 crash: 14 text: 67 image: 1 pass: 2005 timeout: 9 +# ./third_party/blink/tools/run_web_tests.py virtual/outofblink-cors \ +# virtual/outofblink-cors-ns +# Passed 8297 +# Total 8418 +# Counts skip: 34 crash: 3 text: 67 pass: 8297 timeout: 17 # Crashing tests in dictionary order. +crbug.com/867834 virtual/outofblink-cors/http/tests/security/isolatedWorld/cross-origin-xhr.html [ Crash ] # Timeout tests in dictionary order. crbug.com/867834 virtual/outofblink-cors/external/wpt/service-workers/service-worker/sandboxed-iframe-fetch-event.https.html [ Timeout ] crbug.com/867834 virtual/outofblink-cors/external/wpt/service-workers/service-worker/worker-in-sandboxed-iframe-by-csp-fetch-event.https.html [ Timeout ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/send-authentication-existing-session-manual.htm [ Timeout ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/send-redirect-bogus-sync.htm [ Timeout ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/send-authentication-existing-session-manual.htm [ Timeout ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/send-redirect-bogus-sync.htm [ Timeout ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/document-domain-canonicalizes.html [ Timeout ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/secureContexts/authenticated_worker.https.html [ Timeout ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/secureContexts/unauthenticated_worker.html [ Timeout ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/security/document-domain-canonicalizes.html [ Timeout ] # Failing tests in dictionary order. crbug.com/867834 virtual/outofblink-cors/external/wpt/fetch/api/cors/sandboxed-iframe.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/event-upload-progress-crossorigin.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/event-upload-progress.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/send-redirect-to-cors.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors/http/tests/fetch/chromium/error-messages.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-exact-match.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-subdomains.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ] +crbug.com/870173 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/fetch/chromium/error-messages.html [ Failure ] +crbug.com/879991 virtual/outofblink-cors/http/tests/security/cors-check-for-cached-image.html [ Failure ] +crbug.com/879991 virtual/outofblink-cors/http/tests/security/cors-check-for-cached-script.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/img-redirect-to-crossorigin-credentials.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/script-crossorigin-redirect-credentials.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/security/video-poster-cross-origin-crash2.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-exact-match.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-subdomains.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ] crbug.com/867834 virtual/outofblink-cors-ns/external/wpt/fetch/api/cors/sandboxed-iframe.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/event-upload-progress-crossorigin.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/event-upload-progress.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/send-redirect-to-cors.htm [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/http/tests/fetch/chromium/error-messages.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-exact-match.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-subdomains.html [ Failure ] -crbug.com/736308 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ] +crbug.com/879991 virtual/outofblink-cors-ns/http/tests/security/cors-check-for-cached-image.html [ Failure ] +crbug.com/879991 virtual/outofblink-cors-ns/http/tests/security/cors-check-for-cached-script.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/security/img-redirect-to-crossorigin-credentials.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/cross-origin-xhr.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/security/script-crossorigin-redirect-credentials.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/security/video-poster-cross-origin-crash2.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/fetch/chromium/error-messages.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-exact-match.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-subdomains.html [ Failure ] +crbug.com/870173 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ] # ====== Out of Blink CORS related tests END ====== @@ -1790,6 +1815,8 @@ crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html [ Pass Failure ] crbug.com/518883 crbug.com/390452 http/tests/security/isolatedWorld/media-query-wrapper-leaks.html [ Failure Pass Timeout ] +crbug.com/518883 crbug.com/390452 virtual/outofblink-cors/http/tests/security/isolatedWorld/media-query-wrapper-leaks.html [ Failure Pass Timeout ] +crbug.com/518883 crbug.com/390452 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/media-query-wrapper-leaks.html [ Failure Pass Timeout ] crbug.com/518987 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Pass Timeout ] crbug.com/518987 virtual/outofblink-cors/http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Pass Timeout ] crbug.com/518987 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Pass Timeout ] @@ -1853,8 +1880,12 @@ crbug.com/410145 [ Win ] fast/table/column-in-inline.html [ Failure ] crbug.com/411164 [ Win ] http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Pass ] +crbug.com/411164 [ Win ] virtual/outofblink-cors/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Pass ] +crbug.com/411164 [ Win ] virtual/outofblink-cors-ns/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Pass ] crbug.com/686118 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash Pass ] +crbug.com/686118 virtual/outofblink-cors/http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash Pass ] +crbug.com/686118 virtual/outofblink-cors-ns/http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash Pass ] # In external/wpt/html/, we prefer checking in failure # expectation files. The following tests with [ Failure ] don't have failure @@ -2176,6 +2207,14 @@ crbug.com/528062 [ Win ] http/tests/security/contentSecurityPolicy/cached-frame-csp.html [ Failure ] crbug.com/528062 [ Win ] http/tests/security/xssAuditor/cached-frame.html [ Failure ] crbug.com/528062 [ Win ] http/tests/security/xssAuditor/chunked-big-script.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors/http/tests/security/XFrameOptions/x-frame-options-cached.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/cached-frame-csp.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors/http/tests/security/xssAuditor/cached-frame.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors/http/tests/security/xssAuditor/chunked-big-script.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/XFrameOptions/x-frame-options-cached.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/cached-frame-csp.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/xssAuditor/cached-frame.html [ Failure ] +crbug.com/528062 [ Win ] virtual/outofblink-cors-ns/http/tests/security/xssAuditor/chunked-big-script.html [ Failure ] # Part of a larger issue referenced in the bug. This specific issue will be fixed shortly. crbug.com/408159 accessibility/is-ignored-change-sends-notification.html [ Timeout ] @@ -2448,6 +2487,8 @@ crbug.com/501659 fast/xsl/xslt-missing-namespace-in-xslt.xml [ Failure ] crbug.com/501659 http/tests/security/xss-DENIED-xml-external-entity.xhtml [ Failure ] +crbug.com/501659 virtual/outofblink-cors/http/tests/security/xss-DENIED-xml-external-entity.xhtml [ Failure ] +crbug.com/501659 virtual/outofblink-cors-ns/http/tests/security/xss-DENIED-xml-external-entity.xhtml [ Failure ] crbug.com/501659 fast/css/stylesheet-candidate-nodes-crash.xhtml [ Failure ] crbug.com/545140 [ Mac ] fast/encoding/denormalised-voiced-japanese-chars.html [ Failure ] @@ -2572,6 +2613,8 @@ # Skip the non-virtualized CORS-RFC1918 tests: crbug.com/763830 http/tests/security/cors-rfc1918/ [ Skip ] +crbug.com/763830 virtual/outofblink-cors/http/tests/security/cors-rfc1918/ [ Skip ] +crbug.com/763830 virtual/outofblink-cors-ns/http/tests/security/cors-rfc1918/ [ Skip ] crbug.com/831729 http/tests/event-timing/event-timing-crossiframe.html [ Timeout ] crbug.com/831729 http/tests/event-timing/event-timing-observer-manual.html [ Skip ] @@ -2681,7 +2724,6 @@ # Websockets # Cannot be rebaselined because the output contains a timestamp and a random number. -crbug.com/803200 external/wpt/websockets/cookies/006.html?wss [ Failure ] crbug.com/803200 external/wpt/websockets/opening-handshake/005.html?wss [ Pass Failure ] crbug.com/805463 external/wpt/acid/acid3/numbered-tests.html [ Skip ] @@ -2710,6 +2752,14 @@ crbug.com/875249 external/wpt/infrastructure/testdriver/bless.html [ Timeout Pass ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-masking/clip-path/clip-path-path-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-masking/clip-path/clip-path-path-001.html [ Failure ] +crbug.com/432153 external/wpt/css/css-masking/mask-image/mask-image-url-local-mask.html [ Failure ] +crbug.com/432153 external/wpt/css/css-masking/mask-image/mask-image-url-image.html [ Failure ] +crbug.com/432153 external/wpt/css/css-masking/mask-image/mask-image-url-remote-mask.html [ Failure ] +crbug.com/432153 external/wpt/css/css-masking/mask-image/mask-image-url-image-hash.html [ Failure ] +crbug.com/626703 external/wpt/hr-time/unload-manual.html [ Skip ] +crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Failure ] crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Failure ] crbug.com/626703 virtual/layout_ng/external/wpt/css/CSS2/floats/float-nowrap-8.html [ Failure ] crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-3.html [ Failure ] @@ -2719,8 +2769,6 @@ crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Failure ] crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Failure ] crbug.com/626703 [ Retina ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ] -crbug.com/626703 external/wpt/webrtc/no-media-call.html [ Timeout ] -crbug.com/626703 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/no-media-call.html [ Timeout ] crbug.com/626703 [ Mac10.10 Mac10.12 ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ] crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ] crbug.com/626703 external/wpt/css/selectors/old-tests/css3-modsel-16.xml [ Skip ] @@ -2749,7 +2797,6 @@ crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Failure ] crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Failure ] crbug.com/626703 [ Mac10.12 ] external/wpt/webxr/xrSession_requestAnimationFrame_getDevicePose.https.html [ Failure Timeout ] -crbug.com/877300 external/wpt/editing/run/delete.html?2001-3000 [ Timeout Pass ] crbug.com/626703 external/wpt/payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html [ Timeout ] crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order.html [ Failure ] crbug.com/626703 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.html [ Timeout ] @@ -2954,7 +3001,7 @@ crbug.com/626703 external/wpt/css/css-masking/clip-path/clip-path-polygon-010.html [ Failure ] crbug.com/626703 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Failure ] crbug.com/626703 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-003.svg [ Failure ] -crbug.com/626703 external/wpt/css/css-masking/test-mask.html [ Failure ] +crbug.com/432153 external/wpt/css/css-masking/test-mask.html [ Failure ] crbug.com/626703 external/wpt/css/css-masking/clip-path/clip-path-polygon-006.html [ Failure ] crbug.com/626703 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-004.svg [ Failure ] crbug.com/626703 external/wpt/css/css-masking/clip-path-svg-content/clip-path-recursion-002.svg [ Failure ] @@ -3586,11 +3633,7 @@ crbug.com/626703 virtual/outofblink-cors/external/wpt/xhr/preserve-ua-header-on-redirect.htm [ Failure ] crbug.com/626703 virtual/outofblink-cors-ns/external/wpt/xhr/preserve-ua-header-on-redirect.htm [ Failure ] crbug.com/626703 external/wpt/xhr/send-content-type-string.htm [ Failure ] -crbug.com/626703 virtual/outofblink-cors/external/wpt/xhr/send-content-type-string.htm [ Failure ] -crbug.com/626703 virtual/outofblink-cors-ns/external/wpt/xhr/send-content-type-string.htm [ Failure ] crbug.com/626703 external/wpt/xhr/send-entity-body-document.htm [ Failure ] -crbug.com/626703 virtual/outofblink-cors/external/wpt/xhr/send-entity-body-document.htm [ Failure ] -crbug.com/626703 virtual/outofblink-cors-ns/external/wpt/xhr/send-entity-body-document.htm [ Failure ] crbug.com/626703 external/wpt/xhr/setrequestheader-header-allowed.htm [ Failure ] crbug.com/626703 virtual/outofblink-cors/external/wpt/xhr/setrequestheader-header-allowed.htm [ Failure ] crbug.com/626703 virtual/outofblink-cors-ns/external/wpt/xhr/setrequestheader-header-allowed.htm [ Failure ] @@ -3769,6 +3812,8 @@ # Added 2016-12-12 crbug.com/610835 http/tests/security/XFrameOptions/x-frame-options-deny-multiple-clients.html [ Failure Pass ] +crbug.com/610835 virtual/outofblink-cors/http/tests/security/XFrameOptions/x-frame-options-deny-multiple-clients.html [ Failure Pass ] +crbug.com/610835 virtual/outofblink-cors-ns/http/tests/security/XFrameOptions/x-frame-options-deny-multiple-clients.html [ Failure Pass ] # Added 2016-12-12 crbug.com/673539 [ Linux Win ] css3/filters/effect-contrast-hw.html [ Pass Failure ] @@ -3789,6 +3834,16 @@ crbug.com/664819 http/tests/security/isolatedWorld/bypass-main-world-csp-for-xhr.html [ Pass Failure ] crbug.com/664819 http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Pass Failure ] crbug.com/664819 http/tests/security/isolatedWorld/events.html [ Pass Failure ] +crbug.com/664816 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-reportonly-blocked.php [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors/http/tests/security/isolatedWorld/bypass-main-world-csp-for-xhr.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors/http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors/http/tests/security/isolatedWorld/events.html [ Pass Failure ] +crbug.com/664816 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-reportonly-blocked.php [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/bypass-main-world-csp-for-xhr.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Pass Failure ] +crbug.com/664819 virtual/outofblink-cors-ns/http/tests/security/isolatedWorld/events.html [ Pass Failure ] crbug.com/702837 fast/text/aat-morx.html [ Skip ] @@ -3861,6 +3916,8 @@ crbug.com/678493 http/tests/permissions/chromium/test-request-window.html [ Timeout Pass ] crbug.com/678499 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ] +crbug.com/678499 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ] +crbug.com/678499 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ] crbug.com/747751 [ Win ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Failure Pass ] @@ -3959,6 +4016,10 @@ # Sheriff failures 2017-05-11 crbug.com/724027 http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Skip ] crbug.com/724027 http/tests/security/contentSecurityPolicy/source-list-parsing-04.html [ Skip ] +crbug.com/724027 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Skip ] +crbug.com/724027 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/source-list-parsing-04.html [ Skip ] +crbug.com/724027 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Skip ] +crbug.com/724027 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/source-list-parsing-04.html [ Skip ] # Sheriff failures 2017-05-16 crbug.com/722212 fast/events/pointerevents/mouse-pointer-event-properties.html [ Failure Timeout Pass ] @@ -4055,6 +4116,8 @@ # Sheriff failures 2017-07-03 crbug.com/708994 http/tests/security/cross-frame-mouse-source-capabilities.html [ Timeout Pass ] +crbug.com/708994 virtual/outofblink-cors/http/tests/security/cross-frame-mouse-source-capabilities.html [ Timeout Pass ] +crbug.com/708994 virtual/outofblink-cors-ns/http/tests/security/cross-frame-mouse-source-capabilities.html [ Timeout Pass ] crbug.com/745887 [ Mac Win ] fast/frames/sandboxed-iframe-plugins.html [ Failure Pass ] @@ -4095,6 +4158,12 @@ crbug.com/686118 http/tests/security/contentSecurityPolicy/register-bypassing-scheme.html [ Pass Crash ] crbug.com/686118 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Pass Crash ] crbug.com/686118 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/register-bypassing-scheme.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/register-bypassing-scheme.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Pass Crash ] +crbug.com/686118 virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https.html [ Pass Crash ] # Tests currently failing on Windows when run on Swarming crbug.com/757165 [ Win ] compositing/culling/filter-occlusion-blur.html [ Skip ] @@ -4233,9 +4302,13 @@ # Sheriff failures 2017-09-20 # Fails reliably on last 3 builds of this bot. crbug.com/767091 [ Mac10.12 ] http/tests/security/link-crossorigin-preload-use-credentials.html [ Failure ] +crbug.com/767091 [ Mac10.12 ] virtual/outofblink-cors/http/tests/security/link-crossorigin-preload-use-credentials.html [ Failure ] +crbug.com/767091 [ Mac10.12 ] virtual/outofblink-cors-ns/http/tests/security/link-crossorigin-preload-use-credentials.html [ Failure ] # Sheriff failures 2017-09-21 crbug.com/767469 http/tests/navigation/start-load-during-provisional-loader-detach.html [ Pass Failure ] +crbug.com/767469 virtual/outofblink-cors/http/tests/navigation/start-load-during-provisional-loader-detach.html [ Pass Failure ] +crbug.com/767469 virtual/outofblink-cors-ns/http/tests/navigation/start-load-during-provisional-loader-detach.html [ Pass Failure ] crbug.com/767469 virtual/stable/http/tests/navigation/start-load-during-provisional-loader-detach.html [ Pass Failure ] # Sheriff failures 2017-10-02 @@ -4715,12 +4788,16 @@ crbug.com/853852 [ Linux ] virtual/video-surface-layer/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Skip ] crbug.com/854538 [ Win7 ] http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ] +crbug.com/854538 [ Win7 ] virtual/outofblink-cors/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ] +crbug.com/854538 [ Win7 ] virtual/outofblink-cors-ns/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ] # Sheriff 2018-06-21 crbug.com/854910 [ Mac ] fast/scroll-behavior/smooth-scroll/track-scroll.html [ Failure Pass ] crbug.com/854910 [ Mac ] virtual/scroll_customization/fast/scroll-behavior/smooth-scroll/track-scroll.html [ Failure Pass ] # Sheriff 2018-06-25 +crbug.com/855816 [ Win7 ] virtual/outofblink-cors/http/tests/navigation/rename-subframe-goback.html [ Pass Timeout ] +crbug.com/855816 [ Win7 ] virtual/outofblink-cors-ns/http/tests/navigation/rename-subframe-goback.html [ Pass Timeout ] crbug.com/855816 [ Win7 ] virtual/stable/http/tests/navigation/rename-subframe-goback.html [ Pass Timeout ] # Sheriff 2018-06-29 @@ -4780,9 +4857,6 @@ crbug.com/867376 [ Linux ] virtual/gpu-rasterization/images/color-profile-mask-image-svg.html [ Timeout Pass ] crbug.com/867982 [ Linux Mac Debug ] external/wpt/requestidlecallback/basic.html [ Timeout Pass ] -crbug.com/698165 [ Mac ] external/wpt/editing/run/justifycenter.html [ Timeout Pass ] -crbug.com/698165 [ Mac ] external/wpt/editing/run/multitest.html [ Timeout Pass ] - # Sheriff 2018-07-27 crbug.com/868317 [ Mac ] external/wpt/dom/ranges/Range-compareBoundaryPoints.html [ Timeout Pass ] @@ -4878,6 +4952,8 @@ crbug.com/824539 [ Android ] fast/xmlhttprequest/xmlhttprequest-missing-file-exception.html [ Failure ] crbug.com/824539 [ Android ] http/tests/plugins/navigator-plugins-in-cross-origin-frame.html [ Failure ] crbug.com/824539 [ Android ] http/tests/security/local-JavaScript-from-remote.html [ Crash Failure ] +crbug.com/824539 [ Android ] virtual/outofblink-cors/http/tests/security/local-JavaScript-from-remote.html [ Crash Failure ] +crbug.com/824539 [ Android ] virtual/outofblink-cors-ns/http/tests/security/local-JavaScript-from-remote.html [ Crash Failure ] crbug.com/824539 [ Android ] images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ] crbug.com/824539 [ Android ] images/size-failure.html [ Failure ] crbug.com/824539 [ Android ] paint/invalidation/shadow-multiple.html [ Failure ] @@ -4923,7 +4999,6 @@ # Sheriff 2018-08-08 crbug.com/871105 [ Linux ] svg/dom/remove-use-target-element-indirectly.html [ Pass Crash ] crbug.com/872025 [ Mac Linux ] fast/css-grid-layout/crash-large-positions.html [ Pass Timeout ] -crbug.com/871416 fast/spatial-navigation/snav-stay-in-overflow-div.html [ Pass Failure ] # Only passes on bots with GPUs. crbug.com/871445 [ Mac ] http/tests/media/video-load-metadata-decode-error.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites index a2a8ec8..19b4dce 100644 --- a/third_party/WebKit/LayoutTests/VirtualTestSuites +++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -512,6 +512,16 @@ }, { "prefix": "outofblink-cors", + "base": "http/tests/navigation", + "args": ["--enable-features=OutOfBlinkCORS,ServiceWorkerServicification"] + }, + { + "prefix": "outofblink-cors", + "base": "http/tests/security", + "args": ["--enable-features=OutOfBlinkCORS,ServiceWorkerServicification"] + }, + { + "prefix": "outofblink-cors", "base": "http/tests/xmlhttprequest", "args": ["--enable-features=OutOfBlinkCORS,ServiceWorkerServicification"] }, @@ -547,6 +557,16 @@ }, { "prefix": "outofblink-cors-ns", + "base": "http/tests/navigation", + "args": ["--enable-features=OutOfBlinkCORS,NetworkService"] + }, + { + "prefix": "outofblink-cors-ns", + "base": "http/tests/security", + "args": ["--enable-features=OutOfBlinkCORS,NetworkService"] + }, + { + "prefix": "outofblink-cors-ns", "base": "http/tests/xmlhttprequest", "args": ["--enable-features=OutOfBlinkCORS,NetworkService"] },
diff --git a/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs-expected.txt b/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs-expected.txt index 48ad03fc..34f47f0 100644 --- a/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs-expected.txt
@@ -13,5 +13,8 @@ PASS Text input with multiple label-for PASS Text input with title and aria-placeholder PASS Text input with title and aria-placeholder +PASS Div with textbox role and aria-placeholder +PASS Div with textbox role and title and aria-placeholder +PASS Div without textbox role and aria-placeholder Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs.html b/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs.html index 9b93b07..4319d33a 100644 --- a/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs.html +++ b/third_party/WebKit/LayoutTests/accessibility/name-calc-inputs.html
@@ -178,6 +178,41 @@ }, "Text input with title and aria-placeholder"); </script> +<div class="container"> + <div role="textbox" id="text14" aria-placeholder="text14-aria-placeholder"> +</div> + +<script> +test(function(t) { + var axTextInput14 = accessibilityController.accessibleElementById("text14"); + assert_equals(axTextInput14.name, "text14-aria-placeholder"); + assert_equals(axTextInput14.nameFrom, "placeholder"); +}, "Div with textbox role and aria-placeholder"); +</script> + +<div class="container"> + <div role="textbox" id="text15" title="text15-title" aria-placeholder="text15-aria-placeholder"> +</div> + +<script> +test(function(t) { + var axTextInput15 = accessibilityController.accessibleElementById("text15"); + assert_equals(axTextInput15.name, "text15-aria-placeholder"); + assert_equals(axTextInput15.nameFrom, "placeholder"); +}, "Div with textbox role and title and aria-placeholder"); +</script> + +<div class="container"> + <div id="text16" role="button" aria-placeholder="text16-aria-placeholder"> +</div> +<script> +test(function(t) { + var axTextInput16 = accessibilityController.accessibleElementById("text16"); + assert_equals(axTextInput16.name, ""); + assert_equals(axTextInput16.nameFrom, ""); +}, "Div without textbox role and aria-placeholder"); +</script> + <script> if (window.testRunner) document.body.className = "hideAllContainers";
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json index a5a6cc6..a9b64cb 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
@@ -4231,6 +4231,12 @@ {} ] ], + "hr-time/unload-manual.html": [ + [ + "/hr-time/unload-manual.html", + {} + ] + ], "html-media-capture/capture_audio-manual.html": [ [ "/html-media-capture/capture_audio-manual.html", @@ -36971,6 +36977,18 @@ {} ] ], + "css/css-contain/contain-size-scrollbars-001.html": [ + [ + "/css/css-contain/contain-size-scrollbars-001.html", + [ + [ + "/css/css-contain/reference/contain-size-scrollbars-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-strict-001.html": [ [ "/css/css-contain/contain-strict-001.html", @@ -49771,6 +49789,30 @@ {} ] ], + "css/css-masking/clip-path/clip-path-path-001.html": [ + [ + "/css/css-masking/clip-path/clip-path-path-001.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-path-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/clip-path/clip-path-path-002.html": [ + [ + "/css/css-masking/clip-path/clip-path-path-002.html", + [ + [ + "/css/css-masking/clip-path/reference/clip-path-path-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/clip-path/clip-path-polygon-001.html": [ [ "/css/css-masking/clip-path/clip-path-polygon-001.html", @@ -50215,6 +50257,54 @@ {} ] ], + "css/css-masking/mask-image/mask-image-url-image-hash.html": [ + [ + "/css/css-masking/mask-image/mask-image-url-image-hash.html", + [ + [ + "/css/css-masking/mask-image/reference/mask-image-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/mask-image/mask-image-url-image.html": [ + [ + "/css/css-masking/mask-image/mask-image-url-image.html", + [ + [ + "/css/css-masking/mask-image/reference/mask-image-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/mask-image/mask-image-url-local-mask.html": [ + [ + "/css/css-masking/mask-image/mask-image-url-local-mask.html", + [ + [ + "/css/css-masking/mask-image/reference/mask-image-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-masking/mask-image/mask-image-url-remote-mask.html": [ + [ + "/css/css-masking/mask-image/mask-image-url-remote-mask.html", + [ + [ + "/css/css-masking/mask-image/reference/mask-image-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/test-mask.html": [ [ "/css/css-masking/test-mask.html", @@ -96563,6 +96653,18 @@ {} ] ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html": [ + [ + "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html", + [ + [ + "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html", + "==" + ] + ], + {} + ] + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order.html": [ [ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order.html", @@ -106669,6 +106771,11 @@ {} ] ], + "background-fetch/fetch.https.window-expected.txt": [ + [ + {} + ] + ], "background-fetch/idlharness.https.any-expected.txt": [ [ {} @@ -108079,6 +108186,16 @@ {} ] ], + "content-security-policy/script-src-attr-elem/support/t_done.js": [ + [ + {} + ] + ], + "content-security-policy/script-src-attr-elem/support/t_fail.js": [ + [ + {} + ] + ], "content-security-policy/script-src/10_1_support_1.js": [ [ {} @@ -116329,11 +116446,6 @@ {} ] ], - "css/css-backgrounds/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-backgrounds/reference/60x60-green-background.html": [ [ {} @@ -117014,11 +117126,6 @@ {} ] ], - "css/css-box/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-break/META.yml": [ [ {} @@ -117059,11 +117166,6 @@ {} ] ], - "css/css-cascade/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-cascade/reference/ref-filled-green-100px-square.xht": [ [ {} @@ -117139,11 +117241,6 @@ {} ] ], - "css/css-color/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-color/rebeccapurple-ref.html": [ [ {} @@ -117599,6 +117696,11 @@ {} ] ], + "css/css-contain/reference/contain-size-scrollbars-001-ref.html": [ + [ + {} + ] + ], "css/css-contain/reference/contain-style-breaks-001-ref.html": [ [ {} @@ -128214,11 +128316,6 @@ {} ] ], - "css/css-images/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-images/support/1x1-green.gif": [ [ {} @@ -128874,6 +128971,16 @@ {} ] ], + "css/css-masking/clip-path/reference/clip-path-path-001-ref.html": [ + [ + {} + ] + ], + "css/css-masking/clip-path/reference/clip-path-path-002-ref.html": [ + [ + {} + ] + ], "css/css-masking/clip-path/reference/clip-path-rectangle-border-ref.html": [ [ {} @@ -128984,6 +129091,26 @@ {} ] ], + "css/css-masking/mask-image/reference/mask-image-ref.html": [ + [ + {} + ] + ], + "css/css-masking/mask-image/support/image-with-ref.svg": [ + [ + {} + ] + ], + "css/css-masking/mask-image/support/image.svg": [ + [ + {} + ] + ], + "css/css-masking/mask-image/support/mask.svg": [ + [ + {} + ] + ], "css/css-masking/parsing/clip-path-invalid-expected.txt": [ [ {} @@ -128994,11 +129121,6 @@ {} ] ], - "css/css-masking/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-masking/test-mask-ref.html": [ [ {} @@ -130419,11 +130541,6 @@ {} ] ], - "css/css-shapes/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-shapes/shape-outside/formatting-context/reference/shape-outside-formatting-context-ref.html": [ [ {} @@ -133964,11 +134081,6 @@ {} ] ], - "css/css-transforms/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-transforms/parsing/transform-box-valid-expected.txt": [ [ {} @@ -136089,11 +136201,6 @@ {} ] ], - "css/css-ui/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-ui/reference/box-sizing-001-ref.html": [ [ {} @@ -138314,11 +138421,6 @@ {} ] ], - "css/css-writing-modes/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/css-writing-modes/reference/available-size-001-ref.html": [ [ {} @@ -141254,11 +141356,6 @@ {} ] ], - "css/motion/parsing/support/parsing-testcommon.js": [ - [ - {} - ] - ], "css/reference/META.yml": [ [ {} @@ -141699,6 +141796,11 @@ {} ] ], + "css/support/parsing-testcommon.js": [ + [ + {} + ] + ], "css/support/pattern-grg-rgr-grg.png": [ [ {} @@ -145114,26 +145216,6 @@ {} ] ], - "encoding/idlharness.any-expected.txt": [ - [ - {} - ] - ], - "encoding/idlharness.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/idlharness.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/idlharness.any.worker-expected.txt": [ - [ - {} - ] - ], "encoding/iso-2022-jp-decoder-expected.txt": [ [ {} @@ -146179,211 +146261,6 @@ {} ] ], - "encoding/streams/backpressure.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/backpressure.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/backpressure.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/backpressure.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-bad-chunks.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-bad-chunks.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-bad-chunks.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-bad-chunks.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-ignore-bom.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-ignore-bom.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-ignore-bom.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-ignore-bom.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-incomplete-input.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-incomplete-input.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-incomplete-input.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-incomplete-input.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-non-utf8.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-non-utf8.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-non-utf8.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-non-utf8.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-split-character.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-split-character.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-split-character.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-split-character.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-utf8.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/decode-utf8.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-bad-chunks.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-bad-chunks.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-bad-chunks.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-bad-chunks.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-utf8.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-utf8.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-utf8.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/encode-utf8.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/readable-writable-properties.any-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/readable-writable-properties.any.serviceworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/readable-writable-properties.any.sharedworker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/readable-writable-properties.any.worker-expected.txt": [ - [ - {} - ] - ], - "encoding/streams/realms.window-expected.txt": [ - [ - {} - ] - ], "encoding/streams/resources/readable-stream-from-array.js": [ [ {} @@ -149239,6 +149116,26 @@ {} ] ], + "hr-time/resources/unload-a.html": [ + [ + {} + ] + ], + "hr-time/resources/unload-b.html": [ + [ + {} + ] + ], + "hr-time/resources/unload-c.html": [ + [ + {} + ] + ], + "hr-time/resources/unload.js": [ + [ + {} + ] + ], "html-media-capture/META.yml": [ [ {} @@ -157149,6 +157046,11 @@ {} ] ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html": [ + [ + {} + ] + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order-ref.html": [ [ {} @@ -159969,11 +159871,6 @@ {} ] ], - "html/semantics/scripting-1/the-script-element/execution-timing/084-expected.txt": [ - [ - {} - ] - ], "html/semantics/scripting-1/the-script-element/execution-timing/102.html": [ [ {} @@ -160129,6 +160026,21 @@ {} ] ], + "html/semantics/scripting-1/the-script-element/goal-parameter-expected.txt": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/is-module-goal.mjs": [ + [ + {} + ] + ], + "html/semantics/scripting-1/the-script-element/is-script-goal.js": [ + [ + {} + ] + ], "html/semantics/scripting-1/the-script-element/log.py": [ [ {} @@ -162199,6 +162111,11 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html": [ + [ + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/set-document-domain.html": [ [ {} @@ -162494,16 +162411,6 @@ {} ] ], - "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1-expected.txt": [ - [ - {} - ] - ], - "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2-expected.txt": [ - [ - {} - ] - ], "html/webappapis/structured-clone/structured-clone-battery-of-tests-harness.js": [ [ {} @@ -163634,6 +163541,11 @@ {} ] ], + "interfaces/wai-aria.idl": [ + [ + {} + ] + ], "interfaces/wake-lock.idl": [ [ {} @@ -179859,6 +179771,11 @@ {} ] ], + "workers/support/imported_script.py": [ + [ + {} + ] + ], "workers/support/name-as-accidental-global.js": [ [ {} @@ -180169,16 +180086,6 @@ {} ] ], - "xhr/event-upload-progress-crossorigin-expected.txt": [ - [ - {} - ] - ], - "xhr/event-upload-progress-expected.txt": [ - [ - {} - ] - ], "xhr/folder.txt": [ [ {} @@ -192440,6 +192347,54 @@ {} ] ], + "content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html": [ + [ + "/content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html": [ + [ + "/content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html", + {} + ] + ], + "content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html": [ + [ + "/content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html", + {} + ] + ], "content-security-policy/script-src/injected-inline-script-allowed.sub.html": [ [ "/content-security-policy/script-src/injected-inline-script-allowed.sub.html", @@ -192866,6 +192821,42 @@ {} ] ], + "content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html", + {} + ] + ], + "content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html", + {} + ] + ], + "content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html", + {} + ] + ], + "content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html", + {} + ] + ], + "content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html", + {} + ] + ], + "content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html": [ + [ + "/content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html", + {} + ] + ], "content-security-policy/style-src/injected-inline-style-allowed.sub.html": [ [ "/content-security-policy/style-src/injected-inline-style-allowed.sub.html", @@ -195242,6 +195233,18 @@ {} ] ], + "css/css-display/parsing/display-invalid.html": [ + [ + "/css/css-display/parsing/display-invalid.html", + {} + ] + ], + "css/css-display/parsing/display-valid.html": [ + [ + "/css/css-display/parsing/display-valid.html", + {} + ] + ], "css/css-env/at-supports.tentative.html": [ [ "/css/css-env/at-supports.tentative.html", @@ -197440,6 +197443,66 @@ {} ] ], + "css/css-grid/parsing/grid-area-invalid.html": [ + [ + "/css/css-grid/parsing/grid-area-invalid.html", + {} + ] + ], + "css/css-grid/parsing/grid-area-valid.html": [ + [ + "/css/css-grid/parsing/grid-area-valid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-columns-invalid.html": [ + [ + "/css/css-grid/parsing/grid-auto-columns-invalid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-columns-valid.html": [ + [ + "/css/css-grid/parsing/grid-auto-columns-valid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-flow-invalid.html": [ + [ + "/css/css-grid/parsing/grid-auto-flow-invalid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-flow-valid.html": [ + [ + "/css/css-grid/parsing/grid-auto-flow-valid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-rows-invalid.html": [ + [ + "/css/css-grid/parsing/grid-auto-rows-invalid.html", + {} + ] + ], + "css/css-grid/parsing/grid-auto-rows-valid.html": [ + [ + "/css/css-grid/parsing/grid-auto-rows-valid.html", + {} + ] + ], + "css/css-grid/parsing/grid-template-areas-invalid.html": [ + [ + "/css/css-grid/parsing/grid-template-areas-invalid.html", + {} + ] + ], + "css/css-grid/parsing/grid-template-areas-valid.html": [ + [ + "/css/css-grid/parsing/grid-template-areas-valid.html", + {} + ] + ], "css/css-images/gradient/color-stops-parsing.html": [ [ "/css/css-images/gradient/color-stops-parsing.html", @@ -207819,273 +207882,387 @@ "editing/run/backcolor.html": [ [ "/editing/run/backcolor.html", - {} + { + "timeout": "long" + } ] ], "editing/run/bold.html": [ [ "/editing/run/bold.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/bold.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/bold.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/bold.html?3001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/createlink.html": [ [ "/editing/run/createlink.html", - {} + { + "timeout": "long" + } ] ], "editing/run/delete-list-items-in-table-cell.html": [ [ "/editing/run/delete-list-items-in-table-cell.html", - {} + { + "timeout": "long" + } ] ], "editing/run/delete.html": [ [ "/editing/run/delete.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?4001-5000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?5001-6000", - {} + { + "timeout": "long" + } ], [ "/editing/run/delete.html?6001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/fontname.html": [ [ "/editing/run/fontname.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/fontname.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/fontname.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/fontsize.html": [ [ "/editing/run/fontsize.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/fontsize.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/fontsize.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/forecolor.html": [ [ "/editing/run/forecolor.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forecolor.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forecolor.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/formatblock.html": [ [ "/editing/run/formatblock.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/formatblock.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/formatblock.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/formatblock.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/formatblock.html?4001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/forwarddelete.html": [ [ "/editing/run/forwarddelete.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?4001-5000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?5001-6000", - {} + { + "timeout": "long" + } ], [ "/editing/run/forwarddelete.html?6001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/hilitecolor.html": [ [ "/editing/run/hilitecolor.html", - {} + { + "timeout": "long" + } ] ], "editing/run/indent.html": [ [ "/editing/run/indent.html", - {} + { + "timeout": "long" + } ] ], "editing/run/insert-list-items-in-table-cell.html": [ [ "/editing/run/insert-list-items-in-table-cell.html", - {} + { + "timeout": "long" + } ] ], "editing/run/inserthorizontalrule.html": [ [ "/editing/run/inserthorizontalrule.html", - {} + { + "timeout": "long" + } ] ], "editing/run/inserthtml.html": [ [ "/editing/run/inserthtml.html", - {} + { + "timeout": "long" + } ] ], "editing/run/insertimage.html": [ [ "/editing/run/insertimage.html", - {} + { + "timeout": "long" + } ] ], "editing/run/insertlinebreak.html": [ [ "/editing/run/insertlinebreak.html", - {} + { + "timeout": "long" + } ] ], "editing/run/insertorderedlist.html": [ [ "/editing/run/insertorderedlist.html", - {} + { + "timeout": "long" + } ] ], "editing/run/insertparagraph.html": [ [ "/editing/run/insertparagraph.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?4001-5000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?5001-6000", - {} + { + "timeout": "long" + } ], [ "/editing/run/insertparagraph.html?6001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/inserttext.html": [ [ "/editing/run/inserttext.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/inserttext.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/inserttext.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/insertunorderedlist.html": [ [ "/editing/run/insertunorderedlist.html", - {} + { + "timeout": "long" + } ] ], "editing/run/italic.html": [ [ "/editing/run/italic.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/italic.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/italic.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/justifycenter.html": [ @@ -208135,65 +208312,93 @@ "editing/run/justifyfull.html": [ [ "/editing/run/justifyfull.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyfull.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyfull.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyfull.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyfull.html?4001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/justifyleft.html": [ [ "/editing/run/justifyleft.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyleft.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyleft.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/justifyright.html": [ [ "/editing/run/justifyright.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyright.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyright.html?2001-3000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyright.html?3001-4000", - {} + { + "timeout": "long" + } ], [ "/editing/run/justifyright.html?4001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/misc.html": [ [ "/editing/run/misc.html", - {} + { + "timeout": "long" + } ] ], "editing/run/multitest.html": [ @@ -208261,67 +208466,93 @@ "editing/run/outdent.html": [ [ "/editing/run/outdent.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/outdent.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/outdent.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/removeformat.html": [ [ "/editing/run/removeformat.html", - {} + { + "timeout": "long" + } ] ], "editing/run/strikethrough.html": [ [ "/editing/run/strikethrough.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/strikethrough.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/strikethrough.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/subscript.html": [ [ "/editing/run/subscript.html", - {} + { + "timeout": "long" + } ] ], "editing/run/superscript.html": [ [ "/editing/run/superscript.html", - {} + { + "timeout": "long" + } ] ], "editing/run/underline.html": [ [ "/editing/run/underline.html?1-1000", - {} + { + "timeout": "long" + } ], [ "/editing/run/underline.html?1001-2000", - {} + { + "timeout": "long" + } ], [ "/editing/run/underline.html?2001-last", - {} + { + "timeout": "long" + } ] ], "editing/run/unlink.html": [ [ "/editing/run/unlink.html", - {} + { + "timeout": "long" + } ] ], "encoding/api-basics.any.js": [ @@ -215770,6 +216001,24 @@ {} ] ], + "encoding/streams/decode-attributes.any.js": [ + [ + "/encoding/streams/decode-attributes.any.html", + {} + ], + [ + "/encoding/streams/decode-attributes.any.serviceworker.html", + {} + ], + [ + "/encoding/streams/decode-attributes.any.sharedworker.html", + {} + ], + [ + "/encoding/streams/decode-attributes.any.worker.html", + {} + ] + ], "encoding/streams/decode-bad-chunks.any.js": [ [ "/encoding/streams/decode-bad-chunks.any.html", @@ -222400,6 +222649,12 @@ {} ] ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html": [ + [ + "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html", + {} + ] + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html": [ [ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html", @@ -228022,6 +228277,12 @@ {} ] ], + "html/semantics/scripting-1/the-script-element/goal-parameter.htm": [ + [ + "/html/semantics/scripting-1/the-script-element/goal-parameter.htm", + {} + ] + ], "html/semantics/scripting-1/the-script-element/historical.html": [ [ "/html/semantics/scripting-1/the-script-element/historical.html", @@ -231198,6 +231459,12 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.html", + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.js": [ [ "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.html", @@ -259328,6 +259595,12 @@ {} ] ], + "trusted-types/Element-setAttribute.tentative.html": [ + [ + "/trusted-types/Element-setAttribute.tentative.html", + {} + ] + ], "trusted-types/HTMLElement-generic.tentative.html": [ [ "/trusted-types/HTMLElement-generic.tentative.html", @@ -259364,6 +259637,18 @@ {} ] ], + "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [ + [ + "/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html", + {} + ] + ], + "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html": [ + [ + "/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html", + {} + ] + ], "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [ [ "/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html", @@ -259412,6 +259697,12 @@ {} ] ], + "trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html": [ + [ + "/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html", + {} + ] + ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ [ "/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html", @@ -264770,6 +265061,12 @@ {} ] ], + "websockets/cookies/006.https.html": [ + [ + "/websockets/cookies/006.https.html?wss", + {} + ] + ], "websockets/cookies/007.html": [ [ "/websockets/cookies/007.html", @@ -267298,6 +267595,20 @@ {} ] ], + "workers/importscripts_mime.tentative.any.js": [ + [ + "/workers/importscripts_mime.tentative.any.serviceworker.html", + {} + ], + [ + "/workers/importscripts_mime.tentative.any.sharedworker.html", + {} + ], + [ + "/workers/importscripts_mime.tentative.any.worker.html", + {} + ] + ], "workers/interfaces.worker.js": [ [ "/workers/interfaces.worker.html", @@ -284437,8 +284748,12 @@ "764257d7d1a8eecfba6735647637055b21dcb94b", "testharness" ], + "background-fetch/fetch.https.window-expected.txt": [ + "2c482da082d950ccfd187e2e62b53e87611c2522", + "support" + ], "background-fetch/fetch.https.window.js": [ - "b8b1e5a83005bbd72f5cb7dcee99d57639363e20", + "f2cffd0b8cfc569ff1ad23bf1ac86596dcde6603", "testharness" ], "background-fetch/get-ids.https.window.js": [ @@ -286110,7 +286425,7 @@ "support" ], "content-security-policy/blob/blob-urls-do-not-match-self.sub.html": [ - "1bf96df17c0ed1af565a6765c72ec9e6ec5752a9", + "cafa1e366026c2b079aff2ef7b4e34541f8349b6", "testharness" ], "content-security-policy/blob/blob-urls-match-blob.sub.html": [ @@ -286262,7 +286577,7 @@ "testharness" ], "content-security-policy/default-src/default-src-inline-blocked.sub.html": [ - "86873553c6bd8f4f323e8c05084ca2469ed7cc3d", + "0cb4ca55387990c0631f29c3b56712e8c540b3b1", "testharness" ], "content-security-policy/embedded-enforcement/allow_csp_from-header.html": [ @@ -286702,7 +287017,7 @@ "support" ], "content-security-policy/generic/filesystem-urls-do-not-match-self.sub.html": [ - "401b65a898dd1cb21130833d7ebe6bf374ac1c8f", + "afb272cf36adbf3af72a6882b9280f0c9443454b", "testharness" ], "content-security-policy/generic/filesystem-urls-match-filesystem.sub.html": [ @@ -286714,7 +287029,7 @@ "testharness" ], "content-security-policy/generic/generic-0_1-script-src.html": [ - "d27b922565b84ec2d620374f205178961a517948", + "35033c3899f78e1f176f34977e4e069d935ff1b3", "testharness" ], "content-security-policy/generic/generic-0_10.html": [ @@ -286722,7 +287037,7 @@ "testharness" ], "content-security-policy/generic/generic-0_10_1.sub.html": [ - "107ab905bcfc1262b17f869733c107606ad23b74", + "f48c1e3c56ffdeb5fceec5b392c384b9a67295db", "testharness" ], "content-security-policy/generic/generic-0_2.html": [ @@ -286730,11 +287045,11 @@ "testharness" ], "content-security-policy/generic/generic-0_2_2.sub.html": [ - "cdb6238e4e0df6aa3168bf71f1817f4874ba1fcc", + "6cb75e31ae3138e02ed409ebd5a8d1998331f1eb", "testharness" ], "content-security-policy/generic/generic-0_2_3.html": [ - "754c9a3288f88585caeb59e611b7a7be26aaa097", + "d9c230d2a5c16c86d746f62bc340fb3df3ca4302", "testharness" ], "content-security-policy/generic/generic-0_8.sub.html": [ @@ -286742,7 +287057,7 @@ "testharness" ], "content-security-policy/generic/generic-0_8_1.sub.html": [ - "c2d968b3664739d5373c572566b415b4efd04763", + "e8ce23415f7aca1a3b5ccfc6fc637730eee8d835", "testharness" ], "content-security-policy/generic/generic-0_9.sub.html": [ @@ -286934,7 +287249,7 @@ "testharness" ], "content-security-policy/meta/combine-header-and-meta-policies.sub.html": [ - "6e9e71dd921a8d2646ecef1f52a45100d6c8cf09", + "70bfeb6b3bbe86a2cbb97dd78552c4bd42e7acdb", "testharness" ], "content-security-policy/meta/combine-header-and-meta-policies.sub.html.sub.headers": [ @@ -287186,7 +287501,7 @@ "testharness" ], "content-security-policy/navigation/to-javascript-url-script-src.html": [ - "6c120adac20297ef6b31d52ed9b05049db332473", + "70dea1f985e6b7642b5bfd194c34f1d8c8dcaa74", "testharness" ], "content-security-policy/nonce-hiding/script-nonces-hidden-meta.tentative.sub.html": [ @@ -287553,6 +287868,46 @@ "dd69c41354b583e427d4e12a060f1b6f71eb2c86", "testharness" ], + "content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html": [ + "d4c19c546676d031e4e8aa9e2e3bd59c7ae898d1", + "testharness" + ], + "content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html": [ + "199726e212d93b769aa128992ead4ef95d1d3453", + "testharness" + ], + "content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html": [ + "c21898377e5cea61af577060aa7c47320a60aa8f", + "testharness" + ], + "content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html": [ + "c7954613c78999631e932c89f2ad46b85f470fe6", + "testharness" + ], + "content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html": [ + "4a85c15376c93a27d0026d6f46172dc22929765c", + "testharness" + ], + "content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html": [ + "ac4726f9f4bcf93c0500ba374b5218c1959435f1", + "testharness" + ], + "content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html": [ + "b6543778230247f758773f667915fdad0ebfa901", + "testharness" + ], + "content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html": [ + "04394dc33ac17c024fa448046ab7725c17061766", + "testharness" + ], + "content-security-policy/script-src-attr-elem/support/t_done.js": [ + "e31eb1d95927d6f9132d127796861de23c8df719", + "support" + ], + "content-security-policy/script-src-attr-elem/support/t_fail.js": [ + "fa48d6e2c5dda3fe0521f4cc5ceb2104ff467ea7", + "support" + ], "content-security-policy/script-src/10_1_support_1.js": [ "9bfe201711a0b4f3201700261fe13135cf4e8d02", "support" @@ -287562,7 +287917,7 @@ "support" ], "content-security-policy/script-src/addInlineTestsWithDOMManipulation.js": [ - "a5d91dcab0fe3886454e9de92007983c90025a3c", + "02c8c8cdd421dd3db80929d57e34325ab834e84b", "support" ], "content-security-policy/script-src/buildInlineWorker.js": [ @@ -287586,7 +287941,7 @@ "testharness" ], "content-security-policy/script-src/injected-inline-script-blocked.sub.html": [ - "07e2ae2871c7e07538fd02685ebf35779afa8164", + "45c389f7f1e930927bc951f2373dd3dd3c6758c4", "testharness" ], "content-security-policy/script-src/inlineSuccessTest.js": [ @@ -287594,11 +287949,11 @@ "support" ], "content-security-policy/script-src/inlineTests.js": [ - "0c6e5446041dee68d844989256af3d48a1be6406", + "3c0712b4499019372223bf7c36ec51548cfb6c79", "support" ], "content-security-policy/script-src/javascript-window-open-blocked.html": [ - "e02d66ae9c9c8da6f7e15329d5f9d12f91024b3b", + "ae4d8227edc83cb238fda810268a73278ab31bfd", "testharness" ], "content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers": [ @@ -287670,7 +288025,7 @@ "testharness" ], "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html": [ - "16428b1a4de67f73e7186ec84d32f11564c57ba0", + "3c4e39e8250287adb729ea3ceab5e2fb6943cf7d", "testharness" ], "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers": [ @@ -287678,7 +288033,7 @@ "support" ], "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html": [ - "9ae66611ea52e0bbd1e29a5e5072bb7254afdd51", + "850f4b2c2eed88876d8da2fa866aa513469fc462", "testharness" ], "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers": [ @@ -287710,7 +288065,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html": [ - "4e1944683046de49c0fedc7896d34a83cf0caf30", + "51b0b7971a09f550cd89070db74ec47d9d9c0a90", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html.headers": [ @@ -287718,7 +288073,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html": [ - "cd2ae8c16c0f4fa37a591c8b40451f707d08c22c", + "91d12ed7bd33a81d670526a4a8d8583897466821", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html.headers": [ @@ -287726,7 +288081,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html": [ - "94490de1b465cfa683ee560147c4f80426d8bec4", + "314ed91e5d30e26b3e9d05f9618f06deadf9fbb3", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html.headers": [ @@ -287734,7 +288089,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html": [ - "1e057ba947ebfabf38df89948cffedfd9f5762e0", + "1ceb74c63d1392672a36a2506b63c50199aa39fd", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html.headers": [ @@ -287766,7 +288121,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html": [ - "3a6151b10f3897eaacf1414757431693242240a5", + "f7625afdaf9056274c607ed9b209ea976d013459", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html.headers": [ @@ -287798,7 +288153,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html": [ - "19d2ae1acc7a0c0323c5bba51e16e06dea576427", + "ac180d23f50981737ea66b2b63cce0c3fa3c9b50", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html.headers": [ @@ -287806,7 +288161,7 @@ "support" ], "content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html": [ - "c167e5ef625961bd21eaf3eb6f8510ef8b2ad41f", + "c5e33dc4253dbf3ce2b0c6cb2fca4b0306d68244", "testharness" ], "content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html.headers": [ @@ -287850,7 +288205,7 @@ "testharness" ], "content-security-policy/script-src/scripthash-unicode-normalization.sub.html": [ - "0c303630331cdbd6ebeb79a0aa088832e1817708", + "4212297c68399ad32038f5e7bad2f8c8e4aa3120", "testharness" ], "content-security-policy/script-src/scriptnonce-allowed.sub.html": [ @@ -287858,15 +288213,15 @@ "testharness" ], "content-security-policy/script-src/scriptnonce-and-scripthash.sub.html": [ - "94a39973af274382f22096f8131cdb0e0443051b", + "8f1f596bd0039c4eadcdc8f2b84a54f8785262a0", "testharness" ], "content-security-policy/script-src/scriptnonce-basic-blocked.sub.html": [ - "db94c1c5f4bb8bd4053ade5cb7e42d62f93fc5e7", + "2001afcd9cac51a007569bf8ea0642dc905b5422", "testharness" ], "content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html": [ - "18a6899a5cd160b95cace980168efc4e54d79474", + "b595b76389ffce3e8ee642e9581073f4dbbe04a1", "testharness" ], "content-security-policy/script-src/scriptnonce-redirect.sub.html": [ @@ -287878,7 +288233,7 @@ "support" ], "content-security-policy/script-src/srcdoc-doesnt-bypass-script-src.sub.html": [ - "eea201865aa42d9f7827203baeaaf5b1783095cd", + "2cae85ec301fa2cd15005468b7efab6440ec2f17", "testharness" ], "content-security-policy/script-src/support/inject-script.js": [ @@ -288037,12 +288392,36 @@ "b8bec0b95e3955cada8d5ddbd8af354cc60026f0", "support" ], + "content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html": [ + "567e22496ccbd15df87a44b602461a221639204c", + "testharness" + ], + "content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html": [ + "622c3bf76486cee122f317d9096eb4ce0455696a", + "testharness" + ], + "content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html": [ + "279600ea2e18a56d0c429bccd0c19d311e932387", + "testharness" + ], + "content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html": [ + "c15cf0bcf64cb535de38235bf1971cd7e4e7f1d0", + "testharness" + ], + "content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html": [ + "a42c9de9b84d2a30669742c3a1e7a423a572ac53", + "testharness" + ], + "content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html": [ + "bf5014a45842f6d7e8ef888c5049a1c139fa5c69", + "testharness" + ], "content-security-policy/style-src/injected-inline-style-allowed.sub.html": [ "e91c4e46ac7df40e98791155d53e9f3a947b45cd", "testharness" ], "content-security-policy/style-src/injected-inline-style-blocked.sub.html": [ - "d7e7de22cf601f732a938512fa0144d76ae7bbeb", + "978671223e85996112fd5429969eb35e7eda09d5", "testharness" ], "content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html": [ @@ -288058,7 +288437,7 @@ "testharness" ], "content-security-policy/style-src/inline-style-attribute-blocked.sub.html": [ - "e2d84915cf0e45781e975ea1fc0711f08f53d84d", + "71e5a88b7a554a9c99caad4d00b944f1c4bd915f", "testharness" ], "content-security-policy/style-src/inline-style-attribute-on-html.sub.html": [ @@ -288102,7 +288481,7 @@ "testharness" ], "content-security-policy/style-src/style-src-hash-blocked.html": [ - "b5d94040ed662920f725aa400a938c799e4320fc", + "dec3b6e853b2a95dfad499a824f41bb529440075", "testharness" ], "content-security-policy/style-src/style-src-hash-default-src-allowed.html": [ @@ -288114,7 +288493,7 @@ "testharness" ], "content-security-policy/style-src/style-src-imported-style-blocked.html": [ - "a00888098a5bc6eb6701fa3b788beef989611478", + "e5016c2382f461cddc21c585bb5b49f2ecaedd7d", "testharness" ], "content-security-policy/style-src/style-src-injected-inline-style-allowed.html": [ @@ -288122,7 +288501,7 @@ "testharness" ], "content-security-policy/style-src/style-src-injected-inline-style-blocked.html": [ - "797cb13e70b54fba71026fd80aed071beb9733fd", + "fd27938f0674270f0f0d489204c21215777ac85c", "testharness" ], "content-security-policy/style-src/style-src-injected-stylesheet-allowed.sub.html": [ @@ -288130,7 +288509,7 @@ "testharness" ], "content-security-policy/style-src/style-src-injected-stylesheet-blocked.sub.html": [ - "a2c8e722795e223ecb6b914f81601f5d2ab15a7b", + "6191bb2d555dc130747c84d51993193d16eae2a9", "testharness" ], "content-security-policy/style-src/style-src-inline-style-allowed.html": [ @@ -288142,11 +288521,11 @@ "testharness" ], "content-security-policy/style-src/style-src-inline-style-attribute-blocked.html": [ - "66b8f545c770deabc90dd3e5b081fefbb7bd3767", + "5072a2c8e2b2db1709afa2b108c085724110c597", "testharness" ], "content-security-policy/style-src/style-src-inline-style-blocked.html": [ - "7374e44902f18b575f1e27d947d5afe64b25c9f6", + "1baff387ae8f0734b95e00a1dad41162dfdf70f8", "testharness" ], "content-security-policy/style-src/style-src-inline-style-nonce-allowed.html": [ @@ -288154,11 +288533,11 @@ "testharness" ], "content-security-policy/style-src/style-src-inline-style-nonce-blocked-error-event.html": [ - "53b1b0131573d4faf52bb117f5670f935381658f", + "83eaabaa9b15a4295b0b19220586806fbd65ca1b", "testharness" ], "content-security-policy/style-src/style-src-inline-style-nonce-blocked.html": [ - "f2cb2f2a775a3031635bfaab4fbed7f8c6d67b17", + "016b4ebdc4939562e819fd2d3d70e1e6c7208501", "testharness" ], "content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html": [ @@ -288170,7 +288549,7 @@ "support" ], "content-security-policy/style-src/style-src-none-blocked.html": [ - "35696ade7f5e7f610b86a606bdcdb913d37a0a1c", + "2a80b827c8c32e594ce0b5cf3f8f02f0b3b0813e", "testharness" ], "content-security-policy/style-src/style-src-star-allowed.html": [ @@ -288182,7 +288561,7 @@ "testharness" ], "content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html": [ - "8095da54d32a13e8a355aa7af1d8ba59fc74972a", + "a076eafd559c80bb510aa3c43669be563646adb8", "testharness" ], "content-security-policy/style-src/stylehash-allowed.sub.html": [ @@ -288190,7 +288569,7 @@ "testharness" ], "content-security-policy/style-src/stylehash-basic-blocked.sub.html": [ - "d9f0fbf653eac2b58568a1d4c992c898965f1d7a", + "6bfd5019e1bd92f48ac55ece5f6353caf00b8bcd", "testharness" ], "content-security-policy/style-src/stylehash-default-src.sub.html": [ @@ -288198,11 +288577,11 @@ "testharness" ], "content-security-policy/style-src/stylenonce-allowed.sub.html": [ - "c5ffdba6de475e8afcc6b162ee5ddfc692ad6064", + "e190b84e8579caad5b9fa61b60ee241e65cbe7f1", "testharness" ], "content-security-policy/style-src/stylenonce-blocked.sub.html": [ - "609e45abdc7bde205332122be869f579c4cb2437", + "4b2381fc33d5a80c8d1affd6bec6dae14896a6f4", "testharness" ], "content-security-policy/style-src/support/inject-style.js": [ @@ -288378,7 +288757,7 @@ "testharness" ], "content-security-policy/svg/svg-inline.sub.html": [ - "3377f5dca6d92a4249fa212b7a069eedac11480b", + "16d03407fd9eb5831b6cb17fa718875450c498dd", "testharness" ], "content-security-policy/svg/svg-policy-resource-doc-includes.html": [ @@ -288446,11 +288825,11 @@ "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href.html": [ - "f53a2e924c345e99cf0ae9bfc71b1eaf5666563b", + "991200ac0daaa047a7637753b31d38ca7d99320b", "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href_blank.html": [ - "6b9f60ce368d11adce252fe29df6de5d59e6305f", + "66ec9e1678c6ac5dc34f962bee2830d67853d763", "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_location.html": [ @@ -288458,15 +288837,15 @@ "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_open.html": [ - "3667f8016fa9aeba5e2fdee9d370f41bcb7e3d1c", + "12c9b099857294e85cbe2efe2d4a3b7d60836cda", "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href.html": [ - "adae81b0c061075583650d5b4b55583c7e03f3dc", + "944b72774c8b15870f403941a38c705075046c16", "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href_blank.html": [ - "470283e10be3b5b28ce034d95e404add05515dfe", + "84491f83fbb1f3f5908fce22afad6a6370379ac5", "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_location.html": [ @@ -288474,7 +288853,7 @@ "testharness" ], "content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_open.html": [ - "8314e6ab911e755fac8bdcc63117709f14d528b5", + "c653d4f617e3c3519e73de560f27c555db649730", "testharness" ], "content-security-policy/unsafe-hashes/script_event_handlers_allowed.html": [ @@ -288482,11 +288861,11 @@ "testharness" ], "content-security-policy/unsafe-hashes/script_event_handlers_denied_missing_unsafe_hashes.html": [ - "0323dda50b7be93ffd7b77d401cd2b40f39d6cfe", + "7ba9d30bcfd8d1d35426ca8abc3ab42018bb9c3c", "testharness" ], "content-security-policy/unsafe-hashes/script_event_handlers_denied_wrong_hash.html": [ - "b9b13572c3ba89738142ff54baf43541eb035071", + "2de6a48eb219df9230e4ba5e6523bbd549d53676", "testharness" ], "content-security-policy/unsafe-hashes/style_attribute_allowed.html": [ @@ -288494,11 +288873,11 @@ "testharness" ], "content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html": [ - "66be2c3d80728f47758f08a01283df28120912dd", + "e8070acba90bfff548d971375f3061a62bd1432c", "testharness" ], "content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html": [ - "32ca66a8a8b8ac2c775289e07ae0f34fc55c5078", + "be27637224249d99c28c214c2af9e65a07f27dfd", "testharness" ], "content-security-policy/unsafe-hashes/support/child_window_location_navigate.sub.html": [ @@ -290766,11 +291145,11 @@ "testharness" ], "cookies/prefix/document-cookie.non-secure.html": [ - "1b5edf76a298a18e40b3b4c3cb256b29b65f1a9a", + "dbf92207a136e5749f8afb100cbebd2113f9959e", "testharness" ], "cookies/resources/cookie-helper.sub.js": [ - "49cf0b1fdbf46dc0b045d35abf32e16dcb40d184", + "d00a11f6f4396177a9885e30adac435fe8dab479", "support" ], "cookies/resources/drop.py": [ @@ -291058,7 +291437,7 @@ "testharness" ], "cors/simple-requests.htm": [ - "77ed8ee22e70d12471c9878caba9325ec0c6a026", + "be4b53495c61a61517a7a3699b9b01be194624c4", "testharness" ], "cors/status-async.htm": [ @@ -308646,139 +309025,139 @@ "visual" ], "css/css-backgrounds/parsing/background-attachment-invalid.html": [ - "68b18dcc2d06de654ca34042f67e5182a9ea1ff5", + "30757f3a4d02a9b1d1fc82c19255804ee2b20ae9", "testharness" ], "css/css-backgrounds/parsing/background-attachment-valid.html": [ - "600f310b4628c9f1f83c89edc42bd96f084b5aff", + "14d72c606ba52e85d296a5404c2546486765cd42", "testharness" ], "css/css-backgrounds/parsing/background-clip-invalid.html": [ - "c2492a2a94a937dd0e526dd06065c4564605e0d9", + "96831e06fc9cce1c9c45e4d44c83f04d2350d0ab", "testharness" ], "css/css-backgrounds/parsing/background-clip-valid.html": [ - "5350a17cbec0a698574b018feb6ef0c6a6164153", + "e262a788bd0296deb0429fd4fc4257390776680a", "testharness" ], "css/css-backgrounds/parsing/background-color-invalid.html": [ - "d7c688d6b6a68aae309d5dd4fc63709adb76d901", + "b94875402d89839fdb717883f11eff7f880036bf", "testharness" ], "css/css-backgrounds/parsing/background-color-valid.html": [ - "d7e864c29b9304907b46cb7e7f973f965726ff8f", + "3859b932c82287c0e103f1a7aebb1ed190b735a0", "testharness" ], "css/css-backgrounds/parsing/background-image-invalid.html": [ - "43d7f67b3e9124bfcb53e4efd508f644c9f7874d", + "eaba64a715ce71a9f828569a24df51f1476664dd", "testharness" ], "css/css-backgrounds/parsing/background-image-valid.html": [ - "ffbf33b6d6497d77f02eb5a4e14204ea4d2f642c", + "51c67b96ccb52ac09ef6d78e598506317ff784ab", "testharness" ], "css/css-backgrounds/parsing/background-invalid.html": [ - "c3deef9bc90abc28e5f4c2fb72c0eea922c94399", + "4ea58da801961ba9c8a315ebb0b1de846e16f889", "testharness" ], "css/css-backgrounds/parsing/background-origin-invalid.html": [ - "9eead06baebb98ab560b0012d9e8dbb9b1d74be5", + "5da00dabe33473254830990c43375ac349eea330", "testharness" ], "css/css-backgrounds/parsing/background-origin-valid.html": [ - "1c19b96ec430c210ca74ed0686a43ebfa5f142f0", + "7e3b0fffcad133948567c5a31b9dcb232891e610", "testharness" ], "css/css-backgrounds/parsing/background-position-invalid.html": [ - "583606e14d28ea1e2782e12e382d72be51a2467d", + "bb974afd9f41d8ca4f0ac82db10e57e4bf6d74b7", "testharness" ], "css/css-backgrounds/parsing/background-position-valid.html": [ - "dbb97406a5a0492fee2f7fbe16e790736b717e20", + "1c05517c62aeee4f2d4837a3a9cf7b8880bd6e19", "testharness" ], "css/css-backgrounds/parsing/background-repeat-invalid.html": [ - "3ae01662d08caa6695c607e882a9eb57c3257eac", + "abb153378f4ce02507d39c5a5a979689df58c8ba", "testharness" ], "css/css-backgrounds/parsing/background-repeat-valid.html": [ - "b69eb5ff03001d0fa68cb52b0883122f11b349f9", + "2f72e03c73332dcf4356796ea3164fe170a21620", "testharness" ], "css/css-backgrounds/parsing/background-size-invalid.html": [ - "cfb9a1c077cd282b63a160da6b0377b3e6587771", + "01a0322002bc4fecc9c48d2266e39d1c2da3e500", "testharness" ], "css/css-backgrounds/parsing/background-size-valid.html": [ - "224421177467c40821e34c537c166e724f0ec7a7", + "c169232cb32757d477612f064ebfd028b6c49009", "testharness" ], "css/css-backgrounds/parsing/background-valid.html": [ - "96529e5604a60595ab01e5d86e6679397a534d9b", + "41a334598f21ed9ac70a73c0307d7607039e5fe8", "testharness" ], "css/css-backgrounds/parsing/border-color-invalid.html": [ - "3916c4f2ecbdc92f282628923f87f485ee5b838f", + "6e4d28e7983d62979f4dad843c007b964db00706", "testharness" ], "css/css-backgrounds/parsing/border-color-valid.html": [ - "63532a99a4b0310c1cf5a4d260bc9876c0dcb6c7", + "a4cd7748ac207427812235e9868012b1a193641c", "testharness" ], "css/css-backgrounds/parsing/border-image-invalid.html": [ - "08c61dfb5549b4fe0f702a222ec0e6810bab9145", + "273fc0a7bf706151fcfe11199cbb7c5aff771100", "testharness" ], "css/css-backgrounds/parsing/border-image-outset-invalid.html": [ - "4faaa3ca0d977e2abaf57cd4fa394ddc1c7d6029", + "4102f603424d4673fe1432fcf7784fa285fbd9b9", "testharness" ], "css/css-backgrounds/parsing/border-image-outset-valid.html": [ - "781a6e0a8abe8da4fb32ed4ff812e5f7c1daebe7", + "ee85af87677f97d9e6263fade32e4beafe913009", "testharness" ], "css/css-backgrounds/parsing/border-image-repeat-invalid.html": [ - "962ab22fbf003d46b1f0747e2546410402f8c007", + "de0998dcc5bf85a650560c8a97266159c2bffb26", "testharness" ], "css/css-backgrounds/parsing/border-image-repeat-valid.html": [ - "381b059523555db30c3eaef03748e92812b0071c", + "f90ef71191e48ee399eac37cea9c356faaa486f5", "testharness" ], "css/css-backgrounds/parsing/border-image-slice-invalid.html": [ - "4ccf441f75aa7c14fec8277644faf2db38d30eaf", + "c62a43d6b37422ae8ae3ea86b630bf3a38317a2e", "testharness" ], "css/css-backgrounds/parsing/border-image-slice-valid.html": [ - "297319442383e83356902e512299cfeea4a1b22c", + "671120b41b7e55bddd2c286dc7ce4807ce9c3665", "testharness" ], "css/css-backgrounds/parsing/border-image-source-invalid.html": [ - "28edd7855df021804834a78cfd522e457268917e", + "8b1240a0d95296168cb1b7274a3ce3b8503a9341", "testharness" ], "css/css-backgrounds/parsing/border-image-source-valid.html": [ - "c080d395078e41871a050a9893a05bd788ad477a", + "7fbbbd9e95d434375ca7322f88fe7e56016210bf", "testharness" ], "css/css-backgrounds/parsing/border-image-valid.html": [ - "8bf9cd51fcd3eda774c309c875f9fb72fce3bfc4", + "67d22c18e2c6538a885b50ed6e65f56c1d146952", "testharness" ], "css/css-backgrounds/parsing/border-image-width-invalid.html": [ - "445972353775d44df07c5d15f1e56c5c1f26ea7f", + "b3e9359749b00825c581040d06415d8f2efd7445", "testharness" ], "css/css-backgrounds/parsing/border-image-width-valid.html": [ - "e1316c337087947407677e563c3c665b5afc9747", + "ce8b9a9455ec587c645d659b4788b4d97582c6a3", "testharness" ], "css/css-backgrounds/parsing/border-invalid.html": [ - "a3d28dfbac05749156734f8877119d408535e506", + "71404f2ce3e18fe336f076ce72ad028c4f665861", "testharness" ], "css/css-backgrounds/parsing/border-radius-invalid.html": [ - "9d767a961ea67c2e01290b2eb6cc1436894e0579", + "4e004af8f36beb4651a8069e38f246136bb35451", "testharness" ], "css/css-backgrounds/parsing/border-radius-valid-expected.txt": [ @@ -308786,41 +309165,37 @@ "support" ], "css/css-backgrounds/parsing/border-radius-valid.html": [ - "40a9d9e8e4083675eaf8c0445ac2f79416adf117", + "317803bf8819b2147390434e78d4efdcdc6d906b", "testharness" ], "css/css-backgrounds/parsing/border-style-invalid.html": [ - "42bd61ad1e91905f765a75ab8213451113f9ba5c", + "27fa45116fd150d69a77850f837ee43f7032c601", "testharness" ], "css/css-backgrounds/parsing/border-style-valid.html": [ - "10fa39bbf6cdd67ba7828db90e266753b09351c4", + "0b592180280ce6c8eb87567e1c39f197353365c3", "testharness" ], "css/css-backgrounds/parsing/border-valid.html": [ - "5ca8bbdc43ec9a38c1495e308495287338913ef2", + "37b876ce4e97b2aa2ae08cb3447d42a658fcf56d", "testharness" ], "css/css-backgrounds/parsing/border-width-invalid.html": [ - "2edd05ea42b8b4b00a121d50b219da7d446297db", + "ec7eb72a9ac404a59390b9c89f7ae710f6620412", "testharness" ], "css/css-backgrounds/parsing/border-width-valid.html": [ - "5a9b174c91531af56b5e42bda2b9df813629464e", + "552416df3d2fe1a08aeb8145c5d263770543aa5e", "testharness" ], "css/css-backgrounds/parsing/box-shadow-invalid.html": [ - "a38ae2fce74292e537cdaed849c939df6921c060", + "44f074d05a85fbdf183544da5c6fb5af075ea8da", "testharness" ], "css/css-backgrounds/parsing/box-shadow-valid.html": [ - "be72b78cbbe42898a8693706d57852fd71cdb4d0", + "a3b172e1bab552d86acce7ab924a2a9111507da5", "testharness" ], - "css/css-backgrounds/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-backgrounds/reference/60x60-green-background.html": [ "d19ed4ea2678a45bbe53838d6eebf61ab641bcdd", "support" @@ -309406,51 +309781,51 @@ "support" ], "css/css-box/parsing/clear-invalid.html": [ - "636704330e3c36608d925d370a5e8f056031fbb7", + "38d1821bc8189a5b42c4c0fa75b0195d69b5a91f", "testharness" ], "css/css-box/parsing/clear-valid.html": [ - "a849f6c06de9e519c91e83b0fc4e1798cbb88ee9", + "b27350e1791adf0318c556b77c12386c328fef9a", "testharness" ], "css/css-box/parsing/float-invalid.html": [ - "8c3d28f578a62c18a9ae276a52cef2a52360170d", + "c11f4e2e66cc291e100419e1b1d0224604c0e7fd", "testharness" ], "css/css-box/parsing/float-valid.html": [ - "9ff6ef43a22fd8a3c55fa2a5fdcac2b114c8bd42", + "a8fc605325ff0dcd027110aecd42bf35f90d316c", "testharness" ], "css/css-box/parsing/height-invalid.html": [ - "f15bd27de808fbec41df51fe3c884437873ce22f", + "dcd4d1afbe176689b999a80cbb8df80d1aa971bf", "testharness" ], "css/css-box/parsing/height-valid.html": [ - "a89ec6b5502928fddd8eb62002489d61fbdc1b81", + "7cc09a594ed17648ec29b9bdc2615fa6dbcbd3a7", "testharness" ], "css/css-box/parsing/margin-invalid.html": [ - "917fc927e9dd8d21c3900ede47b8e2a789651527", + "77009170938d9634497f73bc21501ced502c7008", "testharness" ], "css/css-box/parsing/margin-valid.html": [ - "1715a9c924e702768bae5f7b55b942bf6824d7e1", + "154aa2de7cb16ca0845f8368e731ec5c941108cb", "testharness" ], "css/css-box/parsing/max-height-invalid.html": [ - "61c85d129102fd96e57970e165164944ad8e2102", + "aeb6e6480811b7c9f9805b9b8fc1215e973028e0", "testharness" ], "css/css-box/parsing/max-height-valid.html": [ - "ca58cec3a9cdff2952f9770ae4df8f939c22a8a4", + "04880c4903ce34458fb462b0718aa6eb475f4143", "testharness" ], "css/css-box/parsing/max-width-invalid.html": [ - "57bcbbf168c88324ac2919f063701ffcb7a37a85", + "03db7e26578583625db56b1e400be58705937745", "testharness" ], "css/css-box/parsing/max-width-valid.html": [ - "e098b804c08bd86f228a0f3d3be4c02c111f17ed", + "1e08a820d9dd1dc98f2bd0ada5550e32081d2e75", "testharness" ], "css/css-box/parsing/min-height-invalid-expected.txt": [ @@ -309458,11 +309833,11 @@ "support" ], "css/css-box/parsing/min-height-invalid.html": [ - "26a1e10a34c5e8a5f1c2df7a89b08b25341dc132", + "edc480e1e897e1a46edf8e8aa64d1b4486f96fde", "testharness" ], "css/css-box/parsing/min-height-valid.html": [ - "576a5c07989ef187008545000148747032f8d2fb", + "0154c02b7b913681515878471553791d9e8a7d45", "testharness" ], "css/css-box/parsing/min-width-invalid-expected.txt": [ @@ -309470,19 +309845,19 @@ "support" ], "css/css-box/parsing/min-width-invalid.html": [ - "d71777fea6c2de47fc0f2243b4af1c21b15c6509", + "e89826fb05694890f3469291316db1e2f4a569b9", "testharness" ], "css/css-box/parsing/min-width-valid.html": [ - "406452dd583f40532ce6f904785264d9a16ed366", + "f745b66bd43e24460548b9d5fd3a6d0e46bf4284", "testharness" ], "css/css-box/parsing/overflow-invalid.html": [ - "bf3ee3d72ba35abe941a6e298a43939107db0a10", + "4747764fb6a4ddd6fadf08d970753923d4afb42b", "testharness" ], "css/css-box/parsing/overflow-valid.html": [ - "6bef585856c3d038e63f9d24a06b75d3b5f2a7db", + "1bfeec236460ff47ccbea842ceffd3abe733a61b", "testharness" ], "css/css-box/parsing/padding-invalid-expected.txt": [ @@ -309490,31 +309865,27 @@ "support" ], "css/css-box/parsing/padding-invalid.html": [ - "7e172efed30f45166747ccedd45d22bbf904ba6b", + "e995ac616a1dca834cbe53c91e02052047e32f4a", "testharness" ], "css/css-box/parsing/padding-valid.html": [ - "e5a932e1417400947c07ab5150297da174c2c354", + "ba3c3a7fd4aabdf998fbc39bbd9aee429d9ac564", "testharness" ], - "css/css-box/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-box/parsing/visibility-invalid.html": [ - "892ca54815f67f029bb3c7c2aefb48dacd8a0851", + "73e611b2b80bc8645fd057d8922663573daf6978", "testharness" ], "css/css-box/parsing/visibility-valid.html": [ - "2c1143dfa5c320a5270e47adc36b0a3ced979976", + "2ab2f49660759ad2f49521e7bd78d80ac2adb45b", "testharness" ], "css/css-box/parsing/width-invalid.html": [ - "bcbb3d663ae3190ca33ea7cef3b8176b3e50ea9b", + "5a0145fe1d10e3cfa9e2defdf721d5bb8f3d8168", "testharness" ], "css/css-box/parsing/width-valid.html": [ - "653b11e993cf99c4196582440cb45bd144c4f38b", + "93059bd2d3aa1ad4cf43e020450e8253f0563fe6", "testharness" ], "css/css-break/META.yml": [ @@ -309598,17 +309969,13 @@ "reftest" ], "css/css-cascade/parsing/all-invalid.html": [ - "8b7c044a0341ad732640b7a827c9f24a9c1d4f5f", + "4a1d045ecc84806fb3cf2f14a344d27c40e5bfd8", "testharness" ], "css/css-cascade/parsing/all-valid.html": [ - "668a6c2424125c8d84de85ec6dee694e7cc4799f", + "3a9e5922de5e289b60d1b6220301f1f9a6bfb49f", "testharness" ], - "css/css-cascade/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-cascade/reference/ref-filled-green-100px-square.xht": [ "05a13794482a94f6c10bd9d4c98704e63ef60331", "support" @@ -309874,25 +310241,21 @@ "reftest" ], "css/css-color/parsing/color-invalid.html": [ - "fe44aad6fc6a3d9805f2f29ce84970468224e6d1", + "676ffb315a98c1ba686bf237e2fdc82e1b0ba691", "testharness" ], "css/css-color/parsing/color-valid.html": [ - "fb240182c31a2d3056aa68a52cdc04cdbbbe421a", + "70e2450c77f26391ddea1c42dbed4de5d0f817b5", "testharness" ], "css/css-color/parsing/opacity-invalid.html": [ - "d9b9cc86abb0de9c55336b3872a7a61d25f228b8", + "1bcf4c5b64b07dd0f2097329631cff92c92dd292", "testharness" ], "css/css-color/parsing/opacity-valid.html": [ - "8ae302e09f34c5593f58f352adab88fccc906b97", + "f9bb9b65014d86c97f0072de68de9581e87ed8d1", "testharness" ], - "css/css-color/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-color/rebeccapurple-ref.html": [ "8c15364f38e53cc1651f2f6c115c7b2fca3f4ba9", "support" @@ -311045,6 +311408,10 @@ "30f19b6cbbd6f6737d5175b1946c17805e0568d6", "reftest" ], + "css/css-contain/contain-size-scrollbars-001.html": [ + "304e81e5c98c0ded48c9c498e451dd6c0041566b", + "reftest" + ], "css/css-contain/contain-strict-001.html": [ "142730c5cd3a0048027e5bf41cca397e3facad60", "reftest" @@ -311249,6 +311616,10 @@ "2e8f1ba70aae799b64d0917b1a5e3b70c595ac69", "support" ], + "css/css-contain/reference/contain-size-scrollbars-001-ref.html": [ + "402ff6c95e14c7c6dbe6e91cd779937bf6c4caa8", + "support" + ], "css/css-contain/reference/contain-style-breaks-001-ref.html": [ "2c0b758e6bf83ab83444422d39535e14af8c1ab1", "support" @@ -311753,6 +312124,14 @@ "f8d6e85cee2325f3ae51a950a276430d26c04189", "testharness" ], + "css/css-display/parsing/display-invalid.html": [ + "70516ad4901f684b9d0ecd49a82671172fbc8f14", + "testharness" + ], + "css/css-display/parsing/display-valid.html": [ + "efa48350a62dd0210009069475ac9243bba51104", + "testharness" + ], "css/css-display/support/acid.css": [ "62d1aca2e5147cb849f8a36d616cf7143e9cf055", "support" @@ -324705,6 +325084,46 @@ "29eca9dbc6f5738f7d6f929385453d64dcdf0aea", "reftest" ], + "css/css-grid/parsing/grid-area-invalid.html": [ + "b989322775eb7dbf273a3dc3fbb3d1af31f524ba", + "testharness" + ], + "css/css-grid/parsing/grid-area-valid.html": [ + "8e7d0d43d1cfac44935593892b67fdb40b179791", + "testharness" + ], + "css/css-grid/parsing/grid-auto-columns-invalid.html": [ + "e7a965f34ad35f32589b6fc895d65946812e0749", + "testharness" + ], + "css/css-grid/parsing/grid-auto-columns-valid.html": [ + "ba1f5f60d657ebd2629c94b90c971bb081ea7917", + "testharness" + ], + "css/css-grid/parsing/grid-auto-flow-invalid.html": [ + "a261e8eba11fd295eb33c9288a7e30f589374331", + "testharness" + ], + "css/css-grid/parsing/grid-auto-flow-valid.html": [ + "4270a3df933f372792139cae7c39344ff69482dc", + "testharness" + ], + "css/css-grid/parsing/grid-auto-rows-invalid.html": [ + "7fceaa0f1639494847cc06a7f93876992d620b3c", + "testharness" + ], + "css/css-grid/parsing/grid-auto-rows-valid.html": [ + "cf63e2b7d52a6fffc5577bc55e37dfd6aa0cd5b8", + "testharness" + ], + "css/css-grid/parsing/grid-template-areas-invalid.html": [ + "5bc70c5697a2a642ce80b902851f3687eba901d7", + "testharness" + ], + "css/css-grid/parsing/grid-template-areas-valid.html": [ + "8d8f6823267eea15e987ea89e992f1ed0b2f7726", + "testharness" + ], "css/css-grid/placement/grid-layout-grid-span.html": [ "21aad99708c96942c196ada03beaded1d73a1078", "reftest" @@ -324914,15 +325333,15 @@ "support" ], "css/css-images/parsing/gradient-position-invalid.html": [ - "626b9f130724b028eaebc96c9b49a241042f78e6", + "63ac09fc17ede201f4008f68d5b6c626bbe5f238", "testharness" ], "css/css-images/parsing/gradient-position-valid.html": [ - "382fc61636061bfc9ad0d3e357dac83c27c297f1", + "9857496fe4407fb0b9b4d6fe32ef9ed982c9cc88", "testharness" ], "css/css-images/parsing/image-orientation-invalid.html": [ - "f2a53fe5f262852626e7aaac8f14ea5451ac9360", + "72e32eba1d9cce6dac7f013c1e726b4eea39ea1b", "testharness" ], "css/css-images/parsing/image-orientation-valid-expected.txt": [ @@ -324930,11 +325349,11 @@ "support" ], "css/css-images/parsing/image-orientation-valid.html": [ - "ea2ec1e699ab9587e496f44e235c1f73a57b0e25", + "e40517bdc89125283b20411eb4937530c82bf681", "testharness" ], "css/css-images/parsing/image-rendering-invalid.html": [ - "9c54c5d7f1598bfd35dd010298d78dc0c480309b", + "febb0555ecd886c549c2133869c63ce46fe37058", "testharness" ], "css/css-images/parsing/image-rendering-valid-expected.txt": [ @@ -324942,11 +325361,11 @@ "support" ], "css/css-images/parsing/image-rendering-valid.html": [ - "b3b73edfde919d7666fcd669d9c8b1db31c1624d", + "bf06b6f7985759227018cf8d9be3fbd52d7ed768", "testharness" ], "css/css-images/parsing/image-resolution-invalid.html": [ - "e45ed73e23cd814872afabdd43db4b081fe5e29d", + "bc92a7b501090809f3c179744937af550c119abf", "testharness" ], "css/css-images/parsing/image-resolution-valid-expected.txt": [ @@ -324954,11 +325373,11 @@ "support" ], "css/css-images/parsing/image-resolution-valid.html": [ - "7345227fcafce45f5ca12c91523622349c07964a", + "e04d1120ee400b43f225ffcf386bcecbf6d2b5bb", "testharness" ], "css/css-images/parsing/object-fit-invalid.html": [ - "574573c8015f8fbc120779a9361169ded1ed21f1", + "f76460f56da89bfe1c94ef884f9d981869bf04cd", "testharness" ], "css/css-images/parsing/object-fit-valid-expected.txt": [ @@ -324966,21 +325385,17 @@ "support" ], "css/css-images/parsing/object-fit-valid.html": [ - "8b531abad20e69c905650f34ec4cd26417381e01", + "3b5ac61617c72fc09f56ccd348b278db473ff989", "testharness" ], "css/css-images/parsing/object-position-invalid.html": [ - "346b79a841aa6016b78d427f18f402b771368640", + "63e47cf17a6590d4d26fa111897547a8e9883fb9", "testharness" ], "css/css-images/parsing/object-position-valid.html": [ - "b7be35ccd74f01a0b966426bc5876afd35a1248d", + "b9dab78b518138272a1e29a6a2690d13f3e208e1", "testharness" ], - "css/css-images/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-images/support/1x1-green.gif": [ "e023d92c7ad04264d06196d47a5edd828a7f71db", "support" @@ -326457,6 +326872,14 @@ "12df558fd2c2fa64783720cb9d1be07fa7f85572", "reftest" ], + "css/css-masking/clip-path/clip-path-path-001.html": [ + "ebdfc2297bbcc8225f92ba9dfa2ed33819f2f9a9", + "reftest" + ], + "css/css-masking/clip-path/clip-path-path-002.html": [ + "e3049922ebdec9a0ee9be2f8c5cff97e2ec25e94", + "reftest" + ], "css/css-masking/clip-path/clip-path-polygon-001.html": [ "954f0ba8d91de74cb36b834f06db5a00ad59b194", "reftest" @@ -326525,6 +326948,14 @@ "5adc91a5c00f27f0d3225c99a6c2534b5b868a8d", "support" ], + "css/css-masking/clip-path/reference/clip-path-path-001-ref.html": [ + "afc1d18f204e9fd9a26f35711bb3e04ac4473d67", + "support" + ], + "css/css-masking/clip-path/reference/clip-path-path-002-ref.html": [ + "d9ea5183fb1e6aa745c01f02e702df065d4945e6", + "support" + ], "css/css-masking/clip-path/reference/clip-path-rectangle-border-ref.html": [ "9a61c7690248f48ba123535524bf1bff60b4016c", "support" @@ -326713,8 +327144,40 @@ "c415eaaa67a2bc9a4b621700049eb0c0b60ec0a3", "testharness" ], + "css/css-masking/mask-image/mask-image-url-image-hash.html": [ + "b1efc90818bec85d5022a9b908a14c2e0c35ff3b", + "reftest" + ], + "css/css-masking/mask-image/mask-image-url-image.html": [ + "40a1ff9b281647a03cd90046cb62a088c0ed7081", + "reftest" + ], + "css/css-masking/mask-image/mask-image-url-local-mask.html": [ + "18abc54f85eb4bfd93962dbef92dd5cffe5ba62b", + "reftest" + ], + "css/css-masking/mask-image/mask-image-url-remote-mask.html": [ + "cfa3a6166cdcb41b2feaab2ffd5c087a568771f5", + "reftest" + ], + "css/css-masking/mask-image/reference/mask-image-ref.html": [ + "4e121163f9d093b468e710882cb164bb965d9aa8", + "support" + ], + "css/css-masking/mask-image/support/image-with-ref.svg": [ + "fe77fb37ac60a8a503d849d019c9ca391d9cf523", + "support" + ], + "css/css-masking/mask-image/support/image.svg": [ + "28dbaa0238353b47b0d7877cac054d002352078a", + "support" + ], + "css/css-masking/mask-image/support/mask.svg": [ + "30e601c87c32a08912e261dab22734033df1ef8e", + "support" + ], "css/css-masking/parsing/clip-invalid.html": [ - "18ae8b552a5904097a4b9f0f639b3d0ca123242b", + "852612027840e24673432bcdcf6abaa33f422631", "testharness" ], "css/css-masking/parsing/clip-path-invalid-expected.txt": [ @@ -326722,7 +327185,7 @@ "support" ], "css/css-masking/parsing/clip-path-invalid.html": [ - "3d33de251f6c046a6cd15a6cb84416563e2dc293", + "2672d486d3e8341cf2bd4e62af047e05ca4bf711", "testharness" ], "css/css-masking/parsing/clip-path-valid-expected.txt": [ @@ -326730,25 +327193,21 @@ "support" ], "css/css-masking/parsing/clip-path-valid.html": [ - "1d55ed785533df06ca250a341022ffcfaaa2027c", + "83c76fb9ff5289250c1920f7c2e59b240991cf31", "testharness" ], "css/css-masking/parsing/clip-rule-invalid.html": [ - "3088d07af8e30788b3454c1923d50a2071ef768c", + "4f4883e8a092e287df0cccae5b5d5d32ac92432d", "testharness" ], "css/css-masking/parsing/clip-rule-valid.html": [ - "2fb19073a3e64e941d975f6a60305f97bbc8ab00", + "fe94f8f6c5e1b09349f24347480a376edeaa87a4", "testharness" ], "css/css-masking/parsing/clip-valid.html": [ - "a21e90178b708a52f397fd890db25477708fb16c", + "bd14dfd1b5c9acb697dc4f7afc21e1fb656a377a", "testharness" ], - "css/css-masking/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-masking/test-mask-ref.html": [ "938235acbd36309fb969c55f161239bcd5ab969e", "support" @@ -327538,11 +327997,11 @@ "reftest" ], "css/css-multicol/multicol-rule-shorthand-2-ref.xht": [ - "757283350f5b03e61919be735c5397aeb512679d", + "b49e941337e31c675fa76f51574750e7023a28a6", "support" ], "css/css-multicol/multicol-rule-shorthand-2.xht": [ - "ab7d75644d8a74982d7b0c30f9f29a065c899231", + "4e4d94f8e83bf18b4d1cd112755abf7827167565", "reftest" ], "css/css-multicol/multicol-rule-solid-000-ref.xht": [ @@ -327690,67 +328149,67 @@ "support" ], "css/css-multicol/multicol-width-001-ref.xht": [ - "926bb66423e1597529f22a316bdde16319aa75ae", + "dddb96880af819d730b83604a487c4938fda4933", "support" ], "css/css-multicol/multicol-width-001.xht": [ - "84cf1ff893cc05bbe9e278b4667731bac7e6130f", + "02cbf9b4f262dee4f07050ccf1f44eef118daf02", "reftest" ], "css/css-multicol/multicol-width-002-ref.xht": [ - "59d54cadccdd86461e4cff388704dd8c88f672c0", + "68e10339a1c0acade42890c78d59ab437b22d3d8", "support" ], "css/css-multicol/multicol-width-002.xht": [ - "f838020e427c502b466ae62b20e1e2574f215b4b", + "78a149590580d8275e53425fa46cae79dbf2e55f", "reftest" ], "css/css-multicol/multicol-width-003.xht": [ - "a05a32d8bbb0ac5fb8ab18c2f4f2278e9a446112", + "0e91866163b2b7d7da9a3810a8dc7b622cbcbf56", "reftest" ], "css/css-multicol/multicol-width-ch-001.xht": [ - "c3e3b353028087d96bb5328cb3342cdd3deb17b3", + "8983e00fff0efb4c9a8e89182b0d193b2293d50b", "reftest" ], "css/css-multicol/multicol-width-ch-ref.xht": [ - "133ad3e4b24b02cbf1bc5325dd789a90e0bd0706", + "8adefc11e76800c076e8e888e3a21129ef17b10d", "support" ], "css/css-multicol/multicol-width-count-001.xht": [ - "eeec2dc3e66f7d492d95555a9dd10057f19c490b", + "3fde0610ac6efb0dc159ebde7f98efc723fca5e5", "reftest" ], "css/css-multicol/multicol-width-count-002.xht": [ - "9b9bffc8484286d26a6c0c15fb36dc7378c4b601", + "6de99956e3be9b90c339b0bde4d77b6b9050b9d8", "reftest" ], "css/css-multicol/multicol-width-invalid-001-ref.xht": [ - "a583e30f3d79ffeb766c78f1f54c3c911248471e", + "8664fc38253abbae3339a867e0e1c7085afb4a04", "support" ], "css/css-multicol/multicol-width-invalid-001.xht": [ - "76c9a57774cfc4c162dad3d24b161d40e5d3db1b", + "83128b1f33b625734290fa654cec222245e67310", "reftest" ], "css/css-multicol/multicol-width-large-001.xht": [ - "cb943a7fad3c60ea0e4016b614c3df70a56001df", + "04530e93d7ca342f5cbb3f9bb5eccc1e90a33855", "reftest" ], "css/css-multicol/multicol-width-large-002.xht": [ - "60528159db7db0e77d02870bbf9593cc64da125e", + "2efa3941d8fe326739d44c2e755960fa6984d1ad", "reftest" ], "css/css-multicol/multicol-width-negative-001.xht": [ - "5370b8033bcaeefc2a98f978707513440ffc8f12", + "dd7d515499df5e68031d66bffcdedf2f15dee359", "reftest" ], "css/css-multicol/multicol-width-small-001-ref.xht": [ - "eb427d1da4a2ff4d6410a0b1d295143f31e7d55e", + "a862607a6ba0db977dec90f7beaad30e1a8d6fc6", "support" ], "css/css-multicol/multicol-width-small-001.xht": [ - "c034815060b3a461deedb08ac376ebc1d87fb825", + "8ef3bfa6ac0dc331e3398b3f751e6edae5375030", "reftest" ], "css/css-multicol/multicol-zero-height-001-ref.xht": [ @@ -328926,7 +329385,7 @@ "support" ], "css/css-properties-values-api/typedom.tentative.html": [ - "eb2d8549ba61c8e3f5929d9f11e84a6c6ef80079", + "98150558dae5020333dbf0bc7b8cecdbe83dfc36", "testharness" ], "css/css-properties-values-api/unit-cycles.html": [ @@ -329622,19 +330081,19 @@ "testharness" ], "css/css-shapes/parsing/shape-image-threshold-invalid.html": [ - "eb60a2e44289dba4075cc6ae61d6e0a94a520da9", + "6299e2ecaad8247affa1e54ace4aea276322c114", "testharness" ], "css/css-shapes/parsing/shape-image-threshold-valid.html": [ - "4fe1efceb03e593b8010252a9201d7c2d3a64313", + "914abd02210d4db881017c9453d3bcb68fd8e9f2", "testharness" ], "css/css-shapes/parsing/shape-margin-invalid.html": [ - "cdaea05039527134af6de034674f8d95dc0e4e64", + "2255982ef97c9853253283fcd1ae6037fa8fd51e", "testharness" ], "css/css-shapes/parsing/shape-margin-valid.html": [ - "28f094b6abb05bc751f7508ec29b7bc4fe701eae", + "e4a3a89108738ed76751ea47dd22b7b8eaf174de", "testharness" ], "css/css-shapes/parsing/shape-outside-invalid-expected.txt": [ @@ -329642,11 +330101,11 @@ "support" ], "css/css-shapes/parsing/shape-outside-invalid-position.html": [ - "3bca706b153dd62267ea767742a50784367261aa", + "e61c7071f9180bcbf127e09b3b8edef5401e09d9", "testharness" ], "css/css-shapes/parsing/shape-outside-invalid.html": [ - "57ce32e7fe6922f9378501f355183addeaa3101a", + "484bafe4b5f8527076636a7495f10148ab0fe299", "testharness" ], "css/css-shapes/parsing/shape-outside-valid-expected.txt": [ @@ -329654,17 +330113,13 @@ "support" ], "css/css-shapes/parsing/shape-outside-valid-position.html": [ - "ec0a16d568d5ac0b1ce6dac907c7eecd907f5ab8", + "cd13c25ba38a18489c8d02ae553cc36a38214127", "testharness" ], "css/css-shapes/parsing/shape-outside-valid.html": [ - "1a70d10f831fb6a451149769a54cdd1839b1d8d3", + "d52eb9ada0a5e91f4e78f3b669b683b4c1e6f054", "testharness" ], - "css/css-shapes/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-shapes/shape-outside-invalid-001.html": [ "c6c7400f7d177bde46ad1a35a6bd77f6ff27d71b", "testharness" @@ -337402,35 +337857,31 @@ "reftest" ], "css/css-transforms/parsing/perspective-origin-parsing-invalid.html": [ - "24976fc2609e28bde89b4f1b6f0c21f64377a8ee", + "2ed6721e091702a436217086eebd81172f359339", "testharness" ], "css/css-transforms/parsing/perspective-origin-parsing-valid.html": [ - "d8ac4ccb50a1539a5c23d829c0493b669e8cb827", + "79f4e0df12e84e880e8c501856a977e1a2c468b8", "testharness" ], "css/css-transforms/parsing/rotate-parsing-invalid.html": [ - "a3f625f6ab6823528ba3aa16ce53cb648908c8fc", + "9eef999716da1025b1c8595f60e52ff2cdb7715e", "testharness" ], "css/css-transforms/parsing/rotate-parsing-valid.html": [ - "33e44e3361ddecf19ae86fb873cd59c375d7227d", + "c82f6be8c5d75e4c323c0f2701cfa9d0a0540b4b", "testharness" ], "css/css-transforms/parsing/scale-parsing-invalid.html": [ - "ddc2cade2bcedcd59af8e3f40a9a510f7c521639", + "1072d1d6b1ecc46142ffbdd2ad62b87079651672", "testharness" ], "css/css-transforms/parsing/scale-parsing-valid.html": [ - "2b99d249aaf6a3dfa253aa9d922698903d20ef98", + "89f79e2e85d35f1306577acfede9585b703a6c8f", "testharness" ], - "css/css-transforms/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-transforms/parsing/transform-box-invalid.html": [ - "415dc0720146b1041739e8bb346038212965e168", + "781601cd26aa43430272011d67447a9079015659", "testharness" ], "css/css-transforms/parsing/transform-box-valid-expected.txt": [ @@ -337438,31 +337889,31 @@ "support" ], "css/css-transforms/parsing/transform-box-valid.html": [ - "c2e7a5bc90479ebee991c7b0cb2cf0054c17f1e2", + "0754a5c9aeea70b07c9bb7bc1b2d20494f07a060", "testharness" ], "css/css-transforms/parsing/transform-invalid.html": [ - "bff9d7b723a58b610a7e71d6849cc2b36cda077c", + "7fb8367ecb2f6e2f151a1ee6afaab9896f07f8c8", "testharness" ], "css/css-transforms/parsing/transform-origin-invalid.html": [ - "0a8ef52f0ec2bdaec7d9098c4f0603c34d4358b3", + "19a7c963a708912d347a4c708dc848a7e580966b", "testharness" ], "css/css-transforms/parsing/transform-origin-valid.html": [ - "c9f1d73c29ec6fc737afd461a47be788d2b9931c", + "f76a0b407e16e3b98c7bac0c4149725deb02ea98", "testharness" ], "css/css-transforms/parsing/transform-valid.html": [ - "62ad8e920f3a3ef237c375a4b08343359fda0750", + "fbde8eaf2d23306b34125eeeafc66a692eaad301", "testharness" ], "css/css-transforms/parsing/translate-parsing-invalid.html": [ - "8aa6de5e2810287c4cac9f7e7f3d7586d43b526d", + "9064586bdaab692334594a1cc17f24d639aab93c", "testharness" ], "css/css-transforms/parsing/translate-parsing-valid.html": [ - "86b4deb489b29183617a47a845677a02e49781c4", + "fe16d545e1f92f0086aa5bba0dd221c591696255", "testharness" ], "css/css-transforms/patternTransform/reference/svg-patternTransform-combination-ref.html": [ @@ -345174,35 +345625,35 @@ "reftest" ], "css/css-ui/parsing/box-sizing-invalid.html": [ - "4ced38240f29163814f1d57a9923af8962d06c06", + "984475450a3abc0ce640d25b5659eb427c210dd8", "testharness" ], "css/css-ui/parsing/box-sizing-valid.html": [ - "fb60ac23bb8d2a509d1bdede4069cb09a52ae415", + "3dfa4f979419af8ced63af5aa73c32ea68d11095", "testharness" ], "css/css-ui/parsing/caret-color-invalid.html": [ - "b4c9cb71e038b81ed2dfa582cb579395ae060aa0", + "a59b01ec2bb6d2ada5acef7ac7ec68417d79fa03", "testharness" ], "css/css-ui/parsing/caret-color-valid.html": [ - "41cc70654dade5dccfab56b0c1b18c8dba50344a", + "dd35cf8e903f544b284ebd2b7d83fb6b5e989274", "testharness" ], "css/css-ui/parsing/cursor-invalid.html": [ - "dda8031d3090699885bbe896ad77158046b87bcd", + "b7928c85d3ccb696039792b4576ee81cfd1b738c", "testharness" ], "css/css-ui/parsing/cursor-valid.html": [ - "e33b82e2ddc54455f7da26728e457b1821dec2ea", + "285c16a4ee513b898d9d1c2852ae40897bb12545", "testharness" ], "css/css-ui/parsing/outline-color-invalid.html": [ - "195f55dc72bd3a943f457f700677484e94fc5ba1", + "2b910e803038e3c9892a7e3ee09473a410d84465", "testharness" ], "css/css-ui/parsing/outline-color-valid-mandatory.html": [ - "fbe730bdae37d0148d767d8745589e363f98938d", + "2af06658241a407ff0472b80ee052f072fd844f1", "testharness" ], "css/css-ui/parsing/outline-color-valid-optional-expected.txt": [ @@ -345210,31 +345661,31 @@ "support" ], "css/css-ui/parsing/outline-color-valid-optional.html": [ - "bf12b87f2193bcd11e4a382ffb94073300b47eaf", + "79932990988d18dd76129989a8bddb8cb8e5e1ad", "testharness" ], "css/css-ui/parsing/outline-invalid.html": [ - "c56a579452fb78daf9f48bd45cd996a1f2697b25", + "c43cc3c6434ca4097acb040d7d1f1e9ae652ec4a", "testharness" ], "css/css-ui/parsing/outline-offset-invalid.html": [ - "1ee9477a1118f7f262d7e7b1c29f2978c8b80092", + "3ff26e35ae0195a65f77f872da88ec4f6da6df6b", "testharness" ], "css/css-ui/parsing/outline-offset-valid.html": [ - "c5e023b8e9607dd38bd0bd33cd52244e25a9b0fb", + "75fc7e60bd9dc3f249b8340cf342b68fa45b7d68", "testharness" ], "css/css-ui/parsing/outline-style-invalid.html": [ - "2340c62d90299a636abbaf9973ed08e55c9d9d66", + "a659b68a55b596c73348d89533a800fd6bbacf01", "testharness" ], "css/css-ui/parsing/outline-style-valid.html": [ - "5adcfda7ec75dadb3b87475cd6e0009c8aaa94ff", + "98e139539f3bcf67a0b82439fe7f98b63c2876b3", "testharness" ], "css/css-ui/parsing/outline-valid-mandatory.html": [ - "a296c989bce262b620a8acc028cfa79d513a8acb", + "c5217185eb1293e0c922f0c3068277aaa00911cf", "testharness" ], "css/css-ui/parsing/outline-valid-optional-expected.txt": [ @@ -345242,15 +345693,15 @@ "support" ], "css/css-ui/parsing/outline-valid-optional.html": [ - "e179406cafb53cefc35fdc69b46b0530233dafc2", + "8150ffa208eb8f4ee55508f3524e814cc6806dd6", "testharness" ], "css/css-ui/parsing/outline-width-invalid.html": [ - "07012fef225859ae8f4194f19795c24363685108", + "6008fffd94b2626ac5984f07cee59fb41588bc46", "testharness" ], "css/css-ui/parsing/outline-width-valid.html": [ - "050371246ce4006b922e1ab2d69255d1cf454d5d", + "2415e005dee6f50b4205cde247800bbd85780970", "testharness" ], "css/css-ui/parsing/resize-invalid-expected.txt": [ @@ -345258,23 +345709,19 @@ "support" ], "css/css-ui/parsing/resize-invalid.html": [ - "a56a1dbc6e24e851e9055513c7ebe86e1c847760", + "7f9698f7aadd91cb4f44e44ad01a6a7c79f519ee", "testharness" ], "css/css-ui/parsing/resize-valid.html": [ - "025b0e447bb66d8daf828dccf009fcc039fa0b53", + "d50df443e0508991c0fd324d72e06ee78e0671a6", "testharness" ], - "css/css-ui/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-ui/parsing/text-overflow-invalid.html": [ - "f3945a162ec4c67fdf36753a270b3c2e350726a4", + "aa4169c1462bdab7e2674d72b64e8ab5592e79a1", "testharness" ], "css/css-ui/parsing/text-overflow-valid.html": [ - "3f0aaa60938ff98e8d0f10d201d6e05d79d2771d", + "5d40b6839def0f4ace52ab0a8af818dcf2b3ea8e", "testharness" ], "css/css-ui/reference/box-sizing-001-ref.html": [ @@ -350390,47 +350837,43 @@ "manual" ], "css/css-writing-modes/parsing/direction-invalid.html": [ - "7181dbe675d1183d7271cd9d7aebf699ec837872", + "cb282f0b723ecda78dfe6a803b0b8932518afeed", "testharness" ], "css/css-writing-modes/parsing/direction-valid.html": [ - "11585cf9e43952a56f96a80bb3566b3d6a5fb8fd", + "f8b9fa808b9d21ddcdf4623076f7c293ab5df410", "testharness" ], - "css/css-writing-modes/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/css-writing-modes/parsing/text-combine-upright-invalid.html": [ - "b8a0c14b56b7a43fce53626dcbad17997fc779bc", + "c3401ea7d246e7fa486478e04c006aea37aef0ac", "testharness" ], "css/css-writing-modes/parsing/text-combine-upright-valid.html": [ - "2b15840cd7cfaefa80b61b3f175afe4774f364e0", + "dada1f97e2feb6d45b7b0b3e1f6c3c36f2dca45e", "testharness" ], "css/css-writing-modes/parsing/text-orientation-invalid.html": [ - "cc9c051049bc07ff977d08fcd796b8f31c13f5af", + "ceb9cf78cc3b69ec86707a8f3bed24dbdb028d88", "testharness" ], "css/css-writing-modes/parsing/text-orientation-valid.html": [ - "06049c28a0aac6d2d8f3e538d3ad63aa8d68c4e3", + "36f2d367015639d206574c2fe71f45a282119cbb", "testharness" ], "css/css-writing-modes/parsing/unicode-bidi-invalid.html": [ - "1e5f2a1f62a8ea8ffc6b9994bb7a5f8887f7624b", + "f1a2b730b48ff19833a287420b4ca9c671afddf8", "testharness" ], "css/css-writing-modes/parsing/unicode-bidi-valid.html": [ - "087c026adcec3172f96c171b83a2c7efbb91be60", + "38911df2d349aec02aefaf956935c33bbf37e905", "testharness" ], "css/css-writing-modes/parsing/writing-mode-invalid.html": [ - "50e42f73c6d14bbcc19737c17547a178c9cfb870", + "a2010d40d2e22208a933f6fac2cbccdb48024c51", "testharness" ], "css/css-writing-modes/parsing/writing-mode-valid.html": [ - "6f525109fe1bdbc1118f33f9c38ec39a8cc8b6fe", + "6f79a36a4dc2564ca6a478d03a29e015c2376a2d", "testharness" ], "css/css-writing-modes/percent-margin-vlr-003.xht": [ @@ -352538,7 +352981,7 @@ "support" ], "css/css-writing-modes/svg-aliasing-001.html": [ - "bc32f202e2b17878c6f3e6c1938676a92c6338c4", + "3979459838ee19b78655073122afd0cb92f8b357", "reftest" ], "css/css-writing-modes/svg-aliasing-002.html": [ @@ -354882,31 +355325,31 @@ "testharness" ], "css/motion/parsing/offset-anchor-parsing-invalid.html": [ - "817c2684bbcb95f097dee0541d1e314aec2b15af", + "af32ae2c5a588131d2404836af50cd114030c5b3", "testharness" ], "css/motion/parsing/offset-anchor-parsing-valid.html": [ - "d354763b4e705c5bf18493055c9acb68606c1298", + "a69a5ce9f8117262db576430ea9c840b958a14fa", "testharness" ], "css/motion/parsing/offset-distance-parsing-invalid.html": [ - "7eec1270ab8884afc2a37dfe6ee31e4f96aaf52a", + "2d0be83e03b455813bc3107ba758d9108081e935", "testharness" ], "css/motion/parsing/offset-distance-parsing-valid.html": [ - "b699ecea5a1a0f3c59b0ea23c542caa1b25800d9", + "5b081bcaab7e9d6a72842c4f8f0a504816672b92", "testharness" ], "css/motion/parsing/offset-parsing-invalid.html": [ - "23475f8d513211338c2239cbc0f26c6a1cf08c79", + "cc2eb500eb88d24055dfe84e0c052546d90e9a29", "testharness" ], "css/motion/parsing/offset-parsing-valid.html": [ - "4cdb2b193891ffe12e15aff072906cae808201f0", + "75c93e5475fc050f462a3c93c6e6e27912e82559", "testharness" ], "css/motion/parsing/offset-path-parsing-invalid.html": [ - "67c1099ba73b26812b86f0c1bf9dca9baa2ff225", + "c69f7c81a9d479c2334769b85d0553f659b8bd83", "testharness" ], "css/motion/parsing/offset-path-parsing-valid-expected.txt": [ @@ -354914,29 +355357,25 @@ "support" ], "css/motion/parsing/offset-path-parsing-valid.html": [ - "d57b465ada6743e76e3e99e78a89e628815dc9ee", + "bda82928726dc8c3a30207f9871a4883e2db5376", "testharness" ], "css/motion/parsing/offset-position-parsing-invalid.html": [ - "6565fa5cdd7e16a442338be282472dca8f1d54be", + "5e749e5b4ec5fe9bb39d1135a9ae74c524677e26", "testharness" ], "css/motion/parsing/offset-position-parsing-valid.html": [ - "565abffbdeeba7b553d4dea8468c23282f32ccd4", + "d40f70e8c0010cf3f860b3ad760dea5d7b64efdd", "testharness" ], "css/motion/parsing/offset-rotate-parsing-invalid.html": [ - "a649fb4aabb28eb9218b2d3fe68b9effe8bc3b93", + "4e5a9229a0c85b3a2e5bfe59719bad88245d65c5", "testharness" ], "css/motion/parsing/offset-rotate-parsing-valid.html": [ - "38e9ff1ba45ed2cd54b8d55670086f34236b742a", + "71978d33b120f4ed353820f3f08ff4290c070eb7", "testharness" ], - "css/motion/parsing/support/parsing-testcommon.js": [ - "b075882f89aae49b419220b234534241cde5fd42", - "support" - ], "css/reference/META.yml": [ "0f0f7aa96a3d8d59be0a26eaf5c706ae82faf4e4", "support" @@ -356933,6 +357372,10 @@ "9945ef47114c2841a746c99a2fb1e93e050aac8b", "support" ], + "css/support/parsing-testcommon.js": [ + "b075882f89aae49b419220b234534241cde5fd42", + "support" + ], "css/support/pattern-grg-rgr-grg.png": [ "9b88fbd81149891234185f54f8b4a0431759f181", "support" @@ -361358,7 +361801,7 @@ "testharness" ], "dom/events/event-global-extra.window-expected.txt": [ - "0c086b29d57d655c9e6961185082a958ae1b02c5", + "beb0825558675758404ccb75e6ea4f6256d7d0a1", "support" ], "dom/events/event-global-extra.window.js": [ @@ -363194,11 +363637,11 @@ "support" ], "editing/run/backcolor.html": [ - "3d337785efe13eea7d258c2b7c23f4f1a4170203", + "5911de309d02193573f58b6257f3fb6dc28f58c7", "testharness" ], "editing/run/bold.html": [ - "b439a11fdd8e1d4afedc625eeb1c8a4e7eece080", + "390d6810d857addb514c510086807223ac01e758", "testharness" ], "editing/run/bold_3001-last-expected.txt": [ @@ -363210,7 +363653,7 @@ "support" ], "editing/run/createlink.html": [ - "98261697b354a48f5b0a547eea65a437adb548a8", + "b67357e684a4894abf8d050419d622db658d601b", "testharness" ], "editing/run/delete-expected.txt": [ @@ -363218,11 +363661,11 @@ "support" ], "editing/run/delete-list-items-in-table-cell.html": [ - "409a844fc9605311216883fd0cfeb6f279722c67", + "b765bc4b9776dc382b18a618ba003c5e5d31c464", "testharness" ], "editing/run/delete.html": [ - "592c7bb997424c9e36b96cfd980f6bb0e4aeb190", + "6d7a7c8f0c5a88cba7a23815cc9da44aca032d0c", "testharness" ], "editing/run/delete_1-1000-expected.txt": [ @@ -363254,7 +363697,7 @@ "support" ], "editing/run/fontname.html": [ - "491fbe5501564534581291a2b763f1df3eb6949c", + "53800c540c4c100aac5758a8a1d48b162b1a1d67", "testharness" ], "editing/run/fontname_1-1000-expected.txt": [ @@ -363274,7 +363717,7 @@ "support" ], "editing/run/fontsize.html": [ - "35ef70156647931b52b293547fadad7fc69a88b1", + "66ae99ebc100eb21219ea7d26fa5ef77ac48bbde", "testharness" ], "editing/run/fontsize_1-1000-expected.txt": [ @@ -363294,7 +363737,7 @@ "support" ], "editing/run/forecolor.html": [ - "4dd42bf67621cff95aa6b518ad0109ac269823c4", + "8594e061c1452d90b314c4d6d4e4e5836f5998be", "testharness" ], "editing/run/forecolor_1-1000-expected.txt": [ @@ -363314,7 +363757,7 @@ "support" ], "editing/run/formatblock.html": [ - "f117e77d7bf353e4ab520e8ed79440300537215e", + "5c97c08e7327cb8b8c00c820b21741c444f19a28", "testharness" ], "editing/run/formatblock_1-1000-expected.txt": [ @@ -363342,7 +363785,7 @@ "support" ], "editing/run/forwarddelete.html": [ - "50850d130776eb839f15b3618452af267f3b9d65", + "e17190053ac2df075fbcfe37e824b732793907e6", "testharness" ], "editing/run/forwarddelete_1-1000-expected.txt": [ @@ -363378,7 +363821,7 @@ "support" ], "editing/run/hilitecolor.html": [ - "e2de0d960ff5c53f81cd24010b2e6a869cb57eb0", + "cd9e5528e5613e788d36e926ac41b913ee52b2c6", "testharness" ], "editing/run/indent-expected.txt": [ @@ -363386,11 +363829,11 @@ "support" ], "editing/run/indent.html": [ - "bf753e6efa2e974241fe9fdb1a109e552302e10e", + "13e98f5ea647df90245e52e83a32299b1e71beaf", "testharness" ], "editing/run/insert-list-items-in-table-cell.html": [ - "60b396dd347385af5767df0eafef13bc06032b19", + "8d08f8c3eb9c434b91d64281e418aedd9877af88", "testharness" ], "editing/run/inserthorizontalrule-expected.txt": [ @@ -363398,7 +363841,7 @@ "support" ], "editing/run/inserthorizontalrule.html": [ - "5569e8f9a6bab1719d7cc6d286217db752da4b4c", + "6e3e5490a60324dc060bb81e3be2c1a8217e7acf", "testharness" ], "editing/run/inserthtml-expected.txt": [ @@ -363406,7 +363849,7 @@ "support" ], "editing/run/inserthtml.html": [ - "59eaf4c59f19eb06e8a4609c0ab462142a83b263", + "f83102e6a9b37ace62b44fd774d13219ad9d1021", "testharness" ], "editing/run/insertimage-expected.txt": [ @@ -363414,7 +363857,7 @@ "support" ], "editing/run/insertimage.html": [ - "f34cad0d1f1a0d61a04ba079e2092e59ebe17280", + "7a1f7b922665cd357418ad2ff343d7559155b7fd", "testharness" ], "editing/run/insertlinebreak-expected.txt": [ @@ -363422,7 +363865,7 @@ "support" ], "editing/run/insertlinebreak.html": [ - "eb3df9dc52306288bcf31a0c694893a0aeca37e2", + "ddab665084b141561aa319a17f0a8f0aa5f228e4", "testharness" ], "editing/run/insertorderedlist-expected.txt": [ @@ -363430,7 +363873,7 @@ "support" ], "editing/run/insertorderedlist.html": [ - "53a9ababb237dbd826ed858746ce5494e1d034bd", + "68772355c24d2b8388e9379cf8c0b587b216e233", "testharness" ], "editing/run/insertparagraph-expected.txt": [ @@ -363438,7 +363881,7 @@ "support" ], "editing/run/insertparagraph.html": [ - "549878a08a56f8f02f3cc98befb5659d8f019f87", + "173c5aea40b460594ab0206c1c4400a26f3c219b", "testharness" ], "editing/run/insertparagraph_1-1000-expected.txt": [ @@ -363474,7 +363917,7 @@ "support" ], "editing/run/inserttext.html": [ - "1a13919124e72c3b8ce13bc4db56ed2505d7988c", + "a01293fcae034da36beebd4a64f7c29152f1597a", "testharness" ], "editing/run/inserttext_1-1000-expected.txt": [ @@ -363494,11 +363937,11 @@ "support" ], "editing/run/insertunorderedlist.html": [ - "24e4d00e3fb56fa8e01f01b7ff5040cfbf6de3dc", + "b1f636b10959971843ee9c106f7c2ee71f8f1a42", "testharness" ], "editing/run/italic.html": [ - "1b363c280038362a7b999d815f40b9516c3158f5", + "6185d553d0218e150795027ca3cabd598c07b7d9", "testharness" ], "editing/run/italic_2001-last-expected.txt": [ @@ -363506,7 +363949,7 @@ "support" ], "editing/run/justifycenter.html": [ - "68ade6b6e3544659a9c3574141c093536439ba0c", + "4902a302cca15b24aacdba3473836739186bc0fb", "testharness" ], "editing/run/justifycenter_1-1000-expected.txt": [ @@ -363522,7 +363965,7 @@ "support" ], "editing/run/justifyfull.html": [ - "5d2dad5e68eaa7f0dcf992c62f755dbaecbc67cc", + "c11befaf8939e88877a3011e7c190679a1c97984", "testharness" ], "editing/run/justifyfull_1-1000-expected.txt": [ @@ -363538,7 +363981,7 @@ "support" ], "editing/run/justifyleft.html": [ - "37554844fec7c5d88cbdd8ba0cb9ba3680cc6572", + "f6b2818538937f2c51b2d55dd4e4013872fb6d13", "testharness" ], "editing/run/justifyleft_1-1000-expected.txt": [ @@ -363554,7 +363997,7 @@ "support" ], "editing/run/justifyright.html": [ - "ca69e328762059d73e3455715899b28e9a3b73d8", + "edd30b7f5f034b9046ab981ef34ffbba7f61fd50", "testharness" ], "editing/run/justifyright_1-1000-expected.txt": [ @@ -363570,7 +364013,7 @@ "support" ], "editing/run/misc.html": [ - "2ebd68cda6eba2dd9312442b0f9b5e6af0bff5fa", + "5bf52682292c96c50d4c45d4ea4c138a625c99d4", "testharness" ], "editing/run/multitest-expected.txt": [ @@ -363578,7 +364021,7 @@ "support" ], "editing/run/multitest.html": [ - "2c4b66116875f72834d401c448e8a126269533b6", + "813b9edc034addf8f9c2270c567b74dc45263b37", "testharness" ], "editing/run/multitest_1-1000-expected.txt": [ @@ -363626,7 +364069,7 @@ "support" ], "editing/run/outdent.html": [ - "0329b6eb44ae2ba9f0dbf4a3c9aaf2ed4f294bb8", + "f1f9fb491aa940b65ce7010370c2b4d3258a9cf4", "testharness" ], "editing/run/outdent_1-1000-expected.txt": [ @@ -363646,11 +364089,11 @@ "support" ], "editing/run/removeformat.html": [ - "fb38a4457e84471d2167b8eff87aacc8d917b3f0", + "0c38ff915fb0e85f8edb2de3581b86ec53c483eb", "testharness" ], "editing/run/strikethrough.html": [ - "ed0781fd16ef5513e84cd0ef9d9b4bab0f94afdf", + "cb06c10d0c26d51f40ff2edcd64d897f618ca890", "testharness" ], "editing/run/strikethrough_1-1000-expected.txt": [ @@ -363658,15 +364101,15 @@ "support" ], "editing/run/subscript.html": [ - "1655a822fdf804dc21d27ec1ffa8386e388fc6fe", + "e0071d7a08043da296cbf2c0b1061fc00de544e0", "testharness" ], "editing/run/superscript.html": [ - "4c1f04763b6089e1b7e7a62a410842ef46bd7ac3", + "0c3519b288e4ce7524fdce0d432dbf495cbb837b", "testharness" ], "editing/run/underline.html": [ - "61f85a1fa820894c24b1232d8d3ac6e82d84cf93", + "f53add984bde3e3c9f1846bf656d49627d6220f8", "testharness" ], "editing/run/underline_1-1000-expected.txt": [ @@ -363678,7 +364121,7 @@ "support" ], "editing/run/unlink.html": [ - "26d6e2d83ec7b1e0d8a0a061c5e517f42dda97b8", + "7cd0be939f16e8aea7b00ff2b13a06102e26cc4d", "testharness" ], "encoding/META.yml": [ @@ -363749,26 +364192,10 @@ "a6074f975d34fb6a216bdce4c7f560270512fd20", "testharness" ], - "encoding/idlharness.any-expected.txt": [ - "647a3074a3ce676b6ecb7784c611ac23fed9ec9d", - "support" - ], "encoding/idlharness.any.js": [ "7a057f14e3a78c73b39a17f1debd3b8ad1e754d6", "testharness" ], - "encoding/idlharness.any.serviceworker-expected.txt": [ - "148045137dd11638e3eacdf7bdbb33801bd332a8", - "support" - ], - "encoding/idlharness.any.sharedworker-expected.txt": [ - "647a3074a3ce676b6ecb7784c611ac23fed9ec9d", - "support" - ], - "encoding/idlharness.any.worker-expected.txt": [ - "647a3074a3ce676b6ecb7784c611ac23fed9ec9d", - "support" - ], "encoding/iso-2022-jp-decoder-expected.txt": [ "e2530320ed21b50220eb6fc8eb0cb8b2c01b57e6", "support" @@ -365025,210 +365452,50 @@ "70d8fb73eadb81bdade8e4bdcefe46491cd05b96", "testharness" ], - "encoding/streams/backpressure.any-expected.txt": [ - "3f234baca3590e6c43963f1a277bd09009981b00", - "support" - ], "encoding/streams/backpressure.any.js": [ "f17e149ed9e5b949d8b3d6a54b48093232e7da52", "testharness" ], - "encoding/streams/backpressure.any.serviceworker-expected.txt": [ - "15502fd2c97bcc9a630102e15d6d89e6e8ebbd4e", - "support" - ], - "encoding/streams/backpressure.any.sharedworker-expected.txt": [ - "3f234baca3590e6c43963f1a277bd09009981b00", - "support" - ], - "encoding/streams/backpressure.any.worker-expected.txt": [ - "3f234baca3590e6c43963f1a277bd09009981b00", - "support" - ], - "encoding/streams/decode-bad-chunks.any-expected.txt": [ - "d3840a8ed3d5dcc320c33a031f2b49bf0450141c", - "support" + "encoding/streams/decode-attributes.any.js": [ + "21b70201271a206e7652bcc93ca1de927a318d0f", + "testharness" ], "encoding/streams/decode-bad-chunks.any.js": [ "101fb3aeb614cf66d82fb33f2c27989de3850061", "testharness" ], - "encoding/streams/decode-bad-chunks.any.serviceworker-expected.txt": [ - "d3840a8ed3d5dcc320c33a031f2b49bf0450141c", - "support" - ], - "encoding/streams/decode-bad-chunks.any.sharedworker-expected.txt": [ - "d3840a8ed3d5dcc320c33a031f2b49bf0450141c", - "support" - ], - "encoding/streams/decode-bad-chunks.any.worker-expected.txt": [ - "d3840a8ed3d5dcc320c33a031f2b49bf0450141c", - "support" - ], - "encoding/streams/decode-ignore-bom.any-expected.txt": [ - "0b6950d23800105247308c47553d0208e4af0e2c", - "support" - ], "encoding/streams/decode-ignore-bom.any.js": [ "cbe26d71b13557285040a7e2934010e7195d27ec", "testharness" ], - "encoding/streams/decode-ignore-bom.any.serviceworker-expected.txt": [ - "0b6950d23800105247308c47553d0208e4af0e2c", - "support" - ], - "encoding/streams/decode-ignore-bom.any.sharedworker-expected.txt": [ - "0b6950d23800105247308c47553d0208e4af0e2c", - "support" - ], - "encoding/streams/decode-ignore-bom.any.worker-expected.txt": [ - "0b6950d23800105247308c47553d0208e4af0e2c", - "support" - ], - "encoding/streams/decode-incomplete-input.any-expected.txt": [ - "ea524935d89f3d40c1420ac14dccd86a691cd81e", - "support" - ], "encoding/streams/decode-incomplete-input.any.js": [ "80dd016d4918daaa49da5b24efbcead17be03e88", "testharness" ], - "encoding/streams/decode-incomplete-input.any.serviceworker-expected.txt": [ - "ea524935d89f3d40c1420ac14dccd86a691cd81e", - "support" - ], - "encoding/streams/decode-incomplete-input.any.sharedworker-expected.txt": [ - "ea524935d89f3d40c1420ac14dccd86a691cd81e", - "support" - ], - "encoding/streams/decode-incomplete-input.any.worker-expected.txt": [ - "ea524935d89f3d40c1420ac14dccd86a691cd81e", - "support" - ], - "encoding/streams/decode-non-utf8.any-expected.txt": [ - "c890ab330debf3483de21ff1a50d74631a7d43bc", - "support" - ], "encoding/streams/decode-non-utf8.any.js": [ "7f39cdc04ca76b7071d3321ac068f9216b365002", "testharness" ], - "encoding/streams/decode-non-utf8.any.serviceworker-expected.txt": [ - "c890ab330debf3483de21ff1a50d74631a7d43bc", - "support" - ], - "encoding/streams/decode-non-utf8.any.sharedworker-expected.txt": [ - "c890ab330debf3483de21ff1a50d74631a7d43bc", - "support" - ], - "encoding/streams/decode-non-utf8.any.worker-expected.txt": [ - "c890ab330debf3483de21ff1a50d74631a7d43bc", - "support" - ], - "encoding/streams/decode-split-character.any-expected.txt": [ - "c2423a9dd0f19349c7dcdea9769a4246fbd36ad8", - "support" - ], "encoding/streams/decode-split-character.any.js": [ "6c022697da65ea10ee72da38609e8edbf695edab", "testharness" ], - "encoding/streams/decode-split-character.any.serviceworker-expected.txt": [ - "c2423a9dd0f19349c7dcdea9769a4246fbd36ad8", - "support" - ], - "encoding/streams/decode-split-character.any.sharedworker-expected.txt": [ - "c2423a9dd0f19349c7dcdea9769a4246fbd36ad8", - "support" - ], - "encoding/streams/decode-split-character.any.worker-expected.txt": [ - "c2423a9dd0f19349c7dcdea9769a4246fbd36ad8", - "support" - ], - "encoding/streams/decode-utf8.any-expected.txt": [ - "8eb175c0047ea5471fe5f13e30a783d568e0d752", - "support" - ], "encoding/streams/decode-utf8.any.js": [ "34fa764bf0a682d1052550b406e8ad8dcec92825", "testharness" ], - "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [ - "8eb175c0047ea5471fe5f13e30a783d568e0d752", - "support" - ], - "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [ - "8eb175c0047ea5471fe5f13e30a783d568e0d752", - "support" - ], - "encoding/streams/decode-utf8.any.worker-expected.txt": [ - "8eb175c0047ea5471fe5f13e30a783d568e0d752", - "support" - ], - "encoding/streams/encode-bad-chunks.any-expected.txt": [ - "504d6396e76a720ca91a1c6c5aa20a2cd9799e07", - "support" - ], "encoding/streams/encode-bad-chunks.any.js": [ "868e34b7342969b20145af44fd1d606499ec9ad1", "testharness" ], - "encoding/streams/encode-bad-chunks.any.serviceworker-expected.txt": [ - "504d6396e76a720ca91a1c6c5aa20a2cd9799e07", - "support" - ], - "encoding/streams/encode-bad-chunks.any.sharedworker-expected.txt": [ - "504d6396e76a720ca91a1c6c5aa20a2cd9799e07", - "support" - ], - "encoding/streams/encode-bad-chunks.any.worker-expected.txt": [ - "504d6396e76a720ca91a1c6c5aa20a2cd9799e07", - "support" - ], - "encoding/streams/encode-utf8.any-expected.txt": [ - "57c301cadec9c2fb9171e12ff7a7a9234185658a", - "support" - ], "encoding/streams/encode-utf8.any.js": [ "74d1860e82b18535deb21238217c0e817bb9cc5d", "testharness" ], - "encoding/streams/encode-utf8.any.serviceworker-expected.txt": [ - "57c301cadec9c2fb9171e12ff7a7a9234185658a", - "support" - ], - "encoding/streams/encode-utf8.any.sharedworker-expected.txt": [ - "57c301cadec9c2fb9171e12ff7a7a9234185658a", - "support" - ], - "encoding/streams/encode-utf8.any.worker-expected.txt": [ - "57c301cadec9c2fb9171e12ff7a7a9234185658a", - "support" - ], - "encoding/streams/readable-writable-properties.any-expected.txt": [ - "59c6569e99bf91ad84fa453855f771fe7a14f14d", - "support" - ], "encoding/streams/readable-writable-properties.any.js": [ "ad7cde32f6889200e44ab840d3814f985778026d", "testharness" ], - "encoding/streams/readable-writable-properties.any.serviceworker-expected.txt": [ - "59c6569e99bf91ad84fa453855f771fe7a14f14d", - "support" - ], - "encoding/streams/readable-writable-properties.any.sharedworker-expected.txt": [ - "59c6569e99bf91ad84fa453855f771fe7a14f14d", - "support" - ], - "encoding/streams/readable-writable-properties.any.worker-expected.txt": [ - "59c6569e99bf91ad84fa453855f771fe7a14f14d", - "support" - ], - "encoding/streams/realms.window-expected.txt": [ - "044828efce6fbd956098192bb5768c894aa2fec3", - "support" - ], "encoding/streams/realms.window.js": [ "b1cc13e0b80653161bf0e7c9a99325feab45d5c0", "testharness" @@ -365898,7 +366165,7 @@ "support" ], "encrypted-media/scripts/playback-temporary-expired.js": [ - "5144ef967f78fef82aee7821a091c876b48f441c", + "3d1bd9591db309deb64df8765f5a7fd6fb5c4791", "support" ], "encrypted-media/scripts/playback-temporary-multikey-sequential.js": [ @@ -369685,6 +369952,22 @@ "5bec688af9cd3c02ef00055d5bf4642841c04951", "support" ], + "hr-time/resources/unload-a.html": [ + "40c1d061830e6fd36d740ba49f5252b8b00bc813", + "support" + ], + "hr-time/resources/unload-b.html": [ + "7c2d90df275fbc15f79d71fa2c57131fb7f99a5d", + "support" + ], + "hr-time/resources/unload-c.html": [ + "731da9db758ba52a2d0f67222e41dc8cff76071b", + "support" + ], + "hr-time/resources/unload.js": [ + "ab6b121c2b5cedd5f79015f3f1aa3ef1fddd7fb0", + "support" + ], "hr-time/test_cross_frame_start.html": [ "30e804bd7350315497115b75929a52ac1d82d3cb", "testharness" @@ -369697,6 +369980,10 @@ "71ade4a8c48ce2d0df59537d1a6d48a4ada08b8a", "testharness" ], + "hr-time/unload-manual.html": [ + "18c4e0dc327919361af8bdd730ba25904263ff97", + "manual" + ], "hr-time/window-worker-timeOrigin.window.js": [ "1e5ef1cdffecf639363aa06b72665f54ccce1156", "testharness" @@ -379025,6 +379312,10 @@ "e7529946a49c0da964dae79831047e4a0507f119", "reftest" ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html": [ + "4abd9ce533d7740e906a83a0e8cbc67c8613bf52", + "testharness" + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html": [ "f07c84f406cefc7054e8a13c2796d3d82673bdf7", "testharness" @@ -379073,6 +379364,14 @@ "cacbdbae00d0f7d6067323c68fc460149c524f35", "reftest" ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html": [ + "d9b36e530b4f95bdfc636050905e6bfd5d8af690", + "support" + ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html": [ + "2599f2f0fa201c94234d172d06700c1a8ec19a65", + "reftest" + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order-ref.html": [ "13b262a804ab781905b3e4d3483554d9dd95b4d8", "support" @@ -385286,17 +385585,13 @@ "testharness" ], "html/semantics/scripting-1/the-script-element/execution-timing/083-expected.txt": [ - "5f6926ceb83b852b8f61c7c9507c0127bd50312e", + "7d8abb8d655abe2d819cd10716c2b01eadb62b77", "support" ], "html/semantics/scripting-1/the-script-element/execution-timing/083.html": [ "2ac0015c8b722132bd3a895fb578b9ed0b9e630a", "testharness" ], - "html/semantics/scripting-1/the-script-element/execution-timing/084-expected.txt": [ - "bfce201d75b59bb4bb31cfbc3da8aa6867f30e3c", - "support" - ], "html/semantics/scripting-1/the-script-element/execution-timing/084.html": [ "3027fa19944c367cb48d043f9795c82396b70795", "testharness" @@ -385693,10 +385988,26 @@ "ca7fdba71f164c0a1e7c195675497b02f2e0a0a5", "support" ], + "html/semantics/scripting-1/the-script-element/goal-parameter-expected.txt": [ + "aeebcd09ff0bd77651e0cea24f5756bf011a0c8a", + "support" + ], + "html/semantics/scripting-1/the-script-element/goal-parameter.htm": [ + "fe4d6759b91b09da5a6c7bb0b53095315d10d4a9", + "testharness" + ], "html/semantics/scripting-1/the-script-element/historical.html": [ "1f1a91228c2174773243163e5b588e56c2c74fc1", "testharness" ], + "html/semantics/scripting-1/the-script-element/is-module-goal.mjs": [ + "b533fc2e906b4b9a0a912044b19ee523ae5eef7a", + "support" + ], + "html/semantics/scripting-1/the-script-element/is-script-goal.js": [ + "069363dd400da159b74847a3ea4299292a92d4f5", + "support" + ], "html/semantics/scripting-1/the-script-element/load-error-events-1.html": [ "45571550e1cc29bfaa218ad06f7c7b20b903a53b", "testharness" @@ -389033,6 +389344,10 @@ "1d94de8a7c9f28dfab32111deb664d9921437e46", "testharness" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js": [ + "f96710999adedff334a656cacdde0fa8d561fd0c", + "testharness" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.js": [ "0e1c54b683257aea8fd58c893957acd794cc1ab1", "testharness" @@ -389086,7 +389401,7 @@ "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js": [ - "58ec08f9ff110a458f02660ba18e97513f569173", + "df07124d811135cafcfa9908ece9410f19ccdefa", "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/history-state.window.js": [ @@ -389177,6 +389492,10 @@ "2404105b09a7724cf8cc5e2cf6d7bf7a8fb6f39b", "support" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html": [ + "a1ab01e072b038cd0ec46a8497650845aca83062", + "support" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/set-document-domain.html": [ "a92a7ae39f8351f97cd865dca5ebe8d4260aa229", "support" @@ -389210,7 +389529,7 @@ "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window-expected.txt": [ - "4e75b86d1a793e1438686478d7e4c3e1ad13dd77", + "5c30e0806d0af3fb1253b38e54f76f1a6d20ce84", "support" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window.js": [ @@ -389765,18 +390084,10 @@ "1fdab521ae6f63d72faa707eea593ffa16331d13", "testharness" ], - "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1-expected.txt": [ - "e65e176b729ee1c82494a5664d9c27460d6ed475", - "support" - ], "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html": [ "65a1a02b11eaac20f9840b4bce1b4f50416096cf", "testharness" ], - "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2-expected.txt": [ - "e65e176b729ee1c82494a5664d9c27460d6ed475", - "support" - ], "html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html": [ "6c5476542b869dffea77c828cad64a380c15ef63", "testharness" @@ -390178,7 +390489,7 @@ "testharness" ], "infrastructure/META.yml": [ - "59b44af3351e0610586709c033b15f15e1c46857", + "c1d3b0c9ec4c3f6458597d8596cc3213866598df", "support" ], "infrastructure/OWNERS": [ @@ -390694,7 +391005,7 @@ "support" ], "interfaces/cssom-view.idl": [ - "0213a4090c717812b7e4a1c81b8558d3bebfd287", + "2b5b381dfa4af736d96a3c2e0bb0db372846f3dd", "support" ], "interfaces/cssom.idl": [ @@ -390870,7 +391181,7 @@ "support" ], "interfaces/payment-request.idl": [ - "7bd2ae13efd1327865ab1a0b526dea1aa47eea17", + "d844f7cc788c5be1c882fe510bc85f25dd250659", "support" ], "interfaces/performance-timeline.idl": [ @@ -390989,6 +391300,10 @@ "f4191d91d36fbed1544b49298a74105859073628", "support" ], + "interfaces/wai-aria.idl": [ + "c6ea9591f8d7fb5b0a1651a6d1d5c8c6cab7b0ae", + "support" + ], "interfaces/wake-lock.idl": [ "ac8b70c157a2b42876b55b8ab67873d4a483c54d", "support" @@ -401630,11 +401945,11 @@ "testharness" ], "payment-request/idlharness.https.window-expected.txt": [ - "799a45e180cd9b745c4f1c45a32b1341c0dbe506", + "cde105931f413db438995ae3c031de1057506afe", "support" ], "payment-request/idlharness.https.window.js": [ - "9a068c6d27f86a63d160b47b09a2116d5479ac72", + "53ae47e892104a08e3de4f4483b7442dec2e7043", "testharness" ], "payment-request/interfaces.https-expected.txt": [ @@ -402510,7 +402825,7 @@ "testharness" ], "preload/preload-strict-dynamic.html": [ - "5e473a1c89448c046bef9a4fa5b09daa55c1d748", + "76395656f9b359e05ae1aeace5ad05a6f338cb5e", "testharness" ], "preload/preload-with-type.html": [ @@ -411422,7 +411737,7 @@ "support" ], "resources/chromium/generic_sensor_mocks.js": [ - "24a469199ff1e4eae40d693feff4eb220e80b2cf", + "d9a23f447140047a1343f855dfdf5a773ce1b269", "support" ], "resources/chromium/generic_sensor_mocks.js.headers": [ @@ -411458,7 +411773,7 @@ "support" ], "resources/chromium/sensor.mojom.js": [ - "daa99217335fc4dec9c28119935acc28afe58dd8", + "ffbd25b57df58e69476edcce2561e25dde424d5c", "support" ], "resources/chromium/sensor_provider.mojom.js": [ @@ -411522,7 +411837,7 @@ "support" ], "resources/idlharness.js": [ - "a088bc4c2a78002500fb879410e1800f16845af7", + "746f3e65503fe8587e6f7d01e593cbdccd7ab425", "support" ], "resources/idlharness.js.headers": [ @@ -413806,7 +414121,7 @@ "support" ], "service-workers/service-worker/navigation-redirect.https.html": [ - "0f1d377a57cfc078212cc0a069d0280f881b5262", + "0490f2b4058ce808115442b09859fe7a350b2303", "testharness" ], "service-workers/service-worker/navigation-timing.https-expected.txt": [ @@ -413862,7 +414177,7 @@ "testharness" ], "service-workers/service-worker/redirected-response.https.html": [ - "f7370e023b1ab4454b839bc6daa432cf539e1d7f", + "05a94e2fd1dd13bc49dd34c00e0c1e5c110723a5", "testharness" ], "service-workers/service-worker/referer.https.html": [ @@ -414622,7 +414937,7 @@ "support" ], "service-workers/service-worker/resources/navigation-redirect-other-origin.html": [ - "a9483c6534579ac2f3549d79c7488feef11a5c69", + "0d2825f31093f8959b45712eff247a0a21c7c8cd", "support" ], "service-workers/service-worker/resources/navigation-redirect-out-scope.py": [ @@ -414774,7 +415089,7 @@ "support" ], "service-workers/service-worker/resources/redirect-worker.js": [ - "7e5ead19419e2c9bdf6bf223ec84e692e57c8fe2", + "5258c5e7be4578a4c783ccc659976acd399c6bf3", "support" ], "service-workers/service-worker/resources/redirect.py": [ @@ -416790,7 +417105,7 @@ "testharness" ], "streams/readable-streams/patched-global.js": [ - "e8117c480484a3b6a83ecf10d1b9c8c61c5d02ca", + "c75b21e8c38573e6ce70b71ce6887a21f2d853e2", "support" ], "streams/readable-streams/patched-global.serviceworker.https.html": [ @@ -417030,7 +417345,7 @@ "testharness" ], "streams/transform-streams/patched-global.js": [ - "d27b9cdd119edad098120f2b867cf9229f575af5", + "f5d32c08ea730044436d40fa500c425e422d6f25", "support" ], "streams/transform-streams/patched-global.serviceworker.https.html": [ @@ -418573,8 +418888,12 @@ "c8daddfe9955196bf0b69410263cb7c01e473e5e", "testharness" ], + "trusted-types/Element-setAttribute.tentative.html": [ + "a284b2f83550b1b0e4cf7c79e7a200791ae8c70a", + "testharness" + ], "trusted-types/HTMLElement-generic.tentative.html": [ - "08d165a75d4185a61374128be8046384cc701b4e", + "2d38104511879943a4d538c9dc5b0031d7596b23", "testharness" ], "trusted-types/Location-assign.tentative.html": [ @@ -418605,6 +418924,14 @@ "b20fcf2436eac17f9f558cab0c80d1eced6bb1be", "testharness" ], + "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [ + "49a9506b5a7910bf1ee7e98dcbe2fbdbecacb000", + "testharness" + ], + "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html": [ + "9daf20ec1869919603965942fa6a4c99925ac8e9", + "testharness" + ], "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [ "af6e04941c3b6206602bc7f547a3b0c9ef555a11", "testharness" @@ -418622,47 +418949,51 @@ "testharness" ], "trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [ - "e5959a425a2feafc95deb4f6b8b1372ad5ad1497", + "366bdd2ab6d2d3c24d89cfba2eeea17c045d0a24", "testharness" ], "trusted-types/block-string-assignment-to-Document-write.tentative.html": [ - "06532c3b47948c22c5debfae511c5fbd414c64de", + "ce530d49bb6072dc64d9399abc833b7f54d94741", "testharness" ], "trusted-types/block-string-assignment-to-Element-insertAdjacentHTML.tentative.html": [ - "1fb3bbd994a4a6904cfc4609430f9188692eda40", + "593d6c64a7c466395972251f5ae0c1ac8a7e1998", "testharness" ], "trusted-types/block-string-assignment-to-Element-outerHTML.tentative.html": [ - "abb595222ba5e609cff02adc27a8a7239d44103e", + "c9bde5eb6d5b64046f64c102b441b0990a934b9e", + "testharness" + ], + "trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html": [ + "52e317083316435ec4b1dcc7331f1216c2a32d9a", "testharness" ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ - "7b1a5795d7c04448cd204391ba75030a87131150", + "f31fce629bccd342ff5e8dfacd43e13faac6fced", "testharness" ], "trusted-types/block-string-assignment-to-Location-assign.tentative.html": [ - "cd375b9d016365f01d8e6f95b50d928520c82afa", + "5de5fecda0b2db6af2a87e888ebaca22db72223f", "testharness" ], "trusted-types/block-string-assignment-to-Location-href.tentative.html": [ - "14fbcb2fb3cdc6f51e957bbb047ba8900f0d0865", + "24312617892de90eb6caee32fac81c18ae909147", "testharness" ], "trusted-types/block-string-assignment-to-Location-replace.tentative.html": [ - "9d00fcdeb35d36b05adeb7b67f3816169f3ad036", + "407521570596e05a7e9a4ac3cb9b795244c43ebc", "testharness" ], "trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html": [ - "ff9be06251dc7965ad1d765d49e45b4ef9f8d728", + "1cae5c74e96588eb9999767abab45921fe7414ae", "testharness" ], "trusted-types/block-string-assignment-to-Window-open.tentative.html": [ - "ae4b038dc0c67ab828c3531b3ac01e819114f1ed", + "8070b4a4896d9adc60346fccb5fa96b997ef597a", "testharness" ], "trusted-types/support/helper.sub.js": [ - "617e02aa6badddd36f01f88241ac8ce7d5670597", + "1ad5b4ef0c68a1ffde111db62c5e2aa4957732b6", "support" ], "uievents/META.yml": [ @@ -421266,11 +421597,11 @@ "testharness" ], "webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions-expected.txt": [ - "a4e23559cadcb0a2b6d87d7748ace13f0f183ed8", + "4c36f417d222212f46d0dfaf96c0d57f7656d9b3", "support" ], "webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html": [ - "9609d5d102638251f686058683a83bbea7b5ad0a", + "98f64a0379c5eda5d0ba03226fb89f1cedb4fba8", "testharness" ], "webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurveAtTime.html": [ @@ -423206,7 +423537,7 @@ "support" ], "webrtc/idlharness.https.window-expected.txt": [ - "44147592ed6e513a5cd4699b82d1c97c2a971728", + "d9dbcec9743b4c0120f88d24a662d242c4dc337c", "support" ], "webrtc/idlharness.https.window.js": [ @@ -423770,7 +424101,11 @@ "testharness" ], "websockets/cookies/006.html": [ - "7e975879a3512c6024eec4532f783c295a043ffc", + "0e958d25e5d276cc78b6394a1332ea42a510e3f4", + "testharness" + ], + "websockets/cookies/006.https.html": [ + "015eeb22f07a1d744c490248633eae9953ba5e6d", "testharness" ], "websockets/cookies/007-expected.txt": [ @@ -428285,6 +428620,10 @@ "f8fe65e520c4ed9dd0c8779fe55b76459571ec94", "testharness" ], + "workers/importscripts_mime.tentative.any.js": [ + "04c63a3a5f6d9bd3b71d94142f65a1825358b8ed", + "testharness" + ], "workers/interfaces.worker-expected.txt": [ "80841e38718d7972285788526ac3d1a4cd4df69a", "support" @@ -429129,6 +429468,10 @@ "0fb0ec228079de8dd15626fb3161b53d48c68112", "support" ], + "workers/support/imported_script.py": [ + "88cd2285e82162679c0bcbcc1ff756c91c12a5a0", + "support" + ], "workers/support/name-as-accidental-global.js": [ "f2c39ea715aa64a990eda923931969a890ce336d", "support" @@ -429813,18 +430156,10 @@ "c40213562b57ad56f8bf06a7a89f0453d53a1fd1", "testharness" ], - "xhr/event-upload-progress-crossorigin-expected.txt": [ - "3fba2d6aacd43570f1f8be635992dabb951ed77a", - "support" - ], "xhr/event-upload-progress-crossorigin.htm": [ "5e558a27b78b1879e0ad3e352037db3434b9fb6a", "testharness" ], - "xhr/event-upload-progress-expected.txt": [ - "3fba2d6aacd43570f1f8be635992dabb951ed77a", - "support" - ], "xhr/event-upload-progress.htm": [ "697d4cbd3f61cd223ea7b295306474c77b1de2dd", "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..2c482da --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS Background Fetch requires an activated Service Worker +PASS Argument verification is done for BackgroundFetchManager.fetch() +PASS IDs must be unique among active Background Fetch registrations +PASS Using Background Fetch to successfully fetch a single resource +PASS Background Fetch that exceeds the quota throws a QuotaExceededError +FAIL Fetches can have requests with duplicate URLs promise_test: Unhandled rejection with value: object "TypeError: Fetches with duplicate requests are not yet supported. Consider adding query params to make the requests unique. For updates check http://crbug.com/871174" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window.js b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window.js index b8b1e5a8..f2cffd0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/fetch.https.window.js
@@ -102,3 +102,23 @@ 'This fetch should have thrown a quota exceeded error'); }, 'Background Fetch that exceeds the quota throws a QuotaExceededError'); + +backgroundFetchTest(async (test, backgroundFetch) => { + const registration = await backgroundFetch.fetch( + 'my-id', ['resources/feature-name.txt', 'resources/feature-name.txt']); + + const {type, eventRegistration, results} = await getMessageFromServiceWorker(); + assert_equals('backgroundfetchsuccess', type); + assert_equals(results.length, 2); + + assert_equals(eventRegistration.id, registration.id); + assert_equals(eventRegistration.state, "success"); + assert_equals(eventRegistration.failureReason, ""); + + for (const result of results) { + assert_true(result.url.includes('resources/feature-name.txt')); + assert_equals(result.status, 200); + assert_equals(result.text, 'Background Fetch'); + } + +}, 'Fetches can have requests with duplicate URLs');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/blob/blob-urls-do-not-match-self.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/blob/blob-urls-do-not-match-self.sub.html index 1bf96df..cafa1e3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/blob/blob-urls-do-not-match-self.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/blob/blob-urls-do-not-match-self.sub.html
@@ -7,7 +7,7 @@ <title>blob-urls-do-not-match-self</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=script-src"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=script-src-elem"]'></script> <script src='../support/alertAssert.sub.js?alerts=[]'></script> </head>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/default-src/default-src-inline-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/default-src/default-src-inline-blocked.sub.html index 8687355..0cb4ca5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/default-src/default-src-inline-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/default-src/default-src-inline-blocked.sub.html
@@ -12,7 +12,7 @@ <title>default-src-inline-blocked</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=script-src","violated-directive=script-src"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=script-src-elem","violated-directive=script-src-elem"]'></script> <script src='../support/alertAssert.sub.js?alerts=[]'></script> </head>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/filesystem-urls-do-not-match-self.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/filesystem-urls-do-not-match-self.sub.html index 401b65a..afb272cf 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/filesystem-urls-do-not-match-self.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/filesystem-urls-do-not-match-self.sub.html
@@ -7,7 +7,7 @@ <title>filesystem-urls-do-not-match-self</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=script-src"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=script-src-elem"]'></script> <script src="../support/alertAssert.sub.js?alerts=[]"></script> </head> @@ -19,7 +19,7 @@ window.addEventListener('securitypolicyviolation', function(e) { log("violated-directive=" + e.violatedDirective); }); - + if(!window.webkitRequestFileSystem) { t_log = async_test(); t_log.set_status(t_log.NOTRUN, "No filesystem:// support, cannot run test.");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_1-script-src.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_1-script-src.html index d27b922..35033c38 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_1-script-src.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_1-script-src.html
@@ -16,9 +16,9 @@ var scriptsrc2 = async_test("Verify cascading of default-src to script-src policy: allow"); var allowedScriptRan = false; var t_spv = async_test("Should fire violation events for every failed violation"); - + window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_10_1.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_10_1.sub.html index 107ab905..f48c1e3c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_10_1.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_10_1.sub.html
@@ -2,16 +2,16 @@ <html> <head> <title>implicit port number matching fails with a different port</title> - <meta http-equiv="Content-Security-Policy" content="script-src 'self' www.{{host}} 'unsafe-inline';"> + <meta http-equiv="Content-Security-Policy" content="script-src 'self' www.{{host}} 'unsafe-inline';"> <script src='/resources/testharness.js'></script> <script src='/resources/testharnessreport.js'></script> <script src='negativeTests.js'></script> <script> var t_spv = async_test("Should fire violation events for every failed violation"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); - + var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_2.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_2.sub.html index cdb6238..6cb75e3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_2.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_2.sub.html
@@ -9,9 +9,9 @@ <script> var t_spv = async_test("Should fire violation events for every failed violation"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); - + var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_3.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_3.html index 754c9a32..d9c230d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_3.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_2_3.html
@@ -9,9 +9,9 @@ <script> var t_spv = async_test("Should fire violation events for every failed violation"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); - + var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html index c2d968b..e8ce2341 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/generic/generic-0_8_1.sub.html
@@ -9,9 +9,9 @@ <script> var t_spv = async_test("Should fire violation events for every failed violation"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); - + var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/meta/combine-header-and-meta-policies.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/meta/combine-header-and-meta-policies.sub.html index 6e9e71d..70bfeb6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/meta/combine-header-and-meta-policies.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/meta/combine-header-and-meta-policies.sub.html
@@ -7,7 +7,7 @@ <title>combine-header-and-meta-policies</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["TEST COMPLETE", "violated-directive=img-src", "violated-directive=style-src"]'></script> + <script src='../support/logTest.sub.js?logs=["TEST COMPLETE", "violated-directive=img-src", "violated-directive=style-src-elem"]'></script> <script src="../support/alertAssert.sub.js?alerts=[]"></script> <!-- enforcing multiple policies: Content-Security-Policy: script-src 'self' 'unsafe-inline'; connect-src 'self'; style-src 'self' @@ -23,7 +23,7 @@ window.addEventListener('securitypolicyviolation', function(e) { log("violated-directive=" + e.violatedDirective); }); - + var img = document.createElement('img'); img.src = '../support/fail.png'; img.onerror = function() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html index 6c120ad..70dea1f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html
@@ -13,7 +13,7 @@ if (e.target != element) return; assert_equals(e.blockedURI, "inline"); - assert_equals(e.effectiveDirective, "script-src"); + assert_equals(e.effectiveDirective, "script-src-elem"); assert_equals(element.contentDocument.body.innerText, "", "Ensure that 'Fail' doesn't appear in the child document."); element.remove(); test.done(); @@ -36,7 +36,7 @@ var i = document.createElement("iframe"); i.src = "javascript:'Fail.'"; - assert_csp_event_for_element(t, i); + assert_csp_event_for_element(t, i); document.body.appendChild(i); }, "<iframe src='javascript:'> blocked without 'unsafe-inline'."); @@ -44,7 +44,7 @@ async_test(t => { var i = document.createElement("iframe"); - assert_csp_event_for_element(t, i); + assert_csp_event_for_element(t, i); navigate_to_javascript_onload(t, i); document.body.appendChild(i); @@ -54,17 +54,17 @@ var i = document.createElement("iframe"); i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'unsafe-inline'"); - assert_csp_event_for_element(t, i); + assert_csp_event_for_element(t, i); navigate_to_javascript_onload(t, i); document.body.appendChild(i); }, "<iframe src='...'> with 'unsafe-inline' navigated to 'javascript:' blocked in this document"); - + async_test(t => { var i = document.createElement("iframe"); i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'none'"); - assert_csp_event_for_element(t, i); + assert_csp_event_for_element(t, i); navigate_to_javascript_onload(t, i); document.body.appendChild(i);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html new file mode 100644 index 0000000..d4c19c546 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-allowed-src-blocked.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-attr 'unsafe-inline'; + script-src 'nonce-abc';"> + <script nonce='abc' src="/resources/testharness.js"></script> + <script nonce='abc' src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should not fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.unreached_func("Should not have fired a spv event")); + </script> + + <img src="../support/pass.png" onload="t.done()"> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html new file mode 100644 index 0000000..199726e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-attr-blocked-src-allowed.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-attr 'none'; + script-src 'unsafe-inline' 'self';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script> + var t = async_test("Should fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'script-src-attr'); + assert_equals(e.blockedURI, 'inline'); + })); + </script> + + <img src="../support/pass.png" onload="t.unreached_func('Should not have executed the inline handler')"> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html new file mode 100644 index 0000000..c2189837 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-attr-blocked.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-elem 'self' 'unsafe-inline'; + script-src-attr 'none';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script> + var t = async_test("Should fire a security policy violation for the attribute"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'script-src-attr'); + assert_equals(e.blockedURI, 'inline'); + })); + + var t1 = async_test("Should execute the inline script block"); + </script> + + <script> + t1.done(); + </script> + + <img src="../support/pass.png" onload="t.unreached_func('should not have run this event handler')"> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html new file mode 100644 index 0000000..c795461 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-allowed-src-blocked.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-elem 'nonce-abc' 'nonce-def'; + script-src 'nonce-abc';"> + <script nonce='abc' src="/resources/testharness.js"></script> + <script nonce='abc' src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should not fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.unreached_func("Should not have fired a spv event")); + </script> + + <script nonce='def'> + t.done(); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html new file mode 100644 index 0000000..4a85c15 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-attr-allowed.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-elem 'nonce-abc' 'self'; + script-src-attr 'unsafe-inline'"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should fire a security policy violation for the attribute"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'script-src-elem'); + assert_equals(e.blockedURI, 'inline'); + })); + + var t1 = async_test("Should execute the inline script attribute"); + </script> + + <script> + t.step_func(function() { + assert_unreached("Should not have executed the inline script block"); + }) + </script> + + <img src="../support/pass.png" onload="t1.done()"> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html new file mode 100644 index 0000000..ac4726f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/script-src-elem-blocked-src-allowed.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-elem 'nonce-abc'; + script-src 'nonce-abc' 'nonce-def';"> + <script nonce='abc' src="/resources/testharness.js"></script> + <script nonce='abc' src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should fire a spv event"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'script-src-elem'); + assert_equals(e.blockedURI, 'inline'); + })); + + </script> + + <script nonce='def'> + t.step_func(function() { + assert_unreached("Should not have executed the inline block"); + }); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html new file mode 100644 index 0000000..b6543778 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-allowed-src-blocked.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src-elem 'strict-dynamic' 'nonce-abc'; + script-src 'nonce-abc';"> + <script nonce='abc' src="/resources/testharness.js"></script> + <script nonce='abc' src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should not fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.unreached_func("Should not have fired a spv event")); + + var s = document.createElement('script'); + s.src = 'support/t_done.js'; + document.head.appendChild(s); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html new file mode 100644 index 0000000..04394dc3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/strict-dynamic-elem-blocked-src-allowed.sub.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="script-src 'strict-dynamic' 'nonce-abc'; + script-src-elem 'nonce-abc';"> + <script nonce='abc' src="/resources/testharness.js"></script> + <script nonce='abc' src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script nonce='abc'> + var t = async_test("Should fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, "script-src-elem"); + assert_equals(e.blockedURI, "{{location[scheme]}}://{{location[host]}}/content-security-policy/script-src-attr-elem/support/t_fail.js"); + })); + + var s = document.createElement('script'); + s.src = 'support/t_fail.js'; + document.head.appendChild(s); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_done.js b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_done.js new file mode 100644 index 0000000..e31eb1d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_done.js
@@ -0,0 +1 @@ +t.done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_fail.js b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_fail.js new file mode 100644 index 0000000..fa48d6e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src-attr-elem/support/t_fail.js
@@ -0,0 +1,3 @@ +t.step(function() { + assert_unreached("Should not loaded the script"); +});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/addInlineTestsWithDOMManipulation.js b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/addInlineTestsWithDOMManipulation.js index a5d91dca..02c8c8c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/addInlineTestsWithDOMManipulation.js +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/addInlineTestsWithDOMManipulation.js
@@ -3,7 +3,7 @@ var test_count = 2; window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); if (--test_count <= 0) { t_spv.done(); } @@ -25,4 +25,4 @@ document.writeln('<script>dmTest.step(function() {assert_unreached("Unsafe inline script ran - document.writeln")});</script>'); dmTest.done(); -})(); \ No newline at end of file +})();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/injected-inline-script-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/injected-inline-script-blocked.sub.html index 07e2ae2..45c389f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/injected-inline-script-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/injected-inline-script-blocked.sub.html
@@ -7,7 +7,7 @@ <title>injected-inline-script-blocked</title> <script nonce='abc' src="/resources/testharness.js"></script> <script nonce='abc' src="/resources/testharnessreport.js"></script> - <script nonce='abc' src='../support/logTest.sub.js?logs=["violated-directive=script-src",]'></script> + <script nonce='abc' src='../support/logTest.sub.js?logs=["violated-directive=script-src-elem",]'></script> <script nonce='abc' src='../support/alertAssert.sub.js?alerts=[]'></script> </head>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/inlineTests.js b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/inlineTests.js index 0c6e544..3c0712b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/inlineTests.js +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/inlineTests.js
@@ -1,13 +1,22 @@ var t1 = async_test("Inline script block"); var t2 = async_test("Inline event handler"); -onload = function() {t1.done(); t2.done()} +onload = function() {t1.done(); t2.done();}; -var t_spv = async_test("Should not fire policy violation events"); -var test_count = 2; +var t_spv = async_test("Should fire policy violation events"); +var block_event_fired = false; +var handler_event_fired = false; window.addEventListener("securitypolicyviolation", t_spv.step_func(function(e) { - assert_equals(e.violatedDirective, "script-src"); - if (--test_count <= 0) { - t_spv.done(); + if (e.violatedDirective == "script-src-elem") { + assert_false(block_event_fired); + block_event_fired = true; + } else if (e.violatedDirective == "script-src-attr") { + assert_false(handler_event_fired); + handler_event_fired = true; + } else { + assert_unreached("Unexpected directive broken"); + } + if (block_event_fired && handler_event_fired) { + t_spv.done(); } }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/javascript-window-open-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/javascript-window-open-blocked.html index e02d66ae..ae4d822 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/javascript-window-open-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/javascript-window-open-blocked.html
@@ -11,7 +11,7 @@ var t = async_test("Check that a securitypolicyviolation event is fired"); window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { assert_equals(e.blockedURI, "inline"); - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); window.open('javascript:test(function() { assert_unreached("FAIL")});', 'new');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html index 16428b1a..3c4e39e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html
@@ -10,7 +10,7 @@ <script nonce="abc"> var t_spv = async_test("Should fire securitypolicyviolation event"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); assert_equals(e.disposition, "report"); })); var externalRan = false;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html index 9ae6661..850f4b2c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html
@@ -11,7 +11,7 @@ var t = async_test("Test that script executes if allowed by proper hash values"); var t_spv = async_test("Test that the securitypolicyviolation event is fired"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); assert_equals(e.disposition, "report"); assert_equals(e.blockedURI, "inline"); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html index 4e19446..51b0b79 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html
@@ -21,7 +21,7 @@ } })); window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { - assert_equals(e.effectiveDirective, 'script-src'); + assert_equals(e.effectiveDirective, 'script-src-elem'); })); }, 'Whitelisted script without a correct nonce is not allowed with `strict-dynamic`.'); </script> @@ -29,4 +29,4 @@ </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html index cd2ae8c..91d12ed7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html
@@ -28,7 +28,7 @@ if (violation.blockedURI.split('?')[1] !== 'unNonced-appendChild') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -65,4 +65,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html index 94490de1..314ed91e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html
@@ -44,7 +44,7 @@ if (violation.blockedURI.split('?')[1] !== 'nonWhitelisted-appendChild') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); assert_equals(violation.originalPolicy, "script-src 'self' 'nonce-dummy'"); t.done(); })); @@ -58,4 +58,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html index 1e057ba9..1ceb74c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html
@@ -27,7 +27,7 @@ if (violation.blockedURI.split('?')[1] !== 'appendChild-reportOnly') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); // Check that the violation comes from the Report-Only policy. assert_equals(violation.originalPolicy, "script-src 'none'"); t.done(); @@ -41,4 +41,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html index 3a6151b1..f7625afda 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_javascript_uri.html
@@ -20,7 +20,7 @@ async_test(function(t) { window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { assert_false(javascriptUriScriptRan); - assert_equals(e.effectiveDirective, 'script-src'); + assert_equals(e.effectiveDirective, 'script-src-elem'); })); document.getElementById('javascriptUri').click();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html index 19d2ae1..ac180d23 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html
@@ -16,7 +16,7 @@ <script nonce='dummy'> async_test(function(t) { window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { - assert_equals(e.effectiveDirective, 'script-src'); + assert_equals(e.effectiveDirective, 'script-src-elem'); })); }, 'All the expected CSP violation reports have been fired.'); </script> @@ -26,4 +26,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html index c167e5ef..c5e33dc4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html
@@ -24,7 +24,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWrite') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -43,7 +43,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWriteln') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -62,7 +62,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWrite-deferred') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -81,7 +81,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-deferred') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -100,7 +100,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWrite-async') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -119,7 +119,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-async') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -138,7 +138,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWrite-deferred-async') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -157,7 +157,7 @@ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-deferred-async') { return; } - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-elem'); t.done(); })); @@ -173,7 +173,7 @@ return; } assert_false(innerHTMLScriptRan); - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-attr'); t.done(); })); @@ -191,7 +191,7 @@ return; } assert_false(insertAdjacentHTMLScriptRan); - assert_equals(violation.effectiveDirective, 'script-src'); + assert_equals(violation.effectiveDirective, 'script-src-attr'); t.done(); })); @@ -202,4 +202,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scripthash-unicode-normalization.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scripthash-unicode-normalization.sub.html index 0c30363..4212297 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scripthash-unicode-normalization.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scripthash-unicode-normalization.sub.html
@@ -20,9 +20,9 @@ <script nonce="nonceynonce"> var t_spv = async_test("Should fire securitypolicyviolation"); window.addEventListener('securitypolicyviolation', t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); + assert_equals(e.violatedDirective, "script-src-elem"); })); - + var matchingContent = 'Å'; var nonMatchingContent = 'Å';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-and-scripthash.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-and-scripthash.sub.html index 94a39973..8f1f596 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-and-scripthash.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-and-scripthash.sub.html
@@ -18,9 +18,9 @@ window.addEventListener('securitypolicyviolation', function(e) { alert_assert("violated-directive=" + e.violatedDirective); }); - + var t_alert = async_test('Expecting alerts: ["PASS (1/3)","PASS (2/3)","PASS (3/3)"]'); - var expected_alerts = ["PASS (1/3)", "PASS (2/3)", "PASS (3/3)", "violated-directive=script-src", "violated-directive=script-src"]; + var expected_alerts = ["PASS (1/3)", "PASS (2/3)", "PASS (3/3)", "violated-directive=script-src-elem", "violated-directive=script-src-elem"]; function alert_assert(msg) { t_alert.step(function() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-basic-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-basic-blocked.sub.html index db94c1c..2001afcd 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-basic-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-basic-blocked.sub.html
@@ -7,7 +7,7 @@ <title>scriptnonce-basic-blocked</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/alertAssert.sub.js?alerts=["PASS (closely-quoted nonce)","PASS (nonce w/whitespace)", "violated-directive=script-src", "violated-directive=script-src", "violated-directive=script-src"]'></script> + <script src='../support/alertAssert.sub.js?alerts=["PASS (closely-quoted nonce)","PASS (nonce w/whitespace)", "violated-directive=script-src-elem", "violated-directive=script-src-elem", "violated-directive=script-src-elem"]'></script> <script nonce="noncynonce"> alert_assert('PASS (closely-quoted nonce)');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html index 18a6899..b595b7638 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html
@@ -19,8 +19,8 @@ }); </script> <script nonce='noncynonce'> - var t_alert = async_test('Expecting alerts: ["PASS (1/2)","PASS (2/2)", "violated-directive=script-src"]'); - var expected_alerts = ["PASS (1/2)", "PASS (2/2)", "violated-directive=script-src"]; + var t_alert = async_test('Expecting alerts: ["PASS (1/2)","PASS (2/2)", "violated-directive=script-src-elem"]'); + var expected_alerts = ["PASS (1/2)", "PASS (2/2)", "violated-directive=script-src-elem"]; function alert_assert(msg) { t_alert.step(function() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/srcdoc-doesnt-bypass-script-src.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/srcdoc-doesnt-bypass-script-src.sub.html index eea2018..2cae85ec 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/srcdoc-doesnt-bypass-script-src.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/script-src/srcdoc-doesnt-bypass-script-src.sub.html
@@ -7,25 +7,25 @@ <title>srcdoc-doesnt-bypass-script-src</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=script-src"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=script-src-elem"]'></script> </head> <body> - + <script nonce='abc'> window.onmessage = function(e) { log(e.data); } - + var i = document.createElement('iframe'); i.addEventListener('securitypolicyviolation', function(e) { log("violated-directive=" + e.violatedDirective); }); - - i.srcdoc = "<sc" + "ript nonce='abc'>" + - "window.addEventListener('securitypolicyviolation', function(e) {" + + + i.srcdoc = "<sc" + "ript nonce='abc'>" + + "window.addEventListener('securitypolicyviolation', function(e) {" + "window.parent.postMessage('violated-directive=' + e.violatedDirective, '*');});" + - "</scr" + "ipt>" + + "</scr" + "ipt>" + "<scr" + "ipt>window.parent.log('FAIL')</scr" + "ipt>"; document.body.appendChild(i); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html new file mode 100644 index 0000000..567e2249 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-allowed-src-blocked.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-attr 'unsafe-inline'; + style-src 'none';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Should apply the style attribute"); + window.addEventListener('securitypolicyviolation', t.unreached_func("Should not have fired a spv event")); + </script> +</head> + +<body style="background: green"> + <script> + t.step(function() { + assert_true(document.body.style.length > 0); + t.done(); + }); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html new file mode 100644 index 0000000..622c3bf --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-attr 'none'; + style-src 'unsafe-inline';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Should fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'style-src-attr'); + assert_equals(e.blockedURI, 'inline'); + })); + </script> +</head> + +<body style="background: green"> + <script> + async_test(function(test) { + assert_equals(document.body.style.length, 0); + test.done(); + }, "The attribute style should not be applied"); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html new file mode 100644 index 0000000..279600e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-elem 'unsafe-inline'; + style-src-attr 'none';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Should fire a security policy violation for the attribute"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'style-src-attr'); + assert_equals(e.blockedURI, 'inline'); + })); + </script> +</head> + +<body style="background: green"> + <style> + body {background: blue;} + </style> + + <script> + async_test(function(test) { + assert_equals(document.body.style.length, 0); + assert_equals(document.styleSheets.length, 1); + test.done(); + }, "The attribute style should not be applied and the inline style should be applied"); + </script> + +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html new file mode 100644 index 0000000..c15cf0b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-allowed-src-blocked.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-elem 'unsafe-inline'; + style-src 'none';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Inline style should be applied"); + window.addEventListener('securitypolicyviolation', t.unreached_func("Should not have fired a spv event")); + </script> +</head> + +<body> + <style> + body {background: green;} + </style> + <script> + t.step(function() { + assert_equals(document.styleSheets.length, 1); + t.done(); + }); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html new file mode 100644 index 0000000..a42c9de9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-attr-allowed.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-elem 'none'; + script-src-attr 'unsafe-inline'"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Should fire a security policy violation for the inline block"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'style-src-elem'); + assert_equals(e.blockedURI, 'inline'); + })); + </script> +</head> + +<body style="background: green"> + <style> + body {background: blue;} + </style> + + <script> + async_test(function(test) { + assert_true(document.body.style.length > 0); + assert_equals(document.styleSheets.length, 0); + test.done(); + }, "The inline style should not be applied and the attribute style should be applied"); + </script> + +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html new file mode 100644 index 0000000..bf5014a --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src-attr-elem/style-src-elem-blocked-src-allowed.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + +<head> + <meta http-equiv="Content-Security-Policy" content="style-src-elem 'none'; + style-src 'unsafe-inline';"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + var t = async_test("Should fire a security policy violation event"); + window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'style-src-elem'); + assert_equals(e.blockedURI, 'inline'); + })); + </script> +</head> + +<body> + <style> + body {background: green;} + </style> + <script> + async_test(function(test) { + assert_equals(document.styleSheets.length, 0); + test.done(); + }, "The inline style should not be applied"); + </script> +</body> + +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/injected-inline-style-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/injected-inline-style-blocked.sub.html index d7e7de2..9786712 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/injected-inline-style-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/injected-inline-style-blocked.sub.html
@@ -7,7 +7,7 @@ <title>injected-inline-style-blocked</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=style-src","PASS"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=style-src-elem","PASS"]'></script> <script src="../support/alertAssert.sub.js?alerts=[]"></script> </head> @@ -17,14 +17,14 @@ log("violated-directive=" + e.violatedDirective); }); </script> - + <div id="test1"> PASS 1/2 </div> <div id="test2"> PASS 2/2 </div> - + <script src="support/inject-style.js"></script> <script> log(document.styleSheets.length == 0 ? "PASS" : "FAIL");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/inline-style-attribute-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/inline-style-attribute-blocked.sub.html index e2d84915..71e5a88b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/inline-style-attribute-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/inline-style-attribute-blocked.sub.html
@@ -7,7 +7,7 @@ <title>inline-style-attribute-blocked</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["violated-directive=style-src","PASS"]'></script> + <script src='../support/logTest.sub.js?logs=["violated-directive=style-src-attr","PASS"]'></script> <script src="../support/alertAssert.sub.js?alerts=[]"></script> <script> window.addEventListener('securitypolicyviolation', function(e) { @@ -16,7 +16,7 @@ </script> </head> <body style="background-color: blue;"> - + <script> log(document.body.style.length > 0 ? 'FAIL' : 'PASS');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-hash-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-hash-blocked.html index b5d94040..dec3b6e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-hash-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-hash-blocked.html
@@ -12,7 +12,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-imported-style-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-imported-style-blocked.html index a0088809..e5016c23 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-imported-style-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-imported-style-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); var l = document.createElement("link");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-blocked.html index 797cb13..fd27938f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-inline-style-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> </head>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-stylesheet-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-stylesheet-blocked.sub.html index a2c8e72..6191bb2d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-stylesheet-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-injected-stylesheet-blocked.sub.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html index 66b8f545..5072a2c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-attr", e.violatedDirective); })); onload = t.step_func_done(function(e) { var contentEl = document.getElementById("content");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-blocked.html index 7374e44..1baff387 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> <style>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked-error-event.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked-error-event.html index 53b1b01..83eaaba 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked-error-event.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked-error-event.html
@@ -9,7 +9,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> <style id="style1" nonce="not-nonceynonce"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked.html index f2cb2f2a..016b4eb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-inline-style-nonce-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> <style nonce="not-nonceynonce">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-none-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-none-blocked.html index 35696ad..2a80b827 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-none-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-none-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> <link href="/content-security-policy/style-src/resources/style-src.css" rel=stylesheet type=text/css>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html index 8095da5..a076eaf 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html
@@ -10,7 +10,7 @@ var t_spv = async_test("Should fire a securitypolicyviolation event"); document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals("style-src", e.violatedDirective); + assert_equals("style-src-elem", e.violatedDirective); })); </script> <link nonce="not-nonceynonce" href="/content-security-policy/style-src/resources/style-src.css?pipe=sub" rel=stylesheet type=text/css>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylehash-basic-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylehash-basic-blocked.sub.html index d9f0fbf6..6bfd501 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylehash-basic-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylehash-basic-blocked.sub.html
@@ -12,9 +12,9 @@ window.addEventListener('securitypolicyviolation', function(e) { alert_assert("violated-directive=" + e.violatedDirective); }); - - var t_alert = async_test('Expecting alerts: ["PASS: The \'p\' element\'s text is green, which means the style was correctly applied.", "violated-directive=style-src"]'); - var expected_alerts = ["PASS: The 'p' element's text is green, which means the style was correctly applied.", "violated-directive=style-src"]; + + var t_alert = async_test('Expecting alerts: ["PASS: The \'p\' element\'s text is green, which means the style was correctly applied.", "violated-directive=style-src-elem"]'); + var expected_alerts = ["PASS: The 'p' element's text is green, which means the style was correctly applied.", "violated-directive=style-src-elem"]; function alert_assert(msg) { t_alert.step(function() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-allowed.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-allowed.sub.html index c5ffdba6..e190b84e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-allowed.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-allowed.sub.html
@@ -12,11 +12,11 @@ <script> var t_spv = async_test("Should fire securitypolicyviolation"); window.addEventListener('securitypolicyviolation', t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "style-src"); + assert_equals(e.violatedDirective, "style-src-elem"); })); - + </script> - + <style nonce="noncynonce"> #test1 { color: green;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-blocked.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-blocked.sub.html index 609e45a..4b2381f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-blocked.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/style-src/stylenonce-blocked.sub.html
@@ -13,8 +13,8 @@ <script> var t_spv = async_test("Should fire securitypolicyviolation"); window.addEventListener('securitypolicyviolation', t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "style-src"); - })); + assert_equals(e.violatedDirective, "style-src-elem"); + })); </script> <style nonce="noncynonce"> #test {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/svg/svg-inline.sub.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/svg/svg-inline.sub.html index 3377f5dc..16d03407 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/svg/svg-inline.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/svg/svg-inline.sub.html
@@ -8,10 +8,10 @@ <script> var t_spv = async_test("Should fire violation event"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { - assert_equals(e.violatedDirective, "script-src"); - })); + assert_equals(e.violatedDirective, "script-src-elem"); + })); </script> - + </head> <body> @@ -20,7 +20,7 @@ not redirect to a different resource.</p> <div id="log"></div> <?xml version="1.0" standalone="no"?> - + <svg width="6cm" height="5cm" viewBox="0 0 600 500" xmlns="http://www.w3.org/2000/svg" version="1.1">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href.html index f53a2e92..991200a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href.html
@@ -18,7 +18,7 @@ var t1 = async_test("Test that the javascript: src is not allowed to run"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href_blank.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href_blank.html index 6b9f60c..66ec9e1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href_blank.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-href_blank.html
@@ -18,7 +18,7 @@ var t1 = async_test("Test that the javascript: src is not allowed to run"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_open.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_open.html index 3667f80..12c9b09 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_open.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_missing_unsafe_hashes-window_open.html
@@ -19,7 +19,7 @@ window.onmessage = t1.unreached_func("Should have not received any message"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href.html index adae81b..944b727 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href.html
@@ -18,7 +18,7 @@ var t1 = async_test("Test that the javascript: src is not allowed to run"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href_blank.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href_blank.html index 470283e..84491f83 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href_blank.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-href_blank.html
@@ -18,7 +18,7 @@ var t1 = async_test("Test that the javascript: src is not allowed to run"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_open.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_open.html index 8314e6a..c653d4f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_open.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/javascript_src_denied_wrong_hash-window_open.html
@@ -19,7 +19,7 @@ window.onmessage = t1.unreached_func("Should have not received any message"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-elem'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_missing_unsafe_hashes.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_missing_unsafe_hashes.html index 0323dda5..7ba9d30 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_missing_unsafe_hashes.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_missing_unsafe_hashes.html
@@ -6,16 +6,16 @@ <title>Event handlers should not be allowed if a matching hash is present without 'unsafe-hashes'</title> <script src='/resources/testharness.js' nonce='abc'></script> <script src='/resources/testharnessreport.js' nonce='abc'></script> - + </head> <body> <div id='log'></div> <script nonce='abc'> var t1 = async_test("Test that the inline event handler is not allowed to run"); - + window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-attr'); assert_equals(e.blockedURI, 'inline'); })); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_wrong_hash.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_wrong_hash.html index b9b1357..2de6a48 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_wrong_hash.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/script_event_handlers_denied_wrong_hash.html
@@ -12,9 +12,9 @@ <div id='log'></div> <script nonce='abc'> var t1 = async_test("Test that the inline event handler is not allowed to run"); - + window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'script-src'); + assert_equals(e.violatedDirective, 'script-src-attr'); assert_equals(e.blockedURI, 'inline'); })); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html index 66be2c3..e8070ac 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html
@@ -16,9 +16,9 @@ <div id='log'></div> <script> var t1 = async_test("Test that the inline style attribute is blocked"); - + window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'style-src'); + assert_equals(e.violatedDirective, 'style-src-attr'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html index 32ca66a8..be276372 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html
@@ -18,7 +18,7 @@ var t1 = async_test("Test that the inline style attribute is blocked"); window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) { - assert_equals(e.violatedDirective, 'style-src'); + assert_equals(e.violatedDirective, 'style-src-attr'); assert_equals(e.blockedURI, 'inline'); }));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookies/prefix/document-cookie.non-secure.html b/third_party/WebKit/LayoutTests/external/wpt/cookies/prefix/document-cookie.non-secure.html index 1b5edf7..dbf9220 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookies/prefix/document-cookie.non-secure.html +++ b/third_party/WebKit/LayoutTests/external/wpt/cookies/prefix/document-cookie.non-secure.html
@@ -6,7 +6,8 @@ function create_test(prefix, params, shouldExistInDOM, shouldExistViaHTTP, title) { promise_test(t => { var name = prefix + "prefixtestcookie"; - erase_cookie_from_js(name); + erase_cookie_from_js(name, params); + t.add_cleanup(() => erase_cookie_from_js(name, params)); var value = "" + Math.random(); document.cookie = name + "=" + value + ";" + params;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js b/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js index 49cf0b1f..d00a11f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js +++ b/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js
@@ -72,7 +72,8 @@ function set_prefixed_cookie_via_dom_test(options) { promise_test(t => { var name = options.prefix + "prefixtestcookie"; - erase_cookie_from_js(name); + erase_cookie_from_js(name, options.paras); + t.add_cleanup(() => erase_cookie_from_js(name, options.params)); var value = "" + Math.random(); document.cookie = name + "=" + value + ";" + options.params; @@ -97,7 +98,7 @@ var name = options.prefix + "prefixtestcookie"; if (!options.origin) { options.origin = self.origin; - erase_cookie_from_js(name); + erase_cookie_from_js(name, options.params); return postDelete; } else { return credFetch(options.origin + "/cookies/resources/drop.py?name=" + name) @@ -184,9 +185,8 @@ // // erase cookie value and set for expiration -function erase_cookie_from_js(name) { - let secure = self.location.protocol == "https:" ? "Secure" : ""; - document.cookie = `${name}=0; path=/; expires=${new Date(0).toUTCString()}; ${secure}`; +function erase_cookie_from_js(name, params) { + document.cookie = `${name}=0; expires=${new Date(0).toUTCString()}; ${params};`; var re = new RegExp("(?:^|; )" + name); assert_equals(re.test(document.cookie), false, "Sanity check: " + name + " has been deleted."); }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cors/simple-requests.htm b/third_party/WebKit/LayoutTests/external/wpt/cors/simple-requests.htm index 77ed8ee..be4b534 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/cors/simple-requests.htm +++ b/third_party/WebKit/LayoutTests/external/wpt/cors/simple-requests.htm
@@ -83,9 +83,9 @@ + uuid_token, true) client.setRequestHeader('Accept', 'jewelry') - client.setRequestHeader('accept-language', 'nn_NO,nn,en') + client.setRequestHeader('accept-language', 'nn-NO,nn,en') client.setRequestHeader('content-type', 'text/plain; parameter=extra') - client.setRequestHeader('content-Language', 'nn_NO') + client.setRequestHeader('content-Language', 'nn-NO') client.onload = simple_async.step_func(function() { assert_equals(client.getResponseHeader('content-type'), "text/plain", 'content-type response header')
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/float-percentage-resolution-quirks-mode.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/float-percentage-resolution-quirks-mode.html new file mode 100644 index 0000000..a3794579 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/float-percentage-resolution-quirks-mode.html
@@ -0,0 +1,10 @@ +<title>In quirks mode a float should resolve its percentage height against its first ancestor with a defined height.</title> +<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#Computing_widths_and_margins"> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<p style="margin-top: 1em;">Test passes if there is a filled green square.</p> +<div style="width:100px; height:100px; background:red;"> + <div> + <div></div> + <div style="float:left; width:100%; height:100%; background:green;"></div> + </div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-invalid.html index 68b18dc..30757f3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-attachment supports only the grammar '<attachment>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-valid.html index 600f310..14d72c60 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-attachment-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-attachment supports the full grammar '<attachment>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-invalid.html index c2492a2a..96831e06 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-clip supports only the grammar '<box>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-valid.html index 5350a17..e262a78 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-clip-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-clip supports the full grammar '<box>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-invalid.html index d7c688d..b9487540 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-color supports only the grammar '<color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-valid.html index d7e864c29..3859b93 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-color-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-color supports the full grammar '<color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-invalid.html index 43d7f67..eaba64a7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-image supports only the grammar '<bg-image>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-valid.html index ffbf33b6..51c67b9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-image-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-image supports the full grammar '<bg-image>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-invalid.html index c3deef9..4ea58da8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background supports only the grammar '<bg-layer># , <final-bg-layer>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-invalid.html index 9eead06..5da00da 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-origin supports only the grammar '<box>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-valid.html index 1c19b96..7e3b0ff 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-origin-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-origin supports the full grammar '<box>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-invalid.html index 583606e..bb974af 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-position supports only the grammar '<bg-position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-valid.html index dbb97406..1c05517 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-position-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-position supports the full grammar '<bg-position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-invalid.html index 3ae0166..abb1533 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-repeat supports only the grammar '<repeat-style>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-valid.html index b69eb5f..2f72e03 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-repeat-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-repeat supports the full grammar '<repeat-style>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-invalid.html index cfb9a1c07..01a0322 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-size supports only the grammar '<bg-size>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-valid.html index 22442117..c169232 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-size-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background-size supports the full grammar '<bg-size>#'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-valid.html index 96529e56..41a3345 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/background-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="background supports the full grammar '<bg-layer># , <final-bg-layer>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-invalid.html index 3916c4f..6e4d28e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-color supports only the grammar '<color>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-valid.html index 63532a9..a4cd7748 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-color-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-color supports the full grammar '<color>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-invalid.html index 08c61df..273fc0a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image supports only the grammar ' <‘border-image-source’> || <‘border-image-slice’> [ / <‘border-image-width’> | / <‘border-image-width’>? / <‘border-image-outset’> ]? || <‘border-image-repeat’>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-invalid.html index 4faaa3c..4102f60 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-outset supports only the grammar '[ <length> | <number> ]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-valid.html index 781a6e0..ee85af8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-outset-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-outset supports the full grammar '[ <length> | <number> ]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-invalid.html index 962ab22..de0998d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-repeat supports only the grammar '[ stretch | repeat | round | space ]{1,2}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-valid.html index 381b059..f90ef7119 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-repeat-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-repeat supports the full grammar '[ stretch | repeat | round | space ]{1,2}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-invalid.html index 4ccf441f..c62a43d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-slice supports only the grammar '[<number> | <percentage>]{1,4} && fill?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-valid.html index 2973194..671120b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-slice-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-slice supports the full grammar '[<number> | <percentage>]{1,4} && fill?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-invalid.html index 28edd785..8b1240a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-source supports only the grammar 'none | <image>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-valid.html index c080d39..7fbbbd9e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-source-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-source supports the full grammar 'none | <image>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-valid.html index 8bf9cd5..67d22c1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image supports the full grammar ' <‘border-image-source’> || <‘border-image-slice’> [ / <‘border-image-width’> | / <‘border-image-width’>? / <‘border-image-outset’> ]? || <‘border-image-repeat’>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-invalid.html index 4459723..b3e9359 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-width supports only the grammar '[ <length-percentage> | <number> | auto ]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-valid.html index e1316c3..ce8b9a94 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-image-width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-image-width supports the full grammar '[ <length-percentage> | <number> | auto ]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-invalid.html index a3d28dfb..71404f2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-width supports only the grammar '<line-width> || <line-style> || <color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-invalid.html index 9d767a96..4e004af8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-radius supports only the grammar '<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-valid.html index 40a9d9e8..317803bf 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-radius-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-radius supports the full grammar '<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-invalid.html index 42bd61ad..27fa451 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-style supports only the grammar '<line-style>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-valid.html index 10fa39b..0b5921802 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-style-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-style supports the full grammar '<line-style>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-valid.html index 5ca8bbdc..37b876ce 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-width supports the full grammar '<line-width> || <line-style> || <color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-invalid.html index 2edd05e..ec7eb72 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-width supports only the grammar '<line-width>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-valid.html index 5a9b174..552416d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/border-width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="border-width supports the full grammar '<line-width>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-invalid.html index a38ae2fc..44f074d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-invalid.html
@@ -10,7 +10,7 @@ <meta name="assert" content="Lengths must stay adjacent." /> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-valid.html index be72b78..a3b172e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/box-shadow-valid.html
@@ -10,7 +10,7 @@ <meta name="assert" content="Box shadow color, inset, and length parameters can be mixed in any order." /> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-backgrounds/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-invalid.html index 63670433..38d1821 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clear supports only the grammar 'none | left | right | both'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-valid.html index a849f6c0..b27350e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/clear-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clear supports the full grammar 'none | left | right | both'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-invalid.html index 8c3d28f..c11f4e2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="float supports only the grammar 'left | right | top | bottom | start | end | none | <page-floats>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-valid.html index 9ff6ef4..a8fc605 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/float-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="float supports the full grammar 'left | right | top | bottom | start | end | none | <page-floats>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-invalid.html index f15bd27..dcd4d1af 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="height supports only the grammar '[<length> | <percentage>] | available | min-content | max-content | fit-content | complex | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-valid.html index a89ec6b..7cc09a5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/height-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="height supports the full grammar '[<length> | <percentage>] | available | min-content | max-content | fit-content | complex | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-invalid.html index 917fc927..7700917 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="margin supports only the grammar '[ <length> | <percentage> | auto]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-valid.html index 1715a9c..154aa2d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/margin-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="margin supports the full grammar '[ <length> | <percentage> | auto]{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-invalid.html index 61c85d12..aeb6e64 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="max-height supports only the grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-valid.html index ca58cec..04880c4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-height-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="max-height supports the full grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-invalid.html index 57bcbbf1..03db7e2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="max-width supports only the grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-valid.html index e098b80..1e08a82 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/max-width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="max-width supports the full grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-invalid.html index 26a1e10..edc480e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="min-height supports only the grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-valid.html index 576a5c0..0154c02 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-height-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="min-height supports the full grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-invalid.html index d71777fe..e89826f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="min-width supports only the grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-valid.html index 406452dd..f745b66b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/min-width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="min-width supports the full grammar '[ [<length> | <percentage>] && [border-box | content-box]? ] | available | min-content | max-content | fit-content'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-invalid.html index bf3ee3d..4747764f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="overflow supports only the grammar '[ visible | hidden | scroll | auto | no-display | no-content ]{1,2}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-valid.html index 6bef5858..1bfeec2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/overflow-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="overflow supports the full grammar '[ visible | hidden | scroll | auto | no-display | no-content ]{1,2}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-invalid.html index 7e172ef..e995ac61 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="padding supports only the grammar '<length>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-valid.html index e5a932e..ba3c3a7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/padding-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="padding supports the full grammar '<length>{1,4}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-invalid.html index 892ca548..73e611b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="visibility supports only the grammar 'visible | hidden | collapse'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-valid.html index 2c1143d..2ab2f49 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/visibility-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="visibility supports the full grammar 'visible | hidden | collapse'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-invalid.html index bcbb3d663..5a0145fe 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="width supports only the grammar '[<length> | <percentage>] | available | min-content | max-content | fit-content | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-valid.html index 653b11e9..93059bd2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="width supports the full grammar '[<length> | <percentage>] | available | min-content | max-content | fit-content | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-invalid.html index 8b7c044a..4a1d045 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="all supports only the grammar 'initial | inherit | unset'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-valid.html index 668a6c2..3a9e592 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/all-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="all supports the full grammar 'initial | inherit | unset'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-cascade/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-invalid.html index fe44aad6..676ffb3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="color supports only the grammar '<color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-valid.html index fb24018..70e2450c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/color-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="color supports the full grammar '<color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-invalid.html index d9b9cc8..1bcf4c5b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="opacity supports only the grammar '<alphavalue>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-valid.html index 8ae302e..f9bb9b6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/opacity-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="opacity supports the full grammar '<alphavalue>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-color/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-size-scrollbars-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-size-scrollbars-001.html new file mode 100644 index 0000000..304e81e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-size-scrollbars-001.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Size containment scrollbars</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> +<link rel="match" href="reference/contain-size-scrollbars-001-ref.html"> +<meta name=assert content="This test checks that the size of an element with 'contain: size' includes the scrollbars too."> +<style> +div { + contain: size; + display: inline-block; + border: solid thick; + overflow: scroll; +} +</style> +<p>This test passes if it has the same output as the reference.</p> +<div></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-size-scrollbars-001-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-size-scrollbars-001-ref.html new file mode 100644 index 0000000..402ff6c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-size-scrollbars-001-ref.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +div { + display: inline-block; + border: solid thick; + overflow: scroll; +} +</style> +<p>This test passes if it has the same output as the reference.</p> +<div></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-invalid.html new file mode 100644 index 0000000..70516ad4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-invalid.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Display: parsing display with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#display-prop"> +<link rel="help" href="https://drafts.csswg.org/css-display/#the-display-properties"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-containers"> +<meta name="assert" content="display supports only the spec grammar."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("display", "grid inline-grid"); +test_invalid_value("display", "none grid"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-valid.html new file mode 100644 index 0000000..efa4835 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/parsing/display-valid.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Display: parsing display with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#display-prop"> +<link rel="help" href="https://drafts.csswg.org/css-display/#the-display-properties"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-containers"> +<meta name="assert" content="display supports the full spec grammar."> +<meta name="assert" content="display supports the new values 'grid | inline-grid'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// https://drafts.csswg.org/css-grid-1/#grid-containers +test_valid_value("display", "grid"); +test_valid_value("display", "inline-grid"); + +// https://drafts.csswg.org/css2/visuren.html#display-prop +test_valid_value("display", "inline"); +test_valid_value("display", "block"); +test_valid_value("display", "list-item"); +test_valid_value("display", "inline-block"); +test_valid_value("display", "table"); +test_valid_value("display", "inline-table"); +test_valid_value("display", "table-row-group"); +test_valid_value("display", "table-header-group"); +test_valid_value("display", "table-footer-group"); +test_valid_value("display", "table-row"); +test_valid_value("display", "table-column-group"); +test_valid_value("display", "table-column"); +test_valid_value("display", "table-cell"); +test_valid_value("display", "table-caption"); +test_valid_value("display", "none"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-invalid.html new file mode 100644 index 0000000..b9893227 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-invalid.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-area with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-area"> +<meta name="assert" content="grid-area supports only the grammar '<grid-line> [ / <grid-line> ]{0,3}'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("grid-area", "'string'"); +test_invalid_value("grid-row", "1.0"); +test_invalid_value("grid-column", "1 2"); +test_invalid_value("grid-row-start", "+-3"); +test_invalid_value("grid-column-start", "0"); +test_invalid_value("grid-row-end", "span"); +test_invalid_value("grid-column-end", "sPaN"); +test_invalid_value("grid-column-end", '"1st"'); +test_invalid_value("grid-column-end", "1st"); + +test_invalid_value("grid-area", "auto / initial"); +test_invalid_value("grid-row", "auto / inherit"); +test_invalid_value("grid-column", "auto / unset"); + +test_invalid_value("grid-area", "auto / auto / auto / auto / auto"); +test_invalid_value("grid-row", "1 / 2 / 3") +test_invalid_value("grid-column", "a / b / c"); +test_invalid_value("grid-row-end", "span 1 / span 2"); +test_invalid_value("grid-area", "auto 2 auto 4"); +test_invalid_value("grid-row", "33 -A0 auto"); +test_invalid_value("grid-row", "auto i 2 j span 3 k"); + + +// https://github.com/w3c/csswg-drafts/issues/2856 +test_invalid_value("grid-row-end", "1 auto"); +test_invalid_value("grid-row-end", "span 1 auto"); +test_invalid_value("grid-row-end", "span auto 1"); +test_invalid_value("grid-row-end", "1 auto span"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-valid.html new file mode 100644 index 0000000..8e7d0d43 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-area-valid.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-area with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-area"> +<meta name="assert" content="grid-area supports the full grammar '<grid-line> [ / <grid-line> ]{0,3}'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// auto +test_valid_value("grid-area", "auto", "auto / auto / auto / auto"); +test_valid_value("grid-area", "AuTo", "auto / auto / auto / auto"); +test_valid_value("grid-row", "auto", "auto / auto"); +test_valid_value("grid-column-end", "AuTo", "auto"); + +// <custom-ident> +test_valid_value("grid-area", "--a", "--a / --a / --a / --a"); +test_valid_value("grid-row", "-zπ", "-zπ / -zπ"); +test_valid_value("grid-row-start", "AZ"); +test_valid_value("grid-column-start", "-_π"); +test_valid_value("grid-row-end", "_9"); + + +// <integer> && <custom-ident>? +test_valid_value("grid-area", "1", "1 / auto / auto / auto"); +test_valid_value("grid-area", "+90 -a-", "90 -a- / auto / auto / auto"); +test_valid_value("grid-row", "az 2", "2 az / auto"); +test_valid_value("grid-column", "9", "9 / auto"); +test_valid_value("grid-column", "-19 zA", "-19 zA / auto"); +test_valid_value("grid-column", "-A0 33", "33 -A0 / auto"); +test_valid_value("grid-row-start", "-19"); +test_valid_value("grid-row-start", "9 -Z_"); +test_valid_value("grid-column-start", "+90", "90"); +test_valid_value("grid-column-start", "Z -44", "-44 Z"); +test_valid_value("grid-row-end", "1 -πA"); +test_valid_value("grid-column-end", "π_ +5", "5 π_"); + +// span && [ <integer> || <custom-ident> ] +test_valid_value("grid-area", "span 2 i", "span 2 i / auto / auto / auto"); +test_valid_value("grid-area", "i 2 SpAn", "span 2 i / auto / auto / auto"); +test_valid_value("grid-row", "span 2", "span 2 / auto"); +test_valid_value("grid-column", "i SpAn", "span i / auto"); +test_valid_value("grid-row-start", "span i", "span i"); +test_valid_value("grid-column-start", "SpAn i 2", "span 2 i"); +test_valid_value("grid-row-end", "2 i span", "span 2 i"); +test_valid_value("grid-column-end", "2 SpAn", "span 2"); + +// <grid-line> [ / <grid-line> ]{0,3} +test_valid_value("grid-area", "auto / i", "auto / i / auto / i"); +test_valid_value("grid-area", "auto / i / 2 j", "auto / i / 2 j / i"); +test_valid_value("grid-area", "auto / i / 2 j / span 3 k"); +test_valid_value("grid-row", "auto / i"); +test_valid_value("grid-column", "2 j / span 3 k"); + + +// https://github.com/w3c/csswg-drafts/issues/2858 +// '\\31 st' in Blink, Firefox, '1st' in Edge, '"1st"' in Safari. +test_valid_value("grid-column-end", "\\31st", ["\\31 st", "1st", '"1st"']); +test_valid_value("grid-column-end", "\\31 st", ["\\31 st", "1st", '"1st"']); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-invalid.html new file mode 100644 index 0000000..e7a965f3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-invalid.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-columns with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-columns"> +<meta name="assert" content="grid-auto-columns supports only the grammar '<track-size>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// <track-breadth> +test_invalid_value("grid-auto-columns", "none"); +test_invalid_value("grid-auto-columns", "-1px"); +test_invalid_value("grid-auto-columns", "-4%"); + +// minmax( <inflexible-breadth> , <track-breadth> ) +test_invalid_value("grid-auto-columns", "minmax(1px)"); +test_invalid_value("grid-auto-columns", "minmax(1px, 2px, 3px)"); +test_invalid_value("grid-auto-columns", "minmax(5fr, 1px)"); +test_invalid_value("grid-auto-columns", "minmax(6px, -7%)"); +test_invalid_value("grid-auto-columns", "minmax(8px, -9fr)"); + +// fit-content( <length-percentage> ) +test_invalid_value("grid-auto-columns", "fit-content(-1px)"); +test_invalid_value("grid-auto-columns", "fit-content(1px, 2px)"); +test_invalid_value("grid-auto-columns", "fit-content(1px auto)"); + +// <track-size>+ +test_invalid_value("grid-auto-columns", "2em / 3em"); +test_invalid_value("grid-auto-columns", "auto, 10%"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-valid.html new file mode 100644 index 0000000..ba1f5f60 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-columns-valid.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-columns with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-columns"> +<meta name="assert" content="grid-auto-columns supports the full grammar '<track-size>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// <track-breadth> +// <track-breadth> = <length-percentage> | <flex> | min-content | max-content | auto +test_valid_value("grid-auto-columns", "1px"); +test_valid_value("grid-auto-columns", "2em"); +test_valid_value("grid-auto-columns", "calc(2em + 3ex)"); +test_valid_value("grid-auto-columns", "4%"); +test_valid_value("grid-auto-columns", "5fr"); +test_valid_value("grid-auto-columns", "min-content"); +test_valid_value("grid-auto-columns", "max-content"); +test_valid_value("grid-auto-columns", "auto"); + +// minmax( <inflexible-breadth> , <track-breadth> ) +// <inflexible-breadth> = <length-percentage> | min-content | max-content | auto +test_valid_value("grid-auto-columns", "minmax(1px, 5fr)"); +test_valid_value("grid-auto-columns", "minmax(2em, min-content)"); +test_valid_value("grid-auto-columns", "minmax(calc(2em + 3ex), max-content)"); +test_valid_value("grid-auto-columns", "minmax(4%, auto)"); +test_valid_value("grid-auto-columns", "minmax(5vmin, 1px)"); +test_valid_value("grid-auto-columns", "minmax(min-content, 2em)"); +test_valid_value("grid-auto-columns", "minmax(max-content, calc(2em + 3ex))"); +test_valid_value("grid-auto-columns", "minmax(auto, 4%)"); + +// fit-content( <length-percentage> ) +test_valid_value("grid-auto-columns", "fit-content(1px)"); +test_valid_value("grid-auto-columns", "fit-content(2em)"); +test_valid_value("grid-auto-columns", "fit-content(calc(2em + 3ex))"); +test_valid_value("grid-auto-columns", "fit-content(4%)"); + +test_valid_value("grid-auto-columns", "0px"); +test_valid_value("grid-auto-columns", "0%"); +test_valid_value("grid-auto-columns", "0fr"); +test_valid_value("grid-auto-columns", "minmax(auto, 0%)"); +test_valid_value("grid-auto-columns", "fit-content(0px)"); + +// <track-size>+ +test_valid_value("grid-auto-columns", "1px 2px 3px 0px"); +test_valid_value("grid-auto-columns", "fit-content(1px) minmax(2px, 3px) 4px"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-invalid.html new file mode 100644 index 0000000..a261e8e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-invalid.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-flow with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-flow"> +<meta name="assert" content="grid-auto-flow supports only the grammar '[ row | column ] || dense'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("grid-auto-flow", "auto"); +test_invalid_value("grid-auto-flow", "row dense column"); +test_invalid_value("grid-auto-flow", "dense row dense"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-valid.html new file mode 100644 index 0000000..4270a3d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-flow-valid.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-flow with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-flow"> +<meta name="assert" content="grid-auto-flow supports the full grammar '[ row | column ] || dense'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("grid-auto-flow", "row"); +test_valid_value("grid-auto-flow", "column"); +test_valid_value("grid-auto-flow", "row dense"); +test_valid_value("grid-auto-flow", "dense column", "column dense"); + +// Blink/WebKit "dense", Edge/Firefox "row dense" +test_valid_value("grid-auto-flow", "dense", ["dense", "row dense"]); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-invalid.html new file mode 100644 index 0000000..7fceaa0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-invalid.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-rows with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-rows"> +<meta name="assert" content="grid-auto-rows supports only the grammar '<track-size>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// <track-breadth> +test_invalid_value("grid-auto-rows", "none"); +test_invalid_value("grid-auto-rows", "-1px"); +test_invalid_value("grid-auto-rows", "-4%"); + +// minmax( <inflexible-breadth> , <track-breadth> ) +test_invalid_value("grid-auto-rows", "minmax(1px)"); +test_invalid_value("grid-auto-rows", "minmax(1px, 2px, 3px)"); +test_invalid_value("grid-auto-rows", "minmax(5fr, 1px)"); +test_invalid_value("grid-auto-rows", "minmax(6px, -7%)"); + +// fit-content( <length-percentage> ) +test_invalid_value("grid-auto-rows", "fit-content(-1px)"); +test_invalid_value("grid-auto-rows", "fit-content(1px, 2px)"); +test_invalid_value("grid-auto-rows", "fit-content(1px auto)"); + +// <track-size>+ +test_invalid_value("grid-auto-rows", "2em / 3em"); +test_invalid_value("grid-auto-rows", "auto, 10%"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-valid.html new file mode 100644 index 0000000..cf63e2b7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-auto-rows-valid.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-auto-rows with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-rows"> +<meta name="assert" content="grid-auto-rows supports the full grammar '<track-size>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// <track-breadth> +// <track-breadth> = <length-percentage> | <flex> | min-content | max-content | auto +test_valid_value("grid-auto-rows", "1px"); +test_valid_value("grid-auto-rows", "2em"); +test_valid_value("grid-auto-rows", "calc(2em + 3ex)"); +test_valid_value("grid-auto-rows", "4%"); +test_valid_value("grid-auto-rows", "5fr"); +test_valid_value("grid-auto-rows", "min-content"); +test_valid_value("grid-auto-rows", "max-content"); +test_valid_value("grid-auto-rows", "auto"); + +// minmax( <inflexible-breadth> , <track-breadth> ) +// <inflexible-breadth> = <length-percentage> | min-content | max-content | auto +test_valid_value("grid-auto-rows", "minmax(1px, 5fr)"); +test_valid_value("grid-auto-rows", "minmax(2em, min-content)"); +test_valid_value("grid-auto-rows", "minmax(calc(2em + 3ex), max-content)"); +test_valid_value("grid-auto-rows", "minmax(4%, auto)"); +test_valid_value("grid-auto-rows", "minmax(5vmin, 1px)"); +test_valid_value("grid-auto-rows", "minmax(min-content, 2em)"); +test_valid_value("grid-auto-rows", "minmax(max-content, calc(2em + 3ex))"); +test_valid_value("grid-auto-rows", "minmax(auto, 4%)"); + +// fit-content( <length-percentage> ) +test_valid_value("grid-auto-rows", "fit-content(1px)"); +test_valid_value("grid-auto-rows", "fit-content(2em)"); +test_valid_value("grid-auto-rows", "fit-content(calc(2em + 3ex))"); +test_valid_value("grid-auto-rows", "fit-content(4%)"); + +test_valid_value("grid-auto-rows", "0px"); +test_valid_value("grid-auto-rows", "0%"); +test_valid_value("grid-auto-rows", "0fr"); +test_valid_value("grid-auto-rows", "minmax(auto, 0%)"); +test_valid_value("grid-auto-rows", "fit-content(0px)"); + +// <track-size>+ +test_valid_value("grid-auto-rows", "1px 2px 3px 0px"); +test_valid_value("grid-auto-rows", "fit-content(1px) minmax(2px, 3px) 4px"); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-invalid.html new file mode 100644 index 0000000..5bc70c56 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-invalid.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-template-areas with invalid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-template-areas"> +<meta name="assert" content="grid-template-areas supports only the grammar 'none | <string>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("grid-template-areas", "auto"); +test_invalid_value("grid-template-areas", 'none "first"'); +test_invalid_value("grid-template-areas", '"first" none'); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-valid.html new file mode 100644 index 0000000..8d8f682 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/parsing/grid-template-areas-valid.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: parsing grid-template-areas with valid values</title> +<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-template-areas"> +<meta name="assert" content="grid-template-areas supports the full grammar 'none | <string>+'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("grid-template-areas", "none"); +test_valid_value("grid-template-areas", '"first"'); +test_valid_value("grid-template-areas", '"first second"'); +test_valid_value("grid-template-areas", '"1st 2nd 3rd"'); +test_valid_value("grid-template-areas", '"first second" "third fourth"'); +test_valid_value("grid-template-areas", '"first second" "third ." "1st 2nd" "3rd 4th"'); + +// Firefox preserves specific whitespace and full stop sequences. +// Other browsers consolidate to ' ' and '.' +test_valid_value("grid-template-areas", '" a \t b "', '"a b"'); // Fails in Firefox +test_valid_value("grid-template-areas", '"c\td"', ['"c d"', '"c\\9 d"']); +test_valid_value("grid-template-areas", '"first ..."', ['"first ."', '"first ..."']); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-invalid.html index 626b9f1..63ac09f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="gradient positions support only the '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-valid.html index 382fc61..9857496f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/gradient-position-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="gradient positions support the full '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-invalid.html index f2a53fe5..72e32eb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-orientation supports only the grammar 'from-image | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-valid.html index ea2ec1e..e40517b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-orientation-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-orientation supports the full grammar 'from-image | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-invalid.html index 9c54c5d7..febb055 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-rendering supports only the grammar 'auto | smooth | high-quality | crisp-edges | pixelated'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-valid.html index b3b73ed..bf06b6f79 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-rendering-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-rendering supports the full grammar 'auto | smooth | high-quality | crisp-edges | pixelated'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-invalid.html index e45ed73..bc92a7b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-resolution supports only the grammar '[ from-image || <resolution> ] && snap?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-valid.html index 7345227..e04d1120 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/image-resolution-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="image-resolution supports the full grammar '[ from-image || <resolution> ] && snap?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-invalid.html index 574573c8..f76460f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="object-fit supports only the grammar 'fill | none | [contain | cover] || scale-down'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-valid.html index 8b531ab..3b5ac61 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-fit-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="object-fit supports the full grammar 'fill | none | [contain | cover] || scale-down'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-invalid.html index 346b79a..63e47cf 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="object-position supports only the '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-valid.html index b7be35c..b9dab78b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/object-position-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="object-position supports the full '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-images/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-001.html new file mode 100644 index 0000000..ebdfc22 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-001.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Masking: Test clip-path property and path function with nonzero fill</title> + <link rel="help" href="https://drafts.csswg.org/css-shapes-2/#funcdef-path"> + <link rel="match" href="reference/clip-path-path-001-ref.html"> + <meta name="assert" content="The clip-path property takes the basic shape + 'path()' for clipping. Test nonzero path function. On pass you should + see a green square."> +</head> +<style> + #rect { + width: 100px; + height: 100px; + background-color: green; + clip-path: path(nonzero, 'M10,10h80v80h-80zM25,25h50v50h-50z'); + } +</style> +<body> + <p>The test passes if there are a green filled rect.</p> + <div id="rect"></div> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-002.html new file mode 100644 index 0000000..e304992 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/clip-path-path-002.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Masking: Test clip-path property and path function with evenodd fill</title> + <link rel="help" href="https://drafts.csswg.org/css-shapes-2/#funcdef-path"> + <link rel="match" href="reference/clip-path-path-002-ref.html"> + <meta name="assert" content="The clip-path property takes the basic shape + 'path()' for clipping. Test evenodd path function. On pass you should + see a hollow green square."> +</head> +<style> + #rect { + width: 100px; + height: 100px; + background-color: green; + clip-path: path(evenodd, 'M10,10h80v80h-80zM25,25h50v50h-50z'); + } +</style> +<body> + <p>The test passes if there are a green hollow rect.</p> + <div id="rect"></div> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-001-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-001-ref.html new file mode 100644 index 0000000..afc1d18f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-001-ref.html
@@ -0,0 +1,29 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<!DOCTYPE html> +<html> +<head> + <title>CSS Masking: Reference for clip-path's path function with nonzero</title> + <style type="text/css"> + #rect { + width: 100px; + height: 100px; + background-color: green; + clip-path: url("#clip"); + } + </style> +</head> +<body> + <p>The test passes if there are a green filled rect.</p> + <div id="rect"></div> + <svg height="0" width="0"> + <defs> + <clipPath id="clip"> + <path clip-rule="nonzero" d="M10,10h80v80h-80zM25,25h50v50h-50z"/> + </clipPath> + </defs> + </svg> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-002-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-002-ref.html new file mode 100644 index 0000000..d9ea5183 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/clip-path/reference/clip-path-path-002-ref.html
@@ -0,0 +1,29 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<!DOCTYPE html> +<html> +<head> + <title>CSS Masking: Reference for clip-path's path function with evenodd</title> + <style type="text/css"> + #rect { + width: 100px; + height: 100px; + background-color: green; + clip-path: url("#clip"); + } + </style> +</head> +<body> + <p>The test passes if there are a green hollow rect.</p> + <div id="rect"></div> + <svg height="0" width="0"> + <defs> + <clipPath id="clip"> + <path clip-rule="evenodd" d="M10,10h80v80h-80zM25,25h50v50h-50z"/> + </clipPath> + </defs> + </svg> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image-hash.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image-hash.html new file mode 100644 index 0000000..b1efc908 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image-hash.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>CSS Test: mask-image: url(image.svg#hash)</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#mask-layer-image"> +<link rel="match" href="reference/mask-image-ref.html"> +<meta name="assert" content="mask-image can use an SVG file as an image with element reference"> +<style> +#back { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 60px solid green; + background: red; +} +#front { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 40px solid red; + background: green; + mask-image: url(support/image-with-ref.svg#ref); +} +</style> +<p>The test passes if there is a green square and no red below.</p> +<div id="back"></div><div id="front"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image.html new file mode 100644 index 0000000..40a1ff9b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-image.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>CSS Test: mask-image: url(image.svg)</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#mask-layer-image"> +<link rel="match" href="reference/mask-image-ref.html"> +<meta name="assert" content="mask-image can use an SVG file as an image"> +<style> +#back { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 60px solid green; + background: red; +} +#front { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 40px solid red; + background: green; + mask-image: url(support/image.svg); +} +</style> +<p>The test passes if there is a green square and no red below.</p> +<div id="back"></div><div id="front"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-local-mask.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-local-mask.html new file mode 100644 index 0000000..18abc54 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-local-mask.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>CSS Test: mask-image: url(#local-mask)</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#mask-layer-image"> +<link rel="match" href="reference/mask-image-ref.html"> +<meta name="assert" content="mask-image can use local reference to a <mask> element"> +<style> +#back { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 60px solid green; + background: red; +} +#front { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 40px solid red; + background: green; + mask-image: url(#localmask); +} +</style> +<p>The test passes if there is a green square and no red below.</p> +<div id="back"></div><div id="front"></div> +<svg viewBox="0 0 200 200" style="width: 0; height: 0"> + <mask id="localmask"> + <rect x="50" y="50" width="100" height="100" fill="white"> + </mask> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-remote-mask.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-remote-mask.html new file mode 100644 index 0000000..cfa3a616 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/mask-image-url-remote-mask.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>CSS Test: mask-image: url(remote.svg#mask)</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#mask-layer-image"> +<link rel="match" href="reference/mask-image-ref.html"> +<meta name="assert" content="mask-image can use reference to a <mask> element from a remote SVG document"> +<style> +#back { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 60px solid green; + background: red; +} +#front { + position: absolute; + box-sizing: border-box; + width: 200px; + height: 200px; + border: 40px solid red; + background: green; + mask-image: url(support/mask.svg#mask); +} +</style> +<p>The test passes if there is a green square and no red below.</p> +<div id="back"></div><div id="front"></div> +<svg> + <!-- mask-image doesn't block onload, so we use an empty g here to + force mask.svg to load before onload. --> + <use href="support/mask.svg#empty"/> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/reference/mask-image-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/reference/mask-image-ref.html new file mode 100644 index 0000000..4e12116 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/reference/mask-image-ref.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<title>CSS Reference: mask-image</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> +#ref { + position: absolute; + width: 200px; + height: 200px; + background: green; +} +</style> +<p>The test passes if there is a green square and no red below.</p> +<div id="ref"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image-with-ref.svg b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image-with-ref.svg new file mode 100644 index 0000000..fe77fb3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image-with-ref.svg
@@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> + <style> + g { display: none; } + g:target { display: inline; } + </style> + <g id="ref"> + <rect x="50" y="50" width="100" height="100" fill="black"/> + </g> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image.svg b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image.svg new file mode 100644 index 0000000..28dbaa0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/image.svg
@@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> + <rect x="50" y="50" width="100" height="100" fill="black"/> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/mask.svg b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/mask.svg new file mode 100644 index 0000000..30e601c8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/mask-image/support/mask.svg
@@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> + <mask id="mask"> + <rect x="50" y="50" width="100" height="100" fill="white"/> + </mask> + <g id="empty"/> +</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-invalid.html index 18ae8b5..8526120 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip supports only the grammar 'rect() | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-invalid.html index 3d33de2..2672d48 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip-path supports only the grammar '<clip-source> | [ <basic-shape> || <geometry-box> ] | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-valid.html index 1d55ed78..83c76fb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-path-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip-path supports the full grammar '<clip-source> | [ <basic-shape> || <geometry-box> ] | none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-invalid.html index 3088d07a..4f4883e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip-rule supports only the grammar 'nonzero | evenodd'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-valid.html index 2fb1907..fe94f8f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-rule-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip-rule supports the full grammar 'nonzero | evenodd'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-valid.html index a21e901..bd14dfd1b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/clip-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="clip supports the full grammar 'rect() | auto'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-masking/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2-ref.xht index 7572833..b49e941 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2-ref.xht
@@ -4,7 +4,7 @@ <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/> <style><![CDATA[ body { - margin: 0; + margin: 1em; } body>div { font-family: Ahem; @@ -12,7 +12,7 @@ line-height: 1em; color: black; background: yellow; - margin: 1em; + margin: 1em 0; border: 1em solid gray; width: 15em; height: 2em; @@ -34,7 +34,7 @@ </head> <body> - +<p>Pass if there is no red visible.</p> <div> <div>xx xx</div> <div class="a">x x</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht index ab7d7564..4e4d94f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht
@@ -2,14 +2,15 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> -<title>multicolumn | column-rule</title> +<title>CSS Multi-column Layout Test: 'column-rule' shorthand</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/> <link rel="help" href=""/> <link rel="match" href="multicol-rule-shorthand-2-ref.xht"/> -<meta name="flags" content=""/> +<meta name="assert" content="Tests that column rules are not displayed for invalid properties and values."/> +<meta name="flags" content="invalid"/> <style type="text/css"><![CDATA[ body { - margin: 0; + margin: 1em; } body>div { font-family: Ahem; @@ -17,36 +18,22 @@ line-height: 1em; color: black; background: yellow; - margin: 1em; + margin: 1em 0; border: 1em solid gray; width: 15em; - orphans: 1; - widows: 1; column-count: 4; column-gap: 1em; column-rule: solid blue 1em; - column-rule: normal red 1em; - column: normal red 1em; + column-rule: normal red 1em; /* invalid: 'normal' is not a 'border-style' */ + column: normal red 1em; /* invalid: 'column' is not a valid property name; 'normal' can only apply to 'column-gap' */ } -span { - background: blue; - position: absolute; - top: 0; - left: 3em; - height: 2em; - width: 1em; -} -span+span { - left: 7em; -} -span+span+span { - left: 11em; -} + ]]></style> </head> <body> +<p>Pass if there is no red visible.</p> <div> xx xx
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001-ref.xht index 926bb66..dddb9688 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001-ref.xht
@@ -6,23 +6,17 @@ <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> <meta name="flags" content="ahem" /> <style type="text/css"><![CDATA[ - body + div { font: 1.25em/1 Ahem; width: 30em; - } - - div - { background-color: yellow; color: black; - orphans: 1; - widows: 1; } ]]></style> </head> <body> - + <p>Test passes if it is identical to the reference.</p> <div>d da d da d da d da d da <br /> dam dam dam dam dam <br />
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001.xht index 84cf1ff..02cbf9b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-001.xht
@@ -4,22 +4,17 @@ <title>CSS Multi-column Layout Test: column-width (basic)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#the-number-and-width-of-columns" title="The number and width of columns" /> <link rel="match" href="multicol-width-001-ref.xht" /> + <meta name="assert" content="Tests that column-width is calculated correctly."/> <meta name="flags" content="ahem" /> <style type="text/css"><![CDATA[ - body + div { font: 1.25em/1 Ahem; width: 30em; - } - - div - { background-color: yellow; color: black; - orphans: 1; - widows: 1; column-gap: 0; column-width: 6em; @@ -27,6 +22,7 @@ ]]></style> </head> <body> + <p>Test passes if it is identical to the reference.</p> <div> d da dam dame damer d da dam dame damer
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002-ref.xht index 59d54ca..68e1033 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002-ref.xht
@@ -20,6 +20,7 @@ ]]></style> </head> <body> + <p>Test passes if there are two black bars and two blue bars with a yellow stripe to the right of each bar, matching reference.</p> <table> <tr> <td><img src="support/black20x20.png" width="40" height="40" alt="Image download support must be enabled" /></td>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002.xht index f838020..78a1495 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-002.xht
@@ -4,8 +4,9 @@ <title>CSS Multi-column Layout Test: column-width (basic)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#the-number-and-width-of-columns" title="The number and width of columns" /> <link rel="match" href="multicol-width-002-ref.xht" /> + <meta name="assert" content="Tests that column-width is calculated correctly."/> <meta name="flags" content="ahem" /> <style type="text/css"><![CDATA[ div @@ -14,8 +15,6 @@ border: gray solid 1em; color: black; font: 1.25em/1 Ahem; - orphans: 1; - widows: 1; width: 12em; column-gap: 0; @@ -26,6 +25,7 @@ ]]></style> </head> <body> + <p>Test passes if there are two black bars and two blue bars with a yellow stripe to the right of each bar, matching reference.</p> <div> bl ac bl ac <span>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-003.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-003.xht index a05a32d8..0e91866 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-003.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-003.xht
@@ -4,9 +4,10 @@ <title>CSS Multi-column Layout Test: column-width (basic)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#the-multi-column-model" title="The Multi-column Model" /> <link rel="match" href="multicol-width-002-ref.xht" /> <meta name="flags" content="ahem" /> + <meta name="assert" content="Test to check that the multicol container and not the column box becomes the containing box"/> <style type="text/css"><![CDATA[ div#multi-column { @@ -15,11 +16,8 @@ color: black; font: 1.25em/1 Ahem; height: 2em; - orphans: 1; position: relative; - widows: 1; width: 12em; - column-width: 6em; column-gap: 0; } @@ -33,23 +31,23 @@ width: 2em; } - div#s2 {left: 3em;} + div#s2 {right: 7em;} div#s3 { background-color: blue; - left: 6em; + right: 4em; } div#s4 { background-color: blue; - left: 9em; + right: 1em; } ]]></style> </head> <body> - + <p>Test passes if there are two black bars and two blue bars with a yellow stripe to the right of each bar, matching reference.</p> <div id="multi-column"> <div></div> <div id="s2"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-001.xht index c3e3b353..8983e00ff 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-001.xht
@@ -2,25 +2,25 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> -<title>multicolumn | column-width</title> +<title>CSS Multi-column Layout Test: column-width (ch units)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/> -<link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns"/> +<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#the-number-and-width-of-columns"/> <link rel="match" href="multicol-width-ch-ref.xht"/> <meta name="flags" content=""/> +<meta name="assert" value="Test that the ch unit can be used as a value for column-width."/> <style type="text/css"><![CDATA[ .multicol { font: 1em monospace; width: 69ch; column-width: 13ch; column-gap: 1ch; - orphans: 1; - widows: 1; background: yellow; } ]]></style> </head> <body> + <p>Test passes if we have five columns with four lines in each. The final column should contain the words: million, billion, trillion.</p> <div class="multicol"> one two three four five six seven eight
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-ref.xht index 133ad3e..8adefc1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-ch-ref.xht
@@ -23,6 +23,7 @@ </head> <body> + <p>Test passes if we have five columns with four lines in each. The final column should contain the words: million, billion, trillion.</p> <div class="multicol-ref"> <span> one two three four
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-001.xht index eeec2dc..3fde061 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-001.xht
@@ -4,30 +4,25 @@ <title>CSS Multi-column Layout Test: column-count and column-width (basic)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#the-number-and-width-of-columns" title="3. The number and width of columns" /> <link rel="match" href="multicol-width-001-ref.xht" /> + <meta name="asset" content="Test that column-count and column-width are valid in combination"/> <meta name="flags" content="ahem" /> <style type="text/css"><![CDATA[ - body + div { font: 1.25em/1 Ahem; width: 30em; - } - - div - { background-color: yellow; color: black; - orphans: 1; - widows: 1; - column-count: 5; column-gap: 0; - column-width: 6em; + column-width: 5em; } ]]></style> </head> <body> + <p>Test passes if it is identical to the reference.</p> <div> d da dam dame damer d da dam dame damer
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-002.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-002.xht index 9b9bffc..6de99956e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-002.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-count-002.xht
@@ -4,8 +4,9 @@ <title>CSS Multi-column Layout Test: column-count and column-width (basic)</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cc" title="3.2 'column-count'" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cc" title="3.2 'column-count'" /> <link rel="match" href="multicol-count-002-ref.xht" /> + <meta name="asset" content="Test that column-count acts as a max when combined with column-width."/> <meta name="flags" content="ahem" /> <style type="text/css"><![CDATA[ html {background-color: white;} @@ -22,10 +23,9 @@ { background-color: yellow; color: black; - column-count: 4; column-gap: 0; - column-width: 5em; + column-width: 4em; /* would create 5 columns if column-count was not acting as a max */ } ]]></style> </head>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001-ref.xht index a583e30..8664fc3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001-ref.xht
@@ -20,6 +20,7 @@ ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <table> <tr> <td><img src="support/black20x20.png" width="40" height="20" alt="Image download support must be enabled" /></td>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001.xht index 76c9a57..83128b1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-invalid-001.xht
@@ -4,7 +4,7 @@ <title>CSS Multi-column Layout Test: invalid column-width</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cw" title="3.1. 'column-width'" /> <link rel="match" href="multicol-width-invalid-001-ref.xht" /> <meta name="flags" content="ahem invalid" /> <meta name="assert" content="This test checks that 'column-width: bzzt' is invalid (generating a parsing error) and therefore will be ignored." /> @@ -15,18 +15,17 @@ border: gray solid 1em; color: black; font: 1.25em/1 Ahem; - orphans: 1; - widows: 1; width: 12em; column-gap: 0; - column-width: bzzt; + column-width: bzzt; /* this value is invalid */ } span {color: blue;} ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <div> bl ac <span>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-001.xht index cb943a7..04530e9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-001.xht
@@ -4,7 +4,7 @@ <title>CSS Multi-column Layout Test: large column-width</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-23 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cw" title="3.1. 'column-width'" /> <link rel="match" href="multicol-width-invalid-001-ref.xht" /> <meta name="flags" content="ahem" /> <meta name="assert" content="This test checks that a set 'column-width' may be wider (to fill the available space). In this test, the actual column-width will be increased to 12em." /> @@ -15,8 +15,6 @@ border: gray solid 1em; color: black; font: 1.25em/1 Ahem; - orphans: 1; - widows: 1; width: 12em; column-gap: 0; @@ -27,6 +25,7 @@ ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <div> bl ac <span>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-002.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-002.xht index 60528159..2efa394 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-002.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-large-002.xht
@@ -4,7 +4,7 @@ <title>CSS Multi-column Layout Test: large column-width</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-24 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cw" title="3.1. 'column-width'" /> <link rel="match" href="multicol-width-invalid-001-ref.xht" /> <meta name="flags" content="ahem" /> <meta name="assert" content="This test checks that a set 'column-width' equal in width to the whole available space of the multi-column will use it all for its column box." /> @@ -15,8 +15,6 @@ border: gray solid 1em; color: black; font: 1.25em/1 Ahem; - orphans: 1; - widows: 1; width: 12em; column-gap: 0; @@ -27,6 +25,7 @@ ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <div> bl ac <span> @@ -38,4 +37,4 @@ bl ac </div> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-negative-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-negative-001.xht index 5370b80..dd7d5154 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-negative-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-negative-001.xht
@@ -4,7 +4,7 @@ <title>CSS Multi-column Layout Test: negative column-width</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-24 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cw" title="3.1. 'column-width'" /> <link rel="match" href="multicol-count-002-ref.xht" /> <meta name="flags" content="ahem invalid" /> <meta name="assert" content="This test checks that a set 'column-width' can not be negative." /> @@ -15,8 +15,6 @@ border: black solid 1em; color: yellow; font: 1.25em/1 Ahem; - orphans: 1; - widows: 1; width: 19em; column-width: -100px;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001-ref.xht index eb427d1d..a862607 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001-ref.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001-ref.xht
@@ -20,6 +20,7 @@ ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <table> <tr> <td><img src="support/black20x20.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/black20x20.png" width="40" height="20" alt="Image download support must be enabled" /></td>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001.xht index c034815..8ef3bfa6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001.xht +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-width-small-001.xht
@@ -4,7 +4,7 @@ <title>CSS Multi-column Layout Test: narrow column-width</title> <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-24 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" /> + <link rel="help" href="https://www.w3.org/TR/css-multicol-1/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" /> <link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" /> <link rel="match" href="multicol-width-small-001-ref.xht" /> <meta name="flags" content="ahem" /> @@ -29,6 +29,7 @@ ]]></style> </head> <body> + <p>This test passes is it is idential to the reference.</p> <div> <div> Bl ac
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-position/position-sticky-overflow-hidden.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-position/position-sticky-overflow-hidden.html new file mode 100644 index 0000000..b1dc49f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-position/position-sticky-overflow-hidden.html
@@ -0,0 +1,86 @@ +<!DOCTYPE html> +<title>position:sticky elements should respect an overflow:hidden ancestor</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" /> +<meta name="assert" content="This test checks that position:sticky elements adhere to an overflow:hidden ancestor" /> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script src="resources/sticky-util.js"></script> + +<body></body> + +<script> +test(() => { + const outer_scroller = document.createElement('div'); + outer_scroller.style.width = '100px'; + outer_scroller.style.height = '100px'; + outer_scroller.style.overflow = 'scroll'; + + const inner_scroller = document.createElement('div'); + inner_scroller.style.width = '80%'; + inner_scroller.style.height = '200px'; + inner_scroller.style.overflow = 'hidden'; + + const sticky = document.createElement('div'); + sticky.style.width = '20px'; + sticky.style.height = '20px'; + sticky.style.position = 'sticky'; + sticky.style.top = '0'; + sticky.style.background = 'red'; + + const spacer = document.createElement('div'); + spacer.style.height = '500px'; + + inner_scroller.appendChild(sticky); + inner_scroller.appendChild(spacer); + outer_scroller.appendChild(inner_scroller); + document.body.appendChild(outer_scroller); + + outer_scroller.scrollTop = 50; + + // The sticky should attach to the inner scroller, and so should not stick. + assert_equals(sticky.offsetTop, inner_scroller.offsetTop); +}, 'A sticky element should attach to an overflow:hidden ancestor'); + +// This tests a specific bug in Firefox where the sticky element incorrectly +// started sticking when inside a table. See https://bugzilla.mozilla.org/show_bug.cgi?id=1488810 +test(() => { + const outer_scroller = document.createElement('div'); + outer_scroller.style.width = '100px'; + outer_scroller.style.height = '100px'; + outer_scroller.style.overflow = 'scroll'; + + const table = document.createElement('div'); + table.style.display = 'table'; + + const tr = document.createElement('div'); + tr.style.display = 'table-row'; + + const inner_scroller = document.createElement('div'); + inner_scroller.style.display = 'table-cell'; + inner_scroller.style.overflow = 'hidden'; + + const sticky = document.createElement('div'); + sticky.style.width = '20px'; + sticky.style.height = '20px'; + sticky.style.position = 'sticky'; + sticky.style.top = '0'; + sticky.style.background = 'red'; + + const spacer = document.createElement('div'); + spacer.style.height = '500px'; + + inner_scroller.appendChild(sticky); + inner_scroller.appendChild(spacer); + tr.append(inner_scroller); + table.appendChild(tr); + outer_scroller.appendChild(table); + document.body.appendChild(outer_scroller); + + outer_scroller.scrollTop = 50; + + // The sticky should attach to the inner scroller, and so should not stick. + assert_equals(sticky.offsetTop, inner_scroller.offsetTop); +}, 'A sticky element should attach to an overflow:hidden ancestor inside a table'); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-properties-values-api/typedom.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-properties-values-api/typedom.tentative.html index eb2d854..9815055 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-properties-values-api/typedom.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-properties-values-api/typedom.tentative.html
@@ -57,11 +57,11 @@ } } -function assert_attribute_get_type(syntax, value, expected) { +function assert_attribute_get_type(styleDecl, propertyMap, syntax, value, expected) { let name = gen_name(); - target.style = `${name}: ${value}`; + styleDecl.setProperty(name, value); - assert_true(target.attributeStyleMap.get(name) instanceof CSSUnparsedValue); + assert_true(propertyMap.get(name) instanceof CSSUnparsedValue); CSS.registerProperty({ name: name, @@ -71,10 +71,10 @@ }); if (expected == CSSStyleValue) { - assert_false(target.attributeStyleMap.get(name) instanceof CSSUnparsedValue); + assert_false(propertyMap.get(name) instanceof CSSUnparsedValue); } - assert_true(target.attributeStyleMap.get(name) instanceof expected); + assert_true(propertyMap.get(name) instanceof expected); } // computedStyleMap @@ -193,111 +193,123 @@ assert_true(target.computedStyleMap().getAll(name).every(x => x instanceof CSSUnitValue)); }, 'All computed values correctly reified in comma-separated list'); -// attributeStyleMap.get +// attributeStyleMap.get / styleMap.get -test(function(){ +function test_style_property_map_get(test_fn, name_fn) { + let rule = style.sheet.rules[0]; + + test(function(){ + target.attributeStyleMap.clear(); + test_fn(target.style, target.attributeStyleMap); + }, name_fn('attributeStyleMap')); + + test(function(){ + rule.styleMap.clear(); + test_fn(rule.style, rule.styleMap); + }, name_fn('styleMap')); +} + +test_style_property_map_get(function(styleDecl, propertyMap){ let name1 = gen_prop('<length>', '100px'); let name2 = gen_prop('<length>', '0px'); - target.style = `${name2}: var(${name1})`; - assert_true(target.attributeStyleMap.get(name2) instanceof CSSUnparsedValue); -}, 'attributeStyleMap.get returns CSSUnparsedValue for value with var references'); + styleDecl.setProperty(name2, `var(${name1})`); + assert_true(propertyMap.get(name2) instanceof CSSUnparsedValue); +}, name => `${name}.get returns CSSUnparsedValue for value with var references`); -test(function(){ +test_style_property_map_get(function(styleDecl, propertyMap){ let name1 = gen_prop('<length>', '100px'); let name2 = gen_prop('<length>#', '0px'); - target.style = `${name2}: 1px, var(${name1}), 3px`; - assert_true(target.attributeStyleMap.get(name2) instanceof CSSUnparsedValue); -}, 'attributeStyleMap.get returns CSSUnparsedValue for value with var reference in list'); + styleDecl.setProperty(name2, `1px, var(${name1}), 3px`); + assert_true(propertyMap.get(name2) instanceof CSSUnparsedValue); +}, name => `${name}.get returns CSSUnparsedValue for value with var references in list`); -test(function(){ - assert_attribute_get_type('*', 'if(){}', CSSUnparsedValue); -}, 'attributeStyleMap.get returns CSSUnparsedValue for *'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '*', 'if(){}', CSSUnparsedValue); +}, name => `${name}.get returns CSSUnparsedValue for *`); -test(function(){ - assert_attribute_get_type('<angle>', '42deg', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <angle>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<angle>', '42deg', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <angle>`); -test(function(){ - assert_attribute_get_type('<color>', '#fefefe', CSSStyleValue); -}, 'attributeStyleMap.get returns CSSStyleValue for <color>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<color>', '#fefefe', CSSStyleValue); +}, name => `${name}.get returns CSSStyleValue for <color>`); -test(function(){ - assert_attribute_get_type('<custom-ident>', 'none', CSSKeywordValue); -}, 'attributeStyleMap.get returns CSSKeywordValue for <custom-ident>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<custom-ident>', 'none', CSSKeywordValue); +}, name => `${name}.get returns CSSKeywordValue for <custom-ident>`); -test(function(){ - assert_attribute_get_type('<image>', 'url(thing.png)', CSSImageValue); -}, 'attributeStyleMap.get returns CSSImageValue for <image>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<image>', 'url(thing.png)', CSSImageValue); +}, name => `${name}.get returns CSSImageValue for <image>`); -test(function(){ - assert_attribute_get_type('<integer>', '100', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <integer>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<integer>', '100', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <integer>`); -test(function(){ - assert_attribute_get_type('<length-percentage>', '10%', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <length-percentage> [10%]'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', '10%', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <length-percentage> [10%]`); -test(function(){ - assert_attribute_get_type('<length-percentage>', '10px', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <length-percentage> [10px]'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', '10px', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <length-percentage> [10px]`); -test(function(){ - assert_attribute_get_type('<length-percentage>', 'calc(10px + 10%)', CSSMathSum); -}, 'attributeStyleMap.get returns CSSMathSum for <length-percentage> [calc(10px + 10%)]'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', 'calc(10px + 10%)', CSSMathSum); +}, name => `${name}.get returns CSSMathSum for <length-percentage> [calc(10px + 10%)]`); -test(function(){ - assert_attribute_get_type('<length>', '10px', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <length>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length>', '10px', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <length>`); -test(function(){ - assert_attribute_get_type('<number>', '42', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <number>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<number>', '42', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <number>`); -test(function(){ - assert_attribute_get_type('<percentage>', '10%', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <percentage>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<percentage>', '10%', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <percentage>`); -test(function(){ - assert_attribute_get_type('<resolution>', '300dpi', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <resolution>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<resolution>', '300dpi', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <resolution>`); -test(function(){ - assert_attribute_get_type('<time>', '42s', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <time>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<time>', '42s', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <time>`); -test(function(){ - assert_attribute_get_type('<url>', 'url(a)', CSSStyleValue); -}, 'attributeStyleMap.get returns CSSStyleValue for <url>'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<url>', 'url(a)', CSSStyleValue); +}, name => `${name}.get returns CSSStyleValue for <url>`); -test(function(){ - assert_attribute_get_type('thing1 | THING2', 'thing1', CSSKeywordValue); -}, 'attributeStyleMap.get returns CSSKeywordValue for thing1 | THING2'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, 'thing1 | THING2', 'thing1', CSSKeywordValue); +}, name => `${name}.get returns CSSKeywordValue for thing1 | THING2`); -test(function(){ - assert_attribute_get_type('<length>+', '10px 20px', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <length>+'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length>+', '10px 20px', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <length>+`); -test(function(){ - assert_attribute_get_type('<length>#', '10px 20px', CSSUnitValue); -}, 'attributeStyleMap.get returns CSSUnitValue for <length>#'); +test_style_property_map_get(function(styleDecl, propertyMap){ + assert_attribute_get_type(styleDecl, propertyMap, '<length>#', '10px 20px', CSSUnitValue); +}, name => `${name}.get returns CSSUnitValue for <length>#`); // attributeStyleMap.getAll -test(function(){ +test_style_property_map_get(function(styleDecl, propertyMap){ let name = gen_prop('<length>+', '0px'); - target.attributeStyleMap.clear(); - target.style = `${name}: 10px 20px 30px`; - assert_equals(target.attributeStyleMap.getAll(name).length, 3); - assert_true(target.attributeStyleMap.getAll(name).every(x => x instanceof CSSUnitValue)); -}, 'attributeStyleMap.getAll returns a list of CSSUnitValues for <length>+'); + styleDecl.setProperty(name, '10px 20px 30px'); + assert_equals(propertyMap.getAll(name).length, 3); + assert_true(propertyMap.getAll(name).every(x => x instanceof CSSUnitValue)); +}, name => `${name}.getAll returns a list of CSSUnitValues for <length>+`); -test(function(){ +test_style_property_map_get(function(styleDecl, propertyMap){ let name = gen_prop('<length>#', '0px'); - target.attributeStyleMap.clear(); - target.style = `${name}: 10px, 20px, 30px`; - assert_equals(target.attributeStyleMap.getAll(name).length, 3); - assert_true(target.attributeStyleMap.getAll(name).every(x => x instanceof CSSUnitValue)); -}, 'attributeStyleMap.getAll returns a list of CSSUnitValues for <length>#'); + styleDecl.setProperty(name, '10px, 20px, 30px'); + assert_equals(propertyMap.getAll(name).length, 3); + assert_true(propertyMap.getAll(name).every(x => x instanceof CSSUnitValue)); +}, name => `${name}.getAll returns a list of CSSUnitValues for <length>#`); // StylePropertyMap.set
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-invalid.html index eb60a2e4..6299e2e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-image-threshold supports only the grammar '<number>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-valid.html index 4fe1efc..914abd0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-image-threshold-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-image-threshold supports the full grammar '<number>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-invalid.html index cdaea05..2255982 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-margin supports only the grammar '<length> | <percentage>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-valid.html index 28f094b..e4a3a891 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-margin-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-margin supports the full grammar '<length> | <percentage>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid-position.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid-position.html index 3bca706b..e61c7071 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid-position.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid-position.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-outside positions support only the '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid.html index 57ce32e..484bafe 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-outside supports only the grammar 'none | [ <basic-shape> || <shape-box> ] | <image>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid-position.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid-position.html index ec0a16d5..cd13c25 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid-position.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid-position.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-outside positions support the full '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid.html index 1a70d10..d52eb9a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/shape-outside-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="shape-outside supports the full grammar 'none | [ <basic-shape> || <shape-box> ] | <image>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-shapes/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-invalid.html index 24976fc..2ed6721 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="perspective-origin supports only the '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-valid.html index d8ac4cc..79f4e0d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/perspective-origin-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="perspective-origin supports the full '<position>' grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-invalid.html index a3f625f..9eef999 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="rotate supports only the grammar 'none | <number>{3}? <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-valid.html index 33e44e3..c82f6be 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/rotate-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="rotate supports the full grammar 'none | <number>{3}? <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-invalid.html index ddc2cad..1072d1d6b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="scale supports only the grammar 'none | <number>{1,3}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-valid.html index 2b99d24..89f79e2e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/scale-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="scale supports the full grammar 'none | <number>{1,3}'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-invalid.html index 415dc072..781601c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform-box supports only the grammar 'content-box | border-box | fill-box | stroke-box | view-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-valid.html index c2e7a5b..0754a5c9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-box-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform-box supports the full grammar 'content-box | border-box | fill-box | stroke-box | view-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-invalid.html index bff9d7b..7fb8367e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform supports only the grammar 'none | <transform-list>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-invalid.html index 0a8ef52..19a7c963 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform-origin supports only the grammar from spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-valid.html index c9f1d73..f76a0b40 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-origin-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform-origin supports the full grammar from spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-valid.html index 62ad8e9..fbde8ea 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/transform-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="transform supports the full grammar 'none | <transform-list>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-invalid.html index 8aa6de5e..9064586 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="translate supports only the grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-valid.html index 86b4deb4..fe16d54 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transforms/parsing/translate-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="translate supports the full grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-invalid.html index 4ced382..98447545 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="box-sizing supports only the grammar 'content-box | border-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-valid.html index fb60ac23..3dfa4f9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/box-sizing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="box-sizing supports the full grammar 'content-box | border-box'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-invalid.html index b4c9cb7..a59b01ec 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="caret-color supports only the grammar 'auto | <color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-valid.html index 41cc706..dd35cf8e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/caret-color-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="caret-color supports the full grammar 'auto | <color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-invalid.html index dda8031..b7928c8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="cursor supports only the grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-valid.html index e33b82e..285c16a4e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/cursor-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="cursor supports the full grammar."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-invalid.html index 195f55d..2b910e8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-color supports only the grammar '<color> | invert'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-mandatory.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-mandatory.html index fbe730b..2af0665 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-mandatory.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-mandatory.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-color supports '<color>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-optional.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-optional.html index bf12b87f..79932990 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-optional.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-color-valid-optional.html
@@ -9,7 +9,7 @@ <meta name="flags" content="may"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-invalid.html index c56a579..c43cc3c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline supports only the grammar '<outline-color> || <outline> || <outline>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-invalid.html index 1ee9477..3ff26e3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-offset supports only the grammar '<length>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-valid.html index c5e023b8..75fc7e6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-offset-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-offset supports the full grammar '<length>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-invalid.html index 2340c62..a659b68a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-style supports only the grammar 'auto | <outline-line-style>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-valid.html index 5adcfda..98e1395 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-style-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-style supports the full grammar 'auto | <outline-line-style>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-mandatory.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-mandatory.html index a296c98..c5217185 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-mandatory.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-mandatory.html
@@ -9,7 +9,7 @@ <meta name="assert" content="outline supports the full grammar '<outline-color> || <outline> || <outline>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-optional.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-optional.html index e179406c..8150ffa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-optional.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-valid-optional.html
@@ -11,7 +11,7 @@ <meta name="flags" content="may"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-invalid.html index 07012fef..6008fffd 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-width supports only the grammar '<border-width>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-valid.html index 050371246..2415e005d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/outline-width-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="outline-width supports the full grammar '<border-width>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-invalid.html index a56a1dbc..7f9698f7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="resize supports only the grammar 'none | both | horizontal | vertical'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-valid.html index 025b0e4..d50df44 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/resize-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="resize supports the full grammar 'none | both | horizontal | vertical'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-invalid.html index f3945a1..aa4169c14 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-overflow supports only the grammar 'clip | ellipsis'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-valid.html index 3f0aaa60..5d40b68 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/parsing/text-overflow-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-overflow supports the full grammar 'clip | ellipsis'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-invalid.html index 7181dbe67..cb282f0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="direction supports only the grammar 'ltr | rtl'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-valid.html index 11585cf..f8b9fa8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/direction-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="direction supports the full grammar 'ltr | rtl'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-invalid.html index b8a0c14b..c3401ea 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-combine-upright supports only the grammar 'none | all'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-valid.html index 2b15840c..dada1f9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-combine-upright-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-combine-upright supports the full grammar 'none | all'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-invalid.html index cc9c0510..ceb9cf7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-orientation supports only the grammar 'mixed | upright | sideways'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-valid.html index 06049c28..36f2d36 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/text-orientation-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="text-orientation supports the full grammar 'mixed | upright | sideways'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-invalid.html index 1e5f2a1..f1a2b73 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="unicode-bidi supports only the grammar 'normal | embed | isolate | bidi-override | isolate-override | plaintext'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-valid.html index 087c026..38911df 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/unicode-bidi-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="unicode-bidi supports the full grammar 'normal | embed | isolate | bidi-override | isolate-override | plaintext'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-invalid.html index 50e42f7..a2010d4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="writing-mode supports only the grammar 'horizontal-tb | vertical-rl | vertical-lr'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-valid.html index 6f52510..6f79a36a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/parsing/writing-mode-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="writing-mode supports the full grammar 'horizontal-tb | vertical-rl | vertical-lr'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/svg-aliasing-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/svg-aliasing-001.html index bc32f20..3979459 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/svg-aliasing-001.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-writing-modes/svg-aliasing-001.html
@@ -3,7 +3,7 @@ <title>SVG writing modes values parsed as aliases</title> <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/"> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#svg-writing-mode"> -<link rel="match" href="reference/svg-aliasing-001-ref.html" +<link rel="match" href="reference/svg-aliasing-001-ref.html"> <meta name="assert" content="The legacy SVG writing mode values are parsed as simple aliases of the newer ones, and do not have side effects on bidi."> <meta name="flags" content="may"> <!-- "may" because the support for these values is optional-->
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-invalid.html index 817c268..af32ae2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-anchor supports only the grammar 'auto | <position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html index d354763b..a69a5ce 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-anchor supports the full grammar 'auto | <position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-invalid.html index 7eec127..2d0be83 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports only the grammar '<length-percentage>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-valid.html index b699ece..5b081bca 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-distance-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports the full grammar '<length-percentage>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-invalid.html index 23475f8..cc2eb500 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset supports only the grammar from the spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-valid.html index 4cdb2b19..75c93e5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset supports the full grammar from the spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-invalid.html index 67c1099..c69f7c8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-path supports only the grammar from the spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-valid.html index d57b465..bda8292 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-path-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-path supports the full grammar from the spec."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-invalid.html index 6565fa5..5e749e5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-position supports only the grammar 'auto | <position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html index 565abff..d40f70e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-position supports the full grammar 'auto | <position>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-invalid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-invalid.html index a649fb4..4e5a9229 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-invalid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-invalid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-rotate supports only the grammar '[ auto | reverse ] || <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-valid.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-valid.html index 38e9ff1ba..71978d33 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-valid.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/offset-rotate-parsing-valid.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-rotate supports the full grammar '[ auto | reverse ] || <angle>'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="support/parsing-testcommon.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/support/parsing-testcommon.js deleted file mode 100644 index b075882..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/motion/parsing/support/parsing-testcommon.js +++ /dev/null
@@ -1,39 +0,0 @@ -'use strict'; - -// serializedValue can be the expected serialization of value, -// or an array of permitted serializations, -// or omitted if value should serialize as value. -function test_valid_value(property, value, serializedValue) { - if (arguments.length < 3) - serializedValue = value; - - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_not_equals(div.style.getPropertyValue(property), "", "property should be set"); - - var div = document.createElement('div'); - div.style[property] = value; - var readValue = div.style.getPropertyValue(property); - if (serializedValue instanceof Array) - assert_in_array(readValue, serializedValue, "serialization should be sound"); - else - assert_equals(readValue, serializedValue, "serialization should be canonical"); - - div.style[property] = readValue; - assert_equals(div.style.getPropertyValue(property), readValue, "serialization should round-trip"); - - }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value"); -} - -function test_invalid_value(property, value) { - var stringifiedValue = JSON.stringify(value); - - test(function(){ - var div = document.createElement('div'); - div.style[property] = value; - assert_equals(div.style.getPropertyValue(property), ""); - }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value"); -}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/support/parsing-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/support/parsing-testcommon.js similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/css/css-box/parsing/support/parsing-testcommon.js rename to third_party/WebKit/LayoutTests/external/wpt/css/support/parsing-testcommon.js
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/events/event-global-extra.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/events/event-global-extra.window-expected.txt index 0c086b2..beb08255 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/events/event-global-extra.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/events/event-global-extra.window-expected.txt
@@ -1,9 +1,9 @@ This is a testharness.js-based test. -FAIL window.event for constructors from another global: EventTarget assert_equals: expected (undefined) undefined but got (object) object "[object Event]" -FAIL window.event for constructors from another global: XMLHttpRequest assert_equals: expected (undefined) undefined but got (object) object "[object Event]" +PASS window.event for constructors from another global: EventTarget +PASS window.event for constructors from another global: XMLHttpRequest PASS window.event and element from another document -FAIL window.event and moving an element post-dispatch assert_equals: expected (object) object "[object Event]" but got (undefined) undefined +PASS window.event and moving an element post-dispatch FAIL window.event should not be affected by nodes moving post-dispatch assert_equals: expected (undefined) undefined but got (object) object "[object Event]" -FAIL Listener from a different global assert_equals: expected (object) object "[object Event]" but got (undefined) undefined +PASS Listener from a different global Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/backcolor.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/backcolor.html index 3d33778..5911de30 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/backcolor.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/backcolor.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>backcolor - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/bold.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/bold.html index b439a11..390d681 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/bold.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/bold.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/createlink.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/createlink.html index 9826169..b67357e6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/createlink.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/createlink.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>createlink - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete-list-items-in-table-cell.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete-list-items-in-table-cell.html index 409a844..b765bc4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete-list-items-in-table-cell.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete-list-items-in-table-cell.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>delete list items in table cells - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete.html index 592c7bb9..6d7a7c8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/delete.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontname.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontname.html index 491fbe55..53800c5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontname.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontname.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontsize.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontsize.html index 35ef701..66ae99e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontsize.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/fontsize.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/forecolor.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/forecolor.html index 4dd42bf..8594e06 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/forecolor.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/forecolor.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/formatblock.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/formatblock.html index f117e77..5c97c08e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/formatblock.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/formatblock.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/forwarddelete.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/forwarddelete.html index 50850d13..e1719005 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/forwarddelete.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/forwarddelete.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/hilitecolor.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/hilitecolor.html index e2de0d9..cd9e552 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/hilitecolor.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/hilitecolor.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>hilitecolor - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/indent.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/indent.html index bf753e6..13e98f5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/indent.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/indent.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>indent - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insert-list-items-in-table-cell.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insert-list-items-in-table-cell.html index 60b396dd..8d08f8c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insert-list-items-in-table-cell.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insert-list-items-in-table-cell.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>Insert list items in table cells - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthorizontalrule.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthorizontalrule.html index 5569e8f..6e3e549 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthorizontalrule.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthorizontalrule.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>inserthorizontalrule - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthtml.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthtml.html index 59eaf4c..f83102e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthtml.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserthtml.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>inserthtml - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertimage.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertimage.html index f34cad0d..7a1f7b9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertimage.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertimage.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>insertimage - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertlinebreak.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertlinebreak.html index eb3df9dc..ddab6650 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertlinebreak.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertlinebreak.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>insertlinebreak - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertorderedlist.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertorderedlist.html index 53a9abab..6877235 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertorderedlist.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertorderedlist.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>insertorderedlist - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertparagraph.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertparagraph.html index 549878a..173c5ae 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertparagraph.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertparagraph.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserttext.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserttext.html index 1a13919..a01293f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserttext.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/inserttext.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertunorderedlist.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertunorderedlist.html index 24e4d00..b1f636b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertunorderedlist.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/insertunorderedlist.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>insertunorderedlist - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/italic.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/italic.html index 1b363c2..6185d55 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/italic.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/italic.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifycenter.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifycenter.html index 68ade6b..4902a30 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifycenter.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifycenter.html
@@ -1,6 +1,6 @@ <!doctype html> <meta charset=utf-8> -<meta name=timeout content=long> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyfull.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyfull.html index 5d2dad5e..c11befa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyfull.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyfull.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyleft.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyleft.html index 3755484..f6b28185 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyleft.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyleft.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyright.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyright.html index ca69e32..edd30b7f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyright.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/justifyright.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-3000">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/misc.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/misc.html index 2ebd68c..5bf5268 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/misc.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/misc.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>misc - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/multitest.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/multitest.html index 2c4b6611..813b9ed 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/multitest.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/multitest.html
@@ -11,7 +11,7 @@ <meta name="variant" content="?8001-9000"> <meta name="variant" content="?9001-last"> <link rel=stylesheet href=../include/reset.css> -<meta name=timeout content=long> +<meta name="timeout" content="long"> <title>multitest - HTML editing conformance tests</title> <p id=timing></p>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/outdent.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/outdent.html index 0329b6e..f1f9fb4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/outdent.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/outdent.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/removeformat.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/removeformat.html index fb38a44..0c38ff91 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/removeformat.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/removeformat.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>removeformat - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/strikethrough.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/strikethrough.html index ed0781fd..cb06c10d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/strikethrough.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/strikethrough.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/subscript.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/subscript.html index 1655a82..e0071d7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/subscript.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/subscript.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>subscript - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/superscript.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/superscript.html index 4c1f047..0c3519b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/superscript.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/superscript.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>superscript - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/underline.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/underline.html index 61f85a1f..f53add9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/underline.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/underline.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <meta name="variant" content="?1-1000"> <meta name="variant" content="?1001-2000"> <meta name="variant" content="?2001-last">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/editing/run/unlink.html b/third_party/WebKit/LayoutTests/external/wpt/editing/run/unlink.html index 26d6e2d..7cd0be9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/editing/run/unlink.html +++ b/third_party/WebKit/LayoutTests/external/wpt/editing/run/unlink.html
@@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <link rel=stylesheet href=../include/reset.css> <title>unlink - HTML editing conformance tests</title>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any-expected.txt deleted file mode 100644 index 647a3074a..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any-expected.txt +++ /dev/null
@@ -1,55 +0,0 @@ -This is a testharness.js-based test. -Found 51 tests; 31 PASS, 20 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS TextDecoder interface: existence and properties of interface object -PASS TextDecoder interface object length -PASS TextDecoder interface object name -PASS TextDecoder interface: existence and properties of interface prototype object -PASS TextDecoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextDecoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextDecoder interface: operation decode(BufferSource, TextDecodeOptions) -PASS TextDecoder interface: attribute encoding -PASS TextDecoder interface: attribute fatal -PASS TextDecoder interface: attribute ignoreBOM -PASS TextDecoder must be primary interface of new TextDecoder() -PASS Stringification of new TextDecoder() -PASS TextDecoder interface: new TextDecoder() must inherit property "decode(BufferSource, TextDecodeOptions)" with the proper type -PASS TextDecoder interface: calling decode(BufferSource, TextDecodeOptions) on new TextDecoder() with too few arguments must throw TypeError -PASS TextDecoder interface: new TextDecoder() must inherit property "encoding" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "fatal" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "ignoreBOM" with the proper type -PASS TextEncoder interface: existence and properties of interface object -PASS TextEncoder interface object length -PASS TextEncoder interface object name -PASS TextEncoder interface: existence and properties of interface prototype object -PASS TextEncoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextEncoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextEncoder interface: operation encode(USVString) -PASS TextEncoder interface: attribute encoding -PASS TextEncoder must be primary interface of new TextEncoder() -PASS Stringification of new TextEncoder() -PASS TextEncoder interface: new TextEncoder() must inherit property "encode(USVString)" with the proper type -PASS TextEncoder interface: calling encode(USVString) on new TextEncoder() with too few arguments must throw TypeError -PASS TextEncoder interface: new TextEncoder() must inherit property "encoding" with the proper type -FAIL TextDecoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object length assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object name assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute encoding assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute fatal assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute ignoreBOM assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute readable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute writable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object length assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object name assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute encoding assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute readable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute writable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.serviceworker-expected.txt deleted file mode 100644 index 1480451..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.serviceworker-expected.txt +++ /dev/null
@@ -1,54 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS TextDecoder interface: existence and properties of interface object -PASS TextDecoder interface object length -PASS TextDecoder interface object name -PASS TextDecoder interface: existence and properties of interface prototype object -PASS TextDecoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextDecoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextDecoder interface: operation decode(BufferSource, TextDecodeOptions) -PASS TextDecoder interface: attribute encoding -PASS TextDecoder interface: attribute fatal -PASS TextDecoder interface: attribute ignoreBOM -PASS TextDecoder must be primary interface of new TextDecoder() -PASS Stringification of new TextDecoder() -PASS TextDecoder interface: new TextDecoder() must inherit property "decode(BufferSource, TextDecodeOptions)" with the proper type -PASS TextDecoder interface: calling decode(BufferSource, TextDecodeOptions) on new TextDecoder() with too few arguments must throw TypeError -PASS TextDecoder interface: new TextDecoder() must inherit property "encoding" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "fatal" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "ignoreBOM" with the proper type -PASS TextEncoder interface: existence and properties of interface object -PASS TextEncoder interface object length -PASS TextEncoder interface object name -PASS TextEncoder interface: existence and properties of interface prototype object -PASS TextEncoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextEncoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextEncoder interface: operation encode(USVString) -PASS TextEncoder interface: attribute encoding -PASS TextEncoder must be primary interface of new TextEncoder() -PASS Stringification of new TextEncoder() -PASS TextEncoder interface: new TextEncoder() must inherit property "encode(USVString)" with the proper type -PASS TextEncoder interface: calling encode(USVString) on new TextEncoder() with too few arguments must throw TypeError -PASS TextEncoder interface: new TextEncoder() must inherit property "encoding" with the proper type -FAIL TextDecoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object length assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object name assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute encoding assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute fatal assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute ignoreBOM assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute readable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute writable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object length assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object name assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute encoding assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute readable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute writable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.sharedworker-expected.txt deleted file mode 100644 index 647a3074a..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.sharedworker-expected.txt +++ /dev/null
@@ -1,55 +0,0 @@ -This is a testharness.js-based test. -Found 51 tests; 31 PASS, 20 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS TextDecoder interface: existence and properties of interface object -PASS TextDecoder interface object length -PASS TextDecoder interface object name -PASS TextDecoder interface: existence and properties of interface prototype object -PASS TextDecoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextDecoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextDecoder interface: operation decode(BufferSource, TextDecodeOptions) -PASS TextDecoder interface: attribute encoding -PASS TextDecoder interface: attribute fatal -PASS TextDecoder interface: attribute ignoreBOM -PASS TextDecoder must be primary interface of new TextDecoder() -PASS Stringification of new TextDecoder() -PASS TextDecoder interface: new TextDecoder() must inherit property "decode(BufferSource, TextDecodeOptions)" with the proper type -PASS TextDecoder interface: calling decode(BufferSource, TextDecodeOptions) on new TextDecoder() with too few arguments must throw TypeError -PASS TextDecoder interface: new TextDecoder() must inherit property "encoding" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "fatal" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "ignoreBOM" with the proper type -PASS TextEncoder interface: existence and properties of interface object -PASS TextEncoder interface object length -PASS TextEncoder interface object name -PASS TextEncoder interface: existence and properties of interface prototype object -PASS TextEncoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextEncoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextEncoder interface: operation encode(USVString) -PASS TextEncoder interface: attribute encoding -PASS TextEncoder must be primary interface of new TextEncoder() -PASS Stringification of new TextEncoder() -PASS TextEncoder interface: new TextEncoder() must inherit property "encode(USVString)" with the proper type -PASS TextEncoder interface: calling encode(USVString) on new TextEncoder() with too few arguments must throw TypeError -PASS TextEncoder interface: new TextEncoder() must inherit property "encoding" with the proper type -FAIL TextDecoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object length assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object name assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute encoding assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute fatal assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute ignoreBOM assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute readable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute writable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object length assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object name assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute encoding assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute readable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute writable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.worker-expected.txt deleted file mode 100644 index 647a3074a..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/idlharness.any.worker-expected.txt +++ /dev/null
@@ -1,55 +0,0 @@ -This is a testharness.js-based test. -Found 51 tests; 31 PASS, 20 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS TextDecoder interface: existence and properties of interface object -PASS TextDecoder interface object length -PASS TextDecoder interface object name -PASS TextDecoder interface: existence and properties of interface prototype object -PASS TextDecoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextDecoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextDecoder interface: operation decode(BufferSource, TextDecodeOptions) -PASS TextDecoder interface: attribute encoding -PASS TextDecoder interface: attribute fatal -PASS TextDecoder interface: attribute ignoreBOM -PASS TextDecoder must be primary interface of new TextDecoder() -PASS Stringification of new TextDecoder() -PASS TextDecoder interface: new TextDecoder() must inherit property "decode(BufferSource, TextDecodeOptions)" with the proper type -PASS TextDecoder interface: calling decode(BufferSource, TextDecodeOptions) on new TextDecoder() with too few arguments must throw TypeError -PASS TextDecoder interface: new TextDecoder() must inherit property "encoding" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "fatal" with the proper type -PASS TextDecoder interface: new TextDecoder() must inherit property "ignoreBOM" with the proper type -PASS TextEncoder interface: existence and properties of interface object -PASS TextEncoder interface object length -PASS TextEncoder interface object name -PASS TextEncoder interface: existence and properties of interface prototype object -PASS TextEncoder interface: existence and properties of interface prototype object's "constructor" property -PASS TextEncoder interface: existence and properties of interface prototype object's @@unscopables property -PASS TextEncoder interface: operation encode(USVString) -PASS TextEncoder interface: attribute encoding -PASS TextEncoder must be primary interface of new TextEncoder() -PASS Stringification of new TextEncoder() -PASS TextEncoder interface: new TextEncoder() must inherit property "encode(USVString)" with the proper type -PASS TextEncoder interface: calling encode(USVString) on new TextEncoder() with too few arguments must throw TypeError -PASS TextEncoder interface: new TextEncoder() must inherit property "encoding" with the proper type -FAIL TextDecoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object length assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface object name assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute encoding assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute fatal assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute ignoreBOM assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute readable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextDecoderStream interface: attribute writable assert_own_property: self does not have own property "TextDecoderStream" expected property "TextDecoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object length assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface object name assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute encoding assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute readable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -FAIL TextEncoderStream interface: attribute writable assert_own_property: self does not have own property "TextEncoderStream" expected property "TextEncoderStream" missing -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any-expected.txt deleted file mode 100644 index 3f234ba..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure Uncaught ReferenceError: TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.serviceworker-expected.txt deleted file mode 100644 index 15502fd..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.serviceworker-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure Failed to register a ServiceWorker: ServiceWorker script evaluation failed -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.sharedworker-expected.txt deleted file mode 100644 index 3f234ba..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.sharedworker-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure Uncaught ReferenceError: TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.worker-expected.txt deleted file mode 100644 index 3f234ba..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/backpressure.any.worker-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure Uncaught ReferenceError: TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-attributes.any.js b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-attributes.any.js new file mode 100644 index 0000000..21b7020 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-attributes.any.js
@@ -0,0 +1,71 @@ +// META: global=worker + +'use strict'; + +// Verify that constructor arguments are correctly reflected in the attributes. + +// Mapping of the first argument to TextDecoderStream to the expected value of +// the encoding attribute. We assume that if this subset works correctly, the +// rest probably work too. +const labelToName = { + 'unicode-1-1-utf-8': 'utf-8', + 'iso-8859-2': 'iso-8859-2', + 'ascii': 'windows-1252', + 'utf-16': 'utf-16le' +}; + +for (const label of Object.keys(labelToName)) { + test(() => { + const stream = new TextDecoderStream(label); + assert_equals(stream.encoding, labelToName[label], 'encoding should match'); + }, `encoding attribute should have correct value for '${label}'`); +} + +for (const falseValue of [false, 0, '', undefined, null]) { + test(() => { + const stream = new TextDecoderStream('utf-8', { fatal: falseValue }); + assert_false(stream.fatal, 'fatal should be false'); + }, `setting fatal to '${falseValue}' should set the attribute to false`); + + test(() => { + const stream = new TextDecoderStream('utf-8', { ignoreBOM: falseValue }); + assert_false(stream.ignoreBOM, 'ignoreBOM should be false'); + }, `setting ignoreBOM to '${falseValue}' should set the attribute to false`); +} + +for (const trueValue of [true, 1, {}, [], 'yes']) { + test(() => { + const stream = new TextDecoderStream('utf-8', { fatal: trueValue }); + assert_true(stream.fatal, 'fatal should be true'); + }, `setting fatal to '${trueValue}' should set the attribute to true`); + + test(() => { + const stream = new TextDecoderStream('utf-8', { ignoreBOM: trueValue }); + assert_true(stream.ignoreBOM, 'ignoreBOM should be true'); + }, `setting ignoreBOM to '${trueValue}' should set the attribute to true`); +} + +test(() => { + assert_throws(new RangeError(), () => new TextDecoderStream(''), + 'the constructor should throw'); +}, 'constructing with an invalid encoding should throw'); + +test(() => { + assert_throws(new TypeError(), () => new TextDecoderStream({ + toString() { return {}; } + }), 'the constructor should throw'); +}, 'constructing with a non-stringifiable encoding should throw'); + +test(() => { + assert_throws(new Error(), + () => new TextDecoderStream('utf-8', { + get fatal() { throw new Error(); } + }), 'the constructor should throw'); +}, 'a throwing fatal member should cause the constructor to throw'); + +test(() => { + assert_throws(new Error(), + () => new TextDecoderStream('utf-8', { + get ignoreBOM() { throw new Error(); } + }), 'the constructor should throw'); +}, 'a throwing ignoreBOM member should cause the constructor to throw');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any-expected.txt deleted file mode 100644 index d3840a8..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL chunk of type undefined should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type null should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type numeric should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type object, not BufferSource should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBufferView should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type SharedArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type shared Uint8Array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.serviceworker-expected.txt deleted file mode 100644 index d3840a8..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.serviceworker-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL chunk of type undefined should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type null should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type numeric should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type object, not BufferSource should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBufferView should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type SharedArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type shared Uint8Array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.sharedworker-expected.txt deleted file mode 100644 index d3840a8..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.sharedworker-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL chunk of type undefined should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type null should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type numeric should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type object, not BufferSource should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBufferView should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type SharedArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type shared Uint8Array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.worker-expected.txt deleted file mode 100644 index d3840a8..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-bad-chunks.any.worker-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL chunk of type undefined should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type null should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type numeric should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type object, not BufferSource should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBufferView should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type detached ArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type SharedArrayBuffer should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL chunk of type shared Uint8Array should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any-expected.txt deleted file mode 100644 index 0b6950d..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL ignoreBOM should work for encoding utf-8, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.serviceworker-expected.txt deleted file mode 100644 index 0b6950d..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.serviceworker-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL ignoreBOM should work for encoding utf-8, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.sharedworker-expected.txt deleted file mode 100644 index 0b6950d..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.sharedworker-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL ignoreBOM should work for encoding utf-8, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.worker-expected.txt deleted file mode 100644 index 0b6950d..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-ignore-bom.any.worker-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL ignoreBOM should work for encoding utf-8, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-8, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16le, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 0 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL ignoreBOM should work for encoding utf-16be, split at character 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any-expected.txt deleted file mode 100644 index ea52493..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL incomplete input with error mode "replacement" should end with a replacement character promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL incomplete input with error mode "fatal" should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.serviceworker-expected.txt deleted file mode 100644 index ea52493..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.serviceworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL incomplete input with error mode "replacement" should end with a replacement character promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL incomplete input with error mode "fatal" should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.sharedworker-expected.txt deleted file mode 100644 index ea52493..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.sharedworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL incomplete input with error mode "replacement" should end with a replacement character promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL incomplete input with error mode "fatal" should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.worker-expected.txt deleted file mode 100644 index ea52493..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-incomplete-input.any.worker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL incomplete input with error mode "replacement" should end with a replacement character promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL incomplete input with error mode "fatal" should error the stream promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any-expected.txt deleted file mode 100644 index c890ab33..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL TextDecoderStream should be able to decode UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode ISO-8859-14 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.serviceworker-expected.txt deleted file mode 100644 index c890ab33..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.serviceworker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL TextDecoderStream should be able to decode UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode ISO-8859-14 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.sharedworker-expected.txt deleted file mode 100644 index c890ab33..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.sharedworker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL TextDecoderStream should be able to decode UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode ISO-8859-14 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.worker-expected.txt deleted file mode 100644 index c890ab33..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-non-utf8.any.worker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL TextDecoderStream should be able to decode UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16BE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in UTF-16LE promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to reject invalid sequences in Shift_JIS promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL TextDecoderStream should be able to decode ISO-8859-14 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any-expected.txt deleted file mode 100644 index c2423a9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point should be emitted as soon as all bytes are available promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 6 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.serviceworker-expected.txt deleted file mode 100644 index c2423a9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.serviceworker-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point should be emitted as soon as all bytes are available promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 6 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.sharedworker-expected.txt deleted file mode 100644 index c2423a9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.sharedworker-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point should be emitted as soon as all bytes are available promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 6 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.worker-expected.txt deleted file mode 100644 index c2423a9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-split-character.any.worker-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point split between chunks should not be emitted until all bytes are available; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a code point should be emitted as soon as all bytes are available promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 1 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 2 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 3 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 4 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 5 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an empty chunk inside a code point split between chunks should not change the output; split point = 6 promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any-expected.txt deleted file mode 100644 index 8eb175c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL decoding one UTF-8 chunk should give one output string promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL decoding an empty chunk should give no output chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an initial empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt deleted file mode 100644 index 8eb175c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL decoding one UTF-8 chunk should give one output string promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL decoding an empty chunk should give no output chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an initial empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt deleted file mode 100644 index 8eb175c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL decoding one UTF-8 chunk should give one output string promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL decoding an empty chunk should give no output chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an initial empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt deleted file mode 100644 index 8eb175c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL decoding one UTF-8 chunk should give one output string promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL decoding an empty chunk should give no output chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL an initial empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextDecoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any-expected.txt deleted file mode 100644 index 504d6396..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -This is a testharness.js-based test. -FAIL a chunk that cannot be converted to a string should error the streams TextEncoderStream is not defined -FAIL input of type undefined should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type null should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type numeric should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type object should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type array should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.serviceworker-expected.txt deleted file mode 100644 index 504d6396..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.serviceworker-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -This is a testharness.js-based test. -FAIL a chunk that cannot be converted to a string should error the streams TextEncoderStream is not defined -FAIL input of type undefined should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type null should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type numeric should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type object should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type array should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.sharedworker-expected.txt deleted file mode 100644 index 504d6396..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.sharedworker-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -This is a testharness.js-based test. -FAIL a chunk that cannot be converted to a string should error the streams TextEncoderStream is not defined -FAIL input of type undefined should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type null should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type numeric should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type object should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type array should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.worker-expected.txt deleted file mode 100644 index 504d6396..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-bad-chunks.any.worker-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -This is a testharness.js-based test. -FAIL a chunk that cannot be converted to a string should error the streams TextEncoderStream is not defined -FAIL input of type undefined should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type null should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type numeric should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type object should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL input of type array should be converted correctly to string promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any-expected.txt deleted file mode 100644 index 57c301c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -FAIL encoding one string of UTF-8 should give one complete chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character following one split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle should be correctly reassembled promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle with an invalid surrogate in the middle should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a stream ending in a leading surrogate should emit a replacement character as a final chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an astral character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an ascii character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by a plane 1 character split into two chunks should result in the encoded plane 1 character appearing in the last output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two leading chunks should result in two replacement characters promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a non-terminal unpaired leading surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a terminal unpaired trailing surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should be carried past empty chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should error when it is clear it didn't form a pair promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an empty string should result in no output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a plain ASCII chunk should be converted promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL characters in the ISO-8859-1 range should be encoded correctly promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.serviceworker-expected.txt deleted file mode 100644 index 57c301c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.serviceworker-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -FAIL encoding one string of UTF-8 should give one complete chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character following one split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle should be correctly reassembled promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle with an invalid surrogate in the middle should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a stream ending in a leading surrogate should emit a replacement character as a final chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an astral character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an ascii character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by a plane 1 character split into two chunks should result in the encoded plane 1 character appearing in the last output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two leading chunks should result in two replacement characters promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a non-terminal unpaired leading surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a terminal unpaired trailing surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should be carried past empty chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should error when it is clear it didn't form a pair promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an empty string should result in no output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a plain ASCII chunk should be converted promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL characters in the ISO-8859-1 range should be encoded correctly promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.sharedworker-expected.txt deleted file mode 100644 index 57c301c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.sharedworker-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -FAIL encoding one string of UTF-8 should give one complete chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character following one split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle should be correctly reassembled promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle with an invalid surrogate in the middle should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a stream ending in a leading surrogate should emit a replacement character as a final chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an astral character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an ascii character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by a plane 1 character split into two chunks should result in the encoded plane 1 character appearing in the last output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two leading chunks should result in two replacement characters promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a non-terminal unpaired leading surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a terminal unpaired trailing surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should be carried past empty chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should error when it is clear it didn't form a pair promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an empty string should result in no output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a plain ASCII chunk should be converted promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL characters in the ISO-8859-1 range should be encoded correctly promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.worker-expected.txt deleted file mode 100644 index 57c301c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/encode-utf8.any.worker-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -FAIL encoding one string of UTF-8 should give one complete chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a character following one split between chunks should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle should be correctly reassembled promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two consecutive astral characters each split down the middle with an invalid surrogate in the middle should be correctly encoded promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a stream ending in a leading surrogate should emit a replacement character as a final chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an astral character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by an ascii character in the next chunk should be replaced with the replacement character at the start of the next output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an unmatched surrogate at the end of a chunk followed by a plane 1 character split into two chunks should result in the encoded plane 1 character appearing in the last output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL two leading chunks should result in two replacement characters promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a non-terminal unpaired leading surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a terminal unpaired trailing surrogate should immediately be replaced promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should be carried past empty chunks promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading surrogate chunk should error when it is clear it didn't form a pair promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL an empty string should result in no output chunk promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a leading empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a trailing empty chunk should be ignored promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL a plain ASCII chunk should be converted promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -FAIL characters in the ISO-8859-1 range should be encoded correctly promise_test: Unhandled rejection with value: object "ReferenceError: TextEncoderStream is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any-expected.txt deleted file mode 100644 index 59c6569..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextEncoderStream readable and writable properties must pass brand checks TextEncoderStream is not defined -FAIL TextDecoderStream readable and writable properties must pass brand checks TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.serviceworker-expected.txt deleted file mode 100644 index 59c6569..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.serviceworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextEncoderStream readable and writable properties must pass brand checks TextEncoderStream is not defined -FAIL TextDecoderStream readable and writable properties must pass brand checks TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.sharedworker-expected.txt deleted file mode 100644 index 59c6569..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.sharedworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextEncoderStream readable and writable properties must pass brand checks TextEncoderStream is not defined -FAIL TextDecoderStream readable and writable properties must pass brand checks TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.worker-expected.txt deleted file mode 100644 index 59c6569..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/readable-writable-properties.any.worker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextEncoderStream readable and writable properties must pass brand checks TextEncoderStream is not defined -FAIL TextDecoderStream readable and writable properties must pass brand checks TextDecoderStream is not defined -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/realms.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/realms.window-expected.txt deleted file mode 100644 index 044828e..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/encoding/streams/realms.window-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL a TextEncoderStream object should be associated with the realm the constructor came from promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL TextEncoderStream's readable and writable attributes should come from the same realm as the constructor definition promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'prototype' of undefined" -FAIL the output chunks when read is called after write should come from the same realm as the constructor of TextEncoderStream promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL the output chunks when write is called with a pending read should come from the same realm as the constructor of TextEncoderStream promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL TypeError for unconvertable chunk should come from constructor realm of TextEncoderStream assert_false: write should fail expected false got true -FAIL a TextDecoderStream object should be associated with the realm the constructor came from promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL TextDecoderStream's readable and writable attributes should come from the same realm as the constructor definition promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'prototype' of undefined" -FAIL the result object when read is called after write should come from the same realm as the constructor of TextDecoderStream promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL the result object when write is called with a pending read should come from the same realm as the constructor of TextDecoderStream promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined" -FAIL TypeError for chunk with the wrong type should come from constructor realm of TextDecoderStream assert_false: write should fail expected false got true -FAIL TypeError for invalid chunk should come from constructor realm of TextDecoderStream assert_false: write should fail expected false got true -FAIL TypeError for incomplete input should come from constructor realm of TextDecoderStream assert_false: close should fail expected false got true -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/scripts/playback-temporary-expired.js b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/scripts/playback-temporary-expired.js index 5144ef9..3d1bd95 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/scripts/playback-temporary-expired.js +++ b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/scripts/playback-temporary-expired.js
@@ -44,23 +44,26 @@ assert_in_array(event.messageType, ['license-request', 'individualization-request']); + // Generate a license that expires 1 second from now. var expiration = Date.now().valueOf() + 1000; config.messagehandler(event.messageType, event.message, { expiration: expiration }).then(function(response) { - return event.target.update(response); - }).then(test.step_func(function() { - // License server may only have second granularity, so check - // that session expiration time is close to the desired value. - assert_approx_equals(event.target.expiration, expiration, 2000, "expiration attribute should equal provided expiration time"); - - // Since the expiration time is in the future, wait 5 seconds - // so that the license has expired before calling play(). + // Wait 2 seconds before calling update() to ensure that the + // license has really expired. This is to avoid problems + // where the browser starts buffering frames as soon as a + // valid license is received. test.step_timeout(function() { - assert_greater_than(Date.now().valueOf(), expiration, "Starting play before license expired"); - _video.play(); - // Wait 2 seconds to ensure that the video does not play. - test.step_timeout(function() { test.done(); }, 2000); - }, 5000); - })).catch(onFailure); + event.target.update(response).then(function() { + // License server may only have second granularity, so check + // that session expiration time is close to the desired value. + assert_approx_equals(event.target.expiration, expiration, 3000, + "expiration attribute should equal provided expiration time"); + assert_greater_than(Date.now().valueOf(), expiration, "Starting play before license expired"); + _video.play(); + // Wait 2 seconds to ensure that the video does not play. + test.step_timeout(function() { test.done(); }, 2000); + }).catch(onFailure); + }, 2000); + }).catch(onFailure); } function onPlaying(event) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-a.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-a.html new file mode 100644 index 0000000..40c1d061 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-a.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<head> + <title>Helper page for ../unload-manual.html</title> +</head> +<body> + <script src="./unload.js"></script> + <script> + setupListeners("a", "./unload-b.html"); + </script> + <button id="proceed">Click me!</button> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-b.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-b.html new file mode 100644 index 0000000..7c2d90df --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-b.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<head> + <title>Helper page for ../unload-manual.html</title> +</head> +<body> + <script src="./unload.js"></script> + <script> + setupListeners("b", "./unload-c.html"); + </script> + <button id="proceed">Click me again!</button> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-c.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-c.html new file mode 100644 index 0000000..731da9d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload-c.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<head> + <title>Helper page for ../unload-manual.html</title> +</head> +<body> + <script src="./unload.js"></script> + <script> + setupListeners("c", null); + </script> + <button id="proceed">Click me, one last time!</button> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload.js b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload.js new file mode 100644 index 0000000..ab6b121 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/resources/unload.js
@@ -0,0 +1,51 @@ +const syncDelay = ms => { + const start = performance.now(); + let elapsedTime; + do { + elapsedTime = performance.now() - start; + } while (elapsedTime < ms); +}; + +const markTime = (docName, lifecycleEventName) => { + // Calculating these values before the below `mark` invocation ensures that delays in + // reaching across to the other window object doesn't interfere with the correctness + // of the test. + const dateNow = Date.now(); + const performanceNow = performance.now(); + + window.opener.mark({ + docName, + lifecycleEventName, + performanceNow: performanceNow, + dateNow: dateNow + }); +}; + +const setupUnloadPrompt = (docName, msg) => { + window.addEventListener("beforeunload", ev => { + markTime(docName, "beforeunload"); + return ev.returnValue = msg || "Click OK to continue test." + }); +}; + +const setupListeners = (docName, nextDocument) => { + window.addEventListener("load", () => { + markTime(docName, "load"); + document.getElementById("proceed").addEventListener("click", ev => { + ev.preventDefault(); + if (nextDocument) { + document.location = nextDocument; + } else { + window.close(); + } + }) + }); + + setupUnloadPrompt(docName); + + window.addEventListener("unload", () => { + markTime(docName, "unload"); + if (docName !== "c") { syncDelay(1000); } + }); +}; +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/unload-manual.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/unload-manual.html new file mode 100644 index 0000000..18c4e0d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/unload-manual.html
@@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html> +<head> + <title>time origin value manual test</title> + <link rel="help" href="https://w3c.github.io/hr-time/#time-origin-1"> + <link rel="prefetch" href="./resources/unload-a.html"> + <link rel="prefetch" href="./resources/unload-b.html"> + <link rel="prefetch" href="./resources/unload-c.html"> +</head> +<body> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + setup({ explicit_timeout: true }); + + const ACCEPTABLE_VARIANCE = 400; // ms + + const isRoughlyEqual = (a, b) => Math.abs(a - b) < ACCEPTABLE_VARIANCE; + + const timings = { a: {}, b: {}, c: {} }; + const t = async_test("hr-time time origin"); + + window.mark = msg => { + timings[msg.docName][msg.lifecycleEventName] = { + performanceNow: msg.performanceNow, + dateNow: msg.dateNow + }; + + if (msg.docName === "c" && msg.lifecycleEventName === "unload") { + setTimeout(makeAssertions, 0); + } + }; + + function makeAssertions () { + t.step(() => { + const loadTimeBetweenAandB = timings.b.load.dateNow - timings.a.unload.dateNow; + const loadTimeBetweenBandC = timings.c.load.dateNow - timings.b.unload.dateNow; + + assert_true( + isRoughlyEqual(loadTimeBetweenAandB, timings.b.load.performanceNow), + "Document in reused window's time origin should be time of close of pop-up box." + ); + assert_true( + isRoughlyEqual(loadTimeBetweenBandC, timings.c.load.performanceNow), + "Document in reused window's time origin should be time of close of pop-up box." + ); + assert_true( + !isRoughlyEqual(timings.a.unload.performanceNow, 0), + "Time origin during unload event should match that of rest of document." + ); + assert_true( + !isRoughlyEqual(timings.b.unload.performanceNow, 0), + "Time origin during unload event should match that of rest of document." + ); + assert_true( + !isRoughlyEqual(timings.c.unload.performanceNow, 0), + "Time origin during unload event should match that of rest of document." + ); + }); + t.done(); + } + </script> + + <h2>Description</h2> + <p>This test validates the behavior of <code>performance.now()</code> with respect to its time origin.</p> + <div id="log"> + <h2>Manual Test Steps</h2> + <ol> + <li><a href="resources/unload-a.html" target="_blank">Click here</a> + </ol> + </div> +</body> +<html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html new file mode 100644 index 0000000..4abd9ce5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend.html
@@ -0,0 +1,20 @@ +<!doctype html> +<title>fieldset content before legend</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<fieldset id=test> + X + <legend>legend</legend> + Y +</fieldset> +<fieldset id=ref> + <legend>legend</legend> + X Y +</fieldset> +<script> + test(() => { + const testElm = document.getElementById('test'); + const refElm = document.getElementById('ref'); + assert_equals(testElm.clientHeight, refElm.clientHeight); + }); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html new file mode 100644 index 0000000..d9b36e53 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-ref.html
@@ -0,0 +1,23 @@ +<!DOCTYPE HTML> +<title>Reference for fieldset overflow</title> +<style> +.fieldset, .legend { + border: 1em solid; + background: lime; +} +.fieldset { + height: 1em; + margin-top: 2em; +} +.legend { + height: 1em; + width: 5em; + line-height: 1; + margin-top: -4em; + margin-left: 1em; +} +</style> +<p>There should be no red.</p> +<div class=fieldset> +</div> +<div class=legend></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html new file mode 100644 index 0000000..2599f2f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html
@@ -0,0 +1,33 @@ +<!DOCTYPE HTML> +<title>fieldset overflow</title> +<link rel=match href=fieldset-overflow-ref.html> +<style> +fieldset, legend { + border: 1em solid; + margin: 0; + padding: 0; + background: lime +} +fieldset { + overflow: auto; + height: 2em; +} +legend { + height: 1em; + width: 5em; +} +div { + background: red; + height: 2em; +} + +</style> +<p>There should be no red.</p> +<fieldset> + <legend></legend> + <div></div> + <div id=last></div> +</fieldset> +<script> + document.getElementById('last').scrollIntoView(); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/083-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/083-expected.txt index 5f6926c..7d8abb8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/083-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/083-expected.txt
@@ -1,5 +1,4 @@ This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = Uncaught TypeError: Cannot read property 'log' of null FAIL scheduler: event listener defined by script in a document in history assert_array_equals: lengths differ, expected 5 got 6 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/084-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/084-expected.txt deleted file mode 100644 index bfce201..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/084-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL scheduler: event listener defined by script in a removed IFRAME Uncaught TypeError: Cannot read property 'log' of null -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter-expected.txt new file mode 100644 index 0000000..aeebcd0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter-expected.txt
@@ -0,0 +1,23 @@ +This is a testharness.js-based test. +FAIL Errors on type=module when given content-type=text/javascript;goal= assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=text/javascript when given content-type=text/javascript;goal= assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=text/javascript when given content-type=text/html;goal=script assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=text/javascript when given content-type=text/javascript;goal= script assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=text/javascript when given content-type=text/javascript;goal=script assert_unreached: Script should not load. Reached unreachable code +PASS Errors on type=module when given content-type=text/html;goal=module +FAIL Errors on type=module when given content-type=text/javascript;goal= module assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=module when given content-type=text/javascript;goal=module assert_unreached: Script should not load. Reached unreachable code +FAIL Errors on type=module when given content-type=text/javascript;goal=" module" assert_unreached: Script should not load. Reached unreachable code +PASS Loads type=text/javascript when given content-type=text/javascript;goal=script +PASS Loads type=text/javascript when given content-type=text/javascript;goal=SCRIPT +PASS Loads type=text/javascript when given content-type=text/javascript;GOAL=script +PASS Loads type=text/javascript when given content-type=text/javascript;Goal=Script +PASS Loads type=text/javascript when given content-type=text/javascript;gOal=script +PASS Loads type=text/javascript when given content-type=text/javascript;goal=scrIpt +PASS Loads type=text/javascript when given content-type=text/javascript;goal="script" +PASS Loads type=text/javascript when given content-type=text/javascript;goal="\s\c\r\i\p\t" +PASS Loads type=module when given content-type=text/javascript;goal="\m\o\d\u\l\e" +PASS Loads type=module when given content-type=text/javascript;goal=module +PASS Loads type=module when given content-type=text/javascript;goal="module" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter.htm b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter.htm new file mode 100644 index 0000000..fe4d675 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/goal-parameter.htm
@@ -0,0 +1,138 @@ +<!DOCTYPE html> +<html> + <head> + <title>Goal Parameter on JavaScript MIME</title> + <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + <meta description="This test checks the Async property on a dynamically-created script element. By default it should be true." /> + <link rel="author" title="" href="http://www.microsoft.com/" /> + <link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-script-async"/> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <script type="module"> + + function makeTest({ + fileName, + scriptType, + contentType, + shouldLoad + }) { + const elem = Object.assign(document.createElement("script"), { + type: scriptType, + src: `./serve-with-content-type.py?fn=${scriptType === "module" ? "is-module-goal.mjs" : "is-script-goal.js"}&ct=${contentType}` + }); + const name = `${shouldLoad ? "Loads" : "Errors on"} type=${scriptType} when given content-type=${decodeURIComponent(contentType)}`; + const t = async_test(name); + if (!shouldLoad) { + elem.onload = t.unreached_func("Script should not load."); + elem.onerror = t.step_func_done(); + } else { + elem.onload = t.step_func_done(); + elem.onerror = t.unreached_func("Script should load."); + } + document.body.appendChild(elem); + } + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=', + shouldLoad: false + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=', + shouldLoad: false + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fhtml%3Bgoal=script', + shouldLoad: false + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=%20script', + shouldLoad: false + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=script%20', + shouldLoad: false + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fhtml%3Bgoal=module', + shouldLoad: false + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=%20module', + shouldLoad: false + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=module%20', + shouldLoad: false + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=%22%20module%22', + shouldLoad: false + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=script', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=SCRIPT', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3BGOAL=script', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3BGoal=Script', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3BgOal=script', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=scrIpt', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=%22script%22', + shouldLoad: true + }); + makeTest({ + scriptType: 'text/javascript', + contentType: 'text%2Fjavascript%3Bgoal=%22%5Cs%5Cc%5Cr%5Ci%5Cp%5Ct%22', + shouldLoad: true + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=%22%5Cm%5Co%5Cd%5Cu%5Cl%5Ce%22', + shouldLoad: true + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=module', + shouldLoad: true + }); + makeTest({ + scriptType: 'module', + contentType: 'text%2Fjavascript%3Bgoal=%22module%22', + shouldLoad: true + }); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-module-goal.mjs b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-module-goal.mjs new file mode 100644 index 0000000..b533fc2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-module-goal.mjs
@@ -0,0 +1 @@ +import "./serve-with-content-type.py?fn=is-module-goal.mjs&ct=text%2Fjavascript%3Bgoal=module"; \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-script-goal.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-script-goal.js new file mode 100644 index 0000000..069363d --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/is-script-goal.js
@@ -0,0 +1,3 @@ +with ({}) { + ; +}; \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js new file mode 100644 index 0000000..f96710999 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js
@@ -0,0 +1,98 @@ +function assertOpenIsEffective(doc, initialNodeCount) { + assert_equals(doc.childNodes.length, initialNodeCount); + + // Test direct document.open() call. + assert_equals(doc.open(), doc); + assert_equals(doc.childNodes.length, 0, "after open: no nodes in document"); + doc.write("<!DOCTYPE html>"); + assert_equals(doc.childNodes.length, 1, "after write: doctype node in document"); + doc.close(); + assert_equals(doc.childNodes.length, 2, "after parser close: doctype node and an html element in document"); + + // Test implicit document.open() call through write(). Since we called + // doc.close() above, which sets the insertion point of the parser to + // undefined, document.write() will run the document open steps. + doc.write(); + assert_equals(doc.childNodes.length, 0, "after implicit open: no nodes in document"); + doc.write("<!DOCTYPE html>"); + assert_equals(doc.childNodes.length, 1, "after write: doctype node in document"); + doc.close(); + assert_equals(doc.childNodes.length, 2, "after parser close: doctype node and an html element in document"); +} + +test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + assertOpenIsEffective(frame.contentDocument, 1); +}, "document.open() removes the document's children (fully active document)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + const childFrame = frame.contentDocument.querySelector("iframe"); + const childDoc = childFrame.contentDocument; + const childWin = childFrame.contentWindow; + + // Right now childDoc is still fully active. + + frame.onload = t.step_func_done(() => { + // Now childDoc is still active but no longer fully active. + assertOpenIsEffective(childDoc, 1); + }); + frame.src = "/common/blank.html"; + }); + frame.src = "resources/page-with-frame.html"; +}, "document.open() removes the document's children (active but not fully active document)"); + +test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + const doc = frame.contentDocument; + + // Right now the frame is connected and it has an active document. + frame.remove(); + + // Now the frame is no longer connected. Its document is no longer active. + assertOpenIsEffective(doc, 1); +}, "document.open() removes the document's children (non-active document with an associated Window object; frame is removed)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.src = "resources/dummy.html"; + + frame.onload = t.step_func(() => { + const firstDocument = frame.contentDocument; + // Right now the frame is connected and it has an active document. + + frame.onload = t.step_func_done(() => { + // Now even though the frame is still connected, its document is no + // longer active. + assert_not_equals(frame.contentDocument, firstDocument); + assertOpenIsEffective(firstDocument, 2); + }); + + frame.src = "/common/blank.html"; + }); +}, "document.open() removes the document's children (non-active document with an associated Window object; navigated away)"); + +test(t => { + const doc = document.implementation.createHTMLDocument(); + assertOpenIsEffective(doc, 2); +}, "document.open() removes the document's children (non-active document without an associated Window object; createHTMLDocument)"); + +test(t => { + const doc = new DOMParser().parseFromString("", "text/html"); + assertOpenIsEffective(doc, 1); +}, "document.open() removes the document's children (non-active document without an associated Window object; DOMParser)"); + +async_test(t => { + const xhr = new XMLHttpRequest(); + xhr.onload = t.step_func_done(() => { + assert_equals(xhr.status, 200); + assertOpenIsEffective(xhr.responseXML, 2); + }); + xhr.responseType = "document"; + xhr.open("GET", "resources/dummy.html"); + xhr.send(); +}, "document.open() removes the document's children (non-active document without an associated Window object; XMLHttpRequest)");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js index 58ec08f..df07124d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js
@@ -1,3 +1,7 @@ +// Many of the active-related test cases in this file came from +// active.window.js. However, we cannot test the "navigated away" non-active +// case right now due to https://github.com/whatwg/html/issues/3997. + test(t => { const frame = document.body.appendChild(document.createElement("iframe")), body = frame.contentDocument.body; @@ -36,6 +40,130 @@ frame.contentDocument.close(); }, "Standard event listeners are to be removed from Window"); +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + const childFrame = frame.contentDocument.querySelector("iframe"); + const childWin = childFrame.contentWindow; + const childDoc = childFrame.contentDocument; + const childBody = childDoc.body; + + // Right now childDoc is still fully active. + + frame.onload = t.step_func_done(() => { + // Focus on the current window so that the frame's window is blurred. + window.focus(); + // Now childDoc is still active but no longer fully active. + childWin.addEventListener("focus", t.unreached_func("window event listener not removed")); + childBody.onfocus = t.unreached_func("body event listener not removed"); + + childDoc.open(); + assert_equals(childBody.onfocus, null); + + // Now try to fire the focus event two different ways. + childWin.focus(); + const focusEvent = new FocusEvent("focus"); + childWin.dispatchEvent(focusEvent); + childDoc.close(); + }); + frame.src = "/common/blank.html"; + }); + frame.src = "resources/page-with-frame.html"; +}, "Standard event listeners are to be removed from Window for an active but not fully active document"); + +test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + const win = frame.contentWindow; + const doc = frame.contentDocument; + const body = doc.body; + + // Right now the frame is connected and it has an active document. + frame.remove(); + + win.addEventListener("focus", t.unreached_func("window event listener not removed")); + body.onfocus = t.unreached_func("body event listener not removed"); + doc.open(); + assert_equals(body.onfocus, null); + + // Now try to fire the focus event two different ways. + win.focus(); + const focusEvent = new FocusEvent("focus"); + win.dispatchEvent(focusEvent); + doc.close(); +}, "Standard event listeners are to be removed from Window for a non-active document that is the associated Document of a Window (frame is removed)"); + +test(t => { + let winHappened = 0; + const winListener = t.step_func(() => { winHappened++; }); + window.addEventListener("focus", winListener); + t.add_cleanup(() => { window.removeEventListener("focus", winListener); }); + + let bodyHappened = 0; + const bodyListener = t.step_func(() => { bodyHappened++; }); + document.body.onfocus = bodyListener; + t.add_cleanup(() => { document.body.onfocus = null; }); + + const doc = document.implementation.createHTMLDocument(); + doc.open(); + + const focusEvent = new FocusEvent("focus"); + window.dispatchEvent(focusEvent); + + assert_equals(winHappened, 1); + assert_equals(bodyHappened, 1); +}, "Standard event listeners are NOT to be removed from Window for a Window-less document (createHTMLDocument)"); + +test(t => { + let winHappened = 0; + const winListener = t.step_func(() => { winHappened++; }); + window.addEventListener("focus", winListener); + t.add_cleanup(() => { window.removeEventListener("focus", winListener); }); + + let bodyHappened = 0; + const bodyListener = t.step_func(() => { bodyHappened++; }); + document.body.onfocus = bodyListener; + t.add_cleanup(() => { document.body.onfocus = null; }); + + const doc = new DOMParser().parseFromString("", "text/html"); + doc.open(); + + const focusEvent = new FocusEvent("focus"); + window.dispatchEvent(focusEvent); + + assert_equals(winHappened, 1); + assert_equals(bodyHappened, 1); +}, "Standard event listeners are NOT to be removed from Window for a Window-less document (DOMParser)"); + +async_test(t => { + const xhr = new XMLHttpRequest(); + xhr.onload = t.step_func_done(() => { + assert_equals(xhr.status, 200); + const doc = xhr.responseXML; + + let winHappened = 0; + const winListener = t.step_func(() => { winHappened++; }); + window.addEventListener("focus", winListener); + t.add_cleanup(() => { window.removeEventListener("focus", winListener); }); + + let bodyHappened = 0; + const bodyListener = t.step_func(() => { bodyHappened++; }); + document.body.onfocus = bodyListener; + t.add_cleanup(() => { document.body.onfocus = null; }); + + doc.open(); + + const focusEvent = new FocusEvent("focus"); + window.dispatchEvent(focusEvent); + + assert_equals(winHappened, 1); + assert_equals(bodyHappened, 1); + }); + xhr.responseType = "document"; + xhr.open("GET", "resources/dummy.html"); + xhr.send(); +}, "Standard event listeners are NOT to be removed from Window for a Window-less document (XMLHttpRequest)"); + test(t => { const frame = document.body.appendChild(document.createElement("iframe")); t.add_cleanup(() => frame.remove()); @@ -45,6 +173,76 @@ frame.contentDocument.close(); }, "Custom event listeners are to be removed from Window"); +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + const childFrame = frame.contentDocument.querySelector("iframe"); + const childDoc = childFrame.contentDocument; + const childWin = childFrame.contentWindow; + + // Right now childDoc is still fully active. + + frame.onload = t.step_func_done(() => { + // Now childDoc is still active but no longer fully active. + childWin.addEventListener("x", t.unreached_func("window event listener not removed")); + childDoc.open(); + childWin.dispatchEvent(new Event("x")); + childDoc.close(); + }); + frame.src = "/common/blank.html"; + }); + frame.src = "resources/page-with-frame.html"; +}, "Custom event listeners are to be removed from Window for an active but not fully active document"); + +test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + const win = frame.contentWindow; + const doc = frame.contentDocument; + + // Right now the frame is connected and it has an active document. + frame.remove(); + + win.addEventListener("x", t.unreached_func("window event listener not removed")); + doc.open(); + win.dispatchEvent(new Event("x")); + doc.close(); +}, "Custom event listeners are to be removed from Window for a non-active document that is the associated Document of a Window (frame is removed)"); + +test(t => { + const doc = document.implementation.createHTMLDocument(); + let happened = false; + window.addEventListener("createHTMLDocumentTest", t.step_func(() => { happened = true; })); + doc.open(); + window.dispatchEvent(new Event("createHTMLDocumentTest")); + assert_true(happened); +}, "Custom event listeners are NOT to be removed from Window for a Window-less document (createHTMLDocument)"); + +test(t => { + const doc = new DOMParser().parseFromString("", "text/html"); + let happened = false; + window.addEventListener("DOMParserTest", t.step_func(() => { happened = true; })); + doc.open(); + window.dispatchEvent(new Event("DOMParserTest")); + assert_true(happened); +}, "Custom event listeners are NOT to be removed from Window for a Window-less document (DOMParser)"); + +async_test(t => { + const xhr = new XMLHttpRequest(); + xhr.onload = t.step_func_done(() => { + assert_equals(xhr.status, 200); + const doc = xhr.responseXML; + let happened = false; + window.addEventListener("XHRTest", t.step_func(() => { happened = true; })); + doc.open(); + window.dispatchEvent(new Event("XHRTest")); + assert_true(happened); + }); + xhr.responseType = "document"; + xhr.open("GET", "resources/dummy.html"); + xhr.send(); +}, "Custom event listeners are NOT to be removed from Window for a Window-less document (XMLHttpRequest)"); + test(t => { const frame = document.body.appendChild(document.createElement("iframe")), body = frame.contentDocument.body;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html new file mode 100644 index 0000000..a1ab01e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html
@@ -0,0 +1 @@ +<iframe src="/common/blank.html"></iframe>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window-expected.txt index 4e75b86..5c30e08 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window-expected.txt
@@ -1,6 +1,6 @@ This is a testharness.js-based test. PASS document.open() changes document's URL (fully active document) -FAIL document.open() does not change document's URL (active but not fully active document) Cannot read property 'contentDocument' of null +FAIL document.open() does not change document's URL (active but not fully active document) assert_equals: expected "http://web-platform.test:8001/common/blank.html" but got "http://web-platform.test:8001/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window.html" FAIL document.open() does not change document's URL (non-active document with an associated Window object; frame is removed) assert_equals: expected "about:blank" but got "http://web-platform.test:8001/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window.html" FAIL document.open() does not change document's URL (non-active document with an associated Window object; navigated away) assert_equals: expected "about:blank" but got "http://web-platform.test:8001/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window.html" FAIL document.open() does not change document's URL (non-active document without an associated Window object) assert_equals: expected "about:blank" but got "http://web-platform.test:8001/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/url.window.html"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1-expected.txt deleted file mode 100644 index e65e176..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL The error event from an event listener should fire on that listener's global assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2-expected.txt deleted file mode 100644 index e65e176..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL The error event from an event listener should fire on that listener's global assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/infrastructure/META.yml b/third_party/WebKit/LayoutTests/external/wpt/infrastructure/META.yml index 59b44af33..c1d3b0c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/infrastructure/META.yml +++ b/third_party/WebKit/LayoutTests/external/wpt/infrastructure/META.yml
@@ -2,4 +2,3 @@ - gsnedders - jgraham - jugglinmike - - kereliuk
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/cssom-view.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/cssom-view.idl index 0213a40..2b5b381d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/cssom-view.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/cssom-view.idl
@@ -3,7 +3,7 @@ // (https://github.com/tidoust/reffy-reports) // Source: CSSOM View Module (https://drafts.csswg.org/cssom-view/) -enum ScrollBehavior { "auto", "instant", "smooth" }; +enum ScrollBehavior { "auto", "smooth" }; dictionary ScrollOptions { ScrollBehavior behavior = "auto";
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl index 7bd2ae1..d844f7c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl
@@ -18,6 +18,7 @@ readonly attribute DOMString? shippingOption; readonly attribute PaymentShippingType? shippingType; + attribute EventHandler onmerchantvalidation; attribute EventHandler onshippingaddresschange; attribute EventHandler onshippingoptionchange; attribute EventHandler onpaymentmethodchange; @@ -178,6 +179,17 @@ DOMString phone; }; +[Constructor(DOMString type, optional MerchantValidationEventInit eventInitDict), +SecureContext, Exposed=Window] +interface MerchantValidationEvent : Event { + readonly attribute USVString validationURL; + void complete(Promise<any> merchantSessionPromise); +}; + +dictionary MerchantValidationEventInit : EventInit { + USVString validationURL = ""; +}; + [Constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict), SecureContext, Exposed=Window] interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent { readonly attribute DOMString methodName;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/wai-aria.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/wai-aria.idl new file mode 100644 index 0000000..c6ea959 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/wai-aria.idl
@@ -0,0 +1,59 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into reffy-reports +// (https://github.com/tidoust/reffy-reports) +// Source: Accessible Rich Internet Applications (WAI-ARIA) 1.2 (https://w3c.github.io/aria/) + +interface mixin AccessibilityRole { + attribute DOMString? role; +}; +Element includes AccessibilityRole; + +interface mixin AriaAttributes { + attribute DOMString? ariaActiveDescendant; + attribute DOMString? ariaAtomic; + attribute DOMString? ariaAutoComplete; + attribute DOMString? ariaBusy; + attribute DOMString? ariaChecked; + attribute DOMString? ariaColCount; + attribute DOMString? ariaColIndex; + attribute DOMString? ariaColSpan; + attribute DOMString? ariaControls; + attribute DOMString? ariaCurrent; + attribute DOMString? ariaDescribedBy; + attribute DOMString? ariaDetails; + attribute DOMString? ariaDisabled; + attribute DOMString? ariaErrorMessage; + attribute DOMString? ariaExpanded; + attribute DOMString? ariaFlowTo; + attribute DOMString? ariaHasPopup; + attribute DOMString? ariaHidden; + attribute DOMString? ariaInvalid; + attribute DOMString? ariaKeyShortcuts; + attribute DOMString? ariaLabel; + attribute DOMString? ariaLabelledBy; + attribute DOMString? ariaLevel; + attribute DOMString? ariaLive; + attribute DOMString? ariaModal; + attribute DOMString? ariaMultiLine; + attribute DOMString? ariaMultiSelectable; + attribute DOMString? ariaOrientation; + attribute DOMString? ariaOwns; + attribute DOMString? ariaPlaceholder; + attribute DOMString? ariaPosInSet; + attribute DOMString? ariaPressed; + attribute DOMString? ariaReadOnly; + attribute DOMString? ariaRelevant; + attribute DOMString? ariaRequired; + attribute DOMString? ariaRoleDescription; + attribute DOMString? ariaRowCount; + attribute DOMString? ariaRowIndex; + attribute DOMString? ariaRowSpan; + attribute DOMString? ariaSelected; + attribute DOMString? ariaSetSize; + attribute DOMString? ariaSort; + attribute DOMString? ariaValueMax; + attribute DOMString? ariaValueMin; + attribute DOMString? ariaValueNow; + attribute DOMString? ariaValueText; +}; +Element includes AriaAttributes;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt index 799a45e..cde1059 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt
@@ -13,6 +13,7 @@ PASS PaymentRequest interface: attribute shippingAddress PASS PaymentRequest interface: attribute shippingOption PASS PaymentRequest interface: attribute shippingType +FAIL PaymentRequest interface: attribute onmerchantvalidation assert_true: The prototype object must have a property "onmerchantvalidation" expected true got false PASS PaymentRequest interface: attribute onshippingaddresschange PASS PaymentRequest interface: attribute onshippingoptionchange FAIL PaymentRequest interface: attribute onpaymentmethodchange assert_true: The prototype object must have a property "onpaymentmethodchange" expected true got false @@ -26,6 +27,7 @@ PASS PaymentRequest interface: paymentRequest must inherit property "shippingAddress" with the proper type PASS PaymentRequest interface: paymentRequest must inherit property "shippingOption" with the proper type PASS PaymentRequest interface: paymentRequest must inherit property "shippingType" with the proper type +FAIL PaymentRequest interface: paymentRequest must inherit property "onmerchantvalidation" with the proper type assert_inherits: property "onmerchantvalidation" not found in prototype chain PASS PaymentRequest interface: paymentRequest must inherit property "onshippingaddresschange" with the proper type PASS PaymentRequest interface: paymentRequest must inherit property "onshippingoptionchange" with the proper type FAIL PaymentRequest interface: paymentRequest must inherit property "onpaymentmethodchange" with the proper type assert_inherits: property "onpaymentmethodchange" not found in prototype chain @@ -66,6 +68,19 @@ PASS PaymentResponse interface: operation complete(PaymentComplete) PASS PaymentResponse interface: operation retry(PaymentValidationErrors) FAIL PaymentResponse interface: attribute onpayerdetailchange assert_true: The prototype object must have a property "onpayerdetailchange" expected true got false +FAIL MerchantValidationEvent interface: existence and properties of interface object assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface object length assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface object name assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface: attribute validationURL assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent interface: operation complete([object Object]) assert_own_property: self does not have own property "MerchantValidationEvent" expected property "MerchantValidationEvent" missing +FAIL MerchantValidationEvent must be primary interface of new MerchantValidationEvent("merchantvalidation") assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: MerchantValidationEvent is not defined" +FAIL Stringification of new MerchantValidationEvent("merchantvalidation") assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: MerchantValidationEvent is not defined" +FAIL MerchantValidationEvent interface: new MerchantValidationEvent("merchantvalidation") must inherit property "validationURL" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: MerchantValidationEvent is not defined" +FAIL MerchantValidationEvent interface: new MerchantValidationEvent("merchantvalidation") must inherit property "complete([object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: MerchantValidationEvent is not defined" +FAIL MerchantValidationEvent interface: calling complete([object Object]) on new MerchantValidationEvent("merchantvalidation") with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: MerchantValidationEvent is not defined" FAIL PaymentMethodChangeEvent interface: existence and properties of interface object assert_own_property: self does not have own property "PaymentMethodChangeEvent" expected property "PaymentMethodChangeEvent" missing FAIL PaymentMethodChangeEvent interface object length assert_own_property: self does not have own property "PaymentMethodChangeEvent" expected property "PaymentMethodChangeEvent" missing FAIL PaymentMethodChangeEvent interface object name assert_own_property: self does not have own property "PaymentMethodChangeEvent" expected property "PaymentMethodChangeEvent" missing
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js index 9a068c6..53ae47e8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js
@@ -25,6 +25,7 @@ PaymentRequest: ['paymentRequest'], PaymentMethodChangeEvent: ['new PaymentMethodChangeEvent("paymentmethodchange")'], PaymentRequestUpdateEvent: ['new PaymentRequestUpdateEvent("paymentrequestupdate")'], + MerchantValidationEvent: ['new MerchantValidationEvent("merchantvalidation")'], }); } );
diff --git a/third_party/WebKit/LayoutTests/external/wpt/preload/preload-strict-dynamic.html b/third_party/WebKit/LayoutTests/external/wpt/preload/preload-strict-dynamic.html index 5e473a1..7639565 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/preload/preload-strict-dynamic.html +++ b/third_party/WebKit/LayoutTests/external/wpt/preload/preload-strict-dynamic.html
@@ -22,7 +22,7 @@ } window.addEventListener("securitypolicyviolation", (e) => { counter++; - if (e.violatedDirective == "script-src" && e.blockedURI.includes("static-no-nonce")) { + if (e.violatedDirective == "script-src-elem" && e.blockedURI.includes("static-no-nonce")) { cspViolation = true; } });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/generic_sensor_mocks.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/generic_sensor_mocks.js index 24a4691..d9a23f4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/generic_sensor_mocks.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/generic_sensor_mocks.js
@@ -109,7 +109,7 @@ this.readingSizeInBytes_ = device.mojom.SensorInitParams.kReadBufferSizeForTests; this.sharedBufferSizeInBytes_ = this.readingSizeInBytes_ * - device.mojom.SensorType.LAST; + (device.mojom.SensorType.RELATIVE_ORIENTATION_QUATERNION + 1); let rv = Mojo.createSharedBuffer(this.sharedBufferSizeInBytes_); assert_equals(rv.result, Mojo.RESULT_OK, "Failed to create buffer"); this.sharedBufferHandle_ = rv.handle; @@ -130,8 +130,7 @@ } async getSensor(type) { - const offset = (device.mojom.SensorType.LAST - type) * - this.readingSizeInBytes_; + const offset = type * this.readingSizeInBytes_; const reportingMode = device.mojom.ReportingMode.ON_CHANGE; let sensorPtr = new device.mojom.SensorPtr();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/sensor.mojom.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/sensor.mojom.js index daa9921..ffbd25b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/sensor.mojom.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/sensor.mojom.js
@@ -20,8 +20,7 @@ var SensorType = {}; - SensorType.FIRST = 1; - SensorType.AMBIENT_LIGHT = SensorType.FIRST; + SensorType.AMBIENT_LIGHT = 0; SensorType.PROXIMITY = SensorType.AMBIENT_LIGHT + 1; SensorType.ACCELEROMETER = SensorType.PROXIMITY + 1; SensorType.LINEAR_ACCELERATION = SensorType.ACCELEROMETER + 1; @@ -32,10 +31,10 @@ SensorType.ABSOLUTE_ORIENTATION_QUATERNION = SensorType.ABSOLUTE_ORIENTATION_EULER_ANGLES + 1; SensorType.RELATIVE_ORIENTATION_EULER_ANGLES = SensorType.ABSOLUTE_ORIENTATION_QUATERNION + 1; SensorType.RELATIVE_ORIENTATION_QUATERNION = SensorType.RELATIVE_ORIENTATION_EULER_ANGLES + 1; - SensorType.LAST = SensorType.RELATIVE_ORIENTATION_QUATERNION; SensorType.isKnownEnumValue = function(value) { switch (value) { + case 0: case 1: case 2: case 3: @@ -46,7 +45,6 @@ case 8: case 9: case 10: - case 11: return true; } return false;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js index a088bc4..746f3e6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -2894,6 +2894,11 @@ // value 0." assert_equals(desc.get.length, 0, "getter length must be 0"); + // "Let name be the string "get " prepended to attribute’s identifier." + // "Perform ! SetFunctionName(F, name)." + assert_equals(desc.get.name, "get " + member.name, + "getter must have the name 'get " + member.name + "'"); + // TODO: Test calling setter on the interface prototype (should throw // TypeError in most cases). @@ -2934,6 +2939,11 @@ // "The value of the Function object’s “length” property is the Number // value 1." assert_equals(desc.set.length, 1, "setter length must be 1"); + + // "Let name be the string "set " prepended to id." + // "Perform ! SetFunctionName(F, name)." + assert_equals(desc.set.name, "set " + member.name, + "The attribute setter must have the name 'set " + member.name + "'"); } Promise.all(pendingPromises).then(a_test.done.bind(a_test));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/navigation-redirect.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/navigation-redirect.https.html index 0f1d377..0490f2b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/navigation-redirect.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/navigation-redirect.https.html
@@ -50,7 +50,7 @@ wait_for_state(t, workers[1], 'activated'), // This promise will resolve when |wait_for_worker_promise| // in OTHER_ORIGIN_IFRAME_URL resolves. - send_to_iframe(other_origin_frame, 'wait_for_worker')]); + send_to_iframe(other_origin_frame, {command: 'wait_for_worker'})]); }, 'initialize global state'); function get_effective_worker(registration) { @@ -67,9 +67,12 @@ urls.push(await get_intercepted_urls(workers[0])); urls.push(await get_intercepted_urls(workers[1])); // Gets the request URLs which are intercepted by OTHER_ORIGIN_SCOPE's - // SW. This promise will resolve when get_intercepted_urls() in + // SW. This promise will resolve when get_request_infos() in // OTHER_ORIGIN_IFRAME_URL resolves. - urls.push(await send_to_iframe(other_origin_frame, 'get_intercepted_urls')); + const request_infos = await send_to_iframe(other_origin_frame, + {command: 'get_request_infos'}); + urls.push(request_infos.map(info => { return info.url; })); + assert_object_equals(urls, expected_urls, 'Intercepted URLs should match.'); } @@ -77,16 +80,16 @@ // of redirects. // - |expected_last_url| is the expected window.location after the // navigation. -// - |expected_intercepted_urls| is the expected URLs that the service -// workers were dispatched fetch events for. The format is: +// - |expected_request_infos| is the expected requests that the service workers +// were dispatched fetch events for. The format is: // [ -// [urls from workers[0]], -// [urls from workers[1]], -// [urls from cross-origin worker] +// [{url: url1}, {url: url2}], // requests from workers[0], +// [{url: url1}, // requests from workers[1], +// [{url: url1}, {url: url2}] // requests from cross-origin worker // ] function redirect_test(url, expected_last_url, - expected_intercepted_urls, + expected_request_infos, test_name) { promise_test(async t => { const message_promise = new Promise(resolve => { @@ -94,7 +97,13 @@ message_resolvers['last_url'] = resolve; }); const frame = await with_iframe(url); - frame.remove(); + t.add_cleanup(() => { frame.remove(); }); + + const expected_intercepted_urls = expected_request_infos.map(requests => { + return requests.map(info => { + return info.url; + }); + }); await check_all_intercepted_urls(expected_intercepted_urls); const last_url = await message_promise; assert_equals(last_url, expected_last_url, 'Last URL should match.'); @@ -119,297 +128,355 @@ return new Promise(resolve => { message_resolvers[message_id] = resolve; frame.contentWindow.postMessage( - {id: message_id, message: message}, + {id: message_id, message}, host_info['HTTPS_REMOTE_ORIGIN']); }); } -function get_intercepted_urls(worker) { +// Returns an array of the URLs that |worker| received fetch events for: +// [url1, url2] +async function get_intercepted_urls(worker) { + const infos = await get_request_infos(worker); + return infos.map(info => { return info.url; }); +} + +// Returns the requests that |worker| received fetch events for. The return +// value is an array of format: +// [{url: url1}, {url: url2}] +function get_request_infos(worker) { return new Promise(resolve => { var channel = new MessageChannel(); - channel.port1.onmessage = function(msg) { resolve(msg.data.urls); }; - worker.postMessage({port: channel.port2}, [channel.port2]); + channel.port1.onmessage = (msg) => { + resolve(msg.data.requestInfos); + }; + worker.postMessage({command: 'getRequestInfos', port: channel.port2}, + [channel.port2]); }); } +let url; +let url1; +let url2; + // Normal redirect (from out-scope to in-scope). +url = SCOPE1; redirect_test( - OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1), - SCOPE1, - [[SCOPE1], [], []], + OUT_SCOPE + 'url=' + encodeURIComponent(url), + url, + [[{url}], [], []], 'Normal redirect to same-origin scope.'); + + +url = SCOPE1 + '#ref'; redirect_test( OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1) + '#ref', - SCOPE1 + '#ref', - [[SCOPE1 + '#ref'], [], []], + url, + [[{url}], [], []], 'Normal redirect to same-origin scope with a hash fragment.'); + +url = SCOPE1 + '#ref2'; redirect_test( - OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref', - SCOPE1 + '#ref2', - [[SCOPE1 + '#ref2'], [], []], + OUT_SCOPE + 'url=' + encodeURIComponent(url) + '#ref', + url, + [[{url}], [], []], 'Normal redirect to same-origin scope with different hash fragments.'); + +url = OTHER_ORIGIN_SCOPE; redirect_test( - OUT_SCOPE + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, - [[], [], [OTHER_ORIGIN_SCOPE]], + OUT_SCOPE + 'url=' + encodeURIComponent(url), + url, + [[], [], [{url}]], 'Normal redirect to other-origin scope.'); + // SW fallbacked redirect. SW doesn't handle the fetch request. +url = SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE); redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE), + url, OUT_SCOPE, - [[SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE)], [], []], + [[{url}], [], []], 'SW-fallbacked redirect to same-origin out-scope.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1); +url2 = SCOPE1; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(SCOPE1), - SCOPE1, - [[SCOPE1 + 'url=' + encodeURIComponent(SCOPE1), SCOPE1], [], []], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'SW-fallbacked redirect to same-origin same-scope.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref'; +url2 = SCOPE1 + '#ref'; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref', - SCOPE1 + '#ref', - [ - [SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref', SCOPE1 + '#ref'], - [], - [] - ], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'SW-fallbacked redirect to same-origin same-scope with a hash fragment.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref'; +url2 = SCOPE1 + '#ref2'; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref', - SCOPE1 + '#ref2', - [ - [ - SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref', - SCOPE1 + '#ref2' - ], - [], - [] - ], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'SW-fallbacked redirect to same-origin same-scope with different hash ' + 'fragments.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE2); +url2 = SCOPE2; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(SCOPE2), - SCOPE2, - [[SCOPE1 + 'url=' + encodeURIComponent(SCOPE2)], [SCOPE2], []], + url1, + url2, + [[{url: url1}], [{url: url2}], []], 'SW-fallbacked redirect to same-origin other-scope.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); +url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE), - OTHER_ORIGIN_OUT_SCOPE, - [[SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE)], [], []], + url1, + url2, + [[{url: url1}], [], []], 'SW-fallbacked redirect to other-origin out-scope.'); + +url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); +url2 = OTHER_ORIGIN_SCOPE; redirect_test( - SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, - [ - [SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE)], - [], - [OTHER_ORIGIN_SCOPE] - ], + url1, + url2, + [[{url: url1}], [], [{url: url2}]], 'SW-fallbacked redirect to other-origin in-scope.'); + // SW generated redirect. // SW: event.respondWith(Response.redirect(params['url'])); +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE); +url2 = OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE), - OUT_SCOPE, - [[SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE)], [], []], + url1, + url2, + [[{url: url1}], [], []], 'SW-generated redirect to same-origin out-scope.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref'; +url2 = OUT_SCOPE + '#ref'; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref', - OUT_SCOPE + '#ref', - [ - [SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref'], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'SW-generated redirect to same-origin out-scope with a hash fragment.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref'; +url2 = OUT_SCOPE + '#ref2'; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref', - OUT_SCOPE + '#ref2', - [ - [SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref'], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'SW-generated redirect to same-origin out-scope with different hash ' + 'fragments.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE1); +url2 = SCOPE1; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE1), - SCOPE1, - [[SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE1), SCOPE1], [], []], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'SW-generated redirect to same-origin same-scope.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2); +url2 = SCOPE2; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2), - SCOPE2, - [[SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2)], [SCOPE2], []], + url1, + url2, + [[{url: url1}], [{url: url2}], []], 'SW-generated redirect to same-origin other-scope.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); +url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE), - OTHER_ORIGIN_OUT_SCOPE, - [ - [SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE)], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'SW-generated redirect to other-origin out-scope.'); + +url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); +url2 = OTHER_ORIGIN_SCOPE; redirect_test( - SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, + url1, + url2, [ - [SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE)], + [{url: url1}], [], - [OTHER_ORIGIN_SCOPE] + [{url: url2}] ], 'SW-generated redirect to other-origin in-scope.'); + // SW fetched redirect. // SW: event.respondWith(fetch(event.request)); +url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE) +url2 = OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE), - OUT_SCOPE, - [[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE)], - [], - []], + url1, + url2, + [[{url: url1}], [], []], 'SW-fetched redirect to same-origin out-scope.'); + +url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1); +url2 = SCOPE1; redirect_test( - SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1), - SCOPE1, - [[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1), SCOPE1], [], []], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'SW-fetched redirect to same-origin same-scope.'); + +url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2); +url2 = SCOPE2; redirect_test( - SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2), - SCOPE2, + url1, + url2, [ - [SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2)], - [SCOPE2], + [{url: url1}], + [{url: url2}], [] ], 'SW-fetched redirect to same-origin other-scope.'); + +url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); +url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE), - OTHER_ORIGIN_OUT_SCOPE, - [ - [SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE)], - [], - [] - ], 'SW-fetched redirect to other-origin out-scope.'); + url1, + url2, + [[{url: url1}], [], []], + 'SW-fetched redirect to other-origin out-scope.'); + +url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); +url2 = OTHER_ORIGIN_SCOPE; redirect_test( - SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, + url1, + url2, [ - [SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE)], + [{url: url1}], [], - [OTHER_ORIGIN_SCOPE] + [{url: url2}] ], 'SW-fetched redirect to other-origin in-scope.'); + // Opaque redirect. // SW: event.respondWith(fetch( // new Request(event.request.url, {redirect: 'manual'}))); +url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OUT_SCOPE); +url2 = OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OUT_SCOPE), - OUT_SCOPE, - [[SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OUT_SCOPE)], [], []], + url1, + url2, + [[{url: url1}], [], []], 'Redirect to same-origin out-scope with opaque redirect response.'); + +url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1); +url2 = SCOPE1; redirect_test( - SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1), - SCOPE1, - [[SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1), SCOPE1], [], []], + url1, + url2, + [[{url: url1}, {url: url2}], [], []], 'Redirect to same-origin same-scope with opaque redirect response.'); + +url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2); +url2 = SCOPE2; redirect_test( - SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2), - SCOPE2, - [[SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2)], [SCOPE2], []], + url1, + url2, + [[{url: url1}], [{url: url2}], []], 'Redirect to same-origin other-scope with opaque redirect response.'); + +url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); +url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=manual&url=' + - encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE), - OTHER_ORIGIN_OUT_SCOPE, - [ - [SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE)], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'Redirect to other-origin out-scope with opaque redirect response.'); + +url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); +url2 = OTHER_ORIGIN_SCOPE; redirect_test( - SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, - [ - [SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE)], - [], - [OTHER_ORIGIN_SCOPE] - ], + url1, + url2, + [[{url: url1}], [], [{url: url2}]], 'Redirect to other-origin in-scope with opaque redirect response.'); + +url= SCOPE1 + 'sw=manual&noLocationRedirect'; redirect_test( - SCOPE1 + 'sw=manual&noLocationRedirect', - SCOPE1 + 'sw=manual&noLocationRedirect', - [[SCOPE1 + 'sw=manual&noLocationRedirect'], [], []], + url, url, [[{url}], [], []], 'No location redirect response.'); + // Opaque redirect passed through Cache. // SW responds with an opaque redirectresponse from the Cache API. +url1 = SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(OUT_SCOPE); +url2 = OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(OUT_SCOPE), - OUT_SCOPE, - [ - [SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(OUT_SCOPE)], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'Redirect to same-origin out-scope with opaque redirect response which ' + 'is passed through Cache.'); + +url1 = SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE1); +url2 = SCOPE1; redirect_test( - SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE1), - SCOPE1, + url1, + url2, [ - [ - SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE1), - SCOPE1 - ], + [{url: url1}, {url: url2}], [], [] ], 'Redirect to same-origin same-scope with opaque redirect response which ' + 'is passed through Cache.'); + +url1 = SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE2); +url2 = SCOPE2; redirect_test( - SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE2), - SCOPE2, + url1, + url2, [ - [SCOPE1 + 'sw=manualThroughCache&url=' + encodeURIComponent(SCOPE2)], - [SCOPE2], + [{url: url1}], + [{url: url2}], [] ], 'Redirect to same-origin other-scope with opaque redirect response which ' + 'is passed through Cache.'); + +url1 = SCOPE1 + 'sw=manualThroughCache&url=' + + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE); +url2 = OTHER_ORIGIN_OUT_SCOPE; redirect_test( - SCOPE1 + 'sw=manualThroughCache&url=' + - encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE), - OTHER_ORIGIN_OUT_SCOPE, - [ - [SCOPE1 + 'sw=manualThroughCache&url=' + - encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE) - ], - [], - [] - ], + url1, + url2, + [[{url: url1}], [], []], 'Redirect to other-origin out-scope with opaque redirect response which ' + 'is passed through Cache.'); + +url1 = SCOPE1 + 'sw=manualThroughCache&url=' + + encodeURIComponent(OTHER_ORIGIN_SCOPE); +url2 = OTHER_ORIGIN_SCOPE; redirect_test( - SCOPE1 + 'sw=manualThroughCache&url=' + - encodeURIComponent(OTHER_ORIGIN_SCOPE), - OTHER_ORIGIN_SCOPE, + url1, + url2, [ - [SCOPE1 + 'sw=manualThroughCache&url=' + - encodeURIComponent(OTHER_ORIGIN_SCOPE)], - [], - [OTHER_ORIGIN_SCOPE], + [{url: url1}], + [], + [{url: url2}], ], 'Redirect to other-origin in-scope with opaque redirect response which ' + 'is passed through Cache.'); + +url = SCOPE1 + 'sw=manualThroughCache&noLocationRedirect'; redirect_test( - SCOPE1 + 'sw=manualThroughCache&noLocationRedirect', - SCOPE1 + 'sw=manualThroughCache&noLocationRedirect', - [[SCOPE1 + 'sw=manualThroughCache&noLocationRedirect'], [], []], + url, + url, + [[{url}], [], []], 'No location redirect response via Cache.'); // Clean up the test environment. This promise_test() needs to be the last one. @@ -418,7 +485,7 @@ if (registration) await registration.unregister(); }); - await send_to_iframe(other_origin_frame, 'unregister'); + await send_to_iframe(other_origin_frame, {command: 'unregister'}); other_origin_frame.remove(); }, 'clean up global state'); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/redirected-response.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/redirected-response.https.html index f7370e0..05a94e2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/redirected-response.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/redirected-response.https.html
@@ -49,12 +49,15 @@ }); } -function take_intercepted_urls() { - return new Promise((resolve) => { - let channel = new MessageChannel(); - channel.port1.onmessage = msg => { resolve(msg.data.urls); }; - worker.postMessage({port: channel.port2}, [channel.port2]); - }); +async function take_intercepted_urls() { + const message = new Promise((resolve) => { + let channel = new MessageChannel(); + channel.port1.onmessage = msg => { resolve(msg.data.requestInfos); }; + worker.postMessage({command: 'getRequestInfos', port: channel.port2}, + [channel.port2]); + }); + const request_infos = await message; + return request_infos.map(info => { return info.url; }); } function check_intercepted_urls(expected_urls) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/navigation-redirect-other-origin.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/navigation-redirect-other-origin.html index a9483c6..0d2825f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/navigation-redirect-other-origin.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/navigation-redirect-other-origin.html
@@ -33,12 +33,15 @@ host_info['HTTPS_ORIGIN']); } -function get_intercepted_urls(worker) { +function get_request_infos(worker) { return new Promise(function(resolve) { - var channel = new MessageChannel(); - channel.port1.onmessage = function(msg) { resolve(msg.data.urls); }; - worker.postMessage({port: channel.port2}, [channel.port2]); - }); + var channel = new MessageChannel(); + channel.port1.onmessage = (msg) => { + resolve(msg.data.requestInfos); + }; + worker.postMessage({command: 'getRequestInfos', port: channel.port2}, + [channel.port2]); + }); } window.addEventListener('message', on_message, false); @@ -48,14 +51,15 @@ console.error('invalid origin: ' + e.origin); return; } - if (e.data.message == 'wait_for_worker') { + const command = e.data.message.command; + if (command == 'wait_for_worker') { wait_for_worker_promise.then(function() { send_result(e.data.id, 'ok'); }); - } else if (e.data.message == 'get_intercepted_urls') { - get_intercepted_urls(worker) - .then(function(urls) { - send_result(e.data.id, urls); + } else if (command == 'get_request_infos') { + get_request_infos(worker) + .then(function(data) { + send_result(e.data.id, data); }); - } else if (e.data.message == 'unregister') { + } else if (command == 'unregister') { registration.unregister() .then(function() { send_result(e.data.id, 'ok');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/redirect-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/redirect-worker.js index 7e5ead1..5258c5e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/redirect-worker.js +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/redirect-worker.js
@@ -5,20 +5,33 @@ var waitUntilPromiseList = []; -self.addEventListener('message', function(event) { - var urls; - event.waitUntil(Promise.all(waitUntilPromiseList).then(function() { - waitUntilPromiseList = []; - return caches.open(cacheName); - }).then(function(cache) { - return cache.keys(); - }).then(function(requestList) { - urls = requestList.map(function(request) { return request.url; }); - return caches.delete(cacheName); - }).then(function() { - event.data.port.postMessage({urls: urls}); - })); - }); +async function getRequestInfos(event) { + // Wait for fetch events to finish. + await Promise.all(waitUntilPromiseList); + waitUntilPromiseList = []; + + // Generate the message. + const cache = await caches.open(cacheName); + const requestList = await cache.keys(); + const requestInfos = []; + for (let i = 0; i < requestList.length; i++) { + requestInfos[i] = { + url: requestList[i].url, + }; + } + await caches.delete(cacheName); + + event.data.port.postMessage({requestInfos}); +} + +self.addEventListener('message', async function(event) { + if (event.data.command == 'getRequestInfos') { + event.waitUntil(getRequestInfos(event)); + return; + } + + // TODO(falken): Add a getClientInfos command to test Clients API. +}); function get_query_params(url) { var search = (new URL(url)).search;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/patched-global.js b/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/patched-global.js index e8117c48..c75b21e8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/patched-global.js +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/patched-global.js
@@ -47,7 +47,6 @@ const oldReadableStream = self.ReadableStream; - /* eslint-disable no-native-reassign */ self.ReadableStream = function() { throw new Error('ReadableStream called on global object'); }; @@ -60,8 +59,6 @@ assert_true(isReadableStream(branch1), 'branch1 should be a ReadableStream'); assert_true(isReadableStream(branch2), 'branch2 should be a ReadableStream'); - - /* eslint-enable no-native-reassign */ }, 'ReadableStream tee() should not call the global ReadableStream'); done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/patched-global.js b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/patched-global.js index d27b9cdd..f5d32c0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/patched-global.js +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/patched-global.js
@@ -21,8 +21,6 @@ }, 'TransformStream constructor should not call setters for highWaterMark or size'); test(t => { - /* eslint-disable no-native-reassign */ - const oldReadableStream = ReadableStream; const oldWritableStream = WritableStream; const getReader = ReadableStream.prototype.getReader; @@ -47,7 +45,6 @@ 'getReader should work when called on ts.readable'); assert_not_equals(getWriter.call(ts.writable), undefined, 'getWriter should work when called on ts.writable'); - /* eslint-enable no-native-reassign */ }, 'TransformStream should use the original value of ReadableStream and WritableStream'); done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/Element-setAttribute.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/Element-setAttribute.tentative.html new file mode 100644 index 0000000..a284b2f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/Element-setAttribute.tentative.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/helper.sub.js"></script> +</head> +<body> +<script> + // TrustedURL Assignments + let testCases = [ + [ 'a', 'href' ], + [ 'area', 'href' ], + [ 'base', 'href' ], + [ 'frame', 'src' ], + [ 'iframe', 'src' ], + [ 'img', 'src' ], + [ 'input', 'src' ], + [ 'link', 'href' ], + [ 'video', 'src' ], + [ 'object', 'data' ], + [ 'object', 'codeBase' ], + [ 'source', 'src' ], + [ 'track', 'src' ] + ]; + + testCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_url_explicit_set(window, c, t, c[0], c[1], RESULTS.URL); + }, c[0] + "." + c[1] + " assigned via policy (successful URL transformation)"); + }); + + // TrustedScriptURL Assignments + let scriptTestCases = [ + [ 'embed', 'src' ], + [ 'script', 'src' ] + ]; + + scriptTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_script_url_explicit_set(window, c, t, c[0], c[1], RESULTS.SCRIPTURL); + }, c[0] + "." + c[1] + " assigned via policy (successful ScriptURL transformation)"); + }); + + // TrustedHTML Assignments + let HTMLTestCases = [ + [ 'iframe', 'srcdoc' ] + ]; + + HTMLTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_html_explicit_set(window, c, t, c[0], c[1], RESULTS.HTML); + }, c[0] + "." + c[1] + " assigned via policy (successful HTML transformation)"); + }); + + // Other attributes can be assigned with TrustedTypes or strings or null values + test(t => { + assert_element_accepts_trusted_url_explicit_set(window, 'arel', t, 'a', 'rel', RESULTS.URL); + }, "a.rel assigned via policy (successful URL transformation)"); + + test(t => { + assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', 'A string', 'A string'); + }, "a.rel accepts strings"); + + test(t => { + assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', null, 'null'); + }, "a.rel accepts null"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/HTMLElement-generic.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/HTMLElement-generic.tentative.html index 08d165a..2d381045 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/HTMLElement-generic.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/HTMLElement-generic.tentative.html
@@ -6,6 +6,7 @@ </head> <body> <script> + var testnb = 0; // TrustedURL Assignments let testCases = [ [ 'a', 'href' ], @@ -25,7 +26,7 @@ testCases.forEach(c => { test(t => { - assert_element_accepts_trusted_url(window, c, t, c[0], c[1], RESULTS.URL); + assert_element_accepts_trusted_url(window, ++testnb, t, c[0], c[1], RESULTS.URL); }, c[0] + "." + c[1] + " assigned via policy (successful URL transformation)"); }); @@ -35,9 +36,10 @@ [ 'script', 'src' ] ]; + testnb = 0; scriptTestCases.forEach(c => { test(t => { - assert_element_accepts_trusted_script_url(window, c, t, c[0], c[1], RESULTS.SCRIPTURL); + assert_element_accepts_trusted_script_url(window, ++testnb, t, c[0], c[1], RESULTS.SCRIPTURL); }, c[0] + "." + c[1] + " assigned via policy (successful ScriptURL transformation)"); }); @@ -47,9 +49,10 @@ [ 'iframe', 'srcdoc' ] ]; + testnb = 0; HTMLTestCases.forEach(c => { test(t => { - assert_element_accepts_trusted_html(window, c, t, c[0], c[1], RESULTS.HTML); + assert_element_accepts_trusted_html(window, ++testnb, t, c[0], c[1], RESULTS.HTML); }, c[0] + "." + c[1] + " assigned via policy (successful HTML transformation)"); }); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html new file mode 100644 index 0000000..49a9506b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js" ></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<meta http-equiv="Content-Security-Policy" content="trusted-types"> +<body> +<script> + //No name given test + test(t => { + let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } ); + assert_equals(policy.name, 'SomeName'); + }, "No name list given - policy creation works"); +</script> +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html new file mode 100644 index 0000000..9daf20e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.tentative.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js" ></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<meta http-equiv="Content-Security-Policy" content="trusted-types SomeName JustOneMoreName"> +<body> +<script> + //Whitelisted name test + test(t => { + let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } ); + assert_equals(policy.name, 'SomeName'); + }, "Whitelisted policy creation works"); + //Another whitelisted name test + test(t => { + let policy = window.TrustedTypes.createPolicy('JustOneMoreName', { createHTML: s => s } ); + assert_equals(policy.name, 'JustOneMoreName'); + }, "Another whitelisted policy creation works"); + //Non-whitelisted names test + test(t => { + assert_throws(new TypeError(), _ => { + window.TrustedTypes.createPolicy('SomeOtherName', { createURL: s => s } ); + }); + }, "Non-whitelisted policy creation throws"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html index e5959a42..366bdd2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html
@@ -3,7 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> -<meta http-equiv="Content-Security-Policy" content="require-trusted-types"> +<meta http-equiv="Content-Security-Policy" content="trusted-types"> <body> <script> // Trusted HTML assignments do not throw.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Document-write.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Document-write.tentative.html index 06532c3..ce530d4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Document-write.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Document-write.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-insertAdjacentHTML.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-insertAdjacentHTML.tentative.html index 1fb3bbd..593d6c6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-insertAdjacentHTML.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-insertAdjacentHTML.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <div id="container"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-outerHTML.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-outerHTML.tentative.html index abb5952..c9bde5e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-outerHTML.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-outerHTML.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <div id="container"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html new file mode 100644 index 0000000..52e3170 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html
@@ -0,0 +1,76 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="support/helper.sub.js"></script> + + <meta http-equiv="Content-Security-Policy" content="trusted-types"> +</head> +<body> +<script> + // TrustedURL Assignments + let testCases = [ + [ 'a', 'href' ], + [ 'area', 'href' ], + [ 'base', 'href' ], + [ 'frame', 'src' ], + [ 'iframe', 'src' ], + [ 'img', 'src' ], + [ 'input', 'src' ], + [ 'link', 'href' ], + [ 'video', 'src' ], + [ 'object', 'data' ], + [ 'object', 'codeBase' ], + [ 'source', 'src' ], + [ 'track', 'src' ] + ]; + + testCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_url_explicit_set(window, c, t, c[0], c[1], RESULTS.URL); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string'); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], null); + }, c[0] + "." + c[1] + " accepts only TrustedURL"); + }); + + // TrustedScriptURL Assignments + let scriptTestCases = [ + [ 'embed', 'src' ], + [ 'script', 'src' ] + ]; + + scriptTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_script_url_explicit_set(window, c, t, c[0], c[1], RESULTS.SCRIPTURL); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string'); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], null); + }, c[0] + "." + c[1] + " accepts only TrustedScriptURL"); + }); + + // TrustedHTML Assignments + let HTMLTestCases = [ + [ 'iframe', 'srcdoc' ] + ]; + + HTMLTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_html_explicit_set(window, c, t, c[0], c[1], RESULTS.HTML); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string'); + assert_throws_no_trusted_type_explicit_set(c[0], c[1], null); + }, c[0] + "." + c[1] + " accepts only TrustedHTML"); + }); + + // Other attributes can be assigned with TrustedTypes or strings or null values + test(t => { + assert_element_accepts_trusted_url_explicit_set(window, 'arel', t, 'a', 'rel', RESULTS.URL); + }, "a.rel assigned via policy (successful URL transformation)"); + + test(t => { + assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', 'A string', 'A string'); + }, "a.rel accepts strings"); + + test(t => { + assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', null, 'null'); + }, "a.rel accepts null"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html index 7b1a579..f31fce62 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html
@@ -5,10 +5,11 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script> + var testnb = 0; // TrustedURL Assignments let testCases = [ [ 'a', 'href' ], @@ -28,7 +29,7 @@ testCases.forEach(c => { test(t => { - assert_element_accepts_trusted_url(window, c, t, c[0], c[1], RESULTS.URL); + assert_element_accepts_trusted_url(window, ++testnb, t, c[0], c[1], RESULTS.URL); assert_throws_no_trusted_type(c[0], c[1], 'A string'); assert_throws_no_trusted_type(c[0], c[1], null); }, c[0] + "." + c[1] + " accepts only TrustedURL"); @@ -40,9 +41,10 @@ [ 'script', 'src' ] ]; + testnb = 0; scriptTestCases.forEach(c => { test(t => { - assert_element_accepts_trusted_script_url(window, c, t, c[0], c[1], RESULTS.SCRIPTURL); + assert_element_accepts_trusted_script_url(window, ++testnb, t, c[0], c[1], RESULTS.SCRIPTURL); assert_throws_no_trusted_type(c[0], c[1], 'A string'); assert_throws_no_trusted_type(c[0], c[1], null); }, c[0] + "." + c[1] + " accepts only TrustedScriptURL"); @@ -54,9 +56,10 @@ [ 'iframe', 'srcdoc' ] ]; + testnb = 0; HTMLTestCases.forEach(c => { test(t => { - assert_element_accepts_trusted_html(window, c, t, c[0], c[1], RESULTS.HTML); + assert_element_accepts_trusted_html(window, ++testnb, t, c[0], c[1], RESULTS.HTML); assert_throws_no_trusted_type(c[0], c[1], 'A string'); assert_throws_no_trusted_type(c[0], c[1], null); }, c[0] + "." + c[1] + " accepts only TrustedHTML");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html index cd375b9..5de5fec 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html index 14fbcb2f..2431261 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html index 9d00fcd..40752157 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html index ff9be06..1cae5c74 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html
@@ -3,7 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> -<meta http-equiv="Content-Security-Policy" content="require-trusted-types"> +<meta http-equiv="Content-Security-Policy" content="trusted-types"> <body> <script> // TrustedHTML assignments do not throw.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html index ae4b038..8070b4a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html
@@ -5,7 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="support/helper.sub.js"></script> - <meta http-equiv="Content-Security-Policy" content="require-trusted-types"> + <meta http-equiv="Content-Security-Policy" content="trusted-types"> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/support/helper.sub.js b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/support/helper.sub.js index 617e02a..1ad5b4e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/trusted-types/support/helper.sub.js +++ b/third_party/WebKit/LayoutTests/external/wpt/trusted-types/support/helper.sub.js
@@ -83,3 +83,46 @@ elem[attribute] = value; }); } + +function assert_element_accepts_trusted_html_explicit_set(win, c, t, tag, attribute, expected) { + let p = createHTML_policy(win, c); + let html = p.createHTML(INPUTS.HTML); + assert_element_accepts_trusted_type_explicit_set(tag, attribute, html, expected); +} + +function assert_element_accepts_trusted_script_explicit_set(win, c, t, tag, attribute, expected) { + let p = createScript_policy(win, c); + let script = p.createScript(INPUTS.SCRIPT); + assert_element_accepts_trusted_type_explicit_set(tag, attribute, script, expected); +} + +function assert_element_accepts_trusted_script_url_explicit_set(win, c, t, tag, attribute, expected) { + let p = createScriptURL_policy(win, c); + let scripturl = p.createScriptURL(INPUTS.SCRIPTURL); + assert_element_accepts_trusted_type_explicit_set(tag, attribute, scripturl, expected); +} + +function assert_element_accepts_trusted_url_explicit_set(win, c, t, tag, attribute, expected) { + let p = createURL_policy(win, c); + let url = p.createURL(INPUTS.URL); + assert_element_accepts_trusted_type_explicit_set(tag, attribute, url, expected); +} + +function assert_element_accepts_trusted_type_explicit_set(tag, attribute, value, expected) { + let elem = document.createElement(tag); + elem.setAttribute(attribute, value); + assert_equals(elem[attribute] + "", expected); +} + +function assert_throws_no_trusted_type_explicit_set(tag, attribute, value) { + let elem = document.createElement(tag); + assert_throws(new TypeError(), _ => { + elem.setAttribute(attribute, value); + }); +} + +function assert_element_accepts_non_trusted_type_explicit_set(tag, attribute, value, expected) { + let elem = document.createElement(tag); + elem.setAttribute(attribute, value); + assert_equals(elem[attribute] + "", expected); +}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions-expected.txt index a4e2355..4c36f41 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions-expected.txt
@@ -1,55 +1,6 @@ This is a testharness.js-based test. -Found 51 tests; 45 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS # AUDIT TASK RUNNER STARTED. -PASS > [setValueCurve] -PASS setValueCurveAtTime(curve, 0.0125, 0.0125) did not throw an exception. -PASS setValueAtTime(1, 0.018750000000000003) threw NotSupportedError: "Failed to execute 'setValueAtTime' on 'AudioParam': setValueAtTime(1, 0.01875) overlaps setValueCurveAtTime(..., 0.0125, 0.0125)". -PASS linearRampToValueAtTime(1, 0.018750000000000003) threw NotSupportedError: "Failed to execute 'linearRampToValueAtTime' on 'AudioParam': linearRampToValueAtTime(1, 0.01875) overlaps setValueCurveAtTime(..., 0.0125, 0.0125)". -PASS exponentialRampToValueAtTime(1, 0.018750000000000003) threw NotSupportedError: "Failed to execute 'exponentialRampToValueAtTime' on 'AudioParam': exponentialRampToValue(1, 0.01875) overlaps setValueCurveAtTime(..., 0.0125, 0.0125)". -PASS setTargetAtTime(1, 0.018750000000000003, 1) threw NotSupportedError: "Failed to execute 'setTargetAtTime' on 'AudioParam': setTargetAtTime(1, 0.01875, 1) overlaps setValueCurveAtTime(..., 0.0125, 0.0125)". -PASS setValueAtTime(1, 0.026250000000000002) did not throw an exception. -PASS < [setValueCurve] All assertions passed. (total 6 assertions) -PASS > [automations] -PASS linearRampToValueAtTime(1, 0.0125) did not throw an exception. -PASS exponentialRampToValueAtTime(1, 0.025) did not throw an exception. -PASS setTargetAtTime(1, 0.037500000000000006, 0.1) did not throw an exception. -PASS setValueCurveAtTime(curve, 0.05, 0.1) did not throw an exception. -PASS setValueCurveAtTime(curve, 0.00625, 0.01) threw NotSupportedError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': setValueCurveAtTime(..., 0.00625, 0.01) overlaps linearRampToValueAtTime(1, 0.0125)". -PASS setValueCurveAtTime(curve, 0.018750000000000003, 0.01) threw NotSupportedError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': setValueCurveAtTime(..., 0.01875, 0.01) overlaps exponentialRampToValue(1, 0.025)". -PASS setValueCurveAtTime(curve, 0.03125, 0.01) threw NotSupportedError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': setValueCurveAtTime(..., 0.03125, 0.01) overlaps setTargetAtTime(1, 0.03750000000000001, 0.1)". -PASS setValueCurveAtTime(curve, 0.043750000000000004, 0.01) threw NotSupportedError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': setValueCurveAtTime(..., 0.04375, 0.01) overlaps setValueCurveAtTime(..., 0.05, 0.1)". -PASS setValueCurveAtTime([NaN, NaN], 0.043750000000000004, 0.01) threw TypeError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': The provided float value is non-finite.". -PASS setValueCurveAtTime([1, Infinity], 0.043750000000000004, 0.01) threw TypeError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': The provided float value is non-finite.". -PASS delayTime.setValueCurveAtTime([1, 5], 0.043750000000000004, 0.01) did not throw an exception. -PASS delayTime.setValueCurveAtTime([1, 5, Infinity], 0.043750000000000004, 0.01) threw TypeError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': The provided float value is non-finite.". -PASS setValueCurveAtTime(curve, 0.031415926535897934, 0.01) threw NotSupportedError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': setValueCurveAtTime(..., 0.03141592653589793, 0.01) overlaps setTargetAtTime(1, 0.03750000000000001, 0.1)". -PASS < [automations] All assertions passed. (total 13 assertions) -PASS > [catch-exception] -PASS Handled setValueCurve exception so output contains only the constant 1. -PASS < [catch-exception] All assertions passed. (total 1 assertions) -PASS > [start-end] -PASS setValueAtTime(1, 0) did not throw an exception. -PASS linearRampToValueAtTime(0, 0.0025) did not throw an exception. -PASS setValueCurveAtTime(..., 0.0025, 0.0025) did not throw an exception. -PASS exponentialRampToValueAtTime(1, 0.0075) did not throw an exception. -PASS setValueCurveAtTime(..., 0.0075, 0.0025) did not throw an exception. -PASS setValueCurveAtTime(..., 0.01, 0.0025) did not throw an exception. -PASS setValueAtTime(0, 0.0125) did not throw an exception. -PASS setValueCurveAtTime(..., 0.0125, 0.0025) did not throw an exception. -PASS setTargetAtTime(1, 0.015000000000000001, 1) did not throw an exception. -PASS < [start-end] All assertions passed. (total 9 assertions) -PASS > [curve overlap] -PASS g.gain.setValueCurveAtTime([1,2,3], 5, 10) did not throw an exception. -FAIL X second g.gain.setValueCurveAtTime([1,2,3], 5, 10) did not throw an exception. assert_true: expected true got false -FAIL X g.gain.setValueCurveAtTime([1,2,3], 5, 5) did not throw an exception. assert_true: expected true got false -FAIL X g.gain.setValueCurveAtTime([1,2,3], 2.5, 10) threw "NotSupportedError" instead of NotSupportedError. assert_true: expected true got false -FAIL X g.gain.setValueCurveAtTime([1,2,3], 10, 10) did not throw an exception. assert_true: expected true got false -FAIL < [curve overlap] 4 out of 5 assertions were failed. assert_true: expected true got false -PASS > [curve lengths] -PASS setValueCurveAtTime([], 0, 0.01) threw InvalidStateError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': The curve length provided (0) is less than the minimum bound (2).". -PASS setValueCurveAtTime([1], 0, 0.01) threw InvalidStateError: "Failed to execute 'setValueCurveAtTime' on 'AudioParam': The curve length provided (1) is less than the minimum bound (2).". -PASS setValueCurveAtTime([1,2], 0, 0.01) did not throw an exception. -PASS < [curve lengths] All assertions passed. (total 3 assertions) -FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 6 tasks were failed. assert_true: expected true got false +FAIL + Test Exceptions from setValueCurveAtTime + Uncaught Error: Audit.define:: Duplicate task definition. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html index 9609d5d1..98f64a0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html
@@ -341,6 +341,77 @@ task.done(); }); + audit.define('curve overlap', (task, should) => { + let context = + new OfflineAudioContext(1, testDurationFrames, sampleRate); + let g = context.createGain(); + let startTime = 5; + let startTimeLater = 10; + let startTimeEarlier = 2.5; + let curveDuration = 10; + let curveDurationShorter = 5; + let curve = [1, 2, 3]; + + // Having an event that ends at time t and then starting a ramp at time + // t should work. + should( + () => { + g.gain.linearRampToValueAtTime(1.0, startTime); + }, + `g.gain.linearRampToValueAtTime(1.0, ${startTime})`) + .notThrow(); + + // An initial curve event, starting from the end of the linear ramp. + should( + () => { + g.gain.setValueCurveAtTime(curve, startTime, curveDuration); + }, + `g.gain.setValueCurveAtTime([${curve}], ${startTime}, ${curveDuration})`) + .notThrow(); + + // Check that an exception is thrown when trying to overlap two curves, + // in various ways + + // Same start time and end time (curve exactly overlapping) + should( + () => { + g.gain.setValueCurveAtTime(curve, startTime, curveDuration); + }, + `second g.gain.setValueCurveAtTime([${curve}], ${startTime}, ${curveDuration})`) + .throw('NotSupportedError'); + // Same start time, shorter end time + should( + () => { + g.gain.setValueCurveAtTime(curve, startTime, curveDurationShorter); + }, + `g.gain.setValueCurveAtTime([${curve}], ${startTime}, ${curveDurationShorter})`) + .throw('NotSupportedError'); + // Earlier start time, end time after the start time of an another curve + should( + () => { + g.gain.setValueCurveAtTime(curve, startTimeEarlier, curveDuration); + }, + `g.gain.setValueCurveAtTime([${curve}], ${startTimeEarlier}, ${curveDuration})`) + .throw('NotSupportedError'); + // Start time after the start time of the other curve, but earlier than + // its end. + should( + () => { + g.gain.setValueCurveAtTime(curve, startTimeLater, curveDuration); + }, + `g.gain.setValueCurveAtTime([${curve}], ${startTimeLater}, ${curveDuration})`) + .throw('NotSupportedError'); + // Setting an event exactly at the end of the curve should work. + should( + () => { + g.gain.setValueAtTime(1.0, startTime + curveDuration); + }, + `g.gain.setValueAtTime(1.0, ${startTime + curveDuration})`) + .notThrow(); + + task.done(); + }); + audit.define('curve lengths', (task, should) => { let context = new OfflineAudioContext(1, testDurationFrames, sampleRate);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt index 4414759..d9dbcec9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/idlharness.https.window-expected.txt
@@ -131,8 +131,8 @@ PASS RTCSessionDescription interface: existence and properties of interface prototype object PASS RTCSessionDescription interface: existence and properties of interface prototype object's "constructor" property PASS RTCSessionDescription interface: existence and properties of interface prototype object's @@unscopables property -FAIL RTCSessionDescription interface: attribute type assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" +FAIL RTCSessionDescription interface: attribute type assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set type() { [native code] }" +FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdp() { [native code] }" PASS RTCSessionDescription interface: operation toJSON() PASS RTCSessionDescription must be primary interface of new RTCSessionDescription({ type: 'offer' }) PASS Stringification of new RTCSessionDescription({ type: 'offer' }) @@ -146,9 +146,9 @@ PASS RTCIceCandidate interface: existence and properties of interface prototype object PASS RTCIceCandidate interface: existence and properties of interface prototype object's "constructor" property PASS RTCIceCandidate interface: existence and properties of interface prototype object's @@unscopables property -FAIL RTCIceCandidate interface: attribute candidate assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCIceCandidate interface: attribute sdpMid assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCIceCandidate interface: attribute sdpMLineIndex assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" +FAIL RTCIceCandidate interface: attribute candidate assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set candidate() { [native code] }" +FAIL RTCIceCandidate interface: attribute sdpMid assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdpMid() { [native code] }" +FAIL RTCIceCandidate interface: attribute sdpMLineIndex assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdpMLineIndex() { [native code] }" FAIL RTCIceCandidate interface: attribute foundation assert_true: The prototype object must have a property "foundation" expected true got false FAIL RTCIceCandidate interface: attribute component assert_true: The prototype object must have a property "component" expected true got false FAIL RTCIceCandidate interface: attribute priority assert_true: The prototype object must have a property "priority" expected true got false
diff --git a/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.html b/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.html index 7e97587..0e958d25 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.html +++ b/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.html
@@ -7,6 +7,9 @@ <meta name="variant" content="?wss"> <div id=log></div> <script> +// This test doesn't work as originally intended, because an insecure page +// cannot set a secure cookie. See 006.https.html for a working version. This +// version is retained for historical purposes. var cookie_id = ((new Date())-0) + '.' + Math.random(); async_test(function(t) { if (window.WebSocket) { @@ -19,11 +22,8 @@ var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/echo-cookie'); ws.onmessage = t.step_func(function(e) { ws.close(); - if (SCHEME_DOMAIN_PORT.substr(0,3) == 'wss') { - assert_regexp_match(e.data, new RegExp('ws_test_'+cookie_id+'=test')); - } else { - assert_false(new RegExp('ws_test_'+cookie_id+'=test').test(e.data)); - } + assert_equals(e.data.indexOf('ws_test_'+cookie_id+'=test'), -1, + 'cookie should not have been set'); t.done(); }) ws.onerror = ws.onclose = t.step_func(function(e) {assert_unreached(e.type)});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.https.html b/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.https.html new file mode 100644 index 0000000..015eeb22 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/websockets/cookies/006.https.html
@@ -0,0 +1,37 @@ +<!doctype html> +<title>WebSockets: setting Secure cookie with document.cookie, checking ws request</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=../constants.js?pipe=sub></script> +<!-- +There's no "ws:" scheme variant of this test because mixed-content checks +won't permit creating an insecure WebSocket on a secure page. +--> +<meta name="variant" content="?wss"> +<div id=log></div> +<script> +var cookie_id = ((new Date())-0) + '.' + Math.random(); +async_test(function(t) { + if (window.WebSocket) { + document.cookie = 'ws_test_'+cookie_id+'=test; Path=/; Secure'; + } + t.add_cleanup(function() { + // remove cookie + document.cookie = 'ws_test_'+cookie_id+'=; Path=/; Secure; Expires=Sun, 06 Nov 1994 08:49:37 GMT'; + }); + var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/echo-cookie'); + ws.onmessage = t.step_func(function(e) { + ws.close(); + var cookie_was_seen = e.data.indexOf('ws_test_'+cookie_id+'=test') != -1; + if (SCHEME_DOMAIN_PORT.substr(0,3) == 'wss') { + assert_true(cookie_was_seen, + 'cookie should have been visible to wss'); + } else { + assert_false(cookie_was_seen, + 'cookie should not have been visible to ws'); + } + t.done(); + }) + ws.onerror = ws.onclose = t.step_func(function(e) {assert_unreached(e.type)}); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/importscripts_mime.tentative.any.js b/third_party/WebKit/LayoutTests/external/wpt/workers/importscripts_mime.tentative.any.js new file mode 100644 index 0000000..04c63a3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/workers/importscripts_mime.tentative.any.js
@@ -0,0 +1,52 @@ +// META: global=!window,worker +// +// Tentative test for https://github.com/whatwg/html/issues/3255 + +let test_cases = [ + // Supported mimetypes: + ["text/javascript", true], + ["application/javascript", true], + ["text/ecmascript", true], + + // Blocked mimetpyes: + ["image/png", false], + ["text/csv", false], + ["video/mpeg", false], + + // Legacy mimetypes: + ["text/html", false], + ["text/plain", false], + ["application/xml", false], + ["application/octet-stream", false], + + // Potato mimetypes: + ["text/potato", false], + ["potato/text", false], + ["aaa/aaa", false], + ["zzz/zzz", false], + + // Parameterized mime types: + ["text/javascript; charset=utf-8", true], + ["text/javascript;charset=utf-8", true], + ["text/javascript;bla;bla", true], + ["text/csv; charset=utf-8", false], + ["text/csv;charset=utf-8", false], + ["text/csv;bla;bla", false], + + // Funky capitalization: + ["Text/html", false], + ["text/Html", false], + ["TeXt/HtMl", false], + ["TEXT/HTML", false], +]; + +for (var test_case of test_cases) { + test(t => { + let import_url = "/workers/support/imported_script.py?mime=" + test_case[0]; + if (test_case[1]) { + assert_equals(undefined, importScripts(import_url)); + } else { + assert_throws("NetworkError", _ => { importScripts(import_url) }) + } + }, "importScripts() requires scripty MIME types: " + test_case[0] + " is " + (test_case[1] ? "allowed" : "blocked") + "."); +}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/support/imported_script.py b/third_party/WebKit/LayoutTests/external/wpt/workers/support/imported_script.py new file mode 100644 index 0000000..88cd228 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/workers/support/imported_script.py
@@ -0,0 +1,2 @@ +def main(request, response): + return [('Content-Type', request.GET['mime'])], ""
diff --git a/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-crossorigin-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-crossorigin-expected.txt deleted file mode 100644 index 3fba2d6aa..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-crossorigin-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS Upload events registered on time (http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -FAIL Upload events registered on time (resources/redirect.py?code=307&location=http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) assert_unreached: Reached unreachable code -PASS Upload events registered too late (http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -PASS Upload events registered too late (resources/redirect.py?code=307&location=http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-expected.txt deleted file mode 100644 index 3fba2d6aa..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/xhr/event-upload-progress-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS Upload events registered on time (http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -FAIL Upload events registered on time (resources/redirect.py?code=307&location=http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) assert_unreached: Reached unreachable code -PASS Upload events registered too late (http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -PASS Upload events registered too late (resources/redirect.py?code=307&location=http://www1.web-platform.test:8001/xhr/resources/corsenabled.py) -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor-expected.html b/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor-expected.html new file mode 100644 index 0000000..efa8bf7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor-expected.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<style> +html { + background-color: green; +} +</style>
diff --git a/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor.html b/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor.html new file mode 100644 index 0000000..fbdb0d3e --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/backgrounds/root-background-currentcolor.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<style> +html { + background: linear-gradient(currentcolor, currentcolor) red; + color: green; +} +</style>
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/mixed-case-tag-selector.html b/third_party/WebKit/LayoutTests/fast/css/invalidation/mixed-case-tag-selector.html new file mode 100644 index 0000000..fc5ba38 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/mixed-case-tag-selector.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Invalidation of selector containing mixed-case tag name</title> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<style> +filter feFlood { + flood-opacity: 0; +} +svg.filter feFlood { + flood-opacity: 1; +} +</style> +<svg> + <filter id="f" x="0" y="0" width="1" height="1"> + <feFlood id="flood" flood-color="green"/> + </filter> + <rect width="100" height="100" fill="red" filter="url(#f)"/> +</svg> +<script> +test(() => { + assert_equals(getComputedStyle(flood).floodOpacity, "0", + "flood-opacity is initially 0"); + document.querySelector('svg').classList.toggle("filter"); + assert_equals(getComputedStyle(flood).floodOpacity, "1", + "flood-opacity is 1 after adding class"); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash-expected.txt index 6401436..5bb876c 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 22: Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'. +CONSOLE ERROR: line 24: Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'. This is a testharness.js-based test. PASS try-trigger-crash Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash.html b/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash.html index b0546e4a..706e309 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash.html +++ b/third_party/WebKit/LayoutTests/fast/dom/margin-height-guarded-crash.html
@@ -17,6 +17,8 @@ <iframe id=html_iframe></iframe> <div id=html_div></div> <script> +setup({ allow_uncaught_exception: true }); + function reactToWidthChange() { // null the body html_div.appendChild(html_iframe.contentDocument.body);
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ready-state-change-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/ready-state-change-crash-expected.txt index 1042c767..c559db5 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/ready-state-change-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/ready-state-change-crash-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE ERROR: line 27: Uncaught NotFoundError: Failed to execute 'appendChild' on 'Node': The node to be removed is no longer a child of this node. Perhaps it was moved in response to a mutation? Test passes if it does not crash.
diff --git a/third_party/WebKit/LayoutTests/fast/events/touch/gesture/gesture-tap-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/events/touch/gesture/gesture-tap-frame-removed-expected.txt index aa4c6432..d1fe6f4 100644 --- a/third_party/WebKit/LayoutTests/fast/events/touch/gesture/gesture-tap-frame-removed-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/events/touch/gesture/gesture-tap-frame-removed-expected.txt
@@ -13,19 +13,12 @@ Test case: Remove during mousedown Sending GestureTap -Received mousemove in child frame -Received mousedown in child frame -Removing iframe -PASS document.getElementById('target') is null +FAIL document.getElementById('target') should be null. Was [object HTMLIFrameElement]. iframe loaded Test case: Remove during mouseup Sending GestureTap -Received mousemove in child frame -Received mousedown in child frame -Received mouseup in child frame -Removing iframe -PASS document.getElementById('target') is null +FAIL document.getElementById('target') should be null. Was [object HTMLIFrameElement]. iframe loaded PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/fast/scroll-snap/snap-scrolls-visual-viewport.html b/third_party/WebKit/LayoutTests/fast/scroll-snap/snap-scrolls-visual-viewport.html index 2407c91..071287a 100644 --- a/third_party/WebKit/LayoutTests/fast/scroll-snap/snap-scrolls-visual-viewport.html +++ b/third_party/WebKit/LayoutTests/fast/scroll-snap/snap-scrolls-visual-viewport.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<script src="../../resources/gesture-util.js"></script> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <style> @@ -32,62 +33,41 @@ </div> <script> -const TOUCH_SOURCE_TYPE = 1; -const WHEEL_SOURCE_TYPE = 2; const SOURCE_TYPE = navigator.platform.indexOf('Mac') == 0 - ? WHEEL_SOURCE_TYPE - : TOUCH_SOURCE_TYPE; + ? GestureSourceType.MOUSE_INPUT + : GestureSourceType.TOUCH_INPUT -function smoothScroll(pixels_to_scroll, start_x, start_y, gesture_source_type, direction, speed_in_pixels_s) { - return new Promise((resolve, reject) => { - chrome.gpuBenchmarking.smoothScrollBy(pixels_to_scroll, resolve, start_x, start_y, gesture_source_type, direction, speed_in_pixels_s); - }); -} - -function waitForAnimationEnd() { - const MAX_FRAME = 500; - var last_changed_frame = 0; - var layout_viewport_y = window.scrollY; - var visual_viewport_y = window.visualViewport.offsetTop; - return new Promise((resolve, reject) => { - function tick(frames) { - // We requestAnimationFrame either for 500 frames or until 15 frames with - // no change have been observed. - if (frames >= MAX_FRAME || frames - last_changed_frame > 15) { - resolve(); - } else { - if (window.scrollY != layout_viewport_y || - window.visualViewport.offsetTop != visual_viewport_y) { - last_changed_frame = frames; - layout_viewport_y = window.scrollY; - visual_viewport_y = window.visualViewport.offsetTop; - } - requestAnimationFrame(tick.bind(this, frames + 1)); - } - } - tick(0); - }); -} - -function set_and_scroll_and_snap( +async function set_and_scroll_and_snap( initial_position, scroll_delta, scroll_direction, layout_viewport_y, visual_viewport_y) { - internals.setPageScaleFactor(2); + const scale_factor = 2; + internals.setPageScaleFactor(scale_factor); window.scrollTo(0, initial_position); internals.setVisualViewportOffset(0, 0); assert_equals(window.visualViewport.scale, 2); assert_equals(window.scrollY, initial_position); assert_equals(window.visualViewport.offsetTop, 0); - return smoothScroll(2 * scroll_delta, 200, 200, SOURCE_TYPE, scroll_direction, 4000) - .then(waitForAnimationEnd) - .then(() => { - assert_approx_equals(window.scrollY, layout_viewport_y, 1); - assert_approx_equals(window.visualViewport.offsetTop, visual_viewport_y, 1); - }) + const x = 200; + const y = 200; + await smoothScroll(scale_factor * scroll_delta, + x, + y, + SOURCE_TYPE, + scroll_direction, + SPEED_INSTANT); + + const max_frames = 500; + const max_unchanged_frames = 15; + await waitForAnimationEnd(() => { + return window.scrollY + window.visualViewport.offsetTop; + }, max_frames, max_unchanged_frames); + + assert_approx_equals(window.scrollY, layout_viewport_y, 1); + assert_approx_equals(window.visualViewport.offsetTop, visual_viewport_y, 1); } promise_test(t => {
diff --git a/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-start-at-document-bottom.html b/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-start-at-document-bottom.html new file mode 100644 index 0000000..bfe182e --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-start-at-document-bottom.html
@@ -0,0 +1,17 @@ +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/snav-testharness.js"></script> +<button id="a">A</button><br> +<button id="b" style="margin-top: 120%;">B</button> + +<p>When no element is focused, start searching from the document's bottom.</p> + +<script> + snav.assertSnavEnabledAndTestable(); + + test(() => { + window.scrollTo(0, document.body.scrollHeight); + eventSender.keyDown('ArrowUp'); + assert_equals(document.activeElement, b); + }, "Spatnav picks the document's bottommost element."); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div-expected.txt b/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div-expected.txt deleted file mode 100644 index dc75391..0000000 --- a/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -a -b -c -PASS successfullyParsed is true - -TEST COMPLETE -PASS gFocusedDocument.activeElement.getAttribute("id") is "a" -PASS gFocusedDocument.activeElement.getAttribute("id") is "b" -PASS gFocusedDocument.activeElement.getAttribute("id") is "c" -PASS gFocusedDocument.activeElement.getAttribute("id") is "b" -PASS gFocusedDocument.activeElement.getAttribute("id") is "b" -PASS gFocusedDocument.activeElement.getAttribute("id") is "a" -
diff --git a/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div.html b/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div.html index 17b0e5e..03684ab 100644 --- a/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div.html +++ b/third_party/WebKit/LayoutTests/fast/spatial-navigation/snav-stay-in-overflow-div.html
@@ -1,39 +1,3 @@ -<script src="../../resources/js-test.js"></script> -<script src="resources/spatial-navigation-utils.js"></script> -<script> -var resultMap = [ - ["Down", "a"], // Scrolled so no focus change. - ["Down", "b"], - ["Down", "c"], - ["Up", "b"], - ["Up", "b"], // Scrolled so no focus change. - ["Up", "a"], - ["DONE", "DONE"] -]; - -if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.overridePreference("WebKitTabToLinksPreferenceKey", 1); - testRunner.overridePreference("WebKitSpatialNavigationEnabled", 1); - testRunner.waitUntilDone(); -} - -function runTest() -{ - // Start at a known place. - document.getElementById("a").focus(); - initTest(resultMap, testCompleted); -} - -function testCompleted() -{ - if (window.testRunner) - testRunner.notifyDone(); -} - -window.onload = runTest; -</script> - <style> div.scroll { /* The div displays one line of text at once. */ @@ -48,4 +12,20 @@ <a href="#" id="b">b</a> </div> <a href="#" id="c">c</a> -<div id="console"></div> \ No newline at end of file + +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/snav-testharness.js"></script> +<script> +var resultMap = [ + ["Down", "a"], // Scrolled so no focus change. + ["Down", "b"], + ["Down", "c"], + ["Up", "b"], + ["Up", "b"], // Scrolled so no focus change. + ["Up", "a"], +]; + // Start at a known place. + document.getElementById("a").focus(); + snav.assertFocusMoves(resultMap); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor-expected.html b/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor-expected.html new file mode 100644 index 0000000..f718ea6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor-expected.html
@@ -0,0 +1,2 @@ +<!DOCTYPE html> +<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor.html b/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor.html new file mode 100644 index 0000000..cf068d1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/table/background-gradient-from-row-currentcolor.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<table style="width: 100px; height: 100px; border-spacing: 0"> + <tr style="background: linear-gradient(currentcolor, currentcolor) red; color: green"> + <td style="color: red"></td> + </tr> +</table>
diff --git a/third_party/WebKit/LayoutTests/hdr/color-jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/hdr/color-jpeg-with-color-profile-expected.png index aa18829..91f6da8d 100644 --- a/third_party/WebKit/LayoutTests/hdr/color-jpeg-with-color-profile-expected.png +++ b/third_party/WebKit/LayoutTests/hdr/color-jpeg-with-color-profile-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse-expected.txt new file mode 100644 index 0000000..21ff994 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse-expected.txt
@@ -0,0 +1,4 @@ +Tests that FailedToParseScriptSource event is NOT raised after running a damaged part of a script that was already parsed. + +Finished running broken code. +
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse.js new file mode 100644 index 0000000..63a63e0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-lazily-failed-to-parse.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. + +(async function() { + TestRunner.addResult( + `Tests that FailedToParseScriptSource event is NOT raised after running a damaged part of a script that was already parsed.\n`); + await TestRunner.loadModule('sources_test_runner'); + await TestRunner.showPanel('sources'); + await TestRunner.evaluateInPagePromise(` + function thisIsBroken() { + const duplicated = 1; + const duplicated = 2; + } + `); + + TestRunner.debuggerModel.addEventListener( + SDK.DebuggerModel.Events.FailedToParseScriptSource, () => { + TestRunner.addResult('ERROR: Recieved script failed to parse event') + }); + await TestRunner.evaluateInPagePromise('thisIsBroken()'); + TestRunner.addResult('Finished running broken code.'); + TestRunner.completeTest(); +})();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/user-metrics-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/user-metrics-expected.txt index 2619391..b3276b9b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/devtools/user-metrics-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/user-metrics-expected.txt
@@ -5,6 +5,7 @@ AnimationsPlaybackRateChanged : 11 Audits2Finished : 30 Audits2Started : 29 + Audits2ViewTrace : 32 AuditsStarted : 7 ChangeInspectedNodeInElementsPanel : 26 CommandEvaluatedInConsolePanel : 15
diff --git a/third_party/WebKit/LayoutTests/http/tests/encoding/streams-gc.html b/third_party/WebKit/LayoutTests/http/tests/encoding/streams-gc.html new file mode 100644 index 0000000..2ce98b38 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/encoding/streams-gc.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/js-test-resources/js-test.js"></script> +<script> +'use strict'; + +// This is a Blink-specific test because it involves garbage collection. +for (const constructor of [TextEncoderStream, TextDecoderStream]) { + promise_test(async () => { + const transform = new constructor(); + if (typeof GCController !== 'undefined') + await asyncGC(); + // This test will generally crash on the next line if it fails. + assert_true(transform.readable instanceof ReadableStream, + 'readable side must still be set'); + assert_true(transform.writable instanceof WritableStream, + 'writable side must still be set'); + }, `${constructor.name} readable and writable properties must survive GC`); +} +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-expected.txt index 0b9588bf..0caf291 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: line 5: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/hello.html' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". +CONSOLE ERROR: line 5: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/hello.html' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-non-self-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-non-self-expected.txt index 0949332..49eb596 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-non-self-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-block-import-non-self-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: line 6: Refused to load the script 'http://localhost:8080/htmlimports/resources/cors-basic.cgi' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'". +CONSOLE ERROR: line 6: Refused to load the script 'http://localhost:8080/htmlimports/resources/cors-basic.cgi' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. PASS PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-expected.txt index 0e54438..711965d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 2: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src http://localhost:8000".
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-nested-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-nested-expected.txt index 0e54438..711965d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-nested-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-domain-nested-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 2: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src http://localhost:8000".
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-expected.txt index 686f5538..c0c2c36b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: Refused to load the script 'http://localhost:8080/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8080/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 4: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'".
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-nested-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-nested-expected.txt index 686f5538..c0c2c36b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-nested-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-nonce-nested-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: Refused to load the script 'http://localhost:8080/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8080/htmlimports/resources/external-script.js' because it violates the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 4: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src http://localhost:8000 'nonce-hello'".
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-expected.txt index c2e7c49..23163ec 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-expected.txt
@@ -1,7 +1,7 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. CONSOLE ERROR: line 2: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'". -CONSOLE ERROR: Refused to load the script 'http://localhost:8000//htmlimports/resources/cors-js.cgi' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8000//htmlimports/resources/cors-js.cgi' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 6: Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-wnLyUqsXhUuQ5NVNJO+JjNabqB1yo9OPLLJWPopauN0='), or a nonce ('nonce-...') is required to enable inline execution.
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-nested-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-nested-expected.txt index c2e7c49..23163ec 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-nested-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-import-block-but-self-nested-expected.txt
@@ -1,7 +1,7 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. CONSOLE ERROR: line 2: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'". -CONSOLE ERROR: Refused to load the script 'http://localhost:8000//htmlimports/resources/cors-js.cgi' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8000//htmlimports/resources/cors-js.cgi' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: line 6: Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-wnLyUqsXhUuQ5NVNJO+JjNabqB1yo9OPLLJWPopauN0='), or a nonce ('nonce-...') is required to enable inline execution.
diff --git a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-not-block-import-in-import-expected.txt b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-not-block-import-in-import-expected.txt index e26fe4a..5411194 100644 --- a/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-not-block-import-in-import-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/htmlimports/csp-not-block-import-in-import-expected.txt
@@ -1,5 +1,5 @@ CONSOLE WARNING: HTML Imports is deprecated and will be removed in M73, around March 2019. Please use ES modules instead. See https://www.chromestatus.com/features/5144752345317376 for more details. -CONSOLE ERROR: Refused to load the script 'http://localhost:8000/htmlimports/resources/cors-basic.cgi' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8000/htmlimports/resources/cors-basic.cgi' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/sxg/nested-sxg.html b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/nested-sxg.html new file mode 100644 index 0000000..bdc214f --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/nested-sxg.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>Nested SignedHTTPExchange</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="./resources/sxg-util.js"></script> +<body> +<script> +promise_test(async (t) => { + await waitUntilDidFinishLoadForFrame; + + // The timestamp of the test SXG file is "Apr 1 2018 00:00 UTC" and valid + // until "Apr 8 2018 00:00 UTC". + await setSignedExchangeVerificationTime(new Date("Apr 1 2018 00:01 UTC")); + + const event = await new Promise(async (resolve, reject) => { + // We can't catch the network error on iframe. So we use the timer. + t.step_timeout(() => reject('timeout'), 1000); + + const frame = + await withIframe('resources/nested-sxg.sxg', 'sxg_iframe'); + const channel = new MessageChannel(); + channel.port1.onmessage = resolve; + frame.contentWindow.postMessage( + {port: channel.port2}, '*', [channel.port2]); + }); + assert_equals(event.data.location, 'https://127.0.0.1:8443/loading/sxg/resources/inner-url.html?fallback-from-nested-sxg'); + assert_true(event.data.is_fallback); +}, 'Nested SignedHTTPExchange'); + +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/generate-test-sxgs.sh b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/generate-test-sxgs.sh index 7a75a69..2b32f170 100755 --- a/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/generate-test-sxgs.sh +++ b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/generate-test-sxgs.sh
@@ -88,4 +88,20 @@ -o fallback-to-another-sxg.sxg \ -miRecordSize 100 +# Generate the nested signed exchange file. +gen-signedexchange \ + -version 1b2 \ + -uri 'https://127.0.0.1:8443/loading/sxg/resources/inner-url.html?fallback-from-nested-sxg' \ + -status 200 \ + -content sxg-location.sxg \ + -responseHeader 'content-type: application/signed-exchange;v=b2' \ + -certificate $certs_dir/127.0.0.1.sxg.pem \ + -certUrl https://127.0.0.1:8443/loading/sxg/resources/127.0.0.1.sxg.pem.cbor \ + -validityUrl https://127.0.0.1:8443/loading/sxg/resources/resource.validity.msg \ + -privateKey $certs_dir/127.0.0.1.sxg.key \ + -date 2018-04-01T00:00:00Z \ + -expire 168h \ + -o nested-sxg.sxg \ + -miRecordSize 100 + rm -fr $tmpdir
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/nested-sxg.sxg b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/nested-sxg.sxg new file mode 100644 index 0000000..b061aab --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/loading/sxg/resources/nested-sxg.sxg Binary files differ
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/adopt-iframe-src-attr-after-remove.html b/third_party/WebKit/LayoutTests/http/tests/misc/adopt-iframe-src-attr-after-remove.html index bb9d8b1..6cdca7e6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/misc/adopt-iframe-src-attr-after-remove.html +++ b/third_party/WebKit/LayoutTests/http/tests/misc/adopt-iframe-src-attr-after-remove.html
@@ -1,12 +1,13 @@ <!DOCTYPE html> We pass if we don't crash under ASAN. -<iframe id=iframe src="../navigation/resources/blank.txt"></iframe> +<iframe id="iframe" src="../navigation/resources/blank.txt"></iframe> <script> if (window.testRunner) { testRunner.dumpAsText(); testRunner.waitUntilDone(); } +var iframe = document.getElementById("iframe"); var onload_completed = false; function runGC() {
diff --git a/third_party/WebKit/LayoutTests/http/tests/resources/sensor-helpers.js b/third_party/WebKit/LayoutTests/http/tests/resources/sensor-helpers.js index 6eed104..0d4f749 100644 --- a/third_party/WebKit/LayoutTests/http/tests/resources/sensor-helpers.js +++ b/third_party/WebKit/LayoutTests/http/tests/resources/sensor-helpers.js
@@ -219,7 +219,7 @@ this.readingSizeInBytes_ = device.mojom.SensorInitParams.kReadBufferSizeForTests; this.sharedBufferSizeInBytes_ = this.readingSizeInBytes_ * - device.mojom.SensorType.LAST; + (device.mojom.SensorType.RELATIVE_ORIENTATION_QUATERNION + 1); let rv = Mojo.createSharedBuffer(this.sharedBufferSizeInBytes_); assert_equals(rv.result, Mojo.RESULT_OK, "Failed to create buffer"); this.sharedBufferHandle_ = rv.handle; @@ -251,8 +251,7 @@ initParams: null}; } - let offset = (device.mojom.SensorType.LAST - type) * - this.readingSizeInBytes_; + let offset = type * this.readingSizeInBytes_; let reportingMode = device.mojom.ReportingMode.ON_CHANGE; if (this.isContinuous_) { reportingMode = device.mojom.ReportingMode.CONTINUOUS;
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning-expected.txt index 8dbd4544..c934516 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning-expected.txt
@@ -1,3 +1,3 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8080/security/contentSecurityPolicy/resources/alert-fail.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8080/security/contentSecurityPolicy/resources/alert-fail.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback. This page should neither alert "FAIL" nor generate any mixed content warnings in the console.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-01-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-01-expected.txt index 9b416a63..94d4fc4 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-01-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-01-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: The 'allow' directive has been replaced with 'default-src'. Please use that directive instead, as 'allow' has no effect. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. This script should not execute even though there are parse errors in the policy.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-02-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-02-expected.txt index 1e7ec613..4073a41 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-02-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-02-expected.txt
@@ -1,6 +1,6 @@ CONSOLE ERROR: Unrecognized Content-Security-Policy directive 'aaa'. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. This script should not execute even though there are parse errors in the policy.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-multiple-headers-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-multiple-headers-expected.txt index 8c77447..ad88556 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-multiple-headers-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/directive-parsing-multiple-headers-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: The 'allow' directive has been replaced with 'default-src'. Please use that directive instead, as 'allow' has no effect. -CONSOLE ERROR: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback. This script should not execute even through the second CSP header would allow it.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-blocked-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-blocked-expected.txt index 0aa6ab74..169c4c2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-blocked-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-blocked-expected.txt
@@ -1,6 +1,6 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-nonce'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-nonce'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-notnonce'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-notnonce'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Only the first two of these scripts should execute even though there are parse errors in the policy.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-invalidnonce-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-invalidnonce-expected.txt index 5ab4912..ddd088b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-invalidnonce-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/nonces/scriptnonce-invalidnonce-expected.txt
@@ -1,34 +1,34 @@ CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''n'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'n". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'n". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src nonce-abcd". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src nonce-abcd". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-'. It will be ignored. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: '''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- '". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- '". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-'. It will be ignored. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: '''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- '". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- '". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-'. It will be ignored. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'spaces''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- nonces have no spaces'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce- nonces have no spaces'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-{}''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-{}'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-{}'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''nonce-/\''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-/\'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'nonce-/\'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. None of these scripts should execute, as all the nonces are invalid.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial-expected.txt index 5956ea0e..8fc832c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial-expected.txt
@@ -1,7 +1,7 @@ CONSOLE ERROR: Refused to load the image 'http://127.0.0.1:8000/security/resources/abe.png' because it violates the following Content Security Policy directive: "default-src https:". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (1/12) -CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src-elem' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (2/12) CONSOLE MESSAGE: line 15: PASS (3/12) @@ -9,11 +9,11 @@ CONSOLE ERROR: line 27: Refused to load the image 'http://127.0.0.1:8000/security/resources/abe.png' because it violates the following Content Security Policy directive: "default-src https:". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (5/12) -CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src-elem' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (6/12) CONSOLE MESSAGE: line 15: PASS (7/12) -CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src-elem' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (8/12) CONSOLE ERROR: line 27: Refused to load the image 'http://127.0.0.1:8000/security/resources/abe.png' because it violates the following Content Security Policy directive: "default-src https:". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback. @@ -23,7 +23,7 @@ CONSOLE ERROR: line 27: Refused to load the image 'http://127.0.0.1:8000/security/resources/abe.png' because it violates the following Content Security Policy directive: "default-src https:". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (11/12) -CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback. +CONSOLE ERROR: line 1: Refused to load the stylesheet 'http://127.0.0.1:8000/security/resources/cssStyle.css' because it violates the following Content Security Policy directive: "default-src https:". Note that 'style-src-elem' was not explicitly set, so 'default-src' is used as a fallback. CONSOLE MESSAGE: line 15: PASS (12/12) This test ensures that registering a scheme as bypassing CSP actually bypasses CSP. This test passes if only PASSes are generated.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https-expected.txt index 267ce7b7..28997ad5 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script-set-attribute.js?t1' because it violates the following Content Security Policy directive: "script-src 'nonce-abc'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script-set-attribute.js?t1' because it violates the following Content Security Policy directive: "script-src 'nonce-abc'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. This is a testharness.js-based test. Harness Error. harness_status.status = 1 , harness_status.message = 1 duplicate test name: "Parser-inserted scripts do not bypass."
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-appended-script-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-appended-script-expected.txt index eda5907..1c2f5643 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-appended-script-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-appended-script-expected.txt
@@ -1,3 +1,3 @@ -CONSOLE ERROR: line 14: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". +CONSOLE ERROR: line 14: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-none-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-none-expected.txt index 5e7dea2..3b1fab6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-none-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-none-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: The 'allow' directive has been replaced with 'default-src'. Please use that directive instead, as 'allow' has no effect. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Loads an iframe which in turns tries to load an external script. The iframe has a content security policy disabling external scripts. So the script should not get executed.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-redirect-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-redirect-expected.txt index 2543dda..2d6682f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-redirect-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-redirect-expected.txt
@@ -1,6 +1,6 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/redir.php?url=http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src localhost". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/redir.php?url=http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src localhost". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/redir.php?url=http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/redir.php?url=http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Loads an iframe which in turns tries to load an external script. The request for the script is redirected to 'localhost'. The iframe has a content security policy disabling external scripts from hosts other than 'localhost'. So the script should be allowed to run.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-01-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-01-expected.txt index fdc8d201e..ad81d14 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-01-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-01-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'http://localhost:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-02-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-02-expected.txt index 408c5a17..5532457 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-02-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-02-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8080/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8080/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-03-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-03-expected.txt index f4d7a4a..cc5bd47d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-03-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-self-blocked-03-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Refused to load the script 'https://127.0.0.1:8443/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'https://127.0.0.1:8443/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-01-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-01-expected.txt index 31c0a1c1..8ba221a 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-01-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-01-expected.txt
@@ -1,8 +1,8 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:8000". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:8000". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:*". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:*". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:*". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:*". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. None of these scripts should execute even though there are parse errors in the policy.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-03-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-03-expected.txt index 103a592a..3b58f52c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-03-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-03-expected.txt
@@ -1,6 +1,6 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https:". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https:". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https:". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https:". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. None of these scripts should execute.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-05-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-05-expected.txt index c604ac7..b445b01 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-05-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-05-expected.txt
@@ -1,24 +1,24 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path?query=string'. The query component, including the '?', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path?query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path?query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path#anchor'. The fragment identifier, including the '#', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path#anchor". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/path#anchor". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path?query=string'. The query component, including the '?', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path?query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path?query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path#anchor'. The fragment identifier, including the '#', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path#anchor". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/path#anchor". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: Unrecognized Content-Security-Policy directive 'pathwithasemicolon'. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/thisisa". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/thisisa". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/this is a path with spaces". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/this is a path with spaces". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Paths should be ignored when evaluating sources. This test passes if FAIL does not appear in the output, and each of the tests generates a warning about the path component.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-06-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-06-expected.txt index b69f5916..fe57066 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-06-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-06-expected.txt
@@ -1,24 +1,24 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path?query=string'. The query component, including the '?', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path?query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path?query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path#anchor'. The fragment identifier, including the '#', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path#anchor". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:*/path#anchor". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path?query=string'. The query component, including the '?', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path?query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path?query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/path#anchor'. The fragment identifier, including the '#', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path#anchor". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/path#anchor". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: Unrecognized Content-Security-Policy directive 'pathwithasemicolon'. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/thisisa". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/thisisa". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/this is a path with spaces". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:8000/this is a path with spaces". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Paths should be ignored when evaluating sources. This test passes if FAIL does not appear in the output, and each of the tests generates a warning about the path component.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-07-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-07-expected.txt index a3822767..d87514f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-07-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-07-expected.txt
@@ -1,26 +1,26 @@ CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'http:/'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:/". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:/". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'http://'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'http:/127.0.0.1'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:/127.0.0.1". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:/127.0.0.1". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'http:///127.0.0.1'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:///127.0.0.1". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http:///127.0.0.1". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'http://127.0.0.1:/'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:/". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src http://127.0.0.1:/". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'https://127.?.0.1:*'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.?.0.1:*". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.?.0.1:*". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'https://127.0.0.1:'. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''slef''. It will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'slef'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'slef'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: 'https://127.0.0.1:'. It will be ignored. Invalid source expressions should log a console warning, and be ignored.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-08-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-08-expected.txt index 22986da7..ab94e05 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-08-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-08-expected.txt
@@ -1,6 +1,6 @@ -CONSOLE ERROR: Refused to load the script 'data:application/javascript;base64,dmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQnKTtyZXN1bHQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSByZXN1bHQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ3RleHQnKS52YWx1ZTs=' because it violates the following Content Security Policy directive: "script-src 'self'". +CONSOLE ERROR: Refused to load the script 'data:application/javascript;base64,dmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQnKTtyZXN1bHQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSByZXN1bHQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ3RleHQnKS52YWx1ZTs=' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'data:application/javascript;base64,dmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQnKTtyZXN1bHQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSByZXN1bHQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ3RleHQnKS52YWx1ZTs=' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:8000". +CONSOLE ERROR: Refused to load the script 'data:application/javascript;base64,dmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQnKTtyZXN1bHQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSByZXN1bHQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ3RleHQnKS52YWx1ZTs=' because it violates the following Content Security Policy directive: "script-src https://127.0.0.1:8000". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Test proper handling of data: URLs.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-none-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-none-expected.txt index 572c395..aa20f7d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-none-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-none-expected.txt
@@ -1,13 +1,13 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''none''. It will be ignored. Note that 'none' has no effect unless it is the only expression in the source list. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''none''. It will be ignored. Note that 'none' has no effect unless it is the only expression in the source list. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''none''. It will be ignored. Note that 'none' has no effect unless it is the only expression in the source list. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''none''. It will be ignored. Note that 'none' has no effect unless it is the only expression in the source list. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains an invalid source: ''none''. It will be ignored. Note that 'none' has no effect unless it is the only expression in the source list. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none' 'none' 'none'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 'none' 'none' 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. 'none' should be ignored in source lists, unless it is the only token.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-01-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-01-expected.txt index 530e814..1c52e74 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-01-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-01-expected.txt
@@ -1,10 +1,10 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/sec". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/sec". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/sec/". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/sec/". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/not-security". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/not-security". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/security%3bnot-contentSecurityPolicy". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:8000/security%3bnot-contentSecurityPolicy". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Resources should be rejected unless they match a whitelisted path.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-02-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-02-expected.txt index c1a1f5d..dce2156 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-02-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/source-list-parsing-paths-02-expected.txt
@@ -1,14 +1,14 @@ CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/security/#query=string'. The fragment identifier, including the '#', will be ignored. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/security/?query=string'. The query component, including the '?', will be ignored. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/not-security/#query=string'. The fragment identifier, including the '#', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/not-security/#query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/not-security/#query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. CONSOLE ERROR: The source list for Content Security Policy directive 'script-src' contains a source with an invalid path: '/not-security/?query=string'. The query component, including the '?', will be ignored. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/not-security/?query=string". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/not-security/?query=string". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/security". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/security". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/security/contentSecurityPolicy/resources/script.js/". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/script.js' because it violates the following Content Security Policy directive: "script-src 127.0.0.1:*/security/contentSecurityPolicy/resources/script.js/". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. Resources should be rejected unless they match a whitelisted path.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/worklet-import-blocked-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/worklet-import-blocked-expected.txt index 81f9d963..2fd2f9a 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/worklet-import-blocked-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/worklet-import-blocked-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/resources/worklet.js' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". +CONSOLE ERROR: Refused to load the script 'http://127.0.0.1:8000/resources/worklet.js' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. This is a testharness.js-based test. PASS Importing a script rejects the given promise with AbortError because it violated the same origin CSP policy.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt index 27803c4..c0768b6b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". +CONSOLE ERROR: line 1: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt index 27803c4..c0768b6b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". +CONSOLE ERROR: line 1: Refused to load the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' because it violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt index 4a23810a..07a85126 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt
@@ -1,8 +1,8 @@ CONSOLE WARNING: Application Cache is restricted to secure contexts. Please consider migrating your application to HTTPS, and eventually shifting over to Service Workers. See https://goo.gl/rStTGz for more details. CONSOLE WARNING: line 68: getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. CONSOLE WARNING: line 87: getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. -CONSOLE WARNING: line 430: The devicemotion event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. -CONSOLE WARNING: line 430: The deviceorientation event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. +CONSOLE WARNING: line 429: The devicemotion event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. +CONSOLE WARNING: line 429: The deviceorientation event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details. This is a testharness.js-based test. PASS device motion PASS device orientation
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index a099322..b913647 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1187,6 +1187,14 @@ getter ignoreBOM method constructor method decode +interface TextDecoderStream + attribute @@toStringTag + getter encoding + getter fatal + getter ignoreBOM + getter readable + getter writable + method constructor interface TextDetector attribute @@toStringTag method constructor @@ -1196,6 +1204,12 @@ getter encoding method constructor method encode +interface TextEncoderStream + attribute @@toStringTag + getter encoding + getter readable + getter writable + method constructor interface TransformStream getter readable getter writable
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-expected.txt index 72ea1981..4d8364d 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-expected.txt
@@ -25,7 +25,9 @@ "lineNumber": 43, "columnNumber": 46 } - ] + ], + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1, @@ -448,7 +450,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1, @@ -759,7 +763,7 @@ "x": 0, "y": 0, "width": 785, - "height": 1135 + "height": 1134.875 }, "styleIndex": 0, "isStackingContext": true @@ -770,7 +774,7 @@ "x": 8, "y": 8, "width": 769, - "height": 1119 + "height": 1118.875 }, "styleIndex": 1 }, @@ -801,7 +805,7 @@ "x": 8, "y": 208, "width": 769, - "height": 919 + "height": 918.875 }, "styleIndex": 4 }, @@ -1423,9 +1427,9 @@ "domNodeIndex": 50, "boundingBox": { "x": 8, - "y": 1057, + "y": 1057.4375, "width": 769, - "height": 33 + "height": 32 }, "styleIndex": 17 }, @@ -1433,9 +1437,9 @@ "domNodeIndex": 55, "boundingBox": { "x": 8, - "y": 1057, + "y": 1057.4375, "width": 769, - "height": 33 + "height": 32 }, "styleIndex": 17 }, @@ -1443,9 +1447,9 @@ "domNodeIndex": 56, "boundingBox": { "x": 8, - "y": 1057, + "y": 1057.4375, "width": 769, - "height": 33 + "height": 32 }, "styleIndex": 17 }, @@ -1453,9 +1457,9 @@ "domNodeIndex": 57, "boundingBox": { "x": 8, - "y": 1057, + "y": 1057.4375, "width": 96, - "height": 33 + "height": 32 }, "layoutText": "Hi!", "inlineTextNodes": [ @@ -1476,9 +1480,9 @@ "domNodeIndex": 60, "boundingBox": { "x": 8, - "y": 1110, + "y": 1110.875, "width": 144, - "height": 17 + "height": 16 }, "styleIndex": 19 }, @@ -1486,9 +1490,9 @@ "domNodeIndex": 61, "boundingBox": { "x": 8, - "y": 1110, + "y": 1110.875, "width": 144, - "height": 17 + "height": 16 }, "layoutText": "Click ME!", "inlineTextNodes": [
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt index eae4313..f5adc12 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt
@@ -13,7 +13,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1,
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-origin-url-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-origin-url-expected.txt index e004b1884..30d972e 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-origin-url-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-origin-url-expected.txt
@@ -13,7 +13,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1, @@ -174,7 +176,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "UTF-8", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1,
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element-expected.txt index 1670891..2b486b7 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element-expected.txt
@@ -13,7 +13,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1,
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset-expected.txt new file mode 100644 index 0000000..19cedf1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset-expected.txt
@@ -0,0 +1,556 @@ +Tests DOMSnapshot.getSnapshot reports scroll offset and bounding box in terms of document coordinates. +{ + "domNodes": [ + { + "nodeType": 9, + "nodeName": "#document", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 1 + ], + "layoutNodeIndex": 0, + "documentURL": "<string>", + "baseURL": "<string>", + "documentEncoding": "windows-1252", + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 1614 + }, + { + "nodeType": 1, + "nodeName": "HTML", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 2, + 8 + ], + "layoutNodeIndex": 1, + "frameId": "<string>" + }, + { + "nodeType": 1, + "nodeName": "HEAD", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 3, + 5, + 6, + 7 + ] + }, + { + "nodeType": 1, + "nodeName": "STYLE", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 4 + ] + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n * {\n margin: 0;\n padding: 0;\n font: 10px Ahem;\n }\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "SCRIPT", + "nodeValue": "", + "backendNodeId": "<number>", + "attributes": [ + { + "name": "src", + "value": "../../resources/ahem.js" + } + ] + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "BODY", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 9, + 10, + 12, + 13, + 15, + 16, + 33 + ], + "layoutNodeIndex": 2 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "DIV", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 11 + ], + "attributes": [ + { + "name": "style", + "value": "height:2000px;" + } + ], + "layoutNodeIndex": 3 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "main frame content", + "backendNodeId": "<number>", + "layoutNodeIndex": 4 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "DIV", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 14 + ], + "attributes": [ + { + "name": "id", + "value": "fragment" + } + ], + "layoutNodeIndex": 5 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "main frame fragment", + "backendNodeId": "<number>", + "layoutNodeIndex": 6 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "IFRAME", + "nodeValue": "", + "backendNodeId": "<number>", + "attributes": [ + { + "name": "src", + "value": "dom-snapshot-scroll-offset-iframe.html#fragment" + }, + { + "name": "width", + "value": "300" + }, + { + "name": "height", + "value": "200" + } + ], + "layoutNodeIndex": 7, + "frameId": "<string>", + "contentDocumentIndex": 17 + }, + { + "nodeType": 9, + "nodeName": "#document", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 18 + ], + "layoutNodeIndex": 8, + "documentURL": "<string>", + "baseURL": "<string>", + "documentEncoding": "windows-1252", + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 310 + }, + { + "nodeType": 1, + "nodeName": "HTML", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 19, + 25 + ], + "layoutNodeIndex": 9, + "frameId": "<string>" + }, + { + "nodeType": 1, + "nodeName": "HEAD", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 20, + 22, + 23, + 24 + ] + }, + { + "nodeType": 1, + "nodeName": "STYLE", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 21 + ] + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n * {\n margin: 0;\n padding: 0;\n font: 10px Ahem;\n }\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "SCRIPT", + "nodeValue": "", + "backendNodeId": "<number>", + "attributes": [ + { + "name": "src", + "value": "../../resources/ahem.js" + } + ] + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "BODY", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 26, + 27, + 29, + 30, + 32 + ], + "layoutNodeIndex": 10 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "DIV", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 28 + ], + "attributes": [ + { + "name": "style", + "value": "height:500px;" + } + ], + "layoutNodeIndex": 11 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "iframe content", + "backendNodeId": "<number>", + "layoutNodeIndex": 12 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n ", + "backendNodeId": "<number>" + }, + { + "nodeType": 1, + "nodeName": "DIV", + "nodeValue": "", + "backendNodeId": "<number>", + "childNodeIndexes": [ + 31 + ], + "attributes": [ + { + "name": "id", + "value": "fragment" + } + ], + "layoutNodeIndex": 13 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "iframe fragment", + "backendNodeId": "<number>", + "layoutNodeIndex": 14 + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n \n\n", + "backendNodeId": "<number>" + }, + { + "nodeType": 3, + "nodeName": "#text", + "nodeValue": "\n \n\n", + "backendNodeId": "<number>", + "layoutNodeIndex": 15 + } + ], + "layoutTreeNodes": [ + { + "domNodeIndex": 0, + "boundingBox": { + "x": 0, + "y": 0, + "width": 800, + "height": 600 + }, + "isStackingContext": true + }, + { + "domNodeIndex": 1, + "boundingBox": { + "x": 0, + "y": 0, + "width": 785, + "height": 2214 + }, + "isStackingContext": true + }, + { + "domNodeIndex": 8, + "boundingBox": { + "x": 0, + "y": 0, + "width": 785, + "height": 2214 + } + }, + { + "domNodeIndex": 10, + "boundingBox": { + "x": 0, + "y": 0, + "width": 785, + "height": 2000 + } + }, + { + "domNodeIndex": 11, + "boundingBox": { + "x": 0, + "y": 0, + "width": 180, + "height": 10 + }, + "layoutText": "main frame content", + "inlineTextNodes": [ + { + "boundingBox": { + "x": 0, + "y": 0, + "width": 180, + "height": 10 + }, + "startCharacterIndex": 0, + "numCharacters": 18 + } + ] + }, + { + "domNodeIndex": 13, + "boundingBox": { + "x": 0, + "y": 2000, + "width": 785, + "height": 10 + } + }, + { + "domNodeIndex": 14, + "boundingBox": { + "x": 0, + "y": 2000, + "width": 190, + "height": 10 + }, + "layoutText": "main frame fragment", + "inlineTextNodes": [ + { + "boundingBox": { + "x": 0, + "y": 2000, + "width": 190, + "height": 10 + }, + "startCharacterIndex": 0, + "numCharacters": 19 + } + ] + }, + { + "domNodeIndex": 16, + "boundingBox": { + "x": 0, + "y": 2010, + "width": 304, + "height": 204 + } + }, + { + "domNodeIndex": 17, + "boundingBox": { + "x": 0, + "y": 0, + "width": 300, + "height": 200 + }, + "isStackingContext": true + }, + { + "domNodeIndex": 18, + "boundingBox": { + "x": 0, + "y": 0, + "width": 285, + "height": 510 + }, + "isStackingContext": true + }, + { + "domNodeIndex": 25, + "boundingBox": { + "x": 0, + "y": 0, + "width": 285, + "height": 510 + } + }, + { + "domNodeIndex": 27, + "boundingBox": { + "x": 0, + "y": 0, + "width": 285, + "height": 500 + } + }, + { + "domNodeIndex": 28, + "boundingBox": { + "x": 0, + "y": 0, + "width": 140, + "height": 10 + }, + "layoutText": "iframe content", + "inlineTextNodes": [ + { + "boundingBox": { + "x": 0, + "y": 0, + "width": 140, + "height": 10 + }, + "startCharacterIndex": 0, + "numCharacters": 14 + } + ] + }, + { + "domNodeIndex": 30, + "boundingBox": { + "x": 0, + "y": 500, + "width": 285, + "height": 10 + } + }, + { + "domNodeIndex": 31, + "boundingBox": { + "x": 0, + "y": 500, + "width": 150, + "height": 10 + }, + "layoutText": "iframe fragment", + "inlineTextNodes": [ + { + "boundingBox": { + "x": 0, + "y": 500, + "width": 150, + "height": 10 + }, + "startCharacterIndex": 0, + "numCharacters": 15 + } + ] + }, + { + "domNodeIndex": 33, + "boundingBox": { + "x": 0, + "y": 1614, + "width": 0, + "height": 0 + }, + "layoutText": "\n \n\n" + } + ], + "computedStyles": [] +} +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset.js new file mode 100644 index 0000000..af02b2bd --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-scroll-offset.js
@@ -0,0 +1,17 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startURL('../resources/dom-snapshot-scroll-offset.html', 'Tests DOMSnapshot.getSnapshot reports scroll offset and bounding box in terms of document coordinates.'); + + function stabilize(key, value) { + var unstableKeys = ['documentURL', 'baseURL', 'frameId', 'backendNodeId']; + if (unstableKeys.indexOf(key) !== -1) + return '<' + typeof(value) + '>'; + return value; + } + + var response = await dp.DOMSnapshot.getSnapshot({'computedStyleWhitelist': []}); + if (response.error) + testRunner.log(response); + else + testRunner.log(JSON.stringify(response.result, stabilize, 2)); + testRunner.completeTest(); +})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-ua-shadow-tree-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-ua-shadow-tree-expected.txt index f98c4010..39552ee 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-ua-shadow-tree-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-ua-shadow-tree-expected.txt
@@ -13,7 +13,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 1,
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport-expected.txt index d821327..dcc59301 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport-expected.txt
@@ -16,7 +16,9 @@ "documentURL": "<string>", "baseURL": "<string>", "documentEncoding": "windows-1252", - "frameId": "<string>" + "frameId": "<string>", + "scrollOffsetX": 0, + "scrollOffsetY": 0 }, { "nodeType": 10,
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt index 9276a699..a9c29cd 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt
@@ -2,5 +2,5 @@ Took heap snapshot Parsed snapshot SUCCESS: found leaking -SUCCESS: retaining path = [Detached EventListener, Detached InternalNode, Detached InternalNode, Detached HTMLDivElement, Window / file://, ] +SUCCESS: retaining path = [Detached V8EventListener, Detached EventListener, Detached InternalNode, Detached InternalNode, Detached HTMLDivElement, Window / file://, ]
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt index 10c73030..e53326f 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt
@@ -2,5 +2,5 @@ Took heap snapshot Parsed snapshot SUCCESS: found myEventListener -SUCCESS: retaining path = [EventListener, InternalNode, InternalNode, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ] +SUCCESS: retaining path = [V8EventListener, EventListener, InternalNode, InternalNode, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ]
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt index 2c57bee..473e2fc 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt
@@ -2,7 +2,9 @@ Took heap snapshot Parsed snapshot SUCCESS: found leaking +SUCCESS: immediate retainer is V8EventListener. SUCCESS: immediate retainer is EventListener. +SUCCESS: found single retaining path for v8EventListener. SUCCESS: found multiple retaining paths. SUCCESS: path1 = [InternalNode, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ] SUCCESS: path2 = [InternalNode, HTMLDivElement, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ]
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js index a2d852e..94f3d82 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js
@@ -31,7 +31,14 @@ else return testRunner.fail('cannot find the leaking node'); - var eventListener = helper.firstRetainingPath(node)[0]; + var v8EventListener = helper.firstRetainingPath(node)[0]; + var eventListener = helper.firstRetainingPath(node)[1]; + + if (v8EventListener.name() == 'V8EventListener') { + testRunner.log('SUCCESS: immediate retainer is V8EventListener.'); + } else { + return testRunner.fail('cannot find the V8EventListener.'); + } if (eventListener.name() == 'EventListener') { testRunner.log('SUCCESS: immediate retainer is EventListener.'); @@ -39,6 +46,12 @@ return testRunner.fail('cannot find the EventListener.'); } + if (v8EventListener.retainersCount() === 1) { + testRunner.log('SUCCESS: found single retaining path for v8EventListener.'); + } else { + return testRunner.fail('cannot find single retaining path for v8EventListener.'); + } + var retainingPaths = []; for (var iter = eventListener.retainers(); iter.hasNext(); iter.next()) { var path = helper.firstRetainingPath(iter.retainer.node());
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset-iframe.html b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset-iframe.html new file mode 100644 index 0000000..090ac79 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset-iframe.html
@@ -0,0 +1,14 @@ +<html> + <style> + * { + margin: 0; + padding: 0; + font: 10px Ahem; + } + </style> + <script src="../../resources/ahem.js"></script> + <body> + <div style="height:500px;">iframe content</div> + <div id="fragment">iframe fragment</div> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset.html b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset.html new file mode 100644 index 0000000..95ce059 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-scroll-offset.html
@@ -0,0 +1,15 @@ +<html> + <style> + * { + margin: 0; + padding: 0; + font: 10px Ahem; + } + </style> + <script src="../../resources/ahem.js"></script> + <body> + <div style="height:2000px;">main frame content</div> + <div id="fragment">main frame fragment</div> + <iframe src="dom-snapshot-scroll-offset-iframe.html#fragment" width=300 height=200></iframe> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/media/autoplay/allow-if-capturing-user-media.html b/third_party/WebKit/LayoutTests/media/autoplay/allow-if-capturing-user-media.html new file mode 100644 index 0000000..5eff0a0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/autoplay/allow-if-capturing-user-media.html
@@ -0,0 +1,57 @@ +<!DOCTYPE html> +<title>Test autoplay is allowed if the document is capturing</title> +<script src='../../resources/testharness.js'></script> +<script src='../../resources/testharnessreport.js'></script> +<body></body> +<script> + +function testAutoplay() { + const video = document.createElement('video'); + video.src = '../content/test.ogv'; + + return new Promise((resolve) => { + video.play().then(() => resolve(true), + (e) => resolve(e.name != 'NotAllowedError')); + }); +} + +async_test(t => { + t.add_cleanup(() => { + internals.settings.setAutoplayPolicy('no-user-gesture-required'); + }); + + internals.settings.setAutoplayPolicy('document-user-activation-required'); + + /* The capturing video element */ + let capturingVideo = document.createElement('video'); + + testAutoplay().then(t.step_func((success) => { + // We should not be able to autoplay without a user gesture. + assert_false(success); + + // Start capturing user media. + navigator.mediaDevices.getUserMedia({video: true}).then( + t.step_func(step2), t.unreached_func()); + })); + + function step2(stream) { + capturingVideo.srcObject = stream; + capturingVideo.play().then(t.step_func(step3), t.unreached_func()); + } + + function step3() { + testAutoplay().then(t.step_func((success) => { + // Autoplay should be enabled as we are capturing. + assert_true(success); + + capturingVideo.srcObject.getTracks()[0].stop(); + + testAutoplay().then(t.step_func_done((success) => { + // Autoplay should be disabled again. + assert_false(success); + })); + })); + } +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-fixed-scrolling-expected.png index aee31e9..8736adc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-fixed-scrolling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-fixed-scrolling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-opacity-overlay-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-opacity-overlay-expected.png index afe0a12f..222d413 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-opacity-overlay-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/geometry/video-opacity-overlay-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/load-video-in-reflection-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/load-video-in-reflection-expected.png index c942a89..cc499cc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/load-video-in-reflection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/load-video-in-reflection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-expected.png index 4c2c8ca7..77c6fea 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-ratio-expected.png index 4d7c1f6c..cea0333 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-ratio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-shadow-expected.png index a9b0844..de945bf 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-mask-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png index 221d741..abe9ebe 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png index fa8bdf9..cc1dbd56 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/hdr/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/linux/hdr/video-canvas-alpha-expected.png index 06eb20c7..0bee239 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/hdr/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/hdr/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls-after-reload-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls-after-reload-expected.png index ae694e3..8bd80e77 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls-after-reload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls-after-reload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls-strict-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls-strict-expected.png index 76b830a..d6fd0639 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-expected.png index 688d91f..f0ea9f3 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-strict-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-strict-expected.png index 394a004..04d347f2 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls-styling-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls-without-preload-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls-without-preload-expected.png index ea509a60..4af285a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls-without-preload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls-without-preload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/controls/video-controls-with-cast-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/controls/video-controls-with-cast-rendering-expected.png index 537d5b9a..a72bd86 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/controls/video-controls-with-cast-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/controls/video-controls-with-cast-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png index a89aacd..c53e8c5a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-aspect-ratio-expected.png index b59d3e1..324e5f47 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-aspect-ratio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-aspect-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-canvas-alpha-expected.png index b883aeb..d67be5e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-controls-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-controls-rendering-expected.png index 4acbe8d..ea0ff02 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-controls-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-controls-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-display-toggle-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-display-toggle-expected.png index c383bc1..a87c52cd 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-display-toggle-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-display-toggle-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-layer-crash-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-layer-crash-expected.png index 6e7298d..48fb9ca 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-layer-crash-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-layer-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/video-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/video-zoom-expected.png index 672d8dca..e090223 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/video-zoom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/video-zoom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/013-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/013-expected.txt index a1671d4a..69fa073 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/013-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/013-expected.txt
@@ -5,7 +5,7 @@ LayoutBlockFlow {html} at (0,0) size 800x105 LayoutBlockFlow {body} at (8,8) size 784x81 LayoutBlockFlow (anonymous) at (0,0) size 784x25 - LayoutSVGRoot {svg} at (0,0) size 784x20 + LayoutSVGRoot {svg} at (0,0) size 0x20 LayoutSVGText {text} at (10,20) size 123x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (10,20) size 123x12 chunk 1 text run 1 at (10.00,30.00) startOffset 0 endOffset 30 width 123.00: "FAIL (This should not render.)"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/full-screen-iframe-allowed-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/full-screen-iframe-allowed-video-expected.png index 74139f5..67b1b2d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/full-screen-iframe-allowed-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/full-screen-iframe-allowed-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-controls-timeline-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-controls-timeline-expected.png index 51535ece..4f7da3e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-controls-timeline-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-controls-timeline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-scrolled-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-scrolled-iframe-expected.png index 74139f5..67b1b2d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-scrolled-iframe-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/android/fullscreen/video-scrolled-iframe-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png index 0735864..db06fddb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering-expected.png index 537d5b9a..a72bd86 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-after-reload-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-after-reload-expected.png index 1539890e..0401513 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-after-reload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-after-reload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-strict-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-strict-expected.png index 68f2e707..2100cce 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-expected.png index b10ac3a..de3e2b1 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-strict-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-strict-expected.png index c2831754..cb24318 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-styling-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-without-preload-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-without-preload-expected.png index 2f6e4572..8f1db91e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-without-preload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls-without-preload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls/video-controls-with-cast-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls/video-controls-with-cast-rendering-expected.png index 537d5b9a..a72bd86 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls/video-controls-with-cast-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/controls/video-controls-with-cast-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png new file mode 100644 index 0000000..c53e8c5a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-aspect-ratio-expected.png new file mode 100644 index 0000000..324e5f47 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-aspect-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-canvas-alpha-expected.png index b883aeb..d67be5e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-controls-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-controls-rendering-expected.png index dba0a91..e8acd003 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-controls-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-controls-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-display-toggle-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-display-toggle-expected.png index 5d8056c..86a0f024 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-display-toggle-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-display-toggle-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-layer-crash-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-layer-crash-expected.png index 2fef1285..93be32fd 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-layer-crash-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/video-surface-layer/media/video-layer-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png index 1d21c0b..953296b8 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png index 8849cbe..6c8f9ae 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png new file mode 100644 index 0000000..a205478 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png new file mode 100644 index 0000000..17047d0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png new file mode 100644 index 0000000..45ced1f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png new file mode 100644 index 0000000..b5957be --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png new file mode 100644 index 0000000..21b31045 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png new file mode 100644 index 0000000..b79730e --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/layers-inside-overflow-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/layers-inside-overflow-scroll-expected.png index 998c1d17..15fe5933 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/compositing/layers-inside-overflow-scroll-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/layers-inside-overflow-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/self-painting-layers-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/self-painting-layers-expected.png index ea61ed4..f86fbf6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/compositing/self-painting-layers-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/self-painting-layers-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt new file mode 100644 index 0000000..e40c9a7a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL fieldset content before legend assert_equals: expected 49 but got 68 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-expected.png index a1e1f95..9622a125 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-filter-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-filter-expected.png index 1b7d94c..62012ad7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-filter-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-object-fit-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-object-fit-expected.png index 38cad4d..4ab4bbf4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-object-fit-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-video-seek-object-fit-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/video-replaces-poster-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/video-replaces-poster-expected.png index 0842f1cd..d1a68a7e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/video-replaces-poster-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/video-replaces-poster-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/error/013-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/error/013-expected.txt index 3e467c4..68a3eb6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/error/013-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/error/013-expected.txt
@@ -5,7 +5,7 @@ LayoutBlockFlow {html} at (0,0) size 800x100 LayoutBlockFlow {body} at (8,8) size 784x76 LayoutBlockFlow (anonymous) at (0,0) size 784x24 - LayoutSVGRoot {svg} at (0,0) size 784x20 + LayoutSVGRoot {svg} at (0,0) size 0x20 LayoutSVGText {text} at (10,20) size 122.86x13 contains 1 chunk(s) LayoutSVGInlineText {#text} at (10,20) size 122.86x13 chunk 1 text run 1 at (10.00,30.00) startOffset 0 endOffset 30 width 122.86: "FAIL (This should not render.)"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-border-radius-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-border-radius-expected.png index f5ed92e..67bb655 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-border-radius-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-border-radius-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-filter-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-filter-expected.png index 343339f..0f849b0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-filter-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-group-expected.png index a0f1ae5..ba8084b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-group-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png index e75410e7..c1a31a79 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-expected.png index 312fb69..16906c6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png index e3e44af..7d13f75 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-layer-expected.png index bfd447d..2046453 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-layer-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-fixed-scrolling-expected.png index 8706c32..9d081a6 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-fixed-scrolling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-fixed-scrolling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-opacity-overlay-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-opacity-overlay-expected.png index 2c183da6..40bc4aa 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-opacity-overlay-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/geometry/video-opacity-overlay-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/load-video-in-reflection-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/load-video-in-reflection-expected.png index 3a9df44a..467d0f7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/load-video-in-reflection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/load-video-in-reflection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt new file mode 100644 index 0000000..f04da41 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-content-before-legend-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL fieldset content before legend assert_equals: expected 53 but got 74 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-expected.png index 98e10fd..7377763 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-ratio-expected.png index 986a73e..ec815b20 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-ratio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-shadow-expected.png index 8b6831f..8857bd2 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-shadow-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-mask-video-shadow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png index 738737a..d22cd1e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png index 012020b..9282daec 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/hdr/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/win/hdr/video-canvas-alpha-expected.png index 124201b..5461d3d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/hdr/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/hdr/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/controls-after-reload-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/controls-after-reload-expected.png index 4928cd2..de120d95 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/controls-after-reload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/controls-after-reload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/controls-strict-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/controls-strict-expected.png index c66f6954..23e5fec 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/controls-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/controls-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-expected.png index a246016..b41de2a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-strict-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-strict-expected.png index abfa108..1a95640 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/controls-styling-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/controls-without-preload-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/controls-without-preload-expected.png index f94050cd..b5ae4e0e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/controls-without-preload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/controls-without-preload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/track/track-cue-rendering-vertical-expected.png index bf871e7..457955f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/track/track-cue-rendering-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-aspect-ratio-expected.png index d330366..0039ac4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-aspect-ratio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-aspect-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-canvas-alpha-expected.png index c35a9743..68d086c3 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-controls-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-controls-rendering-expected.png index 91a9fd9..7066ee9 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-controls-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-controls-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-display-toggle-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-display-toggle-expected.png index 2bc5c1f..8b15efb 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-display-toggle-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-display-toggle-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-layer-crash-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-layer-crash-expected.png index f0a5be86..1c1ed78 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-layer-crash-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-layer-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-remove-insert-repaints-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-remove-insert-repaints-expected.png index 1a19a91..97815bb 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-remove-insert-repaints-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-remove-insert-repaints-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/video-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/video-zoom-expected.png index ceea35d..0fe48d7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/video-zoom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/video-zoom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/error/013-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/error/013-expected.txt index 027f954d..4f87f81 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/error/013-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/error/013-expected.txt
@@ -5,7 +5,7 @@ LayoutBlockFlow {html} at (0,0) size 800x105 LayoutBlockFlow {body} at (8,8) size 784x81 LayoutBlockFlow (anonymous) at (0,0) size 784x25 - LayoutSVGRoot {svg} at (0,0) size 784x20 + LayoutSVGRoot {svg} at (0,0) size 0x20 LayoutSVGText {text} at (10,20) size 124x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (10,20) size 124x12 chunk 1 text run 1 at (10.00,30.00) startOffset 0 endOffset 30 width 124.00: "FAIL (This should not render.)"
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-border-radius-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-border-radius-expected.png index ec0e21a..d4c9f82 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-border-radius-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-border-radius-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-filter-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-filter-expected.png index 87082b4..dd4d70c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-filter-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-group-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-group-expected.png index a3a5004..0fdece7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-group-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png index ccbd78d..9187eb1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-expected.png index ac8932e..336db4e1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png index fcce2f9..dbb0bf3 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-expected.png index 96f01fc2..cfe9604 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-filter-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-filter-expected.png index e6407020..c74aa17f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-filter-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-layer-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png index 8e584d93..792066a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png index 48dab34..b4c413b4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png index 48dab34..b4c413b4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-after-reload-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-after-reload-expected.png index eef0cb3..291d37f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-after-reload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-after-reload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-strict-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-strict-expected.png index 2871916..48e458e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-expected.png index 7e13b6d..a9ecccb 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-strict-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-strict-expected.png index ce20a09..6829645 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-strict-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-styling-strict-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-without-preload-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-without-preload-expected.png index 8e94be13..318db84a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-without-preload-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/controls-without-preload-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-canvas-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-canvas-alpha-expected.png index c35a9743..68d086c3 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-canvas-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-canvas-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-controls-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-controls-rendering-expected.png index 3b93cbe..0df3ac1a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-controls-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-controls-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-display-toggle-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-display-toggle-expected.png index f4e0d0d..69f525c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-display-toggle-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-display-toggle-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-layer-crash-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-layer-crash-expected.png index de74648..2c7f8c2 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-layer-crash-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/video-surface-layer/media/video-layer-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png new file mode 100644 index 0000000..738737a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png new file mode 100644 index 0000000..012020b --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/win7/media/track/track-cue-rendering-vertical-expected.png index 39ab448..12d70d3 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/media/track/track-cue-rendering-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png new file mode 100644 index 0000000..8e584d93 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png new file mode 100644 index 0000000..48dab34 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png new file mode 100644 index 0000000..48dab34 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png new file mode 100644 index 0000000..12d70d3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/video-surface-layer/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/resources/js-test.js b/third_party/WebKit/LayoutTests/resources/js-test.js index 1d0483c..6137386 100644 --- a/third_party/WebKit/LayoutTests/resources/js-test.js +++ b/third_party/WebKit/LayoutTests/resources/js-test.js
@@ -748,6 +748,9 @@ // that something is dead need to use this asynchronous collectGarbage // function. function asyncGC(callback) { + if (!callback) { + return new Promise(resolve => asyncGC(resolve)); + } var documentsBefore = internals.numberOfLiveDocuments(); GCController.collectAll(); // FIXME: we need a better way of waiting for chromium events to happen
diff --git a/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt b/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt index 851af33..c18e889 100644 --- a/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt
@@ -89,22 +89,22 @@ PASS computedStyle("mask", "x", "1em") is "16px" PASS computedStyle("mask", "x", "20%") is "20%" PASS computedStyle("mask", "x", "-200px") is "-200px" -PASS computedStyle("mask", "x", "auto") is "0px" -PASS computedStyle("mask", "x", "100 px") is "0px" -PASS computedStyle("mask", "x", "100px;") is "0px" -PASS computedStyle("mask", "x", "100px !important") is "0px" -PASS computedStyle("mask", "x", "{ 100px }") is "0px" +PASS computedStyle("mask", "x", "auto") is "-10%" +PASS computedStyle("mask", "x", "100 px") is "-10%" +PASS computedStyle("mask", "x", "100px;") is "-10%" +PASS computedStyle("mask", "x", "100px !important") is "-10%" +PASS computedStyle("mask", "x", "{ 100px }") is "-10%" PASS computedStyle("mask", "y", " 100") is "100px" PASS computedStyle("mask", "y", "100 ") is "100px" PASS computedStyle("mask", "y", "100px") is "100px" PASS computedStyle("mask", "y", "1em") is "16px" PASS computedStyle("mask", "y", "20%") is "20%" PASS computedStyle("mask", "y", "-200px") is "-200px" -PASS computedStyle("mask", "y", "auto") is "0px" -PASS computedStyle("mask", "y", "100 px") is "0px" -PASS computedStyle("mask", "y", "100px;") is "0px" -PASS computedStyle("mask", "y", "100px !important") is "0px" -PASS computedStyle("mask", "y", "{ 100px }") is "0px" +PASS computedStyle("mask", "y", "auto") is "-10%" +PASS computedStyle("mask", "y", "100 px") is "-10%" +PASS computedStyle("mask", "y", "100px;") is "-10%" +PASS computedStyle("mask", "y", "100px !important") is "-10%" +PASS computedStyle("mask", "y", "{ 100px }") is "-10%" PASS computedStyle("svg", "x", " 100") is "100px" PASS computedStyle("svg", "x", "100 ") is "100px" PASS computedStyle("svg", "x", "100px") is "100px"
diff --git a/third_party/WebKit/LayoutTests/svg/css/parse-length.html b/third_party/WebKit/LayoutTests/svg/css/parse-length.html index 70a2f7be..29a1626e 100644 --- a/third_party/WebKit/LayoutTests/svg/css/parse-length.html +++ b/third_party/WebKit/LayoutTests/svg/css/parse-length.html
@@ -25,15 +25,11 @@ shouldBeEqualToString('computedStyle("' + elementname + '", "' + property + '", "' + value + '")', expected); } -function negativeTest(elementname, property, value) { - testComputed(elementname, property, value, "auto"); +function negativeTest(elementname, property, value, expected) { + testComputed(elementname, property, value, expected); } -function negativeTestZero(elementname, property, value) { - testComputed(elementname, property, value, "0px"); -} - -function testAttributeOnElement(elementname, attributename) { +function testAttributeOnElement(elementname, attributename, initial_value) { testComputed(elementname, attributename, " 100", "100px"); testComputed(elementname, attributename, "100 ", "100px"); testComputed(elementname, attributename, "100px", "100px"); @@ -42,26 +38,28 @@ testComputed(elementname, attributename, "20%", "20%"); testComputed(elementname, attributename, "-200px", "-200px"); - negativeTestZero(elementname, attributename, "auto", "auto"); - negativeTestZero(elementname, attributename, "100 px"); - negativeTestZero(elementname, attributename, "100px;"); - negativeTestZero(elementname, attributename, "100px !important"); - negativeTestZero(elementname, attributename, "{ 100px }"); + negativeTest(elementname, attributename, "auto", initial_value); + negativeTest(elementname, attributename, "100 px", initial_value); + negativeTest(elementname, attributename, "100px;", initial_value); + negativeTest(elementname, attributename, "100px !important", initial_value); + negativeTest(elementname, attributename, "{ 100px }", initial_value); } var xyelements = [ "mask", "svg", "rect", "image", "foreignObject" ]; for (var elm of xyelements) { - testAttributeOnElement(elm, "x"); - testAttributeOnElement(elm, "y"); + let initial_value = elm === "mask" ? "-10%" : "0px"; + testAttributeOnElement(elm, "x", initial_value); + testAttributeOnElement(elm, "y", initial_value); } var rxryelements = [ "rect", "ellipse" ]; for (var elm of rxryelements) { - testAttributeOnElement(elm, "rx"); - testAttributeOnElement(elm, "ry"); + let initial_value = "0px"; + testAttributeOnElement(elm, "rx", initial_value); + testAttributeOnElement(elm, "ry", initial_value); } -testAttributeOnElement("circle", "r"); +testAttributeOnElement("circle", "r", "0px"); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/svg/dom/no-value-synching-after-setattr.html b/third_party/WebKit/LayoutTests/svg/dom/no-value-synching-after-setattr.html new file mode 100644 index 0000000..ab1cb9a1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/dom/no-value-synching-after-setattr.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title>Property value does not override the attribute value after invalid attribute is set</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script> +test(function() { + var marker = document.createElementNS("http://www.w3.org/2000/svg", "marker"); + assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE, "initial"); + + // Set to 'auto' via property. + marker.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO; + + // Set attribute to invalid value. + marker.setAttribute("orient", "aito"); + assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE, "initial"); + assert_equals(marker.orientAngle.baseVal.value, 0); + + // Read the attribute. + assert_equals(marker.getAttribute("orient"), "aito", "attribute value unchanged"); +}, document.title+', setting orientType.'); + +test(function() { + var marker = document.createElementNS("http://www.w3.org/2000/svg", "marker"); + assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE, "initial"); + marker.orientAngle.baseVal.value = 90; + + // Set attribute to invalid value. + marker.setAttribute("orient", "aito"); + assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE, "initial"); + assert_equals(marker.orientAngle.baseVal.value, 0); + + // Read the attribute. + assert_equals(marker.getAttribute("orient"), "aito", "attribute value unchanged"); +}, document.title+', setting orientAngle.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/svg/dom/resources/initial-value-helper.js b/third_party/WebKit/LayoutTests/svg/dom/resources/initial-value-helper.js new file mode 100644 index 0000000..722ecf4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/dom/resources/initial-value-helper.js
@@ -0,0 +1,51 @@ +const objects = { + SVGCircleElement: 'circle', + SVGEllipseElement: 'ellipse', + SVGFilterElement: 'filter', + SVGFilterPrimitiveStandardAttributes: 'feBlend', + SVGForeignObjectElement: 'foreignObject', + SVGImageElement: 'image', + SVGLineElement: 'line', + SVGLinearGradientElement: 'linearGradient', + SVGMarkerElement: 'marker', + SVGMaskElement: 'mask', + SVGPatternElement: 'pattern', + SVGRadialGradientElement: 'radialGradient', + SVGRectElement: 'rect', + SVGSVGElement: 'svg', + SVGTextContentElement: 'text', + SVGTextPathElement: 'textPath', + SVGUseElement: 'use', +}; + +function assert_initial_values(attribute_map, config) { + if (typeof config == 'undefined') + config = {}; + let getValue = config.getValue || function(value) { return value; }; + for (let info of attribute_map) { + for (let attribute of info.attributes) { + let content_attribute = config.mapProperty && config.mapProperty[attribute] || attribute; + test(function() { + let e = document.createElementNS('http://www.w3.org/2000/svg', objects[info.interface]); + let initial = info[attribute] && info[attribute].initial || config.initial; + let valid = info[attribute] && info[attribute].valid || config.valid; + assert_equals(getValue(e[attribute].baseVal), initial, 'initial before'); + e.setAttribute(content_attribute, valid); + assert_not_equals(getValue(e[attribute].baseVal), initial, 'new value'); + e.removeAttribute(content_attribute); + assert_equals(getValue(e[attribute].baseVal), initial, 'initial after'); + }, document.title + ', ' + info.interface + '.prototype.' + attribute + ' (remove)'); + + test(function() { + let e = document.createElementNS('http://www.w3.org/2000/svg', objects[info.interface]); + let initial = info[attribute] && info[attribute].initial || config.initial; + let valid = info[attribute] && info[attribute].valid || config.valid; + assert_equals(getValue(e[attribute].baseVal), initial, 'initial before'); + e.setAttribute(content_attribute, valid); + assert_not_equals(getValue(e[attribute].baseVal), initial, 'new value'); + e.setAttribute(content_attribute, 'foobar'); + assert_equals(getValue(e[attribute].baseVal), initial, 'initial after'); + }, document.title + ', ' + info.interface + '.prototype.' + attribute + ' (invalid value)'); + } + } +}
diff --git a/third_party/WebKit/LayoutTests/svg/dom/svganimatedangle-initial-values.html b/third_party/WebKit/LayoutTests/svg/dom/svganimatedangle-initial-values.html new file mode 100644 index 0000000..90e8786 --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/dom/svganimatedangle-initial-values.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>SVGAnimatedAngle, initial values</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/initial-value-helper.js"></script> +<script> +assert_initial_values([ + { interface: 'SVGMarkerElement', attributes: [ 'orientAngle' ], + orientAngle: { initial: '0', valid: '90deg' } }, +], { mapProperty: { orientAngle: 'orient' }, + getValue: function(value) { return value.valueAsString } }); +</script>
diff --git a/third_party/WebKit/LayoutTests/svg/dom/svganimatedlength-initial-values.html b/third_party/WebKit/LayoutTests/svg/dom/svganimatedlength-initial-values.html new file mode 100644 index 0000000..fa22e5c5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/dom/svganimatedlength-initial-values.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title>SVGAnimatedLength, initial values</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/initial-value-helper.js"></script> +<script> +// Initial values of '0' need not be specified. +assert_initial_values([ + { interface: 'SVGCircleElement', attributes: [ 'cx', 'cy', 'r' ] }, + { interface: 'SVGEllipseElement', attributes: [ 'cx', 'cy', 'rx', 'ry' ] }, + { interface: 'SVGFilterElement', attributes: [ 'x', 'y', 'width', 'height' ], + x: { initial: '-10%' }, y: { initial: '-10%' }, width: { initial: '120%' }, height: { initial: '120%' } }, + { interface: 'SVGFilterPrimitiveStandardAttributes', attributes: [ 'x', 'y', 'width', 'height' ], + x: { initial: '0%' }, y: { initial: '0%' }, width: { initial: '100%' }, height: { initial: '100%' } }, + { interface: 'SVGForeignObjectElement', attributes: [ 'x', 'y', 'width', 'height' ] }, + { interface: 'SVGImageElement', attributes: [ 'x', 'y', 'width', 'height' ] }, + { interface: 'SVGLineElement', attributes: [ 'x1', 'y1', 'x2', 'y2' ] }, + { interface: 'SVGLinearGradientElement', attributes: [ 'x1', 'y1', 'x2', 'y2' ], + x1: { initial: '0%' }, y1: { initial: '0%' }, x2: { initial: '100%' }, y2: { initial: '0%' } }, + { interface: 'SVGMarkerElement', attributes: [ 'refX', 'refY', 'markerWidth', 'markerHeight' ], + markerWidth: { initial: '3' }, markerHeight: { initial: '3' } }, + { interface: 'SVGMaskElement', attributes: [ 'x', 'y', 'width', 'height' ], + x: { initial: '-10%' }, y: { initial: '-10%' }, width: { initial: '120%' }, height: { initial: '120%' } }, + { interface: 'SVGPatternElement', attributes: [ 'x', 'y', 'width', 'height' ] }, + { interface: 'SVGRadialGradientElement', attributes: [ 'cx', 'cy', 'r', 'fx', 'fy', 'fr' ], + cx: { initial: '50%' }, cy: { initial: '50%' }, r: { initial: '50%' }, + fx: { initial: '50%' }, fy: { initial: '50%' }, fr: { initial: '0%' } }, + { interface: 'SVGRectElement', attributes: [ 'x', 'y', 'width', 'height', 'rx', 'ry' ] }, + { interface: 'SVGSVGElement', attributes: [ 'x', 'y', 'width', 'height' ], + width: { initial: '100%' }, height: { initial: '100%' } }, + { interface: 'SVGTextContentElement', attributes: [ 'textLength' ] }, + { interface: 'SVGTextPathElement', attributes: [ 'startOffset' ] }, + { interface: 'SVGUseElement', attributes: [ 'x', 'y', 'width', 'height' ] }, +], { initial: '0', valid: '42', getValue: function(value) { return value.valueAsString } }); +</script>
diff --git a/third_party/WebKit/LayoutTests/svg/text/getsubstringlength-emoji-ligatures.html b/third_party/WebKit/LayoutTests/svg/text/getsubstringlength-emoji-ligatures.html deleted file mode 100644 index ae4701ff..0000000 --- a/third_party/WebKit/LayoutTests/svg/text/getsubstringlength-emoji-ligatures.html +++ /dev/null
@@ -1,30 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>SVGTextContentElement.getSubStringLength on Emoji with ligatures</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<svg> - <g font-family="Comic Sans MS" font-size="50" text-rendering="geometricPrecision"> - <text y="50">👦</text> - <text y="100">👨👩👧👦</text> - <text y="50" x="100">👨</text> - <text y="100" x="100">👩🏽🌾</text> - <text y="50" x="150">👨👦</text> - <text y="100" x="150">👱🏽♂️</text> - <text y="50" x="200">🎅🏽</text> - </g> -</svg> -<script> - test(function() { - const textElements = document.getElementsByTagName('text'); - - for (let i = 0; i < textElements.length; i++) { - const element = textElements[i]; - const subStringLength = element.getSubStringLength(0, element.getNumberOfChars()); - const bboxWidth = element.getBBox().width; - // Expect the value computed by getSubStringLength() to roughly - // match the value computed for the bbox. - assert_approx_equals(subStringLength, bboxWidth, 1); - } -}); -</script>
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/cHRM_color_spin-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/cHRM_color_spin-expected.png index a5ae50d..51ebc3f 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/cHRM_color_spin-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/cHRM_color_spin-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-background-image-space-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-background-image-space-expected.png index 506f9b7..c786c21 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-background-image-space-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-background-image-space-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png index 12f951d4..1ce5e28 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png index fa22fdd..774c79a 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-svg-resource-url-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-svg-resource-url-expected.png index cb36d93..6accadada 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-svg-resource-url-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-svg-resource-url-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-mask-image-svg-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-mask-image-svg-expected.png index 08938e7..b6b28be6 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-mask-image-svg-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-mask-image-svg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas-expected.png index 128dfb5..150214e 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-image-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-image-expected.png index 6f0c20a4..f9dfff0 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-image-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/jpeg-yuv-progressive-image-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossless-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossless-expected.png index 1cc7ba4..1ddd169 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossless-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossless-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-alpha-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-alpha-expected.png index 20817dd7..15a364a 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-alpha-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-alpha-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-expected.png index d4e3429..5a152d60 100644 --- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-expected.png +++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/webp-color-profile-lossy-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub-expected.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub-expected.txt new file mode 100644 index 0000000..db234ae --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Same-Origin sharedworker assert_not_equals: Empty Sec-Metadata header. got disallowed value "" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/fetch/chromium/data-saver-expected.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/fetch/chromium/data-saver-expected.txt new file mode 100644 index 0000000..bf661f48 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/fetch/chromium/data-saver-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS fetch() from document with Data-Saver disabled. +PASS fetch() from dedicated worker with Data-Saver disabled. +PASS fetch() from shared worker with Data-Saver disabled. +PASS fetch() from document with Data-Saver enabled. +PASS fetch() from dedicated worker with Data-Saver enabled. +FAIL fetch() from shared worker with Data-Saver enabled. promise_test: Unhandled rejection with value: object "Error: assert_equals: Save-Data header should be sent for worker script when enabled. expected "Save-Data: on" but got "No Save-Data"" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/navigation/README.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/navigation/README.txt new file mode 100644 index 0000000..30d5020 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/navigation/README.txt
@@ -0,0 +1,3 @@ +This directory is for testing out-of-blink CORS implementation. + +We use "http/tests/navigation" directory for testing navigation with CORS.
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/security/README.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/security/README.txt new file mode 100644 index 0000000..afc64e2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/http/tests/security/README.txt
@@ -0,0 +1,3 @@ +This directory is for testing out-of-blink CORS implementation. + +We use "http/tests/security directory for testing security feature with CORS.
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/navigation/README.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/navigation/README.txt new file mode 100644 index 0000000..30d5020 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/navigation/README.txt
@@ -0,0 +1,3 @@ +This directory is for testing out-of-blink CORS implementation. + +We use "http/tests/navigation" directory for testing navigation with CORS.
diff --git a/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/security/README.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/security/README.txt new file mode 100644 index 0000000..afc64e2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/http/tests/security/README.txt
@@ -0,0 +1,3 @@ +This directory is for testing out-of-blink CORS implementation. + +We use "http/tests/security directory for testing security feature with CORS.
diff --git a/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial-with-network-service/http/tests/loading/sxg/nested-sxg-expected.txt b/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial-with-network-service/http/tests/loading/sxg/nested-sxg-expected.txt new file mode 100644 index 0000000..b4aa8b35 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial-with-network-service/http/tests/loading/sxg/nested-sxg-expected.txt
@@ -0,0 +1,13 @@ +main frame - didStartProvisionalLoadForFrame +main frame - didCommitLoadForFrame +main frame - didReceiveTitle: Nested SignedHTTPExchange +main frame - didFinishDocumentLoadForFrame +main frame - didHandleOnloadEventsForFrame +main frame - didFinishLoadForFrame +frame "sxg_iframe" - didReceiveTitle: +frame "sxg_iframe" - didStartProvisionalLoadForFrame +frame "sxg_iframe" - didFailProvisionalLoadWithError +This is a testharness.js-based test. +FAIL Nested SignedHTTPExchange promise_test: Unhandled rejection with value: "timeout" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial/http/tests/loading/sxg/nested-sxg-expected.txt b/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial/http/tests/loading/sxg/nested-sxg-expected.txt new file mode 100644 index 0000000..b4aa8b35 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/sxg-origin-trial/http/tests/loading/sxg/nested-sxg-expected.txt
@@ -0,0 +1,13 @@ +main frame - didStartProvisionalLoadForFrame +main frame - didCommitLoadForFrame +main frame - didReceiveTitle: Nested SignedHTTPExchange +main frame - didFinishDocumentLoadForFrame +main frame - didHandleOnloadEventsForFrame +main frame - didFinishLoadForFrame +frame "sxg_iframe" - didReceiveTitle: +frame "sxg_iframe" - didStartProvisionalLoadForFrame +frame "sxg_iframe" - didFailProvisionalLoadWithError +This is a testharness.js-based test. +FAIL Nested SignedHTTPExchange promise_test: Unhandled rejection with value: "timeout" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt index f5c9998e..19377e0d 100644 --- a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window-expected.txt
@@ -131,8 +131,8 @@ PASS RTCSessionDescription interface: existence and properties of interface prototype object PASS RTCSessionDescription interface: existence and properties of interface prototype object's "constructor" property PASS RTCSessionDescription interface: existence and properties of interface prototype object's @@unscopables property -FAIL RTCSessionDescription interface: attribute type assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" +FAIL RTCSessionDescription interface: attribute type assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set type() { [native code] }" +FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdp() { [native code] }" PASS RTCSessionDescription interface: operation toJSON() PASS RTCSessionDescription must be primary interface of new RTCSessionDescription({ type: 'offer' }) PASS Stringification of new RTCSessionDescription({ type: 'offer' }) @@ -146,9 +146,9 @@ PASS RTCIceCandidate interface: existence and properties of interface prototype object PASS RTCIceCandidate interface: existence and properties of interface prototype object's "constructor" property PASS RTCIceCandidate interface: existence and properties of interface prototype object's @@unscopables property -FAIL RTCIceCandidate interface: attribute candidate assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCIceCandidate interface: attribute sdpMid assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" -FAIL RTCIceCandidate interface: attribute sdpMLineIndex assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }" +FAIL RTCIceCandidate interface: attribute candidate assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set candidate() { [native code] }" +FAIL RTCIceCandidate interface: attribute sdpMid assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdpMid() { [native code] }" +FAIL RTCIceCandidate interface: attribute sdpMLineIndex assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function set sdpMLineIndex() { [native code] }" FAIL RTCIceCandidate interface: attribute foundation assert_true: The prototype object must have a property "foundation" expected true got false FAIL RTCIceCandidate interface: attribute component assert_true: The prototype object must have a property "component" expected true got false FAIL RTCIceCandidate interface: attribute priority assert_true: The prototype object must have a property "priority" expected true got false
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt index 72f1af9..e791f4ba 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1091,6 +1091,14 @@ [Worker] getter ignoreBOM [Worker] method constructor [Worker] method decode +[Worker] interface TextDecoderStream +[Worker] attribute @@toStringTag +[Worker] getter encoding +[Worker] getter fatal +[Worker] getter ignoreBOM +[Worker] getter readable +[Worker] getter writable +[Worker] method constructor [Worker] interface TextDetector [Worker] attribute @@toStringTag [Worker] method constructor @@ -1100,6 +1108,12 @@ [Worker] getter encoding [Worker] method constructor [Worker] method encode +[Worker] interface TextEncoderStream +[Worker] attribute @@toStringTag +[Worker] getter encoding +[Worker] getter readable +[Worker] getter writable +[Worker] method constructor [Worker] interface TransformStream [Worker] getter readable [Worker] getter writable
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 0801a304..22774cb0 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -7172,6 +7172,14 @@ getter ignoreBOM method constructor method decode +interface TextDecoderStream + attribute @@toStringTag + getter encoding + getter fatal + getter ignoreBOM + getter readable + getter writable + method constructor interface TextDetector attribute @@toStringTag method constructor @@ -7181,6 +7189,12 @@ getter encoding method constructor method encode +interface TextEncoderStream + attribute @@toStringTag + getter encoding + getter readable + getter writable + method constructor interface TextEvent : UIEvent attribute @@toStringTag getter data
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt index 2ff5e24..77efc93 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1091,6 +1091,14 @@ [Worker] getter ignoreBOM [Worker] method constructor [Worker] method decode +[Worker] interface TextDecoderStream +[Worker] attribute @@toStringTag +[Worker] getter encoding +[Worker] getter fatal +[Worker] getter ignoreBOM +[Worker] getter readable +[Worker] getter writable +[Worker] method constructor [Worker] interface TextDetector [Worker] attribute @@toStringTag [Worker] method constructor @@ -1100,6 +1108,12 @@ [Worker] getter encoding [Worker] method constructor [Worker] method encode +[Worker] interface TextEncoderStream +[Worker] attribute @@toStringTag +[Worker] getter encoding +[Worker] getter readable +[Worker] getter writable +[Worker] method constructor [Worker] interface TransformStream [Worker] getter readable [Worker] getter writable
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index e3f0d9e8..af2b5f63 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -56,6 +56,7 @@ "service_worker/service_worker_state.mojom", "service_worker/service_worker_stream_handle.mojom", "shared_worker/shared_worker_creation_context_type.mojom", + "shared_worker/shared_worker_main_script_load_params.mojom", "speech/speech_recognition_error.mojom", "speech/speech_recognition_grammar.mojom", "speech/speech_recognition_result.mojom",
diff --git a/third_party/blink/public/mojom/presentation/presentation.mojom b/third_party/blink/public/mojom/presentation/presentation.mojom index ad1cdf19a..2f9f405 100644 --- a/third_party/blink/public/mojom/presentation/presentation.mojom +++ b/third_party/blink/public/mojom/presentation/presentation.mojom
@@ -69,7 +69,7 @@ // Called when a message is sent by the target connection. // TODO(crbug.com/749327): Remove the return value since it is no longer // used. - OnMessage(PresentationConnectionMessage message) => (bool success); + OnMessage(PresentationConnectionMessage message); // Called when target connection notifies connection state change. DidChangeState(PresentationConnectionState state);
diff --git a/third_party/blink/public/mojom/service_worker/service_worker_registration.mojom b/third_party/blink/public/mojom/service_worker/service_worker_registration.mojom index d0611e54..6278dde 100644 --- a/third_party/blink/public/mojom/service_worker/service_worker_registration.mojom +++ b/third_party/blink/public/mojom/service_worker/service_worker_registration.mojom
@@ -19,6 +19,12 @@ kNone, }; +struct ChangedServiceWorkerObjectsMask { + bool installing; + bool waiting; + bool active; +}; + // Represents options for register(): // https://w3c.github.io/ServiceWorker/#dictdef-registrationoptions struct ServiceWorkerRegistrationOptions { @@ -94,16 +100,13 @@ interface ServiceWorkerRegistrationObject { // Sets changed service worker objects for this registration object. // |changed_mask| indicates which objects of {|installing|,|waiting|,|active|} - // have changed. See ChangedVersionAttributesMask in service_worker_types.h - // for details. + // have changed. // Changed objects may be null to indicate that the object does not exist // anymore. Unchanged ones are always null. - // TODO(leonhsl): Use mojofied ChangedVersionAttributesMask directly instead - // of an int32 for |changed_mask|. - SetVersionAttributes(int32 changed_mask, - ServiceWorkerObjectInfo? installing, - ServiceWorkerObjectInfo? waiting, - ServiceWorkerObjectInfo? active); + SetServiceWorkerObjects(ChangedServiceWorkerObjectsMask changed_mask, + ServiceWorkerObjectInfo? installing, + ServiceWorkerObjectInfo? waiting, + ServiceWorkerObjectInfo? active); // Sets ServiceWorkerRegistration#updateViaCache. SetUpdateViaCache(ServiceWorkerUpdateViaCache update_via_cache);
diff --git a/third_party/blink/public/mojom/shared_worker/shared_worker_main_script_load_params.mojom b/third_party/blink/public/mojom/shared_worker/shared_worker_main_script_load_params.mojom new file mode 100644 index 0000000..22e5f0b --- /dev/null +++ b/third_party/blink/public/mojom/shared_worker/shared_worker_main_script_load_params.mojom
@@ -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. + +module blink.mojom; + +import "services/network/public/mojom/url_loader.mojom"; + +// NetworkService (PlzWorker): +// Used for passing the shared worker main script pre-requested by the browser +// process and its redirect information. +struct SharedWorkerMainScriptLoadParams { + // Used for loading the pre-requested main script in the renderer process. + network.mojom.URLResponseHead response_head; + network.mojom.URLLoaderClientEndpoints? url_loader_client_endpoints; + + // The list of redirects that led to this script load. Empty if there were no + // redirects. + array<network.mojom.URLRequestRedirectInfo> redirect_infos; + + // The list of redirect response heads. Empty if there were no redirects. + array<network.mojom.URLResponseHead> redirect_response_heads; +};
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_installed_scripts_manager.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_installed_scripts_manager.h index f79bd3a..ddb4e344 100644 --- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_installed_scripts_manager.h +++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_installed_scripts_manager.h
@@ -30,7 +30,6 @@ WebString encoding, WebVector<BytesChunk> script_text, WebVector<BytesChunk> meta_data); - static std::unique_ptr<RawScriptData> CreateInvalidInstance(); // Implementation of the destructor should be in the Blink side because only // Blink can know all of members. @@ -38,29 +37,23 @@ void AddHeader(const WebString& key, const WebString& value); - // Returns false if it fails to receive the script from the browser. - bool IsValid() const { return is_valid_; } // The encoding of the script text. const WebString& Encoding() const { - DCHECK(is_valid_); return encoding_; } // An array of raw byte chunks of the script text. const WebVector<BytesChunk>& ScriptTextChunks() const { - DCHECK(is_valid_); return script_text_; } // An array of raw byte chunks of the scripts's meta data from the script's // V8 code cache. const WebVector<BytesChunk>& MetaDataChunks() const { - DCHECK(is_valid_); return meta_data_; } #if INSIDE_BLINK // The HTTP headers of the script. std::unique_ptr<CrossThreadHTTPHeaderMapData> TakeHeaders() { - DCHECK(is_valid_); return std::move(headers_); } #endif // INSIDE_BLINK @@ -70,9 +63,7 @@ // know the exact size of this instance. RawScriptData(WebString encoding, WebVector<BytesChunk> script_text, - WebVector<BytesChunk> meta_data, - bool is_valid); - const bool is_valid_; + WebVector<BytesChunk> meta_data); WebString encoding_; WebVector<BytesChunk> script_text_; WebVector<BytesChunk> meta_data_;
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index 3e8fae9..f4617dae 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -459,14 +459,6 @@ // This method should only be called on the main thread. virtual void SuddenTerminationChanged(bool enabled) {} - // Increase/decrease the process refcount. The process won't shut itself - // down until this refcount reaches 0. The browser might still shut down the - // renderer through fast shutdown. See SuddenTerminationChanged to disable - // that. - // These methods should only be called on the main thread. - virtual void AddRefProcess() {} - virtual void ReleaseRefProcess() {} - // System -------------------------------------------------------------- // Returns a value such as "en-US".
diff --git a/third_party/blink/public/platform/web_feature.mojom b/third_party/blink/public/platform/web_feature.mojom index 2c60954..9ae79df 100644 --- a/third_party/blink/public/platform/web_feature.mojom +++ b/third_party/blink/public/platform/web_feature.mojom
@@ -1443,7 +1443,6 @@ kMediaStreamConstraintsGoogAudioMirroring = 1957, kMediaStreamConstraintsGoogDAEchoCancellation = 1958, kMediaStreamConstraintsGoogNoiseReduction = 1959, - kMediaStreamConstraintsGoogPowerLineFrequency = 1960, // The above items are available in M59 branch. kViewportFixedPositionUnderFilter = 1961, @@ -1990,6 +1989,10 @@ kCacheStorageAddAllSuccessWithDuplicate = 2534, kLegendDelegateFocusOrAccessKey = 2535, kFeaturePolicyReport = 2536, + kV8Window_WebkitRTCPeerConnection_ConstructorGetter = 2537, + kV8Window_WebkitMediaStream_ConstructorGetter = 2538, + kTextEncoderStreamConstructor = 2539, + kTextDecoderStreamConstructor = 2540, // 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_layer_tree_view.h b/third_party/blink/public/platform/web_layer_tree_view.h index 517b1b4..4a2e6d84 100644 --- a/third_party/blink/public/platform/web_layer_tree_view.h +++ b/third_party/blink/public/platform/web_layer_tree_view.h
@@ -33,6 +33,7 @@ #include "cc/input/overscroll_behavior.h" #include "cc/layers/layer.h" #include "cc/trees/element_id.h" +#include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_mutator.h" #include "components/viz/common/surfaces/frame_sink_id.h" #include "third_party/blink/public/platform/web_common.h" @@ -160,7 +161,9 @@ virtual void CompositeWithRasterForTesting() {} // Prevents updates to layer tree from becoming visible. - virtual void SetDeferCommits(bool defer_commits) {} + virtual std::unique_ptr<cc::ScopedDeferCommits> DeferCommits() { + return nullptr; + } struct ViewportLayers { cc::ElementId overscroll_elasticity_element_id;
diff --git a/third_party/blink/public/platform/web_media_constraints.h b/third_party/blink/public/platform/web_media_constraints.h index 90ca7f10..1edd3e10 100644 --- a/third_party/blink/public/platform/web_media_constraints.h +++ b/third_party/blink/public/platform/web_media_constraints.h
@@ -285,7 +285,6 @@ LongConstraint goog_high_start_bitrate; BooleanConstraint goog_payload_padding; LongConstraint goog_latency_ms; - LongConstraint goog_power_line_frequency; BLINK_PLATFORM_EXPORT bool IsEmpty() const; BLINK_PLATFORM_EXPORT bool HasMandatory() const;
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h index 768581d..fe91505 100644 --- a/third_party/blink/public/platform/web_runtime_features.h +++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -75,6 +75,7 @@ BLINK_PLATFORM_EXPORT static void EnableAdTagging(bool); BLINK_PLATFORM_EXPORT static void EnableAllowActivationDelegationAttr(bool); BLINK_PLATFORM_EXPORT static void EnableAudioOutputDevices(bool); + BLINK_PLATFORM_EXPORT static void EnableBackgroundFetch(bool); BLINK_PLATFORM_EXPORT static void EnableBlinkHeapIncrementalMarking(bool); BLINK_PLATFORM_EXPORT static void EnableBloatedRendererDetection(bool); BLINK_PLATFORM_EXPORT static void EnableCacheInlineScriptCode(bool);
diff --git a/third_party/blink/public/web/web_ax_object.h b/third_party/blink/public/web/web_ax_object.h index 88cd230..2c9787fe 100644 --- a/third_party/blink/public/web/web_ax_object.h +++ b/third_party/blink/public/web/web_ax_object.h
@@ -120,7 +120,6 @@ BLINK_EXPORT WebAXCheckedState CheckedState() const; BLINK_EXPORT bool IsCheckable() const; BLINK_EXPORT bool IsClickable() const; - BLINK_EXPORT bool IsCollapsed() const; BLINK_EXPORT bool IsControl() const; BLINK_EXPORT WebAXExpanded IsExpanded() const; BLINK_EXPORT bool IsFocused() const;
diff --git a/third_party/blink/public/web/web_user_media_client.h b/third_party/blink/public/web/web_user_media_client.h index 6c91dcb..ae4478b6f 100644 --- a/third_party/blink/public/web/web_user_media_client.h +++ b/third_party/blink/public/web/web_user_media_client.h
@@ -45,6 +45,7 @@ virtual void CancelUserMediaRequest(const WebUserMediaRequest&) = 0; virtual void ApplyConstraints(const WebApplyConstraintsRequest&) = 0; virtual void StopTrack(const WebMediaStreamTrack&) = 0; + virtual bool IsCapturing() = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni index b192bff..1bcb1cf 100644 --- a/third_party/blink/renderer/bindings/bindings.gni +++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -98,8 +98,8 @@ "core/v8/use_counter_callback.h", "core/v8/v0_custom_element_constructor_builder.cc", "core/v8/v0_custom_element_constructor_builder.h", - "core/v8/v8_abstract_event_listener.cc", - "core/v8/v8_abstract_event_listener.h", + "core/v8/v8_abstract_event_handler.cc", + "core/v8/v8_abstract_event_handler.h", "core/v8/v8_binding_for_core.cc", "core/v8/v8_binding_for_core.h", "core/v8/v8_cache_options.h", @@ -112,6 +112,8 @@ "core/v8/v8_embedder_graph_builder.h", "core/v8/v8_error_handler.cc", "core/v8/v8_error_handler.h", + "core/v8/v8_event_listener_impl.cc", + "core/v8/v8_event_listener_impl.h", "core/v8/v8_event_listener_or_event_handler.cc", "core/v8/v8_event_listener_or_event_handler.h", "core/v8/v8_event_listener_helper.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/BUILD.gn b/third_party/blink/renderer/bindings/core/v8/BUILD.gn index 12af3e2..9ce3cd2e 100644 --- a/third_party/blink/renderer/bindings/core/v8/BUILD.gn +++ b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
@@ -90,6 +90,8 @@ "$bindings_core_v8_output_dir/string_or_string_sequence.h", "$bindings_core_v8_output_dir/string_or_trusted_html.cc", "$bindings_core_v8_output_dir/string_or_trusted_html.h", + "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.cc", + "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h", "$bindings_core_v8_output_dir/string_or_trusted_script.cc", "$bindings_core_v8_output_dir/string_or_trusted_script.h", "$bindings_core_v8_output_dir/string_or_trusted_script_url.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc index bffb605a..a65e53f 100644 --- a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
@@ -58,8 +58,8 @@ void clear() { logged_activities_.clear(); } bool VerifyActivities(const Vector<String>& expected) const { EXPECT_EQ(expected.size(), logged_activities_.size()); - for (size_t i = 0; i < std::min(expected.size(), logged_activities_.size()); - ++i) { + for (wtf_size_t i = 0; + i < std::min(expected.size(), logged_activities_.size()); ++i) { EXPECT_STREQ(expected[i].Utf8().data(), logged_activities_[i].Utf8().data()); }
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc index 85296441..2234657 100644 --- a/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc +++ b/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc
@@ -60,7 +60,7 @@ const v8::Local<v8::Array>& item_array, WebVector<WebMenuItemInfo>& items) { v8::Local<v8::Context> context = isolate->GetCurrentContext(); - for (size_t i = 0; i < item_array->Length(); ++i) { + for (uint32_t i = 0; i < item_array->Length(); ++i) { v8::Local<v8::Object> item = item_array->Get(context, i).ToLocalChecked().As<v8::Object>(); v8::Local<v8::Value> type;
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc b/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc index 8924bb1..72e61ab 100644 --- a/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc +++ b/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc
@@ -226,7 +226,7 @@ return false; v8::Local<v8::Array> v8_array = v8::Local<v8::Array>::Cast(v8_value); - for (size_t i = 0; i < v8_array->Length(); ++i) { + for (uint32_t i = 0; i < v8_array->Length(); ++i) { v8::Local<v8::Value> indexed_value; if (!v8_array ->Get(dictionary.V8Context(),
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h index ac4a9d0..7edeae12 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -478,7 +478,7 @@ // the end while at the same time requiring fast checks for previous insert // of a given key. |seenKeys| is a key/position in |result| map that aids in // the latter part. - HashMap<String, size_t> seen_keys; + HashMap<String, uint32_t> seen_keys; for (uint32_t i = 0; i < keys->Length(); ++i) { // "4. Repeat, for each element key of keys in List order:" @@ -539,13 +539,13 @@ // "4.2.4. If typedKey is already a key in result, set its value to // typedValue. // Note: This can happen when O is a proxy object." - const size_t pos = seen_keys.at(typed_key); + const uint32_t pos = seen_keys.at(typed_key); result[pos] = std::make_pair(typed_key, typed_value); } else { // "4.2.5. Otherwise, append to result a mapping (typedKey, // typedValue)." // Note we can take this shortcut because we are always appending. - const size_t pos = result.size(); + const uint32_t pos = result.size(); seen_keys.Set(typed_key, pos); result.UncheckedAppend(std::make_pair(typed_key, typed_value)); }
diff --git a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc index d19d56b..707e5610f 100644 --- a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc +++ b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
@@ -216,7 +216,7 @@ } // Then look it up in the reported errors. - for (size_t i = 0; i < reported_as_errors_.size(); ++i) { + for (wtf_size_t i = 0; i < reported_as_errors_.size(); ++i) { std::unique_ptr<Message>& message = reported_as_errors_.at(i); if (!message->IsCollected() && message->HasPromise(data.GetPromise())) { message->MakePromiseStrong(); @@ -261,7 +261,8 @@ auto* new_end = std::remove_if( reported_as_errors_.begin(), reported_as_errors_.end(), [](const auto& message) { return message->IsCollected(); }); - reported_as_errors_.Shrink(new_end - reported_as_errors_.begin()); + reported_as_errors_.Shrink( + static_cast<wtf_size_t>(new_end - reported_as_errors_.begin())); for (auto& message : queue) { if (message->IsCollected())
diff --git a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc index 6b96f3d..08c97dd 100644 --- a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc +++ b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc
@@ -212,8 +212,9 @@ void ScheduledAction::CreateLocalHandlesForArgs( Vector<v8::Local<v8::Value>>* handles) { - handles->ReserveCapacity(info_.Size()); - for (size_t i = 0; i < info_.Size(); ++i) + wtf_size_t handle_count = SafeCast<wtf_size_t>(info_.Size()); + handles->ReserveCapacity(handle_count); + for (wtf_size_t i = 0; i < handle_count; ++i) handles->push_back(info_.Get(i)); }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.cc b/third_party/blink/renderer/bindings/core/v8/script_controller.cc index a875e30..4085106 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
@@ -188,7 +188,7 @@ void ScriptController::RegisterExtensionIfNeeded(v8::Extension* extension) { const V8Extensions& extensions = RegisteredExtensions(); - for (size_t i = 0; i < extensions.size(); ++i) { + for (wtf_size_t i = 0; i < extensions.size(); ++i) { if (extensions[i] == extension) return; }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/script_event_listener.cc index 3450578..01c7dbb8 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_event_listener.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_event_listener.cc
@@ -34,6 +34,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h" #include "third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -97,11 +98,13 @@ v8::Local<v8::Object> EventListenerHandler(ExecutionContext* execution_context, EventListener* listener) { - if (listener->GetType() != EventListener::kJSEventListenerType) - return v8::Local<v8::Object>(); - V8AbstractEventListener* v8_listener = - static_cast<V8AbstractEventListener*>(listener); - return v8_listener->GetListenerObject(execution_context); + if (auto* v8_listener = V8AbstractEventHandler::Cast(listener)) { + return v8_listener->GetListenerObject(execution_context); + } + if (auto* v8_listener = V8EventListenerImpl::Cast(listener)) { + return v8_listener->GetListenerObject(); + } + return v8::Local<v8::Object>(); } v8::Local<v8::Function> EventListenerEffectiveFunction( @@ -142,6 +145,8 @@ column_number = function->GetScriptColumnNumber(); } +// TODO(yukiy): move this method into V8EventListenerImpl or interface class +// of EventListener and EventHandler std::unique_ptr<SourceLocation> GetFunctionLocation( ExecutionContext* execution_context, EventListener* listener) {
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise.cc b/third_party/blink/renderer/bindings/core/v8/script_promise.cc index 15165c8..a883464a 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_promise.cc
@@ -67,7 +67,7 @@ static v8::Local<v8::Function> Create(ScriptState* script_state, ResolveType resolve_type, - size_t index, + wtf_size_t index, PromiseAllHandler* handler) { AdapterFunction* self = new AdapterFunction(script_state, resolve_type, index, handler); @@ -82,7 +82,7 @@ private: AdapterFunction(ScriptState* script_state, ResolveType resolve_type, - size_t index, + wtf_size_t index, PromiseAllHandler* handler) : ScriptFunction(script_state), resolve_type_(resolve_type), @@ -99,7 +99,7 @@ } const ResolveType resolve_type_; - const size_t index_; + const wtf_size_t index_; Member<PromiseAllHandler> handler_; }; @@ -107,13 +107,13 @@ : number_of_pending_promises_(promises.size()), resolver_(script_state) { DCHECK(!promises.IsEmpty()); values_.resize(promises.size()); - for (size_t i = 0; i < promises.size(); ++i) + for (wtf_size_t i = 0; i < promises.size(); ++i) promises[i].Then(CreateFulfillFunction(script_state, i), CreateRejectFunction(script_state)); } v8::Local<v8::Function> CreateFulfillFunction(ScriptState* script_state, - size_t index) { + wtf_size_t index) { return AdapterFunction::Create(script_state, AdapterFunction::kFulfilled, index, this); } @@ -123,7 +123,7 @@ this); } - void OnFulfilled(size_t index, const ScriptValue& value) { + void OnFulfilled(wtf_size_t index, const ScriptValue& value) { if (is_settled_) return; @@ -134,7 +134,7 @@ v8::Local<v8::Array> values = v8::Array::New(value.GetIsolate(), values_.size()); - for (size_t i = 0; i < values_.size(); ++i) { + for (wtf_size_t i = 0; i < values_.size(); ++i) { if (!V8CallBoolean(values->CreateDataProperty(value.GetContext(), i, values_[i].V8Value()))) return;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc index 14c8c8e7..fa1fb64 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc
@@ -75,7 +75,7 @@ state_ = target_state; v8::HandleScope handle_scope(isolate_); - size_t i = 0; + wtf_size_t i = 0; while (i < wrappers_.size()) { const std::unique_ptr<ScopedPersistent<v8::Object>>& persistent = wrappers_[i]; @@ -129,7 +129,7 @@ v8::Local<v8::Object> ScriptPromisePropertyBase::EnsureHolderWrapper( ScriptState* script_state) { v8::Local<v8::Context> context = script_state->GetContext(); - size_t i = 0; + wtf_size_t i = 0; while (i < wrappers_.size()) { const std::unique_ptr<ScopedPersistent<v8::Object>>& persistent = wrappers_[i];
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc index 5bc3a19..27078675 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
@@ -187,10 +187,7 @@ public testing::Test { public: template <typename T> - void Test(const T& value, - const char* expected, - const char* file, - size_t line) { + void Test(const T& value, const char* expected, const char* file, int line) { typedef ScriptPromiseProperty<Member<GarbageCollectedScriptWrappable>, T, ToV8UndefinedGenerator> Property;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc index d2f490e..f8b8fea 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -35,8 +35,7 @@ WTF_MAKE_NONCOPYABLE(SourceStreamDataQueue); public: - SourceStreamDataQueue() : finished_(false) {} - + SourceStreamDataQueue() : finished_(false), have_data_(mutex_) {} ~SourceStreamDataQueue() { DiscardQueuedData(); } void Clear() { @@ -61,7 +60,7 @@ void Consume(const uint8_t** data, size_t* length) { MutexLocker locker(mutex_); while (!TryGetData(data, length)) - have_data_.Wait(mutex_); + have_data_.Wait(); } private:
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc index 33e3eed21..037f145e 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
@@ -61,6 +61,7 @@ #include "third_party/blink/renderer/platform/shared_buffer.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" #include "third_party/blink/renderer/platform/wtf/dtoa/utils.h" +#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h" #include "third_party/blink/renderer/platform/wtf/text/string_hash.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -293,7 +294,8 @@ // Add the padding '\0', but don't put it in |m_dataBuffer|. // This requires direct use of uninitialized strings, though. UChar* destination; - size_t string_size_bytes = (data_buffer_size_ + 1) & ~1; + wtf_size_t string_size_bytes = + SafeCast<wtf_size_t>((data_buffer_size_ + 1) & ~1); String wire_string = String::CreateUninitialized(string_size_bytes / 2, destination); memcpy(destination, data_buffer_.get(), data_buffer_size_); @@ -312,7 +314,7 @@ if (!image_bitmaps.size()) return contents; - for (size_t i = 0; i < image_bitmaps.size(); ++i) { + for (wtf_size_t i = 0; i < image_bitmaps.size(); ++i) { if (image_bitmaps[i]->IsNeutered()) { exception_state.ThrowDOMException(DOMExceptionCode::kDataCloneError, "ImageBitmap at index " + @@ -323,7 +325,7 @@ } HeapHashSet<Member<ImageBitmap>> visited; - for (size_t i = 0; i < image_bitmaps.size(); ++i) { + for (wtf_size_t i = 0; i < image_bitmaps.size(); ++i) { if (visited.Contains(image_bitmaps[i])) continue; visited.insert(image_bitmaps[i]); @@ -348,7 +350,7 @@ return; HeapHashSet<Member<OffscreenCanvas>> visited; - for (size_t i = 0; i < offscreen_canvases.size(); i++) { + for (wtf_size_t i = 0; i < offscreen_canvases.size(); i++) { if (visited.Contains(offscreen_canvases[i].Get())) continue; if (offscreen_canvases[i]->IsNeutered()) { @@ -385,7 +387,7 @@ HeapHashSet<Member<DOMArrayBufferBase>> visited; shared_array_buffers_contents_.Grow(array_buffers.size()); - size_t i = 0; + wtf_size_t i = 0; for (auto* it = array_buffers.begin(); it != array_buffers.end(); ++it) { DOMSharedArrayBuffer* shared_array_buffer = *it; if (visited.Contains(shared_array_buffer)) @@ -446,7 +448,7 @@ Transferables& transferables, ExceptionState& exception_state) { // Validate the passed array of transferables. - uint32_t i = 0; + wtf_size_t i = 0; for (const auto& script_value : object_sequence) { v8::Local<v8::Value> transferable_object = script_value.V8Value(); // Validation of non-null objects, per HTML5 spec 10.3.3. @@ -550,8 +552,9 @@ // Copy the non-shared array buffers into result, and remove them from // array_buffers. result.AppendRange(non_shared_begin, array_buffers.end()); - array_buffers.EraseAt(non_shared_begin - array_buffers.begin(), - array_buffers.end() - non_shared_begin); + array_buffers.EraseAt( + static_cast<wtf_size_t>(non_shared_begin - array_buffers.begin()), + static_cast<wtf_size_t>(array_buffers.end() - non_shared_begin)); return result; } @@ -568,7 +571,8 @@ for (auto* it = array_buffers.begin(); it != array_buffers.end(); ++it) { DOMArrayBufferBase* array_buffer = *it; if (array_buffer->IsNeutered()) { - size_t index = std::distance(array_buffers.begin(), it); + wtf_size_t index = + static_cast<wtf_size_t>(std::distance(array_buffers.begin(), it)); exception_state.ThrowDOMException(DOMExceptionCode::kDataCloneError, "ArrayBuffer at index " + String::Number(index) + @@ -585,7 +589,8 @@ continue; visited.insert(array_buffer_base); - size_t index = std::distance(array_buffers.begin(), it); + wtf_size_t index = + static_cast<wtf_size_t>(std::distance(array_buffers.begin(), it)); if (array_buffer_base->IsShared()) { exception_state.ThrowDOMException(DOMExceptionCode::kDataCloneError, "SharedArrayBuffer at index " +
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_fuzzer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_fuzzer.cc index 448fea0..a75067b 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_fuzzer.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_fuzzer.cc
@@ -8,6 +8,7 @@ #include <cstddef> #include <cstdint> +#include "base/numerics/safe_conversions.h" #include "build/build_config.h" #include "third_party/blink/public/platform/web_blob_info.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -52,12 +53,15 @@ return 0; } -int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { +int LLVMFuzzerTestOneInput(const uint8_t* data, size_t data_size) { // Odd sizes are handled in various ways, depending how they arrive. // Let's not worry about that case here. - if (size % sizeof(UChar)) + if (data_size % sizeof(UChar)) return 0; + // Truncate the input. + wtf_size_t size = base::saturated_cast<wtf_size_t>(data_size); + // Used to control what kind of extra data is provided to the deserializer. unsigned hash = StringHasher::HashMemory(data, size);
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc index 9c23be4..dd2f4e0c 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
@@ -170,7 +170,6 @@ // TODO(jbroman): Ideally this method would take a WTF::StringView, but the // StringUTF8Adaptor trick doesn't yet work with StringView. StringUTF8Adaptor utf8(string); - DCHECK_LT(utf8.length(), std::numeric_limits<uint32_t>::max()); WriteUint32(utf8.length()); WriteRawBytes(utf8.Data(), utf8.length()); } @@ -268,8 +267,10 @@ WriteUint32(image_data->width()); WriteUint32(image_data->height()); DOMArrayBufferBase* pixel_buffer = image_data->BufferBase(); - WriteUint32(pixel_buffer->ByteLength()); - WriteRawBytes(pixel_buffer->Data(), pixel_buffer->ByteLength()); + uint32_t pixel_buffer_length = + SafeCast<uint32_t>(pixel_buffer->ByteLength()); + WriteUint32(pixel_buffer_length); + WriteRawBytes(pixel_buffer->Data(), pixel_buffer_length); return true; } if (wrapper_type_info == &V8DOMPoint::wrapperTypeInfo) { @@ -446,7 +447,7 @@ WriteTag(kOffscreenCanvasTransferTag); WriteUint32(canvas->width()); WriteUint32(canvas->height()); - WriteUint32(canvas->PlaceholderCanvasId()); + WriteUint64(canvas->PlaceholderCanvasId()); WriteUint32(canvas->ClientId()); WriteUint32(canvas->SinkId()); return true; @@ -555,7 +556,7 @@ // The index returned from this function will be serialized into the data // stream. When deserializing, this will be used to index into the // sharedArrayBufferContents array of the SerializedScriptValue. - size_t index = shared_array_buffers_.Find(shared_array_buffer); + uint32_t index = shared_array_buffers_.Find(shared_array_buffer); if (index == kNotFound) { shared_array_buffers_.push_back(shared_array_buffer); index = shared_array_buffers_.size() - 1;
diff --git a/third_party/blink/renderer/bindings/core/v8/source_location.cc b/third_party/blink/renderer/bindings/core/v8/source_location.cc index 216a2176..e00aee4 100644 --- a/third_party/blink/renderer/bindings/core/v8/source_location.cc +++ b/third_party/blink/renderer/bindings/core/v8/source_location.cc
@@ -87,7 +87,8 @@ if (debugger) stack_trace = debugger->GetV8Inspector()->createStackTrace(stack); - int script_id = message->GetScriptOrigin().ScriptID()->Value(); + int script_id = + static_cast<int>(message->GetScriptOrigin().ScriptID()->Value()); if (!stack.IsEmpty() && stack->GetFrameCount() > 0) { int top_script_id = stack->GetFrame(isolate, 0)->GetScriptId(); if (top_script_id == script_id)
diff --git a/third_party/blink/renderer/bindings/core/v8/trace_wrapper_member_test.cc b/third_party/blink/renderer/bindings/core/v8/trace_wrapper_member_test.cc index 90a00bee..7e215c0 100644 --- a/third_party/blink/renderer/bindings/core/v8/trace_wrapper_member_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/trace_wrapper_member_test.cc
@@ -47,10 +47,10 @@ } TEST(TraceWrapperMemberTest, HeapHashSet) { - const size_t kContainerSize = 10000; + const wtf_size_t kContainerSize = 10000; HeapHashSet<Wrapper> set; // Loop enough so that underlying HashTable will rehash several times. - for (size_t i = 1; i <= kContainerSize; ++i) { + for (wtf_size_t i = 1; i <= kContainerSize; ++i) { DeathAwareScriptWrappable* entry = DeathAwareScriptWrappable::Create(); set.insert(entry); } @@ -63,18 +63,18 @@ } TEST(TraceWrapperMemberTest, HeapHashMapValue) { - const size_t kContainerSize = 10000; - HeapHashMap<int, Wrapper> map; + const wtf_size_t kContainerSize = 10000; + HeapHashMap<uint32_t, Wrapper> map; HeapVector<Wrapper> verification_vector; // Loop enough so that underlying HashTable will rehash several times. - for (size_t i = 1; i <= kContainerSize; ++i) { + for (wtf_size_t i = 1; i <= kContainerSize; ++i) { DeathAwareScriptWrappable* entry = DeathAwareScriptWrappable::Create(); map.insert(i, entry); verification_vector.push_back(entry); } EXPECT_EQ(kContainerSize, map.size()); - for (size_t i = 1; i <= kContainerSize; ++i) { + for (wtf_size_t i = 1; i <= kContainerSize; ++i) { auto wrapper = map.Take(i); EXPECT_EQ(verification_vector[i - 1], wrapper.Get()); }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc similarity index 86% rename from third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc rename to third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc index 2c686f39..9383312 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc
@@ -28,7 +28,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event.h" @@ -48,23 +48,24 @@ namespace blink { -V8AbstractEventListener::V8AbstractEventListener(v8::Isolate* isolate, - bool is_attribute, - DOMWrapperWorld& world) - : EventListener(kJSEventListenerType), +V8AbstractEventHandler::V8AbstractEventHandler(v8::Isolate* isolate, + bool is_attribute, + DOMWrapperWorld& world) + : EventListener(kJSEventHandlerType), is_attribute_(is_attribute), world_(&world), isolate_(isolate) { - if (IsMainThread()) + if (IsMainThread()) { InstanceCounters::IncrementCounter( InstanceCounters::kJSEventListenerCounter); + } } -V8AbstractEventListener::~V8AbstractEventListener() { +V8AbstractEventHandler::~V8AbstractEventHandler() { // For non-main threads a termination garbage collection clears out the // wrapper links to CustomWrappable which result in CustomWrappable not being // rooted by JavaScript objects anymore. This means that - // V8AbstractEventListener can be collected without while still holding a + // V8AbstractEventHandler can be collected without while still holding a // valid weak references. if (IsMainThread()) { DCHECK(listener_.IsEmpty()); @@ -74,13 +75,13 @@ } // static -v8::Local<v8::Value> V8AbstractEventListener::GetListenerOrNull( +v8::Local<v8::Value> V8AbstractEventHandler::GetListenerOrNull( v8::Isolate* isolate, EventTarget* event_target, EventListener* listener) { - if (listener && listener->GetType() == kJSEventListenerType) { + if (listener && listener->GetType() == kJSEventHandlerType) { v8::Local<v8::Object> v8_listener = - static_cast<V8AbstractEventListener*>(listener) + static_cast<V8AbstractEventHandler*>(listener) ->GetListenerObjectInternal(event_target->GetExecutionContext()); if (!v8_listener.IsEmpty()) return v8_listener; @@ -88,8 +89,8 @@ return v8::Null(isolate); } -void V8AbstractEventListener::handleEvent(ExecutionContext* execution_context, - Event* event) { +void V8AbstractEventHandler::handleEvent(ExecutionContext* execution_context, + Event* event) { if (!execution_context) return; // Don't reenter V8 if execution was terminated in this instance of V8. @@ -110,8 +111,8 @@ HandleEvent(script_state, event); } -void V8AbstractEventListener::HandleEvent(ScriptState* script_state, - Event* event) { +void V8AbstractEventHandler::HandleEvent(ScriptState* script_state, + Event* event) { ScriptState::Scope scope(script_state); // Get the V8 wrapper for the event object. @@ -123,7 +124,7 @@ v8::Local<v8::Value>::New(GetIsolate(), js_event)); } -void V8AbstractEventListener::SetListenerObject( +void V8AbstractEventHandler::SetListenerObject( ScriptState* script_state, v8::Local<v8::Object> listener, const V8PrivateProperty::Symbol& property) { @@ -132,10 +133,9 @@ Attach(script_state, listener, property, this); } -void V8AbstractEventListener::InvokeEventHandler( - ScriptState* script_state, - Event* event, - v8::Local<v8::Value> js_event) { +void V8AbstractEventHandler::InvokeEventHandler(ScriptState* script_state, + Event* event, + v8::Local<v8::Value> js_event) { if (!event->CanBeDispatchedInWorld(World())) return; @@ -216,7 +216,7 @@ } } -bool V8AbstractEventListener::ShouldPreventDefault( +bool V8AbstractEventHandler::ShouldPreventDefault( v8::Local<v8::Value> return_value, Event*) { // Prevent default action if the return value is false in accord with the spec @@ -224,7 +224,7 @@ return return_value->IsBoolean() && !return_value.As<v8::Boolean>()->Value(); } -v8::Local<v8::Object> V8AbstractEventListener::GetReceiverObject( +v8::Local<v8::Object> V8AbstractEventHandler::GetReceiverObject( ScriptState* script_state, Event* event) { v8::Local<v8::Object> listener = listener_.NewLocal(GetIsolate()); @@ -240,7 +240,7 @@ v8::Local<v8::Object>::Cast(value)); } -bool V8AbstractEventListener::BelongsToTheCurrentWorld( +bool V8AbstractEventHandler::BelongsToTheCurrentWorld( ExecutionContext* execution_context) const { if (!GetIsolate()->GetCurrentContext().IsEmpty() && &World() == &DOMWrapperWorld::Current(GetIsolate())) @@ -256,19 +256,19 @@ return false; } -void V8AbstractEventListener::ClearListenerObject() { +void V8AbstractEventHandler::ClearListenerObject() { if (!HasExistingListenerObject()) return; probe::AsyncTaskCanceled(GetIsolate(), this); listener_.Clear(); } -void V8AbstractEventListener::WrapperCleared( - const v8::WeakCallbackInfo<V8AbstractEventListener>& data) { +void V8AbstractEventHandler::WrapperCleared( + const v8::WeakCallbackInfo<V8AbstractEventHandler>& data) { data.GetParameter()->ClearListenerObject(); } -void V8AbstractEventListener::Trace(blink::Visitor* visitor) { +void V8AbstractEventHandler::Trace(blink::Visitor* visitor) { visitor->Trace(listener_.Cast<v8::Value>()); EventListener::Trace(visitor); }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h similarity index 89% rename from third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h rename to third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h index 7ecb25f9..5f04bf7 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h
@@ -28,8 +28,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_LISTENER_H_ -#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_LISTENER_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_ +#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_listener.h" @@ -51,18 +51,18 @@ // Why does this matter? // WebKit does not allow duplicated HTML event handlers of the same type, // but ALLOWs duplicated non-HTML event handlers. -class CORE_EXPORT V8AbstractEventListener : public EventListener { +class CORE_EXPORT V8AbstractEventHandler : public EventListener { public: - ~V8AbstractEventListener() override; + ~V8AbstractEventHandler() override; - static const V8AbstractEventListener* Cast(const EventListener* listener) { - return listener->GetType() == kJSEventListenerType - ? static_cast<const V8AbstractEventListener*>(listener) + static const V8AbstractEventHandler* Cast(const EventListener* listener) { + return listener->GetType() == kJSEventHandlerType + ? static_cast<const V8AbstractEventHandler*>(listener) : nullptr; } - static V8AbstractEventListener* Cast(EventListener* listener) { - return const_cast<V8AbstractEventListener*>( + static V8AbstractEventHandler* Cast(EventListener* listener) { + return const_cast<V8AbstractEventHandler*>( Cast(const_cast<const EventListener*>(listener))); } @@ -115,7 +115,7 @@ void Trace(blink::Visitor*) override; protected: - V8AbstractEventListener(v8::Isolate*, bool is_attribute, DOMWrapperWorld&); + V8AbstractEventHandler(v8::Isolate*, bool is_attribute, DOMWrapperWorld&); virtual v8::Local<v8::Object> GetListenerObjectInternal( ExecutionContext* execution_context) { @@ -141,7 +141,7 @@ virtual bool ShouldPreventDefault(v8::Local<v8::Value> return_value, Event*); static void WrapperCleared( - const v8::WeakCallbackInfo<V8AbstractEventListener>&); + const v8::WeakCallbackInfo<V8AbstractEventHandler>&); TraceWrapperV8Reference<v8::Object> listener_; @@ -154,4 +154,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_LISTENER_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc index 71d591e..051708e 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
@@ -34,7 +34,7 @@ #include "third_party/blink/renderer/bindings/core/v8/idl_types.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_array_buffer_view.h" #include "third_party/blink/renderer/bindings/core/v8/v8_element.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_target.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.cc b/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.cc index 02c13e9f..53a5417b 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.cc
@@ -31,6 +31,7 @@ #include "third_party/blink/renderer/platform/bindings/v8_object_constructor.h" #include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" namespace blink { @@ -155,6 +156,11 @@ NOTREACHED(); } +enum class AccessorType { + Getter, + Setter, +}; + template <class FunctionOrTemplate> v8::Local<FunctionOrTemplate> CreateAccessorFunctionOrTemplate( v8::Isolate*, @@ -162,7 +168,8 @@ V8PrivateProperty::CachedAccessorSymbol, v8::Local<v8::Value> data, v8::Local<v8::Signature>, - int length, + const char* name, + AccessorType, v8::SideEffectType side_effect_type = v8::SideEffectType::kHasSideEffect); template <> @@ -173,10 +180,20 @@ V8PrivateProperty::CachedAccessorSymbol cached_property_key, v8::Local<v8::Value> data, v8::Local<v8::Signature> signature, - int length, + const char* name, + AccessorType type, v8::SideEffectType side_effect_type) { v8::Local<v8::FunctionTemplate> function_template; if (callback) { + // https://heycam.github.io/webidl/#dfn-attribute-getter has: + // + // 5. Perform ! SetFunctionLength(|F|, 0). + // + // https://heycam.github.io/webidl/#dfn-attribute-setter has: + // + // 7. Perform ! SetFunctionLength(|F|, 1). + int length = type == AccessorType::Getter ? 0 : 1; + if (cached_property_key != V8PrivateProperty::kNoCachedAccessor) { function_template = v8::FunctionTemplate::NewWithCache( isolate, callback, @@ -192,6 +209,28 @@ if (!function_template.IsEmpty()) { function_template->RemovePrototype(); function_template->SetAcceptAnyReceiver(false); + + // https://heycam.github.io/webidl/#dfn-attribute-getter has: + // + // 3. Let |name| be the string "get " prepended to |attribute|’s + // identifier. + // + // 4. Perform ! SetFunctionName(|F|, |name|). + // + // https://heycam.github.io/webidl/#dfn-attribute-setter has: + // + // 5. Let |name| be the string "set " prepended to |id|. + // + // 6. Perform ! SetFunctionName(|F|, |name|). + // + // SetClassName on a FunctionTemplate that doesn't have a prototype just + // sets the .name property of the generated function. + WTF::StringBuilder full_name_builder; + full_name_builder.Append(type == AccessorType::Getter ? "get " : "set ", + 4); + full_name_builder.Append(name); + function_template->SetClassName( + V8AtomicString(isolate, full_name_builder.ToString())); } } return function_template; @@ -204,7 +243,8 @@ V8PrivateProperty::CachedAccessorSymbol, v8::Local<v8::Value> data, v8::Local<v8::Signature> signature, - int length, + const char* name, + AccessorType type, v8::SideEffectType side_effect_type) { if (!callback) return v8::Local<v8::Function>(); @@ -212,7 +252,7 @@ v8::Local<v8::FunctionTemplate> function_template = CreateAccessorFunctionOrTemplate<v8::FunctionTemplate>( isolate, callback, V8PrivateProperty::kNoCachedAccessor, data, - signature, length, side_effect_type); + signature, name, type, side_effect_type); if (function_template.IsEmpty()) return v8::Local<v8::Function>(); @@ -257,7 +297,7 @@ if (!WorldConfigurationApplies(config, world)) return; - v8::Local<v8::Name> name = V8AtomicString(isolate, config.name); + v8::Local<v8::String> name = V8AtomicString(isolate, config.name); v8::FunctionCallback getter_callback = config.getter; v8::FunctionCallback setter_callback = config.setter; auto cached_property_key = V8PrivateProperty::kNoCachedAccessor; @@ -285,11 +325,13 @@ v8::Local<FunctionOrTemplate> getter = CreateAccessorFunctionOrTemplate<FunctionOrTemplate>( isolate, getter_callback, cached_property_key, - v8::Local<v8::Value>(), signature, 0, getter_side_effect_type); + v8::Local<v8::Value>(), signature, config.name, + AccessorType::Getter, getter_side_effect_type); v8::Local<FunctionOrTemplate> setter = CreateAccessorFunctionOrTemplate<FunctionOrTemplate>( isolate, setter_callback, V8PrivateProperty::kNoCachedAccessor, - v8::Local<v8::Value>(), signature, 1); + v8::Local<v8::Value>(), signature, config.name, + AccessorType::Setter); if (location & V8DOMConfiguration::kOnInstance && !IsObjectAndEmpty(instance_or_template)) { instance_or_template->SetAccessorProperty( @@ -311,12 +353,13 @@ v8::Local<FunctionOrTemplate> getter = CreateAccessorFunctionOrTemplate<FunctionOrTemplate>( isolate, getter_callback, V8PrivateProperty::kNoCachedAccessor, - v8::Local<v8::Value>(), v8::Local<v8::Signature>(), 0, - getter_side_effect_type); + v8::Local<v8::Value>(), v8::Local<v8::Signature>(), config.name, + AccessorType::Getter, getter_side_effect_type); v8::Local<FunctionOrTemplate> setter = CreateAccessorFunctionOrTemplate<FunctionOrTemplate>( isolate, setter_callback, V8PrivateProperty::kNoCachedAccessor, - v8::Local<v8::Value>(), v8::Local<v8::Signature>(), 1); + v8::Local<v8::Value>(), v8::Local<v8::Signature>(), config.name, + AccessorType::Setter); interface_or_template->SetAccessorProperty( name, getter, setter, static_cast<v8::PropertyAttribute>(config.attribute)); @@ -736,7 +779,7 @@ v8::Local<v8::FunctionTemplate> interface_template, const char* interface_name, v8::Local<v8::FunctionTemplate> parent_interface_template, - size_t v8_internal_field_count) { + uint32_t v8_internal_field_count) { interface_template->SetClassName(V8AtomicString(isolate, interface_name)); interface_template->ReadOnlyPrototype(); v8::Local<v8::ObjectTemplate> instance_template =
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h b/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h index e41cea3..488dc8864 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h
@@ -348,7 +348,7 @@ v8::Local<v8::FunctionTemplate> interface_template, const char* interface_name, v8::Local<v8::FunctionTemplate> parent_interface_template, - size_t v8_internal_field_count); + uint32_t v8_internal_field_count); static v8::Local<v8::FunctionTemplate> DomClassTemplate( v8::Isolate*,
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc index 45c29da9..5162578c 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc
@@ -33,6 +33,7 @@ #include "third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_error_handler.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_window.h" #include "third_party/blink/renderer/platform/bindings/v8_private_property.h" @@ -78,11 +79,16 @@ : V8PrivateProperty::GetV8EventListenerOrEventHandlerListener( isolate); - return GetEventListenerInternal<V8AbstractEventListener>( + return GetEventListenerInternal<EventListener>( script_state, object, listener_property, lookup, [object, is_attribute, script_state, listener_property]() { - return V8EventListenerOrEventHandler::Create( - object, is_attribute, script_state, listener_property); + return is_attribute + ? static_cast<EventListener*>( + V8EventListenerOrEventHandler::Create( + object, is_attribute, script_state, + listener_property)) + : static_cast<EventListener*>(V8EventListenerImpl::Create( + object, script_state, listener_property)); }); }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.cc b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.cc new file mode 100644 index 0000000..b48cda0f --- /dev/null +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.cc
@@ -0,0 +1,135 @@ +// 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 "third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h" + +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" +#include "third_party/blink/renderer/core/dom/events/event.h" +#include "third_party/blink/renderer/core/dom/events/event_target.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/probe/core_probes.h" +#include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h" +#include "third_party/blink/renderer/platform/bindings/v8_private_property.h" +#include "third_party/blink/renderer/platform/instance_counters.h" + +namespace blink { + +V8EventListenerImpl::V8EventListenerImpl( + v8::Local<v8::Object> listener, + ScriptState* script_state, + const V8PrivateProperty::Symbol& property) + : EventListener(kJSEventListenerType), + event_listener_(V8EventListener::Create(listener)) { + Attach(script_state, listener, property, this); + if (IsMainThread()) { + InstanceCounters::IncrementCounter( + InstanceCounters::kJSEventListenerCounter); + } +} + +V8EventListenerImpl::~V8EventListenerImpl() { + if (IsMainThread()) { + InstanceCounters::DecrementCounter( + InstanceCounters::kJSEventListenerCounter); + } +} + +// https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke +void V8EventListenerImpl::handleEvent( + ExecutionContext* execution_context_of_event_target, + Event* event) { + // Don't reenter V8 if execution was terminated in this instance of V8. + // For example, worker can be terminated in event listener, and also window + // can be terminated from inspector by the TerminateExecution method. + if (event_listener_->GetIsolate()->IsExecutionTerminating()) + return; + + DCHECK(execution_context_of_event_target); + DCHECK(event); + if (!event->CanBeDispatchedInWorld(World())) + return; + + ScriptState* script_state_of_listener = + event_listener_->CallbackRelevantScriptState(); + if (!script_state_of_listener->ContextIsValid()) + return; + + ScriptState::Scope scope(script_state_of_listener); + + // https://dom.spec.whatwg.org/#firing-events + // Step 2. of firing events: Let event be the result of creating an event + // given eventConstructor, in the relevant Realm of target. + // + // (Note: a |js_event|, an v8::Value for |event| in the relevant realm of + // |event|'s target, is created here. It should be done before dispatching + // events, but Event and EventTarget do not have world to get |v8_context|, so + // it is done here with |execution_context_of_event_target|.) + v8::Local<v8::Context> v8_context = + ToV8Context(execution_context_of_event_target, World()); + if (v8_context.IsEmpty()) + return; + v8::Local<v8::Value> js_event = + ToV8(event, v8_context->Global(), event_listener_->GetIsolate()); + if (js_event.IsEmpty()) + return; + + // Step 6: Let |global| be listener callback’s associated Realm’s global + // object. + v8::Local<v8::Object> global = + script_state_of_listener->GetContext()->Global(); + + // Step 8: If global is a Window object, then: + // Set currentEvent to global’s current event. + // If tuple’s item-in-shadow-tree is false, then set global’s current event to + // event. + V8PrivateProperty::Symbol event_symbol = + V8PrivateProperty::GetGlobalEvent(event_listener_->GetIsolate()); + ExecutionContext* execution_context_of_listener = + ExecutionContext::From(script_state_of_listener); + v8::Local<v8::Value> current_event; + if (execution_context_of_listener->IsDocument()) { + current_event = event_symbol.GetOrUndefined(global).ToLocalChecked(); + // Expose the event object as |window.event|, except when the event's target + // is in a V1 shadow tree. + Node* target_node = event->target()->ToNode(); + if (!(target_node && target_node->IsInV1ShadowTree())) + event_symbol.Set(global, js_event); + } + + { + // Catch exceptions thrown in the event listener if any and report them to + // DevTools console. + v8::TryCatch try_catch(event_listener_->GetIsolate()); + try_catch.SetVerbose(true); + + // Step 10: Call a listener with event's currentTarget as receiver and event + // and handle errors if thrown. + v8::Maybe<void> maybe_result = + event_listener_->handleEvent(event->currentTarget(), event); + ALLOW_UNUSED_LOCAL(maybe_result); + + if (try_catch.HasCaught()) { + // Step 10-2: Set legacyOutputDidListenersThrowFlag if given. + event->LegacySetDidListenersThrowFlag(); + } + + // TODO(yukiy): consider to set |global|’s current event to |current_event| + // after execution is terminated if it is necessary and possible. + if (event_listener_->GetIsolate()->IsExecutionTerminating()) + return; + } + + // Step 12: If |global| is a Window object, then set |global|’s current event + // to |current_event|. + if (execution_context_of_listener->IsDocument()) + event_symbol.Set(global, current_event); +} + +void V8EventListenerImpl::Trace(blink::Visitor* visitor) { + visitor->Trace(event_listener_); + EventListener::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h new file mode 100644 index 0000000..4ac9ba2 --- /dev/null +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h
@@ -0,0 +1,79 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_IMPL_H_ + +#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/events/event_listener.h" +#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h" +#include "v8/include/v8.h" + +namespace blink { + +class Event; + +class CORE_EXPORT V8EventListenerImpl final : public EventListener { + public: + static V8EventListenerImpl* Create( + v8::Local<v8::Object> listener, + ScriptState* script_state, + const V8PrivateProperty::Symbol& property) { + return new V8EventListenerImpl(listener, script_state, property); + } + + static const V8EventListenerImpl* Cast(const EventListener* listener) { + return listener->GetType() == kJSEventListenerType + ? static_cast<const V8EventListenerImpl*>(listener) + : nullptr; + } + + static V8EventListenerImpl* Cast(EventListener* listener) { + return const_cast<V8EventListenerImpl*>( + Cast(const_cast<const EventListener*>(listener))); + } + + ~V8EventListenerImpl() override; + + // Check the identity of |V8EventListener::callback_object_|. There can be + // multiple CallbackInterfaceBase objects that have the same + // |CallbackInterfaceBase::callback_object_| but have different + // |CallbackInterfaceBase::incumbent_script_state_|s. + bool operator==(const EventListener& other) const override { + const V8EventListenerImpl* other_event_listener = Cast(&other); + if (!other_event_listener) + return false; + return event_listener_->HasTheSameCallbackObject( + *other_event_listener->event_listener_); + } + + // blink::EventListener overrides: + v8::Local<v8::Object> GetListenerObjectForInspector( + ExecutionContext* execution_context) override { + return event_listener_->CallbackObject(); + } + DOMWrapperWorld* GetWorldForInspector() const override { return &World(); } + void handleEvent(ExecutionContext*, Event*) override; + void Trace(blink::Visitor*) override; + + v8::Local<v8::Object> GetListenerObject() const { + return event_listener_->CallbackObject(); + } + + private: + V8EventListenerImpl(v8::Local<v8::Object>, + ScriptState*, + const V8PrivateProperty::Symbol&); + + DOMWrapperWorld& World() const { + return event_listener_->CallbackRelevantScriptState()->World(); + } + + const TraceWrapperMember<V8EventListener> event_listener_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_IMPL_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_info.h b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_info.h index 7d637931..bf42e5f39 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_info.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_info.h
@@ -18,7 +18,7 @@ bool passive, bool once, v8::Local<v8::Object> handler, - int backend_node_id) + uint64_t backend_node_id) : event_type(event_type), use_capture(use_capture), passive(passive), @@ -31,7 +31,7 @@ bool passive; bool once; v8::Local<v8::Object> handler; - int backend_node_id; + uint64_t backend_node_id; }; using V8EventListenerInfoList = Vector<V8EventListenerInfo>;
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc index 4a87e26..b345078b 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc
@@ -42,9 +42,9 @@ V8EventListenerOrEventHandler::V8EventListenerOrEventHandler( bool is_attribute, ScriptState* script_state) - : V8AbstractEventListener(script_state->GetIsolate(), - is_attribute, - script_state->World()) {} + : V8AbstractEventHandler(script_state->GetIsolate(), + is_attribute, + script_state->World()) {} v8::Local<v8::Function> V8EventListenerOrEventHandler::GetListenerFunction( ScriptState* script_state) {
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h index c6c9680..b858e0c 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h
@@ -32,7 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_OR_EVENT_HANDLER_H_ #include "base/memory/scoped_refptr.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "v8/include/v8.h" namespace blink { @@ -42,7 +42,7 @@ // V8EventListenerOrEventHandler is a wrapper of a JS object implements // EventListener interface (has handleEvent(event) method), or a JS function // that can handle the event. -class V8EventListenerOrEventHandler : public V8AbstractEventListener { +class V8EventListenerOrEventHandler : public V8AbstractEventHandler { public: static V8EventListenerOrEventHandler* Create( v8::Local<v8::Object> listener,
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc index af26646..561e73c 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -38,7 +38,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/bindings/core/v8/script_source_code.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_node.h" #include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc index de5c4b1..1c9e0426 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -633,7 +633,12 @@ isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue); isolate->SetEmbedderHeapTracer( - V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor()); + RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled() + ? static_cast<v8::EmbedderHeapTracer*>( + V8PerIsolateData::From(isolate)->GetUnifiedHeapController()) + : static_cast<v8::EmbedderHeapTracer*>( + V8PerIsolateData::From(isolate) + ->GetScriptWrappableMarkingVisitor())); isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped); @@ -732,6 +737,20 @@ : Platform::Current()->CurrentThread()->GetTaskRunner(), v8_context_snapshot_mode); + // ThreadState::isolate_ needs to be set before setting the EmbedderHeapTracer + // as setting the tracer indicates that a V8 garbage collection should trace + // over to Blink. + DCHECK(ThreadState::MainThreadState()); + if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()) { + ThreadState::MainThreadState()->RegisterTraceDOMWrappers( + isolate, V8GCController::TraceDOMWrappers, nullptr, nullptr); + } else { + ThreadState::MainThreadState()->RegisterTraceDOMWrappers( + isolate, V8GCController::TraceDOMWrappers, + ScriptWrappableMarkingVisitor::InvalidateDeadObjectsInMarkingDeque, + ScriptWrappableMarkingVisitor::PerformCleanup); + } + InitializeV8Common(isolate); isolate->SetOOMErrorHandler(ReportOOMErrorInMainThread); @@ -765,12 +784,6 @@ &V8EmbedderGraphBuilder::BuildEmbedderGraphCallback, nullptr); } - DCHECK(ThreadState::MainThreadState()); - ThreadState::MainThreadState()->RegisterTraceDOMWrappers( - isolate, V8GCController::TraceDOMWrappers, - ScriptWrappableMarkingVisitor::InvalidateDeadObjectsInMarkingDeque, - ScriptWrappableMarkingVisitor::PerformCleanup); - V8PerIsolateData::From(isolate)->SetThreadDebugger( std::make_unique<MainThreadDebugger>(isolate));
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc index 8f79c2fe..377df4d 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc
@@ -60,7 +60,7 @@ const String source_url, const TextPosition& position, Node* node) - : V8AbstractEventListener(isolate, true, DOMWrapperWorld::MainWorld()), + : V8AbstractEventHandler(isolate, true, DOMWrapperWorld::MainWorld()), was_compilation_failed_(false), function_name_(function_name), event_parameter_name_(event_parameter_name),
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h index 9bddefe..a936395 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h
@@ -32,7 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_LAZY_EVENT_LISTENER_H_ #include "base/memory/scoped_refptr.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/platform/wtf/text/text_position.h" #include "v8/include/v8.h" @@ -44,7 +44,7 @@ // V8LazyEventListener is a wrapper for a JavaScript code string that is // compiled and evaluated when an event is fired. A V8LazyEventListener is // either a HTML or SVG event handler. -class V8LazyEventListener final : public V8AbstractEventListener { +class V8LazyEventListener final : public V8AbstractEventHandler { public: static V8LazyEventListener* Create(const AtomicString& function_name, const AtomicString& event_parameter_name, @@ -59,7 +59,7 @@ void Trace(blink::Visitor* visitor) override { visitor->Trace(node_); - V8AbstractEventListener::Trace(visitor); + V8AbstractEventHandler::Trace(visitor); } const String& Code() const override { return code_; }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_persistent_value_vector.h b/third_party/blink/renderer/bindings/core/v8/v8_persistent_value_vector.h index 4e44d822..75517624 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_persistent_value_vector.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_persistent_value_vector.h
@@ -49,10 +49,11 @@ static bool IsEmpty(const Impl* impl) { return impl->IsEmpty(); } static size_t Size(const Impl* impl) { return impl->size(); } static v8::PersistentContainerValue Get(const Impl* impl, size_t i) { - return (i < impl->size()) ? impl->at(i) : v8::kPersistentContainerNotFound; + return (i < impl->size()) ? impl->at(static_cast<wtf_size_t>(i)) + : v8::kPersistentContainerNotFound; } static void ReserveCapacity(Impl* impl, size_t capacity) { - impl->ReserveCapacity(capacity); + impl->ReserveCapacity(static_cast<wtf_size_t>(capacity)); } static void Clear(Impl* impl) { impl->clear(); } };
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc index 4388d8f..3ef6240 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -452,7 +452,7 @@ v8::MaybeLocal<v8::Value> V8ScriptRunner::CallExtraHelper( ScriptState* script_state, const char* name, - size_t num_args, + uint32_t num_args, v8::Local<v8::Value>* args) { v8::Isolate* isolate = script_state->GetIsolate(); v8::Local<v8::Value> function_value;
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h index a6e4920b..ffa79e6e 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h
@@ -98,7 +98,7 @@ const WTF::TextPosition&); // Calls a function on the V8 extras binding object. - template <size_t N> + template <uint32_t N> static v8::MaybeLocal<v8::Value> CallExtra(ScriptState* script_state, const char* name, v8::Local<v8::Value> (&args)[N]) { @@ -115,7 +115,7 @@ private: static v8::MaybeLocal<v8::Value> CallExtraHelper(ScriptState*, const char* name, - size_t num_args, + uint32_t num_args, v8::Local<v8::Value>* args); };
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc index 963f9e0b..49bf4c3 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc
@@ -183,7 +183,15 @@ WriteUint32(AlgorithmIdForWireFormat(algorithm.Id())); WriteUint32(AsymmetricKeyTypeForWireFormat(key.GetType())); WriteUint32(params.ModulusLengthBits()); - WriteUint32(params.PublicExponent().size()); + + if (params.PublicExponent().size() > + std::numeric_limits<uint32_t>::max()) { + exception_state.ThrowDOMException( + DOMExceptionCode::kDataCloneError, + "A CryptoKey object could not be cloned."); + return false; + } + WriteUint32(static_cast<uint32_t>(params.PublicExponent().size())); WriteRawBytes(params.PublicExponent().Data(), params.PublicExponent().size()); WriteUint32(AlgorithmIdForWireFormat(params.GetHash().Id())); @@ -216,7 +224,7 @@ "A CryptoKey object could not be cloned."); return false; } - WriteUint32(key_data.size()); + WriteUint32(static_cast<uint32_t>(key_data.size())); WriteRawBytes(key_data.Data(), key_data.size()); return true;
diff --git a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc index 0e878c03..11f1bcd 100644 --- a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc +++ b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
@@ -106,7 +106,7 @@ return v8::Date::New(context, key->Date()).ToLocalChecked(); case IDBKey::kArrayType: { v8::Local<v8::Array> array = v8::Array::New(isolate, key->Array().size()); - for (size_t i = 0; i < key->Array().size(); ++i) { + for (wtf_size_t i = 0; i < key->Array().size(); ++i) { v8::Local<v8::Value> value = ToV8(key->Array()[i].get(), creation_context, isolate); if (value.IsEmpty()) @@ -290,7 +290,7 @@ v8::HandleScope handle_scope(isolate); v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::TryCatch block(isolate); - for (size_t i = 0; i < key_path_elements.size(); ++i) { + for (wtf_size_t i = 0; i < key_path_elements.size(); ++i) { const String& element = key_path_elements[i]; // Special cases from https://w3c.github.io/IndexedDB/#key-path-construct @@ -365,7 +365,7 @@ if (key_path.GetType() == IDBKeyPath::kArrayType) { IDBKey::KeyArray result; const Vector<String>& array = key_path.Array(); - for (size_t i = 0; i < array.size(); ++i) { + for (wtf_size_t i = 0; i < array.size(); ++i) { result.emplace_back(CreateIDBKeyFromValueAndKeyPath( isolate, value, array[i], exception_state)); if (!result.back()) @@ -442,7 +442,7 @@ v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::Local<v8::Array> array = v8::Array::New(isolate, values.size()); - for (size_t i = 0; i < values.size(); ++i) { + for (wtf_size_t i = 0; i < values.size(); ++i) { v8::Local<v8::Value> v8_value = DeserializeIDBValue(isolate, creation_context, values[i].get()); if (v8_value.IsEmpty()) @@ -516,7 +516,7 @@ // injection required by the object store. The simplest example is writing // numbers or booleans to an object store with an auto-incrementing primary // keys. - for (size_t i = 0; i < key_path_elements.size() - 1; ++i) { + for (wtf_size_t i = 0; i < key_path_elements.size() - 1; ++i) { if (!value->IsObject()) return false; @@ -575,7 +575,7 @@ return false; v8::Local<v8::Context> context = isolate->GetCurrentContext(); - for (size_t i = 0; i < key_path_elements.size(); ++i) { + for (wtf_size_t i = 0; i < key_path_elements.size(); ++i) { const String& key_path_element = key_path_elements[i]; // Can't overwrite properties like array or string length. if (IsImplicitProperty(isolate, current, key_path_element))
diff --git a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules_test.cc b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules_test.cc index a2e9676..6753e600 100644 --- a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules_test.cc +++ b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules_test.cc
@@ -151,7 +151,8 @@ non_throwable_exception_state); base::span<const uint8_t> ssv_wire_data = serialized_value->GetWireData(); DCHECK(wire_bytes->IsEmpty()); - wire_bytes->Append(ssv_wire_data.data(), ssv_wire_data.size()); + wire_bytes->Append(ssv_wire_data.data(), + static_cast<wtf_size_t>(ssv_wire_data.size())); // Sanity check that the serialization header has not changed, as the tests // that use this method rely on the header format.
diff --git a/third_party/blink/renderer/bindings/modules/v8/webgl_any.cc b/third_party/blink/renderer/bindings/modules/v8/webgl_any.cc index 27397b1..61b74eb 100644 --- a/third_party/blink/renderer/bindings/modules/v8/webgl_any.cc +++ b/third_party/blink/renderer/bindings/modules/v8/webgl_any.cc
@@ -16,9 +16,9 @@ ScriptValue WebGLAny(ScriptState* script_state, const bool* value, - size_t size) { + uint32_t size) { v8::Local<v8::Array> array = v8::Array::New(script_state->GetIsolate(), size); - for (size_t i = 0; i < size; ++i) { + for (uint32_t i = 0; i < size; ++i) { if (!V8CallBoolean(array->CreateDataProperty( script_state->GetContext(), i, v8::Boolean::New(script_state->GetIsolate(), value[i])))) @@ -28,9 +28,9 @@ } ScriptValue WebGLAny(ScriptState* script_state, const Vector<bool>& value) { - size_t size = value.size(); + wtf_size_t size = value.size(); v8::Local<v8::Array> array = v8::Array::New(script_state->GetIsolate(), size); - for (size_t i = 0; i < size; ++i) { + for (wtf_size_t i = 0; i < size; ++i) { if (!V8CallBoolean(array->CreateDataProperty( script_state->GetContext(), i, v8::Boolean::New(script_state->GetIsolate(), value[i])))) @@ -40,9 +40,9 @@ } ScriptValue WebGLAny(ScriptState* script_state, const Vector<unsigned>& value) { - size_t size = value.size(); + wtf_size_t size = value.size(); v8::Local<v8::Array> array = v8::Array::New(script_state->GetIsolate(), size); - for (size_t i = 0; i < size; ++i) { + for (wtf_size_t i = 0; i < size; ++i) { if (!V8CallBoolean(array->CreateDataProperty( script_state->GetContext(), i, v8::Integer::NewFromUnsigned(script_state->GetIsolate(), @@ -53,9 +53,9 @@ } ScriptValue WebGLAny(ScriptState* script_state, const Vector<int>& value) { - size_t size = value.size(); + wtf_size_t size = value.size(); v8::Local<v8::Array> array = v8::Array::New(script_state->GetIsolate(), size); - for (size_t i = 0; i < size; ++i) { + for (wtf_size_t i = 0; i < size; ++i) { if (!V8CallBoolean(array->CreateDataProperty( script_state->GetContext(), i, v8::Integer::New(script_state->GetIsolate(), value[i]))))
diff --git a/third_party/blink/renderer/bindings/modules/v8/webgl_any.h b/third_party/blink/renderer/bindings/modules/v8/webgl_any.h index 79da12ce..3978e97 100644 --- a/third_party/blink/renderer/bindings/modules/v8/webgl_any.h +++ b/third_party/blink/renderer/bindings/modules/v8/webgl_any.h
@@ -14,7 +14,7 @@ namespace blink { ScriptValue WebGLAny(ScriptState*, bool value); -ScriptValue WebGLAny(ScriptState*, const bool* value, size_t); +ScriptValue WebGLAny(ScriptState*, const bool* value, uint32_t); ScriptValue WebGLAny(ScriptState*, const Vector<bool>& value); ScriptValue WebGLAny(ScriptState*, const Vector<unsigned>& value); ScriptValue WebGLAny(ScriptState*, const Vector<int>& value);
diff --git a/third_party/blink/renderer/bindings/scripts/v8_types.py b/third_party/blink/renderer/bindings/scripts/v8_types.py index 84f53633..5b90f734 100644 --- a/third_party/blink/renderer/bindings/scripts/v8_types.py +++ b/third_party/blink/renderer/bindings/scripts/v8_types.py
@@ -412,7 +412,7 @@ 'core/typed_arrays/array_buffer_view_helpers.h', 'core/typed_arrays/flexible_array_buffer_view.h']), 'Dictionary': set(['bindings/core/v8/dictionary.h']), - 'EventHandler': set(['bindings/core/v8/v8_abstract_event_listener.h', + 'EventHandler': set(['bindings/core/v8/v8_abstract_event_handler.h', 'bindings/core/v8/v8_event_listener_helper.h']), 'EventListener': set(['bindings/core/v8/binding_security.h', 'bindings/core/v8/v8_event_listener_helper.h', @@ -1040,7 +1040,7 @@ # Special cases 'Dictionary': '{cpp_value}.V8Value()', 'EventHandler': - 'V8AbstractEventListener::GetListenerOrNull({isolate}, impl, {cpp_value})', + 'V8AbstractEventHandler::GetListenerOrNull({isolate}, impl, {cpp_value})', 'NodeFilter': 'ToV8({cpp_value}, {creation_context}, {isolate})', 'Record': 'ToV8({cpp_value}, {creation_context}, {isolate})', 'ScriptValue': '{cpp_value}.V8Value()',
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface.cc index ae6a47f..e4ffca3 100644 --- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface.cc +++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface.cc
@@ -15,7 +15,7 @@ #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h" #include "third_party/blink/renderer/bindings/core/v8/v8_element.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.h" @@ -994,7 +994,7 @@ EventListener* cppValue(WTF::GetPtr(impl->implementsEventHandlerAttribute())); - V8SetReturnValue(info, V8AbstractEventListener::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); + V8SetReturnValue(info, V8AbstractEventHandler::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); } static void implementsEventHandlerAttributeAttributeSetter(v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface_node.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface_node.cc index 8d7ecc3..40df4e5 100644 --- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface_node.cc +++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_interface_node.cc
@@ -13,7 +13,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/bindings/core/v8/idl_types.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.h" #include "third_party/blink/renderer/bindings/core/v8/v8_test_interface_empty.h" @@ -133,7 +133,7 @@ EventListener* cppValue(WTF::GetPtr(impl->eventHandlerAttribute())); - V8SetReturnValue(info, V8AbstractEventListener::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); + V8SetReturnValue(info, V8AbstractEventHandler::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); } static void eventHandlerAttributeAttributeSetter(v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc index 0f6c0d0..371e7c6 100644 --- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc +++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc
@@ -20,7 +20,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_factory.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_array_buffer.h" #include "third_party/blink/renderer/bindings/core/v8/v8_array_buffer_view.h" #include "third_party/blink/renderer/bindings/core/v8/v8_attr.h" @@ -1607,7 +1607,7 @@ EventListener* cppValue(WTF::GetPtr(impl->eventHandlerAttribute())); - V8SetReturnValue(info, V8AbstractEventListener::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); + V8SetReturnValue(info, V8AbstractEventHandler::GetListenerOrNull(info.GetIsolate(), impl, cppValue)); } static void eventHandlerAttributeAttributeSetter(v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 6d871a9..a32b0fc1 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -2179,6 +2179,7 @@ "timing/performance_test.cc", "timing/time_clamper_test.cc", "timing/window_performance_test.cc", + "trustedtypes/trusted_types_util_test.cc", "url/url_search_params_test.cc", "workers/dedicated_worker_test.cc", "workers/main_thread_worklet_test.cc",
diff --git a/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.cc b/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.cc index 41b5f42..0635999 100644 --- a/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.cc +++ b/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.cc
@@ -44,10 +44,10 @@ return DefaultInterpolateTo(this, value, fraction); FilterOperations result; - size_t from_size = Operations().size(); - size_t to_size = target->Operations().size(); - size_t size = std::max(from_size, to_size); - for (size_t i = 0; i < size; i++) { + wtf_size_t from_size = Operations().size(); + wtf_size_t to_size = target->Operations().size(); + wtf_size_t size = std::max(from_size, to_size); + for (wtf_size_t i = 0; i < size; i++) { FilterOperation* from = (i < from_size) ? operation_wrapper_->Operations().Operations()[i].Get() : nullptr;
diff --git a/third_party/blink/renderer/core/animation/animation_input_helpers.cc b/third_party/blink/renderer/core/animation/animation_input_helpers.cc index 41c79d2..1aa84f6 100644 --- a/third_party/blink/renderer/core/animation/animation_input_helpers.cc +++ b/third_party/blink/renderer/core/animation/animation_input_helpers.cc
@@ -70,7 +70,7 @@ return CSSPropertyOffset; StringBuilder builder; - for (size_t i = 0; i < property.length(); ++i) { + for (wtf_size_t i = 0; i < property.length(); ++i) { // Disallow hyphenated properties. if (property[i] == '-') return CSSPropertyInvalid;
diff --git a/third_party/blink/renderer/core/animation/animation_time_delta.cc b/third_party/blink/renderer/core/animation/animation_time_delta.cc index 2e30a188..a1be720f 100644 --- a/third_party/blink/renderer/core/animation/animation_time_delta.cc +++ b/third_party/blink/renderer/core/animation/animation_time_delta.cc
@@ -9,27 +9,27 @@ #if !defined(BLINK_ANIMATION_USE_TIME_DELTA) // Comparison operators on AnimationTimeDelta. bool CORE_EXPORT operator==(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs) { + const AnimationTimeDelta& rhs) { return lhs.InSecondsF() == rhs.InSecondsF(); } bool CORE_EXPORT operator!=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs) { + const AnimationTimeDelta& rhs) { return lhs.InSecondsF() != rhs.InSecondsF(); } bool CORE_EXPORT operator>(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs) { + const AnimationTimeDelta& rhs) { return lhs.InSecondsF() > rhs.InSecondsF(); } bool CORE_EXPORT operator>=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs) { + const AnimationTimeDelta& rhs) { return lhs.InSecondsF() >= rhs.InSecondsF(); } bool CORE_EXPORT operator<=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs) { + const AnimationTimeDelta& rhs) { return lhs.InSecondsF() <= rhs.InSecondsF(); } -std::ostream& operator<<(std::ostream& os, AnimationTimeDelta time) { +std::ostream& operator<<(std::ostream& os, const AnimationTimeDelta& time) { return os << time.InSecondsF() << " s"; } #endif
diff --git a/third_party/blink/renderer/core/animation/animation_time_delta.h b/third_party/blink/renderer/core/animation/animation_time_delta.h index 95d2184..d8d08da4 100644 --- a/third_party/blink/renderer/core/animation/animation_time_delta.h +++ b/third_party/blink/renderer/core/animation/animation_time_delta.h
@@ -91,18 +91,19 @@ // Comparison operators on AnimationTimeDelta. bool CORE_EXPORT operator==(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs); + const AnimationTimeDelta& rhs); bool CORE_EXPORT operator!=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs); + const AnimationTimeDelta& rhs); bool CORE_EXPORT operator>(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs); + const AnimationTimeDelta& rhs); bool CORE_EXPORT operator>=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs); + const AnimationTimeDelta& rhs); bool CORE_EXPORT operator<=(const AnimationTimeDelta& lhs, - const AnimationTimeDelta& rhs); + const AnimationTimeDelta& rhs); // Defined to allow DCHECK_EQ/etc to work with the class. -CORE_EXPORT std::ostream& operator<<(std::ostream& os, AnimationTimeDelta time); +CORE_EXPORT std::ostream& operator<<(std::ostream& os, + const AnimationTimeDelta& time); #else // !defined(BLINK_ANIMATION_USE_TIME_DELTA)
diff --git a/third_party/blink/renderer/core/animation/basic_shape_interpolation_functions.cc b/third_party/blink/renderer/core/animation/basic_shape_interpolation_functions.cc index 84e7bebb..5e7a1cb7 100644 --- a/third_party/blink/renderer/core/animation/basic_shape_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/basic_shape_interpolation_functions.cc
@@ -19,7 +19,7 @@ return base::AdoptRef(new BasicShapeNonInterpolableValue(type)); } static scoped_refptr<NonInterpolableValue> CreatePolygon(WindRule wind_rule, - size_t size) { + wtf_size_t size) { return base::AdoptRef(new BasicShapeNonInterpolableValue(wind_rule, size)); } @@ -29,7 +29,7 @@ DCHECK_EQ(GetShapeType(), BasicShape::kBasicShapePolygonType); return wind_rule_; } - size_t size() const { + wtf_size_t size() const { DCHECK_EQ(GetShapeType(), BasicShape::kBasicShapePolygonType); return size_; } @@ -57,14 +57,14 @@ : type_(type), wind_rule_(RULE_NONZERO), size_(0) { DCHECK_NE(type, BasicShape::kBasicShapePolygonType); } - BasicShapeNonInterpolableValue(WindRule wind_rule, size_t size) + BasicShapeNonInterpolableValue(WindRule wind_rule, wtf_size_t size) : type_(BasicShape::kBasicShapePolygonType), wind_rule_(wind_rule), size_(size) {} const BasicShape::ShapeType type_; const WindRule wind_rule_; - const size_t size_; + const wtf_size_t size_; }; DEFINE_NON_INTERPOLABLE_VALUE_TYPE(BasicShapeNonInterpolableValue); @@ -454,9 +454,9 @@ InterpolationValue ConvertCSSValue( const cssvalue::CSSBasicShapePolygonValue& polygon) { - size_t size = polygon.Values().size(); + wtf_size_t size = polygon.Values().size(); std::unique_ptr<InterpolableList> list = InterpolableList::Create(size); - for (size_t i = 0; i < size; i++) + for (wtf_size_t i = 0; i < size; i++) list->Set(i, ConvertCSSLength(polygon.Values()[i].Get())); return InterpolationValue(std::move(list), BasicShapeNonInterpolableValue::CreatePolygon( @@ -465,9 +465,9 @@ InterpolationValue ConvertBasicShape(const BasicShapePolygon& polygon, double zoom) { - size_t size = polygon.Values().size(); + wtf_size_t size = polygon.Values().size(); std::unique_ptr<InterpolableList> list = InterpolableList::Create(size); - for (size_t i = 0; i < size; i++) + for (wtf_size_t i = 0; i < size; i++) list->Set(i, ConvertLength(polygon.Values()[i], zoom)); return InterpolationValue(std::move(list), BasicShapeNonInterpolableValue::CreatePolygon( @@ -478,7 +478,7 @@ const BasicShapeNonInterpolableValue& non_interpolable_value) { std::unique_ptr<InterpolableList> list = InterpolableList::Create(non_interpolable_value.size()); - for (size_t i = 0; i < non_interpolable_value.size(); i++) + for (wtf_size_t i = 0; i < non_interpolable_value.size(); i++) list->Set(i, LengthInterpolationFunctions::CreateNeutralInterpolableValue()); return std::move(list); @@ -491,10 +491,10 @@ scoped_refptr<BasicShapePolygon> polygon = BasicShapePolygon::Create(); polygon->SetWindRule(non_interpolable_value.GetWindRule()); const InterpolableList& list = ToInterpolableList(interpolable_value); - size_t size = non_interpolable_value.size(); + wtf_size_t size = non_interpolable_value.size(); DCHECK_EQ(list.length(), size); DCHECK_EQ(size % 2, 0U); - for (size_t i = 0; i < size; i += 2) { + for (wtf_size_t i = 0; i < size; i += 2) { polygon->AppendPoint( LengthInterpolationFunctions::CreateLength( *list.Get(i), nullptr, conversion_data, kValueRangeAll),
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index 1b176054a..00a67bf8 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -236,7 +236,7 @@ PersistentHeapVector<Member<StringKeyframe>> CreateCompositableFloatKeyframeVector(Vector<double>& values) { PersistentHeapVector<Member<StringKeyframe>> frames; - for (size_t i = 0; i < values.size(); i++) { + for (wtf_size_t i = 0; i < values.size(); i++) { double offset = 1.0 / (values.size() - 1) * i; String value = String::Number(values[i]); frames.push_back( @@ -333,17 +333,6 @@ return keyframe; } - StringKeyframeVector* CreateCompositableTransformKeyframeVector( - const Vector<String>& values) { - StringKeyframeVector* frames = new StringKeyframeVector; - for (size_t i = 0; i < values.size(); ++i) { - double offset = 1.0f / (values.size() - 1) * i; - frames->push_back( - CreateReplaceOpKeyframe(CSSPropertyTransform, values[i], offset)); - } - return frames; - } - StringKeyframe* CreateSVGKeyframe(const QualifiedName& name, const String& value, double offset) {
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_update.h b/third_party/blink/renderer/core/animation/css/css_animation_update.h index 3c3d982..3ea79d12 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation_update.h +++ b/third_party/blink/renderer/core/animation/css/css_animation_update.h
@@ -59,7 +59,7 @@ DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: - UpdatedCSSAnimation(size_t index, + UpdatedCSSAnimation(wtf_size_t index, Animation* animation, const InertEffect& effect, Timing specified_timing, @@ -79,7 +79,7 @@ visitor->Trace(style_rule); } - size_t index; + wtf_size_t index; Member<Animation> animation; Member<const InertEffect> effect; Timing specified_timing; @@ -118,14 +118,14 @@ effect, timing, style_rule, play_state_list)); } - void CancelAnimation(size_t index, const Animation& animation) { + void CancelAnimation(wtf_size_t index, const Animation& animation) { cancelled_animation_indices_.push_back(index); suppressed_animations_.insert(&animation); } - void ToggleAnimationIndexPaused(size_t index) { + void ToggleAnimationIndexPaused(wtf_size_t index) { animation_indices_with_pause_toggled_.push_back(index); } - void UpdateAnimation(size_t index, + void UpdateAnimation(wtf_size_t index, Animation* animation, const InertEffect& effect, const Timing& specified_timing, @@ -158,13 +158,13 @@ const HeapVector<NewCSSAnimation>& NewAnimations() const { return new_animations_; } - const Vector<size_t>& CancelledAnimationIndices() const { + const Vector<wtf_size_t>& CancelledAnimationIndices() const { return cancelled_animation_indices_; } const HeapHashSet<Member<const Animation>>& SuppressedAnimations() const { return suppressed_animations_; } - const Vector<size_t>& AnimationIndicesWithPauseToggled() const { + const Vector<wtf_size_t>& AnimationIndicesWithPauseToggled() const { return animation_indices_with_pause_toggled_; } const HeapVector<UpdatedCSSAnimation>& AnimationsWithUpdates() const { @@ -270,9 +270,9 @@ // with the same name, due to the way in which we split up animations with // incomplete keyframes. HeapVector<NewCSSAnimation> new_animations_; - Vector<size_t> cancelled_animation_indices_; + Vector<wtf_size_t> cancelled_animation_indices_; HeapHashSet<Member<const Animation>> suppressed_animations_; - Vector<size_t> animation_indices_with_pause_toggled_; + Vector<wtf_size_t> animation_indices_with_pause_toggled_; HeapVector<UpdatedCSSAnimation> animations_with_updates_; HeapVector<Member<Animation>> updated_compositor_keyframes_;
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index 9e3efa0..25e8cbf9 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -98,7 +98,7 @@ // Construct and populate the style for each keyframe PropertySet specified_properties_for_use_counter; - for (size_t i = 0; i < style_keyframes.size(); ++i) { + for (wtf_size_t i = 0; i < style_keyframes.size(); ++i) { const StyleRuleKeyframe* style_keyframe = style_keyframes[i].Get(); StringKeyframe* keyframe = StringKeyframe::Create(); const Vector<double>& offsets = style_keyframe->Keys(); @@ -129,7 +129,7 @@ } keyframes.push_back(keyframe); // The last keyframe specified at a given offset is used. - for (size_t j = 1; j < offsets.size(); ++j) { + for (wtf_size_t j = 1; j < offsets.size(); ++j) { keyframes.push_back( ToStringKeyframe(keyframe->CloneWithOffset(offsets[j]))); } @@ -153,8 +153,8 @@ [](const Member<Keyframe>& a, const Member<Keyframe>& b) { return a->CheckedOffset() < b->CheckedOffset(); }); - size_t target_index = 0; - for (size_t i = 1; i < keyframes.size(); i++) { + wtf_size_t target_index = 0; + for (wtf_size_t i = 1; i < keyframes.size(); i++) { if (keyframes[i]->CheckedOffset() == keyframes[target_index]->CheckedOffset()) { for (const auto& property : keyframes[i]->Properties()) { @@ -342,14 +342,14 @@ if (animation_data && style.Display() != EDisplay::kNone) { const Vector<AtomicString>& name_list = animation_data->NameList(); - for (size_t i = 0; i < name_list.size(); ++i) { + for (wtf_size_t i = 0; i < name_list.size(); ++i) { AtomicString name = name_list[i]; if (name == CSSAnimationData::InitialName()) continue; // Find n where this is the nth occurence of this animation name. - size_t name_index = 0; - for (size_t j = 0; j < i; j++) { + wtf_size_t name_index = 0; + for (wtf_size_t j = 0; j < i; j++) { if (name_list[j] == name) name_index++; } @@ -370,10 +370,10 @@ continue; // Cancel the animation if there's no style rule for it. const RunningAnimation* existing_animation = nullptr; - size_t existing_animation_index = 0; + wtf_size_t existing_animation_index = 0; if (css_animations) { - for (size_t i = 0; i < css_animations->running_animations_.size(); + for (wtf_size_t i = 0; i < css_animations->running_animations_.size(); i++) { const RunningAnimation& running_animation = *css_animations->running_animations_[i]; @@ -427,7 +427,7 @@ } } - for (size_t i = 0; i < cancel_running_animation_flags.size(); i++) { + for (wtf_size_t i = 0; i < cancel_running_animation_flags.size(); i++) { if (cancel_running_animation_flags[i]) { DCHECK(css_animations && !is_animation_style_change); update.CancelAnimation( @@ -486,7 +486,7 @@ // https://code.google.com/p/chromium/issues/detail?id=339847 DisableCompositingQueryAsserts disabler; - for (size_t paused_index : + for (wtf_size_t paused_index : pending_update_.AnimationIndicesWithPauseToggled()) { Animation& animation = *running_animations_[paused_index]->animation; if (animation.Paused()) @@ -510,9 +510,9 @@ running_animations_[entry.index]->Update(entry); } - const Vector<size_t>& cancelled_indices = + const Vector<wtf_size_t>& cancelled_indices = pending_update_.CancelledAnimationIndices(); - for (size_t i = cancelled_indices.size(); i-- > 0;) { + for (wtf_size_t i = cancelled_indices.size(); i-- > 0;) { DCHECK(i == cancelled_indices.size() - 1 || cancelled_indices[i] < cancelled_indices[i + 1]); Animation& animation = @@ -926,7 +926,7 @@ update, animating_element, *old_style, style, nullptr, active_transitions, listed_properties, *transition_data}; - for (size_t transition_index = 0; + for (wtf_size_t transition_index = 0; transition_index < transition_data->PropertyList().size(); ++transition_index) { const CSSTransitionData::TransitionProperty& transition_property =
diff --git a/third_party/blink/renderer/core/animation/css/css_timing_data.cc b/third_party/blink/renderer/core/animation/css/css_timing_data.cc index 3cb08645..3baf8c8 100644 --- a/third_party/blink/renderer/core/animation/css/css_timing_data.cc +++ b/third_party/blink/renderer/core/animation/css/css_timing_data.cc
@@ -34,7 +34,7 @@ if (timing_function_list_.size() != other.timing_function_list_.size()) return false; - for (size_t i = 0; i < timing_function_list_.size(); i++) { + for (wtf_size_t i = 0; i < timing_function_list_.size(); i++) { if (!DataEquivalent(timing_function_list_.at(i), other.timing_function_list_.at(i))) { return false;
diff --git a/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc index e85f79c7..17b3950 100644 --- a/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc
@@ -231,7 +231,7 @@ sides[kSideBottom] = &box.Bottom(); sides[kSideLeft] = &box.Left(); - for (size_t i = 0; i < kSideIndexCount; i++) { + for (wtf_size_t i = 0; i < kSideIndexCount; i++) { const BorderImageLength& side = *sides[i]; if (side.IsNumber()) { list->Set(i, InterpolableNumber::Create(side.Number())); @@ -307,7 +307,7 @@ sides[kSideBottom] = quad.Bottom(); sides[kSideLeft] = quad.Left(); - for (size_t i = 0; i < kSideIndexCount; i++) { + for (wtf_size_t i = 0; i < kSideIndexCount; i++) { const CSSValue& side = *sides[i]; if (side.IsPrimitiveValue() && ToCSSPrimitiveValue(side).IsNumber()) { list->Set(i, InterpolableNumber::Create( @@ -390,7 +390,7 @@ side_non_interpolable_values = non_interpolable_value.SideNonInterpolableValues(); - for (size_t i = 0; i < kSideIndexCount; i++) { + for (wtf_size_t i = 0; i < kSideIndexCount; i++) { switch (side_types.type[i]) { case SideType::kNumber: underlying_list.GetMutable(i)->ScaleAndAdd(underlying_fraction, @@ -424,7 +424,7 @@ const InterpolableList& list = ToInterpolableList(interpolable_value); const auto& convert_side = [&side_types, &list, &state, - &non_interpolable_values](size_t index) -> BorderImageLength { + &non_interpolable_values](wtf_size_t index) -> BorderImageLength { switch (side_types.type[index]) { case SideType::kNumber: return clampTo<double>(ToInterpolableNumber(list.Get(index))->Value(),
diff --git a/third_party/blink/renderer/core/animation/css_clip_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_clip_interpolation_type.cc index 50f88ae..e66554d 100644 --- a/third_party/blink/renderer/core/animation/css_clip_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_clip_interpolation_type.cc
@@ -285,7 +285,7 @@ const ClipAutos& autos = ToCSSClipNonInterpolableValue(non_interpolable_value)->GetClipAutos(); const InterpolableList& list = ToInterpolableList(interpolable_value); - const auto& convert_index = [&list, &state](bool is_auto, size_t index) { + const auto& convert_index = [&list, &state](bool is_auto, wtf_size_t index) { if (is_auto) return Length(kAuto); return LengthInterpolationFunctions::CreateLength(
diff --git a/third_party/blink/renderer/core/animation/css_filter_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_filter_list_interpolation_type.cc index 67c6a6f..f32881e 100644 --- a/third_party/blink/renderer/core/animation/css_filter_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_filter_list_interpolation_type.cc
@@ -65,7 +65,7 @@ if (non_interpolable_list_->length() != underlying_non_interpolable_list.length()) return false; - for (size_t i = 0; i < non_interpolable_list_->length(); i++) { + for (wtf_size_t i = 0; i < non_interpolable_list_->length(); i++) { if (!FilterInterpolationFunctions::FiltersAreCompatible( *non_interpolable_list_->Get(i), *underlying_non_interpolable_list.Get(i))) @@ -112,11 +112,11 @@ InterpolationValue ConvertFilterList(const FilterOperations& filter_operations, double zoom) { - size_t length = filter_operations.size(); + wtf_size_t length = filter_operations.size(); std::unique_ptr<InterpolableList> interpolable_list = InterpolableList::Create(length); Vector<scoped_refptr<NonInterpolableValue>> non_interpolable_values(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { InterpolationValue filter_result = FilterInterpolationFunctions::MaybeConvertFilter( *filter_operations.Operations()[i], zoom); @@ -176,11 +176,11 @@ return nullptr; const CSSValueList& list = ToCSSValueList(value); - size_t length = list.length(); + wtf_size_t length = list.length(); std::unique_ptr<InterpolableList> interpolable_list = InterpolableList::Create(length); Vector<scoped_refptr<NonInterpolableValue>> non_interpolable_values(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { InterpolationValue item_result = FilterInterpolationFunctions::MaybeConvertCSSFilter(list.Item(i)); if (!item_result) @@ -207,10 +207,10 @@ ToNonInterpolableList(*start.non_interpolable_value); NonInterpolableList& end_non_interpolable_list = ToNonInterpolableList(*end.non_interpolable_value); - size_t start_length = start_non_interpolable_list.length(); - size_t end_length = end_non_interpolable_list.length(); + wtf_size_t start_length = start_non_interpolable_list.length(); + wtf_size_t end_length = end_non_interpolable_list.length(); - for (size_t i = 0; i < start_length && i < end_length; i++) { + for (wtf_size_t i = 0; i < start_length && i < end_length; i++) { if (!FilterInterpolationFunctions::FiltersAreCompatible( *start_non_interpolable_list.Get(i), *end_non_interpolable_list.Get(i))) @@ -227,9 +227,9 @@ // with corresponding filters in the longer list. InterpolationValue& shorter = start_length < end_length ? start : end; InterpolationValue& longer = start_length < end_length ? end : start; - size_t shorter_length = + wtf_size_t shorter_length = ToNonInterpolableList(*shorter.non_interpolable_value).length(); - size_t longer_length = + wtf_size_t longer_length = ToNonInterpolableList(*longer.non_interpolable_value).length(); InterpolableList& shorter_interpolable_list = ToInterpolableList(*shorter.interpolable_value); @@ -237,7 +237,7 @@ ToNonInterpolableList(*longer.non_interpolable_value); std::unique_ptr<InterpolableList> extended_interpolable_list = InterpolableList::Create(longer_length); - for (size_t i = 0; i < longer_length; i++) { + for (wtf_size_t i = 0; i < longer_length; i++) { if (i < shorter_length) extended_interpolable_list->Set( i, std::move(shorter_interpolable_list.GetMutable(i))); @@ -263,10 +263,10 @@ *underlying_value_owner.Value().non_interpolable_value); const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*value.non_interpolable_value); - size_t underlying_length = underlying_non_interpolable_list.length(); - size_t length = non_interpolable_list.length(); + wtf_size_t underlying_length = underlying_non_interpolable_list.length(); + wtf_size_t length = non_interpolable_list.length(); - for (size_t i = 0; i < underlying_length && i < length; i++) { + for (wtf_size_t i = 0; i < underlying_length && i < length; i++) { if (!FilterInterpolationFunctions::FiltersAreCompatible( *underlying_non_interpolable_list.Get(i), *non_interpolable_list.Get(i))) { @@ -282,7 +282,7 @@ DCHECK_EQ(underlying_length, underlying_interpolable_list.length()); DCHECK_EQ(length, interpolable_list.length()); - for (size_t i = 0; i < length && i < underlying_length; i++) + for (wtf_size_t i = 0; i < length && i < underlying_length; i++) underlying_interpolable_list.GetMutable(i)->ScaleAndAdd( underlying_fraction, *interpolable_list.Get(i)); @@ -291,7 +291,7 @@ std::unique_ptr<InterpolableList> extended_interpolable_list = InterpolableList::Create(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { if (i < underlying_length) extended_interpolable_list->Set( i, std::move(underlying_interpolable_list.GetMutable(i))); @@ -313,12 +313,12 @@ ToInterpolableList(interpolable_value); const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*non_interpolable_value); - size_t length = interpolable_list.length(); + wtf_size_t length = interpolable_list.length(); DCHECK_EQ(length, non_interpolable_list.length()); FilterOperations filter_operations; filter_operations.Operations().ReserveCapacity(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { filter_operations.Operations().push_back( FilterInterpolationFunctions::CreateFilter( *interpolable_list.Get(i), *non_interpolable_list.Get(i), state));
diff --git a/third_party/blink/renderer/core/animation/css_font_variation_settings_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_font_variation_settings_interpolation_type.cc index f0323d9..7e2a933 100644 --- a/third_party/blink/renderer/core/animation/css_font_variation_settings_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_font_variation_settings_interpolation_type.cc
@@ -104,10 +104,10 @@ if (!settings || settings->size() == 0) { return nullptr; } - size_t length = settings->size(); + wtf_size_t length = settings->size(); std::unique_ptr<InterpolableList> numbers = InterpolableList::Create(length); Vector<AtomicString> tags; - for (size_t i = 0; i < length; ++i) { + for (wtf_size_t i = 0; i < length; ++i) { numbers->Set(i, InterpolableNumber::Create(settings->at(i).Value())); tags.push_back(settings->at(i).Tag()); } @@ -152,10 +152,10 @@ return nullptr; } const CSSValueList& list = ToCSSValueList(value); - size_t length = list.length(); + wtf_size_t length = list.length(); std::unique_ptr<InterpolableList> numbers = InterpolableList::Create(length); Vector<AtomicString> tags; - for (size_t i = 0; i < length; ++i) { + for (wtf_size_t i = 0; i < length; ++i) { const cssvalue::CSSFontVariationValue& item = cssvalue::ToCSSFontVariationValue(list.Item(i)); numbers->Set(i, InterpolableNumber::Create(item.Value())); @@ -209,8 +209,8 @@ scoped_refptr<FontVariationSettings> settings = FontVariationSettings::Create(); - size_t length = numbers.length(); - for (size_t i = 0; i < length; ++i) { + wtf_size_t length = numbers.length(); + for (wtf_size_t i = 0; i < length; ++i) { settings->Append(FontVariationAxis( tags[i], ToInterpolableNumber(numbers.Get(i))->Value())); }
diff --git a/third_party/blink/renderer/core/animation/css_image_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_image_list_interpolation_type.cc index c1e352f..b712cd0 100644 --- a/third_party/blink/renderer/core/animation/css_image_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_image_list_interpolation_type.cc
@@ -63,7 +63,7 @@ return nullptr; return ListInterpolationFunctions::CreateList( - image_list.size(), [&image_list](size_t index) { + image_list.size(), [&image_list](wtf_size_t index) { return CSSImageInterpolationType::MaybeConvertStyleImage( image_list[index].Get(), false); }); @@ -128,11 +128,11 @@ const CSSValueList& value_list = temp_list ? *temp_list : ToCSSValueList(value); - const size_t length = value_list.length(); + const wtf_size_t length = value_list.length(); std::unique_ptr<InterpolableList> interpolable_list = InterpolableList::Create(length); Vector<scoped_refptr<NonInterpolableValue>> non_interpolable_values(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { InterpolationValue component = CSSImageInterpolationType::MaybeConvertCSSValue(value_list.Item(i), false); @@ -179,13 +179,13 @@ StyleResolverState& state) const { const InterpolableList& interpolable_list = ToInterpolableList(interpolable_value); - const size_t length = interpolable_list.length(); + const wtf_size_t length = interpolable_list.length(); DCHECK_GT(length, 0U); const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*non_interpolable_value); DCHECK_EQ(non_interpolable_list.length(), length); StyleImageList image_list(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { image_list[i] = CSSImageInterpolationType::ResolveStyleImage( CssProperty(), *interpolable_list.Get(i), non_interpolable_list.Get(i), state);
diff --git a/third_party/blink/renderer/core/animation/css_image_slice_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_image_slice_interpolation_type.cc index 4da2cd04..ac3b543 100644 --- a/third_party/blink/renderer/core/animation/css_image_slice_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_image_slice_interpolation_type.cc
@@ -141,7 +141,7 @@ sides[kSideBottom] = &slice.slices.Bottom(); sides[kSideLeft] = &slice.slices.Left(); - for (size_t i = 0; i < kSideIndexCount; i++) { + for (wtf_size_t i = 0; i < kSideIndexCount; i++) { const Length& side = *sides[i]; list->Set(i, InterpolableNumber::Create( side.IsFixed() ? side.Pixels() / zoom : side.Percent())); @@ -205,7 +205,7 @@ sides[kSideBottom] = slice.Slices().Bottom(); sides[kSideLeft] = slice.Slices().Left(); - for (size_t i = 0; i < kSideIndexCount; i++) { + for (wtf_size_t i = 0; i < kSideIndexCount; i++) { const CSSPrimitiveValue& side = *ToCSSPrimitiveValue(sides[i]); DCHECK(side.IsNumber() || side.IsPercentage()); list->Set(i, InterpolableNumber::Create(side.GetDoubleValue())); @@ -269,7 +269,7 @@ const InterpolableList& list = ToInterpolableList(interpolable_value); const SliceTypes& types = ToCSSImageSliceNonInterpolableValue(non_interpolable_value)->Types(); - const auto& convert_side = [&types, &list, &style](size_t index) { + const auto& convert_side = [&types, &list, &style](wtf_size_t index) { float value = clampTo<float>(ToInterpolableNumber(list.Get(index))->Value(), 0); return types.is_number[index]
diff --git a/third_party/blink/renderer/core/animation/css_length_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_length_list_interpolation_type.cc index dbfcf4af..849c0e9d 100644 --- a/third_party/blink/renderer/core/animation/css_length_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_length_list_interpolation_type.cc
@@ -27,7 +27,7 @@ InterpolationValue CSSLengthListInterpolationType::MaybeConvertNeutral( const InterpolationValue& underlying, ConversionCheckers& conversion_checkers) const { - size_t underlying_length = + wtf_size_t underlying_length = UnderlyingLengthChecker::GetUnderlyingLength(underlying); conversion_checkers.push_back( UnderlyingLengthChecker::Create(underlying_length)); @@ -35,10 +35,11 @@ if (underlying_length == 0) return nullptr; - return ListInterpolationFunctions::CreateList(underlying_length, [](size_t) { - return InterpolationValue( - LengthInterpolationFunctions::CreateNeutralInterpolableValue()); - }); + return ListInterpolationFunctions::CreateList( + underlying_length, [](wtf_size_t) { + return InterpolationValue( + LengthInterpolationFunctions::CreateNeutralInterpolableValue()); + }); } static InterpolationValue MaybeConvertLengthList( @@ -48,7 +49,7 @@ return nullptr; return ListInterpolationFunctions::CreateList( - length_list.size(), [&length_list, zoom](size_t index) { + length_list.size(), [&length_list, zoom](wtf_size_t index) { return LengthInterpolationFunctions::MaybeConvertLength( length_list[index], zoom); }); @@ -116,7 +117,7 @@ const CSSValueList& list = ToCSSValueList(value); return ListInterpolationFunctions::CreateList( - list.length(), [&list](size_t index) { + list.length(), [&list](wtf_size_t index) { return LengthInterpolationFunctions::MaybeConvertCSSValue( list.Item(index)); }); @@ -160,13 +161,13 @@ StyleResolverState& state) const { const InterpolableList& interpolable_list = ToInterpolableList(interpolable_value); - const size_t length = interpolable_list.length(); + const wtf_size_t length = interpolable_list.length(); DCHECK_GT(length, 0U); const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*non_interpolable_value); DCHECK_EQ(non_interpolable_list.length(), length); Vector<Length> result(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { result[i] = LengthInterpolationFunctions::CreateLength( *interpolable_list.Get(i), non_interpolable_list.Get(i), state.CssToLengthConversionData(), value_range_);
diff --git a/third_party/blink/renderer/core/animation/css_position_axis_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_position_axis_list_interpolation_type.cc index 96497880..0d2a49a 100644 --- a/third_party/blink/renderer/core/animation/css_position_axis_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_position_axis_list_interpolation_type.cc
@@ -58,7 +58,7 @@ const CSSValueList& list = ToCSSValueList(value); return ListInterpolationFunctions::CreateList( - list.length(), [&list](size_t index) { + list.length(), [&list](wtf_size_t index) { return ConvertPositionAxisCSSValue(list.Item(index)); }); }
diff --git a/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc index b1e5a4e..d5fa97b7 100644 --- a/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_scale_interpolation_type.cc
@@ -60,7 +60,7 @@ std::unique_ptr<InterpolableValue> CreateScaleIdentity() { std::unique_ptr<InterpolableList> list = InterpolableList::Create(3); - for (size_t i = 0; i < 3; i++) + for (wtf_size_t i = 0; i < 3; i++) list->Set(i, InterpolableNumber::Create(1)); return std::move(list); } @@ -141,7 +141,7 @@ } std::unique_ptr<InterpolableList> list = InterpolableList::Create(3); - for (size_t i = 0; i < 3; i++) + for (wtf_size_t i = 0; i < 3; i++) list->Set(i, InterpolableNumber::Create(array[i])); return InterpolationValue(std::move(list), CSSScaleNonInterpolableValue::Create(*this)); @@ -178,7 +178,7 @@ DCHECK(list.length() >= 1 && list.length() <= 3); Scale scale(1, 1, 1); - for (size_t i = 0; i < list.length(); i++) { + for (wtf_size_t i = 0; i < list.length(); i++) { const CSSValue& item = list.Item(i); scale.array[i] = ToCSSPrimitiveValue(item).GetDoubleValue(); } @@ -194,9 +194,10 @@ PairwiseInterpolationValue CSSScaleInterpolationType::MaybeMergeSingles( InterpolationValue&& start, InterpolationValue&& end) const { - size_t start_list_length = + wtf_size_t start_list_length = ToInterpolableList(*start.interpolable_value).length(); - size_t end_list_length = ToInterpolableList(*end.interpolable_value).length(); + wtf_size_t end_list_length = + ToInterpolableList(*end.interpolable_value).length(); if (start_list_length < end_list_length) start.interpolable_value = CreateScaleIdentity(); else if (end_list_length < start_list_length) @@ -233,7 +234,7 @@ InterpolableList& underlying_list = ToInterpolableList( *underlying_value_owner.MutableValue().interpolable_value); - for (size_t i = 0; i < 3; i++) { + for (wtf_size_t i = 0; i < 3; i++) { InterpolableNumber& underlying = ToInterpolableNumber(*underlying_list.GetMutable(i));
diff --git a/third_party/blink/renderer/core/animation/css_shadow_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_shadow_list_interpolation_type.cc index 1a060ef..7b032116 100644 --- a/third_party/blink/renderer/core/animation/css_shadow_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_shadow_list_interpolation_type.cc
@@ -42,7 +42,7 @@ return CreateNeutralValue(); const ShadowDataVector& shadows = shadow_list->Shadows(); return ListInterpolationFunctions::CreateList( - shadows.size(), [&shadows, zoom](size_t index) { + shadows.size(), [&shadows, zoom](wtf_size_t index) { return ShadowInterpolationFunctions::ConvertShadowData(shadows[index], zoom); }); @@ -121,7 +121,7 @@ const CSSValueList& value_list = ToCSSValueList(value); return ListInterpolationFunctions::CreateList( - value_list.length(), [&value_list](size_t index) { + value_list.length(), [&value_list](wtf_size_t index) { return ShadowInterpolationFunctions::MaybeConvertCSSValue( value_list.Item(index)); }); @@ -162,13 +162,13 @@ const StyleResolverState& state) { const InterpolableList& interpolable_list = ToInterpolableList(interpolable_value); - size_t length = interpolable_list.length(); + wtf_size_t length = interpolable_list.length(); if (length == 0) return nullptr; const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*non_interpolable_value); ShadowDataVector shadows; - for (size_t i = 0; i < length; i++) + for (wtf_size_t i = 0; i < length; i++) shadows.push_back(ShadowInterpolationFunctions::CreateShadowData( *interpolable_list.Get(i), non_interpolable_list.Get(i), state)); return ShadowList::Adopt(shadows);
diff --git a/third_party/blink/renderer/core/animation/css_size_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_size_list_interpolation_type.cc index 04dfbbb..8fb1c798 100644 --- a/third_party/blink/renderer/core/animation/css_size_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_size_list_interpolation_type.cc
@@ -35,10 +35,10 @@ const InterpolationValue& underlying) const final { const auto& underlying_list = ToNonInterpolableList(*underlying.non_interpolable_value); - size_t underlying_length = underlying_list.length(); + wtf_size_t underlying_length = underlying_list.length(); if (underlying_length != underlying_list_->length()) return false; - for (size_t i = 0; i < underlying_length; i++) { + for (wtf_size_t i = 0; i < underlying_length; i++) { bool compatible = SizeInterpolationFunctions::NonInterpolableValuesAreCompatible( underlying_list.Get(i), underlying_list_->Get(i)); @@ -83,7 +83,7 @@ // cover keywords. return ListInterpolationFunctions::CreateList( size_list.size() * 2, - [&size_list, zoom](size_t index) -> InterpolationValue { + [&size_list, zoom](wtf_size_t index) -> InterpolationValue { bool convert_width = index % 2 == 0; return SizeInterpolationFunctions::ConvertFillSizeSide( size_list[index / 2], zoom, convert_width); @@ -105,7 +105,7 @@ // Flatten pairs of width/height into individual items, even for contain and // cover keywords. return ListInterpolationFunctions::CreateList( - list->length() * 2, [list](size_t index) -> InterpolationValue { + list->length() * 2, [list](wtf_size_t index) -> InterpolationValue { const CSSValue& css_size = list->Item(index / 2); bool convert_width = index % 2 == 0; return SizeInterpolationFunctions::MaybeConvertCSSSizeSide( @@ -121,7 +121,7 @@ conversion_checkers.push_back( UnderlyingSizeListChecker::Create(underlying_list)); return ListInterpolationFunctions::CreateList( - underlying_list.length(), [&underlying_list](size_t index) { + underlying_list.length(), [&underlying_list](wtf_size_t index) { return SizeInterpolationFunctions::CreateNeutralValue( underlying_list.Get(index)); }); @@ -188,12 +188,12 @@ const auto& interpolable_list = ToInterpolableList(interpolable_value); const auto& non_interpolable_list = ToNonInterpolableList(*non_interpolable_value); - size_t length = interpolable_list.length(); + wtf_size_t length = interpolable_list.length(); DCHECK_EQ(length, non_interpolable_list.length()); DCHECK_EQ(length % 2, 0ul); - size_t size_list_length = length / 2; + wtf_size_t size_list_length = length / 2; SizeList size_list(size_list_length); - for (size_t i = 0; i < size_list_length; i++) { + for (wtf_size_t i = 0; i < size_list_length; i++) { size_list[i] = SizeInterpolationFunctions::CreateFillSize( *interpolable_list.Get(i * 2), non_interpolable_list.Get(i * 2), *interpolable_list.Get(i * 2 + 1), non_interpolable_list.Get(i * 2 + 1),
diff --git a/third_party/blink/renderer/core/animation/css_transform_origin_interpolation_type.h b/third_party/blink/renderer/core/animation/css_transform_origin_interpolation_type.h index 36da6e38..0ab0b22 100644 --- a/third_party/blink/renderer/core/animation/css_transform_origin_interpolation_type.h +++ b/third_party/blink/renderer/core/animation/css_transform_origin_interpolation_type.h
@@ -26,7 +26,7 @@ const CSSValueList& list = ToCSSValueList(value); DCHECK_EQ(list.length(), 3U); return ListInterpolationFunctions::CreateList( - list.length(), [&list](size_t index) { + list.length(), [&list](wtf_size_t index) { const CSSValue& item = list.Item(index); if (index < 2) return CSSPositionAxisListInterpolationType::
diff --git a/third_party/blink/renderer/core/animation/css_translate_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_translate_interpolation_type.cc index 6bf8ed9..fb731e6 100644 --- a/third_party/blink/renderer/core/animation/css_translate_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_translate_interpolation_type.cc
@@ -134,7 +134,7 @@ std::unique_ptr<InterpolableList> result = InterpolableList::Create(kTranslateComponentIndexCount); - for (size_t i = 0; i < kTranslateComponentIndexCount; i++) { + for (wtf_size_t i = 0; i < kTranslateComponentIndexCount; i++) { InterpolationValue component = nullptr; if (i < list.length()) { component =
diff --git a/third_party/blink/renderer/core/animation/document_animations.cc b/third_party/blink/renderer/core/animation/document_animations.cc index 5c05200..20d902f 100644 --- a/third_party/blink/renderer/core/animation/document_animations.cc +++ b/third_party/blink/renderer/core/animation/document_animations.cc
@@ -80,7 +80,7 @@ if (document.View()) { if (CompositorAnimationHost* host = document.View()->GetCompositorAnimationHost()) { - int total_animations_count = 0; + wtf_size_t total_animations_count = 0; if (document.Timeline().HasAnimations()) { total_animations_count = document.Timeline().PendingAnimationsCount(); }
diff --git a/third_party/blink/renderer/core/animation/document_timeline.h b/third_party/blink/renderer/core/animation/document_timeline.h index ebcff58..853446e 100644 --- a/third_party/blink/renderer/core/animation/document_timeline.h +++ b/third_party/blink/renderer/core/animation/document_timeline.h
@@ -92,7 +92,7 @@ bool HasPendingUpdates() const { return !animations_needing_update_.IsEmpty(); } - size_t PendingAnimationsCount() const { + wtf_size_t PendingAnimationsCount() const { return animations_needing_update_.size(); } TimeTicks ZeroTime();
diff --git a/third_party/blink/renderer/core/animation/effect_input.cc b/third_party/blink/renderer/core/animation/effect_input.cc index b45f3b1d..d118b52 100644 --- a/third_party/blink/renderer/core/animation/effect_input.cc +++ b/third_party/blink/renderer/core/animation/effect_input.cc
@@ -149,7 +149,7 @@ PropertyHandleSet properties_with_offset_0; PropertyHandleSet properties_with_offset_1; - for (size_t i = 0; i < keyframes.size(); i++) { + for (wtf_size_t i = 0; i < keyframes.size(); i++) { for (const PropertyHandle& property : keyframes[i]->Properties()) { if (!property.IsCSSProperty()) continue; @@ -507,9 +507,9 @@ // Now create a keyframe (or retrieve and augment an existing one) for each // value this property maps to. As explained above, this loop performs both // the initial creation and merging mentioned in the spec. - size_t num_keyframes = values.size(); + wtf_size_t num_keyframes = values.size(); ExecutionContext* execution_context = ExecutionContext::From(script_state); - for (size_t i = 0; i < num_keyframes; ++i) { + for (wtf_size_t i = 0; i < num_keyframes; ++i) { // As all offsets are null for these 'property keyframes', the computed // offset is just the fractional position of each keyframe in the array. // @@ -547,7 +547,7 @@ // being > 1 before we throw due to the offsets not being loosely ordered. StringKeyframeVector results; double previous_offset = 0.0; - for (size_t i = 0; i < keys.size(); i++) { + for (wtf_size_t i = 0; i < keys.size(); i++) { auto* keyframe = keyframes.at(keys[i]); if (i < offsets.size()) { @@ -624,7 +624,7 @@ // for easing property of the AnimationEffectTimingReadOnly interface, and if // any of the values fail to parse, throw a TypeError and abort this // procedure. - for (size_t i = results.size(); i < easings.size(); i++) { + for (wtf_size_t i = results.size(); i < easings.size(); i++) { scoped_refptr<TimingFunction> timing_function = AnimationInputHelpers::ParseTimingFunction(easings[i], &document, exception_state);
diff --git a/third_party/blink/renderer/core/animation/effect_stack.cc b/third_party/blink/renderer/core/animation/effect_stack.cc index 84b04e0..8f8d8b4e 100644 --- a/third_party/blink/renderer/core/animation/effect_stack.cc +++ b/third_party/blink/renderer/core/animation/effect_stack.cc
@@ -143,7 +143,7 @@ void EffectStack::RemoveRedundantSampledEffects() { HashSet<PropertyHandle> replaced_properties; - for (size_t i = sampled_effects_.size(); i--;) { + for (wtf_size_t i = sampled_effects_.size(); i--;) { SampledEffect& sampled_effect = *sampled_effects_[i]; if (sampled_effect.WillNeverChange()) { sampled_effect.RemoveReplacedInterpolations(replaced_properties); @@ -151,7 +151,7 @@ } } - size_t new_size = 0; + wtf_size_t new_size = 0; for (auto& sampled_effect : sampled_effects_) { if (!sampled_effect->Interpolations().IsEmpty()) sampled_effects_[new_size++].Swap(sampled_effect);
diff --git a/third_party/blink/renderer/core/animation/image_list_property_functions.h b/third_party/blink/renderer/core/animation/image_list_property_functions.h index 4763370b..bef273e3 100644 --- a/third_party/blink/renderer/core/animation/image_list_property_functions.h +++ b/third_party/blink/renderer/core/animation/image_list_property_functions.h
@@ -59,7 +59,7 @@ } FillLayer* prev = nullptr; - for (size_t i = 0; i < image_list.size(); i++) { + for (wtf_size_t i = 0; i < image_list.size(); i++) { if (!fill_layer) fill_layer = prev->EnsureNext(); fill_layer->SetImage(image_list[i]);
diff --git a/third_party/blink/renderer/core/animation/interpolable_value.cc b/third_party/blink/renderer/core/animation/interpolable_value.cc index 51e11334..56cd711 100644 --- a/third_party/blink/renderer/core/animation/interpolable_value.cc +++ b/third_party/blink/renderer/core/animation/interpolable_value.cc
@@ -16,7 +16,7 @@ const InterpolableList& other_list = ToInterpolableList(other); if (length() != other_list.length()) return false; - for (size_t i = 0; i < length(); i++) { + for (wtf_size_t i = 0; i < length(); i++) { if (!values_[i]->Equals(*other_list.values_[i])) return false; } @@ -47,7 +47,7 @@ DCHECK_EQ(to_list.length(), length()); DCHECK_EQ(result_list.length(), length()); - for (size_t i = 0; i < length(); i++) { + for (wtf_size_t i = 0; i < length(); i++) { DCHECK(values_[i]); DCHECK(to_list.values_[i]); values_[i]->Interpolate(*(to_list.values_[i]), progress, @@ -57,7 +57,7 @@ std::unique_ptr<InterpolableValue> InterpolableList::CloneAndZero() const { std::unique_ptr<InterpolableList> result = InterpolableList::Create(length()); - for (size_t i = 0; i < length(); i++) + for (wtf_size_t i = 0; i < length(); i++) result->Set(i, values_[i]->CloneAndZero()); return std::move(result); } @@ -67,7 +67,7 @@ } void InterpolableList::Scale(double scale) { - for (size_t i = 0; i < length(); i++) + for (wtf_size_t i = 0; i < length(); i++) values_[i]->Scale(scale); } @@ -80,7 +80,7 @@ const InterpolableValue& other) { const InterpolableList& other_list = ToInterpolableList(other); DCHECK_EQ(other_list.length(), length()); - for (size_t i = 0; i < length(); i++) + for (wtf_size_t i = 0; i < length(); i++) values_[i]->ScaleAndAdd(scale, *other_list.values_[i]); }
diff --git a/third_party/blink/renderer/core/animation/interpolable_value.h b/third_party/blink/renderer/core/animation/interpolable_value.h index 7c5811f..71b0dd8 100644 --- a/third_party/blink/renderer/core/animation/interpolable_value.h +++ b/third_party/blink/renderer/core/animation/interpolable_value.h
@@ -94,21 +94,21 @@ return base::WrapUnique(new InterpolableList(other)); } - static std::unique_ptr<InterpolableList> Create(size_t size) { + static std::unique_ptr<InterpolableList> Create(wtf_size_t size) { return base::WrapUnique(new InterpolableList(size)); } bool IsList() const final { return true; } - void Set(size_t position, std::unique_ptr<InterpolableValue> value) { + void Set(wtf_size_t position, std::unique_ptr<InterpolableValue> value) { values_[position] = std::move(value); } - const InterpolableValue* Get(size_t position) const { + const InterpolableValue* Get(wtf_size_t position) const { return values_[position].get(); } - std::unique_ptr<InterpolableValue>& GetMutable(size_t position) { + std::unique_ptr<InterpolableValue>& GetMutable(wtf_size_t position) { return values_[position]; } - size_t length() const { return values_.size(); } + wtf_size_t length() const { return values_.size(); } bool Equals(const InterpolableValue& other) const final; std::unique_ptr<InterpolableValue> Clone() const final { return Create(*this); @@ -121,10 +121,10 @@ void Interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const final; - explicit InterpolableList(size_t size) : values_(size) {} + explicit InterpolableList(wtf_size_t size) : values_(size) {} InterpolableList(const InterpolableList& other) : values_(other.length()) { - for (size_t i = 0; i < length(); i++) + for (wtf_size_t i = 0; i < length(); i++) Set(i, other.values_[i]->Clone()); }
diff --git a/third_party/blink/renderer/core/animation/interpolated_svg_path_source.h b/third_party/blink/renderer/core/animation/interpolated_svg_path_source.h index 9fac24f..e7cdaf71 100644 --- a/third_party/blink/renderer/core/animation/interpolated_svg_path_source.h +++ b/third_party/blink/renderer/core/animation/interpolated_svg_path_source.h
@@ -29,7 +29,7 @@ private: PathCoordinates current_coordinates_; - size_t current_index_; + wtf_size_t current_index_; const InterpolableList& interpolable_path_segs_; const Vector<SVGPathSegType>& path_seg_types_; DISALLOW_COPY_AND_ASSIGN(InterpolatedSVGPathSource);
diff --git a/third_party/blink/renderer/core/animation/interpolation_effect.cc b/third_party/blink/renderer/core/animation/interpolation_effect.cc index 7f42c27..7a6e8ae 100644 --- a/third_party/blink/renderer/core/animation/interpolation_effect.cc +++ b/third_party/blink/renderer/core/animation/interpolation_effect.cc
@@ -12,8 +12,8 @@ double fraction, double iteration_duration, HeapVector<Member<Interpolation>>& result) const { - size_t existing_size = result.size(); - size_t result_index = 0; + wtf_size_t existing_size = result.size(); + wtf_size_t result_index = 0; for (const auto& record : interpolations_) { if (fraction >= record->apply_from_ && fraction < record->apply_to_) {
diff --git a/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc b/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc index 29d865a..8d7bac4 100644 --- a/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc +++ b/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc
@@ -83,7 +83,7 @@ void InvalidatableInterpolation::AddConversionCheckers( const InterpolationType& type, ConversionCheckers& conversion_checkers) const { - for (size_t i = 0; i < conversion_checkers.size(); i++) { + for (wtf_size_t i = 0; i < conversion_checkers.size(); i++) { conversion_checkers[i]->SetType(type); conversion_checkers_.push_back(std::move(conversion_checkers[i])); } @@ -227,7 +227,7 @@ const ActiveInterpolations& interpolations, InterpolationEnvironment& environment) { DCHECK(!interpolations.IsEmpty()); - size_t starting_index = 0; + wtf_size_t starting_index = 0; // Compute the underlying value to composite onto. UnderlyingValueOwner underlying_value_owner; @@ -257,7 +257,7 @@ // Composite interpolations onto the underlying value. bool should_apply = false; - for (size_t i = starting_index; i < interpolations.size(); i++) { + for (wtf_size_t i = starting_index; i < interpolations.size(); i++) { const InvalidatableInterpolation& current_interpolation = ToInvalidatableInterpolation(*interpolations.at(i)); DCHECK(current_interpolation.DependsOnUnderlyingValue());
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc index 65f3c66..b62eb6c9 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -164,7 +164,7 @@ KeyframeEffectModelBase::GetComputedOffsets(keyframes); computed_keyframes.ReserveInitialCapacity(keyframes.size()); ScriptState::Scope scope(script_state); - for (size_t i = 0; i < keyframes.size(); i++) { + for (wtf_size_t i = 0; i < keyframes.size(); i++) { V8ObjectBuilder object_builder(script_state); keyframes[i]->AddKeyframePropertiesToV8Object(object_builder); object_builder.Add("computedOffset", computed_offsets[i]);
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc index bcd09786..52ce4b6 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
@@ -194,12 +194,12 @@ result.front() = 0; } - size_t last_index = 0; + wtf_size_t last_index = 0; last_offset = result.front(); - for (size_t i = 1; i < result.size(); ++i) { + for (wtf_size_t i = 1; i < result.size(); ++i) { double offset = result[i]; if (!std::isnan(offset)) { - for (size_t j = 1; j < i - last_index; ++j) { + for (wtf_size_t j = 1; j < i - last_index; ++j) { result[last_index + j] = last_offset + (offset - last_offset) * j / (i - last_index); } @@ -238,7 +238,7 @@ scoped_refptr<TimingFunction> zero_offset_easing = default_keyframe_easing_; Vector<double> computed_offsets = GetComputedOffsets(keyframes_); DCHECK_EQ(computed_offsets.size(), keyframes_.size()); - for (size_t i = 0; i < keyframes_.size(); i++) { + for (wtf_size_t i = 0; i < keyframes_.size(); i++) { double computed_offset = computed_offsets[i]; const auto& keyframe = keyframes_[i]; @@ -277,9 +277,9 @@ for (const auto& entry : *keyframe_groups_) { const PropertySpecificKeyframeVector& keyframes = entry.value->Keyframes(); - for (size_t i = 0; i < keyframes.size() - 1; i++) { - size_t start_index = i; - size_t end_index = i + 1; + for (wtf_size_t i = 0; i < keyframes.size() - 1; i++) { + wtf_size_t start_index = i; + wtf_size_t end_index = i + 1; double start_offset = keyframes[start_index]->Offset(); double end_offset = keyframes[end_index]->Offset(); double apply_from = start_offset;
diff --git a/third_party/blink/renderer/core/animation/length_interpolation_functions.cc b/third_party/blink/renderer/core/animation/length_interpolation_functions.cc index 33cee09..0f53dc8 100644 --- a/third_party/blink/renderer/core/animation/length_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/length_interpolation_functions.cc
@@ -69,7 +69,7 @@ LengthInterpolationFunctions::CreateNeutralInterpolableValue() { const size_t kLength = CSSPrimitiveValue::kLengthUnitTypeCount; std::unique_ptr<InterpolableList> values = InterpolableList::Create(kLength); - for (size_t i = 0; i < kLength; i++) + for (wtf_size_t i = 0; i < kLength; i++) values->Set(i, InterpolableNumber::Create(0)); return values; } @@ -89,7 +89,7 @@ std::unique_ptr<InterpolableList> values = InterpolableList::Create(CSSPrimitiveValue::kLengthUnitTypeCount); - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) values->Set(i, InterpolableNumber::Create(length_array.values[i])); bool has_percentage = @@ -148,7 +148,7 @@ void LengthInterpolationFunctions::SubtractFromOneHundredPercent( InterpolationValue& result) { InterpolableList& list = ToInterpolableList(*result.interpolable_value); - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { double value = -ToInterpolableNumber(*list.Get(i)).Value(); if (i == CSSPrimitiveValue::kUnitTypePercentage) value += 100; @@ -177,7 +177,7 @@ CSSLengthNonInterpolableValue::HasPercentage(non_interpolable_value); double pixels = 0; double percentage = 0; - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { double value = ToInterpolableNumber(*interpolable_list.Get(i)).Value(); if (value == 0) continue; @@ -212,7 +212,7 @@ CSSCalcExpressionNode* root_node = nullptr; CSSPrimitiveValue* first_value = nullptr; - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { double value = ToInterpolableNumber(*interpolable_list.Get(i)).Value(); if (value == 0 && (i != CSSPrimitiveValue::kUnitTypePercentage || !has_percentage)) {
diff --git a/third_party/blink/renderer/core/animation/length_list_property_functions.cc b/third_party/blink/renderer/core/animation/length_list_property_functions.cc index 537d1d5..10b57c6 100644 --- a/third_party/blink/renderer/core/animation/length_list_property_functions.cc +++ b/third_party/blink/renderer/core/animation/length_list_property_functions.cc
@@ -248,7 +248,7 @@ FillLayer* fill_layer = AccessFillLayerForPosition(property, style); FillLayer* prev = nullptr; FillLayerMethods fill_layer_methods(property); - for (size_t i = 0; i < length_list.size(); i++) { + for (wtf_size_t i = 0; i < length_list.size(); i++) { if (!fill_layer) fill_layer = prev->EnsureNext(); (fill_layer->*fill_layer_methods.set_length)(length_list[i]);
diff --git a/third_party/blink/renderer/core/animation/length_units_checker.h b/third_party/blink/renderer/core/animation/length_units_checker.h index b20925f..acb3d8b1 100644 --- a/third_party/blink/renderer/core/animation/length_units_checker.h +++ b/third_party/blink/renderer/core/animation/length_units_checker.h
@@ -21,8 +21,8 @@ CSSLengthArray&& length_array, const StyleResolverState& state) { bool create = false; - size_t last_index = 0; - for (size_t i = 0; i < length_array.values.size(); i++) { + wtf_size_t last_index = 0; + for (wtf_size_t i = 0; i < length_array.values.size(); i++) { if (i == CSSPrimitiveValue::kUnitTypePercentage || !length_array.type_flags.Get(i)) continue; @@ -38,7 +38,7 @@ bool IsValid(const StyleResolverState& state, const InterpolationValue& underlying) const final { - for (size_t i = 0; i <= last_index_; i++) { + for (wtf_size_t i = 0; i <= last_index_; i++) { if (i == CSSPrimitiveValue::kUnitTypePercentage || !length_array_.type_flags.Get(i)) continue; @@ -49,7 +49,7 @@ return true; } - static double LengthUnit(size_t length_unit_type, + static double LengthUnit(wtf_size_t length_unit_type, const CSSToLengthConversionData& conversion_data) { return conversion_data.ZoomedComputedPixels( 1, @@ -59,11 +59,11 @@ private: LengthUnitsChecker(CSSPrimitiveValue::CSSLengthArray&& length_array, - size_t last_index) + wtf_size_t last_index) : length_array_(std::move(length_array)), last_index_(last_index) {} const CSSLengthArray length_array_; - const size_t last_index_; + const wtf_size_t last_index_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/list_interpolation_functions.cc b/third_party/blink/renderer/core/animation/list_interpolation_functions.cc index 5985398..52d0b76 100644 --- a/third_party/blink/renderer/core/animation/list_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/list_interpolation_functions.cc
@@ -14,7 +14,7 @@ DEFINE_NON_INTERPOLABLE_VALUE_TYPE(NonInterpolableList); -const size_t kRepeatableListMaxLength = 1000; +const wtf_size_t kRepeatableListMaxLength = 1000; bool ListInterpolationFunctions::EqualValues( const InterpolationValue& a, @@ -34,7 +34,7 @@ if (interpolable_list_a.length() != interpolable_list_b.length()) return false; - size_t length = interpolable_list_a.length(); + wtf_size_t length = interpolable_list_a.length(); if (length == 0) return true; @@ -43,7 +43,7 @@ const NonInterpolableList& non_interpolable_list_b = ToNonInterpolableList(*b.non_interpolable_value); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { if (!equal_non_interpolable_values(non_interpolable_list_a.Get(i), non_interpolable_list_b.Get(i))) return false; @@ -51,10 +51,11 @@ return true; } -static size_t MatchLengths(size_t start_length, - size_t end_length, - ListInterpolationFunctions::LengthMatchingStrategy - length_matching_strategy) { +static wtf_size_t MatchLengths( + wtf_size_t start_length, + wtf_size_t end_length, + ListInterpolationFunctions::LengthMatchingStrategy + length_matching_strategy) { if (length_matching_strategy == ListInterpolationFunctions::LengthMatchingStrategy:: kLowestCommonMultiple) { @@ -65,7 +66,8 @@ // up users' systems with memory consumption in the event that this occurs. // See crbug.com/739197 for more context. return std::min(kRepeatableListMaxLength, - lowestCommonMultiple(start_length, end_length)); + static_cast<wtf_size_t>( + lowestCommonMultiple(start_length, end_length))); } DCHECK_EQ(length_matching_strategy, ListInterpolationFunctions::LengthMatchingStrategy::kPadToLargest); @@ -77,9 +79,9 @@ InterpolationValue&& end, LengthMatchingStrategy length_matching_strategy, MergeSingleItemConversionsCallback merge_single_item_conversions) { - const size_t start_length = + const wtf_size_t start_length = ToInterpolableList(*start.interpolable_value).length(); - const size_t end_length = + const wtf_size_t end_length = ToInterpolableList(*end.interpolable_value).length(); if (start_length == 0 && end_length == 0) { @@ -104,7 +106,7 @@ std::move(start.non_interpolable_value)); } - const size_t final_length = + const wtf_size_t final_length = MatchLengths(start_length, end_length, length_matching_strategy); std::unique_ptr<InterpolableList> result_start_interpolable_list = InterpolableList::Create(final_length); @@ -122,7 +124,7 @@ NonInterpolableList& end_non_interpolable_list = ToNonInterpolableList(*end.non_interpolable_value); - for (size_t i = 0; i < final_length; i++) { + for (wtf_size_t i = 0; i < final_length; i++) { PairwiseInterpolationValue result = nullptr; if (length_matching_strategy == LengthMatchingStrategy::kLowestCommonMultiple || @@ -168,12 +170,12 @@ NonInterpolableList::Create(std::move(result_non_interpolable_values))); } -static void RepeatToLength(InterpolationValue& value, size_t length) { +static void RepeatToLength(InterpolationValue& value, wtf_size_t length) { InterpolableList& interpolable_list = ToInterpolableList(*value.interpolable_value); NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*value.non_interpolable_value); - size_t current_length = interpolable_list.length(); + wtf_size_t current_length = interpolable_list.length(); DCHECK_GT(current_length, 0U); if (current_length == length) return; @@ -182,7 +184,7 @@ InterpolableList::Create(length); Vector<scoped_refptr<NonInterpolableValue>> new_non_interpolable_values( length); - for (size_t i = length; i-- > 0;) { + for (wtf_size_t i = length; i-- > 0;) { new_interpolable_list->Set( i, i < current_length ? std::move(interpolable_list.GetMutable(i)) @@ -203,18 +205,18 @@ ToInterpolableList(*value.interpolable_value); NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*value.non_interpolable_value); - const size_t current_length = interpolable_list.length(); + const wtf_size_t current_length = interpolable_list.length(); InterpolableList& target_interpolable_list = ToInterpolableList(*length_value.interpolable_value); NonInterpolableList& target_non_interpolable_list = ToNonInterpolableList(*length_value.non_interpolable_value); - const size_t target_length = target_interpolable_list.length(); + const wtf_size_t target_length = target_interpolable_list.length(); DCHECK_LT(current_length, target_length); std::unique_ptr<InterpolableList> new_interpolable_list = InterpolableList::Create(target_length); Vector<scoped_refptr<NonInterpolableValue>> new_non_interpolable_values( target_length); - size_t index = 0; + wtf_size_t index = 0; for (; index < current_length; index++) { new_interpolable_list->Set(index, std::move(interpolable_list.GetMutable(index))); @@ -234,11 +236,11 @@ static bool NonInterpolableListsAreCompatible( const NonInterpolableList& a, const NonInterpolableList& b, - size_t length, + wtf_size_t length, ListInterpolationFunctions::LengthMatchingStrategy length_matching_strategy, ListInterpolationFunctions::NonInterpolableValuesAreCompatibleCallback non_interpolable_values_are_compatible) { - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { if (length_matching_strategy == ListInterpolationFunctions::LengthMatchingStrategy:: kLowestCommonMultiple || @@ -261,7 +263,7 @@ NonInterpolableValuesAreCompatibleCallback non_interpolable_values_are_compatible, CompositeItemCallback composite_item) { - const size_t underlying_length = + const wtf_size_t underlying_length = ToInterpolableList(*underlying_value_owner.Value().interpolable_value) .length(); if (underlying_length == 0) { @@ -272,7 +274,7 @@ const InterpolableList& interpolable_list = ToInterpolableList(*value.interpolable_value); - const size_t value_length = interpolable_list.length(); + const wtf_size_t value_length = interpolable_list.length(); if (value_length == 0) { DCHECK(!value.non_interpolable_value); underlying_value_owner.MutableValue().interpolable_value->Scale( @@ -282,7 +284,7 @@ const NonInterpolableList& non_interpolable_list = ToNonInterpolableList(*value.non_interpolable_value); - const size_t final_length = + const wtf_size_t final_length = MatchLengths(underlying_length, value_length, length_matching_strategy); if (!NonInterpolableListsAreCompatible( ToNonInterpolableList( @@ -304,7 +306,7 @@ NonInterpolableList& underlying_non_interpolable_list = ToNonInterpolableList(*underlying_value.non_interpolable_value); - for (size_t i = 0; i < final_length; i++) { + for (wtf_size_t i = 0; i < final_length; i++) { composite_item.Run(underlying_interpolable_list.GetMutable(i), underlying_non_interpolable_list.GetMutable(i), underlying_fraction, @@ -322,13 +324,13 @@ NonInterpolableList& underlying_non_interpolable_list = ToNonInterpolableList(*underlying_value.non_interpolable_value); - for (size_t i = 0; i < value_length; i++) { + for (wtf_size_t i = 0; i < value_length; i++) { composite_item.Run(underlying_interpolable_list.GetMutable(i), underlying_non_interpolable_list.GetMutable(i), underlying_fraction, *interpolable_list.Get(i), non_interpolable_list.Get(i)); } - for (size_t i = value_length; i < final_length; i++) { + for (wtf_size_t i = value_length; i < final_length; i++) { underlying_interpolable_list.GetMutable(i)->Scale(underlying_fraction); } }
diff --git a/third_party/blink/renderer/core/animation/list_interpolation_functions.h b/third_party/blink/renderer/core/animation/list_interpolation_functions.h index 72161040..deec30b6 100644 --- a/third_party/blink/renderer/core/animation/list_interpolation_functions.h +++ b/third_party/blink/renderer/core/animation/list_interpolation_functions.h
@@ -18,7 +18,7 @@ class ListInterpolationFunctions { public: template <typename CreateItemCallback> - static InterpolationValue CreateList(size_t length, CreateItemCallback); + static InterpolationValue CreateList(wtf_size_t length, CreateItemCallback); static InterpolationValue CreateEmptyList() { return InterpolationValue(InterpolableList::Create(0)); } @@ -71,12 +71,12 @@ return base::AdoptRef(new NonInterpolableList(std::move(list))); } - size_t length() const { return list_.size(); } - const NonInterpolableValue* Get(size_t index) const { + wtf_size_t length() const { return list_.size(); } + const NonInterpolableValue* Get(wtf_size_t index) const { return list_[index].get(); } - NonInterpolableValue* Get(size_t index) { return list_[index].get(); } - scoped_refptr<NonInterpolableValue>& GetMutable(size_t index) { + NonInterpolableValue* Get(wtf_size_t index) { return list_[index].get(); } + scoped_refptr<NonInterpolableValue>& GetMutable(wtf_size_t index) { return list_[index]; } @@ -94,14 +94,14 @@ template <typename CreateItemCallback> InterpolationValue ListInterpolationFunctions::CreateList( - size_t length, + wtf_size_t length, CreateItemCallback create_item) { if (length == 0) return CreateEmptyList(); std::unique_ptr<InterpolableList> interpolable_list = InterpolableList::Create(length); Vector<scoped_refptr<NonInterpolableValue>> non_interpolable_values(length); - for (size_t i = 0; i < length; i++) { + for (wtf_size_t i = 0; i < length; i++) { InterpolationValue item = create_item(i); if (!item) return nullptr;
diff --git a/third_party/blink/renderer/core/animation/path_interpolation_functions.cc b/third_party/blink/renderer/core/animation/path_interpolation_functions.cc index c112aca..1b8bace 100644 --- a/third_party/blink/renderer/core/animation/path_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/path_interpolation_functions.cc
@@ -53,7 +53,7 @@ const SVGPathByteStream& byte_stream, CoordinateConversion coordinateConversion) { SVGPathByteStreamSource path_source(byte_stream); - size_t length = 0; + wtf_size_t length = 0; PathCoordinates current_coordinates; Vector<std::unique_ptr<InterpolableValue>> interpolable_path_segs; Vector<SVGPathSegType> path_seg_types; @@ -72,7 +72,7 @@ std::unique_ptr<InterpolableList> path_args = InterpolableList::Create(length); - for (size_t i = 0; i < interpolable_path_segs.size(); i++) + for (wtf_size_t i = 0; i < interpolable_path_segs.size(); i++) path_args->Set(i, std::move(interpolable_path_segs[i])); std::unique_ptr<InterpolableList> result = @@ -143,7 +143,7 @@ if (a.size() != b.size()) return false; - for (size_t i = 0; i < a.size(); i++) { + for (wtf_size_t i = 0; i < a.size(); i++) { if (ToAbsolutePathSegType(a[i]) != ToAbsolutePathSegType(b[i])) return false; }
diff --git a/third_party/blink/renderer/core/animation/shadow_interpolation_functions.cc b/third_party/blink/renderer/core/animation/shadow_interpolation_functions.cc index 7445eed..81ae5bd8 100644 --- a/third_party/blink/renderer/core/animation/shadow_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/shadow_interpolation_functions.cc
@@ -114,7 +114,7 @@ const CSSPrimitiveValue* lengths[] = { shadow.x.Get(), shadow.y.Get(), shadow.blur.Get(), shadow.spread.Get(), }; - for (size_t i = 0; i < arraysize(lengths); i++) { + for (wtf_size_t i = 0; i < base::size(lengths); i++) { if (lengths[i]) { InterpolationValue length_field = LengthInterpolationFunctions::MaybeConvertCSSValue(*lengths[i]);
diff --git a/third_party/blink/renderer/core/animation/svg_length_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_length_interpolation_type.cc index f5f607c..754e072 100644 --- a/third_party/blink/renderer/core/animation/svg_length_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_length_interpolation_type.cc
@@ -18,7 +18,7 @@ SVGLengthInterpolationType::NeutralInterpolableValue() { std::unique_ptr<InterpolableList> list_of_values = InterpolableList::Create(CSSPrimitiveValue::kLengthUnitTypeCount); - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; ++i) + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; ++i) list_of_values->Set(i, InterpolableNumber::Create(0)); return std::move(list_of_values); @@ -33,7 +33,7 @@ std::unique_ptr<InterpolableList> list_of_values = InterpolableList::Create(CSSPrimitiveValue::kLengthUnitTypeCount); - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; ++i) + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; ++i) list_of_values->Set(i, InterpolableNumber::Create(length_array.values[i])); return InterpolationValue(std::move(list_of_values)); @@ -52,7 +52,7 @@ CSSPrimitiveValue::UnitType::kUserUnits; unsigned unit_type_count = 0; // We optimise for the common case where only one unit type is involved. - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { double entry = ToInterpolableNumber(list_of_values.Get(i))->Value(); if (!entry) continue; @@ -71,7 +71,7 @@ // SVGLength does not support calc expressions, so we convert to canonical // units. - for (size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { + for (wtf_size_t i = 0; i < CSSPrimitiveValue::kLengthUnitTypeCount; i++) { double entry = ToInterpolableNumber(list_of_values.Get(i))->Value(); if (entry) value += length_context.ConvertValueToUserUnits(
diff --git a/third_party/blink/renderer/core/animation/svg_length_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_length_list_interpolation_type.cc index 4fa218a..04751bb 100644 --- a/third_party/blink/renderer/core/animation/svg_length_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_length_list_interpolation_type.cc
@@ -15,7 +15,7 @@ InterpolationValue SVGLengthListInterpolationType::MaybeConvertNeutral( const InterpolationValue& underlying, ConversionCheckers& conversion_checkers) const { - size_t underlying_length = + wtf_size_t underlying_length = UnderlyingLengthChecker::GetUnderlyingLength(underlying); conversion_checkers.push_back( UnderlyingLengthChecker::Create(underlying_length)); @@ -25,7 +25,7 @@ std::unique_ptr<InterpolableList> result = InterpolableList::Create(underlying_length); - for (size_t i = 0; i < underlying_length; i++) + for (wtf_size_t i = 0; i < underlying_length; i++) result->Set(i, SVGLengthInterpolationType::NeutralInterpolableValue()); return InterpolationValue(std::move(result)); } @@ -38,7 +38,7 @@ const SVGLengthList& length_list = ToSVGLengthList(svg_value); std::unique_ptr<InterpolableList> result = InterpolableList::Create(length_list.length()); - for (size_t i = 0; i < length_list.length(); i++) { + for (wtf_size_t i = 0; i < length_list.length(); i++) { InterpolationValue component = SVGLengthInterpolationType::ConvertSVGLength(*length_list.at(i)); result->Set(i, std::move(component.interpolable_value)); @@ -49,8 +49,9 @@ PairwiseInterpolationValue SVGLengthListInterpolationType::MaybeMergeSingles( InterpolationValue&& start, InterpolationValue&& end) const { - size_t start_length = ToInterpolableList(*start.interpolable_value).length(); - size_t end_length = ToInterpolableList(*end.interpolable_value).length(); + wtf_size_t start_length = + ToInterpolableList(*start.interpolable_value).length(); + wtf_size_t end_length = ToInterpolableList(*end.interpolable_value).length(); if (start_length != end_length) return nullptr; return InterpolationType::MaybeMergeSingles(std::move(start), std::move(end)); @@ -61,10 +62,11 @@ double underlying_fraction, const InterpolationValue& value, double interpolation_fraction) const { - size_t start_length = + wtf_size_t start_length = ToInterpolableList(*underlying_value_owner.Value().interpolable_value) .length(); - size_t end_length = ToInterpolableList(*value.interpolable_value).length(); + wtf_size_t end_length = + ToInterpolableList(*value.interpolable_value).length(); if (start_length == end_length) InterpolationType::Composite(underlying_value_owner, underlying_fraction, @@ -90,7 +92,7 @@ SVGLengthList* result = SVGLengthList::Create(unit_mode_); const InterpolableList& list = ToInterpolableList(interpolable_value); - for (size_t i = 0; i < list.length(); i++) { + for (wtf_size_t i = 0; i < list.length(); i++) { result->Append(SVGLengthInterpolationType::ResolveInterpolableSVGLength( *list.Get(i), length_context, unit_mode_, negative_values_forbidden_)); }
diff --git a/third_party/blink/renderer/core/animation/svg_number_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_number_list_interpolation_type.cc index 94ac0f2..c012c16 100644 --- a/third_party/blink/renderer/core/animation/svg_number_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_number_list_interpolation_type.cc
@@ -14,7 +14,7 @@ InterpolationValue SVGNumberListInterpolationType::MaybeConvertNeutral( const InterpolationValue& underlying, ConversionCheckers& conversion_checkers) const { - size_t underlying_length = + wtf_size_t underlying_length = UnderlyingLengthChecker::GetUnderlyingLength(underlying); conversion_checkers.push_back( UnderlyingLengthChecker::Create(underlying_length)); @@ -24,7 +24,7 @@ std::unique_ptr<InterpolableList> result = InterpolableList::Create(underlying_length); - for (size_t i = 0; i < underlying_length; i++) + for (wtf_size_t i = 0; i < underlying_length; i++) result->Set(i, InterpolableNumber::Create(0)); return InterpolationValue(std::move(result)); } @@ -37,7 +37,7 @@ const SVGNumberList& number_list = ToSVGNumberList(svg_value); std::unique_ptr<InterpolableList> result = InterpolableList::Create(number_list.length()); - for (size_t i = 0; i < number_list.length(); i++) + for (wtf_size_t i = 0; i < number_list.length(); i++) result->Set(i, InterpolableNumber::Create(number_list.at(i)->Value())); return InterpolationValue(std::move(result)); } @@ -53,7 +53,7 @@ } static void PadWithZeroes(std::unique_ptr<InterpolableValue>& list_pointer, - size_t padded_length) { + wtf_size_t padded_length) { InterpolableList& list = ToInterpolableList(*list_pointer); if (list.length() >= padded_length) @@ -61,7 +61,7 @@ std::unique_ptr<InterpolableList> result = InterpolableList::Create(padded_length); - size_t i = 0; + wtf_size_t i = 0; for (; i < list.length(); i++) result->Set(i, std::move(list.GetMutable(i))); for (; i < padded_length; i++) @@ -85,7 +85,7 @@ *underlying_value_owner.MutableValue().interpolable_value); DCHECK_GE(underlying_list.length(), list.length()); - size_t i = 0; + wtf_size_t i = 0; for (; i < list.length(); i++) underlying_list.GetMutable(i)->ScaleAndAdd(underlying_fraction, *list.Get(i)); @@ -98,7 +98,7 @@ const NonInterpolableValue*) const { SVGNumberList* result = SVGNumberList::Create(); const InterpolableList& list = ToInterpolableList(interpolable_value); - for (size_t i = 0; i < list.length(); i++) + for (wtf_size_t i = 0; i < list.length(); i++) result->Append( SVGNumber::Create(ToInterpolableNumber(list.Get(i))->Value())); return result;
diff --git a/third_party/blink/renderer/core/animation/svg_point_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_point_list_interpolation_type.cc index 16561ae..a023d14 100644 --- a/third_party/blink/renderer/core/animation/svg_point_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_point_list_interpolation_type.cc
@@ -15,7 +15,7 @@ InterpolationValue SVGPointListInterpolationType::MaybeConvertNeutral( const InterpolationValue& underlying, ConversionCheckers& conversion_checkers) const { - size_t underlying_length = + wtf_size_t underlying_length = UnderlyingLengthChecker::GetUnderlyingLength(underlying); conversion_checkers.push_back( UnderlyingLengthChecker::Create(underlying_length)); @@ -25,7 +25,7 @@ std::unique_ptr<InterpolableList> result = InterpolableList::Create(underlying_length); - for (size_t i = 0; i < underlying_length; i++) + for (wtf_size_t i = 0; i < underlying_length; i++) result->Set(i, InterpolableNumber::Create(0)); return InterpolationValue(std::move(result)); } @@ -38,7 +38,7 @@ const SVGPointList& point_list = ToSVGPointList(svg_value); std::unique_ptr<InterpolableList> result = InterpolableList::Create(point_list.length() * 2); - for (size_t i = 0; i < point_list.length(); i++) { + for (wtf_size_t i = 0; i < point_list.length(); i++) { const SVGPoint& point = *point_list.at(i); result->Set(2 * i, InterpolableNumber::Create(point.X())); result->Set(2 * i + 1, InterpolableNumber::Create(point.Y())); @@ -50,8 +50,9 @@ PairwiseInterpolationValue SVGPointListInterpolationType::MaybeMergeSingles( InterpolationValue&& start, InterpolationValue&& end) const { - size_t start_length = ToInterpolableList(*start.interpolable_value).length(); - size_t end_length = ToInterpolableList(*end.interpolable_value).length(); + wtf_size_t start_length = + ToInterpolableList(*start.interpolable_value).length(); + wtf_size_t end_length = ToInterpolableList(*end.interpolable_value).length(); if (start_length != end_length) return nullptr; @@ -63,10 +64,11 @@ double underlying_fraction, const InterpolationValue& value, double interpolation_fraction) const { - size_t start_length = + wtf_size_t start_length = ToInterpolableList(*underlying_value_owner.Value().interpolable_value) .length(); - size_t end_length = ToInterpolableList(*value.interpolable_value).length(); + wtf_size_t end_length = + ToInterpolableList(*value.interpolable_value).length(); if (start_length == end_length) InterpolationType::Composite(underlying_value_owner, underlying_fraction, value, interpolation_fraction); @@ -81,7 +83,7 @@ const InterpolableList& list = ToInterpolableList(interpolable_value); DCHECK_EQ(list.length() % 2, 0U); - for (size_t i = 0; i < list.length(); i += 2) { + for (wtf_size_t i = 0; i < list.length(); i += 2) { FloatPoint point = FloatPoint(ToInterpolableNumber(list.Get(i))->Value(), ToInterpolableNumber(list.Get(i + 1))->Value());
diff --git a/third_party/blink/renderer/core/animation/svg_rect_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_rect_interpolation_type.cc index 7a56809..d9974df1 100644 --- a/third_party/blink/renderer/core/animation/svg_rect_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_rect_interpolation_type.cc
@@ -24,7 +24,7 @@ ConversionCheckers&) const { std::unique_ptr<InterpolableList> result = InterpolableList::Create(kRectComponentIndexCount); - for (size_t i = 0; i < kRectComponentIndexCount; i++) + for (wtf_size_t i = 0; i < kRectComponentIndexCount; i++) result->Set(i, InterpolableNumber::Create(0)); return InterpolationValue(std::move(result)); }
diff --git a/third_party/blink/renderer/core/animation/svg_transform_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_transform_list_interpolation_type.cc index 356dcb8..2eb432c 100644 --- a/third_party/blink/renderer/core/animation/svg_transform_list_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/svg_transform_list_interpolation_type.cc
@@ -221,7 +221,7 @@ InterpolableList::Create(svg_list.length()); Vector<SVGTransformType> transform_types; - for (size_t i = 0; i < svg_list.length(); i++) { + for (wtf_size_t i = 0; i < svg_list.length(); i++) { const SVGTransform* transform = svg_list.at(i); SVGTransformType transform_type(transform->TransformType()); if (transform_type == kSvgTransformMatrix) { @@ -268,10 +268,10 @@ std::unique_ptr<InterpolableList> interpolable_list = InterpolableList::Create(types.size()); - size_t interpolable_list_index = 0; + wtf_size_t interpolable_list_index = 0; for (auto& part : interpolable_parts) { InterpolableList& list = ToInterpolableList(*part); - for (size_t i = 0; i < list.length(); ++i) { + for (wtf_size_t i = 0; i < list.length(); ++i) { interpolable_list->Set(interpolable_list_index, std::move(list.GetMutable(i))); ++interpolable_list_index; @@ -290,7 +290,7 @@ const Vector<SVGTransformType>& transform_types = ToSVGTransformNonInterpolableValue(non_interpolable_value) ->TransformTypes(); - for (size_t i = 0; i < list.length(); ++i) + for (wtf_size_t i = 0; i < list.length(); ++i) result->Append(FromInterpolableValue(*list.Get(i), transform_types.at(i))); return result; }
diff --git a/third_party/blink/renderer/core/animation/underlying_length_checker.h b/third_party/blink/renderer/core/animation/underlying_length_checker.h index 1306492..bb2925c 100644 --- a/third_party/blink/renderer/core/animation/underlying_length_checker.h +++ b/third_party/blink/renderer/core/animation/underlying_length_checker.h
@@ -16,11 +16,11 @@ class UnderlyingLengthChecker : public InterpolationType::ConversionChecker { public: static std::unique_ptr<UnderlyingLengthChecker> Create( - size_t underlying_length) { + wtf_size_t underlying_length) { return base::WrapUnique(new UnderlyingLengthChecker(underlying_length)); } - static size_t GetUnderlyingLength(const InterpolationValue& underlying) { + static wtf_size_t GetUnderlyingLength(const InterpolationValue& underlying) { if (!underlying) return 0; return ToInterpolableList(*underlying.interpolable_value).length(); @@ -32,10 +32,10 @@ } private: - UnderlyingLengthChecker(size_t underlying_length) + UnderlyingLengthChecker(wtf_size_t underlying_length) : underlying_length_(underlying_length) {} - size_t underlying_length_; + wtf_size_t underlying_length_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index a3db0c7f..f385828 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -132,13 +132,14 @@ "dom/xml_document.idl", "dom/events/custom_event.idl", "dom/events/event.idl", + "dom/events/event_listener.idl", "dom/events/event_target.idl", "trustedtypes/trusted_html.idl", "trustedtypes/trusted_script.idl", "trustedtypes/trusted_script_url.idl", - "trustedtypes/trusted_url.idl", "trustedtypes/trusted_type_policy.idl", "trustedtypes/trusted_type_policy_factory.idl", + "trustedtypes/trusted_url.idl", "editing/selection.idl", "events/animation_event.idl", "events/animation_playback_event.idl", @@ -512,7 +513,6 @@ "dom/non_document_type_child_node.idl", "dom/non_element_parent_node.idl", "dom/parent_node.idl", - "dom/events/event_listener.idl", "events/navigator_events.idl", "fetch/window_fetch.idl", "fetch/worker_fetch.idl",
diff --git a/third_party/blink/renderer/core/css/cssom/inline_style_property_map.cc b/third_party/blink/renderer/core/css/cssom/inline_style_property_map.cc index 8eb68d3..65e9ed9 100644 --- a/third_party/blink/renderer/core/css/cssom/inline_style_property_map.cc +++ b/third_party/blink/renderer/core/css/cssom/inline_style_property_map.cc
@@ -7,7 +7,6 @@ #include "third_party/blink/renderer/core/css/css_custom_property_declaration.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h" #include "third_party/blink/renderer/core/css/css_variable_reference_value.h" -#include "third_party/blink/renderer/core/css/property_registry.h" #include "third_party/blink/renderer/core/css/style_property_serializer.h" namespace blink { @@ -26,10 +25,8 @@ const CSSValue* InlineStylePropertyMap::GetCustomProperty( AtomicString property_name) { const CSSPropertyValueSet* inline_style = owner_element_->InlineStyle(); - const CSSValue* value = - inline_style ? inline_style->GetPropertyCSSValue(property_name) : nullptr; - return PropertyRegistry::ParseIfRegistered(owner_element_->GetDocument(), - property_name, value); + return inline_style ? inline_style->GetPropertyCSSValue(property_name) + : nullptr; } void InlineStylePropertyMap::SetProperty(CSSPropertyID property_id,
diff --git a/third_party/blink/renderer/core/css/cssom/prepopulated_computed_style_property_map_test.cc b/third_party/blink/renderer/core/css/cssom/prepopulated_computed_style_property_map_test.cc index e0cc71c8..4fec89e 100644 --- a/third_party/blink/renderer/core/css/cssom/prepopulated_computed_style_property_map_test.cc +++ b/third_party/blink/renderer/core/css/cssom/prepopulated_computed_style_property_map_test.cc
@@ -49,24 +49,24 @@ DummyExceptionStateForTesting exception_state; - map->get("color", exception_state); + map->get(&GetDocument(), "color", exception_state); EXPECT_FALSE(exception_state.HadException()); - map->has("color", exception_state); + map->has(&GetDocument(), "color", exception_state); EXPECT_FALSE(exception_state.HadException()); - map->getAll("color", exception_state); + map->getAll(&GetDocument(), "color", exception_state); EXPECT_FALSE(exception_state.HadException()); - map->get("align-contents", exception_state); + map->get(&GetDocument(), "align-contents", exception_state); EXPECT_TRUE(exception_state.HadException()); exception_state.ClearException(); - map->has("align-contents", exception_state); + map->has(&GetDocument(), "align-contents", exception_state); EXPECT_TRUE(exception_state.HadException()); exception_state.ClearException(); - map->getAll("align-contents", exception_state); + map->getAll(&GetDocument(), "align-contents", exception_state); EXPECT_TRUE(exception_state.HadException()); exception_state.ClearException(); } @@ -85,27 +85,29 @@ DummyExceptionStateForTesting exception_state; - const CSSStyleValue* foo = map->get("--foo", exception_state); + const CSSStyleValue* foo = map->get(&GetDocument(), "--foo", exception_state); ASSERT_NE(nullptr, foo); ASSERT_EQ(CSSStyleValue::kUnparsedType, foo->GetType()); EXPECT_FALSE(exception_state.HadException()); - EXPECT_EQ(true, map->has("--foo", exception_state)); + EXPECT_EQ(true, map->has(&GetDocument(), "--foo", exception_state)); EXPECT_FALSE(exception_state.HadException()); - CSSStyleValueVector fooAll = map->getAll("--foo", exception_state); + CSSStyleValueVector fooAll = + map->getAll(&GetDocument(), "--foo", exception_state); EXPECT_EQ(1U, fooAll.size()); ASSERT_NE(nullptr, fooAll[0]); ASSERT_EQ(CSSStyleValue::kUnparsedType, fooAll[0]->GetType()); EXPECT_FALSE(exception_state.HadException()); - EXPECT_EQ(nullptr, map->get("--quix", exception_state)); + EXPECT_EQ(nullptr, map->get(&GetDocument(), "--quix", exception_state)); EXPECT_FALSE(exception_state.HadException()); - EXPECT_EQ(false, map->has("--quix", exception_state)); + EXPECT_EQ(false, map->has(&GetDocument(), "--quix", exception_state)); EXPECT_FALSE(exception_state.HadException()); - EXPECT_EQ(CSSStyleValueVector(), map->getAll("--quix", exception_state)); + EXPECT_EQ(CSSStyleValueVector(), + map->getAll(&GetDocument(), "--quix", exception_state)); EXPECT_FALSE(exception_state.HadException()); }
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.cc b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.cc index bd91dd1..a69916c 100644 --- a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.cc +++ b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.cc
@@ -12,6 +12,8 @@ #include "third_party/blink/renderer/core/css/cssom/css_unsupported_style_value.h" #include "third_party/blink/renderer/core/css/cssom/style_value_factory.h" #include "third_party/blink/renderer/core/css/properties/css_property.h" +#include "third_party/blink/renderer/core/css/property_registration.h" +#include "third_party/blink/renderer/core/css/property_registry.h" #include "third_party/blink/renderer/core/css_property_names.h" #include "third_party/blink/renderer/core/style_property_shorthand.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -53,8 +55,10 @@ } // namespace -CSSStyleValue* StylePropertyMapReadOnly::get(const String& property_name, - ExceptionState& exception_state) { +CSSStyleValue* StylePropertyMapReadOnly::get( + const ExecutionContext* execution_context, + const String& property_name, + ExceptionState& exception_state) { const CSSPropertyID property_id = cssPropertyID(property_name); if (property_id == CSSPropertyInvalid) { exception_state.ThrowTypeError("Invalid propertyName: " + property_name); @@ -66,9 +70,10 @@ if (property.IsShorthand()) return GetShorthandProperty(property); - const CSSValue* value = (property_id == CSSPropertyVariable) - ? GetCustomProperty(AtomicString(property_name)) - : GetProperty(property_id); + const CSSValue* value = + (property_id == CSSPropertyVariable) + ? GetCustomProperty(*execution_context, AtomicString(property_name)) + : GetProperty(property_id); if (!value) return nullptr; @@ -84,6 +89,7 @@ } CSSStyleValueVector StylePropertyMapReadOnly::getAll( + const ExecutionContext* execution_context, const String& property_name, ExceptionState& exception_state) { CSSPropertyID property_id = cssPropertyID(property_name); @@ -101,18 +107,20 @@ return values; } - const CSSValue* value = (property_id == CSSPropertyVariable) - ? GetCustomProperty(AtomicString(property_name)) - : GetProperty(property_id); + const CSSValue* value = + (property_id == CSSPropertyVariable) + ? GetCustomProperty(*execution_context, AtomicString(property_name)) + : GetProperty(property_id); if (!value) return CSSStyleValueVector(); return StyleValueFactory::CssValueToStyleValueVector(property_id, *value); } -bool StylePropertyMapReadOnly::has(const String& property_name, +bool StylePropertyMapReadOnly::has(const ExecutionContext* execution_context, + const String& property_name, ExceptionState& exception_state) { - return !getAll(property_name, exception_state).IsEmpty(); + return !getAll(execution_context, property_name, exception_state).IsEmpty(); } StylePropertyMapReadOnly::IterationSource* @@ -140,4 +148,16 @@ return CSSUnsupportedStyleValue::Create(property.PropertyID(), serialization); } +const CSSValue* StylePropertyMapReadOnly::GetCustomProperty( + const ExecutionContext& execution_context, + const AtomicString& property_name) { + const CSSValue* value = GetCustomProperty(property_name); + + if (!execution_context.IsDocument()) + return value; + + return PropertyRegistry::ParseIfRegistered(ToDocument(execution_context), + property_name, value); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h index d3d431c..49415543 100644 --- a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h +++ b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h
@@ -26,9 +26,15 @@ ~StylePropertyMapReadOnly() override = default; - CSSStyleValue* get(const String& property_name, ExceptionState&); - CSSStyleValueVector getAll(const String& property_name, ExceptionState&); - bool has(const String& property_name, ExceptionState&); + CSSStyleValue* get(const ExecutionContext*, + const String& property_name, + ExceptionState&); + CSSStyleValueVector getAll(const ExecutionContext*, + const String& property_name, + ExceptionState&); + bool has(const ExecutionContext*, + const String& property_name, + ExceptionState&); virtual unsigned int size() = 0; @@ -48,6 +54,8 @@ IterationSource* StartIteration(ScriptState*, ExceptionState&) override; CSSStyleValue* GetShorthandProperty(const CSSProperty&); + const CSSValue* GetCustomProperty(const ExecutionContext&, + const AtomicString&); private: DISALLOW_COPY_AND_ASSIGN(StylePropertyMapReadOnly);
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.idl b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.idl index 5fab519..79757bb 100644 --- a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.idl +++ b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.idl
@@ -10,8 +10,8 @@ /* TODO: This should return (undefined or CSSStyleValue), but IDL doesn't have anything like that yet. See: https://github.com/heycam/webidl/issues/60 */ - [RaisesException] CSSStyleValue? get(CSSOMString property); - [RaisesException] sequence<CSSStyleValue> getAll(CSSOMString property); - [RaisesException] boolean has(CSSOMString property); + [RaisesException, CallWith=ExecutionContext] CSSStyleValue? get(CSSOMString property); + [RaisesException, CallWith=ExecutionContext] sequence<CSSStyleValue> getAll(CSSOMString property); + [RaisesException, CallWith=ExecutionContext] boolean has(CSSOMString property); readonly attribute unsigned long size; };
diff --git a/third_party/blink/renderer/core/css/invalidation/invalidation_set.cc b/third_party/blink/renderer/core/css/invalidation/invalidation_set.cc index 64f8eb805..1e115ca 100644 --- a/third_party/blink/renderer/core/css/invalidation/invalidation_set.cc +++ b/third_party/blink/renderer/core/css/invalidation/invalidation_set.cc
@@ -69,10 +69,11 @@ if (invalidation_flags_.WholeSubtreeInvalid()) return true; - if (tag_names_ && tag_names_->Contains(element.TagQName().LocalName())) { + if (tag_names_ && + tag_names_->Contains(element.LocalNameForSelectorMatching())) { TRACE_STYLE_INVALIDATOR_INVALIDATION_SELECTORPART_IF_ENABLED( element, kInvalidationSetMatchedTagName, *this, - element.TagQName().LocalName()); + element.LocalNameForSelectorMatching()); return true; } @@ -115,10 +116,11 @@ } bool InvalidationSet::InvalidatesTagName(Element& element) const { - if (tag_names_ && tag_names_->Contains(element.TagQName().LocalName())) { + if (tag_names_ && + tag_names_->Contains(element.LocalNameForSelectorMatching())) { TRACE_STYLE_INVALIDATOR_INVALIDATION_SELECTORPART_IF_ENABLED( element, kInvalidationSetMatchedTagName, *this, - element.TagQName().LocalName()); + element.LocalNameForSelectorMatching()); return true; }
diff --git a/third_party/blink/renderer/core/css/property_registry.cc b/third_party/blink/renderer/core/css/property_registry.cc index 5f71987..6910a968 100644 --- a/third_party/blink/renderer/core/css/property_registry.cc +++ b/third_party/blink/renderer/core/css/property_registry.cc
@@ -22,8 +22,8 @@ const Document& document, const AtomicString& property_name, const CSSValue* value) { - if (!value) - return nullptr; + if (!value || !value->IsCustomPropertyDeclaration()) + return value; const PropertyRegistry* registry = document.GetPropertyRegistry(); @@ -35,8 +35,6 @@ if (!registration) return value; - if (!value->IsCustomPropertyDeclaration()) - return value; CSSVariableData* tokens = ToCSSCustomPropertyDeclaration(value)->Value();
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index f7cf4dd..f6ba60f0 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/core/css/parser/css_parser_context.h" #include "third_party/blink/renderer/core/css/style_sheet_contents.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/dom/first_letter_pseudo_element.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/shadow_root.h" #include "third_party/blink/renderer/core/dom/shadow_root_init.h" @@ -25,6 +26,7 @@ #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_span_element.h" #include "third_party/blink/renderer/core/html/html_style_element.h" +#include "third_party/blink/renderer/core/layout/layout_text_fragment.h" #include "third_party/blink/renderer/core/page/viewport_description.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/platform/geometry/float_size.h" @@ -1544,4 +1546,69 @@ EXPECT_TRUE(GetDocument().ChildNeedsReattachLayoutTree()); } +TEST_F(StyleEngineTest, FirstLetterRemoved) { + GetDocument().body()->SetInnerHTMLFromString(R"HTML( + <style>.fl::first-letter { color: pink }</style> + <div class=fl id=d1><div><span id=f1>A</span></div></div> + <div class=fl id=d2><div><span id=f2>BB</span></div></div> + <div class=fl id=d3><div><span id=f3>C<!---->C</span></div></div> + )HTML"); + GetDocument().View()->UpdateAllLifecyclePhases(); + + Element* d1 = GetDocument().getElementById("d1"); + Element* d2 = GetDocument().getElementById("d2"); + Element* d3 = GetDocument().getElementById("d3"); + + FirstLetterPseudoElement* fl1 = + ToFirstLetterPseudoElement(d1->GetPseudoElement(kPseudoIdFirstLetter)); + EXPECT_TRUE(fl1); + + GetDocument().getElementById("f1")->firstChild()->remove(); + + EXPECT_FALSE(d1->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_FALSE(d1->firstChild()->ChildNeedsReattachLayoutTree()); + EXPECT_FALSE(d1->firstChild()->NeedsReattachLayoutTree()); + EXPECT_TRUE(d1->ChildNeedsStyleRecalc()); + EXPECT_TRUE(fl1->NeedsStyleRecalc()); + + GetDocument().View()->UpdateAllLifecyclePhases(); + EXPECT_FALSE( + ToFirstLetterPseudoElement(d1->GetPseudoElement(kPseudoIdFirstLetter))); + + FirstLetterPseudoElement* fl2 = + ToFirstLetterPseudoElement(d2->GetPseudoElement(kPseudoIdFirstLetter)); + EXPECT_TRUE(fl2); + + GetDocument().getElementById("f2")->firstChild()->remove(); + + EXPECT_FALSE(d2->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_FALSE(d2->firstChild()->ChildNeedsReattachLayoutTree()); + EXPECT_FALSE(d2->firstChild()->NeedsReattachLayoutTree()); + EXPECT_TRUE(d2->ChildNeedsStyleRecalc()); + EXPECT_TRUE(fl2->NeedsStyleRecalc()); + + GetDocument().View()->UpdateAllLifecyclePhases(); + EXPECT_FALSE( + ToFirstLetterPseudoElement(d2->GetPseudoElement(kPseudoIdFirstLetter))); + + FirstLetterPseudoElement* fl3 = + ToFirstLetterPseudoElement(d3->GetPseudoElement(kPseudoIdFirstLetter)); + EXPECT_TRUE(fl3); + + Element* f3 = GetDocument().getElementById("f3"); + f3->firstChild()->remove(); + + EXPECT_FALSE(d3->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_FALSE(d3->firstChild()->ChildNeedsReattachLayoutTree()); + EXPECT_FALSE(d3->firstChild()->NeedsReattachLayoutTree()); + EXPECT_TRUE(d3->ChildNeedsStyleRecalc()); + EXPECT_TRUE(fl3->NeedsStyleRecalc()); + + GetDocument().View()->UpdateAllLifecyclePhases(); + fl3 = ToFirstLetterPseudoElement(d3->GetPseudoElement(kPseudoIdFirstLetter)); + EXPECT_TRUE(fl3); + EXPECT_EQ(f3->lastChild()->GetLayoutObject(), + fl3->RemainingTextLayoutObject()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/document_test.cc b/third_party/blink/renderer/core/dom/document_test.cc index 5dd461e..21657e1c 100644 --- a/third_party/blink/renderer/core/dom/document_test.cc +++ b/third_party/blink/renderer/core/dom/document_test.cc
@@ -874,6 +874,7 @@ <div id='nonSticky'></div> </div> )HTML"); + GetDocument().UpdateStyleAndLayoutTree(); EXPECT_EQ(DocumentLifecycle::kStyleClean, GetDocument().Lifecycle().GetState());
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 4d2a7254..dfd5ac9a 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -32,6 +32,8 @@ #include "third_party/blink/renderer/bindings/core/v8/dictionary.h" #include "third_party/blink/renderer/bindings/core/v8/scroll_into_view_options_or_boolean.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" #include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/accessibility/ax_context.h" @@ -145,9 +147,7 @@ #include "third_party/blink/renderer/core/svg/svg_a_element.h" #include "third_party/blink/renderer/core/svg/svg_element.h" #include "third_party/blink/renderer/core/svg_names.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/core/xml_names.h" #include "third_party/blink/renderer/platform/bindings/dom_data_store.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -1634,11 +1634,43 @@ SetAttributeInternal(index, name, value, kInSynchronizationOfLazyAttribute); } +void Element::setAttribute( + const AtomicString& name, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + string_or_TT, + ExceptionState& exception_state) { + if (GetCheckedAttributeNames().Contains(name)) { + String attr_value = + GetStringFromTrustedType(string_or_TT, &GetDocument(), exception_state); + if (!exception_state.HadException()) + setAttribute(name, AtomicString(attr_value), exception_state); + return; + } + AtomicString value_string = + AtomicString(GetStringFromTrustedTypeWithoutCheck(string_or_TT)); + setAttribute(name, value_string, exception_state); +} + +const HashSet<AtomicString>& Element::GetCheckedAttributeNames() const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({})); + return attribute_set; +} + void Element::setAttribute(const QualifiedName& name, const StringOrTrustedHTML& stringOrHTML, ExceptionState& exception_state) { String valueString = - TrustedHTML::GetString(stringOrHTML, &GetDocument(), exception_state); + GetStringFromTrustedHTML(stringOrHTML, &GetDocument(), exception_state); + if (!exception_state.HadException()) { + setAttribute(name, AtomicString(valueString)); + } +} + +void Element::setAttribute(const QualifiedName& name, + const StringOrTrustedScript& stringOrScript, + ExceptionState& exception_state) { + String valueString = GetStringFromTrustedScript( + stringOrScript, &GetDocument(), exception_state); if (!exception_state.HadException()) { setAttribute(name, AtomicString(valueString)); } @@ -1647,28 +1679,20 @@ void Element::setAttribute(const QualifiedName& name, const StringOrTrustedScriptURL& stringOrURL, ExceptionState& exception_state) { - DCHECK(stringOrURL.IsString() || - RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); - if (stringOrURL.IsString() && GetDocument().RequireTrustedTypes()) { - exception_state.ThrowTypeError( - "This document requires `TrustedScriptURL` assignment."); - return; + String valueString = GetStringFromTrustedScriptURL( + stringOrURL, &GetDocument(), exception_state); + if (!exception_state.HadException()) { + setAttribute(name, AtomicString(valueString)); } - - String valueString = stringOrURL.IsString() - ? stringOrURL.GetAsString() - : stringOrURL.GetAsTrustedScriptURL()->toString(); - - setAttribute(name, AtomicString(valueString)); } void Element::setAttribute(const QualifiedName& name, const USVStringOrTrustedURL& stringOrURL, ExceptionState& exception_state) { - String url = - TrustedURL::GetString(stringOrURL, &GetDocument(), exception_state); + String valueString = + GetStringFromTrustedURL(stringOrURL, &GetDocument(), exception_state); if (!exception_state.HadException()) { - setAttribute(name, AtomicString(url)); + setAttribute(name, AtomicString(valueString)); } } @@ -3524,7 +3548,7 @@ void Element::setInnerHTML(const StringOrTrustedHTML& string_or_html, ExceptionState& exception_state) { String html = - TrustedHTML::GetString(string_or_html, &GetDocument(), exception_state); + GetStringFromTrustedHTML(string_or_html, &GetDocument(), exception_state); if (!exception_state.HadException()) { SetInnerHTMLFromString(html, exception_state); } @@ -3572,7 +3596,7 @@ void Element::setOuterHTML(const StringOrTrustedHTML& string_or_html, ExceptionState& exception_state) { String html = - TrustedHTML::GetString(string_or_html, &GetDocument(), exception_state); + GetStringFromTrustedHTML(string_or_html, &GetDocument(), exception_state); if (!exception_state.HadException()) { SetOuterHTMLFromString(html, exception_state); } @@ -3723,7 +3747,7 @@ const StringOrTrustedHTML& string_or_html, ExceptionState& exception_state) { String markup = - TrustedHTML::GetString(string_or_html, &GetDocument(), exception_state); + GetStringFromTrustedHTML(string_or_html, &GetDocument(), exception_state); if (!exception_state.HadException()) { insertAdjacentHTML(where, markup, exception_state); } @@ -3881,7 +3905,7 @@ if (!pseudo_element_specifier) return element_style; - if (ComputedStyle* pseudo_element_style = + if (const ComputedStyle* pseudo_element_style = element_style->GetCachedPseudoStyle(pseudo_element_specifier)) return pseudo_element_style; @@ -4139,7 +4163,7 @@ return nullptr; } -ComputedStyle* Element::CachedStyleForPseudoElement( +const ComputedStyle* Element::CachedStyleForPseudoElement( const PseudoStyleRequest& request, const ComputedStyle* parent_style) { ComputedStyle* style = MutableComputedStyle(); @@ -4149,7 +4173,8 @@ return nullptr; } - if (ComputedStyle* cached = style->GetCachedPseudoStyle(request.pseudo_id)) + if (const ComputedStyle* cached = + style->GetCachedPseudoStyle(request.pseudo_id)) return cached; scoped_refptr<ComputedStyle> result =
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 7bf4971b..899ea5b 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -41,6 +41,7 @@ #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/scroll/scroll_types.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" namespace blink { @@ -78,6 +79,8 @@ class ShadowRootInit; class SpaceSplitString; class StringOrTrustedHTML; +class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL; +class StringOrTrustedScript; class StringOrTrustedScriptURL; class StylePropertyMap; class StylePropertyMapReadOnly; @@ -208,16 +211,30 @@ ExceptionState&); void setAttribute(const AtomicString& name, const AtomicString& value); - // Trusted Type ScriptURL variant of the above. - void setAttribute(const QualifiedName&, - const StringOrTrustedScriptURL&, - ExceptionState&); + // Trusted Types variant for explicit setAttribute() use. + void setAttribute( + const AtomicString&, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, + ExceptionState&); + + // Returns attributes that should be checked against Trusted Types + virtual const HashSet<AtomicString>& GetCheckedAttributeNames() const; // Trusted Type HTML variant void setAttribute(const QualifiedName&, const StringOrTrustedHTML&, ExceptionState&); + // Trusted Type Script variant + void setAttribute(const QualifiedName&, + const StringOrTrustedScript&, + ExceptionState&); + + // Trusted Type ScriptURL variant + void setAttribute(const QualifiedName&, + const StringOrTrustedScriptURL&, + ExceptionState&); + // Trusted Type URL variant void setAttribute(const QualifiedName&, const USVStringOrTrustedURL&, @@ -733,7 +750,7 @@ PseudoElement* GetPseudoElement(PseudoId) const; LayoutObject* PseudoElementLayoutObject(PseudoId) const; - ComputedStyle* CachedStyleForPseudoElement( + const ComputedStyle* CachedStyleForPseudoElement( const PseudoStyleRequest&, const ComputedStyle* parent_style = nullptr); scoped_refptr<ComputedStyle> StyleForPseudoElement(
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl index 8c6d62d..4aba4f7 100644 --- a/third_party/blink/renderer/core/dom/element.idl +++ b/third_party/blink/renderer/core/dom/element.idl
@@ -48,7 +48,7 @@ [Affects=Nothing] sequence<DOMString> getAttributeNames(); [Affects=Nothing] DOMString? getAttribute(DOMString name); [Affects=Nothing] DOMString? getAttributeNS(DOMString? namespaceURI, DOMString localName); - [RaisesException, CEReactions, CustomElementCallbacks] void setAttribute(DOMString name, DOMString value); + [RaisesException, CEReactions, CustomElementCallbacks] void setAttribute(DOMString name, TrustedString value); [RaisesException, CEReactions, CustomElementCallbacks] void setAttributeNS(DOMString? namespaceURI, DOMString name, DOMString value); [CEReactions, CustomElementCallbacks] void removeAttribute(DOMString name); [CEReactions, CustomElementCallbacks] void removeAttributeNS(DOMString? namespaceURI, DOMString localName);
diff --git a/third_party/blink/renderer/core/dom/events/event_listener.h b/third_party/blink/renderer/core/dom/events/event_listener.h index 70942bb3..0e73cdb 100644 --- a/third_party/blink/renderer/core/dom/events/event_listener.h +++ b/third_party/blink/renderer/core/dom/events/event_listener.h
@@ -36,7 +36,13 @@ class CORE_EXPORT EventListener : public CustomWrappableAdapter { public: enum ListenerType { + // |kJSEventListenerType| corresponds to EventListener defined in standard: + // https://dom.spec.whatwg.org/#callbackdef-eventlistener kJSEventListenerType, + // |kJSEventHandlerType| corresponds to EventHandler defined in standard: + // https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes + kJSEventHandlerType, + // These are for C++ native callbacks. kImageEventListenerType, kCPPEventListenerType, kConditionEventListenerType, @@ -64,6 +70,14 @@ ListenerType GetType() const { return type_; } + // Returns true if this EventListener is implemented based on JS object. + bool IsJSBased() const { + return type_ == kJSEventListenerType || type_ == kJSEventHandlerType; + } + + // Returns true if this EventListener is C++ native callback. + bool IsNativeBased() const { return !IsJSBased(); } + const char* NameInHeapSnapshot() const override { return "EventListener"; } protected:
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc index 80ceabc..c42026d 100644 --- a/third_party/blink/renderer/core/dom/events/event_target.cc +++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -39,7 +39,8 @@ #include "third_party/blink/renderer/bindings/core/v8/event_listener_options_or_boolean.h" #include "third_party/blink/renderer/bindings/core/v8/script_event_listener.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_impl.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/dom/events/event_dispatch_forbidden_scope.h" #include "third_party/blink/renderer/core/dom/events/event_target_impl.h" @@ -289,31 +290,34 @@ if (RuntimeEnabledFeatures::SmoothScrollJSInterventionEnabled() && event_type == EventTypeNames::mousewheel && ToLocalDOMWindow() && event_listener && !options.hasPassive()) { - if (V8AbstractEventListener* v8_listener = - V8AbstractEventListener::Cast(event_listener)) { - v8::Local<v8::Object> function = v8_listener->GetExistingListenerObject(); - if (function->IsFunction() && - strcmp("ssc_wheel", - *v8::String::Utf8Value( - v8::Isolate::GetCurrent(), - v8::Local<v8::Function>::Cast(function)->GetName())) == - 0) { - options.setPassive(true); - if (executing_window) { - UseCounter::Count(executing_window->document(), - WebFeature::kSmoothScrollJSInterventionActivated); + v8::Local<v8::Object> callback_object; + if (V8AbstractEventHandler* v8_listener = + V8AbstractEventHandler::Cast(event_listener)) + callback_object = v8_listener->GetExistingListenerObject(); + if (V8EventListenerImpl* v8_listener = + V8EventListenerImpl::Cast(event_listener)) + callback_object = v8_listener->GetListenerObject(); + if (!callback_object.IsEmpty() && callback_object->IsFunction() && + strcmp( + "ssc_wheel", + *v8::String::Utf8Value( + v8::Isolate::GetCurrent(), + v8::Local<v8::Function>::Cast(callback_object)->GetName())) == + 0) { + options.setPassive(true); + if (executing_window) { + UseCounter::Count(executing_window->document(), + WebFeature::kSmoothScrollJSInterventionActivated); - executing_window->GetFrame()->Console().AddMessage( - ConsoleMessage::Create( - kInterventionMessageSource, kWarningMessageLevel, - "Registering mousewheel event as passive due to " - "smoothscroll.js usage. The smoothscroll.js library is " - "buggy, no longer necessary and degrades performance. See " - "https://www.chromestatus.com/feature/5749447073988608")); - } - - return; + executing_window->GetFrame()->Console().AddMessage( + ConsoleMessage::Create( + kInterventionMessageSource, kWarningMessageLevel, + "Registering mousewheel event as passive due to " + "smoothscroll.js usage. The smoothscroll.js library is " + "buggy, no longer necessary and degrades performance. See " + "https://www.chromestatus.com/feature/5749447073988608")); } + return; } } @@ -402,8 +406,7 @@ event_type, listener, options, ®istered_listener); if (added) { AddedEventListener(event_type, registered_listener); - if (V8AbstractEventListener::Cast(listener) && - IsInstrumentedForAsyncStack(event_type)) { + if (listener->IsJSBased() && IsInstrumentedForAsyncStack(event_type)) { probe::AsyncTaskScheduled(GetExecutionContext(), event_type, listener); } } @@ -538,8 +541,7 @@ return false; } if (registered_listener) { - if (V8AbstractEventListener::Cast(listener) && - IsInstrumentedForAsyncStack(event_type)) { + if (listener->IsJSBased() && IsInstrumentedForAsyncStack(event_type)) { probe::AsyncTaskScheduled(GetExecutionContext(), event_type, listener); } registered_listener->SetCallback(listener);
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc index 70d6fc3..ca72816 100644 --- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc +++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc
@@ -236,18 +236,24 @@ } } -void FirstLetterPseudoElement::SetRemainingTextLayoutObject( - LayoutTextFragment* fragment) { - // The text fragment we get our content from is being destroyed. We need - // to tell our parent element to recalcStyle so we can get cleaned up - // as well. - if (!fragment) { - SetNeedsStyleRecalc( - kLocalStyleChange, - StyleChangeReasonForTracing::Create(StyleChangeReason::kPseudoClass)); +void FirstLetterPseudoElement::ClearRemainingTextLayoutObject() { + DCHECK(remaining_text_layout_object_); + remaining_text_layout_object_ = nullptr; + + if (GetDocument().ChildNeedsReattachLayoutTree()) { + // We are in the layout tree rebuild phase. We will do UpdateFirstLetter() + // as part of RebuildFirstLetterLayoutTree() or AttachLayoutTree(). Marking + // us style-dirty during layout tree rebuild is not allowed. + return; } - remaining_text_layout_object_ = fragment; + // When we remove nodes from the tree, we do not mark ancestry for + // ChildNeedsStyleRecalc(). When removing the text node which contains the + // first letter, we need to UpdateFirstLetter to render the new first letter + // or remove the ::first-letter pseudo if there is no text left. Do that as + // part of a style recalc for this ::first-letter. + SetNeedsStyleRecalc(kLocalStyleChange, StyleChangeReasonForTracing::Create( + StyleChangeReason::kPseudoClass)); } void FirstLetterPseudoElement::AttachLayoutTree(AttachContext& context) {
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h index 6c8b5b1..1f85178b7 100644 --- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h +++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h
@@ -47,7 +47,7 @@ static LayoutText* FirstLetterTextLayoutObject(const Element&); static unsigned FirstLetterLength(const String&); - void SetRemainingTextLayoutObject(LayoutTextFragment*); + void ClearRemainingTextLayoutObject(); LayoutTextFragment* RemainingTextLayoutObject() const { return remaining_text_layout_object_; }
diff --git a/third_party/blink/renderer/core/dom/flat_tree_traversal.h b/third_party/blink/renderer/core/dom/flat_tree_traversal.h index 31054b6b..757ed70 100644 --- a/third_party/blink/renderer/core/dom/flat_tree_traversal.h +++ b/third_party/blink/renderer/core/dom/flat_tree_traversal.h
@@ -132,7 +132,7 @@ static TraversalRange<TraversalChildrenIterator<FlatTreeTraversal>> ChildrenOf(const Node&); - static TraversalRange<TraversalInclusiveAncestorsIterator<FlatTreeTraversal>> + static TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>> InclusiveAncestorsOf(const Node&); private: @@ -320,7 +320,8 @@ // TraverseRange<T> implementations inline TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>> FlatTreeTraversal::AncestorsOf(const Node& node) { - return TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>>(&node); + return TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>>( + Parent(node)); } inline TraversalRange<TraversalChildrenIterator<FlatTreeTraversal>> @@ -328,10 +329,9 @@ return TraversalRange<TraversalChildrenIterator<FlatTreeTraversal>>(&parent); } -inline TraversalRange<TraversalInclusiveAncestorsIterator<FlatTreeTraversal>> +inline TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>> FlatTreeTraversal::InclusiveAncestorsOf(const Node& node) { - return TraversalRange<TraversalInclusiveAncestorsIterator<FlatTreeTraversal>>( - &node); + return TraversalRange<TraversalAncestorsIterator<FlatTreeTraversal>>(&node); } } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index 0df2b7f1..71d0561 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -1053,7 +1053,9 @@ context.performing_reattach = true; DetachLayoutTree(context); - MarkAncestorsWithChildNeedsStyleRecalc(); + // Comments and processing instructions are never marked dirty. + if (NeedsStyleRecalc()) + MarkAncestorsWithChildNeedsStyleRecalc(); } inline bool Node::ShouldCallRecalcStyle(StyleRecalcChange change) {
diff --git a/third_party/blink/renderer/core/dom/node_rare_data.h b/third_party/blink/renderer/core/dom/node_rare_data.h index 6e546271..dd4f747b 100644 --- a/third_party/blink/renderer/core/dom/node_rare_data.h +++ b/third_party/blink/renderer/core/dom/node_rare_data.h
@@ -68,6 +68,8 @@ }; class NodeRenderingData { + USING_FAST_MALLOC(NodeRenderingData); + public: explicit NodeRenderingData(LayoutObject*, scoped_refptr<ComputedStyle> non_attached_style);
diff --git a/third_party/blink/renderer/core/dom/node_test.cc b/third_party/blink/renderer/core/dom/node_test.cc index 2adc78d..b03e16f1 100644 --- a/third_party/blink/renderer/core/dom/node_test.cc +++ b/third_party/blink/renderer/core/dom/node_test.cc
@@ -334,4 +334,22 @@ EXPECT_FALSE(GetDocument().ChildNeedsStyleRecalc()); } +TEST_F(NodeTest, LazyReattachCommentAndPI) { + SetBodyContent("<!-- -->"); + HTMLElement* body = GetDocument().body(); + ProcessingInstruction* pi = + ProcessingInstruction::Create(GetDocument(), "A", "B"); + body->appendChild(pi, ASSERT_NO_EXCEPTION); + GetDocument().View()->UpdateAllLifecyclePhases(); + + Node* comment = body->firstChild(); + EXPECT_EQ(Node::kCommentNode, comment->getNodeType()); + + comment->LazyReattachIfAttached(); + EXPECT_FALSE(body->ChildNeedsStyleRecalc()); + + pi->LazyReattachIfAttached(); + EXPECT_FALSE(body->ChildNeedsStyleRecalc()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/node_traversal.h b/third_party/blink/renderer/core/dom/node_traversal.h index b3f22e6..0fb83cb 100644 --- a/third_party/blink/renderer/core/dom/node_traversal.h +++ b/third_party/blink/renderer/core/dom/node_traversal.h
@@ -40,8 +40,6 @@ template <class TraversalNext> class TraversalAncestorsIterator; template <class TraversalNext> -class TraversalInclusiveAncestorsIterator; -template <class TraversalNext> class TraversalChildrenIterator; template <class TraversalNext> class TraversalDescendantIterator; @@ -145,7 +143,7 @@ static TraversalRange<TraversalAncestorsIterator<NodeTraversal>> AncestorsOf( const Node&); - static TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> + static TraversalRange<TraversalAncestorsIterator<NodeTraversal>> InclusiveAncestorsOf(const Node&); static TraversalRange<TraversalChildrenIterator<NodeTraversal>> ChildrenOf( const Node&); @@ -183,6 +181,7 @@ Member<const StartNodeType> start_; }; +// TODO(yoichio): Simplify iterator templates. template <class TraversalNext> class TraversalIteratorBase { STACK_ALLOCATED(); @@ -208,7 +207,8 @@ using StartNodeType = Node; using TraversalIteratorBase<TraversalNext>::current_; explicit TraversalAncestorsIterator(const StartNodeType* start) - : TraversalIteratorBase<TraversalNext>(TraversalNext::Parent(*start)) {} + : TraversalIteratorBase<TraversalNext>( + const_cast<StartNodeType*>(start)) {} void operator++() { current_ = TraversalNext::Parent(*current_); } static TraversalAncestorsIterator End() { return TraversalAncestorsIterator(); @@ -220,27 +220,6 @@ }; template <class TraversalNext> -class TraversalInclusiveAncestorsIterator - : public TraversalIteratorBase<TraversalNext> { - STACK_ALLOCATED(); - - public: - using StartNodeType = Node; - using TraversalIteratorBase<TraversalNext>::current_; - explicit TraversalInclusiveAncestorsIterator(const StartNodeType* start) - : TraversalIteratorBase<TraversalNext>( - const_cast<StartNodeType*>(start)) {} - void operator++() { current_ = TraversalNext::Parent(*current_); } - static TraversalInclusiveAncestorsIterator End() { - return TraversalInclusiveAncestorsIterator(); - } - - private: - TraversalInclusiveAncestorsIterator() - : TraversalIteratorBase<TraversalNext>(nullptr) {} -}; - -template <class TraversalNext> class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { STACK_ALLOCATED(); @@ -317,13 +296,13 @@ inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal::AncestorsOf(const Node& node) { - return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node); + return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>( + Parent(node)); } -inline TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> +inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal::InclusiveAncestorsOf(const Node& node) { - return TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>>( - &node); + return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node); } inline TraversalRange<TraversalChildrenIterator<NodeTraversal>>
diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc index f9cad13..2835ccb 100644 --- a/third_party/blink/renderer/core/dom/range.cc +++ b/third_party/blink/renderer/core/dom/range.cc
@@ -55,7 +55,7 @@ #include "third_party/blink/renderer/core/layout/layout_text.h" #include "third_party/blink/renderer/core/layout/layout_text_fragment.h" #include "third_party/blink/renderer/core/svg/svg_svg_element.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/geometry/float_quad.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -990,7 +990,7 @@ Document& document = start_.Container().GetDocument(); String markup = - TrustedHTML::GetString(string_or_html, &document, exception_state); + GetStringFromTrustedHTML(string_or_html, &document, exception_state); if (!exception_state.HadException()) { return createContextualFragmentFromString(markup, exception_state); }
diff --git a/third_party/blink/renderer/core/dom/shadow_root.cc b/third_party/blink/renderer/core/dom/shadow_root.cc index d2e0450..1cd6abe75 100644 --- a/third_party/blink/renderer/core/dom/shadow_root.cc +++ b/third_party/blink/renderer/core/dom/shadow_root.cc
@@ -45,7 +45,7 @@ #include "third_party/blink/renderer/core/html/html_shadow_element.h" #include "third_party/blink/renderer/core/html/html_slot_element.h" #include "third_party/blink/renderer/core/layout/layout_object.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink { @@ -135,7 +135,7 @@ void ShadowRoot::setInnerHTML(const StringOrTrustedHTML& stringOrHtml, ExceptionState& exception_state) { String html = - TrustedHTML::GetString(stringOrHtml, &GetDocument(), exception_state); + GetStringFromTrustedHTML(stringOrHtml, &GetDocument(), exception_state); if (!exception_state.HadException()) { SetInnerHTMLFromString(html, exception_state); }
diff --git a/third_party/blink/renderer/core/editing/finder/text_finder.cc b/third_party/blink/renderer/core/editing/finder/text_finder.cc index 4b5c514..1847a69 100644 --- a/third_party/blink/renderer/core/editing/finder/text_finder.cc +++ b/third_party/blink/renderer/core/editing/finder/text_finder.cc
@@ -68,7 +68,7 @@ namespace blink { namespace { -constexpr TimeDelta kForcedInvocationDeadline = TimeDelta::FromSeconds(10); +constexpr TimeDelta kTextFinderTestTimeout = TimeDelta::FromSeconds(10); } TextFinder::FindMatch::FindMatch(Range* range, int ordinal) @@ -888,7 +888,7 @@ // https://crbug.com/875203 if (options.run_synchronously_for_testing) { ScopeStringMatches( - IdleDeadline::Create(CurrentTimeTicks() + kForcedInvocationDeadline, + IdleDeadline::Create(CurrentTimeTicks() + kTextFinderTestTimeout, IdleDeadline::CallbackType::kCalledWhenIdle), identifier, search_text, options); } else {
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc index 21c25f5b..0acffa8 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc +++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc
@@ -35,7 +35,7 @@ const int kHotModeRequestTimeoutMS = 200; const int kInvalidHandle = -1; const int kDummyHandleForForcedInvocation = -2; -constexpr TimeDelta kForcedInvocationDeadline = TimeDelta::FromSeconds(10); +constexpr TimeDelta kIdleSpellcheckTestTimeout = TimeDelta::FromSeconds(10); } // namespace @@ -233,7 +233,7 @@ return; IdleDeadline* deadline = - IdleDeadline::Create(CurrentTimeTicks() + kForcedInvocationDeadline, + IdleDeadline::Create(CurrentTimeTicks() + kIdleSpellcheckTestTimeout, IdleDeadline::CallbackType::kCalledWhenIdle); switch (state_) {
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 1a1e2cfb4..179572b2 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -2523,28 +2523,35 @@ !GetPage()->MainFrame()->IsLocalFrame()) return; - if (!GetSettings()->ViewportEnabled()) { - GetPageScaleConstraintsSet().ClearPageDefinedConstraints(); - UpdateMainFrameLayoutSize(); - - // If we don't support mobile viewports, allow GPU rasterization. - matches_heuristics_for_gpu_rasterization_ = true; - if (layer_tree_view_) { - layer_tree_view_->HeuristicsForGpuRasterizationUpdated( - matches_heuristics_for_gpu_rasterization_); - } - return; - } - - Document* document = GetPage()->DeprecatedLocalMainFrame()->GetDocument(); - + // When viewport is disabled (non-mobile), we always use gpu rasterization. + // Otherwise, on platforms that do support viewport tags, we only enable it + // when they are present. But Why? Historically this was used to gate usage of + // gpu rasterization to a smaller set of less complex cases to avoid driver + // bugs dealing with websites designed for desktop. The concern is that on + // older android devices (<L according to https://crbug.com/419521#c9), + // drivers are more likely to encounter bugs with gpu raster when encountering + // the full possibility of desktop web content. Further, Adreno devices <=L + // have encountered problems that look like driver bugs when enabling + // OOP-Raster which is gpu-based. Thus likely a blacklist would be required + // for non-viewport-specified pages in order to avoid crashes or other + // problems on mobile devices with gpu rasterization. + bool viewport_enabled = GetSettings()->ViewportEnabled(); matches_heuristics_for_gpu_rasterization_ = - description.MatchesHeuristicsForGpuRasterization(); + viewport_enabled ? description.MatchesHeuristicsForGpuRasterization() + : true; if (layer_tree_view_) { layer_tree_view_->HeuristicsForGpuRasterizationUpdated( matches_heuristics_for_gpu_rasterization_); } + if (!viewport_enabled) { + GetPageScaleConstraintsSet().ClearPageDefinedConstraints(); + UpdateMainFrameLayoutSize(); + return; + } + + Document* document = GetPage()->DeprecatedLocalMainFrame()->GetDocument(); + Length default_min_width = document->GetViewportData().ViewportDefaultMinWidth(); if (default_min_width.IsAuto()) @@ -2598,11 +2605,8 @@ MainFrameImpl()->GetFrameView()->SetNeedsLayout(); } - if (LocalFrame* frame = GetPage()->DeprecatedLocalMainFrame()) { - if (TextAutosizer* text_autosizer = - frame->GetDocument()->GetTextAutosizer()) - text_autosizer->UpdatePageInfoInAllFrames(); - } + if (TextAutosizer* text_autosizer = document->GetTextAutosizer()) + text_autosizer->UpdatePageInfoInAllFrames(); UpdateMainFrameLayoutSize(); } @@ -3178,7 +3182,7 @@ // This means that we're transitioning to a new page. Suppress // commits until Blink generates invalidations so we don't // attempt to paint too early in the next page load. - layer_tree_view_->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_view_->DeferCommits(); layer_tree_view_->ClearRootLayer(); layer_tree_view_->ClearViewportLayers(); } @@ -3197,7 +3201,7 @@ // This means that we're transitioning to a new page. Suppress // commits until Blink generates invalidations so we don't // attempt to paint too early in the next page load. - layer_tree_view_->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_view_->DeferCommits(); layer_tree_view_->ClearRootLayer(); layer_tree_view_->ClearViewportLayers(); } @@ -3253,7 +3257,7 @@ // We don't yet have a page loaded at this point of the initialization of // WebViewImpl, so don't allow cc to commit any frames Blink might // try to create in the meantime. - layer_tree_view_->SetDeferCommits(true); + scoped_defer_commits_ = layer_tree_view_->DeferCommits(); } } @@ -3419,4 +3423,8 @@ return page_->AutoplayFlags(); } +void WebViewImpl::DeferCommitsForTesting() { + scoped_defer_commits_ = layer_tree_view_->DeferCommits(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index 66a3b5c..6afb3788 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -68,6 +68,7 @@ namespace cc { class Layer; +class ScopedDeferCommits; } namespace blink { @@ -447,6 +448,10 @@ const IntRect& caret_bounds_in_document, bool zoom_into_legible_scale); + void StopDeferringCommits() { scoped_defer_commits_.reset(); } + + void DeferCommitsForTesting(); + private: FRIEND_TEST_ALL_PREFIXES(WebFrameTest, DivScrollIntoEditableTest); FRIEND_TEST_ALL_PREFIXES(WebFrameTest, @@ -673,6 +678,10 @@ // visible, but the WebView should not be used as a widget. bool override_compositor_visibility_; + // We defer commits when transitioning to a new page. ChromeClientImpl calls + // StopDeferringCommits() to release this when a new page is loaded. + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits_; + Persistent<ResizeViewportAnchor> resize_viewport_anchor_; };
diff --git a/third_party/blink/renderer/core/frame/BUILD.gn b/third_party/blink/renderer/core/frame/BUILD.gn index 5268927..8b0e7cc 100644 --- a/third_party/blink/renderer/core/frame/BUILD.gn +++ b/third_party/blink/renderer/core/frame/BUILD.gn
@@ -25,6 +25,8 @@ "csp/media_list_directive.h", "csp/source_list_directive.cc", "csp/source_list_directive.h", + "csp/string_list_directive.cc", + "csp/string_list_directive.h", "deprecated_schedule_style_recalc_during_layout.cc", "deprecated_schedule_style_recalc_during_layout.h", "deprecation.cc",
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc index 67af69ff..6ea3de9 100644 --- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc +++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include <memory> +#include <vector> #include "third_party/blink/public/mojom/net/ip_address_space.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" @@ -191,8 +192,9 @@ if (treat_as_public_address_) { security_context.SetAddressSpace(mojom::IPAddressSpace::kPublic); } - if (require_safe_types_) + if (require_safe_types_) { security_context.SetRequireTrustedTypes(); + } // Upgrade Insecure Requests: Update the policy. security_context.SetInsecureRequestPolicy( @@ -219,8 +221,13 @@ for (const auto& policy : policies_) { UseCounter::Count(execution_context_, GetUseCounterType(policy->HeaderType())); - if (policy->AllowDynamic()) + if (policy->AllowDynamic( + ContentSecurityPolicy::DirectiveType::kScriptSrcAttr) || + policy->AllowDynamic( + ContentSecurityPolicy::DirectiveType::kScriptSrcElem)) { UseCounter::Count(execution_context_, WebFeature::kCSPWithStrictDynamic); + } + if (policy->AllowEval(nullptr, SecurityViolationReportingPolicy::kSuppressReporting, kWillNotThrowException, g_empty_string)) { @@ -436,7 +443,7 @@ void ContentSecurityPolicy::FillInCSPHashValues( const String& source, uint8_t hash_algorithms_used, - Vector<CSPHashValue>& csp_hash_values) { + Vector<CSPHashValue>* csp_hash_values) { // Any additions or subtractions from this struct should also modify the // respective entries in the kSupportedPrefixes array in // SourceListDirective::parseHash(). @@ -462,7 +469,7 @@ ComputeDigest(algorithm_map.algorithm, utf8_source.Data(), utf8_source.length(), digest); if (digest_success) { - csp_hash_values.push_back( + csp_hash_values->push_back( CSPHashValue(algorithm_map.csp_hash_algorithm, digest)); } } @@ -505,7 +512,7 @@ // 'unsafe-hashes' is present in a policy. Check against the digest // of the |source| and also check whether inline script is allowed. Vector<CSPHashValue> csp_hash_values; - FillInCSPHashValues(source, script_hash_algorithms_used_, csp_hash_values); + FillInCSPHashValues(source, script_hash_algorithms_used_, &csp_hash_values); bool is_allowed = true; for (const auto& policy : policies_) { @@ -527,7 +534,7 @@ // 'unsafe-hashes' is present in a policy. Check against the digest // of the |source| and also check whether inline script is allowed. Vector<CSPHashValue> csp_hash_values; - FillInCSPHashValues(source, script_hash_algorithms_used_, csp_hash_values); + FillInCSPHashValues(source, script_hash_algorithms_used_, &csp_hash_values); bool is_allowed = true; for (const auto& policy : policies_) { @@ -553,7 +560,7 @@ Vector<CSPHashValue> csp_hash_values; FillInCSPHashValues(script_content, script_hash_algorithms_used_, - csp_hash_values); + &csp_hash_values); bool is_allowed = true; for (const auto& policy : policies_) { @@ -581,14 +588,14 @@ Vector<CSPHashValue> csp_hash_values; FillInCSPHashValues(style_content, style_hash_algorithms_used_, - csp_hash_values); + &csp_hash_values); bool is_allowed = true; for (const auto& policy : policies_) { is_allowed &= CheckStyleHashAgainstPolicy(csp_hash_values, policy, inline_type) || policy->AllowInlineStyle(element, context_url, nonce, context_line, - reporting_policy, style_content); + reporting_policy, style_content, inline_type); } return is_allowed; @@ -1011,6 +1018,20 @@ return is_allowed; } +bool ContentSecurityPolicy::AllowTrustedTypePolicy( + const String& policy_name) const { + bool is_allowed = true; + for (const auto& policy : policies_) { + if (!CheckHeaderTypeMatches(CheckHeaderType::kCheckAll, + policy->HeaderType())) { + continue; + } + is_allowed &= policy->AllowTrustedTypePolicy(policy_name); + } + + return is_allowed; +} + bool ContentSecurityPolicy::AllowWorkerContextFromSource( const KURL& url, RedirectStatus redirect_status, @@ -1172,7 +1193,7 @@ } static void GatherSecurityPolicyViolationEventData( - SecurityPolicyViolationEventInit& init, + SecurityPolicyViolationEventInit* init, ExecutionContext* context, const String& directive_text, const ContentSecurityPolicy::DirectiveType& effective_type, @@ -1190,22 +1211,22 @@ String stripped_url = StripURLForUseInReport( context, blocked_url, RedirectStatus::kNoRedirect, ContentSecurityPolicy::DirectiveType::kDefaultSrc); - init.setDocumentURI(stripped_url); - init.setBlockedURI(stripped_url); + init->setDocumentURI(stripped_url); + init->setBlockedURI(stripped_url); } else { String stripped_url = StripURLForUseInReport( context, context->Url(), RedirectStatus::kNoRedirect, ContentSecurityPolicy::DirectiveType::kDefaultSrc); - init.setDocumentURI(stripped_url); + init->setDocumentURI(stripped_url); switch (violation_type) { case ContentSecurityPolicy::kInlineViolation: - init.setBlockedURI("inline"); + init->setBlockedURI("inline"); break; case ContentSecurityPolicy::kEvalViolation: - init.setBlockedURI("eval"); + init->setBlockedURI("eval"); break; case ContentSecurityPolicy::kURLViolation: - init.setBlockedURI(StripURLForUseInReport( + init->setBlockedURI(StripURLForUseInReport( context, blocked_url, redirect_status, effective_type)); break; } @@ -1213,22 +1234,22 @@ String effective_directive = ContentSecurityPolicy::GetDirectiveName(effective_type); - init.setViolatedDirective(effective_directive); - init.setEffectiveDirective(effective_directive); - init.setOriginalPolicy(header); - init.setDisposition(header_type == kContentSecurityPolicyHeaderTypeEnforce - ? "enforce" - : "report"); - init.setStatusCode(0); + init->setViolatedDirective(effective_directive); + init->setEffectiveDirective(effective_directive); + init->setOriginalPolicy(header); + init->setDisposition(header_type == kContentSecurityPolicyHeaderTypeEnforce + ? "enforce" + : "report"); + init->setStatusCode(0); // TODO(mkwst): We only have referrer and status code information for // Documents. It would be nice to get them for Workers as well. if (context->IsDocument()) { Document* document = ToDocument(context); DCHECK(document); - init.setReferrer(document->referrer()); + init->setReferrer(document->referrer()); if (!SecurityOrigin::IsSecure(context->Url()) && document->Loader()) - init.setStatusCode(document->Loader()->GetResponse().HttpStatusCode()); + init->setStatusCode(document->Loader()->GetResponse().HttpStatusCode()); } // If no source location is provided, use the source location of the context. @@ -1236,18 +1257,18 @@ source_location = SourceLocation::Capture(context); if (source_location->LineNumber()) { KURL source = KURL(source_location->Url()); - init.setSourceFile(StripURLForUseInReport(context, source, redirect_status, - effective_type)); - init.setLineNumber(source_location->LineNumber()); - init.setColumnNumber(source_location->ColumnNumber()); + init->setSourceFile(StripURLForUseInReport(context, source, redirect_status, + effective_type)); + init->setLineNumber(source_location->LineNumber()); + init->setColumnNumber(source_location->ColumnNumber()); } else { - init.setSourceFile(String()); - init.setLineNumber(0); - init.setColumnNumber(0); + init->setSourceFile(String()); + init->setLineNumber(0); + init->setColumnNumber(0); } if (!script_source.IsEmpty()) { - init.setSample(script_source.StripWhiteSpace().Left( + init->setSample(script_source.StripWhiteSpace().Left( ContentSecurityPolicy::kMaxSampleLength)); } } @@ -1290,7 +1311,7 @@ context_frame ? context_frame->GetDocument() : execution_context_; DCHECK(relevant_context); GatherSecurityPolicyViolationEventData( - violation_data, relevant_context, directive_text, effective_type, + &violation_data, relevant_context, directive_text, effective_type, blocked_url, header, redirect_status, header_type, violation_type, std::move(source_location), source); @@ -1718,14 +1739,22 @@ return "report-uri"; case DirectiveType::kRequireSRIFor: return "require-sri-for"; - case DirectiveType::kRequireTrustedTypes: - return "require-trusted-types"; + case DirectiveType::kTrustedTypes: + return "trusted-types"; case DirectiveType::kSandbox: return "sandbox"; case DirectiveType::kScriptSrc: return "script-src"; + case DirectiveType::kScriptSrcAttr: + return "script-src-attr"; + case DirectiveType::kScriptSrcElem: + return "script-src-elem"; case DirectiveType::kStyleSrc: return "style-src"; + case DirectiveType::kStyleSrcAttr: + return "style-src-attr"; + case DirectiveType::kStyleSrcElem: + return "style-src-elem"; case DirectiveType::kTreatAsPublicAddress: return "treat-as-public-address"; case DirectiveType::kUpgradeInsecureRequests: @@ -1781,14 +1810,22 @@ return DirectiveType::kReportURI; if (name == "require-sri-for") return DirectiveType::kRequireSRIFor; - if (name == "require-trusted-types") - return DirectiveType::kRequireTrustedTypes; + if (name == "trusted-types") + return DirectiveType::kTrustedTypes; if (name == "sandbox") return DirectiveType::kSandbox; if (name == "script-src") return DirectiveType::kScriptSrc; + if (name == "script-src-attr") + return DirectiveType::kScriptSrcAttr; + if (name == "script-src-elem") + return DirectiveType::kScriptSrcElem; if (name == "style-src") return DirectiveType::kStyleSrc; + if (name == "style-src-attr") + return DirectiveType::kStyleSrcAttr; + if (name == "style-src-elem") + return DirectiveType::kStyleSrcElem; if (name == "treat-as-public-address") return DirectiveType::kTreatAsPublicAddress; if (name == "upgrade-insecure-requests")
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.h b/third_party/blink/renderer/core/frame/csp/content_security_policy.h index 783a241..37938cb 100644 --- a/third_party/blink/renderer/core/frame/csp/content_security_policy.h +++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
@@ -107,10 +107,14 @@ kReportTo, kReportURI, kRequireSRIFor, - kRequireTrustedTypes, + kTrustedTypes, kSandbox, kScriptSrc, + kScriptSrcAttr, + kScriptSrcElem, kStyleSrc, + kStyleSrcAttr, + kStyleSrcElem, kTreatAsPublicAddress, kUndefined, kUpgradeInsecureRequests, @@ -249,6 +253,7 @@ RedirectStatus = RedirectStatus::kNoRedirect, SecurityViolationReportingPolicy = SecurityViolationReportingPolicy::kReport) const; + bool AllowTrustedTypePolicy(const String& policy_name) const; bool AllowWorkerContextFromSource( const KURL&, RedirectStatus = RedirectStatus::kNoRedirect, @@ -463,6 +468,23 @@ bool HasPolicyFromSource(ContentSecurityPolicyHeaderSource) const; + static bool IsScriptDirective( + ContentSecurityPolicy::DirectiveType directive_type) { + return ( + directive_type == ContentSecurityPolicy::DirectiveType::kScriptSrc || + directive_type == + ContentSecurityPolicy::DirectiveType::kScriptSrcAttr || + directive_type == ContentSecurityPolicy::DirectiveType::kScriptSrcElem); + } + + static bool IsStyleDirective( + ContentSecurityPolicy::DirectiveType directive_type) { + return ( + directive_type == ContentSecurityPolicy::DirectiveType::kStyleSrc || + directive_type == ContentSecurityPolicy::DirectiveType::kStyleSrcAttr || + directive_type == ContentSecurityPolicy::DirectiveType::kStyleSrcElem); + } + private: FRIEND_TEST_ALL_PREFIXES(ContentSecurityPolicyTest, NonceInline); FRIEND_TEST_ALL_PREFIXES(ContentSecurityPolicyTest, NonceSinglePolicy); @@ -495,7 +517,7 @@ static void FillInCSPHashValues(const String& source, uint8_t hash_algorithms_used, - Vector<CSPHashValue>& csp_hash_values); + Vector<CSPHashValue>* csp_hash_values); // checks a vector of csp hashes against policy, probably a good idea // to use in tandem with FillInCSPHashValues. @@ -535,4 +557,4 @@ } // namespace blink -#endif +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_CONTENT_SECURITY_POLICY_H_
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc index 56439964..8e7f5a9 100644 --- a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc +++ b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
@@ -1010,7 +1010,11 @@ {ContentSecurityPolicy::DirectiveType::kRequireSRIFor, "require-sri-for"}, {ContentSecurityPolicy::DirectiveType::kSandbox, "sandbox"}, {ContentSecurityPolicy::DirectiveType::kScriptSrc, "script-src"}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, "script-src-attr"}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, "script-src-elem"}, {ContentSecurityPolicy::DirectiveType::kStyleSrc, "style-src"}, + {ContentSecurityPolicy::DirectiveType::kStyleSrcAttr, "style-src-attr"}, + {ContentSecurityPolicy::DirectiveType::kStyleSrcElem, "style-src-elem"}, {ContentSecurityPolicy::DirectiveType::kTreatAsPublicAddress, "treat-as-public-address"}, {ContentSecurityPolicy::DirectiveType::kUpgradeInsecureRequests,
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive.h b/third_party/blink/renderer/core/frame/csp/csp_directive.h index f018e16..4a32cdc 100644 --- a/third_party/blink/renderer/core/frame/csp/csp_directive.h +++ b/third_party/blink/renderer/core/frame/csp/csp_directive.h
@@ -40,4 +40,4 @@ } // namespace blink -#endif +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_CSP_DIRECTIVE_H_
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc index 7ee2f0b..ae0f97f 100644 --- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc +++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
@@ -4,6 +4,10 @@ #include "third_party/blink/renderer/core/frame/csp/csp_directive_list.h" +#include <memory> +#include <utility> +#include <vector> + #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/space_split_string.h" @@ -57,15 +61,15 @@ // IntegrityMetadata (from SRI) has base64-encoded digest values, but CSP uses // binary format. This converts from the former to the latter. -bool ParseBase64Digest(String base64, DigestValue& hash) { +bool ParseBase64Digest(String base64, DigestValue* hash) { Vector<char> hash_vector; // We accept base64url-encoded data here by normalizing it to base64. if (!Base64Decode(NormalizeToBase64(base64), hash_vector)) return false; if (hash_vector.IsEmpty() || hash_vector.size() > kMaxDigestSize) return false; - hash.Append(reinterpret_cast<uint8_t*>(hash_vector.data()), - hash_vector.size()); + hash->Append(reinterpret_cast<uint8_t*>(hash_vector.data()), + hash_vector.size()); return true; } @@ -81,7 +85,6 @@ strict_mixed_content_checking_enforced_(false), upgrade_insecure_requests_(false), treat_as_public_address_(false), - require_safe_types_(false), require_sri_for_(RequireSRIForToken::kNone), use_reporting_api_(false) {} @@ -224,7 +227,7 @@ // Convert the hash from integrity metadata format to CSP format. CSPHashValue csp_hash; csp_hash.first = ConvertHashAlgorithmToCSPHashAlgorithm(hash.second); - if (!ParseBase64Digest(hash.first, csp_hash.second)) + if (!ParseBase64Digest(hash.first, &csp_hash.second)) return false; // All integrity hashes must be listed in the CSP. if (!directive->AllowHash(csp_hash)) @@ -465,7 +468,8 @@ const String& context_url, const WTF::OrdinalNumber& context_line, bool is_script, - const String& hash_value) const { + const String& hash_value, + ContentSecurityPolicy::DirectiveType effective_type) const { if (!directive || directive->AllowAllInline()) return true; @@ -488,9 +492,7 @@ } ReportViolationWithLocation( - directive->GetText(), - is_script ? ContentSecurityPolicy::DirectiveType::kScriptSrc - : ContentSecurityPolicy::DirectiveType::kStyleSrc, + directive->GetText(), effective_type, console_message + "\"" + directive->GetText() + "\"." + suffix + "\n", KURL(), context_url, context_line, element, directive->AllowReportSample() ? source : g_empty_string); @@ -544,9 +546,9 @@ prefix = prefix + "load plugin data from '"; else if (ContentSecurityPolicy::DirectiveType::kPrefetchSrc == effective_type) prefix = prefix + "prefetch content from '"; - else if (ContentSecurityPolicy::DirectiveType::kScriptSrc == effective_type) + else if (ContentSecurityPolicy::IsScriptDirective(effective_type)) prefix = prefix + "load the script '"; - else if (ContentSecurityPolicy::DirectiveType::kStyleSrc == effective_type) + else if (ContentSecurityPolicy::IsStyleDirective(effective_type)) prefix = prefix + "load the stylesheet '"; else if (ContentSecurityPolicy::DirectiveType::kNavigateTo == effective_type) prefix = prefix + "navigate to '"; @@ -600,13 +602,14 @@ const WTF::OrdinalNumber& context_line, SecurityViolationReportingPolicy reporting_policy) const { SourceListDirective* directive = - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc); + OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrcElem); if (reporting_policy == SecurityViolationReportingPolicy::kReport) { return CheckInlineAndReportViolation( directive, "Refused to run the JavaScript URL because it violates the following " "Content Security Policy directive: ", - element, source, context_url, context_line, true, "sha256-..."); + element, source, context_url, context_line, true, "sha256-...", + ContentSecurityPolicy::DirectiveType::kScriptSrcElem); } return !directive || directive->AllowAllInline(); @@ -619,13 +622,14 @@ const WTF::OrdinalNumber& context_line, SecurityViolationReportingPolicy reporting_policy) const { SourceListDirective* directive = - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc); + OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrcAttr); if (reporting_policy == SecurityViolationReportingPolicy::kReport) { return CheckInlineAndReportViolation( - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc), + directive, "Refused to execute inline event handler because it violates the " "following Content Security Policy directive: ", - element, source, context_url, context_line, true, "sha256-..."); + element, source, context_url, context_line, true, "sha256-...", + ContentSecurityPolicy::DirectiveType::kScriptSrcAttr); } return !directive || directive->AllowAllInline(); @@ -639,12 +643,12 @@ SecurityViolationReportingPolicy reporting_policy, const String& content) const { SourceListDirective* directive = - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc); + OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrcElem); if (IsMatchingNoncePresent(directive, nonce)) return true; if (element && IsHTMLScriptElement(element) && !ToHTMLScriptElement(element)->Loader()->IsParserInserted() && - AllowDynamic()) { + AllowDynamic(ContentSecurityPolicy::DirectiveType::kScriptSrcElem)) { return true; } if (reporting_policy == SecurityViolationReportingPolicy::kReport) { @@ -653,7 +657,8 @@ "Refused to execute inline script because it violates the following " "Content Security Policy directive: ", element, content, context_url, context_line, true, - GetSha256String(content)); + GetSha256String(content), + ContentSecurityPolicy::DirectiveType::kScriptSrcElem); } return !directive || directive->AllowAllInline(); @@ -665,18 +670,24 @@ const String& nonce, const WTF::OrdinalNumber& context_line, SecurityViolationReportingPolicy reporting_policy, - const String& content) const { - SourceListDirective* directive = - OperativeDirective(ContentSecurityPolicy::DirectiveType::kStyleSrc); + const String& content, + ContentSecurityPolicy::InlineType inline_type) const { + ContentSecurityPolicy::DirectiveType effective_type = + inline_type == ContentSecurityPolicy::InlineType::kAttribute + ? ContentSecurityPolicy::DirectiveType::kStyleSrcAttr + : ContentSecurityPolicy::DirectiveType::kStyleSrcElem; + SourceListDirective* directive = OperativeDirective(effective_type); + if (IsMatchingNoncePresent(directive, nonce)) return true; + if (reporting_policy == SecurityViolationReportingPolicy::kReport) { return CheckInlineAndReportViolation( directive, "Refused to apply inline style because it violates the following " "Content Security Policy directive: ", element, content, context_url, context_line, false, - GetSha256String(content)); + GetSha256String(content), effective_type); } return !directive || directive->AllowAllInline(); @@ -739,17 +750,18 @@ ResourceRequest::RedirectStatus redirect_status, SecurityViolationReportingPolicy reporting_policy) const { SourceListDirective* directive = - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc); + OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrcElem); if (IsMatchingNoncePresent(directive, nonce)) return true; - if (parser_disposition == kNotParserInserted && AllowDynamic()) + if (parser_disposition == kNotParserInserted && + AllowDynamic(ContentSecurityPolicy::DirectiveType::kScriptSrcElem)) return true; if (AreAllMatchingHashesPresent(directive, hashes)) return true; return reporting_policy == SecurityViolationReportingPolicy::kReport ? CheckSourceAndReportViolation( directive, url, - ContentSecurityPolicy::DirectiveType::kScriptSrc, + ContentSecurityPolicy::DirectiveType::kScriptSrcElem, redirect_status) : CheckSource(directive, url, redirect_status); } @@ -799,15 +811,15 @@ // sources. So, we do this nested set of calls to 'operativeDirective()' to // grab 'frame-src' if it exists, 'child-src' if it doesn't, and 'defaut-src' // if neither are available. - SourceListDirective* which_directive = + SourceListDirective* directive = OperativeDirective(ContentSecurityPolicy::DirectiveType::kFrameSrc); return reporting_policy == SecurityViolationReportingPolicy::kReport ? CheckSourceAndReportViolation( - which_directive, url, + directive, url, ContentSecurityPolicy::DirectiveType::kFrameSrc, redirect_status) - : CheckSource(which_directive, url, redirect_status); + : CheckSource(directive, url, redirect_status); } bool CSPDirectiveList::AllowImageFromSource( @@ -830,19 +842,17 @@ const String& nonce, ResourceRequest::RedirectStatus redirect_status, SecurityViolationReportingPolicy reporting_policy) const { - if (IsMatchingNoncePresent( - OperativeDirective(ContentSecurityPolicy::DirectiveType::kStyleSrc), - nonce)) + SourceListDirective* directive = + OperativeDirective(ContentSecurityPolicy::DirectiveType::kStyleSrcElem); + + if (IsMatchingNoncePresent(directive, nonce)) return true; return reporting_policy == SecurityViolationReportingPolicy::kReport ? CheckSourceAndReportViolation( - OperativeDirective( - ContentSecurityPolicy::DirectiveType::kStyleSrc), - url, ContentSecurityPolicy::DirectiveType::kStyleSrc, + directive, url, + ContentSecurityPolicy::DirectiveType::kStyleSrcElem, redirect_status) - : CheckSource(OperativeDirective( - ContentSecurityPolicy::DirectiveType::kStyleSrc), - url, redirect_status); + : CheckSource(directive, url, redirect_status); } bool CSPDirectiveList::AllowFontFromSource( @@ -949,6 +959,23 @@ return result; } +bool CSPDirectiveList::AllowTrustedTypePolicy(const String& policy_name) const { + if (trusted_types_->Allows(policy_name)) + return true; + + ReportViolation( + "trusted-types", ContentSecurityPolicy::DirectiveType::kTrustedTypes, + String::Format( + "Refused to create a TrustedTypePolicy named '%s' because " + "it violates the following Content Security Policy directive: " + "\"%s\".", + policy_name.Utf8().data(), + trusted_types_.Get()->GetText().Utf8().data()), + KURL(), RedirectStatus::kNoRedirect); + + return DenyIfEnforcingPolicy(); +} + bool CSPDirectiveList::AllowWorkerFromSource( const KURL& url, ResourceRequest::RedirectStatus redirect_status, @@ -1000,19 +1027,23 @@ const CSPHashValue& hash_value, ContentSecurityPolicy::InlineType type) const { return AllowHash(hash_value, type, - ContentSecurityPolicy::DirectiveType::kScriptSrc); + type == ContentSecurityPolicy::InlineType::kAttribute + ? ContentSecurityPolicy::DirectiveType::kScriptSrcAttr + : ContentSecurityPolicy::DirectiveType::kScriptSrcElem); } bool CSPDirectiveList::AllowStyleHash( const CSPHashValue& hash_value, ContentSecurityPolicy::InlineType type) const { return AllowHash(hash_value, type, - ContentSecurityPolicy::DirectiveType::kStyleSrc); + type == ContentSecurityPolicy::InlineType::kAttribute + ? ContentSecurityPolicy::DirectiveType::kStyleSrcAttr + : ContentSecurityPolicy::DirectiveType::kStyleSrcElem); } -bool CSPDirectiveList::AllowDynamic() const { - return CheckDynamic( - OperativeDirective(ContentSecurityPolicy::DirectiveType::kScriptSrc)); +bool CSPDirectiveList::AllowDynamic( + ContentSecurityPolicy::DirectiveType directive_type) const { + return CheckDynamic(OperativeDirective(directive_type)); } bool CSPDirectiveList::AllowDynamicWorker() const { @@ -1050,7 +1081,7 @@ SkipUntil<UChar>(position, end, ';'); String name, value; - if (ParseDirective(directive_begin, position, name, value)) { + if (ParseDirective(directive_begin, position, &name, &value)) { DCHECK(!name.IsEmpty()); AddDirective(name, value); } @@ -1066,10 +1097,10 @@ // bool CSPDirectiveList::ParseDirective(const UChar* begin, const UChar* end, - String& name, - String& value) { - DCHECK(name.IsEmpty()); - DCHECK(value.IsEmpty()); + String* name, + String* value) { + DCHECK(name->IsEmpty()); + DCHECK(value->IsEmpty()); const UChar* position = begin; SkipWhile<UChar, IsASCIISpace>(position, end); @@ -1089,7 +1120,7 @@ return false; } - name = String(name_begin, position - name_begin); + *name = String(name_begin, position - name_begin); if (position == end) return true; @@ -1108,7 +1139,7 @@ if (position != end) { policy_->ReportInvalidDirectiveValueCharacter( - name, String(value_begin, end - value_begin)); + *name, String(value_begin, end - value_begin)); return false; } @@ -1116,7 +1147,7 @@ if (value_begin == position) return true; - value = String(value_begin, position - value_begin); + *value = String(value_begin, position - value_begin); return true; } @@ -1306,14 +1337,12 @@ policy_->ReportInvalidInReportOnly(name); return; } - if (require_safe_types_) { + if (trusted_types_) { policy_->ReportDuplicateDirective(name); return; } - require_safe_types_ = true; policy_->RequireTrustedTypes(); - if (!value.IsEmpty()) - policy_->ReportValueForEmptyDirective(name, value); + trusted_types_ = new StringListDirective(name, value, policy_); } void CSPDirectiveList::EnforceStrictMixedContentChecking(const String& name, @@ -1363,6 +1392,14 @@ } else if (type == ContentSecurityPolicy::DirectiveType::kScriptSrc) { SetCSPDirective<SourceListDirective>(name, value, script_src_); policy_->UsesScriptHashAlgorithms(script_src_->HashAlgorithmsUsed()); + } else if (type == ContentSecurityPolicy::DirectiveType::kScriptSrcAttr && + policy_->ExperimentalFeaturesEnabled()) { + SetCSPDirective<SourceListDirective>(name, value, script_src_attr_); + policy_->UsesScriptHashAlgorithms(script_src_attr_->HashAlgorithmsUsed()); + } else if (type == ContentSecurityPolicy::DirectiveType::kScriptSrcElem && + policy_->ExperimentalFeaturesEnabled()) { + SetCSPDirective<SourceListDirective>(name, value, script_src_elem_); + policy_->UsesScriptHashAlgorithms(script_src_elem_->HashAlgorithmsUsed()); } else if (type == ContentSecurityPolicy::DirectiveType::kObjectSrc) { SetCSPDirective<SourceListDirective>(name, value, object_src_); } else if (type == ContentSecurityPolicy::DirectiveType::kFrameAncestors) { @@ -1374,6 +1411,14 @@ } else if (type == ContentSecurityPolicy::DirectiveType::kStyleSrc) { SetCSPDirective<SourceListDirective>(name, value, style_src_); policy_->UsesStyleHashAlgorithms(style_src_->HashAlgorithmsUsed()); + } else if (type == ContentSecurityPolicy::DirectiveType::kStyleSrcAttr && + policy_->ExperimentalFeaturesEnabled()) { + SetCSPDirective<SourceListDirective>(name, value, style_src_attr_); + policy_->UsesStyleHashAlgorithms(style_src_attr_->HashAlgorithmsUsed()); + } else if (type == ContentSecurityPolicy::DirectiveType::kStyleSrcElem && + policy_->ExperimentalFeaturesEnabled()) { + SetCSPDirective<SourceListDirective>(name, value, style_src_elem_); + policy_->UsesStyleHashAlgorithms(style_src_elem_->HashAlgorithmsUsed()); } else if (type == ContentSecurityPolicy::DirectiveType::kFontSrc) { SetCSPDirective<SourceListDirective>(name, value, font_src_); } else if (type == ContentSecurityPolicy::DirectiveType::kMediaSrc) { @@ -1412,8 +1457,7 @@ ParseRequireSRIFor(name, value); } else if (type == ContentSecurityPolicy::DirectiveType::kReportTo) { ParseReportTo(name, value); - } else if (type == - ContentSecurityPolicy::DirectiveType::kRequireTrustedTypes && + } else if (type == ContentSecurityPolicy::DirectiveType::kTrustedTypes && RuntimeEnabledFeatures::TrustedDOMTypesEnabled()) { RequireTrustedTypes(name, value); } else if (type == ContentSecurityPolicy::DirectiveType::kPrefetchSrc) { @@ -1441,6 +1485,14 @@ case ContentSecurityPolicy::DirectiveType::kStyleSrc: return ContentSecurityPolicy::DirectiveType::kDefaultSrc; + case ContentSecurityPolicy::DirectiveType::kScriptSrcAttr: + case ContentSecurityPolicy::DirectiveType::kScriptSrcElem: + return ContentSecurityPolicy::DirectiveType::kScriptSrc; + + case ContentSecurityPolicy::DirectiveType::kStyleSrcAttr: + case ContentSecurityPolicy::DirectiveType::kStyleSrcElem: + return ContentSecurityPolicy::DirectiveType::kStyleSrc; + case ContentSecurityPolicy::DirectiveType::kFrameSrc: case ContentSecurityPolicy::DirectiveType::kWorkerSrc: return ContentSecurityPolicy::DirectiveType::kChildSrc; @@ -1524,9 +1576,25 @@ case ContentSecurityPolicy::DirectiveType::kScriptSrc: directive = script_src_; break; + case ContentSecurityPolicy::DirectiveType::kScriptSrcAttr: + directive = policy_->ExperimentalFeaturesEnabled() ? script_src_attr_ + : script_src_; + break; + case ContentSecurityPolicy::DirectiveType::kScriptSrcElem: + directive = policy_->ExperimentalFeaturesEnabled() ? script_src_elem_ + : script_src_; + break; case ContentSecurityPolicy::DirectiveType::kStyleSrc: directive = style_src_; break; + case ContentSecurityPolicy::DirectiveType::kStyleSrcAttr: + directive = + policy_->ExperimentalFeaturesEnabled() ? style_src_attr_ : style_src_; + break; + case ContentSecurityPolicy::DirectiveType::kStyleSrcElem: + directive = + policy_->ExperimentalFeaturesEnabled() ? style_src_elem_ : style_src_; + break; case ContentSecurityPolicy::DirectiveType::kFrameSrc: directive = frame_src_; break; @@ -1572,7 +1640,11 @@ ContentSecurityPolicy::DirectiveType::kMediaSrc, ContentSecurityPolicy::DirectiveType::kObjectSrc, ContentSecurityPolicy::DirectiveType::kScriptSrc, + ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + ContentSecurityPolicy::DirectiveType::kScriptSrcElem, ContentSecurityPolicy::DirectiveType::kStyleSrc, + ContentSecurityPolicy::DirectiveType::kStyleSrcAttr, + ContentSecurityPolicy::DirectiveType::kStyleSrcElem, ContentSecurityPolicy::DirectiveType::kWorkerSrc, ContentSecurityPolicy::DirectiveType::kBaseURI, ContentSecurityPolicy::DirectiveType::kFrameAncestors, @@ -1660,9 +1732,14 @@ visitor->Trace(object_src_); visitor->Trace(prefetch_src_); visitor->Trace(script_src_); + visitor->Trace(script_src_attr_); + visitor->Trace(script_src_elem_); visitor->Trace(style_src_); + visitor->Trace(style_src_attr_); + visitor->Trace(style_src_elem_); visitor->Trace(worker_src_); visitor->Trace(navigate_to_); + visitor->Trace(trusted_types_); } } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.h b/third_party/blink/renderer/core/frame/csp/csp_directive_list.h index 2d55db6..f04d368 100644 --- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.h +++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.h
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/csp/media_list_directive.h" #include "third_party/blink/renderer/core/frame/csp/source_list_directive.h" +#include "third_party/blink/renderer/core/frame/csp/string_list_directive.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" @@ -68,7 +69,8 @@ const String& nonce, const WTF::OrdinalNumber& context_line, SecurityViolationReportingPolicy, - const String& style_content) const; + const String& style_content, + ContentSecurityPolicy::InlineType inline_type) const; bool AllowEval(ScriptState*, SecurityViolationReportingPolicy, ContentSecurityPolicy::ExceptionStatus, @@ -123,6 +125,7 @@ bool AllowBaseURI(const KURL&, ResourceRequest::RedirectStatus, SecurityViolationReportingPolicy) const; + bool AllowTrustedTypePolicy(const String& policy_name) const; bool AllowWorkerFromSource(const KURL&, ResourceRequest::RedirectStatus, SecurityViolationReportingPolicy) const; @@ -139,7 +142,7 @@ ContentSecurityPolicy::InlineType) const; bool AllowStyleHash(const CSPHashValue&, ContentSecurityPolicy::InlineType) const; - bool AllowDynamic() const; + bool AllowDynamic(ContentSecurityPolicy::DirectiveType) const; bool AllowDynamicWorker() const; bool AllowRequestWithoutIntegrity(WebURLRequest::RequestContext, @@ -210,8 +213,8 @@ bool ParseDirective(const UChar* begin, const UChar* end, - String& name, - String& value); + String* name, + String* value); void ParseRequireSRIFor(const String& name, const String& value); void ParseReportURI(const String& name, const String& value); void ParseReportTo(const String& name, const String& value); @@ -291,14 +294,16 @@ ScriptState*, ContentSecurityPolicy::ExceptionStatus, const String& script_content) const; - bool CheckInlineAndReportViolation(SourceListDirective*, - const String& console_message, - Element*, - const String& source, - const String& context_url, - const WTF::OrdinalNumber& context_line, - bool is_script, - const String& hash_value) const; + bool CheckInlineAndReportViolation( + SourceListDirective*, + const String& console_message, + Element*, + const String& source, + const String& context_url, + const WTF::OrdinalNumber& context_line, + bool is_script, + const String& hash_value, + ContentSecurityPolicy::DirectiveType effective_type) const; bool CheckSourceAndReportViolation(SourceListDirective*, const KURL&, @@ -348,7 +353,6 @@ bool upgrade_insecure_requests_; bool treat_as_public_address_; - bool require_safe_types_; Member<MediaListDirective> plugin_types_; Member<SourceListDirective> base_uri_; @@ -365,9 +369,14 @@ Member<SourceListDirective> object_src_; Member<SourceListDirective> prefetch_src_; Member<SourceListDirective> script_src_; + Member<SourceListDirective> script_src_attr_; + Member<SourceListDirective> script_src_elem_; Member<SourceListDirective> style_src_; + Member<SourceListDirective> style_src_attr_; + Member<SourceListDirective> style_src_elem_; Member<SourceListDirective> worker_src_; Member<SourceListDirective> navigate_to_; + Member<StringListDirective> trusted_types_; uint8_t require_sri_for_; @@ -381,4 +390,4 @@ } // namespace blink -#endif +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_CSP_DIRECTIVE_LIST_H_
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list_test.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list_test.cc index a7cbc6d..0581db41 100644 --- a/third_party/blink/renderer/core/frame/csp/csp_directive_list_test.cc +++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list_test.cc
@@ -4,6 +4,10 @@ #include "third_party/blink/renderer/core/frame/csp/csp_directive_list.h" +#include <list> +#include <string> +#include <vector> + #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/csp/source_list_directive.h" @@ -19,7 +23,6 @@ class CSPDirectiveListTest : public testing::Test { public: CSPDirectiveListTest() : csp(ContentSecurityPolicy::Create()) {} - void SetUp() override { csp->SetupSelf( *SecurityOrigin::CreateFromString("https://example.test/image.png")); @@ -62,50 +65,89 @@ TEST_F(CSPDirectiveListTest, IsMatchingNoncePresent) { struct TestCase { + ContentSecurityPolicy::DirectiveType type; const char* list; const char* nonce; bool expected; } cases[] = { - {"script-src 'self'", "yay", false}, - {"script-src 'self'", "boo", false}, - {"script-src 'nonce-yay'", "yay", true}, - {"script-src 'nonce-yay'", "boo", false}, - {"script-src 'nonce-yay' 'nonce-boo'", "yay", true}, - {"script-src 'nonce-yay' 'nonce-boo'", "boo", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, "script-src 'self'", + "yay", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, "script-src 'self'", + "boo", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "script-src 'nonce-yay'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "script-src 'nonce-yay'", "boo", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "script-src 'nonce-yay' 'nonce-boo'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "script-src 'nonce-yay' 'nonce-boo'", "boo", true}, // Falls back to 'default-src' - {"default-src 'nonce-yay'", "yay", true}, - {"default-src 'nonce-yay'", "boo", false}, - {"default-src 'nonce-boo'; script-src 'nonce-yay'", "yay", true}, - {"default-src 'nonce-boo'; script-src 'nonce-yay'", "boo", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "default-src 'nonce-yay'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "default-src 'nonce-yay'", "boo", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "default-src 'nonce-boo'; script-src 'nonce-yay'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "default-src 'nonce-boo'; script-src 'nonce-yay'", "boo", false}, // Unrelated directives do not affect result - {"style-src 'nonce-yay'", "yay", false}, - {"style-src 'nonce-yay'", "boo", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "style-src 'nonce-yay'", "yay", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + "style-src 'nonce-yay'", "boo", false}, + + // Script-src-elem/attr falls back on script-src and then default-src. + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + "script-src 'nonce-yay'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + "script-src 'nonce-yay'; default-src 'nonce-boo'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + "script-src 'nonce-boo'; default-src 'nonce-yay'", "yay", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + "script-src-elem 'nonce-yay'; script-src 'nonce-boo'; default-src " + "'nonce-boo'", + "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + "default-src 'nonce-yay'", "yay", true}, + + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + "script-src 'nonce-yay'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + "script-src 'nonce-yay'; default-src 'nonce-boo'", "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + "script-src 'nonce-boo'; default-src 'nonce-yay'", "yay", false}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + "script-src-attr 'nonce-yay'; script-src 'nonce-boo'; default-src " + "'nonce-boo'", + "yay", true}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + "default-src 'nonce-yay'", "yay", true}, }; for (const auto& test : cases) { // Report-only Member<CSPDirectiveList> directive_list = CreateList(test.list, kContentSecurityPolicyHeaderTypeReport); - Member<SourceListDirective> script_src = directive_list->OperativeDirective( - ContentSecurityPolicy::DirectiveType::kScriptSrc); + Member<SourceListDirective> directive = + directive_list->OperativeDirective(test.type); EXPECT_EQ(test.expected, - directive_list->IsMatchingNoncePresent(script_src, test.nonce)); + directive_list->IsMatchingNoncePresent(directive, test.nonce)); // Empty/null strings are always not present, regardless of the policy. - EXPECT_FALSE(directive_list->IsMatchingNoncePresent(script_src, "")); - EXPECT_FALSE(directive_list->IsMatchingNoncePresent(script_src, String())); + EXPECT_FALSE(directive_list->IsMatchingNoncePresent(directive, "")); + EXPECT_FALSE(directive_list->IsMatchingNoncePresent(directive, String())); // Enforce directive_list = CreateList(test.list, kContentSecurityPolicyHeaderTypeEnforce); - script_src = directive_list->OperativeDirective( - ContentSecurityPolicy::DirectiveType::kScriptSrc); + directive = directive_list->OperativeDirective(test.type); EXPECT_EQ(test.expected, - directive_list->IsMatchingNoncePresent(script_src, test.nonce)); + directive_list->IsMatchingNoncePresent(directive, test.nonce)); // Empty/null strings are always not present, regardless of the policy. - EXPECT_FALSE(directive_list->IsMatchingNoncePresent(script_src, "")); - EXPECT_FALSE(directive_list->IsMatchingNoncePresent(script_src, String())); + EXPECT_FALSE(directive_list->IsMatchingNoncePresent(directive, "")); + EXPECT_FALSE(directive_list->IsMatchingNoncePresent(directive, String())); } } @@ -392,7 +434,6 @@ const WebURLRequest::RequestContext context; bool expected; } cases[] = { - {"require-sri-for script", "https://example.com/file", WebURLRequest::kRequestContextScript, false}, @@ -865,132 +906,110 @@ } TEST_F(CSPDirectiveListTest, OperativeDirectiveGivenType) { - enum DefaultBehaviour { - kDefault, - kNoDefault, - kChildAndDefault, - kChildAndScriptAndDefault - }; - struct TestCase { ContentSecurityPolicy::DirectiveType directive; - const DefaultBehaviour type; + std::vector<ContentSecurityPolicy::DirectiveType> fallback_list; } cases[] = { // Directives with default directive. - {ContentSecurityPolicy::DirectiveType::kChildSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kConnectSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kFontSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kImgSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kManifestSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kMediaSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kObjectSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kScriptSrc, kDefault}, - {ContentSecurityPolicy::DirectiveType::kStyleSrc, kDefault}, + {ContentSecurityPolicy::DirectiveType::kChildSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kConnectSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kFontSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kImgSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kManifestSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kMediaSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kObjectSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kStyleSrc, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, // Directives with no default directive. - {ContentSecurityPolicy::DirectiveType::kBaseURI, kNoDefault}, - {ContentSecurityPolicy::DirectiveType::kDefaultSrc, kNoDefault}, - {ContentSecurityPolicy::DirectiveType::kFrameAncestors, kNoDefault}, - {ContentSecurityPolicy::DirectiveType::kFormAction, kNoDefault}, + {ContentSecurityPolicy::DirectiveType::kBaseURI, {}}, + {ContentSecurityPolicy::DirectiveType::kDefaultSrc, {}}, + {ContentSecurityPolicy::DirectiveType::kFrameAncestors, {}}, + {ContentSecurityPolicy::DirectiveType::kFormAction, {}}, // Directive with multiple default directives. - {ContentSecurityPolicy::DirectiveType::kFrameSrc, kChildAndDefault}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcAttr, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kScriptSrcElem, + {ContentSecurityPolicy::DirectiveType::kScriptSrc, + ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, + {ContentSecurityPolicy::DirectiveType::kFrameSrc, + {ContentSecurityPolicy::DirectiveType::kChildSrc, + ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, {ContentSecurityPolicy::DirectiveType::kWorkerSrc, - kChildAndScriptAndDefault}, + {ContentSecurityPolicy::DirectiveType::kChildSrc, + ContentSecurityPolicy::DirectiveType::kScriptSrc, + ContentSecurityPolicy::DirectiveType::kDefaultSrc}}, }; - // Initial set-up. std::stringstream all_directives; for (const auto& test : cases) { const char* name = ContentSecurityPolicy::GetDirectiveName(test.directive); all_directives << name << " http://" << name << ".com; "; } - CSPDirectiveList* all_directives_list = CreateList( - all_directives.str().c_str(), kContentSecurityPolicyHeaderTypeEnforce); + CSPDirectiveList* empty = CreateList("", kContentSecurityPolicyHeaderTypeEnforce); - for (const auto& test : cases) { - const char* name = ContentSecurityPolicy::GetDirectiveName(test.directive); - // When CSPDirectiveList is empty, then `null` should be returned for any - // type. + std::string directive_string; + CSPDirectiveList* directive_list; + // Initial set-up. + for (auto& test : cases) { + // With an empty directive list the returned directive should always be + // null. EXPECT_FALSE(empty->OperativeDirective(test.directive)); - // When all directives present, then given a type that directive value - // should be returned. - HeapVector<Member<CSPSource>> sources = - all_directives_list->OperativeDirective(test.directive)->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_TRUE(sources[0]->host_.StartsWith(name)); + // Add the directive itself as it should be the first one to be returned. + test.fallback_list.insert(test.fallback_list.begin(), test.directive); - std::stringstream all_except_this; - std::stringstream all_except_child_src_and_this; - std::stringstream all_except_child_src_and_script_src_and_this; - for (const auto& subtest : cases) { - if (subtest.directive == test.directive) - continue; - const char* directive_name = - ContentSecurityPolicy::GetDirectiveName(subtest.directive); - all_except_this << directive_name << " http://" << directive_name - << ".com; "; - if (subtest.directive != - ContentSecurityPolicy::DirectiveType::kChildSrc) { - all_except_child_src_and_this << directive_name << " http://" - << directive_name << ".com; "; - } - if (subtest.directive != - ContentSecurityPolicy::DirectiveType::kChildSrc && - subtest.directive != - ContentSecurityPolicy::DirectiveType::kScriptSrc) { - all_except_child_src_and_script_src_and_this - << directive_name << " http://" << directive_name << ".com; "; - } - } - CSPDirectiveList* all_except_this_list = CreateList( - all_except_this.str().c_str(), kContentSecurityPolicyHeaderTypeEnforce); - CSPDirectiveList* all_except_child_src_and_this_list = - CreateList(all_except_child_src_and_this.str().c_str(), - kContentSecurityPolicyHeaderTypeEnforce); - CSPDirectiveList* all_except_child_src_and_script_src_and_this_list = - CreateList(all_except_child_src_and_script_src_and_this.str().c_str(), - kContentSecurityPolicyHeaderTypeEnforce); + // Start the tests with all directives present. + directive_string = all_directives.str(); - switch (test.type) { - case kDefault: - sources = - all_except_this_list->OperativeDirective(test.directive)->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "default-src.com"); - break; - case kNoDefault: - EXPECT_FALSE(all_except_this_list->OperativeDirective(test.directive)); - break; - case kChildAndDefault: - sources = - all_except_this_list->OperativeDirective(test.directive)->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "child-src.com"); - sources = all_except_child_src_and_this_list - ->OperativeDirective(test.directive) - ->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "default-src.com"); - break; - case kChildAndScriptAndDefault: - sources = - all_except_this_list->OperativeDirective(test.directive)->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "child-src.com"); - sources = all_except_child_src_and_this_list - ->OperativeDirective(test.directive) - ->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "script-src.com"); - sources = all_except_child_src_and_script_src_and_this_list - ->OperativeDirective(test.directive) - ->list_; - EXPECT_EQ(sources.size(), 1u); - EXPECT_EQ(sources[0]->host_, "default-src.com"); - break; + while (test.fallback_list.size()) { + directive_list = CreateList(directive_string.c_str(), + kContentSecurityPolicyHeaderTypeEnforce); + + CSPDirective* operative_directive = + directive_list->OperativeDirective(test.directive); + + // We should have an actual directive returned here. + EXPECT_TRUE(operative_directive); + + // The OperativeDirective should be first one in the fallback chain. + EXPECT_EQ(test.fallback_list.front(), + ContentSecurityPolicy::GetDirectiveType( + operative_directive->GetName())); + + // Remove the first directive in the fallback chain from the directive + // list and continue by testing that the next one is returned until we + // have no more directives in the fallback list. + const char* current_directive_name = + ContentSecurityPolicy::GetDirectiveName(test.fallback_list.front()); + + std::stringstream current_directive; + current_directive << current_directive_name << " http://" + << current_directive_name << ".com; "; + + size_t index = directive_string.find(current_directive.str()); + directive_string.replace(index, current_directive.str().size(), ""); + + test.fallback_list.erase(test.fallback_list.begin()); } + + // After we have checked and removed all the directives in the fallback + // chain we should ensure that there is no unexpected directive outside of + // the fallback chain that is returned. + directive_list = CreateList(directive_string.c_str(), + kContentSecurityPolicyHeaderTypeEnforce); + EXPECT_FALSE(directive_list->OperativeDirective(test.directive)); } }
diff --git a/third_party/blink/renderer/core/frame/csp/source_list_directive.cc b/third_party/blink/renderer/core/frame/csp/source_list_directive.cc index 7ad92d9..1289c24 100644 --- a/third_party/blink/renderer/core/frame/csp/source_list_directive.cc +++ b/third_party/blink/renderer/core/frame/csp/source_list_directive.cc
@@ -153,8 +153,8 @@ CSPSource::WildcardDisposition host_wildcard = CSPSource::kNoWildcard; CSPSource::WildcardDisposition port_wildcard = CSPSource::kNoWildcard; - if (ParseSource(begin_source, position, scheme, host, port, path, - host_wildcard, port_wildcard)) { + if (ParseSource(begin_source, position, &scheme, &host, &port, &path, + &host_wildcard, &port_wildcard)) { // Wildcard hosts and keyword sources ('self', 'unsafe-inline', // etc.) aren't stored in m_list, but as attributes on the source // list itself. @@ -180,12 +180,12 @@ bool SourceListDirective::ParseSource( const UChar* begin, const UChar* end, - String& scheme, - String& host, - int& port, - String& path, - CSPSource::WildcardDisposition& host_wildcard, - CSPSource::WildcardDisposition& port_wildcard) { + String* scheme, + String* host, + int* port, + String* path, + CSPSource::WildcardDisposition* host_wildcard, + CSPSource::WildcardDisposition* port_wildcard) { if (begin == end) return false; @@ -245,7 +245,7 @@ } String nonce; - if (!ParseNonce(begin, end, nonce)) + if (!ParseNonce(begin, end, &nonce)) return false; if (!nonce.IsNull()) { @@ -256,7 +256,7 @@ DigestValue hash; ContentSecurityPolicyHashAlgorithm algorithm = kContentSecurityPolicyHashAlgorithmNone; - if (!ParseHash(begin, end, hash, algorithm)) + if (!ParseHash(begin, end, &hash, &algorithm)) return false; if (hash.size() > 0) { @@ -329,7 +329,7 @@ if (!ParsePort(begin_port, begin_path, port, port_wildcard)) return false; } else { - port = 0; + *port = 0; } if (begin_path != end) { @@ -345,7 +345,7 @@ // bool SourceListDirective::ParseNonce(const UChar* begin, const UChar* end, - String& nonce) { + String* nonce) { size_t nonce_length = end - begin; StringView prefix("'nonce-"); @@ -372,7 +372,7 @@ if (position + 1 != end || *position != '\'' || position == nonce_begin) return false; - nonce = String(nonce_begin, position - nonce_begin); + *nonce = String(nonce_begin, position - nonce_begin); return true; } @@ -383,8 +383,8 @@ bool SourceListDirective::ParseHash( const UChar* begin, const UChar* end, - DigestValue& hash, - ContentSecurityPolicyHashAlgorithm& hash_algorithm) { + DigestValue* hash, + ContentSecurityPolicyHashAlgorithm* hash_algorithm) { // Any additions or subtractions from this struct should also modify the // respective entries in the kAlgorithmMap array in // ContentSecurityPolicy::FillInCSPHashValues(). @@ -426,7 +426,7 @@ : sizeof(kSupportedPrefixes) / sizeof(kSupportedPrefixes[0]); StringView prefix; - hash_algorithm = kContentSecurityPolicyHashAlgorithmNone; + *hash_algorithm = kContentSecurityPolicyHashAlgorithmNone; size_t hash_length = end - begin; for (size_t i = 0; i < supportedPrefixesLength; i++) { @@ -435,12 +435,12 @@ // begin).startsWith(prefix). if (hash_length > prefix.length() && EqualIgnoringASCIICase(prefix, StringView(begin, prefix.length()))) { - hash_algorithm = supportedPrefixes[i].type; + *hash_algorithm = supportedPrefixes[i].type; break; } } - if (hash_algorithm == kContentSecurityPolicyHashAlgorithmNone) + if (*hash_algorithm == kContentSecurityPolicyHashAlgorithmNone) return true; const UChar* position = begin + prefix.length(); @@ -465,8 +465,8 @@ hash_vector); if (hash_vector.size() > kMaxDigestSize) return false; - hash.Append(reinterpret_cast<uint8_t*>(hash_vector.data()), - hash_vector.size()); + hash->Append(reinterpret_cast<uint8_t*>(hash_vector.data()), + hash_vector.size()); return true; } @@ -475,9 +475,9 @@ // bool SourceListDirective::ParseScheme(const UChar* begin, const UChar* end, - String& scheme) { + String* scheme) { DCHECK(begin <= end); - DCHECK(scheme.IsEmpty()); + DCHECK(scheme->IsEmpty()); if (begin == end) return false; @@ -492,7 +492,7 @@ if (position != end) return false; - scheme = String(begin, end - begin); + *scheme = String(begin, end - begin); return true; } @@ -504,11 +504,11 @@ bool SourceListDirective::ParseHost( const UChar* begin, const UChar* end, - String& host, - CSPSource::WildcardDisposition& host_wildcard) { + String* host, + CSPSource::WildcardDisposition* host_wildcard) { DCHECK(begin <= end); - DCHECK(host.IsEmpty()); - DCHECK(host_wildcard == CSPSource::kNoWildcard); + DCHECK(host->IsEmpty()); + DCHECK(*host_wildcard == CSPSource::kNoWildcard); if (begin == end) return false; @@ -517,7 +517,7 @@ // Parse "*" or [ "*." ]. if (SkipExactly<UChar>(position, end, '*')) { - host_wildcard = CSPSource::kHasWildcard; + *host_wildcard = CSPSource::kHasWildcard; if (position == end) { // "*" @@ -543,15 +543,15 @@ SkipWhile<UChar, IsHostCharacter>(position, end); } - host = String(host_begin, end - host_begin); + *host = String(host_begin, end - host_begin); return true; } bool SourceListDirective::ParsePath(const UChar* begin, const UChar* end, - String& path) { + String* path) { DCHECK(begin <= end); - DCHECK(path.IsEmpty()); + DCHECK(path->IsEmpty()); const UChar* position = begin; SkipWhile<UChar, IsPathComponentCharacter>(position, end); @@ -562,7 +562,7 @@ String(begin, end - begin), *position); } - path = DecodeURLEscapeSequences(String(begin, position - begin)); + *path = DecodeURLEscapeSequences(String(begin, position - begin)); DCHECK(position <= end); DCHECK(position == end || (*position == '#' || *position == '?')); @@ -574,11 +574,11 @@ bool SourceListDirective::ParsePort( const UChar* begin, const UChar* end, - int& port, - CSPSource::WildcardDisposition& port_wildcard) { + int* port, + CSPSource::WildcardDisposition* port_wildcard) { DCHECK(begin <= end); - DCHECK(!port); - DCHECK(port_wildcard == CSPSource::kNoWildcard); + DCHECK_EQ(*port, 0); + DCHECK(*port_wildcard == CSPSource::kNoWildcard); if (!SkipExactly<UChar>(begin, end, ':')) NOTREACHED(); @@ -587,8 +587,8 @@ return false; if (end - begin == 1 && *begin == '*') { - port = 0; - port_wildcard = CSPSource::kHasWildcard; + *port = 0; + *port_wildcard = CSPSource::kHasWildcard; return true; } @@ -599,8 +599,8 @@ return false; bool ok; - port = CharactersToInt(begin, end - begin, WTF::NumberParsingOptions::kNone, - &ok); + *port = CharactersToInt(begin, end - begin, WTF::NumberParsingOptions::kNone, + &ok); return ok; } @@ -676,13 +676,13 @@ const ContentSecurityPolicy::DirectiveType& type = ContentSecurityPolicy::GetDirectiveType(directive_name_); if (type != ContentSecurityPolicy::DirectiveType::kDefaultSrc && - type != ContentSecurityPolicy::DirectiveType::kStyleSrc && - type != ContentSecurityPolicy::DirectiveType::kScriptSrc) { + !ContentSecurityPolicy::IsScriptDirective(type) && + !ContentSecurityPolicy::IsStyleDirective(type)) { return false; } + return allow_inline_ && !IsHashOrNoncePresent() && - (type != ContentSecurityPolicy::DirectiveType::kScriptSrc || - !allow_dynamic_); + (!ContentSecurityPolicy::IsScriptDirective(type) || !allow_dynamic_); } HeapVector<Member<CSPSource>> SourceListDirective::GetSources( @@ -744,8 +744,8 @@ const ContentSecurityPolicy::DirectiveType type = ContentSecurityPolicy::GetDirectiveType(directive_name_); - if (type == ContentSecurityPolicy::DirectiveType::kScriptSrc || - type == ContentSecurityPolicy::DirectiveType::kStyleSrc) { + if (ContentSecurityPolicy::IsScriptDirective(type) || + ContentSecurityPolicy::IsStyleDirective(type)) { if (!allow_eval_ && allow_eval_other) return false; if (!allow_wasm_eval_ && allow_wasm_eval_other) @@ -754,13 +754,13 @@ return false; bool allow_all_inline_other = allow_inline_other && !is_hash_or_nonce_present_other && - (type != ContentSecurityPolicy::DirectiveType::kScriptSrc || + (!ContentSecurityPolicy::IsScriptDirective(type) || !allow_dynamic_other); if (!AllowAllInline() && allow_all_inline_other) return false; } - if (type == ContentSecurityPolicy::DirectiveType::kScriptSrc && + if (ContentSecurityPolicy::IsScriptDirective(type) && (allow_dynamic_ || allow_dynamic_other)) { // If `this` does not allow `strict-dynamic`, then it must be that `other` // does allow, so the result is `false`.
diff --git a/third_party/blink/renderer/core/frame/csp/source_list_directive.h b/third_party/blink/renderer/core/frame/csp/source_list_directive.h index 195c0af..2842935 100644 --- a/third_party/blink/renderer/core/frame/csp/source_list_directive.h +++ b/third_party/blink/renderer/core/frame/csp/source_list_directive.h
@@ -73,27 +73,27 @@ bool ParseSource(const UChar* begin, const UChar* end, - String& scheme, - String& host, - int& port, - String& path, - CSPSource::WildcardDisposition&, - CSPSource::WildcardDisposition&); - bool ParseScheme(const UChar* begin, const UChar* end, String& scheme); + String* scheme, + String* host, + int* port, + String* path, + CSPSource::WildcardDisposition*, + CSPSource::WildcardDisposition*); + bool ParseScheme(const UChar* begin, const UChar* end, String* scheme); static bool ParseHost(const UChar* begin, const UChar* end, - String& host, - CSPSource::WildcardDisposition&); + String* host, + CSPSource::WildcardDisposition*); bool ParsePort(const UChar* begin, const UChar* end, - int& port, - CSPSource::WildcardDisposition&); - bool ParsePath(const UChar* begin, const UChar* end, String& path); - bool ParseNonce(const UChar* begin, const UChar* end, String& nonce); + int* port, + CSPSource::WildcardDisposition*); + bool ParsePath(const UChar* begin, const UChar* end, String* path); + bool ParseNonce(const UChar* begin, const UChar* end, String* nonce); bool ParseHash(const UChar* begin, const UChar* end, - DigestValue& hash, - ContentSecurityPolicyHashAlgorithm&); + DigestValue* hash, + ContentSecurityPolicyHashAlgorithm*); void AddSourceSelf(); void AddSourceStar(); @@ -144,4 +144,4 @@ } // namespace blink -#endif +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_SOURCE_LIST_DIRECTIVE_H_
diff --git a/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc b/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc index 97987c6e..a65ec9f 100644 --- a/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc +++ b/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/core/frame/csp/source_list_directive.h" +#include <vector> + #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" @@ -1039,7 +1041,6 @@ {"http://example1.com/foo/ 'nonce-xyz' 'sha512-xyz'", "http://example1.com/foo/ 'nonce-zyx' 'nonce-xyz' 'sha512-xyz'"}, false}, - }; for (const auto& test : cases) { @@ -1375,7 +1376,7 @@ const UChar* start = characters.data(); const UChar* end = start + characters.size(); EXPECT_EQ(test.expected, - SourceListDirective::ParseHost(start, end, host, disposition)) + SourceListDirective::ParseHost(start, end, &host, &disposition)) << "SourceListDirective::parseHost fail to parse: " << test.sources; } }
diff --git a/third_party/blink/renderer/core/frame/csp/string_list_directive.cc b/third_party/blink/renderer/core/frame/csp/string_list_directive.cc new file mode 100644 index 0000000..9a099273 --- /dev/null +++ b/third_party/blink/renderer/core/frame/csp/string_list_directive.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 "third_party/blink/renderer/core/frame/csp/string_list_directive.h" + +#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" +#include "third_party/blink/renderer/platform/network/content_security_policy_parsers.h" +#include "third_party/blink/renderer/platform/wtf/text/parsing_utilities.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +StringListDirective::StringListDirective(const String& name, + const String& value, + ContentSecurityPolicy* policy) + : CSPDirective(name, value, policy) { + // TODO(orsibatiz): After policy naming rules are estabilished, do a more + // complex parsing according to that. + value.Split(' ', false, list_); +} + +bool StringListDirective::Allows(const String& string_piece) { + if (list_.IsEmpty()) + return true; + for (String p : list_) { + if (p == string_piece) { + return true; + } + } + return false; +} + +void StringListDirective::Trace(blink::Visitor* visitor) { + CSPDirective::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/frame/csp/string_list_directive.h b/third_party/blink/renderer/core/frame/csp/string_list_directive.h new file mode 100644 index 0000000..a12d12c --- /dev/null +++ b/third_party/blink/renderer/core/frame/csp/string_list_directive.h
@@ -0,0 +1,30 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_STRING_LIST_DIRECTIVE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_STRING_LIST_DIRECTIVE_H_ + +#include "base/macros.h" +#include "third_party/blink/renderer/core/frame/csp/csp_directive.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ContentSecurityPolicy; + +class CORE_EXPORT StringListDirective final : public CSPDirective { + public: + StringListDirective(const String& name, + const String& value, + ContentSecurityPolicy*); + void Trace(blink::Visitor*) override; + bool Allows(const String& string_piece); + + private: + Vector<String> list_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_STRING_LIST_DIRECTIVE_H_
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc index 0731a09..85a9123 100644 --- a/third_party/blink/renderer/core/frame/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/frame/report.h" #include "third_party/blink/renderer/core/frame/reporting_context.h" #include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/core/frame/deprecation.h b/third_party/blink/renderer/core/frame/deprecation.h index c85f2d15c..766325d 100644 --- a/third_party/blink/renderer/core/frame/deprecation.h +++ b/third_party/blink/renderer/core/frame/deprecation.h
@@ -9,7 +9,6 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css_property_names.h" #include "third_party/blink/renderer/core/frame/use_counter.h" -#include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/platform/wtf/bit_vector.h" namespace blink { @@ -17,6 +16,7 @@ enum class FeaturePolicyFeature; } // namespace mojom +class DocumentLoader; class LocalFrame; class CORE_EXPORT Deprecation {
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index 0811826..b97fd3e 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -101,7 +101,7 @@ #include "third_party/blink/renderer/core/timing/dom_window_performance.h" #include "third_party/blink/renderer/core/timing/window_performance.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/platform/bindings/exception_messages.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/scroll/scroll_types.h" @@ -1557,7 +1557,7 @@ const AtomicString& target, const String& features, ExceptionState& exception_state) { - String url = TrustedURL::GetString(stringOrUrl, document_, exception_state); + String url = GetStringFromTrustedURL(stringOrUrl, document_, exception_state); if (!exception_state.HadException()) { return openFromString(executionContext, current_window, entered_window, url, target, features, exception_state); @@ -1607,7 +1607,7 @@ LocalDOMWindow* calling_window, LocalDOMWindow* entered_window, ExceptionState& exception_state) { - String url = TrustedURL::GetString(stringOrUrl, document_, exception_state); + String url = GetStringFromTrustedURL(stringOrUrl, document_, exception_state); if (!exception_state.HadException()) { return openFromString(url, frame_name, window_features_string, calling_window, entered_window, exception_state);
diff --git a/third_party/blink/renderer/core/frame/location.cc b/third_party/blink/renderer/core/frame/location.cc index 08b34cd..23d4b30 100644 --- a/third_party/blink/renderer/core/frame/location.cc +++ b/third_party/blink/renderer/core/frame/location.cc
@@ -35,7 +35,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/core/url/dom_url_utils_read_only.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.h" @@ -121,8 +121,8 @@ LocalDOMWindow* entered_window, const USVStringOrTrustedURL& stringOrUrl, ExceptionState& exception_state) { - String url = TrustedURL::GetString(stringOrUrl, current_window->document(), - exception_state); + String url = GetStringFromTrustedURL(stringOrUrl, current_window->document(), + exception_state); if (!exception_state.HadException()) { SetLocation(url, current_window, entered_window, &exception_state); } @@ -224,8 +224,8 @@ return; } - String url = TrustedURL::GetString(stringOrUrl, current_window->document(), - exception_state); + String url = GetStringFromTrustedURL(stringOrUrl, current_window->document(), + exception_state); if (!exception_state.HadException()) { SetLocation(url, current_window, entered_window, &exception_state); } @@ -235,8 +235,8 @@ LocalDOMWindow* entered_window, const USVStringOrTrustedURL& stringOrUrl, ExceptionState& exception_state) { - String url = TrustedURL::GetString(stringOrUrl, current_window->document(), - exception_state); + String url = GetStringFromTrustedURL(stringOrUrl, current_window->document(), + exception_state); if (!exception_state.HadException()) { SetLocation(url, current_window, entered_window, &exception_state, SetLocationPolicy::kReplaceThisFrame);
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc index a8d88cdf..ae67f4e 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -161,9 +161,8 @@ { ScrollPaintPropertyNode::State state; - state.container_rect = IntRect(IntPoint(), ExcludeScrollbars(size_)); - state.contents_rect = - IntRect(IntPoint(), ExcludeScrollbars(ContentsSize())); + state.container_rect = IntRect(IntPoint(), size_); + state.contents_rect = IntRect(IntPoint(), ContentsSize()); state.user_scrollable_horizontal = UserInputScrollable(kHorizontalScrollbar);
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics.cc b/third_party/blink/renderer/core/html/anchor_element_metrics.cc index 2564492..b980a75b 100644 --- a/third_party/blink/renderer/core/html/anchor_element_metrics.cc +++ b/third_party/blink/renderer/core/html/anchor_element_metrics.cc
@@ -211,8 +211,10 @@ AnchorElementMetrics::MaybeReportClickedMetricsOnClick( const HTMLAnchorElement* anchor_element) { if (!base::FeatureList::IsEnabled(features::kRecordAnchorMetricsClicked) || - !anchor_element->Href().ProtocolIsInHTTPFamily()) + !anchor_element->Href().ProtocolIsInHTTPFamily() || + !anchor_element->GetDocument().BaseURL().ProtocolIsInHTTPFamily()) { return base::nullopt; + } auto anchor_metrics = Create(anchor_element); if (anchor_metrics.has_value()) {
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_test.cc b/third_party/blink/renderer/core/html/anchor_element_metrics_test.cc index 668c6a6..a9baf18 100644 --- a/third_party/blink/renderer/core/html/anchor_element_metrics_test.cc +++ b/third_party/blink/renderer/core/html/anchor_element_metrics_test.cc
@@ -101,6 +101,47 @@ 1); } +// Test that non-HTTP URLs are not reported. +TEST_F(AnchorElementMetricsTest, NonHTTPOnClick) { + HistogramTester histogram_tester; + + // Tests that an HTTPS page with a data anchor is not reported when the anchor + // is clicked. + SimRequest http_resource("https://example.com/", "text/html"); + LoadURL("https://example.com/"); + http_resource.Complete("<a id='anchor' href='data://google.com/'>google</a>"); + HTMLAnchorElement* anchor_element = + ToHTMLAnchorElement(GetDocument().getElementById("anchor")); + + AnchorElementMetrics::MaybeReportClickedMetricsOnClick(anchor_element); + histogram_tester.ExpectTotalCount("AnchorElementMetrics.Clicked.RatioArea", + 0); + + // Tests that a data page with an HTTPS anchor is not reported when the anchor + // is clicked. + SimRequest data_resource("data://example.com/", "text/html"); + LoadURL("data://example.com/"); + data_resource.Complete( + "<a id='anchor' href='https://google.com/'>google</a>"); + anchor_element = ToHTMLAnchorElement(GetDocument().getElementById("anchor")); + + AnchorElementMetrics::MaybeReportClickedMetricsOnClick(anchor_element); + histogram_tester.ExpectTotalCount("AnchorElementMetrics.Clicked.RatioArea", + 0); + + // Tests that an HTTPS page with an HTTPS anchor is reported when the anchor + // is clicked. + SimRequest http_resource_2("https://example.com/", "text/html"); + LoadURL("https://example.com/"); + http_resource_2.Complete( + "<a id='anchor' href='https://google.com/'>google</a>"); + anchor_element = ToHTMLAnchorElement(GetDocument().getElementById("anchor")); + + AnchorElementMetrics::MaybeReportClickedMetricsOnClick(anchor_element); + histogram_tester.ExpectTotalCount("AnchorElementMetrics.Clicked.RatioArea", + 1); +} + // The main frame contains an anchor element, which contains an image element. TEST_F(AnchorElementMetricsTest, AnchorFeatureImageLink) { SimRequest main_resource("https://example.com/", "text/html");
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index d335302c..2a3b5eb 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -142,6 +142,12 @@ TextControlElement::Trace(visitor); } +const HashSet<AtomicString>& HTMLInputElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + bool HTMLInputElement::HasPendingActivity() const { return ImageLoader() && ImageLoader()->HasPendingActivity(); }
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h index 69c7936..2d104fd 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.h +++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -59,6 +59,9 @@ ~HTMLInputElement() override; void Trace(blink::Visitor*) override; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + bool HasPendingActivity() const final; DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange);
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index 055c6aa..aa4fd491 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/core/html/html_anchor_element.h" +#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/dom/user_gesture_indicator.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" #include "third_party/blink/renderer/core/events/keyboard_event.h" @@ -42,13 +43,12 @@ #include "third_party/blink/renderer/core/loader/ping_loader.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/network/network_hints.h" #include "third_party/blink/renderer/platform/weborigin/security_policy.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" - namespace blink { using namespace HTMLNames; @@ -171,6 +171,12 @@ ContainerNode::SetActive(down); } +const HashSet<AtomicString>& HTMLAnchorElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"href"})); + return attribute_set; +} + void HTMLAnchorElement::AttributeChanged( const AttributeModificationParams& params) { HTMLElement::AttributeChanged(params);
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h index 1a1ef58..9b771fa 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.h +++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -69,6 +69,9 @@ ~HTMLAnchorElement() override; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + KURL Href() const; void SetHref(const AtomicString&); void setHref(const USVStringOrTrustedURL&, ExceptionState&);
diff --git a/third_party/blink/renderer/core/html/html_base_element.cc b/third_party/blink/renderer/core/html/html_base_element.cc index e36e2d3..4553ea5 100644 --- a/third_party/blink/renderer/core/html/html_base_element.cc +++ b/third_party/blink/renderer/core/html/html_base_element.cc
@@ -39,6 +39,11 @@ DEFINE_NODE_FACTORY(HTMLBaseElement) +const HashSet<AtomicString>& HTMLBaseElement::GetCheckedAttributeNames() const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"href"})); + return attribute_set; +} + void HTMLBaseElement::ParseAttribute( const AttributeModificationParams& params) { if (params.name == hrefAttr || params.name == targetAttr)
diff --git a/third_party/blink/renderer/core/html/html_base_element.h b/third_party/blink/renderer/core/html/html_base_element.h index 132fb47e..b6e7ec0 100644 --- a/third_party/blink/renderer/core/html/html_base_element.h +++ b/third_party/blink/renderer/core/html/html_base_element.h
@@ -36,6 +36,9 @@ public: DECLARE_NODE_FACTORY(HTMLBaseElement); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + KURL href() const; void href(USVStringOrTrustedURL&) const; void setHref(const USVStringOrTrustedURL&, ExceptionState&);
diff --git a/third_party/blink/renderer/core/html/html_embed_element.cc b/third_party/blink/renderer/core/html/html_embed_element.cc index 0a927ac..1353430 100644 --- a/third_party/blink/renderer/core/html/html_embed_element.cc +++ b/third_party/blink/renderer/core/html/html_embed_element.cc
@@ -55,6 +55,12 @@ return element; } +const HashSet<AtomicString>& HTMLEmbedElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + static inline LayoutEmbeddedContent* FindPartLayoutObject(const Node* n) { if (!n->GetLayoutObject()) n = Traversal<HTMLObjectElement>::FirstAncestor(*n);
diff --git a/third_party/blink/renderer/core/html/html_embed_element.h b/third_party/blink/renderer/core/html/html_embed_element.h index 7d308c5..9098cb8 100644 --- a/third_party/blink/renderer/core/html/html_embed_element.h +++ b/third_party/blink/renderer/core/html/html_embed_element.h
@@ -36,6 +36,9 @@ Document&, const CreateElementFlags = CreateElementFlags()); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + bool IsExposed() const; private:
diff --git a/third_party/blink/renderer/core/html/html_frame_element.cc b/third_party/blink/renderer/core/html/html_frame_element.cc index 50b8745a..69915130 100644 --- a/third_party/blink/renderer/core/html/html_frame_element.cc +++ b/third_party/blink/renderer/core/html/html_frame_element.cc
@@ -39,6 +39,12 @@ DEFINE_NODE_FACTORY(HTMLFrameElement) +const HashSet<AtomicString>& HTMLFrameElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + bool HTMLFrameElement::LayoutObjectIsNeeded(const ComputedStyle&) const { // For compatibility, frames render even when display: none is set. return ContentFrame();
diff --git a/third_party/blink/renderer/core/html/html_frame_element.h b/third_party/blink/renderer/core/html/html_frame_element.h index bba91724..083e694 100644 --- a/third_party/blink/renderer/core/html/html_frame_element.h +++ b/third_party/blink/renderer/core/html/html_frame_element.h
@@ -36,6 +36,9 @@ public: DECLARE_NODE_FACTORY(HTMLFrameElement); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + bool HasFrameBorder() const { return frame_border_; } bool NoResize() const;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index 7dcd351..f4a65c88 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -59,6 +59,13 @@ HTMLIFrameElement::~HTMLIFrameElement() = default; +const HashSet<AtomicString>& HTMLIFrameElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, + ({"src", "srcdoc"})); + return attribute_set; +} + void HTMLIFrameElement::SetCollapsed(bool collapse) { if (collapsed_by_client_ == collapse) return;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.h b/third_party/blink/renderer/core/html/html_iframe_element.h index eabe699..63627ac5 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.h +++ b/third_party/blink/renderer/core/html/html_iframe_element.h
@@ -47,6 +47,9 @@ // Support JS introspection of frame policy (e.g. feature policy) Policy* policy(); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + ParsedFeaturePolicy ConstructContainerPolicy( Vector<String>* /* messages */) const override;
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc index cb405b6f..ea00170 100644 --- a/third_party/blink/renderer/core/html/html_image_element.cc +++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -125,6 +125,12 @@ HTMLElement::Trace(visitor); } +const HashSet<AtomicString>& HTMLImageElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + void HTMLImageElement::NotifyViewportChanged() { // Re-selecting the source URL in order to pick a more fitting resource // And update the image's intrinsic dimensions when the viewport changes.
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h index 4a8ab5c..176fd89 100644 --- a/third_party/blink/renderer/core/html/html_image_element.h +++ b/third_party/blink/renderer/core/html/html_image_element.h
@@ -59,6 +59,9 @@ public: class ViewportChangeListener; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + static HTMLImageElement* Create(Document&); static HTMLImageElement* Create(Document&, const CreateElementFlags); static HTMLImageElement* CreateForJSConstructor(Document&);
diff --git a/third_party/blink/renderer/core/html/html_link_element.cc b/third_party/blink/renderer/core/html/html_link_element.cc index 16be42a..9373c7e7 100644 --- a/third_party/blink/renderer/core/html/html_link_element.cc +++ b/third_party/blink/renderer/core/html/html_link_element.cc
@@ -65,6 +65,11 @@ HTMLLinkElement::~HTMLLinkElement() = default; +const HashSet<AtomicString>& HTMLLinkElement::GetCheckedAttributeNames() const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"href"})); + return attribute_set; +} + void HTMLLinkElement::ParseAttribute( const AttributeModificationParams& params) { const QualifiedName& name = params.name;
diff --git a/third_party/blink/renderer/core/html/html_link_element.h b/third_party/blink/renderer/core/html/html_link_element.h index 4efebf4..0bdfb69 100644 --- a/third_party/blink/renderer/core/html/html_link_element.h +++ b/third_party/blink/renderer/core/html/html_link_element.h
@@ -55,6 +55,9 @@ static HTMLLinkElement* Create(Document&, const CreateElementFlags); ~HTMLLinkElement() override; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + KURL Href() const; const AtomicString& Rel() const; String Media() const { return media_; }
diff --git a/third_party/blink/renderer/core/html/html_object_element.cc b/third_party/blink/renderer/core/html/html_object_element.cc index 4ac6bf8..765ae15 100644 --- a/third_party/blink/renderer/core/html/html_object_element.cc +++ b/third_party/blink/renderer/core/html/html_object_element.cc
@@ -69,6 +69,13 @@ HTMLPlugInElement::Trace(visitor); } +const HashSet<AtomicString>& HTMLObjectElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, + ({"data", "codeBase"})); + return attribute_set; +} + LayoutEmbeddedContent* HTMLObjectElement::ExistingLayoutEmbeddedContent() const { // This will return 0 if the layoutObject is not a LayoutEmbeddedContent.
diff --git a/third_party/blink/renderer/core/html/html_object_element.h b/third_party/blink/renderer/core/html/html_object_element.h index 2d142b3..f95d78f 100644 --- a/third_party/blink/renderer/core/html/html_object_element.h +++ b/third_party/blink/renderer/core/html/html_object_element.h
@@ -47,6 +47,9 @@ ~HTMLObjectElement() override; void Trace(blink::Visitor*) override; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + const String& ClassId() const { return class_id_; } HTMLFormElement* formOwner() const override;
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc index 86b3cefd..4d4a077c 100644 --- a/third_party/blink/renderer/core/html/html_script_element.cc +++ b/third_party/blink/renderer/core/html/html_script_element.cc
@@ -51,6 +51,12 @@ return new HTMLScriptElement(document, flags); } +const HashSet<AtomicString>& HTMLScriptElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src", "text"})); + return attribute_set; +} + bool HTMLScriptElement::IsURLAttribute(const Attribute& attribute) const { return attribute.GetName() == srcAttr || HTMLElement::IsURLAttribute(attribute);
diff --git a/third_party/blink/renderer/core/html/html_script_element.h b/third_party/blink/renderer/core/html/html_script_element.h index c2ad9c0..27209610 100644 --- a/third_party/blink/renderer/core/html/html_script_element.h +++ b/third_party/blink/renderer/core/html/html_script_element.h
@@ -41,6 +41,9 @@ public: static HTMLScriptElement* Create(Document&, const CreateElementFlags); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + String text() { return TextFromChildren(); } void setText(const String&);
diff --git a/third_party/blink/renderer/core/html/html_source_element.cc b/third_party/blink/renderer/core/html/html_source_element.cc index f46ad2de..737dc30 100644 --- a/third_party/blink/renderer/core/html/html_source_element.cc +++ b/third_party/blink/renderer/core/html/html_source_element.cc
@@ -70,6 +70,12 @@ HTMLSourceElement::~HTMLSourceElement() = default; +const HashSet<AtomicString>& HTMLSourceElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + void HTMLSourceElement::CreateMediaQueryList(const AtomicString& media) { RemoveMediaQueryListListener(); if (media.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/html/html_source_element.h b/third_party/blink/renderer/core/html/html_source_element.h index e60012d8..43c74127 100644 --- a/third_party/blink/renderer/core/html/html_source_element.h +++ b/third_party/blink/renderer/core/html/html_source_element.h
@@ -44,6 +44,9 @@ DECLARE_NODE_FACTORY(HTMLSourceElement); ~HTMLSourceElement() override; + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + const AtomicString& type() const; void SetSrc(const String&); void SetSrc(const USVStringOrTrustedURL&, ExceptionState&);
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc index d890247..a3c2d7b 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc +++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -8,7 +8,10 @@ #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h" #include "third_party/blink/public/platform/autoplay.mojom-blink.h" #include "third_party/blink/public/platform/web_media_player.h" +#include "third_party/blink/public/web/web_local_frame.h" +#include "third_party/blink/public/web/web_local_frame_client.h" #include "third_party/blink/public/web/web_settings.h" +#include "third_party/blink/public/web/web_user_media_client.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element_visibility_observer.h" #include "third_party/blink/renderer/core/frame/content_settings_client.h" @@ -100,6 +103,9 @@ if (DocumentHasForceAllowFlag(document)) return true; + if (DocumentIsCapturingUserMedia(document)) + return true; + if (!document.GetFrame()) return false; @@ -155,6 +161,25 @@ AutoplayPolicy::Type::kNoUserGestureRequired; } +// static +bool AutoplayPolicy::DocumentIsCapturingUserMedia(const Document& document) { + if (!document.GetFrame()) + return false; + + WebFrame* web_frame = WebFrame::FromFrame(document.GetFrame()); + if (!web_frame) + return false; + + WebLocalFrame* frame = web_frame->ToWebLocalFrame(); + if (!frame || !frame->Client()) + return false; + + if (WebUserMediaClient* media_client = frame->Client()->UserMediaClient()) + return media_client->IsCapturing(); + + return false; +} + AutoplayPolicy::AutoplayPolicy(HTMLMediaElement* element) : locked_pending_user_gesture_(false), locked_pending_user_gesture_if_cross_origin_experiment_enabled_(true), @@ -361,9 +386,6 @@ bool AutoplayPolicy::IsGestureNeededForPlaybackIfPendingUserGestureIsLocked() const { - if (element_->GetLoadType() == WebMediaPlayer::kLoadTypeMediaStream) - return false; - // We want to allow muted video to autoplay if: // - the flag is enabled; // - Data Saver is not enabled;
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.h b/third_party/blink/renderer/core/html/media/autoplay_policy.h index c8c1ab9c8..3937336 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_policy.h +++ b/third_party/blink/renderer/core/html/media/autoplay_policy.h
@@ -55,6 +55,9 @@ // Returns true if the given |document| should autoplay muted videos. static bool DocumentShouldAutoplayMutedVideos(const Document&); + // Returns true if the given |document| is capturing user media. + static bool DocumentIsCapturingUserMedia(const Document&); + explicit AutoplayPolicy(HTMLMediaElement*); void VideoWillBeDrawnToCanvas() const;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index e534225c..17b635e 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -402,6 +402,12 @@ URLRegistry* HTMLMediaElement::media_stream_registry_ = nullptr; +const HashSet<AtomicString>& HTMLMediaElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + void HTMLMediaElement::SetMediaStreamRegistry(URLRegistry* registry) { DCHECK(!media_stream_registry_); media_stream_registry_ = registry; @@ -714,7 +720,6 @@ HTMLElement::RemovedFrom(insertion_point); if (insertion_point.InActiveDocument()) { - UpdateControlsVisibility(); if (network_state_ > kNetworkEmpty) PauseInternal(); } @@ -3820,11 +3825,8 @@ } void HTMLMediaElement::UpdateControlsVisibility() { - if (!isConnected()) { - if (GetMediaControls()) - GetMediaControls()->Hide(); + if (!isConnected()) return; - } bool native_controls = ShouldShowControls(RecordMetricsBehavior::kDoRecord);
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h index a69c53b3..9ae92b3 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.h +++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -93,6 +93,9 @@ USING_PRE_FINALIZER(HTMLMediaElement, Dispose); public: + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + static MIMETypeRegistry::SupportsType GetSupportsType(const ContentType&); enum class RecordMetricsBehavior { kDoNotRecord, kDoRecord };
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.cc b/third_party/blink/renderer/core/html/track/html_track_element.cc index 8c92636..fbe8ffce 100644 --- a/third_party/blink/renderer/core/html/track/html_track_element.cc +++ b/third_party/blink/renderer/core/html/track/html_track_element.cc
@@ -60,6 +60,12 @@ HTMLTrackElement::~HTMLTrackElement() = default; +const HashSet<AtomicString>& HTMLTrackElement::GetCheckedAttributeNames() + const { + DEFINE_STATIC_LOCAL(HashSet<AtomicString>, attribute_set, ({"src"})); + return attribute_set; +} + Node::InsertionNotificationRequest HTMLTrackElement::InsertedInto( ContainerNode& insertion_point) { DVLOG(TRACK_LOG_LEVEL) << "insertedInto";
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.h b/third_party/blink/renderer/core/html/track/html_track_element.h index bce64ce..a4f3108 100644 --- a/third_party/blink/renderer/core/html/track/html_track_element.h +++ b/third_party/blink/renderer/core/html/track/html_track_element.h
@@ -44,6 +44,9 @@ public: DECLARE_NODE_FACTORY(HTMLTrackElement); + // Returns attributes that should be checked against Trusted Types + const HashSet<AtomicString>& GetCheckedAttributeNames() const override; + const AtomicString& kind(); void setKind(const AtomicString&);
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc index 41e62337..4fae3c6 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -20,7 +20,7 @@ #include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "third_party/blink/renderer/platform/wtf/saturated_arithmetic.h" #include "third_party/skia/include/core/SkCanvas.h" -#include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" +#include "third_party/skia/include/core/SkColorSpaceXform.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkSwizzle.h"
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl index 7daf2e80..281e1cc 100644 --- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl +++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -516,6 +516,9 @@ # Close browser gracefully. command close + # Crashes browser on the main thread. + experimental command crash + # Returns version information. command getVersion returns @@ -2078,12 +2081,15 @@ optional string currentSourceURL # The url of the script (if any) that generates this node. optional string originURL + # Scroll offsets, set when this node is a Document. + optional number scrollOffsetX + optional number scrollOffsetY # Details of post layout rendered text positions. The exact layout should not be regarded as # stable and may change between versions. type InlineTextBox extends object properties - # The absolute position bounding box. + # The bounding box in document coordinates. Note that scroll offset of the document is ignored. DOM.Rect boundingBox # The starting index in characters, for this post layout textbox substring. Characters that # would be represented as a surrogate pair in UTF-16 have length 2. @@ -2097,7 +2103,7 @@ properties # The index of the related DOM node in the `domNodes` array returned by `getSnapshot`. integer domNodeIndex - # The absolute position bounding box. + # The bounding box in document coordinates. Note that scroll offset of the document is ignored. DOM.Rect boundingBox # Contents of the LayoutText, if any. optional string layoutText @@ -2172,6 +2178,9 @@ LayoutTreeSnapshot layout # The post-layout inline text nodes. TextBoxSnapshot textBoxes + # Scroll offsets. + optional number scrollOffsetX + optional number scrollOffsetY # Table containing nodes. type NodeTreeSnapshot extends object @@ -4702,6 +4711,7 @@ enum link typed + address_bar auto_bookmark auto_subframe manual_subframe
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc index 211bc57..6267cd8 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -108,7 +108,7 @@ continue; for (size_t k = 0; k < listeners->size(); ++k) { EventListener* event_listener = listeners->at(k).Callback(); - if (event_listener->GetType() != EventListener::kJSEventListenerType) + if (event_listener->IsNativeBased()) continue; // TODO(yukiy): Use a child class of blink::EventListener that is for v8 // event listeners here if it is implemented in redesigning @@ -118,8 +118,8 @@ // Optionally hide listeners from other contexts. if (!report_for_all_contexts && context != isolate->GetCurrentContext()) continue; - // getListenerObject() may cause JS in the event attribute to get - // compiled, potentially unsuccessfully. In that case, the function + // GetListenerObjectForInspector() may cause JS in the event attribute to + // get compiled, potentially unsuccessfully. In that case, the function // returns the empty handle without an exception. v8::Local<v8::Object> handler = event_listener->GetListenerObjectForInspector(execution_context);
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc index e79866f..57989e8 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
@@ -38,6 +38,7 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/line/inline_text_box.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" +#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/paint_layer_stacking_node.h" #include "third_party/blink/renderer/core/paint/paint_layer_stacking_node_iterator.h" #include "v8/include/v8-inspector.h" @@ -48,8 +49,8 @@ namespace { -std::unique_ptr<protocol::DOM::Rect> BuildRectForFloatRect( - const FloatRect& rect) { +std::unique_ptr<protocol::DOM::Rect> BuildRectForLayoutRect( + const LayoutRect& rect) { return protocol::DOM::Rect::create() .setX(rect.X()) .setY(rect.Y()) @@ -58,8 +59,8 @@ .build(); } -std::unique_ptr<protocol::Array<double>> BuildRectForFloatRect2( - const FloatRect& rect) { +std::unique_ptr<protocol::Array<double>> BuildRectForLayoutRect2( + const LayoutRect& rect) { std::unique_ptr<protocol::Array<double>> result = protocol::Array<double>::create(); result->addItem(rect.X()); @@ -69,6 +70,29 @@ return result; } +// Returns |layout_object|'s bounding box in document coordinates. +LayoutRect RectInDocument(const LayoutObject* layout_object) { + LayoutRect rect_in_absolute(layout_object->AbsoluteBoundingBoxFloatRect()); + LocalFrameView* local_frame_view = layout_object->GetFrameView(); + // Don't do frame to document coordinate transformation for layout view, + // whose bounding box is not affected by scroll offset. + if (local_frame_view && !layout_object->IsLayoutView()) + return local_frame_view->FrameToDocument(rect_in_absolute); + return rect_in_absolute; +} + +LayoutRect TextFragmentRectInDocument(const LayoutObject* layout_object, + const InlineTextBox* text_box) { + FloatRect local_coords_text_box_rect(text_box->FrameRect()); + LayoutRect absolute_coords_text_box_rect( + layout_object->LocalToAbsoluteQuad(local_coords_text_box_rect) + .BoundingBox()); + LocalFrameView* local_frame_view = layout_object->GetFrameView(); + return local_frame_view + ? local_frame_view->FrameToDocument(absolute_coords_text_box_rect) + : absolute_coords_text_box_rect; +} + Document* GetEmbeddedDocument(PaintLayer* layer) { // Documents are embedded on their own PaintLayer via a LayoutEmbeddedContent. if (layer->GetLayoutObject().IsLayoutEmbeddedContent()) { @@ -442,6 +466,11 @@ if (document->EncodingName()) value->setDocumentEncoding(document->EncodingName().Utf8().data()); value->setFrameId(IdentifiersFactory::FrameId(document->GetFrame())); + if (document->View() && document->View()->LayoutViewport()) { + auto offset = document->View()->LayoutViewport()->GetScrollOffset(); + value->setScrollOffsetX(offset.Width()); + value->setScrollOffsetY(offset.Height()); + } } else if (node->IsDocumentTypeNode()) { DocumentType* doc_type = ToDocumentType(node); value->setPublicId(doc_type->publicId()); @@ -550,6 +579,13 @@ .setLength(protocol::Array<int>::create()) .build()) .build(); + + if (document->View() && document->View()->LayoutViewport()) { + auto offset = document->View()->LayoutViewport()->GetScrollOffset(); + document_->setScrollOffsetX(offset.Width()); + document_->setScrollOffsetY(offset.Height()); + } + VisitNode2(document, -1); documents_->addItem(std::move(document_)); } @@ -804,11 +840,11 @@ if (!layout_object) return -1; - auto layout_tree_node = protocol::DOMSnapshot::LayoutTreeNode::create() - .setDomNodeIndex(node_index) - .setBoundingBox(BuildRectForFloatRect(FloatRect( - layout_object->AbsoluteBoundingBoxRect()))) - .build(); + auto layout_tree_node = + protocol::DOMSnapshot::LayoutTreeNode::create() + .setDomNodeIndex(node_index) + .setBoundingBox(BuildRectForLayoutRect(RectInDocument(layout_object))) + .build(); int style_index = GetStyleIndexForNode(node); if (style_index != -1) @@ -830,21 +866,17 @@ if (layout_object->IsText()) { LayoutText* layout_text = ToLayoutText(layout_object); layout_tree_node->setLayoutText(layout_text->GetText()); - Vector<LayoutText::TextBoxInfo> text_boxes = layout_text->GetTextBoxInfo(); - if (!text_boxes.IsEmpty()) { + if (layout_text->HasTextBoxes()) { std::unique_ptr<protocol::Array<protocol::DOMSnapshot::InlineTextBox>> inline_text_nodes = protocol::Array<protocol::DOMSnapshot::InlineTextBox>::create(); - for (const LayoutText::TextBoxInfo& text_box : text_boxes) { - FloatRect absolute_coords_text_box_rect = - layout_object->LocalToAbsoluteQuad(FloatRect(text_box.local_rect)) - .BoundingBox(); + for (const InlineTextBox* text_box : layout_text->TextBoxes()) { inline_text_nodes->addItem( protocol::DOMSnapshot::InlineTextBox::create() - .setStartCharacterIndex(text_box.dom_start_offset) - .setNumCharacters(text_box.dom_length) - .setBoundingBox( - BuildRectForFloatRect(absolute_coords_text_box_rect)) + .setStartCharacterIndex(text_box->Start()) + .setNumCharacters(text_box->Len()) + .setBoundingBox(BuildRectForLayoutRect( + TextFragmentRectInDocument(layout_object, text_box))) .build()); } layout_tree_node->setInlineTextNodes(std::move(inline_text_nodes)); @@ -867,8 +899,8 @@ int layout_index = layout_tree_snapshot->getNodeIndex()->length(); layout_tree_snapshot->getNodeIndex()->addItem(node_index); layout_tree_snapshot->getStyles()->addItem(BuildStylesForNode(node)); - layout_tree_snapshot->getBounds()->addItem(BuildRectForFloatRect2( - FloatRect(layout_object->AbsoluteBoundingBoxRect()))); + layout_tree_snapshot->getBounds()->addItem( + BuildRectForLayoutRect2(RectInDocument(layout_object))); if (layout_object->Style() && layout_object->Style()->IsStacked()) SetRare(layout_tree_snapshot->getStackingContexts(), layout_index); @@ -885,13 +917,9 @@ return layout_index; for (const InlineTextBox* text_box : layout_text->TextBoxes()) { - FloatRect local_coords_text_box_rect(text_box->FrameRect()); - FloatRect absolute_coords_text_box_rect = - layout_object->LocalToAbsoluteQuad(local_coords_text_box_rect) - .BoundingBox(); text_box_snapshot->getLayoutIndex()->addItem(layout_index); - text_box_snapshot->getBounds()->addItem( - BuildRectForFloatRect2(absolute_coords_text_box_rect)); + text_box_snapshot->getBounds()->addItem(BuildRectForLayoutRect2( + TextFragmentRectInDocument(layout_object, text_box))); text_box_snapshot->getStart()->addItem(text_box->Start()); text_box_snapshot->getLength()->addItem(text_box->Len()); }
diff --git a/third_party/blink/renderer/core/inspector/inspector_task_runner.cc b/third_party/blink/renderer/core/inspector/inspector_task_runner.cc index aeb1d507..42cdf05 100644 --- a/third_party/blink/renderer/core/inspector/inspector_task_runner.cc +++ b/third_party/blink/renderer/core/inspector/inspector_task_runner.cc
@@ -25,7 +25,7 @@ InspectorTaskRunner::InspectorTaskRunner( scoped_refptr<base::SingleThreadTaskRunner> isolate_task_runner) - : isolate_task_runner_(isolate_task_runner) {} + : isolate_task_runner_(isolate_task_runner), condition_(mutex_) {} InspectorTaskRunner::~InspectorTaskRunner() = default; @@ -88,7 +88,7 @@ if (wait_mode == kWaitForTask) { while (!disposed_ && queue_.IsEmpty()) - condition_.Wait(mutex_); + condition_.Wait(); } if (disposed_ || queue_.IsEmpty())
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_item.h b/third_party/blink/renderer/core/layout/api/line_layout_item.h index d4d92293..6a72f31 100644 --- a/third_party/blink/renderer/core/layout/api/line_layout_item.h +++ b/third_party/blink/renderer/core/layout/api/line_layout_item.h
@@ -240,9 +240,7 @@ accumulated_offset); } - SelectionState GetSelectionState() const { - return layout_object_->GetSelectionState(); - } + bool IsSelected() const { return layout_object_->IsSelected(); } // TODO(dgrogan/eae): Needed for Color::current. Can we move this somewhere? Color ResolveColor(const ComputedStyle& style_to_use,
diff --git a/third_party/blink/renderer/core/layout/api/selection_state.h b/third_party/blink/renderer/core/layout/api/selection_state.h index fea6336..4e7694fb9 100644 --- a/third_party/blink/renderer/core/layout/api/selection_state.h +++ b/third_party/blink/renderer/core/layout/api/selection_state.h
@@ -32,10 +32,6 @@ kContain }; -inline bool IsSelected(const SelectionState state) { - return state != SelectionState::kNone && state != SelectionState::kContain; -} - CORE_EXPORT std::ostream& operator<<(std::ostream&, const SelectionState); } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index 19bec297..03b6c3f4 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1336,9 +1336,14 @@ void LayoutBlock::ComputeIntrinsicLogicalWidths( LayoutUnit& min_logical_width, LayoutUnit& max_logical_width) const { + int scrollbar_width = ScrollbarLogicalWidth(); + // Size-contained elements don't consider their contents for preferred sizing. - if (ShouldApplySizeContainment()) + if (ShouldApplySizeContainment()) { + max_logical_width = LayoutUnit(scrollbar_width); + min_logical_width = LayoutUnit(scrollbar_width); return; + } if (ChildrenInline()) { // FIXME: Remove this const_cast. @@ -1363,7 +1368,6 @@ LayoutUnit(table_cell_width.Value()))); } - int scrollbar_width = ScrollbarLogicalWidth(); max_logical_width += scrollbar_width; min_logical_width += scrollbar_width; }
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc index 5eca2c4..0ccc2f3 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
@@ -25,7 +25,6 @@ #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" #include "third_party/blink/renderer/core/layout/api/line_layout_item.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/bidi_run_for_line.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_ruby_run.h"
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index ee27e2ff..ea4f625 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2409,8 +2409,7 @@ } bool LayoutBox::PaintedOutputOfObjectHasNoEffectRegardlessOfSize() const { - if (HasNonCompositedScrollbars() || - GetSelectionState() != SelectionState::kNone || + if (HasNonCompositedScrollbars() || IsSelected() || HasBoxDecorationBackground() || StyleRef().HasBoxDecorations() || StyleRef().HasVisualOverflowingEffect()) return false; @@ -2652,9 +2651,10 @@ DISABLE_CFI_PERF void LayoutBox::ComputeLogicalWidth( LogicalExtentComputedValues& computed_values) const { - computed_values.extent_ = ShouldApplySizeContainment() - ? BorderAndPaddingLogicalWidth() - : LogicalWidth(); + computed_values.extent_ = + ShouldApplySizeContainment() + ? BorderAndPaddingLogicalWidth() + ScrollbarLogicalWidth() + : LogicalWidth(); computed_values.position_ = LogicalLeft(); computed_values.margins_.start_ = MarginStart(); computed_values.margins_.end_ = MarginEnd(); @@ -3135,9 +3135,10 @@ void LayoutBox::ComputeLogicalHeight( LogicalExtentComputedValues& computed_values) const { - LayoutUnit height = ShouldApplySizeContainment() - ? BorderAndPaddingLogicalHeight() - : LogicalHeight(); + LayoutUnit height = + ShouldApplySizeContainment() + ? BorderAndPaddingLogicalHeight() + ScrollbarLogicalHeight() + : LogicalHeight(); ComputeLogicalHeight(height, LogicalTop(), computed_values); }
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.cc b/third_party/blink/renderer/core/layout/layout_flexible_box.cc index 88ad76d..9974948 100644 --- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc +++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -1562,8 +1562,10 @@ continue; ItemPosition position = flex_item.Alignment(); - if (position == ItemPosition::kStretch) - ApplyStretchAlignmentToChild(flex_item, line_cross_axis_extent); + if (position == ItemPosition::kStretch) { + ComputeStretchedSizeForChild(flex_item, line_cross_axis_extent); + ApplyStretchAlignmentToChild(flex_item); + } LayoutUnit available_space = flex_item.AvailableAlignmentSpace(line_cross_axis_extent); LayoutUnit offset = AlignmentOffset( @@ -1601,9 +1603,10 @@ } } -void LayoutFlexibleBox::ApplyStretchAlignmentToChild( +void LayoutFlexibleBox::ComputeStretchedSizeForChild( FlexItem& flex_item, LayoutUnit line_cross_axis_extent) { + DCHECK_EQ(flex_item.Alignment(), ItemPosition::kStretch); LayoutBox& child = *flex_item.box; if (!flex_item.HasOrthogonalFlow() && child.StyleRef().LogicalHeight().IsAuto()) { @@ -1611,13 +1614,26 @@ std::max(child.BorderAndPaddingLogicalHeight(), line_cross_axis_extent - flex_item.CrossAxisMarginExtent()); DCHECK(!child.NeedsLayout()); - LayoutUnit desired_logical_height = child.ConstrainLogicalHeightByMinMax( + flex_item.cross_axis_size = child.ConstrainLogicalHeightByMinMax( stretched_logical_height, child.IntrinsicContentLogicalHeight()); - flex_item.cross_axis_size = desired_logical_height; + } else if (flex_item.HasOrthogonalFlow() && + child.StyleRef().LogicalWidth().IsAuto()) { + LayoutUnit child_width = + (line_cross_axis_extent - flex_item.CrossAxisMarginExtent()) + .ClampNegativeToZero(); + flex_item.cross_axis_size = child.ConstrainLogicalWidthByMinMax( + child_width, CrossAxisContentExtent(), this); + } +} +void LayoutFlexibleBox::ApplyStretchAlignmentToChild(FlexItem& flex_item) { + LayoutBox& child = *flex_item.box; + if (!flex_item.HasOrthogonalFlow() && + child.StyleRef().LogicalHeight().IsAuto()) { // FIXME: Can avoid laying out here in some cases. See // https://webkit.org/b/87905. - bool child_needs_relayout = desired_logical_height != child.LogicalHeight(); + bool child_needs_relayout = + flex_item.cross_axis_size != child.LogicalHeight(); if (child.IsLayoutBlock() && ToLayoutBlock(child).HasPercentHeightDescendants() && !CanAvoidLayoutForNGChild(child)) { @@ -1628,7 +1644,7 @@ child_needs_relayout = relaid_out_children_.Contains(&child); } if (child_needs_relayout || !child.HasOverrideLogicalHeight()) - child.SetOverrideLogicalHeight(desired_logical_height); + child.SetOverrideLogicalHeight(flex_item.cross_axis_size); if (child_needs_relayout) { child.SetLogicalHeight(LayoutUnit()); // We cache the child's intrinsic content logical height to avoid it being @@ -1644,15 +1660,8 @@ } } else if (flex_item.HasOrthogonalFlow() && child.StyleRef().LogicalWidth().IsAuto()) { - LayoutUnit child_width = - (line_cross_axis_extent - flex_item.CrossAxisMarginExtent()) - .ClampNegativeToZero(); - child_width = child.ConstrainLogicalWidthByMinMax( - child_width, CrossAxisContentExtent(), this); - flex_item.cross_axis_size = child_width; - - if (child_width != child.LogicalWidth()) { - child.SetOverrideLogicalWidth(child_width); + if (flex_item.cross_axis_size != child.LogicalWidth()) { + child.SetOverrideLogicalWidth(flex_item.cross_axis_size); child.ForceChildLayout(); } }
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.h b/third_party/blink/renderer/core/layout/layout_flexible_box.h index b7e78ab..cf515f1 100644 --- a/third_party/blink/renderer/core/layout/layout_flexible_box.h +++ b/third_party/blink/renderer/core/layout/layout_flexible_box.h
@@ -187,8 +187,11 @@ LayoutUnit available_free_space); void AlignFlexLines(Vector<FlexLine>&); void AlignChildren(Vector<FlexLine>&); - void ApplyStretchAlignmentToChild(FlexItem& child, + // Computes the cross-axis size that a stretched child should have and stores + // it in child.cross_axis_size. + void ComputeStretchedSizeForChild(FlexItem& child, LayoutUnit line_cross_axis_extent); + void ApplyStretchAlignmentToChild(FlexItem& child); void FlipForRightToLeftColumn(const Vector<FlexLine>& line_contexts); void FlipForWrapReverse(const Vector<FlexLine>&, LayoutUnit cross_axis_start_edge);
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 5b7fca21..2bd9795 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1247,7 +1247,7 @@ return rect; } -LayoutRect LayoutInline::AbsoluteVisualRect() const { +LayoutRect LayoutInline::VisualRectInDocument() const { if (!Continuation()) { LayoutRect rect = VisualOverflowRect(); MapToVisualRectInAncestorSpace(View(), rect);
diff --git a/third_party/blink/renderer/core/layout/layout_inline.h b/third_party/blink/renderer/core/layout/layout_inline.h index 026a6943..4dd643de 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.h +++ b/third_party/blink/renderer/core/layout/layout_inline.h
@@ -314,7 +314,7 @@ LayoutUnit OffsetWidth() const final { return LinesBoundingBox().Width(); } LayoutUnit OffsetHeight() const final { return LinesBoundingBox().Height(); } - LayoutRect AbsoluteVisualRect() const override; + LayoutRect VisualRectInDocument() const override; // This method differs from visualOverflowRect in that it doesn't include the // rects for culled inline boxes, which aren't necessary for paint
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 84504274..b1c508ee 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -1598,7 +1598,7 @@ SetShouldDoFullPaintInvalidation(); } -LayoutRect LayoutObject::AbsoluteVisualRect() const { +LayoutRect LayoutObject::VisualRectInDocument() const { LayoutRect rect = LocalVisualRect(); MapToVisualRectInAncestorSpace(View(), rect); return rect; @@ -2302,10 +2302,11 @@ void LayoutObject::ApplyFirstLineChanges(const ComputedStyle& old_style) { if (old_style.HasPseudoStyle(kPseudoIdFirstLine)) { - scoped_refptr<ComputedStyle> old_pseudo_style = + scoped_refptr<const ComputedStyle> old_pseudo_style = old_style.GetCachedPseudoStyle(kPseudoIdFirstLine); if (StyleRef().HasPseudoStyle(kPseudoIdFirstLine) && old_pseudo_style) { - scoped_refptr<ComputedStyle> new_pseudo_style = UncachedFirstLineStyle(); + scoped_refptr<const ComputedStyle> new_pseudo_style = + UncachedFirstLineStyle(); if (new_pseudo_style) { FirstLineStyleDidChange(*old_pseudo_style, *new_pseudo_style); return; @@ -3417,10 +3418,10 @@ enum StyleCacheState { kCached, kUncached }; -static scoped_refptr<ComputedStyle> FirstLineStyleForCachedUncachedType( +static scoped_refptr<const ComputedStyle> FirstLineStyleForCachedUncachedType( StyleCacheState type, const LayoutObject* layout_object, - ComputedStyle* style) { + const ComputedStyle* style) { DCHECK(layout_object); const LayoutObject* layout_object_for_first_line_style = layout_object; if (layout_object->IsBeforeOrAfterContent()) @@ -3471,7 +3472,8 @@ return nullptr; } -scoped_refptr<ComputedStyle> LayoutObject::UncachedFirstLineStyle() const { +scoped_refptr<const ComputedStyle> LayoutObject::UncachedFirstLineStyle() + const { if (!GetDocument().GetStyleEngine().UsesFirstLineRules()) return nullptr; @@ -3480,17 +3482,18 @@ return FirstLineStyleForCachedUncachedType(kUncached, this, style_.get()); } -ComputedStyle* LayoutObject::CachedFirstLineStyle() const { +const ComputedStyle* LayoutObject::CachedFirstLineStyle() const { DCHECK(GetDocument().GetStyleEngine().UsesFirstLineRules()); - if (scoped_refptr<ComputedStyle> style = FirstLineStyleForCachedUncachedType( - kCached, IsText() ? Parent() : this, style_.get())) + if (scoped_refptr<const ComputedStyle> style = + FirstLineStyleForCachedUncachedType( + kCached, IsText() ? Parent() : this, style_.get())) return style.get(); return style_.get(); } -ComputedStyle* LayoutObject::GetCachedPseudoStyle( +const ComputedStyle* LayoutObject::GetCachedPseudoStyle( PseudoId pseudo, const ComputedStyle* parent_style) const { DCHECK_NE(pseudo, kPseudoIdBefore); @@ -3955,7 +3958,8 @@ } void LayoutObject::InvalidateSelectedChildrenOnStyleChange() { - // setSelectionState() propagates the state up the containing block chain to + // LayoutSelection::Commit() propagates the state up the containing node + // chain to // tell if a block contains selected nodes or not. If this layout object is // not a block, we need to get the selection state from the containing block // to tell if we have any selected node children. @@ -3963,7 +3967,7 @@ IsLayoutBlock() ? ToLayoutBlock(this) : ContainingBlock(); if (!block) return; - if (!block->HasSelectedChildren()) + if (!block->IsSelected()) return; // ::selection style only applies to direct selection leaf children of the @@ -3973,7 +3977,7 @@ child = child->NextSibling()) { if (!child->CanBeSelectionLeaf()) continue; - if (child->GetSelectionState() == SelectionState::kNone) + if (!child->IsSelected()) continue; if (RuntimeEnabledFeatures::LayoutNGEnabled()) { child->SetShouldDoFullPaintInvalidation(
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 658b8a4..c5d5a059 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -949,7 +949,7 @@ // The pseudo element style can be cached or uncached. Use the cached method // if the pseudo element doesn't respect any pseudo classes (and therefore // has no concept of changing state). - ComputedStyle* GetCachedPseudoStyle( + const ComputedStyle* GetCachedPseudoStyle( PseudoId, const ComputedStyle* parent_style = nullptr) const; scoped_refptr<ComputedStyle> GetUncachedPseudoStyle( @@ -1491,9 +1491,9 @@ void InvalidatePaintRectangle(const LayoutRect&); // Returns the rect that should have paint invalidated whenever this object - // changes. The rect is in the view's coordinate space. This method deals with - // outlines and overflow. - virtual LayoutRect AbsoluteVisualRect() const; + // changes. The rect is in the coordinate space of the document's scrolling + // contents. This method deals with outlines and overflow. + virtual LayoutRect VisualRectInDocument() const; // Returns the rect that should have raster invalidated whenever this object // changes. The rect is in the object's local coordinate space. This is for @@ -1544,7 +1544,7 @@ // Do a rect-based hit test with this object as the stop node. HitTestResult HitTestForOcclusion(const LayoutRect&) const; HitTestResult HitTestForOcclusion() const { - return HitTestForOcclusion(AbsoluteVisualRect()); + return HitTestForOcclusion(VisualRectInDocument()); } // Return the offset to the column in which the specified point (in @@ -1584,7 +1584,7 @@ LayoutRect AbsoluteSelectionRect() const; bool CanBeSelectionLeaf() const; - bool HasSelectedChildren() const { + bool IsSelected() const { return GetSelectionState() != SelectionState::kNone; } @@ -2278,7 +2278,7 @@ private: // Used only by applyFirstLineChanges to get a first line style based off of a // given new style, without accessing the cache. - scoped_refptr<ComputedStyle> UncachedFirstLineStyle() const; + scoped_refptr<const ComputedStyle> UncachedFirstLineStyle() const; // Adjusts a visual rect in the space of |visual_rect| to be in the space of // the |paint_invalidation_container|, if needed. They can be different only @@ -2326,7 +2326,7 @@ LayoutFlowThread* LocateFlowThreadContainingBlock() const; void RemoveFromLayoutFlowThreadRecursive(LayoutFlowThread*); - ComputedStyle* CachedFirstLineStyle() const; + const ComputedStyle* CachedFirstLineStyle() const; StyleDifference AdjustStyleDifference(StyleDifference) const; void RemoveShapeImageClient(ShapeValue*);
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc index 6e368e9..c88149e 100644 --- a/third_party/blink/renderer/core/layout/layout_replaced.cc +++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -975,7 +975,7 @@ } LayoutRect LayoutReplaced::LocalSelectionRect() const { - if (GetSelectionState() == SelectionState::kNone) + if (!IsSelected()) return LayoutRect(); if (IsInline()) {
diff --git a/third_party/blink/renderer/core/layout/layout_scrollbar.cc b/third_party/blink/renderer/core/layout/layout_scrollbar.cc index ac5ed054..33ce179 100644 --- a/third_party/blink/renderer/core/layout/layout_scrollbar.cc +++ b/third_party/blink/renderer/core/layout/layout_scrollbar.cc
@@ -90,9 +90,10 @@ ScrollbarOrientation orientation, const LayoutBox& enclosing_box, const LayoutObject& style_source) { - scoped_refptr<ComputedStyle> part_style = style_source.GetUncachedPseudoStyle( - PseudoStyleRequest(kPseudoIdScrollbar, nullptr, kScrollbarBGPart), - style_source.Style()); + scoped_refptr<const ComputedStyle> part_style = + style_source.GetUncachedPseudoStyle( + PseudoStyleRequest(kPseudoIdScrollbar, nullptr, kScrollbarBGPart), + style_source.Style()); if (orientation == kHorizontalScrollbar) { return LayoutScrollbarPart::ComputeScrollbarHeight( enclosing_box.ClientHeight().ToInt(), part_style.get());
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 25e07cd..32dfd618 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -2028,7 +2028,7 @@ LayoutRect LayoutText::LocalSelectionRect() const { DCHECK(!NeedsLayout()); - if (GetSelectionState() == SelectionState::kNone) + if (!IsSelected()) return LayoutRect(); LayoutBlock* cb = ContainingBlock(); if (!cb)
diff --git a/third_party/blink/renderer/core/layout/layout_text_control.cc b/third_party/blink/renderer/core/layout/layout_text_control.cc index 42e0196..50cc9015 100644 --- a/third_party/blink/renderer/core/layout/layout_text_control.cc +++ b/third_party/blink/renderer/core/layout/layout_text_control.cc
@@ -67,7 +67,6 @@ inner_editor_layout_object->InvalidateSelectedChildrenOnStyleChange(); } } - GetTextControlElement()->UpdatePlaceholderVisibility(); } int LayoutTextControl::TextBlockLogicalHeight() const {
diff --git a/third_party/blink/renderer/core/layout/layout_text_fragment.cc b/third_party/blink/renderer/core/layout/layout_text_fragment.cc index 5e37b07..98b9b00 100644 --- a/third_party/blink/renderer/core/layout/layout_text_fragment.cc +++ b/third_party/blink/renderer/core/layout/layout_text_fragment.cc
@@ -70,7 +70,7 @@ void LayoutTextFragment::WillBeDestroyed() { if (is_remaining_text_layout_object_ && first_letter_pseudo_element_) - first_letter_pseudo_element_->SetRemainingTextLayoutObject(nullptr); + first_letter_pseudo_element_->ClearRemainingTextLayoutObject(); first_letter_pseudo_element_ = nullptr; LayoutText::WillBeDestroyed(); }
diff --git a/third_party/blink/renderer/core/layout/line/ellipsis_box.h b/third_party/blink/renderer/core/layout/line/ellipsis_box.h index d971a1a1..d5f4370 100644 --- a/third_party/blink/renderer/core/layout/line/ellipsis_box.h +++ b/third_party/blink/renderer/core/layout/line/ellipsis_box.h
@@ -20,7 +20,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LINE_ELLIPSIS_BOX_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LINE_ELLIPSIS_BOX_H_ -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/line/inline_box.h" namespace blink {
diff --git a/third_party/blink/renderer/core/layout/line/inline_box.cc b/third_party/blink/renderer/core/layout/line/inline_box.cc index abf45f2..420f900 100644 --- a/third_party/blink/renderer/core/layout/line/inline_box.cc +++ b/third_party/blink/renderer/core/layout/line/inline_box.cc
@@ -21,7 +21,6 @@ #include "third_party/blink/renderer/core/layout/api/line_layout_api_shim.h" #include "third_party/blink/renderer/core/layout/api/line_layout_block_flow.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/hit_test_location.h" #include "third_party/blink/renderer/core/layout/layout_block_flow.h" #include "third_party/blink/renderer/core/layout/line/inline_flow_box.h" @@ -305,7 +304,7 @@ } bool InlineBox::IsSelected() const { - return GetLineLayoutItem().GetSelectionState() != SelectionState::kNone; + return GetLineLayoutItem().IsSelected(); } bool InlineBox::CanAccommodateEllipsis(bool ltr,
diff --git a/third_party/blink/renderer/core/layout/line/inline_text_box.cc b/third_party/blink/renderer/core/layout/line/inline_text_box.cc index bd3cc1d..2b0157f7 100644 --- a/third_party/blink/renderer/core/layout/line/inline_text_box.cc +++ b/third_party/blink/renderer/core/layout/line/inline_text_box.cc
@@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/layout/api/line_layout_br.h" #include "third_party/blink/renderer/core/layout/api/line_layout_ruby_run.h" #include "third_party/blink/renderer/core/layout/api/line_layout_ruby_text.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" #include "third_party/blink/renderer/core/layout/line/abstract_inline_text_box.h" #include "third_party/blink/renderer/core/layout/line/ellipsis_box.h"
diff --git a/third_party/blink/renderer/core/layout/line/inline_text_box.h b/third_party/blink/renderer/core/layout/line/inline_text_box.h index 3ad1e81..6a8cd02c 100644 --- a/third_party/blink/renderer/core/layout/line/inline_text_box.h +++ b/third_party/blink/renderer/core/layout/line/inline_text_box.h
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/api/line_layout_text.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/line/inline_box.h" #include "third_party/blink/renderer/platform/text/text_run.h" #include "third_party/blink/renderer/platform/text/truncation.h"
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc index 585460a..91906eb 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
@@ -547,21 +547,18 @@ // |pending_descendants|. LayoutUnit baseline_shift; if (!box->pending_descendants.IsEmpty()) { + NGLineHeightMetrics max = box->MetricsForTopAndBottomAlign(); for (NGPendingPositions& child : box->pending_descendants) { - if (child.metrics.IsEmpty()) { - // This can happen with boxes with no content in quirks mode - child.metrics = NGLineHeightMetrics(LayoutUnit(), LayoutUnit()); - } + // In quirks mode, metrics is empty if no content. + if (child.metrics.IsEmpty()) + child.metrics = NGLineHeightMetrics::Zero(); switch (child.vertical_align) { case EVerticalAlign::kTextTop: DCHECK(!box->text_metrics.IsEmpty()); baseline_shift = child.metrics.ascent + box->text_top; break; case EVerticalAlign::kTop: - if (box->metrics.IsEmpty()) - baseline_shift = child.metrics.ascent; - else - baseline_shift = child.metrics.ascent - box->metrics.ascent; + baseline_shift = child.metrics.ascent - max.ascent; break; case EVerticalAlign::kTextBottom: if (const SimpleFontData* font_data = @@ -574,10 +571,7 @@ NOTREACHED(); FALLTHROUGH; case EVerticalAlign::kBottom: - if (box->metrics.IsEmpty()) - baseline_shift = -child.metrics.descent; - else - baseline_shift = box->metrics.descent - child.metrics.descent; + baseline_shift = max.descent - child.metrics.descent; break; default: NOTREACHED(); @@ -666,4 +660,34 @@ return kPositionNotPending; } +NGLineHeightMetrics NGInlineBoxState::MetricsForTopAndBottomAlign() const { + // |metrics| is the bounds of "aligned subtree", that is, bounds of + // descendants that are not 'vertical-align: top' nor 'bottom'. + // https://drafts.csswg.org/css2/visudet.html#propdef-vertical-align + NGLineHeightMetrics box = metrics; + + // In quirks mode, metrics is empty if no content. + if (box.IsEmpty()) + box = NGLineHeightMetrics::Zero(); + + // If the height of a box that has 'vertical-align: top' or 'bottom' exceeds + // the height of the "aligned subtree", align the edge to the "aligned + // subtree" and extend the other edge. + NGLineHeightMetrics max = box; + for (const NGPendingPositions& child : pending_descendants) { + if ((child.vertical_align == EVerticalAlign::kTop || + child.vertical_align == EVerticalAlign::kBottom) && + child.metrics.LineHeight() > max.LineHeight()) { + if (child.vertical_align == EVerticalAlign::kTop) { + max = NGLineHeightMetrics(box.ascent, + child.metrics.LineHeight() - box.ascent); + } else if (child.vertical_align == EVerticalAlign::kBottom) { + max = NGLineHeightMetrics(child.metrics.LineHeight() - box.descent, + box.descent); + } + } + } + return max; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h index a155e88e..154cbee 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
@@ -97,6 +97,10 @@ // Text with different font or vertical-align needs to be wrapped with an // inline box. bool CanAddTextOfStyle(const ComputedStyle&) const; + + // Compute the metrics for when 'vertical-align' is 'top' and 'bottom' from + // |pending_descendants|. + NGLineHeightMetrics MetricsForTopAndBottomAlign() const; }; // Represents the inline tree structure. This class provides:
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h index 30cfe7d..e107aef2 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -152,7 +152,7 @@ // Add a child. Accepts all constructor arguments for |Child|. template <class... Args> void AddChild(Args&&... args) { - children_.push_back(Child(std::forward<Args>(args)...)); + children_.emplace_back(std::forward<Args>(args)...); } void InsertChild(unsigned, scoped_refptr<NGLayoutResult>,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h index e5ef21b..eb12f17 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h
@@ -22,6 +22,9 @@ : ascent(LayoutUnit::Min()), descent(LayoutUnit::Min()) {} NGLineHeightMetrics(LayoutUnit initial_ascent, LayoutUnit initial_descent) : ascent(initial_ascent), descent(initial_descent) {} + static NGLineHeightMetrics Zero() { + return NGLineHeightMetrics(LayoutUnit(), LayoutUnit()); + } // Compute from ComputedStyle, using the font metrics of the prikmary font. // The leading is not included.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc index 0fe36c7..5e9d7da 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -181,7 +181,7 @@ LayoutUnit float_right_inline_size = input.float_right_inline_size; NGBoxStrut border_padding = ComputeBorders(ConstraintSpace(), Node()) + - ComputePadding(ConstraintSpace(), Node()); + ComputePadding(ConstraintSpace(), Style()); LayoutUnit extrinsic_block_size = ComputeBlockSizeForFragment( ConstraintSpace(), Style(), NGSizeIndefinite, border_padding); if (extrinsic_block_size != NGSizeIndefinite) { @@ -353,7 +353,8 @@ scoped_refptr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() { NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node()); - NGBoxStrut padding = ComputePadding(ConstraintSpace(), Node()); + NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style()) + + ComputeIntrinsicPadding(ConstraintSpace(), Node()); border_padding_ = borders + padding; NGBoxStrut scrollbars = Node().GetScrollbarSizes(); border_scrollbar_padding_ = ConstraintSpace().IsAnonymous() @@ -363,23 +364,10 @@ NGLogicalSize border_box_size = CalculateBorderBoxSize( ConstraintSpace(), Node(), CalculateDefaultBlockSize(), border_padding_); - // Our calculated block-axis size may be indefinite at this point. - // If so, just leave the size as NGSizeIndefinite instead of subtracting - // borders and padding. - NGLogicalSize adjusted_size = + child_available_size_ = CalculateContentBoxSize(border_box_size, border_scrollbar_padding_); - - child_available_size_ = adjusted_size; - - // Anonymous constraint spaces are auto-sized. Don't let that affect - // block-axis percentage resolution. - if (ConstraintSpace().IsAnonymous() || Node().IsAnonymousBlock()) - child_percentage_size_ = ConstraintSpace().PercentageResolutionSize(); - else - child_percentage_size_ = adjusted_size; - if (ConstraintSpace().IsFixedSizeBlock() && - !ConstraintSpace().FixedSizeBlockIsDefinite()) - child_percentage_size_.block_size = NGSizeIndefinite; + child_percentage_size_ = CalculateChildPercentageSize( + ConstraintSpace(), Node(), child_available_size_); container_builder_.SetInlineSize(border_box_size.inline_size); container_builder_.SetBfcLineOffset( @@ -1795,7 +1783,7 @@ // correctly. if (!child.CreatesNewFormattingContext()) { NGBoxStrut child_border_padding = - ComputeBorders(*space, child) + ComputePadding(*space, child); + ComputeBorders(*space, child) + ComputePadding(*space, child.Style()); LayoutUnit child_inline_size = ComputeInlineSizeForFragment(*space, child, child_border_padding); @@ -1814,19 +1802,8 @@ const base::Optional<LayoutUnit> floats_bfc_block_offset) { NGConstraintSpaceBuilder space_builder(ConstraintSpace()); - NGLogicalSize available_size(child_available_size); - NGLogicalSize percentage_size(child_percentage_size_); - if (percentage_size.block_size == NGSizeIndefinite && - Node().GetDocument().InQuirksMode()) { - // Implement percentage height calculation quirk - // https://quirks.spec.whatwg.org/#the-percentage-height-calculation-quirk - if (!Style().IsDisplayTableType() && !Style().HasOutOfFlowPosition()) { - percentage_size.block_size = - constraint_space_.PercentageResolutionSize().block_size; - } - } - space_builder.SetAvailableSize(available_size) - .SetPercentageResolutionSize(percentage_size); + space_builder.SetAvailableSize(child_available_size) + .SetPercentageResolutionSize(child_percentage_size_); if (NGBaseline::ShouldPropagateBaselines(child)) space_builder.AddBaselineRequests(ConstraintSpace().BaselineRequests());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc index 54f9aa4..ff9e3aef 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -73,7 +73,8 @@ scoped_refptr<NGLayoutResult> NGColumnLayoutAlgorithm::Layout() { NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node()); NGBoxStrut scrollbars = Node().GetScrollbarSizes(); - NGBoxStrut padding = ComputePadding(ConstraintSpace(), Node()); + NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style()) + + ComputeIntrinsicPadding(ConstraintSpace(), Node()); NGBoxStrut border_scrollbar_padding = borders + scrollbars + padding; NGLogicalSize border_box_size = CalculateBorderBoxSize(ConstraintSpace(), Node());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc index 2d72575..a65372a2 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/core/layout/intrinsic_sizing_info.h" #include "third_party/blink/renderer/core/layout/layout_replaced.h" +#include "third_party/blink/renderer/core/layout/layout_table_cell.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/min_max_size.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_logical_size.h" @@ -102,6 +103,10 @@ return ToLayoutNGListMarker(box_)->NeedsOccupyWholeLine(); } +bool NGLayoutInputNode::IsTableCell() const { + return IsBlock() && box_->IsTableCell(); +} + bool NGLayoutInputNode::IsAnonymousBlock() const { return box_->IsAnonymousBlock(); } @@ -173,6 +178,16 @@ LayoutUnit(legacy_sizing_info.aspect_ratio.Height())); } +LayoutUnit NGLayoutInputNode::IntrinsicPaddingBlockStart() const { + DCHECK(IsTableCell()); + return LayoutUnit(ToLayoutTableCell(box_)->IntrinsicPaddingBefore()); +} + +LayoutUnit NGLayoutInputNode::IntrinsicPaddingBlockEnd() const { + DCHECK(IsTableCell()); + return LayoutUnit(ToLayoutTableCell(box_)->IntrinsicPaddingAfter()); +} + NGLayoutInputNode NGLayoutInputNode::NextSibling() { return IsInline() ? ToNGInlineNode(*this).NextSibling() : ToNGBlockNode(*this).NextSibling();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h index f50388f..5a44979 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
@@ -71,6 +71,7 @@ bool IsListItem() const; bool IsListMarker() const; bool ListMarkerOccupiesWholeLine() const; + bool IsTableCell() const; bool IsAnonymousBlock() const; // If the node is a quirky container for margin collapsing, see: @@ -98,6 +99,9 @@ base::Optional<LayoutUnit>* computed_block_size, NGLogicalSize* aspect_ratio) const; + LayoutUnit IntrinsicPaddingBlockStart() const; + LayoutUnit IntrinsicPaddingBlockEnd() const; + // Returns the next sibling. NGLayoutInputNode NextSibling();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc index 8c37899f..eb017f15 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -737,6 +737,21 @@ style.IsFlippedLinesWritingMode()); } +NGBoxStrut ComputeIntrinsicPadding(const NGConstraintSpace& constraint_space, + const NGLayoutInputNode node) { + if (constraint_space.IsAnonymous() || !node.IsTableCell()) + return NGBoxStrut(); + + // At the moment we just access the values set by the parent table layout. + // Once we have a NGTableLayoutAlgorithm this should pass the intrinsic + // padding via the constraint space object. + + // TODO(karlo): intrinsic padding can sometimes be negative; that seems + // insane, but works in the old code; in NG it trips DCHECKs. + return {LayoutUnit(), LayoutUnit(), node.IntrinsicPaddingBlockStart(), + node.IntrinsicPaddingBlockEnd()}; +} + NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space, const ComputedStyle& style) { // If we are producing an anonymous fragment (e.g. a column) we shouldn't @@ -756,27 +771,6 @@ return padding; } -NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space, - const NGLayoutInputNode node) { - // If we are producing an anonymous fragment (e.g. a column), it has no - // borders, padding or scrollbars. Using the ones from the container can only - // cause trouble. - if (constraint_space.IsAnonymous()) - return NGBoxStrut(); - - NGBoxStrut padding = ComputePadding(constraint_space, node.Style()); - if (node.GetLayoutBox()->IsTableCell()) { - // Use values calculated by the table layout code - const LayoutTableCell* cell = ToLayoutTableCell(node.GetLayoutBox()); - // TODO(karlo): intrinsic padding can sometimes be negative; that - // seems insane, but works in the old code; in NG it trips - // DCHECKs. - padding.block_start += LayoutUnit(cell->IntrinsicPaddingBefore()); - padding.block_end += LayoutUnit(cell->IntrinsicPaddingAfter()); - } - return padding; -} - NGLineBoxStrut ComputeLinePadding(const NGConstraintSpace& constraint_space, const ComputedStyle& style) { return NGLineBoxStrut(ComputePadding(constraint_space, style), @@ -899,7 +893,9 @@ if (constraint_space.IsAnonymous()) return NGBoxStrut(); return ComputeBorders(constraint_space, node) + - ComputePadding(constraint_space, node) + node.GetScrollbarSizes(); + ComputePadding(constraint_space, node.Style()) + + ComputeIntrinsicPadding(constraint_space, node) + + node.GetScrollbarSizes(); } NGLogicalSize CalculateBorderBoxSize( @@ -943,4 +939,30 @@ return size; } +NGLogicalSize CalculateChildPercentageSize( + const NGConstraintSpace& space, + const NGBlockNode node, + const NGLogicalSize& child_available_size) { + // Anonymous block or spaces should pass the percent size straight through. + if (space.IsAnonymous() || node.IsAnonymousBlock()) + return space.PercentageResolutionSize(); + + NGLogicalSize child_percentage_size = child_available_size; + + if (space.IsFixedSizeBlock() && !space.FixedSizeBlockIsDefinite()) + child_percentage_size.block_size = NGSizeIndefinite; + + // In quirks mode the percentage resolution height is passed from parent to + // child. + // https://quirks.spec.whatwg.org/#the-percentage-height-calculation-quirk + if (child_percentage_size.block_size == NGSizeIndefinite && + node.GetDocument().InQuirksMode() && !node.Style().IsDisplayTableType() && + !node.Style().HasOutOfFlowPosition()) { + child_percentage_size.block_size = + space.PercentageResolutionSize().block_size; + } + + return child_percentage_size; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h index 08d23e6..86ef8e6 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h +++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
@@ -197,11 +197,11 @@ CORE_EXPORT NGLineBoxStrut ComputeLineBorders(const NGConstraintSpace&, const ComputedStyle&); -CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&, - const ComputedStyle&); +CORE_EXPORT NGBoxStrut ComputeIntrinsicPadding(const NGConstraintSpace&, + const NGLayoutInputNode); CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&, - const NGLayoutInputNode); + const ComputedStyle&); CORE_EXPORT NGLineBoxStrut ComputeLinePadding(const NGConstraintSpace&, const ComputedStyle&); @@ -249,6 +249,12 @@ const NGLogicalSize border_box_size, const NGBoxStrut& border_scrollbar_padding); +// Calculates the percentage resolution size children of node should use. +NGLogicalSize CalculateChildPercentageSize( + const NGConstraintSpace&, + const NGBlockNode node, + const NGLogicalSize& child_available_size); + } // namespace blink #endif // NGLengthUtils_h
diff --git a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc index 10acb90..07d9d76 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
@@ -24,7 +24,7 @@ scoped_refptr<NGLayoutResult> NGPageLayoutAlgorithm::Layout() { NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node()); NGBoxStrut scrollbars = Node().GetScrollbarSizes(); - NGBoxStrut padding = ComputePadding(ConstraintSpace(), Node()); + NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style()); NGBoxStrut border_scrollbar_padding = borders + scrollbars + padding; NGLogicalSize border_box_size = CalculateBorderBoxSize(ConstraintSpace(), Node());
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc index 6f08582..65c9e44 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc
@@ -116,7 +116,7 @@ geometry_map); } -LayoutRect LayoutSVGBlock::AbsoluteVisualRect() const { +LayoutRect LayoutSVGBlock::VisualRectInDocument() const { return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View()); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_block.h b/third_party/blink/renderer/core/layout/svg/layout_svg_block.h index 3bdce49c..e7f3142 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_block.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_block.h
@@ -76,7 +76,7 @@ // LayoutSVGBlock subclasses should use GetElement() instead. void GetNode() const = delete; - LayoutRect AbsoluteVisualRect() const final; + LayoutRect VisualRectInDocument() const final; void AbsoluteRects(Vector<IntRect>&, const LayoutPoint& accumulated_offset) const final;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_hidden_container.h b/third_party/blink/renderer/core/layout/svg/layout_svg_hidden_container.h index a5228b1..961dc03 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_hidden_container.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_hidden_container.h
@@ -48,7 +48,7 @@ bool PaintedOutputOfObjectHasNoEffectRegardlessOfSize() const final { return true; } - LayoutRect AbsoluteVisualRect() const final { return LayoutRect(); } + LayoutRect VisualRectInDocument() const final { return LayoutRect(); } FloatRect VisualRectInLocalSVGCoordinates() const final { return FloatRect(); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc index 6c75a631..172eff5f7 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc
@@ -83,7 +83,7 @@ return FloatRect(); } -LayoutRect LayoutSVGInline::AbsoluteVisualRect() const { +LayoutRect LayoutSVGInline::VisualRectInDocument() const { return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View()); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h index e16d420..4070a03c 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h
@@ -47,7 +47,7 @@ FloatRect StrokeBoundingBox() const final; FloatRect VisualRectInLocalSVGCoordinates() const final; - LayoutRect AbsoluteVisualRect() const final; + LayoutRect VisualRectInDocument() const final; void MapLocalToAncestor( const LayoutBoxModelObject* ancestor, TransformState&,
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc index cac873c..5d8001c 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc
@@ -225,17 +225,6 @@ return U16_IS_TRAIL(run[index + 1]); } -unsigned CountCodePoints(const TextRun& run, - unsigned index, - unsigned end_index) { - unsigned num_codepoints = 0; - while (index < end_index) { - index += IsValidSurrogatePair(run, index) ? 2 : 1; - num_codepoints++; - } - return num_codepoints; -} - TextRun ConstructTextRun(LayoutSVGInlineText& text, unsigned position, unsigned length, @@ -281,29 +270,28 @@ CharacterRange& current_range = ranges[range_index]; if (current_range.Width() == 0) { distribute_count++; - continue; + } else if (distribute_count != 0) { + // Only count surrogate pairs as a single character. + bool surrogate_pair = IsValidSurrogatePair(run, range_index); + if (!surrogate_pair) + distribute_count++; + + float new_width = current_range.Width() / distribute_count; + current_range.end = current_range.start + new_width; + float last_end_position = current_range.end; + for (unsigned distribute = 1; distribute < distribute_count; + distribute++) { + // This surrogate pair check will skip processing of the second + // character forming the surrogate pair. + unsigned distribute_index = + range_index + distribute + (surrogate_pair ? 1 : 0); + ranges[distribute_index].start = last_end_position; + ranges[distribute_index].end = last_end_position + new_width; + last_end_position = ranges[distribute_index].end; + } + + distribute_count = 0; } - if (distribute_count == 0) - continue; - distribute_count++; - - // Distribute the width evenly among the code points. - const unsigned distribute_end = range_index + distribute_count; - unsigned num_codepoints = CountCodePoints(run, range_index, distribute_end); - DCHECK_GT(num_codepoints, 0u); - float new_width = current_range.Width() / num_codepoints; - - float last_end_position = current_range.start; - unsigned distribute_index = range_index; - do { - CharacterRange& range = ranges[distribute_index]; - range.start = last_end_position; - range.end = last_end_position + new_width; - last_end_position = range.end; - distribute_index += IsValidSurrogatePair(run, distribute_index) ? 2 : 1; - } while (distribute_index < distribute_end); - - distribute_count = 0; } } @@ -432,8 +420,8 @@ scaled_font.Update(document.GetStyleEngine().GetFontSelector()); } -LayoutRect LayoutSVGInlineText::AbsoluteVisualRect() const { - return Parent()->AbsoluteVisualRect(); +LayoutRect LayoutSVGInlineText::VisualRectInDocument() const { + return Parent()->VisualRectInDocument(); } FloatRect LayoutSVGInlineText::VisualRectInLocalSVGCoordinates() const {
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h index 1c12040..3eaa0a5e 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h
@@ -78,7 +78,7 @@ LayoutRect LinesBoundingBox() const override; InlineTextBox* CreateTextBox(int start, unsigned short length) override; - LayoutRect AbsoluteVisualRect() const final; + LayoutRect VisualRectInDocument() const final; FloatRect VisualRectInLocalSVGCoordinates() const final; float scaling_factor_;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc index 1403b5e1..c72e488 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
@@ -56,7 +56,7 @@ SVGLayoutSupport::MapLocalToAncestor(this, ancestor, transform_state, flags); } -LayoutRect LayoutSVGModelObject::AbsoluteVisualRect() const { +LayoutRect LayoutSVGModelObject::VisualRectInDocument() const { return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View()); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h index 386623b..ca45f520 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h
@@ -47,7 +47,7 @@ bool IsChildAllowed(LayoutObject*, const ComputedStyle&) const override; - LayoutRect AbsoluteVisualRect() const override; + LayoutRect VisualRectInDocument() const override; FloatRect VisualRectInLocalSVGCoordinates() const override { return local_visual_rect_; }
diff --git a/third_party/blink/renderer/core/loader/allowed_by_nosniff.cc b/third_party/blink/renderer/core/loader/allowed_by_nosniff.cc index 5255c3cb..6728251 100644 --- a/third_party/blink/renderer/core/loader/allowed_by_nosniff.cc +++ b/third_party/blink/renderer/core/loader/allowed_by_nosniff.cc
@@ -127,9 +127,9 @@ const ResourceResponse& response, bool is_worker_global_scope) { // Is it a file:-URL? If so, decide based on file suffix. - if (RuntimeEnabledFeatures::WorkerNosniffBlockEnabled() && - is_worker_global_scope && response.Url().IsLocalFile()) { - return response.Url().LastPathComponent().EndsWith(".js"); + if (response.Url().IsLocalFile() && + response.Url().LastPathComponent().EndsWith(".js")) { + return true; } String mime_type = response.HttpContentType();
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.cc b/third_party/blink/renderer/core/loader/base_fetch_context.cc index e0e42c83..c800ef7 100644 --- a/third_party/blink/renderer/core/loader/base_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/base_fetch_context.cc
@@ -392,8 +392,6 @@ if (GetPreviewsResourceLoadingHints() && !GetPreviewsResourceLoadingHints()->AllowLoad( url, resource_request.Priority())) { - // TODO (tbansal): https://crbug.com/864253. Add a specific reason for why - // the resource fetch was blocked. return ResourceRequestBlockedReason::kOther; }
diff --git a/third_party/blink/renderer/core/loader/previews_resource_loading_hints.cc b/third_party/blink/renderer/core/loader/previews_resource_loading_hints.cc index 86a12cae..7336bc8 100644 --- a/third_party/blink/renderer/core/loader/previews_resource_loading_hints.cc +++ b/third_party/blink/renderer/core/loader/previews_resource_loading_hints.cc
@@ -7,11 +7,24 @@ #include "base/metrics/histogram_macros.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/core/inspector/console_types.h" #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" namespace blink { +namespace { + +String GetConsoleLogStringForBlockedLoad(const KURL& url) { + return "[Intervention] Non-critical resource " + url.GetString() + + " is blocked due to page load being slow. Learn more at " + "https://www.chromestatus.com/feature/4510564810227712."; +} + +} // namespace + // static PreviewsResourceLoadingHints* PreviewsResourceLoadingHints::Create( ExecutionContext& execution_context, @@ -51,6 +64,7 @@ UMA_HISTOGRAM_BOOLEAN("ResourceLoadingHints.ResourceLoadingBlocked", !allow_load); if (!allow_load) { + ReportBlockedLoading(resource_url); UMA_HISTOGRAM_ENUMERATION( "ResourceLoadingHints.ResourceLoadingBlocked.ResourceLoadPriority." "Blocked", @@ -66,6 +80,13 @@ return allow_load; } +void PreviewsResourceLoadingHints::ReportBlockedLoading( + const KURL& resource_url) const { + execution_context_->AddConsoleMessage( + ConsoleMessage::Create(kOtherMessageSource, kWarningMessageLevel, + GetConsoleLogStringForBlockedLoad(resource_url))); +} + void PreviewsResourceLoadingHints::Trace(blink::Visitor* visitor) { visitor->Trace(execution_context_); }
diff --git a/third_party/blink/renderer/core/loader/previews_resource_loading_hints.h b/third_party/blink/renderer/core/loader/previews_resource_loading_hints.h index 4998eae..2e3ad881 100644 --- a/third_party/blink/renderer/core/loader/previews_resource_loading_hints.h +++ b/third_party/blink/renderer/core/loader/previews_resource_loading_hints.h
@@ -41,6 +41,9 @@ ExecutionContext* execution_context, const std::vector<WTF::String>& subresource_patterns_to_block); + // Reports to console when loading of |resource_url| is blocked. + void ReportBlockedLoading(const KURL& resource_url) const; + Member<ExecutionContext> execution_context_; // |subresource_patterns_to_block_| is a collection of subresource patterns
diff --git a/third_party/blink/renderer/core/loader/threadable_loader.cc b/third_party/blink/renderer/core/loader/threadable_loader.cc index ab908e2..15acdfc 100644 --- a/third_party/blink/renderer/core/loader/threadable_loader.cc +++ b/third_party/blink/renderer/core/loader/threadable_loader.cc
@@ -276,6 +276,7 @@ // cross-origin, we cancel the old request create a new one, and copy these // headers. request_headers_ = request.HttpHeaderFields(); + report_upload_progress_ = request.ReportUploadProgress(); ResourceRequest new_request(request); @@ -718,6 +719,7 @@ // original request. for (const auto& header : request_headers_) cross_origin_request.SetHTTPHeaderField(header.key, header.value); + cross_origin_request.SetReportUploadProgress(report_upload_progress_); MakeCrossOriginAccessRequest(cross_origin_request); return false;
diff --git a/third_party/blink/renderer/core/loader/threadable_loader.h b/third_party/blink/renderer/core/loader/threadable_loader.h index 67933e6..8f9b438 100644 --- a/third_party/blink/renderer/core/loader/threadable_loader.h +++ b/third_party/blink/renderer/core/loader/threadable_loader.h
@@ -269,6 +269,7 @@ // Holds the referrer after a redirect response was received. This referrer is // used to populate the HTTP Referer header when following the redirect. bool override_referrer_; + bool report_upload_progress_ = false; Referrer referrer_after_redirect_; bool detached_ = false;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index 642b6de..f6f721d 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -927,8 +927,9 @@ } void ChromeClientImpl::BeginLifecycleUpdates() { + web_view_->StopDeferringCommits(); + if (WebLayerTreeView* tree_view = web_view_->LayerTreeView()) { - tree_view->SetDeferCommits(false); tree_view->SetNeedsBeginFrame(); } }
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index af94b52a..7304719 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc
@@ -21,13 +21,11 @@ #include "third_party/blink/renderer/core/page/page.h" -#include "cc/layers/picture_layer.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_layer_tree_view.h" #include "third_party/blink/public/web/blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" -#include "third_party/blink/renderer/core/css/resolver/viewport_style_resolver.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/events/event.h" @@ -49,7 +47,6 @@ #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/viewport_data.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" -#include "third_party/blink/renderer/core/geometry/dom_rect_list.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/console_message_storage.h" @@ -59,6 +56,7 @@ #include "third_party/blink/renderer/core/page/context_menu_controller.h" #include "third_party/blink/renderer/core/page/drag_controller.h" #include "third_party/blink/renderer/core/page/focus_controller.h" +#include "third_party/blink/renderer/core/page/page_overlay.h" #include "third_party/blink/renderer/core/page/plugins_changed_observer.h" #include "third_party/blink/renderer/core/page/pointer_lock_controller.h" #include "third_party/blink/renderer/core/page/scoped_page_pauser.h" @@ -66,8 +64,6 @@ #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/validation_message_client_impl.h" -#include "third_party/blink/renderer/core/paint/paint_layer.h" -#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.h" @@ -270,23 +266,6 @@ return *link_highlights_; } -DOMRectList* Page::NonFastScrollableRectsForTesting(const LocalFrame* frame) { - // Update lifecycle to kPrePaintClean. This includes the compositing update - // and ScrollingCoordinator::UpdateAfterPaint, which computes the non-fast - // scrollable region. - frame->View()->UpdateAllLifecyclePhases(); - - GraphicsLayer* layer = frame->View()->LayoutViewport()->LayerForScrolling(); - if (!layer) - return DOMRectList::Create(); - const cc::Region& region = layer->CcLayer()->non_fast_scrollable_region(); - Vector<IntRect> rects; - rects.ReserveCapacity(region.GetRegionComplexity()); - for (const gfx::Rect& rect : region) - rects.push_back(IntRect(rect)); - return DOMRectList::Create(rects); -} - void Page::SetMainFrame(Frame* main_frame) { // Should only be called during initialization or swaps between local and // remote frames.
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h index c9ecb33..1d53858f 100644 --- a/third_party/blink/renderer/core/page/page.h +++ b/third_party/blink/renderer/core/page/page.h
@@ -33,13 +33,10 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/settings_delegate.h" #include "third_party/blink/renderer/core/page/page_animator.h" -#include "third_party/blink/renderer/core/page/page_overlay.h" #include "third_party/blink/renderer/core/page/page_visibility_notifier.h" #include "third_party/blink/renderer/core/page/page_visibility_observer.h" #include "third_party/blink/renderer/core/page/page_visibility_state.h" #include "third_party/blink/renderer/core/page/viewport_description.h" -#include "third_party/blink/renderer/platform/geometry/layout_rect.h" -#include "third_party/blink/renderer/platform/geometry/region.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/scheduler/public/page_lifecycle_state.h" #include "third_party/blink/renderer/platform/scheduler/public/page_scheduler.h" @@ -47,6 +44,7 @@ #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "third_party/skia/include/core/SkColor.h" namespace blink { @@ -55,13 +53,13 @@ class ChromeClient; class ContextMenuController; class Document; -class DOMRectList; class DragCaret; class DragController; class FocusController; class Frame; class LinkHighlights; class OverscrollController; +class PageOverlay; struct PageScaleConstraints; class PageScaleConstraintsSet; class PluginData; @@ -185,8 +183,6 @@ ScrollingCoordinator* GetScrollingCoordinator(); - DOMRectList* NonFastScrollableRectsForTesting(const LocalFrame*); - Settings& GetSettings() const { return *settings_; } Deprecation& GetDeprecation() { return deprecation_; }
diff --git a/third_party/blink/renderer/core/page/spatial_navigation.cc b/third_party/blink/renderer/core/page/spatial_navigation.cc index 3c21f970..4170d97 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation.cc +++ b/third_party/blink/renderer/core/page/spatial_navigation.cc
@@ -77,8 +77,8 @@ } focusable_node = node; - is_offscreen = HasOffscreenRect(visible_node); - is_offscreen_after_scrolling = HasOffscreenRect(visible_node, direction); + is_offscreen = IsRectOffscreen(visible_node); + is_offscreen_after_scrolling = IsRectOffscreen(visible_node, direction); } bool IsSpatialNavigationEnabled(const LocalFrame* frame) { @@ -141,47 +141,44 @@ } } -// Checks if |node| is offscreen the visible area (viewport) of its container -// document. In case it is, one can scroll in direction or take any different -// desired action later on. -bool HasOffscreenRect(const Node* node, WebFocusType direction) { - // Get the LocalFrameView in which |node| is (which means the current viewport - // if |node| is not in an inner document), so we can check if its content rect - // is visible before we actually move the focus to it. +// Answers true if |node| is completely outside its frames's (visual) viewport. +// A visible node is a node that intersects the visual viewport. |direction|, +// if given, extends the visual viewport's rect (before doing the +// intersection-check) to also include content revealed by one scroll step in +// that |direction|. + +// This logic is used by spatnav to rule out offscreen focus candidates and an +// offscreen activeElement. When activeElement is offscreen, spatnav doesn't use +// it as the search origin; the search will start at an edge of the visual +// viewport instead. +bool IsRectOffscreen(const Node* node, WebFocusType direction) { LocalFrameView* frame_view = node->GetDocument().View(); if (!frame_view) return true; DCHECK(!frame_view->NeedsLayout()); - LayoutRect container_viewport_rect( - frame_view->LayoutViewport()->VisibleContentRect()); - // We want to select a node if it is currently off screen, but will be - // exposed after we scroll. Adjust the viewport to post-scrolling position. - // If the container has overflow:hidden, we cannot scroll, so we do not pass - // direction and we do not adjust for scrolling. + LayoutRect visual_viewport( + frame_view->GetScrollableArea()->VisibleContentRect()); + int pixels_per_line_step = ScrollableArea::PixelsPerLineStep(frame_view->GetChromeClient()); switch (direction) { case kWebFocusTypeLeft: - container_viewport_rect.SetX(container_viewport_rect.X() - - pixels_per_line_step); - container_viewport_rect.SetWidth(container_viewport_rect.Width() + - pixels_per_line_step); + visual_viewport.SetX(visual_viewport.X() - pixels_per_line_step); + visual_viewport.SetWidth(visual_viewport.Width() + pixels_per_line_step); break; case kWebFocusTypeRight: - container_viewport_rect.SetWidth(container_viewport_rect.Width() + - pixels_per_line_step); + visual_viewport.SetWidth(visual_viewport.Width() + pixels_per_line_step); break; case kWebFocusTypeUp: - container_viewport_rect.SetY(container_viewport_rect.Y() - - pixels_per_line_step); - container_viewport_rect.SetHeight(container_viewport_rect.Height() + - pixels_per_line_step); + visual_viewport.SetY(visual_viewport.Y() - pixels_per_line_step); + visual_viewport.SetHeight(visual_viewport.Height() + + pixels_per_line_step); break; case kWebFocusTypeDown: - container_viewport_rect.SetHeight(container_viewport_rect.Height() + - pixels_per_line_step); + visual_viewport.SetHeight(visual_viewport.Height() + + pixels_per_line_step); break; default: break; @@ -191,11 +188,12 @@ if (!layout_object) return true; - LayoutRect rect(layout_object->AbsoluteVisualRect()); + LayoutRect rect(layout_object->VisualRectInDocument()); if (rect.IsEmpty()) return true; - return !container_viewport_rect.Intersects(rect); + // A visible node is a node that intersects the visual viewport. + return !visual_viewport.Intersects(rect); } bool ScrollInDirection(LocalFrame* frame, WebFocusType direction) { @@ -224,8 +222,8 @@ return false; } - frame->View()->LayoutViewport()->ScrollBy(ScrollOffset(dx, dy), - kUserScroll); + frame->View()->GetScrollableArea()->ScrollBy(ScrollOffset(dx, dy), + kUserScroll); return true; } return false; @@ -391,7 +389,7 @@ if ((direction == kWebFocusTypeUp || direction == kWebFocusTypeDown) && kScrollbarAlwaysOff == vertical_mode) return false; - ScrollableArea* scrollable_area = frame->View()->LayoutViewport(); + ScrollableArea* scrollable_area = frame->View()->GetScrollableArea(); LayoutSize size(scrollable_area->ContentsSize()); LayoutSize offset(scrollable_area->ScrollOffsetInt()); LayoutRect rect(scrollable_area->VisibleContentRect(kIncludeScrollbars)); @@ -710,15 +708,16 @@ WebFocusType direction) { LayoutRect starting_rect = VirtualRectForDirection( direction, - frame->View()->ConvertToRootFrame(frame->View()->DocumentToFrame( - LayoutRect(frame->View()->LayoutViewport()->VisibleContentRect())))); + frame->View()->ConvertToRootFrame( + frame->View()->DocumentToFrame(LayoutRect( + frame->View()->GetScrollableArea()->VisibleContentRect())))); const Element* focused_element = frame->GetDocument()->FocusedElement(); if (focused_element) { auto* area_element = ToHTMLAreaElementOrNull(focused_element); if (area_element) focused_element = area_element->ImageElement(); - if (!HasOffscreenRect(focused_element)) { + if (!IsRectOffscreen(focused_element)) { starting_rect = area_element ? VirtualRectForAreaElementAndDirection( *area_element, direction) : NodeRectInRootFrame(focused_element, true);
diff --git a/third_party/blink/renderer/core/page/spatial_navigation.h b/third_party/blink/renderer/core/page/spatial_navigation.h index 3b2302f..7519cd9 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation.h +++ b/third_party/blink/renderer/core/page/spatial_navigation.h
@@ -128,7 +128,7 @@ bool is_offscreen_after_scrolling; }; -bool HasOffscreenRect(const Node*, WebFocusType = kWebFocusTypeNone); +CORE_EXPORT bool IsRectOffscreen(const Node*, WebFocusType = kWebFocusTypeNone); bool ScrollInDirection(LocalFrame*, WebFocusType); bool ScrollInDirection(Node* container, WebFocusType); bool IsNavigableContainer(const Node*, WebFocusType);
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_test.cc b/third_party/blink/renderer/core/page/spatial_navigation_test.cc index f56a5b8..e194f7c 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation_test.cc +++ b/third_party/blink/renderer/core/page/spatial_navigation_test.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/page/spatial_navigation.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" namespace blink { @@ -81,4 +82,22 @@ EXPECT_TRUE(IsScrollableAreaOrDocument(enclosing_container)); } +TEST_F(SpatialNavigationTest, ZooomPutsElementOffScreen) { + SetBodyInnerHTML( + "<!DOCTYPE html>" + "<button id='a'>hello</button><br>" + "<button id='b' style='margin-top: 70%'>bello</button>"); + + Element* a = GetDocument().getElementById("a"); + Element* b = GetDocument().getElementById("b"); + EXPECT_FALSE(IsRectOffscreen(a)); + EXPECT_FALSE(IsRectOffscreen(b)); + + // Now, test IsRectOffscreen with a pinched viewport. + VisualViewport& visual_viewport = GetFrame().GetPage()->GetVisualViewport(); + visual_viewport.SetScale(2); + // #b is no longer visible. + EXPECT_FALSE(IsRectOffscreen(a)); + EXPECT_TRUE(IsRectOffscreen(b)); +} } // namespace blink
diff --git a/third_party/blink/renderer/core/page/touch_adjustment.cc b/third_party/blink/renderer/core/page/touch_adjustment.cc index c0db750..79e6af3 100644 --- a/third_party/blink/renderer/core/page/touch_adjustment.cc +++ b/third_party/blink/renderer/core/page/touch_adjustment.cc
@@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_text.h" @@ -143,7 +142,7 @@ return true; // Only the selected part of the layoutObject is a valid target, but this // will be corrected in appendContextSubtargetsForNode. - if (node->GetLayoutObject()->GetSelectionState() != SelectionState::kNone) + if (node->GetLayoutObject()->IsSelected()) return true; } return false; @@ -205,7 +204,7 @@ last_offset = offset; } } else { - if (text_layout_object->GetSelectionState() == SelectionState::kNone) + if (!text_layout_object->IsSelected()) return AppendBasicSubtargetsForNode(node, subtargets); const FrameSelection& frame_selection = text_layout_object->GetFrame()->Selection();
diff --git a/third_party/blink/renderer/core/paint/background_image_geometry.cc b/third_party/blink/renderer/core/paint/background_image_geometry.cc index 86da0e1..53351c4 100644 --- a/third_party/blink/renderer/core/paint/background_image_geometry.cc +++ b/third_party/blink/renderer/core/paint/background_image_geometry.cc
@@ -1011,7 +1011,14 @@ } const ComputedStyle& BackgroundImageGeometry::ImageStyle() const { - return box_.StyleRef(); + const bool use_style_from_positioning_box = + painting_view_ || cell_using_container_background_; + return (use_style_from_positioning_box ? positioning_box_ : box_).StyleRef(); +} + +InterpolationQuality BackgroundImageGeometry::ImageInterpolationQuality() + const { + return box_.StyleRef().GetInterpolationQuality(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/background_image_geometry.h b/third_party/blink/renderer/core/paint/background_image_geometry.h index 84d49b30..b263b37 100644 --- a/third_party/blink/renderer/core/paint/background_image_geometry.h +++ b/third_party/blink/renderer/core/paint/background_image_geometry.h
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/platform/geometry/layout_point.h" #include "third_party/blink/renderer/platform/geometry/layout_rect.h" #include "third_party/blink/renderer/platform/geometry/layout_size.h" +#include "third_party/blink/renderer/platform/graphics/graphics_types.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" namespace blink { @@ -87,6 +88,7 @@ const ImageResourceObserver& ImageClient() const; const Document& ImageDocument() const; const ComputedStyle& ImageStyle() const; + InterpolationQuality ImageInterpolationQuality() const; private: void SetSpaceSize(const LayoutSize& repeat_spacing) { @@ -144,14 +146,15 @@ const LayoutSize&, const LayoutSize&); - // The box_ is the source for the Document and StyleRef for - // background properties. It also the image client unless - // painting the view background. + // |box_| is the source for the Document. In most cases it also provides the + // background properties (see |positioning_box_| for exceptions.) It's also + // the image client unless painting the view background. const LayoutBoxModelObject& box_; - // The positioning box is the source of geometric information - // for positioning and sizing the background. We have some problems here - // with currentColor. See crbug.com/848860. + // The positioning box is the source of geometric information for positioning + // and sizing the background. It also provides the background properties if + // painting the view background or a table-cell using its container's + // (row's/column's) background. const LayoutBoxModelObject& positioning_box_; // When painting table cells or the view, the positioning area
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index 4806f93e..9c54488 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -611,8 +611,8 @@ image = info.image->GetImage( geometry.ImageClient(), geometry.ImageDocument(), geometry.ImageStyle(), FloatSize(geometry.TileSize())); - interpolation_quality_context.emplace( - context, geometry.ImageStyle().GetInterpolationQuality()); + interpolation_quality_context.emplace(context, + geometry.ImageInterpolationQuality()); if (bg_layer.MaskSourceType() == EMaskSourceType::kLuminance) context.SetColorFilter(kColorFilterLuminanceToAlpha);
diff --git a/third_party/blink/renderer/core/paint/ellipsis_box_painter.cc b/third_party/blink/renderer/core/paint/ellipsis_box_painter.cc index be96980..ff4358b7 100644 --- a/third_party/blink/renderer/core/paint/ellipsis_box_painter.cc +++ b/third_party/blink/renderer/core/paint/ellipsis_box_painter.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/core/paint/ellipsis_box_painter.h" #include "third_party/blink/renderer/core/layout/api/line_layout_item.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/line/ellipsis_box.h" #include "third_party/blink/renderer/core/layout/line/root_inline_box.h" #include "third_party/blink/renderer/core/layout/text_run_constructor.h"
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index a696cbd..65a0fc33 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1148,7 +1148,7 @@ if (block.HasLayer() && block.Layer()->FirstChild()) return false; // Selection may overflow. - if (block.GetSelectionState() != SelectionState::kNone) + if (block.IsSelected()) return false; // Other cases that the contents may overflow. The conditions are copied from // BlockPainter for SPv1 clip. TODO(wangxianzhu): clean up.
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc b/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc index 7fd62f8..7dfdb4b21 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc
@@ -791,11 +791,12 @@ } // The scrollbars are attached to the visual viewport but created by (and have -// space saved by) the frame view. So we need to exclude them from the container -// rect but also from the contents rect because we don't want to be able to -// scroll into the region saved for scrollbars. +// space saved by) the frame view. Conceptually, the scrollbars are part of the +// scrollable content so they must be included in the contents rect. They must +// also not be excluded from the container rect since they don't take away space +// from the viewport's viewable area. TEST_P(PaintPropertyTreeUpdateTest, - ViewportContentsAndContainerRectsDoNotIncludeScrollbar) { + ViewportContentsAndContainerRectsIncludeScrollbar) { SetBodyInnerHTML(R"HTML( <style> ::-webkit-scrollbar {width: 20px; height: 20px} @@ -806,14 +807,10 @@ VisualViewport& visual_viewport = GetDocument().GetPage()->GetVisualViewport(); - // TODO(bokan): Viewport property node generation has been disabled - // temporarily with the flag off to diagnose https://crbug.com/868927. - if (RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()) { - EXPECT_EQ(IntRect(0, 0, 780, 580), - visual_viewport.GetScrollNode()->ContainerRect()); - EXPECT_EQ(IntRect(0, 0, 780, 580), - visual_viewport.GetScrollNode()->ContentsRect()); - } + EXPECT_EQ(IntRect(0, 0, 800, 600), + visual_viewport.GetScrollNode()->ContainerRect()); + EXPECT_EQ(IntRect(0, 0, 800, 600), + visual_viewport.GetScrollNode()->ContentsRect()); } TEST_P(PaintPropertyTreeUpdateTest, ScrollbarWidthChange) {
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.cc b/third_party/blink/renderer/core/paint/replaced_painter.cc index d6f9127..43ee0b71 100644 --- a/third_party/blink/renderer/core/paint/replaced_painter.cc +++ b/third_party/blink/renderer/core/paint/replaced_painter.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/core/paint/replaced_painter.h" #include "base/optional.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/layout_replaced.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" #include "third_party/blink/renderer/core/paint/box_painter.h" @@ -79,7 +78,7 @@ return; if (local_paint_info.phase == PaintPhase::kSelection && - layout_replaced_.GetSelectionState() == SelectionState::kNone) + !layout_replaced_.IsSelected()) return; bool skip_clip = layout_replaced_.IsSVGRoot() && @@ -145,7 +144,7 @@ // want it to run right up to the edges of surrounding content. bool draw_selection_tint = local_paint_info.phase == PaintPhase::kForeground && - IsSelected(layout_replaced_.GetSelectionState()) && + layout_replaced_.IsSelected() && layout_replaced_.CanBeSelectionLeaf() && !local_paint_info.IsPrinting(); if (draw_selection_tint && !DrawingRecorder::UseCachedDrawingIfPossible( local_paint_info.context, layout_replaced_,
diff --git a/third_party/blink/renderer/core/paint/svg_root_inline_box_painter.cc b/third_party/blink/renderer/core/paint/svg_root_inline_box_painter.cc index 0967354..5d8dd4a1 100644 --- a/third_party/blink/renderer/core/paint/svg_root_inline_box_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_root_inline_box_painter.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/core/paint/svg_root_inline_box_painter.h" #include "third_party/blink/renderer/core/layout/api/line_layout_api_shim.h" -#include "third_party/blink/renderer/core/layout/api/selection_state.h" #include "third_party/blink/renderer/core/layout/svg/line/svg_inline_flow_box.h" #include "third_party/blink/renderer/core/layout/svg/line/svg_inline_text_box.h" #include "third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.h"
diff --git a/third_party/blink/renderer/core/streams/transform_stream.cc b/third_party/blink/renderer/core/streams/transform_stream.cc index 4ca38c8..a117c44 100644 --- a/third_party/blink/renderer/core/streams/transform_stream.cc +++ b/third_party/blink/renderer/core/streams/transform_stream.cc
@@ -43,7 +43,6 @@ ExceptionState& exception_state) : ScriptFunction(script_state), transformer_(transformer), - context_(exception_state.Context()), interface_name_(exception_state.InterfaceName()), property_name_(exception_state.PropertyName()) {} @@ -58,7 +57,12 @@ v8::Local<v8::Value> controller) : controller_(owner->GetScriptState(), controller), exception_state_(owner->GetScriptState()->GetIsolate(), - owner->context_, + // Using the original context would result in every + // exception claiming to have happened during + // construction. Since that is not helpful, don't + // annotate exceptions with where we think they came + // from. + ExceptionState::kUnknownContext, owner->interface_name_, owner->property_name_), reject_promise_scope_(info, exception_state_) {} @@ -74,7 +78,6 @@ }; Member<TransformStreamTransformer> transformer_; - const ExceptionState::ContextType context_; const char* const interface_name_; const char* const property_name_; };
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index 18f8e54e..8ca9358 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -410,7 +410,7 @@ return this != StyleResolver::StyleNotYetAvailable(); } -ComputedStyle* ComputedStyle::GetCachedPseudoStyle(PseudoId pid) const { +const ComputedStyle* ComputedStyle::GetCachedPseudoStyle(PseudoId pid) const { if (!cached_pseudo_styles_ || !cached_pseudo_styles_->size()) return nullptr; @@ -418,7 +418,7 @@ return nullptr; for (size_t i = 0; i < cached_pseudo_styles_->size(); ++i) { - ComputedStyle* pseudo_style = cached_pseudo_styles_->at(i).get(); + const ComputedStyle* pseudo_style = cached_pseudo_styles_->at(i).get(); if (pseudo_style->StyleType() == pid) return pseudo_style; } @@ -426,12 +426,12 @@ return nullptr; } -ComputedStyle* ComputedStyle::AddCachedPseudoStyle( +const ComputedStyle* ComputedStyle::AddCachedPseudoStyle( scoped_refptr<ComputedStyle> pseudo) { DCHECK(pseudo); DCHECK_GT(pseudo->StyleType(), kPseudoIdNone); - ComputedStyle* result = pseudo.get(); + const ComputedStyle* result = pseudo.get(); if (!cached_pseudo_styles_) cached_pseudo_styles_ = std::make_unique<PseudoStyleCache>(); @@ -445,7 +445,7 @@ if (!cached_pseudo_styles_) return; for (size_t i = 0; i < cached_pseudo_styles_->size(); ++i) { - ComputedStyle* pseudo_style = cached_pseudo_styles_->at(i).get(); + const ComputedStyle* pseudo_style = cached_pseudo_styles_->at(i).get(); if (pseudo_style->StyleType() == pid) { cached_pseudo_styles_->EraseAt(i); return;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index d6d38c2..9e229af 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -294,8 +294,8 @@ PseudoId StyleType() const { return static_cast<PseudoId>(StyleTypeInternal()); } void SetStyleType(PseudoId style_type) { SetStyleTypeInternal(style_type); } - ComputedStyle* GetCachedPseudoStyle(PseudoId) const; - ComputedStyle* AddCachedPseudoStyle(scoped_refptr<ComputedStyle>); + const ComputedStyle* GetCachedPseudoStyle(PseudoId) const; + const ComputedStyle* AddCachedPseudoStyle(scoped_refptr<ComputedStyle>); void RemoveCachedPseudoStyle(PseudoId); /**
diff --git a/third_party/blink/renderer/core/svg/properties/svg_animated_property.cc b/third_party/blink/renderer/core/svg/properties/svg_animated_property.cc index 6615fdd8e..00baabd 100644 --- a/third_party/blink/renderer/core/svg/properties/svg_animated_property.cc +++ b/third_party/blink/renderer/core/svg/properties/svg_animated_property.cc
@@ -38,12 +38,14 @@ AnimatedPropertyType type, SVGElement* context_element, const QualifiedName& attribute_name, - CSSPropertyID css_property_id) + CSSPropertyID css_property_id, + unsigned initial_value) : type_(type), // Cast to avoid warnings about unsafe bitfield truncations of the CSS // property enum. CSS properties that don't fit in this bitfield are never // used here. See static_assert in header. css_property_id_(static_cast<unsigned>(css_property_id)), + initial_value_storage_(initial_value), base_value_needs_synchronization_(false), context_element_(context_element), attribute_name_(attribute_name) { @@ -51,6 +53,7 @@ DCHECK(attribute_name_ != QualifiedName::Null()); DCHECK_EQ(this->GetType(), type); DCHECK_EQ(this->CssPropertyId(), css_property_id); + DCHECK_EQ(initial_value_storage_, initial_value); } SVGAnimatedPropertyBase::~SVGAnimatedPropertyBase() = default;
diff --git a/third_party/blink/renderer/core/svg/properties/svg_animated_property.h b/third_party/blink/renderer/core/svg/properties/svg_animated_property.h index 57d4047c..2ecf296 100644 --- a/third_party/blink/renderer/core/svg/properties/svg_animated_property.h +++ b/third_party/blink/renderer/core/svg/properties/svg_animated_property.h
@@ -88,7 +88,11 @@ SVGAnimatedPropertyBase(AnimatedPropertyType, SVGElement*, const QualifiedName& attribute_name, - CSSPropertyID = CSSPropertyInvalid); + CSSPropertyID = CSSPropertyInvalid, + unsigned initial_value = 0); + + static constexpr int kInitialValueStorageBits = 3; + unsigned InitialValueStorage() const { return initial_value_storage_; } void ClearBaseValueNeedsSynchronization() { base_value_needs_synchronization_ = false; @@ -103,6 +107,8 @@ const unsigned type_ : 5; const unsigned css_property_id_ : kCssPropertyBits; + const unsigned initial_value_storage_ : kInitialValueStorageBits; + unsigned base_value_needs_synchronization_ : 1; TraceWrapperMember<SVGElement> context_element_; const QualifiedName& attribute_name_; @@ -129,8 +135,19 @@ bool IsAnimating() const override { return current_value_; } SVGParsingError AttributeChanged(const String& value) override { + static_assert(Property::kInitialValueBits <= kInitialValueStorageBits, + "enough bits for the initial value"); + ClearBaseValueNeedsSynchronization(); - return base_value_->SetValueAsString(value); + const bool has_initial_value = Property::kInitialValueBits > 0; + const bool is_attr_removal = value.IsNull(); + SVGParsingError parse_status = SVGParseStatus::kNoError; + if (!has_initial_value || !is_attr_removal) + parse_status = base_value_->SetValueAsString(value); + if (has_initial_value && + (is_attr_removal || parse_status != SVGParseStatus::kNoError)) + base_value_->SetInitial(InitialValueStorage()); + return parse_status; } SVGPropertyBase* CreateAnimatedValue() override { @@ -158,11 +175,13 @@ SVGAnimatedPropertyCommon(SVGElement* context_element, const QualifiedName& attribute_name, Property* initial_value, - CSSPropertyID css_property_id = CSSPropertyInvalid) + CSSPropertyID css_property_id = CSSPropertyInvalid, + unsigned initial_value_bits = 0) : SVGAnimatedPropertyBase(Property::ClassType(), context_element, attribute_name, - css_property_id), + css_property_id, + initial_value_bits), base_value_(initial_value) {} private: @@ -198,11 +217,13 @@ SVGAnimatedProperty(SVGElement* context_element, const QualifiedName& attribute_name, Property* initial_value, - CSSPropertyID css_property_id = CSSPropertyInvalid) + CSSPropertyID css_property_id = CSSPropertyInvalid, + unsigned initial_value_bits = 0) : SVGAnimatedPropertyCommon<Property>(context_element, attribute_name, initial_value, - css_property_id) {} + css_property_id, + initial_value_bits) {} }; // Implementation of SVGAnimatedProperty which uses tear-off value types. @@ -262,11 +283,13 @@ SVGAnimatedProperty(SVGElement* context_element, const QualifiedName& attribute_name, Property* initial_value, - CSSPropertyID css_property_id = CSSPropertyInvalid) + CSSPropertyID css_property_id = CSSPropertyInvalid, + unsigned initial_value_bits = 0) : SVGAnimatedPropertyCommon<Property>(context_element, attribute_name, initial_value, - css_property_id) {} + css_property_id, + initial_value_bits) {} private: void UpdateAnimValTearOffIfNeeded() {
diff --git a/third_party/blink/renderer/core/svg/properties/svg_property.h b/third_party/blink/renderer/core/svg/properties/svg_property.h index b3ab650..a9fd0864 100644 --- a/third_party/blink/renderer/core/svg/properties/svg_property.h +++ b/third_party/blink/renderer/core/svg/properties/svg_property.h
@@ -55,6 +55,12 @@ virtual String ValueAsString() const = 0; + // Set the initial value based on a per-type defined (encoded) value. Overload + // this in the specific subclass to handle initial values, and set + // kInitialValueBits appropriately. + static constexpr int kInitialValueBits = 0; + void SetInitial(unsigned) {} + // FIXME: remove below and just have this inherit AnimatableValue in // WebAnimations transition. virtual void Add(SVGPropertyBase*, SVGElement*) = 0;
diff --git a/third_party/blink/renderer/core/svg/svg_angle.h b/third_party/blink/renderer/core/svg/svg_angle.h index 3a00f68..1ce89a2f 100644 --- a/third_party/blink/renderer/core/svg/svg_angle.h +++ b/third_party/blink/renderer/core/svg/svg_angle.h
@@ -95,6 +95,13 @@ void SetValue(float); float Value() const; + // Technically speaking, we don't need any bits (it's always the + // same), but we want SetInitial to be called. + static constexpr int kInitialValueBits = 1; + void SetInitial(unsigned) { + NewValueSpecifiedUnits(kSvgAngletypeUnspecified, 0); + } + void SetValueInSpecifiedUnits(float value_in_specified_units) { value_in_specified_units_ = value_in_specified_units; }
diff --git a/third_party/blink/renderer/core/svg/svg_animated_length.cc b/third_party/blink/renderer/core/svg/svg_animated_length.cc index e1d5587..6179957 100644 --- a/third_party/blink/renderer/core/svg/svg_animated_length.cc +++ b/third_party/blink/renderer/core/svg/svg_animated_length.cc
@@ -34,20 +34,13 @@ namespace blink { -void SVGAnimatedLength::SetDefaultValueAsString(const String& value) { - BaseValue()->SetValueAsString(value); -} - SVGParsingError SVGAnimatedLength::AttributeChanged(const String& value) { SVGParsingError parse_status = SVGAnimatedProperty<SVGLength>::AttributeChanged(value); - if (parse_status != SVGParseStatus::kNoError) - BaseValue()->NewValueSpecifiedUnits(CSSPrimitiveValue::UnitType::kUserUnits, - 0); - else if (SVGLength::NegativeValuesForbiddenForAnimatedLengthAttribute( - AttributeName()) && - BaseValue()->ValueInSpecifiedUnits() < 0) + if (SVGLength::NegativeValuesForbiddenForAnimatedLengthAttribute( + AttributeName()) && + BaseValue()->ValueInSpecifiedUnits() < 0) parse_status = SVGParseStatus::kNegativeValue; return parse_status;
diff --git a/third_party/blink/renderer/core/svg/svg_animated_length.h b/third_party/blink/renderer/core/svg/svg_animated_length.h index 9384ee5..0f2cff3 100644 --- a/third_party/blink/renderer/core/svg/svg_animated_length.h +++ b/third_party/blink/renderer/core/svg/svg_animated_length.h
@@ -46,13 +46,13 @@ static SVGAnimatedLength* Create( SVGElement* context_element, const QualifiedName& attribute_name, - SVGLength* initial_value, + SVGLengthMode mode, + SVGLength::Initial initial_value, CSSPropertyID css_property_id = CSSPropertyInvalid) { - return new SVGAnimatedLength(context_element, attribute_name, initial_value, - css_property_id); + return new SVGAnimatedLength(context_element, attribute_name, mode, + initial_value, css_property_id); } - void SetDefaultValueAsString(const String&); SVGParsingError AttributeChanged(const String&) override; const CSSValue& CssValue() const { @@ -64,12 +64,14 @@ protected: SVGAnimatedLength(SVGElement* context_element, const QualifiedName& attribute_name, - SVGLength* initial_value, + SVGLengthMode mode, + SVGLength::Initial initial_value, CSSPropertyID css_property_id = CSSPropertyInvalid) : SVGAnimatedProperty<SVGLength>(context_element, attribute_name, - initial_value, - css_property_id) {} + SVGLength::Create(initial_value, mode), + css_property_id, + static_cast<unsigned>(initial_value)) {} }; } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_circle_element.cc b/third_party/blink/renderer/core/svg/svg_circle_element.cc index 762a749..41d8006 100644 --- a/third_party/blink/renderer/core/svg/svg_circle_element.cc +++ b/third_party/blink/renderer/core/svg/svg_circle_element.cc
@@ -29,15 +29,18 @@ : SVGGeometryElement(SVGNames::circleTag, document), cx_(SVGAnimatedLength::Create(this, SVGNames::cxAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyCx)), cy_(SVGAnimatedLength::Create(this, SVGNames::cyAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyCy)), r_(SVGAnimatedLength::Create(this, SVGNames::rAttr, - SVGLength::Create(SVGLengthMode::kOther), + SVGLengthMode::kOther, + SVGLength::Initial::kUnitlessZero, CSSPropertyR)) { AddToPropertyMap(cx_); AddToPropertyMap(cy_);
diff --git a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc index 2f2dfa88..a20bdbcc 100644 --- a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc +++ b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
@@ -29,19 +29,23 @@ : SVGGeometryElement(SVGNames::ellipseTag, document), cx_(SVGAnimatedLength::Create(this, SVGNames::cxAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyCx)), cy_(SVGAnimatedLength::Create(this, SVGNames::cyAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyCy)), rx_(SVGAnimatedLength::Create(this, SVGNames::rxAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyRx)), ry_(SVGAnimatedLength::Create(this, SVGNames::ryAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyRy)) { AddToPropertyMap(cx_); AddToPropertyMap(cy_);
diff --git a/third_party/blink/renderer/core/svg/svg_filter_element.cc b/third_party/blink/renderer/core/svg/svg_filter_element.cc index 5f82246..137c33f 100644 --- a/third_party/blink/renderer/core/svg/svg_filter_element.cc +++ b/third_party/blink/renderer/core/svg/svg_filter_element.cc
@@ -32,20 +32,26 @@ inline SVGFilterElement::SVGFilterElement(Document& document) : SVGElement(SVGNames::filterTag, document), SVGURIReference(this), + // Spec: If the x/y attribute is not specified, the effect is as if a + // value of "-10%" were specified. x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercentMinus10)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight))), - width_( - SVGAnimatedLength::Create(this, - SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercentMinus10)), + // Spec: If the width/height attribute is not specified, the effect is as + // if a value of "120%" were specified. + width_(SVGAnimatedLength::Create(this, + SVGNames::widthAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent120)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent120)), filter_units_(SVGAnimatedEnumeration<SVGUnitTypes::SVGUnitType>::Create( this, SVGNames::filterUnitsAttr, @@ -55,15 +61,6 @@ this, SVGNames::primitiveUnitsAttr, SVGUnitTypes::kSvgUnitTypeUserspaceonuse)) { - // Spec: If the x/y attribute is not specified, the effect is as if a value of - // "-10%" were specified. - x_->SetDefaultValueAsString("-10%"); - y_->SetDefaultValueAsString("-10%"); - // Spec: If the width/height attribute is not specified, the effect is as if a - // value of "120%" were specified. - width_->SetDefaultValueAsString("120%"); - height_->SetDefaultValueAsString("120%"); - AddToPropertyMap(x_); AddToPropertyMap(y_); AddToPropertyMap(width_);
diff --git a/third_party/blink/renderer/core/svg/svg_filter_primitive_standard_attributes.cc b/third_party/blink/renderer/core/svg/svg_filter_primitive_standard_attributes.cc index 1392126..0edfa01 100644 --- a/third_party/blink/renderer/core/svg/svg_filter_primitive_standard_attributes.cc +++ b/third_party/blink/renderer/core/svg/svg_filter_primitive_standard_attributes.cc
@@ -35,31 +35,27 @@ const QualifiedName& tag_name, Document& document) : SVGElement(tag_name, document), + // Spec: If the x/y attribute is not specified, the effect is as if a + // value of "0%" were specified. x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent0)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight))), - width_( - SVGAnimatedLength::Create(this, - SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent0)), + // Spec: If the width/height attribute is not specified, the effect is as + // if a value of "100%" were specified. + width_(SVGAnimatedLength::Create(this, + SVGNames::widthAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent100)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent100)), result_(SVGAnimatedString::Create(this, SVGNames::resultAttr)) { - // Spec: If the x/y attribute is not specified, the effect is as if a value of - // "0%" were specified. - x_->SetDefaultValueAsString("0%"); - y_->SetDefaultValueAsString("0%"); - - // Spec: If the width/height attribute is not specified, the effect is as if a - // value of "100%" were specified. - width_->SetDefaultValueAsString("100%"); - height_->SetDefaultValueAsString("100%"); - AddToPropertyMap(x_); AddToPropertyMap(y_); AddToPropertyMap(width_);
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc index 55455f55..1356e69 100644 --- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc +++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
@@ -32,21 +32,24 @@ : SVGGraphicsElement(SVGNames::foreignObjectTag, document), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyY)), width_(SVGAnimatedLength::Create(this, SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyWidth)), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight), - CSSPropertyHeight)) { + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, + CSSPropertyHeight)) { AddToPropertyMap(x_); AddToPropertyMap(y_); AddToPropertyMap(width_);
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.cc b/third_party/blink/renderer/core/svg/svg_image_element.cc index 3e7ca19..4862fbb 100644 --- a/third_party/blink/renderer/core/svg/svg_image_element.cc +++ b/third_party/blink/renderer/core/svg/svg_image_element.cc
@@ -35,21 +35,24 @@ SVGURIReference(this), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyY)), width_(SVGAnimatedLength::Create(this, SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyWidth)), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight), - CSSPropertyHeight)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, + CSSPropertyHeight)), preserve_aspect_ratio_(SVGAnimatedPreserveAspectRatio::Create( this, SVGNames::preserveAspectRatioAttr)),
diff --git a/third_party/blink/renderer/core/svg/svg_length.cc b/third_party/blink/renderer/core/svg/svg_length.cc index 52ea5162..8a82679 100644 --- a/third_party/blink/renderer/core/svg/svg_length.cc +++ b/third_party/blink/renderer/core/svg/svg_length.cc
@@ -32,10 +32,13 @@ namespace blink { SVGLength::SVGLength(SVGLengthMode mode) - : value_( - CSSPrimitiveValue::Create(0, - CSSPrimitiveValue::UnitType::kUserUnits)), - unit_mode_(static_cast<unsigned>(mode)) { + : SVGLength( + *CSSPrimitiveValue::Create(0, + CSSPrimitiveValue::UnitType::kUserUnits), + mode) {} + +SVGLength::SVGLength(const CSSPrimitiveValue& value, SVGLengthMode mode) + : value_(value), unit_mode_(static_cast<unsigned>(mode)) { DCHECK_EQ(UnitMode(), mode); } @@ -285,4 +288,49 @@ return fabsf(to_length->Value(length_context) - Value(length_context)); } +namespace { + +#define CAST_UNIT(unit) \ + (static_cast<uint8_t>(CSSPrimitiveValue::UnitType::unit)) + +// Table of initial values for SVGLength properties. Indexed by the +// SVGLength::Initial enumeration, hence these two need to be kept +// synchronized. +const struct { + int8_t value; + uint8_t unit; +} g_initial_lengths_table[] = { + {0, CAST_UNIT(kUserUnits)}, {-10, CAST_UNIT(kPercentage)}, + {0, CAST_UNIT(kPercentage)}, {50, CAST_UNIT(kPercentage)}, + {100, CAST_UNIT(kPercentage)}, {120, CAST_UNIT(kPercentage)}, + {3, CAST_UNIT(kUserUnits)}, +}; +static_assert(static_cast<size_t>(SVGLength::Initial::kNumValues) == + base::size(g_initial_lengths_table), + "the enumeration is synchronized with the value table"); +static_assert(static_cast<size_t>(SVGLength::Initial::kNumValues) <= + 1u << SVGLength::kInitialValueBits, + "the enumeration is synchronized with the value table"); + +#undef CAST_UNIT + +const CSSPrimitiveValue& CreateInitialCSSValue( + SVGLength::Initial initial_value) { + size_t initial_value_index = static_cast<size_t>(initial_value); + DCHECK_LT(initial_value_index, base::size(g_initial_lengths_table)); + const auto& entry = g_initial_lengths_table[initial_value_index]; + return *CSSPrimitiveValue::Create( + entry.value, static_cast<CSSPrimitiveValue::UnitType>(entry.unit)); +} + +} // namespace + +SVGLength* SVGLength::Create(Initial initial, SVGLengthMode mode) { + return new SVGLength(CreateInitialCSSValue(initial), mode); +} + +void SVGLength::SetInitial(unsigned initial_value) { + value_ = CreateInitialCSSValue(static_cast<Initial>(initial_value)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_length.h b/third_party/blink/renderer/core/svg/svg_length.h index 1a722894..c757faa1 100644 --- a/third_party/blink/renderer/core/svg/svg_length.h +++ b/third_party/blink/renderer/core/svg/svg_length.h
@@ -41,6 +41,23 @@ return new SVGLength(mode); } + // Initial values for SVGLength properties. If adding a new initial value, + // keep the list sorted within the same unit. The table containing the actual + // values are in the .cc file. + enum class Initial { + kUnitlessZero, + kPercentMinus10, + kPercent0, + kPercent50, + kPercent100, + kPercent120, + kNumber3, + kNumValues + }; + static constexpr int kInitialValueBits = 3; + static SVGLength* Create(Initial, SVGLengthMode); + void SetInitial(unsigned); + void Trace(blink::Visitor*) override; SVGLength* Clone() const; @@ -116,7 +133,8 @@ AnimatedPropertyType GetType() const override { return ClassType(); } private: - SVGLength(SVGLengthMode); + explicit SVGLength(SVGLengthMode); + SVGLength(const CSSPrimitiveValue&, SVGLengthMode); SVGLength(const SVGLength&); Member<const CSSPrimitiveValue> value_;
diff --git a/third_party/blink/renderer/core/svg/svg_line_element.cc b/third_party/blink/renderer/core/svg/svg_line_element.cc index 05bc78f0..056d4ff 100644 --- a/third_party/blink/renderer/core/svg/svg_line_element.cc +++ b/third_party/blink/renderer/core/svg/svg_line_element.cc
@@ -29,17 +29,20 @@ : SVGGeometryElement(SVGNames::lineTag, document), x1_(SVGAnimatedLength::Create(this, SVGNames::x1Attr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), y1_(SVGAnimatedLength::Create(this, SVGNames::y1Attr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)), x2_(SVGAnimatedLength::Create(this, SVGNames::x2Attr, - SVGLength::Create(SVGLengthMode::kWidth))), - y2_(SVGAnimatedLength::Create( - this, - SVGNames::y2Attr, - SVGLength::Create(SVGLengthMode::kHeight))) { + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), + y2_(SVGAnimatedLength::Create(this, + SVGNames::y2Attr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)) { AddToPropertyMap(x1_); AddToPropertyMap(y1_); AddToPropertyMap(x2_);
diff --git a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc index dd2e231..80a243d 100644 --- a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc +++ b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
@@ -31,29 +31,26 @@ inline SVGLinearGradientElement::SVGLinearGradientElement(Document& document) : SVGGradientElement(SVGNames::linearGradientTag, document), + // Spec: If the x1|y1|y2 attribute is not specified, the effect is as if a + // value of "0%" were specified. + // Spec: If the x2 attribute is not specified, the effect is as if a value + // of "100%" were specified. x1_(SVGAnimatedLength::Create(this, SVGNames::x1Attr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent0)), y1_(SVGAnimatedLength::Create(this, SVGNames::y1Attr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent0)), x2_(SVGAnimatedLength::Create(this, SVGNames::x2Attr, - SVGLength::Create(SVGLengthMode::kWidth))), - y2_(SVGAnimatedLength::Create( - this, - SVGNames::y2Attr, - SVGLength::Create(SVGLengthMode::kHeight))) { - // Spec: If the x1|y1|y2 attribute is not specified, the effect is as if a - // value of "0%" were specified. - x1_->SetDefaultValueAsString("0%"); - y1_->SetDefaultValueAsString("0%"); - y2_->SetDefaultValueAsString("0%"); - - // Spec: If the x2 attribute is not specified, the effect is as if a value of - // "100%" were specified. - x2_->SetDefaultValueAsString("100%"); - + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent100)), + y2_(SVGAnimatedLength::Create(this, + SVGNames::y2Attr, + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent0)) { AddToPropertyMap(x1_); AddToPropertyMap(y1_); AddToPropertyMap(x2_);
diff --git a/third_party/blink/renderer/core/svg/svg_marker_element.cc b/third_party/blink/renderer/core/svg/svg_marker_element.cc index ea6bdee..f4968f9 100644 --- a/third_party/blink/renderer/core/svg/svg_marker_element.cc +++ b/third_party/blink/renderer/core/svg/svg_marker_element.cc
@@ -44,32 +44,29 @@ inline SVGMarkerElement::SVGMarkerElement(Document& document) : SVGElement(SVGNames::markerTag, document), SVGFitToViewBox(this), - ref_x_( - SVGAnimatedLength::Create(this, - SVGNames::refXAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - ref_y_( - SVGAnimatedLength::Create(this, - SVGNames::refYAttr, - SVGLength::Create(SVGLengthMode::kHeight))), - marker_width_( - SVGAnimatedLength::Create(this, - SVGNames::markerWidthAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - marker_height_( - SVGAnimatedLength::Create(this, - SVGNames::markerHeightAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + ref_x_(SVGAnimatedLength::Create(this, + SVGNames::refXAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), + ref_y_(SVGAnimatedLength::Create(this, + SVGNames::refYAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)), + // Spec: If the markerWidth/markerHeight attribute is not specified, the + // effect is as if a value of "3" were specified. + marker_width_(SVGAnimatedLength::Create(this, + SVGNames::markerWidthAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kNumber3)), + marker_height_(SVGAnimatedLength::Create(this, + SVGNames::markerHeightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kNumber3)), orient_angle_(SVGAnimatedAngle::Create(this)), marker_units_(SVGAnimatedEnumeration<SVGMarkerUnitsType>::Create( this, SVGNames::markerUnitsAttr, kSVGMarkerUnitsStrokeWidth)) { - // Spec: If the markerWidth/markerHeight attribute is not specified, the - // effect is as if a value of "3" were specified. - marker_width_->SetDefaultValueAsString("3"); - marker_height_->SetDefaultValueAsString("3"); - AddToPropertyMap(ref_x_); AddToPropertyMap(ref_y_); AddToPropertyMap(marker_width_);
diff --git a/third_party/blink/renderer/core/svg/svg_mask_element.cc b/third_party/blink/renderer/core/svg/svg_mask_element.cc index 9f5dab76..0d6cd764 100644 --- a/third_party/blink/renderer/core/svg/svg_mask_element.cc +++ b/third_party/blink/renderer/core/svg/svg_mask_element.cc
@@ -31,23 +31,30 @@ inline SVGMaskElement::SVGMaskElement(Document& document) : SVGElement(SVGNames::maskTag, document), SVGTests(this), + // Spec: If the x/y attribute is not specified, the effect is as if a + // value of "-10%" were specified. x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercentMinus10, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercentMinus10, CSSPropertyY)), + // Spec: If the width/height attribute is not specified, the effect is as + // if a value of "120%" were specified. width_(SVGAnimatedLength::Create(this, SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent120, CSSPropertyWidth)), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight), - CSSPropertyHeight)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent120, + CSSPropertyHeight)), mask_units_(SVGAnimatedEnumeration<SVGUnitTypes::SVGUnitType>::Create( this, SVGNames::maskUnitsAttr, @@ -57,16 +64,6 @@ this, SVGNames::maskContentUnitsAttr, SVGUnitTypes::kSvgUnitTypeUserspaceonuse)) { - // Spec: If the x/y attribute is not specified, the effect is as if a value of - // "-10%" were specified. - x_->SetDefaultValueAsString("-10%"); - y_->SetDefaultValueAsString("-10%"); - - // Spec: If the width/height attribute is not specified, the effect is as if a - // value of "120%" were specified. - width_->SetDefaultValueAsString("120%"); - height_->SetDefaultValueAsString("120%"); - AddToPropertyMap(x_); AddToPropertyMap(y_); AddToPropertyMap(width_);
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.cc b/third_party/blink/renderer/core/svg/svg_pattern_element.cc index 9f1ddb67..1ed75ec 100644 --- a/third_party/blink/renderer/core/svg/svg_pattern_element.cc +++ b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
@@ -40,18 +40,20 @@ SVGFitToViewBox(this), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight))), - width_( - SVGAnimatedLength::Create(this, - SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)), + width_(SVGAnimatedLength::Create(this, + SVGNames::widthAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)), pattern_transform_( SVGAnimatedTransformList::Create(this, SVGNames::patternTransformAttr,
diff --git a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc index 6ce1479e..c855caf 100644 --- a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc +++ b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
@@ -30,34 +30,34 @@ inline SVGRadialGradientElement::SVGRadialGradientElement(Document& document) : SVGGradientElement(SVGNames::radialGradientTag, document), + // Spec: If the cx/cy/r attribute is not specified, the effect is as if a + // value of "50%" were specified. cx_(SVGAnimatedLength::Create(this, SVGNames::cxAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent50)), cy_(SVGAnimatedLength::Create(this, SVGNames::cyAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent50)), r_(SVGAnimatedLength::Create(this, SVGNames::rAttr, - SVGLength::Create(SVGLengthMode::kOther))), + SVGLengthMode::kOther, + SVGLength::Initial::kPercent50)), fx_(SVGAnimatedLength::Create(this, SVGNames::fxAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent50)), fy_(SVGAnimatedLength::Create(this, SVGNames::fyAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent50)), + // SVG2-Draft Spec: If the fr attribute is not specified, the effect is as + // if a value of "0%" were specified. fr_(SVGAnimatedLength::Create(this, SVGNames::frAttr, - SVGLength::Create(SVGLengthMode::kOther))) { - // Spec: If the cx/cy/r attribute is not specified, the effect is as if a - // value of "50%" were specified. - cx_->SetDefaultValueAsString("50%"); - cy_->SetDefaultValueAsString("50%"); - r_->SetDefaultValueAsString("50%"); - - // SVG2-Draft Spec: If the fr attributed is not specified, the effect is as if - // a value of "0%" were specified. - fr_->SetDefaultValueAsString("0%"); - + SVGLengthMode::kOther, + SVGLength::Initial::kPercent0)) { AddToPropertyMap(cx_); AddToPropertyMap(cy_); AddToPropertyMap(r_);
diff --git a/third_party/blink/renderer/core/svg/svg_rect_element.cc b/third_party/blink/renderer/core/svg/svg_rect_element.cc index 396d56b..ed62484 100644 --- a/third_party/blink/renderer/core/svg/svg_rect_element.cc +++ b/third_party/blink/renderer/core/svg/svg_rect_element.cc
@@ -29,28 +29,33 @@ : SVGGeometryElement(SVGNames::rectTag, document), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyY)), width_(SVGAnimatedLength::Create(this, SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyWidth)), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight), - CSSPropertyHeight)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, + CSSPropertyHeight)), rx_(SVGAnimatedLength::Create(this, SVGNames::rxAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyRx)), ry_(SVGAnimatedLength::Create(this, SVGNames::ryAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyRy)) { AddToPropertyMap(x_); AddToPropertyMap(y_);
diff --git a/third_party/blink/renderer/core/svg/svg_svg_element.cc b/third_party/blink/renderer/core/svg/svg_svg_element.cc index f681199..8a8c419 100644 --- a/third_party/blink/renderer/core/svg/svg_svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_svg_element.cc
@@ -66,27 +66,27 @@ SVGFitToViewBox(this), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyY)), width_(SVGAnimatedLength::Create(this, SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kPercent100, CSSPropertyWidth)), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight), - CSSPropertyHeight)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kPercent100, + CSSPropertyHeight)), time_container_(SMILTimeContainer::Create(*this)), translation_(SVGPoint::Create()), current_scale_(1) { - width_->SetDefaultValueAsString("100%"); - height_->SetDefaultValueAsString("100%"); - AddToPropertyMap(x_); AddToPropertyMap(y_); AddToPropertyMap(width_); @@ -194,15 +194,6 @@ CreateAttributeEventListener(GetDocument().GetFrame(), name, value, EventParameterName())); } else if (SVGZoomAndPan::ParseAttribute(name, value)) { - } else if (name == SVGNames::widthAttr || name == SVGNames::heightAttr) { - SVGAnimatedLength* property = - name == SVGNames::widthAttr ? width_ : height_; - SVGParsingError parse_error; - if (!value.IsNull()) - parse_error = property->AttributeChanged(value); - if (parse_error != SVGParseStatus::kNoError || value.IsNull()) - property->SetDefaultValueAsString("100%"); - ReportAttributeParsingError(parse_error, name, value); } else { SVGElement::ParseAttribute(params); }
diff --git a/third_party/blink/renderer/core/svg/svg_text_content_element.cc b/third_party/blink/renderer/core/svg/svg_text_content_element.cc index c342f76..99abac1b 100644 --- a/third_party/blink/renderer/core/svg/svg_text_content_element.cc +++ b/third_party/blink/renderer/core/svg/svg_text_content_element.cc
@@ -72,7 +72,8 @@ SVGAnimatedTextLength(SVGTextContentElement* context_element) : SVGAnimatedLength(context_element, SVGNames::textLengthAttr, - SVGLength::Create(SVGLengthMode::kWidth)) {} + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero) {} }; SVGTextContentElement::SVGTextContentElement(const QualifiedName& tag_name,
diff --git a/third_party/blink/renderer/core/svg/svg_text_path_element.cc b/third_party/blink/renderer/core/svg/svg_text_path_element.cc index 6c419aad..e0c5228c 100644 --- a/third_party/blink/renderer/core/svg/svg_text_path_element.cc +++ b/third_party/blink/renderer/core/svg/svg_text_path_element.cc
@@ -53,7 +53,8 @@ start_offset_( SVGAnimatedLength::Create(this, SVGNames::startOffsetAttr, - SVGLength::Create(SVGLengthMode::kWidth))), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), method_(SVGAnimatedEnumeration<SVGTextPathMethodType>::Create( this, SVGNames::methodAttr,
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc index b013b75..45fc872e 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.cc +++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -53,20 +53,22 @@ SVGURIReference(this), x_(SVGAnimatedLength::Create(this, SVGNames::xAttr, - SVGLength::Create(SVGLengthMode::kWidth), + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero, CSSPropertyX)), y_(SVGAnimatedLength::Create(this, SVGNames::yAttr, - SVGLength::Create(SVGLengthMode::kHeight), + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero, CSSPropertyY)), - width_( - SVGAnimatedLength::Create(this, - SVGNames::widthAttr, - SVGLength::Create(SVGLengthMode::kWidth))), - height_( - SVGAnimatedLength::Create(this, - SVGNames::heightAttr, - SVGLength::Create(SVGLengthMode::kHeight))), + width_(SVGAnimatedLength::Create(this, + SVGNames::widthAttr, + SVGLengthMode::kWidth, + SVGLength::Initial::kUnitlessZero)), + height_(SVGAnimatedLength::Create(this, + SVGNames::heightAttr, + SVGLengthMode::kHeight, + SVGLength::Initial::kUnitlessZero)), element_url_is_local_(true), have_fired_load_event_(false), needs_shadow_tree_recreation_(false) {
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index 1b9f5ff..c6457b7 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -2240,17 +2240,27 @@ Document* document, ExceptionState& exception_state) const { DCHECK(document); - if (!document->GetFrame()) { + const LocalFrame* frame = document->GetFrame(); + if (!frame) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, "The document provided is invalid."); return nullptr; } - Page* page = document->GetPage(); - if (!page) - return nullptr; + // Update lifecycle to kPrePaintClean. This includes the compositing update + // and ScrollingCoordinator::UpdateAfterPaint, which computes the non-fast + // scrollable region. + frame->View()->UpdateAllLifecyclePhases(); - return page->NonFastScrollableRectsForTesting(document->GetFrame()); + GraphicsLayer* layer = frame->View()->LayoutViewport()->LayerForScrolling(); + if (!layer) + return DOMRectList::Create(); + const cc::Region& region = layer->CcLayer()->non_fast_scrollable_region(); + Vector<IntRect> rects; + rects.ReserveCapacity(region.GetRegionComplexity()); + for (const gfx::Rect& rect : region) + rects.push_back(IntRect(rect)); + return DOMRectList::Create(rects); } void Internals::evictAllResources() const {
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc index b4851956..1fcd0111 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc
@@ -28,10 +28,6 @@ // BeginMainFrame(), which will update and paint the WebViewImpl given to // SetWebView(). layer_tree_view_ = layer_tree_view_factory_.Initialize(this); - // SimCompositor starts with defer commits enabled, but uses synchronous - // compositing which does not use defer commits anyhow, it only uses it for - // reading defered state in tests. - layer_tree_view_->SetDeferCommits(true); } SimCompositor::~SimCompositor() { @@ -40,6 +36,11 @@ void SimCompositor::SetWebView(WebViewImpl& web_view) { web_view_ = &web_view; + + // SimCompositor starts with defer commits enabled, but uses synchronous + // compositing which does not use defer commits anyhow, it only uses it for + // reading deferred state in tests. + web_view_->DeferCommitsForTesting(); } SimCanvas::Commands SimCompositor::BeginFrame(double time_delta_in_seconds) {
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.h b/third_party/blink/renderer/core/testing/sim/sim_compositor.h index 1a5a93a..c5484f7 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.h +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.h
@@ -90,6 +90,8 @@ content::LayerTreeView* layer_tree_view_ = nullptr; FrameTestHelpers::LayerTreeViewFactory layer_tree_view_factory_; + + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/BUILD.gn b/third_party/blink/renderer/core/trustedtypes/BUILD.gn index a060479..c0fdf30 100644 --- a/third_party/blink/renderer/core/trustedtypes/BUILD.gn +++ b/third_party/blink/renderer/core/trustedtypes/BUILD.gn
@@ -16,6 +16,8 @@ "trusted_type_policy.h", "trusted_type_policy_factory.cc", "trusted_type_policy_factory.h", + "trusted_types_util.cc", + "trusted_types_util.h", "trusted_url.cc", "trusted_url.h", ]
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_html.cc b/third_party/blink/renderer/core/trustedtypes/trusted_html.cc index 54b6f1a6..333aa0bc 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_html.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_html.cc
@@ -4,54 +4,10 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" -#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" - namespace blink { TrustedHTML::TrustedHTML(const String& html) : html_(html) {} -TrustedHTML* TrustedHTML::escape(ScriptState* script_state, - const String& html) { - // TODO(mkwst): This could be hugely optimized by scanning the string for any - // of the interesting characters to see whether we need to do any replacement - // at all, and by replacing all the characters in a single pass. - String escapedHTML(html); - escapedHTML.Replace("&", "&") - .Replace("<", "<") - .Replace(">", ">") - .Replace("\"", """) - .Replace("'", "'"); - - return TrustedHTML::unsafelyCreate(script_state, escapedHTML); -} - -TrustedHTML* TrustedHTML::unsafelyCreate(ScriptState* script_state, - const String& html) { - return TrustedHTML::Create(html); -} - -String TrustedHTML::GetString(StringOrTrustedHTML stringOrHTML, - const Document* doc, - ExceptionState& exception_state) { - DCHECK(stringOrHTML.IsString() || - RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); - DCHECK(!stringOrHTML.IsNull()); - - if (!stringOrHTML.IsTrustedHTML() && doc && doc->RequireTrustedTypes()) { - exception_state.ThrowTypeError( - "This document requires `TrustedHTML` assignment."); - return g_empty_string; - } - - String markup = stringOrHTML.IsString() - ? stringOrHTML.GetAsString() - : stringOrHTML.GetAsTrustedHTML()->toString(); - return markup; -} - String TrustedHTML::toString() const { return html_; }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_html.h b/third_party/blink/renderer/core/trustedtypes/trusted_html.h index 423b8c0..684c75e 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_html.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_html.h
@@ -7,16 +7,10 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { -class Document; -class ExceptionState; -class ScriptState; -class StringOrTrustedHTML; - class CORE_EXPORT TrustedHTML final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -25,11 +19,8 @@ return new TrustedHTML(html); } - // CredentialsContainer.idl + // TrustedHTML.idl String toString() const; - static TrustedHTML* escape(ScriptState*, const String& html); - static TrustedHTML* unsafelyCreate(ScriptState*, const String& html); - static String GetString(StringOrTrustedHTML, const Document*, ExceptionState&); private: TrustedHTML(const String& html);
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_html.idl b/third_party/blink/renderer/core/trustedtypes/trusted_html.idl index 6ddc306..7afcc83 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_html.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_html.idl
@@ -2,16 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// https://github.com/wicg/trusted-types + typedef (DOMString or TrustedHTML) HTMLString; [ Exposed=(Window,Worker), RuntimeEnabled=TrustedDOMTypes ] interface TrustedHTML { - [CallWith=ScriptState] static TrustedHTML escape(DOMString html); - [CallWith=ScriptState] static TrustedHTML unsafelyCreate(DOMString html); - - stringifier; };
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script.cc b/third_party/blink/renderer/core/trustedtypes/trusted_script.cc index a260b37..9d8472a 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script.cc
@@ -4,35 +4,10 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_script.h" -#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" - namespace blink { TrustedScript::TrustedScript(const String& script) : script_(script) {} -String TrustedScript::GetString(StringOrTrustedScript string_or_trusted_script, - const Document* doc, - ExceptionState& exception_state) { - DCHECK(string_or_trusted_script.IsString() || - RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); - DCHECK(!string_or_trusted_script.IsNull()); - - if (!string_or_trusted_script.IsTrustedScript() && doc && - doc->RequireTrustedTypes()) { - exception_state.ThrowTypeError( - "This document requires `TrustedScript` assignment."); - return g_empty_string; - } - - String markup = - string_or_trusted_script.IsString() - ? string_or_trusted_script.GetAsString() - : string_or_trusted_script.GetAsTrustedScript()->toString(); - return markup; -} - String TrustedScript::toString() const { return script_; }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script.h b/third_party/blink/renderer/core/trustedtypes/trusted_script.h index d94f1934..23b3135 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script.h
@@ -7,15 +7,10 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { -class Document; -class ExceptionState; -class StringOrTrustedScript; - class CORE_EXPORT TrustedScript final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -27,10 +22,6 @@ // TrustedScript.idl String toString() const; - static String GetString(StringOrTrustedScript, - const Document*, - ExceptionState&); - private: TrustedScript(const String& script);
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script.idl b/third_party/blink/renderer/core/trustedtypes/trusted_script.idl index 0d74f21..4e1bcdc 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script.idl
@@ -1,7 +1,7 @@ // 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. -// + // https://github.com/wicg/trusted-types typedef (DOMString or TrustedScript) ScriptString;
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.cc b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.cc index bfc4cd9..a1d527d 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.cc
@@ -4,19 +4,12 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" -#include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { TrustedScriptURL::TrustedScriptURL(const KURL& url) : url_(url) {} -TrustedScriptURL* TrustedScriptURL::unsafelyCreate(ScriptState* script_state, - const String& url) { - return TrustedScriptURL::Create( - ExecutionContext::From(script_state)->CompleteURL(url)); -} - String TrustedScriptURL::toString() const { return url_.GetString(); }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.h b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.h index 708400d..0192ac9f 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.h
@@ -7,14 +7,16 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace WTF { + +class String; + +} // namespace WTF namespace blink { -class ScriptState; - class CORE_EXPORT TrustedScriptURL final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -25,7 +27,6 @@ // TrustedScriptURL.idl String toString() const; - static TrustedScriptURL* unsafelyCreate(ScriptState*, const String& url); private: TrustedScriptURL(const KURL&);
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.idl b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.idl index 67fff86..8beb2b91 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_script_url.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_script_url.idl
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// https://github.com/wicg/trusted-types + typedef (DOMString or TrustedScriptURL) ScriptURLString; [ Exposed=(Window,Worker), RuntimeEnabled=TrustedDOMTypes ] interface TrustedScriptURL { - [CallWith=ScriptState] static TrustedScriptURL unsafelyCreate(DOMString url); - stringifier; };
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl index 4c36933..3a0cfe49 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl
@@ -3,6 +3,9 @@ // found in the LICENSE file. // https://github.com/wicg/trusted-types + +typedef (DOMString or TrustedHTML or TrustedScript or TrustedScriptURL or TrustedURL) TrustedString; + [ Exposed=(Window), RuntimeEnabled=TrustedDOMTypes
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc index cdcd5888..360d4d4 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
@@ -4,6 +4,9 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" +#include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -16,6 +19,15 @@ const TrustedTypePolicyOptions& policy_options, bool exposed, ExceptionState& exception_state) { + if (!GetFrame() + ->GetDocument() + ->GetContentSecurityPolicy() + ->AllowTrustedTypePolicy(policy_name)) { + exception_state.ThrowTypeError("Policy " + policy_name + " disallowed."); + return nullptr; + } + // TODO(orsibatiz): After policy naming rules are estabilished, check for the + // policy_name to be according to them. if (policy_map_.Contains(policy_name)) { exception_state.ThrowTypeError("Policy with name" + policy_name + " already exists.");
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc new file mode 100644 index 0000000..93ccd48 --- /dev/null +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -0,0 +1,147 @@ +// 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 "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" + +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" +#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_script.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" + +namespace blink { + +String GetStringFromTrustedType( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + string_or_trusted_type, + const Document* doc, + ExceptionState& exception_state) { + DCHECK(string_or_trusted_type.IsString() || + RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); + DCHECK(!string_or_trusted_type.IsNull()); + + if (string_or_trusted_type.IsString() && doc && doc->RequireTrustedTypes()) { + exception_state.ThrowTypeError( + "This document requires a Trusted Type assignment."); + return g_empty_string; + } + + if (string_or_trusted_type.IsTrustedHTML()) + return string_or_trusted_type.GetAsTrustedHTML()->toString(); + if (string_or_trusted_type.IsTrustedScript()) + return string_or_trusted_type.GetAsTrustedScript()->toString(); + if (string_or_trusted_type.IsTrustedScriptURL()) + return string_or_trusted_type.GetAsTrustedScriptURL()->toString(); + if (string_or_trusted_type.IsTrustedURL()) + return string_or_trusted_type.GetAsTrustedURL()->toString(); + + return string_or_trusted_type.GetAsString(); +} + +String GetStringFromTrustedTypeWithoutCheck( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + string_or_trusted_type) { + if (string_or_trusted_type.IsTrustedHTML()) + return string_or_trusted_type.GetAsTrustedHTML()->toString(); + if (string_or_trusted_type.IsTrustedScript()) + return string_or_trusted_type.GetAsTrustedScript()->toString(); + if (string_or_trusted_type.IsTrustedScriptURL()) + return string_or_trusted_type.GetAsTrustedScriptURL()->toString(); + if (string_or_trusted_type.IsTrustedURL()) + return string_or_trusted_type.GetAsTrustedURL()->toString(); + if (string_or_trusted_type.IsString()) + return string_or_trusted_type.GetAsString(); + + return g_empty_string; +} + +String GetStringFromTrustedHTML(StringOrTrustedHTML string_or_trusted_html, + const Document* doc, + ExceptionState& exception_state) { + DCHECK(string_or_trusted_html.IsString() || + RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); + DCHECK(!string_or_trusted_html.IsNull()); + + if (!string_or_trusted_html.IsTrustedHTML() && doc && + doc->RequireTrustedTypes()) { + exception_state.ThrowTypeError( + "This document requires `TrustedHTML` assignment."); + return g_empty_string; + } + + String markup = string_or_trusted_html.IsString() + ? string_or_trusted_html.GetAsString() + : string_or_trusted_html.GetAsTrustedHTML()->toString(); + return markup; +} + +String GetStringFromTrustedScript( + StringOrTrustedScript string_or_trusted_script, + const Document* doc, + ExceptionState& exception_state) { + DCHECK(string_or_trusted_script.IsString() || + RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); + DCHECK(!string_or_trusted_script.IsNull()); + + if (!string_or_trusted_script.IsTrustedScript() && doc && + doc->RequireTrustedTypes()) { + exception_state.ThrowTypeError( + "This document requires `TrustedScript` assignment."); + return g_empty_string; + } + + String markup = + string_or_trusted_script.IsString() + ? string_or_trusted_script.GetAsString() + : string_or_trusted_script.GetAsTrustedScript()->toString(); + return markup; +} + +String GetStringFromTrustedScriptURL( + StringOrTrustedScriptURL string_or_trusted_script_url, + const Document* doc, + ExceptionState& exception_state) { + DCHECK(string_or_trusted_script_url.IsString() || + RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); + DCHECK(!string_or_trusted_script_url.IsNull()); + + if (!string_or_trusted_script_url.IsTrustedScriptURL() && doc && + doc->RequireTrustedTypes()) { + exception_state.ThrowTypeError( + "This document requires `TrustedScriptURL` assignment."); + return g_empty_string; + } + + String markup = + string_or_trusted_script_url.IsString() + ? string_or_trusted_script_url.GetAsString() + : string_or_trusted_script_url.GetAsTrustedScriptURL()->toString(); + return markup; +} + +String GetStringFromTrustedURL(USVStringOrTrustedURL string_or_trusted_url, + const Document* doc, + ExceptionState& exception_state) { + DCHECK(string_or_trusted_url.IsUSVString() || + RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); + DCHECK(!string_or_trusted_url.IsNull()); + + if (!string_or_trusted_url.IsTrustedURL() && doc && + doc->RequireTrustedTypes()) { + exception_state.ThrowTypeError( + "This document requires `TrustedURL` assignment."); + return g_empty_string; + } + + String markup = string_or_trusted_url.IsUSVString() + ? string_or_trusted_url.GetAsUSVString() + : string_or_trusted_url.GetAsTrustedURL()->toString(); + return markup; +} +} // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h new file mode 100644 index 0000000..c86ca17 --- /dev/null +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h
@@ -0,0 +1,46 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_TYPES_UTIL_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_TYPES_UTIL_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class Document; +class ExceptionState; +class StringOrTrustedHTML; +class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL; +class StringOrTrustedScript; +class StringOrTrustedScriptURL; +class USVStringOrTrustedURL; + +String CORE_EXPORT GetStringFromTrustedType( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, + const Document*, + ExceptionState&); + +String CORE_EXPORT GetStringFromTrustedTypeWithoutCheck( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&); + +String CORE_EXPORT GetStringFromTrustedHTML(StringOrTrustedHTML, + const Document*, + ExceptionState&); + +String CORE_EXPORT GetStringFromTrustedScript(StringOrTrustedScript, + const Document*, + ExceptionState&); + +String CORE_EXPORT GetStringFromTrustedScriptURL(StringOrTrustedScriptURL, + const Document*, + ExceptionState&); + +String CORE_EXPORT GetStringFromTrustedURL(USVStringOrTrustedURL, + const Document*, + ExceptionState&); +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_TYPES_UTIL_H_
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc new file mode 100644 index 0000000..40d3c24 --- /dev/null +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc
@@ -0,0 +1,311 @@ +// 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 "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" +#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_script.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" + +namespace blink { + +// Functions for checking throwing cases. +void GetStringFromTrustedTypeThrows( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + string_or_trusted_type) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + ASSERT_FALSE(exception_state.HadException()); + String s = GetStringFromTrustedType(string_or_trusted_type, document, + exception_state); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); + exception_state.ClearException(); +} + +void GetStringFromTrustedHTMLThrows( + const StringOrTrustedHTML& string_or_trusted_html) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + ASSERT_FALSE(exception_state.HadException()); + String s = GetStringFromTrustedHTML(string_or_trusted_html, document, + exception_state); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); + exception_state.ClearException(); +} + +void GetStringFromTrustedScriptThrows( + const StringOrTrustedScript& string_or_trusted_script) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + ASSERT_FALSE(exception_state.HadException()); + String s = GetStringFromTrustedScript(string_or_trusted_script, document, + exception_state); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); + exception_state.ClearException(); +} + +void GetStringFromTrustedScriptURLThrows( + const StringOrTrustedScriptURL& string_or_trusted_script_url) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + ASSERT_FALSE(exception_state.HadException()); + String s = GetStringFromTrustedScriptURL(string_or_trusted_script_url, + document, exception_state); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); + exception_state.ClearException(); +} + +void GetStringFromTrustedURLThrows( + const USVStringOrTrustedURL& string_or_trusted_url) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + ASSERT_FALSE(exception_state.HadException()); + String s = + GetStringFromTrustedURL(string_or_trusted_url, document, exception_state); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); + exception_state.ClearException(); +} + +// Functions for checking non-throwing cases. +void GetStringFromTrustedTypeWorks( + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + string_or_trusted_type, + String expected) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + String s = GetStringFromTrustedType(string_or_trusted_type, document, + exception_state); + ASSERT_EQ(s, expected); +} + +void GetStringFromTrustedHTMLWorks( + const StringOrTrustedHTML& string_or_trusted_html, + String expected) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + String s = GetStringFromTrustedHTML(string_or_trusted_html, document, + exception_state); + ASSERT_EQ(s, expected); +} + +void GetStringFromTrustedScriptWorks( + const StringOrTrustedScript& string_or_trusted_script, + String expected) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + String s = GetStringFromTrustedScript(string_or_trusted_script, document, + exception_state); + ASSERT_EQ(s, expected); +} + +void GetStringFromTrustedScriptURLWorks( + const StringOrTrustedScriptURL& string_or_trusted_script_url, + String expected) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + String s = GetStringFromTrustedScriptURL(string_or_trusted_script_url, + document, exception_state); + ASSERT_EQ(s, expected); +} + +void GetStringFromTrustedURLWorks( + const USVStringOrTrustedURL& string_or_trusted_url, + String expected) { + Document* document = Document::CreateForTest(); + document->SetRequireTrustedTypes(); + DummyExceptionStateForTesting exception_state; + String s = + GetStringFromTrustedURL(string_or_trusted_url, document, exception_state); + ASSERT_EQ(s, expected); +} + +// GetStringFromTrustedType() tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedHTML) { + TrustedHTML* html = TrustedHTML::Create("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedHTML(html); + GetStringFromTrustedTypeWorks(trusted_value, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedScript) { + TrustedScript* script = TrustedScript::Create("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedScript(script); + GetStringFromTrustedTypeWorks(trusted_value, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedScriptURL) { + KURL url_address("http://www.example.com/"); + TrustedScriptURL* script_url = TrustedScriptURL::Create(url_address); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedScriptURL(script_url); + GetStringFromTrustedTypeWorks(trusted_value, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedURL) { + KURL url_address("http://www.example.com/"); + TrustedURL* url = TrustedURL::Create(url_address); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedURL(url); + GetStringFromTrustedTypeWorks(trusted_value, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedType_String) { + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + string_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromString("A string"); + GetStringFromTrustedTypeThrows(string_value); +} + +// GetStringFromTrustedTypeWithoutCheck() tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedHTML) { + TrustedHTML* html = TrustedHTML::Create("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedHTML(html); + String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); + ASSERT_EQ(s, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedScript) { + TrustedScript* script = TrustedScript::Create("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedScript(script); + String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); + ASSERT_EQ(s, "A string"); +} + +TEST(TrustedTypesUtilTest, + GetStringFromTrustedTypeWithoutCheck_TrustedScriptURL) { + KURL url_address("http://www.example.com/"); + TrustedScriptURL* script_url = TrustedScriptURL::Create(url_address); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedScriptURL(script_url); + String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); + ASSERT_EQ(s, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedURL) { + KURL url_address("http://www.example.com/"); + TrustedURL* url = TrustedURL::Create(url_address); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromTrustedURL(url); + String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); + ASSERT_EQ(s, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_String) { + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL + string_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: + FromString("A string"); + String s = GetStringFromTrustedTypeWithoutCheck(string_value); + ASSERT_EQ(s, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_Null) { + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL null_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL(); + String s = GetStringFromTrustedTypeWithoutCheck(null_value); + ASSERT_EQ(s, ""); +} + +// GetStringFromTrustedHTML tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedHTML_TrustedHTML) { + TrustedHTML* html = TrustedHTML::Create("A string"); + StringOrTrustedHTML trusted_value = + StringOrTrustedHTML::FromTrustedHTML(html); + GetStringFromTrustedHTMLWorks(trusted_value, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedHTML_String) { + StringOrTrustedHTML string_value = + StringOrTrustedHTML::FromString("A string"); + GetStringFromTrustedHTMLThrows(string_value); +} + +// GetStringFromTrustedScript tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedScript_TrustedScript) { + TrustedScript* script = TrustedScript::Create("A string"); + StringOrTrustedScript trusted_value = + StringOrTrustedScript::FromTrustedScript(script); + GetStringFromTrustedScriptWorks(trusted_value, "A string"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedScript_String) { + StringOrTrustedScript string_value = + StringOrTrustedScript::FromString("A string"); + GetStringFromTrustedScriptThrows(string_value); +} + +// GetStringFromTrustedScriptURL tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedScriptURL_TrustedScriptURL) { + KURL url_address("http://www.example.com/"); + TrustedScriptURL* script_url = TrustedScriptURL::Create(url_address); + StringOrTrustedScriptURL trusted_value = + StringOrTrustedScriptURL::FromTrustedScriptURL(script_url); + GetStringFromTrustedScriptURLWorks(trusted_value, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedScriptURL_String) { + StringOrTrustedScriptURL string_value = + StringOrTrustedScriptURL::FromString("A string"); + GetStringFromTrustedScriptURLThrows(string_value); +} + +// GetStringFromTrustedURL tests +TEST(TrustedTypesUtilTest, GetStringFromTrustedURL_TrustedURL) { + KURL url_address("http://www.example.com/"); + TrustedURL* url = TrustedURL::Create(url_address); + USVStringOrTrustedURL trusted_value = + USVStringOrTrustedURL::FromTrustedURL(url); + GetStringFromTrustedURLWorks(trusted_value, "http://www.example.com/"); +} + +TEST(TrustedTypesUtilTest, GetStringFromTrustedURL_String) { + USVStringOrTrustedURL string_value = + USVStringOrTrustedURL::FromUSVString("A string"); + GetStringFromTrustedURLThrows(string_value); +} +} // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.cc b/third_party/blink/renderer/core/trustedtypes/trusted_url.cc index 38e6d981..0093775b 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_url.cc
@@ -4,50 +4,12 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { TrustedURL::TrustedURL(const KURL& url) : url_(url) {} -TrustedURL* TrustedURL::create(ScriptState* script_state, const String& url) { - KURL result(ExecutionContext::From(script_state)->CompleteURL(url)); - - if (!result.IsValid() || !result.ProtocolIsInHTTPFamily()) - result = KURL("about:invalid"); - - return TrustedURL::Create(result); -} - -TrustedURL* TrustedURL::unsafelyCreate(ScriptState* script_state, - const String& url) { - return TrustedURL::Create( - ExecutionContext::From(script_state)->CompleteURL(url)); -} - -String TrustedURL::GetString(USVStringOrTrustedURL stringOrURL, - const Document* doc, - ExceptionState& exception_state) { - DCHECK(stringOrURL.IsUSVString() || - RuntimeEnabledFeatures::TrustedDOMTypesEnabled()); - DCHECK(!stringOrURL.IsNull()); - - if (!stringOrURL.IsTrustedURL() && doc && doc->RequireTrustedTypes()) { - exception_state.ThrowTypeError( - "This document requires `TrustedURL` assignment."); - return g_empty_string; - } - - String markup = stringOrURL.IsUSVString() - ? stringOrURL.GetAsUSVString() - : stringOrURL.GetAsTrustedURL()->toString(); - return markup; -} - String TrustedURL::toString() const { return url_.GetString(); }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.h b/third_party/blink/renderer/core/trustedtypes/trusted_url.h index 6e33c23..ce677ad 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_url.h
@@ -7,17 +7,16 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace WTF { + +class String; + +} // namespace WTF namespace blink { -class Document; -class ExceptionState; -class ScriptState; -class USVStringOrTrustedURL; - class CORE_EXPORT TrustedURL final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -26,11 +25,6 @@ // TrustedURL.idl String toString() const; - static TrustedURL* create(ScriptState*, const String& url); - static TrustedURL* unsafelyCreate(ScriptState*, const String& url); - static String GetString(USVStringOrTrustedURL, - const Document*, - ExceptionState&); private: TrustedURL(const KURL&);
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.idl b/third_party/blink/renderer/core/trustedtypes/trusted_url.idl index d2f24eff..ca0d585 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_url.idl
@@ -2,14 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// https://github.com/wicg/trusted-types + typedef (USVString or TrustedURL) URLString; [ Exposed=(Window,Worker), RuntimeEnabled=TrustedDOMTypes ] interface TrustedURL { - [CallWith=ScriptState] static TrustedURL create(USVString url); - [CallWith=ScriptState] static TrustedURL unsafelyCreate(USVString url); - stringifier; };
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc index bdc30cfa..8bbd71d0 100644 --- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h" #include "third_party/blink/public/platform/task_type.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h" #include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" #include "third_party/blink/renderer/core/dom/events/event_queue.h" #include "third_party/blink/renderer/core/frame/deprecation.h"
diff --git a/third_party/blink/renderer/core/xml/dom_parser.cc b/third_party/blink/renderer/core/xml/dom_parser.cc index 5b9e53b..c7973483 100644 --- a/third_party/blink/renderer/core/xml/dom_parser.cc +++ b/third_party/blink/renderer/core/xml/dom_parser.cc
@@ -22,7 +22,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document_init.h" #include "third_party/blink/renderer/core/dom/dom_implementation.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" +#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -32,8 +32,8 @@ Document* DOMParser::parseFromString(const StringOrTrustedHTML& stringOrHTML, const String& type, ExceptionState& exception_state) { - String value = - TrustedHTML::GetString(stringOrHTML, context_document_, exception_state); + String value = GetStringFromTrustedHTML(stringOrHTML, context_document_, + exception_state); if (!exception_state.HadException()) { return parseFromStringInternal(value, type); }
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js b/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js index 62581c6..cad5a0b8 100644 --- a/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js +++ b/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
@@ -20,6 +20,7 @@ return el; async function onViewTraceClick() { + Host.userMetrics.actionTaken(Host.UserMetrics.Action.Audits2ViewTrace); await UI.inspectorView.showPanel('timeline'); Timeline.TimelinePanel.instance().loadFromEvents(defaultPassTrace.traceEvents); }
diff --git a/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js b/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js index 997cbfe..f9e71dd 100644 --- a/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js +++ b/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js
@@ -94,6 +94,7 @@ Audits2Started: 29, Audits2Finished: 30, ShowedThirdPartyBadges: 31, + Audits2ViewTrace: 32, }; Host.UserMetrics._PanelCodes = {
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js index 7bc0762..f5d1082 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js
@@ -558,6 +558,8 @@ scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash, executionContextAuxData, isLiveEdit, sourceMapURL, hasSourceURLComment, hasSyntaxError, length, originStackTrace) { + if (this._scripts.has(scriptId)) + return this._scripts.get(scriptId); let isContentScript = false; if (executionContextAuxData && ('isDefault' in executionContextAuxData)) isContentScript = !executionContextAuxData['isDefault'];
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc index 83d3bc2..019141e 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -463,7 +463,7 @@ bool AXLayoutObject::IsOffScreen() const { DCHECK(layout_object_); IntRect content_rect = - PixelSnappedIntRect(layout_object_->AbsoluteVisualRect()); + PixelSnappedIntRect(layout_object_->VisualRectInDocument()); LocalFrameView* view = layout_object_->GetFrame()->View(); IntRect view_rect(IntPoint(), view->Size()); view_rect.Intersect(content_rect);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list.h b/third_party/blink/renderer/modules/accessibility/ax_menu_list.h index bafcc00..c4ef6a7f 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_menu_list.h +++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list.h
@@ -38,7 +38,6 @@ public: static AXMenuList* Create(LayoutMenuList* layout_object, AXObjectCacheImpl&); - bool IsCollapsed() const override; AccessibilityExpanded IsExpanded() const final; bool OnNativeClickAction() override; void ClearChildren() override; @@ -57,6 +56,8 @@ void AddChildren() override; + bool IsCollapsed() const; + DISALLOW_COPY_AND_ASSIGN(AXMenuList); };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc index bfb7165..1c4521ba 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc
@@ -44,7 +44,7 @@ if (!parent_) return true; - return parent_->IsCollapsed(); + return parent_->IsExpanded() == kExpandedCollapsed; } AXRestriction AXMenuListPopup::Restriction() const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index 40cae43..af6aebc 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -2711,8 +2711,10 @@ return text_alternative; } } + } - // Also check for aria-placeholder. + // Also check for aria-placeholder. + if (IsTextControl()) { name_from = kAXNameFromPlaceholder; if (name_sources) { name_sources->push_back(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 12df974..ac07cdc 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -518,7 +518,6 @@ // Check object state. virtual bool IsAutofillAvailable() { return false; } virtual bool IsClickable() const; - virtual bool IsCollapsed() const { return false; } virtual AccessibilityExpanded IsExpanded() const { return kExpandedUndefined; }
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc index dbe549d..278de3a 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
@@ -33,7 +33,9 @@ #include "third_party/blink/renderer/platform/network/network_utils.h" #include "third_party/blink/renderer/platform/weborigin/known_ports.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" +#include "third_party/blink/renderer/platform/weborigin/kurl_hash.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/skia/include/core/SkBitmap.h" namespace blink { @@ -204,6 +206,10 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); + // A HashSet to find whether there are any duplicate requests within the + // fetch. https://bugs.chromium.org/p/chromium/issues/detail?id=871174. + HashSet<KURL> kurls; + // Based on security steps from https://fetch.spec.whatwg.org/#main-fetch // TODO(crbug.com/757441): Remove all this duplicative code once Fetch (and // all its security checks) are implemented in the Network Service, such that @@ -273,6 +279,27 @@ "CORS preflights are not yet supported " "by this browser"); } + + kurls.insert(request_url); + } + + const bool has_duplicate_requests = kurls.size() != web_requests.size(); + + UMA_HISTOGRAM_BOOLEAN("BackgroundFetch.HasDuplicateRequests", + has_duplicate_requests); + + // Note: This is a proprietary check, due to the way Chrome currently handles + // storing background fetch records. Entries are keyed by the URL, so if two + // requests have the same URL, and different responses, the first response + // will be lost when the second request/response pair is stored. + if (has_duplicate_requests) { + return ScriptPromise::Reject( + script_state, + V8ThrowException::CreateTypeError( + script_state->GetIsolate(), + "Fetches with duplicate requests are not yet supported. " + "Consider adding query params to make the requests unique. " + "For updates check http://crbug.com/871174")); } ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
diff --git a/third_party/blink/renderer/modules/device_orientation/device_motion_controller.cc b/third_party/blink/renderer/modules/device_orientation/device_motion_controller.cc index 01c1ade..4e4431b 100644 --- a/third_party/blink/renderer/modules/device_orientation/device_motion_controller.cc +++ b/third_party/blink/renderer/modules/device_orientation/device_motion_controller.cc
@@ -92,12 +92,12 @@ frame->GetTaskRunner(TaskType::kSensor); motion_event_pump_ = new DeviceMotionEventPump(task_runner); } - motion_event_pump_->AddController(this); + motion_event_pump_->SetController(this); } void DeviceMotionController::UnregisterWithDispatcher() { if (motion_event_pump_) - motion_event_pump_->RemoveController(this); + motion_event_pump_->RemoveController(); } Event* DeviceMotionController::LastEvent() const {
diff --git a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.cc b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.cc index 0ef859c..47deaede 100644 --- a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.cc +++ b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.cc
@@ -4,9 +4,12 @@ #include <cmath> +#include "base/auto_reset.h" #include "services/device/public/mojom/sensor.mojom-blink.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/frame/platform_event_controller.h" #include "third_party/blink/renderer/modules/device_orientation/device_motion_data.h" #include "third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.h" #include "ui/gfx/geometry/angle_conversions.h" @@ -33,13 +36,28 @@ StopIfObserving(); } +void DeviceMotionEventPump::SetController(PlatformEventController* controller) { + DCHECK(controller); + DCHECK(!controller_); + + controller_ = controller; + StartListening(controller_->GetDocument() + ? controller_->GetDocument()->GetFrame() + : nullptr); +} + +void DeviceMotionEventPump::RemoveController() { + controller_ = nullptr; + StopListening(); +} + DeviceMotionData* DeviceMotionEventPump::LatestDeviceMotionData() { return data_.Get(); } void DeviceMotionEventPump::Trace(blink::Visitor* visitor) { visitor->Trace(data_); - PlatformEventDispatcher::Trace(visitor); + visitor->Trace(controller_); } void DeviceMotionEventPump::StartListening(LocalFrame* frame) { @@ -81,13 +99,18 @@ gyroscope_.Stop(); } +void DeviceMotionEventPump::NotifyController() { + DCHECK(controller_); + controller_->DidUpdateData(); +} + void DeviceMotionEventPump::FireEvent(TimerBase*) { DeviceMotionData* data = GetDataFromSharedMemory(); // data is null if not all sensors are active if (data) { data_ = data; - NotifyControllers(); + NotifyController(); } }
diff --git a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.h b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.h index 751d5660..b9f3017 100644 --- a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.h +++ b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump.h
@@ -6,7 +6,6 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_DEVICE_ORIENTATION_DEVICE_MOTION_EVENT_PUMP_H_ #include "base/macros.h" -#include "third_party/blink/renderer/core/frame/platform_event_dispatcher.h" #include "third_party/blink/renderer/modules/device_orientation/device_sensor_event_pump.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -14,21 +13,22 @@ namespace blink { class DeviceMotionData; +class PlatformEventController; class MODULES_EXPORT DeviceMotionEventPump : public GarbageCollectedFinalized<DeviceMotionEventPump>, - public DeviceSensorEventPump, - public PlatformEventDispatcher { - USING_GARBAGE_COLLECTED_MIXIN(DeviceMotionEventPump); - + public DeviceSensorEventPump { public: explicit DeviceMotionEventPump(scoped_refptr<base::SingleThreadTaskRunner>); ~DeviceMotionEventPump() override; + void SetController(PlatformEventController*); + void RemoveController(); + // Note that the returned object is owned by this class. DeviceMotionData* LatestDeviceMotionData(); - void Trace(blink::Visitor*) override; + void Trace(blink::Visitor*); // DeviceSensorEventPump: void SendStartMessage(LocalFrame* frame) override; @@ -45,9 +45,9 @@ private: friend class DeviceMotionEventPumpTest; - // Inherited from PlatformEventDispatcher. - void StartListening(LocalFrame*) override; - void StopListening() override; + void StartListening(LocalFrame*); + void StopListening(); + void NotifyController(); // DeviceSensorEventPump: bool SensorsReadyOrErrored() const override; @@ -55,6 +55,7 @@ DeviceMotionData* GetDataFromSharedMemory(); Member<DeviceMotionData> data_; + WeakMember<PlatformEventController> controller_; DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPump); };
diff --git a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump_unittest.cc b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump_unittest.cc index a9d5238ec..3001690 100644 --- a/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump_unittest.cc +++ b/third_party/blink/renderer/modules/device_orientation/device_motion_event_pump_unittest.cc
@@ -46,13 +46,11 @@ int number_of_events() const { return number_of_events_; } - void RegisterWithDispatcher() override { motion_pump_->AddController(this); } + void RegisterWithDispatcher() override { motion_pump_->SetController(this); } bool HasLastData() override { return motion_pump_->LatestDeviceMotionData(); } - void UnregisterWithDispatcher() override { - motion_pump_->RemoveController(this); - } + void UnregisterWithDispatcher() override { motion_pump_->RemoveController(); } const DeviceMotionData* data() { return motion_pump_->LatestDeviceMotionData();
diff --git a/third_party/blink/renderer/modules/encoding/BUILD.gn b/third_party/blink/renderer/modules/encoding/BUILD.gn index 62605ab..c89c50ed 100644 --- a/third_party/blink/renderer/modules/encoding/BUILD.gn +++ b/third_party/blink/renderer/modules/encoding/BUILD.gn
@@ -10,7 +10,11 @@ "encoding.h", "text_decoder.cc", "text_decoder.h", + "text_decoder_stream.cc", + "text_decoder_stream.h", "text_encoder.cc", "text_encoder.h", + "text_encoder_stream.cc", + "text_encoder_stream.h", ] }
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc new file mode 100644 index 0000000..7da3213 --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
@@ -0,0 +1,212 @@ +// 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 "third_party/blink/renderer/modules/encoding/text_decoder_stream.h" + +#include <memory> +#include <utility> + +#include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h" +#include "third_party/blink/renderer/core/streams/transform_stream_transformer.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h" +#include "third_party/blink/renderer/modules/encoding/encoding.h" +#include "third_party/blink/renderer/modules/encoding/text_decoder_options.h" +#include "third_party/blink/renderer/platform/bindings/exception_messages.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/bindings/to_v8.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" +#include "third_party/blink/renderer/platform/wtf/string_extras.h" +#include "third_party/blink/renderer/platform/wtf/text/text_codec.h" +#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" +#include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h" + +namespace blink { + +class TextDecoderStream::Transformer final : public TransformStreamTransformer { + public: + explicit Transformer(ScriptState* script_state, + WTF::TextEncoding encoding, + bool fatal, + bool ignore_bom) + : decoder_(NewTextCodec(encoding)), + script_state_(script_state), + fatal_(fatal), + ignore_bom_(ignore_bom), + encoding_has_bom_removal_(EncodingHasBomRemoval(encoding)) {} + + // Implements the type conversion part of the "decode and enqueue a chunk" + // algorithm. + void Transform(v8::Local<v8::Value> chunk, + TransformStreamDefaultController* controller, + ExceptionState& exception_state) override { + ArrayBufferOrArrayBufferView bufferSource; + V8ArrayBufferOrArrayBufferView::ToImpl( + script_state_->GetIsolate(), chunk, bufferSource, + UnionTypeConversionMode::kNotNullable, exception_state); + if (exception_state.HadException()) + return; + + // This implements the "get a copy of the bytes held by the buffer source" + // algorithm (https://heycam.github.io/webidl/#dfn-get-buffer-source-copy). + if (bufferSource.IsArrayBufferView()) { + const auto* view = bufferSource.GetAsArrayBufferView().View(); + // If IsDetachedBuffer(O), then throw a TypeError. + if (view->buffer()->IsNeutered()) { + exception_state.ThrowTypeError( + ExceptionMessages::FailedToConvertJSValue("BufferSource")); + return; + } + const char* start = static_cast<const char*>(view->BaseAddress()); + size_t length = view->byteLength(); + DecodeAndEnqueue(start, length, WTF::FlushBehavior::kDoNotFlush, + controller, exception_state); + return; + } + DCHECK(bufferSource.IsArrayBuffer()); + const auto* array_buffer = bufferSource.GetAsArrayBuffer(); + // If IsDetachedBuffer(O), then throw a TypeError. + if (array_buffer->IsNeutered()) { + exception_state.ThrowTypeError( + ExceptionMessages::FailedToConvertJSValue("BufferSource")); + return; + } + const char* start = static_cast<const char*>(array_buffer->Data()); + size_t length = array_buffer->ByteLength(); + DecodeAndEnqueue(start, length, WTF::FlushBehavior::kDoNotFlush, controller, + exception_state); + } + + // Implements the "encode and flush" algorithm. + void Flush(TransformStreamDefaultController* controller, + ExceptionState& exception_state) override { + DecodeAndEnqueue(nullptr, 0u, WTF::FlushBehavior::kDataEOF, controller, + exception_state); + } + + void Trace(Visitor* visitor) override { + visitor->Trace(script_state_); + TransformStreamTransformer::Trace(visitor); + } + + private: + // Implements the second part of "decode and enqueue a chunk" as well as the + // "flush and enqueue" algorithm. + void DecodeAndEnqueue(const char* start, + size_t length, + WTF::FlushBehavior flush, + TransformStreamDefaultController* controller, + ExceptionState& exception_state) { + const UChar kBOM = 0xFEFF; + + bool saw_error = false; + String outputChunk = + decoder_->Decode(start, length, flush, fatal_, saw_error); + + if (fatal_ && saw_error) { + exception_state.ThrowTypeError("The encoded data was not valid."); + return; + } + + if (outputChunk.IsEmpty()) + return; + + if (!ignore_bom_ && !bom_seen_) { + bom_seen_ = true; + if (encoding_has_bom_removal_ && outputChunk[0] == kBOM) { + outputChunk.Remove(0); + if (outputChunk.IsEmpty()) + return; + } + } + + controller->Enqueue(ToV8(outputChunk, script_state_), exception_state); + } + + static bool EncodingHasBomRemoval(const WTF::TextEncoding& encoding) { + String name(encoding.GetName()); + return name == "UTF-8" || name == "UTF-16LE" || name == "UTF-16BE"; + } + + std::unique_ptr<WTF::TextCodec> decoder_; + // There is no danger of ScriptState leaking across worlds because a + // TextDecoderStream can only be accessed from the world that created it. + Member<ScriptState> script_state_; + const bool fatal_; + const bool ignore_bom_; + const bool encoding_has_bom_removal_; + bool bom_seen_; + + DISALLOW_COPY_AND_ASSIGN(Transformer); +}; + +TextDecoderStream* TextDecoderStream::Create(ScriptState* script_state, + const String& label, + const TextDecoderOptions& options, + ExceptionState& exception_state) { + WTF::TextEncoding encoding( + label.StripWhiteSpace(&Encoding::IsASCIIWhiteSpace)); + // The replacement encoding is not valid, but the Encoding API also + // rejects aliases of the replacement encoding. + if (!encoding.IsValid() || + strcasecmp(encoding.GetName(), "replacement") == 0) { + exception_state.ThrowRangeError("The encoding label provided ('" + label + + "') is invalid."); + return nullptr; + } + + return new TextDecoderStream(script_state, encoding, options, + exception_state); +} + +TextDecoderStream::~TextDecoderStream() = default; + +String TextDecoderStream::encoding() const { + return String(encoding_.GetName()).LowerASCII(); +} + +ScriptValue TextDecoderStream::readable(ScriptState* script_state, + ExceptionState& exception_state) const { + return transform_->Readable(script_state, exception_state); +} + +ScriptValue TextDecoderStream::writable(ScriptState* script_state, + ExceptionState& exception_state) const { + return transform_->Writable(script_state, exception_state); +} + +void TextDecoderStream::Trace(Visitor* visitor) { + visitor->Trace(transform_); + ScriptWrappable::Trace(visitor); +} + +// static +void TextDecoderStream::Noop(ScriptValue) {} + +void TextDecoderStream::RetainWrapperUntilV8WrapperGetReturnedToV8( + ScriptState* script_state) { + ExecutionContext::From(script_state) + ->GetTaskRunner(TaskType::kInternalDefault) + ->PostTask( + FROM_HERE, + WTF::Bind(Noop, ScriptValue(script_state, ToV8(this, script_state)))); +} + +TextDecoderStream::TextDecoderStream(ScriptState* script_state, + const WTF::TextEncoding& encoding, + const TextDecoderOptions& options, + ExceptionState& exception_state) + : transform_(new TransformStream()), + encoding_(encoding), + fatal_(options.fatal()), + ignore_bom_(options.ignoreBOM()) { + RetainWrapperUntilV8WrapperGetReturnedToV8(script_state); + transform_->Init(new Transformer(script_state, encoding, fatal_, ignore_bom_), + script_state, exception_state); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.h b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h new file mode 100644 index 0000000..406d598 --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
@@ -0,0 +1,73 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_DECODER_STREAM_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_DECODER_STREAM_H_ + +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/core/streams/transform_stream.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h" +#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ExceptionState; +class ScriptState; +class TextDecoderOptions; +class Visitor; + +// Implements the TextDecoderStream interface as specified at +// https://encoding.spec.whatwg.org/#interface-textdecoderstream. +// Converts a stream of binary data in the form of BufferSource chunks to a +// stream of text data in the form of string chunks. After construction +// functionality is delegated to the owner TransformStream. +class TextDecoderStream final : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + static TextDecoderStream* Create(ScriptState*, + const String& label, + const TextDecoderOptions&, + ExceptionState&); + ~TextDecoderStream() override; + + // From text_decoder_stream.idl + String encoding() const; + bool fatal() const { return fatal_; } + bool ignoreBOM() const { return ignore_bom_; } + ScriptValue readable(ScriptState*, ExceptionState&) const; + ScriptValue writable(ScriptState*, ExceptionState&) const; + + void Trace(Visitor* visitor) override; + + private: + class Transformer; + static void Noop(ScriptValue); + + TextDecoderStream(ScriptState*, + const WTF::TextEncoding&, + const TextDecoderOptions&, + ExceptionState&); + + // We need to keep the wrapper alive in order to make |transform_| alive. We + // can create a wrapper in the constructor, but there is a chance that GC + // happens after construction happens before the wrapper is connected to the + // value returned to the user in the JS world. This function posts a task with + // a ScriptPromise containing the wrapper to avoid that. + // TODO(ricea): Remove this once the unified GC is available. + void RetainWrapperUntilV8WrapperGetReturnedToV8(ScriptState*); + + const TraceWrapperMember<TransformStream> transform_; + const WTF::TextEncoding encoding_; + const bool fatal_; + const bool ignore_bom_; + + DISALLOW_COPY_AND_ASSIGN(TextDecoderStream); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_DECODER_STREAM_H_
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.idl b/third_party/blink/renderer/modules/encoding/text_decoder_stream.idl new file mode 100644 index 0000000..cf5600ce --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.idl
@@ -0,0 +1,19 @@ +// 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. + +// https://encoding.spec.whatwg.org/#interface-textdecoderstream +[ + Exposed=(Window,Worker), + Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options), + ConstructorCallWith=ScriptState, + RaisesException=Constructor, + MeasureAs=TextDecoderStreamConstructor, + RuntimeEnabled=EncodingStreams +] interface TextDecoderStream { + readonly attribute DOMString encoding; + readonly attribute boolean fatal; + readonly attribute boolean ignoreBOM; + [CallWith=ScriptState, RaisesException] readonly attribute any readable; + [CallWith=ScriptState, RaisesException] readonly attribute any writable; +};
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc new file mode 100644 index 0000000..130874d --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
@@ -0,0 +1,216 @@ +// 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 "third_party/blink/renderer/modules/encoding/text_encoder_stream.h" + +#include <stdint.h> +#include <string.h> + +#include <memory> +#include <utility> + +#include "base/optional.h" +#include "base/stl_util.h" +#include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h" +#include "third_party/blink/renderer/core/streams/transform_stream_transformer.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/bindings/to_v8.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" +#include "third_party/blink/renderer/platform/wtf/text/cstring.h" +#include "third_party/blink/renderer/platform/wtf/text/text_codec.h" +#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" +#include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h" +#include "v8/include/v8.h" + +namespace blink { + +class TextEncoderStream::Transformer final : public TransformStreamTransformer { + public: + explicit Transformer(ScriptState* script_state) + : encoder_(NewTextCodec(WTF::TextEncoding("utf-8"))), + script_state_(script_state) {} + + // Implements the "encode and enqueue a chunk" algorithm. For efficiency, only + // the characters at the end of chunks are special-cased. + void Transform(v8::Local<v8::Value> chunk, + TransformStreamDefaultController* controller, + ExceptionState& exception_state) override { + // Let |input| be the result of converting |chunk| to a DOMString. If this + // throws an exception, then return a promise rejected with that exception. + V8StringResource<> input_resource = chunk; + if (!input_resource.Prepare(script_state_->GetIsolate(), exception_state)) + return; + const String input = input_resource; + if (input.IsEmpty()) + return; + + const base::Optional<UChar> high_surrogate = pending_high_surrogate_; + pending_high_surrogate_ = base::nullopt; + CString prefix; + CString result; + if (input.Is8Bit()) { + if (high_surrogate.has_value()) { + // An 8-bit code unit can never be part of an astral character, so no + // check is needed. + prefix = ReplacementCharacterInUtf8(); + } + // Note that the third argument here is ignored since the encoding is + // UTF-8, which will use U+FFFD-replacement rather than ASCII fallback + // substitution when unencodable sequences (for instance, unpaired UTF-16 + // surrogates) are present in the input. + // TODO(ricea): Add WTF::kNoUnencodables enum value to make this + // behaviour explicit for UTF-N encodings. + result = encoder_->Encode(input.Characters8(), input.length(), + WTF::kEntitiesForUnencodables); + } else { + bool have_output = + Encode16BitString(input, high_surrogate, &prefix, &result); + if (!have_output) + return; + } + + DOMUint8Array* array = + CreateDOMUint8ArrayFromTwoCStringsConcatenated(prefix, result); + controller->Enqueue(ToV8(array, script_state_), exception_state); + } + + // Implements the "encode and flush" algorithm. + void Flush(TransformStreamDefaultController* controller, + ExceptionState& exception_state) override { + if (!pending_high_surrogate_.has_value()) + return; + + const CString replacement_character = ReplacementCharacterInUtf8(); + const uint8_t* u8buffer = + reinterpret_cast<const uint8_t*>(replacement_character.data()); + controller->Enqueue( + ToV8(DOMUint8Array::Create(u8buffer, replacement_character.length()), + script_state_), + exception_state); + } + + void Trace(Visitor* visitor) override { + visitor->Trace(script_state_); + TransformStreamTransformer::Trace(visitor); + } + + private: + static CString ReplacementCharacterInUtf8() { + constexpr char kRawBytes[] = {0xEF, 0xBF, 0xBD}; + return CString(kRawBytes, sizeof(kRawBytes)); + } + + static DOMUint8Array* CreateDOMUint8ArrayFromTwoCStringsConcatenated( + const CString& string1, + const CString& string2) { + const size_t length1 = string1.length(); + const size_t length2 = string2.length(); + DOMUint8Array* const array = DOMUint8Array::Create(length1 + length2); + if (length1 > 0) + memcpy(array->Data(), string1.data(), length1); + if (length2 > 0) + memcpy(array->Data() + length1, string2.data(), length2); + return array; + } + + // Returns true if either |*prefix| or |*result| have been set to a non-empty + // value. + bool Encode16BitString(const String& input, + base::Optional<UChar> high_surrogate, + CString* prefix, + CString* result) { + const UChar* begin = input.Characters16(); + const UChar* end = input.Characters16() + input.length(); + DCHECK_GT(end, begin); + if (high_surrogate.has_value()) { + if (*begin >= 0xDC00 && *begin <= 0xDFFF) { + const UChar astral_character[2] = {high_surrogate.value(), *begin}; + // Third argument is ignored, as above. + *prefix = + encoder_->Encode(astral_character, base::size(astral_character), + WTF::kEntitiesForUnencodables); + ++begin; + if (begin == end) + return true; + } else { + *prefix = ReplacementCharacterInUtf8(); + } + } + + const UChar final_token = *(end - 1); + if (final_token >= 0xD800 && final_token <= 0xDBFF) { + pending_high_surrogate_ = final_token; + --end; + if (begin == end) + return prefix->length() != 0; + } + + // Third argument is ignored, as above. + *result = + encoder_->Encode(begin, end - begin, WTF::kEntitiesForUnencodables); + DCHECK_NE(result->length(), 0u); + return true; + } + + std::unique_ptr<WTF::TextCodec> encoder_; + // There is no danger of ScriptState leaking across worlds because a + // TextEncoderStream can only be accessed from the world that created it. + Member<ScriptState> script_state_; + base::Optional<UChar> pending_high_surrogate_; + + DISALLOW_COPY_AND_ASSIGN(Transformer); +}; + +TextEncoderStream* TextEncoderStream::Create(ScriptState* script_state, + ExceptionState& exception_state) { + return new TextEncoderStream(script_state, exception_state); +} + +TextEncoderStream::~TextEncoderStream() = default; + +String TextEncoderStream::encoding() const { + return "utf-8"; +} + +ScriptValue TextEncoderStream::readable(ScriptState* script_state, + ExceptionState& exception_state) const { + return transform_->Readable(script_state, exception_state); +} + +ScriptValue TextEncoderStream::writable(ScriptState* script_state, + ExceptionState& exception_state) const { + return transform_->Writable(script_state, exception_state); +} + +void TextEncoderStream::Trace(Visitor* visitor) { + visitor->Trace(transform_); + ScriptWrappable::Trace(visitor); +} + +// static +void TextEncoderStream::Noop(ScriptValue) {} + +void TextEncoderStream::RetainWrapperUntilV8WrapperGetReturnedToV8( + ScriptState* script_state) { + ExecutionContext::From(script_state) + ->GetTaskRunner(TaskType::kInternalDefault) + ->PostTask( + FROM_HERE, + WTF::Bind(Noop, ScriptValue(script_state, ToV8(this, script_state)))); +} + +TextEncoderStream::TextEncoderStream(ScriptState* script_state, + ExceptionState& exception_state) + : transform_(new TransformStream()) { + RetainWrapperUntilV8WrapperGetReturnedToV8(script_state); + transform_->Init(new Transformer(script_state), script_state, + exception_state); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.h b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h new file mode 100644 index 0000000..75b4aa6 --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
@@ -0,0 +1,61 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_ENCODER_STREAM_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_ENCODER_STREAM_H_ + +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/core/streams/transform_stream.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ExceptionState; +class ScriptState; +class Visitor; + +// Implements the TextDecoderStream interface as specified at +// https://encoding.spec.whatwg.org/#interface-textencoderstream. +// Converts a stream of text data in the form of string chunks to a stream of +// binary data in the form of UInt8Array chunks. After construction +// functionality is delegated to the owned TransformStream. +class TextEncoderStream final : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + static TextEncoderStream* Create(ScriptState*, ExceptionState&); + ~TextEncoderStream() override; + + // From text_encoder_stream.idl + String encoding() const; + ScriptValue readable(ScriptState*, ExceptionState&) const; + ScriptValue writable(ScriptState*, ExceptionState&) const; + + void Trace(Visitor* visitor) override; + + private: + class Transformer; + static void Noop(ScriptValue); + + TextEncoderStream(ScriptState*, ExceptionState&); + + // We need to keep the wrapper alive in order to make + // |transform_| alive. We can create a wrapper in the constructor, but there + // is a chance that GC happens after construction happens before the wrapper + // is connected to the value returned to the user in the JS world. This + // function posts a task with a ScriptPromise containing the wrapper to avoid + // that. + // TODO(ricea): Remove this once the unified GC is available. + void RetainWrapperUntilV8WrapperGetReturnedToV8(ScriptState*); + + const TraceWrapperMember<TransformStream> transform_; + + DISALLOW_COPY_AND_ASSIGN(TextEncoderStream); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_ENCODING_TEXT_ENCODER_STREAM_H_
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.idl b/third_party/blink/renderer/modules/encoding/text_encoder_stream.idl new file mode 100644 index 0000000..98ee518 --- /dev/null +++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.idl
@@ -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. + +// https://encoding.spec.whatwg.org/#interface-textencoderstream +[ + Exposed=(Window,Worker), + Constructor(), + ConstructorCallWith=ScriptState, + RaisesException=Constructor, + MeasureAs=TextEncoderStreamConstructor, + RuntimeEnabled=EncodingStreams +] interface TextEncoderStream { + readonly attribute DOMString encoding; + [CallWith=ScriptState, RaisesException] readonly attribute any readable; + [CallWith=ScriptState, RaisesException] readonly attribute any writable; +};
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc index 28a9aa8..6a32641 100644 --- a/third_party/blink/renderer/modules/exported/web_ax_object.cc +++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -260,13 +260,6 @@ return private_->IsClickable(); } -bool WebAXObject::IsCollapsed() const { - if (IsDetached()) - return false; - - return private_->IsCollapsed(); -} - bool WebAXObject::IsControl() const { if (IsDetached()) return false;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc index b4d02b1..7381e7f 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc
@@ -125,7 +125,8 @@ opaque_ = false; } -void MediaControlPanelElement::RemovedFrom(ContainerNode&) { +void MediaControlPanelElement::RemovedFrom(ContainerNode& insertion_point) { + MediaControlDivElement::RemovedFrom(insertion_point); DetachTransitionEventListener(); }
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc index d158961..f44fe39 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc
@@ -49,6 +49,7 @@ } MediaControlPanelElement& GetPanel() { return *panel_element_.Get(); } + HTMLMediaElement& GetMediaElement() { return *media_element_.Get(); } private: void TriggerEvent(const AtomicString& name) { @@ -89,4 +90,12 @@ ExpectPanelIsDisplayed(); } +TEST_F(MediaControlPanelElementTest, isConnected) { + EXPECT_TRUE( + GetMediaElement().GetMediaControls()->PanelElement()->isConnected()); + GetMediaElement().remove(); + EXPECT_FALSE( + GetMediaElement().GetMediaControls()->PanelElement()->isConnected()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc index fa2415ec..335e4b98 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -813,8 +813,7 @@ HTMLDivElement::RemovedFrom(insertion_point); - // TODO(mlamouri): we hide show the controls instead of having - // HTMLMediaElement do it. + Hide(); media_event_listener_->Detach(); if (orientation_lock_delegate_)
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc index 068058a8..8846ee41 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -428,12 +428,10 @@ result.goog_payload_padding.SetExact(ToBoolean(constraint.value_)); } else if (constraint.name_.Equals(kAudioLatency)) { result.goog_latency_ms.SetExact(atoi(constraint.value_.Utf8().c_str())); - } else if (constraint.name_.Equals(kPowerLineFrequency)) { - result.goog_power_line_frequency.SetExact( - atoi(constraint.value_.Utf8().c_str())); } else if (constraint.name_.Equals(kGoogLeakyBucket) || constraint.name_.Equals(kGoogBeamforming) || - constraint.name_.Equals(kGoogArrayGeometry)) { + constraint.name_.Equals(kGoogArrayGeometry) || + constraint.name_.Equals(kPowerLineFrequency)) { // TODO(crbug.com/856176): Remove the kGoogBeamforming and // kGoogArrayGeometry special cases. context->AddConsoleMessage(ConsoleMessage::Create( @@ -793,7 +791,7 @@ } NOTREACHED(); return false; -}; +} template <class T> bool UseNakedNonNumeric(T input, NakedValueDisposition which) { @@ -807,7 +805,7 @@ } NOTREACHED(); return false; -}; +} template <typename U, class T> U GetNakedValue(T input, NakedValueDisposition which) { @@ -821,7 +819,7 @@ } NOTREACHED(); return input.Exact(); -}; +} LongOrConstrainLongRange ConvertLong(const LongConstraint& input, NakedValueDisposition naked_treatment) {
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_client.cc b/third_party/blink/renderer/modules/mediastream/user_media_client.cc index 68eb294..6096ec2 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_client.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_client.cc
@@ -69,4 +69,11 @@ } } +bool UserMediaClient::IsCapturing() { + if (!client_) + return false; + + return client_->IsCapturing(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_client.h b/third_party/blink/renderer/modules/mediastream/user_media_client.h index 2eb60d43..9e9e943 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_client.h +++ b/third_party/blink/renderer/modules/mediastream/user_media_client.h
@@ -56,6 +56,7 @@ void CancelUserMediaRequest(UserMediaRequest*); void ApplyConstraints(ApplyConstraintsRequest*); void StopTrack(MediaStreamComponent*); + bool IsCapturing(); private: explicit UserMediaClient(WebUserMediaClient*);
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc index 03c2b2a..64361af 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -282,11 +282,6 @@ constraints, &WebMediaTrackConstraintSet::goog_noise_reduction)) { counter.Count(WebFeature::kMediaStreamConstraintsGoogNoiseReduction); } - if (RequestUsesNumericConstraint( - constraints, - &WebMediaTrackConstraintSet::goog_power_line_frequency)) { - counter.Count(WebFeature::kMediaStreamConstraintsGoogPowerLineFrequency); - } UseCounter::Count(context, WebFeature::kMediaStreamConstraintsVideo); if (counter.IsUnconstrained()) {
diff --git a/third_party/blink/renderer/modules/mediastream/window_media_stream.idl b/third_party/blink/renderer/modules/mediastream/window_media_stream.idl index 63c2c59..ecb82580 100644 --- a/third_party/blink/renderer/modules/mediastream/window_media_stream.idl +++ b/third_party/blink/renderer/modules/mediastream/window_media_stream.idl
@@ -5,7 +5,7 @@ [ ImplementedAs=DOMWindowMediaStream ] partial interface Window { - attribute MediaStreamConstructor webkitMediaStream; + [Measure] attribute MediaStreamConstructor webkitMediaStream; - attribute RTCPeerConnectionConstructor webkitRTCPeerConnection; + [Measure] attribute RTCPeerConnectionConstructor webkitRTCPeerConnection; };
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index ced4d06..e819e07 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -112,7 +112,9 @@ "device_orientation/device_orientation_event.idl", "device_orientation/device_rotation_rate.idl", "encoding/text_decoder.idl", + "encoding/text_decoder_stream.idl", "encoding/text_encoder.idl", + "encoding/text_encoder_stream.idl", "encryptedmedia/media_encrypted_event.idl", "encryptedmedia/media_key_message_event.idl", "encryptedmedia/media_key_session.idl",
diff --git a/third_party/blink/renderer/modules/payments/payments_validators.cc b/third_party/blink/renderer/modules/payments/payments_validators.cc index 3b2bdecc..a90ef34 100644 --- a/third_party/blink/renderer/modules/payments/payments_validators.cc +++ b/third_party/blink/renderer/modules/payments/payments_validators.cc
@@ -5,6 +5,8 @@ #include "third_party/blink/renderer/modules/payments/payments_validators.h" #include "third_party/blink/renderer/bindings/core/v8/script_regexp.h" +#include "third_party/blink/renderer/modules/payments/address_errors.h" +#include "third_party/blink/renderer/modules/payments/payer_error_fields.h" #include "third_party/blink/renderer/modules/payments/payment_validation_errors.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/string_impl.h" @@ -126,65 +128,60 @@ } // static +bool PaymentsValidators::IsValidAddressErrorsFormat( + const AddressErrors& errors, + String* optional_error_message) { + return (!errors.hasAddressLine() || + IsValidErrorMsgFormat(errors.addressLine(), + optional_error_message)) && + (!errors.hasCity() || + IsValidErrorMsgFormat(errors.city(), optional_error_message)) && + (!errors.hasCountry() || + IsValidErrorMsgFormat(errors.country(), optional_error_message)) && + (!errors.hasDependentLocality() || + IsValidErrorMsgFormat(errors.dependentLocality(), + optional_error_message)) && + (!errors.hasLanguageCode() || + IsValidErrorMsgFormat(errors.languageCode(), + optional_error_message)) && + (!errors.hasOrganization() || + IsValidErrorMsgFormat(errors.organization(), + optional_error_message)) && + (!errors.hasPhone() || + IsValidErrorMsgFormat(errors.phone(), optional_error_message)) && + (!errors.hasPostalCode() || + IsValidErrorMsgFormat(errors.postalCode(), optional_error_message)) && + (!errors.hasRecipient() || + IsValidErrorMsgFormat(errors.recipient(), optional_error_message)) && + (!errors.hasRegion() || + IsValidErrorMsgFormat(errors.region(), optional_error_message)) && + (!errors.hasRegionCode() || + IsValidErrorMsgFormat(errors.regionCode(), optional_error_message)) && + (!errors.hasSortingCode() || + IsValidErrorMsgFormat(errors.sortingCode(), optional_error_message)); +} + +// static +bool PaymentsValidators::IsValidPayerErrorsFormat( + const PayerErrorFields& errors, + String* optional_error_message) { + return (!errors.hasEmail() || + IsValidErrorMsgFormat(errors.email(), optional_error_message)) && + (!errors.hasName() || + IsValidErrorMsgFormat(errors.name(), optional_error_message)) && + (!errors.hasPhone() || + IsValidErrorMsgFormat(errors.phone(), optional_error_message)); +} + +// static bool PaymentsValidators::IsValidPaymentValidationErrorsFormat( const PaymentValidationErrors& errors, String* optional_error_message) { - if (errors.hasPayer()) { - if ((errors.payer().hasEmail() && - !IsValidErrorMsgFormat(errors.payer().email(), - optional_error_message)) || - (errors.payer().hasName() && - !IsValidErrorMsgFormat(errors.payer().name(), - optional_error_message)) || - (errors.payer().hasPhone() && - !IsValidErrorMsgFormat(errors.payer().phone(), - optional_error_message))) { - return false; - } - } - - if (errors.hasShippingAddress()) { - if ((errors.shippingAddress().hasAddressLine() && - !IsValidErrorMsgFormat(errors.shippingAddress().addressLine(), - optional_error_message)) || - (errors.shippingAddress().hasCity() && - !IsValidErrorMsgFormat(errors.shippingAddress().city(), - optional_error_message)) || - (errors.shippingAddress().hasCountry() && - !IsValidErrorMsgFormat(errors.shippingAddress().country(), - optional_error_message)) || - (errors.shippingAddress().hasDependentLocality() && - !IsValidErrorMsgFormat(errors.shippingAddress().dependentLocality(), - optional_error_message)) || - (errors.shippingAddress().hasLanguageCode() && - !IsValidErrorMsgFormat(errors.shippingAddress().languageCode(), - optional_error_message)) || - (errors.shippingAddress().hasOrganization() && - !IsValidErrorMsgFormat(errors.shippingAddress().organization(), - optional_error_message)) || - (errors.shippingAddress().hasPhone() && - !IsValidErrorMsgFormat(errors.shippingAddress().phone(), - optional_error_message)) || - (errors.shippingAddress().hasPostalCode() && - !IsValidErrorMsgFormat(errors.shippingAddress().postalCode(), - optional_error_message)) || - (errors.shippingAddress().hasRecipient() && - !IsValidErrorMsgFormat(errors.shippingAddress().recipient(), - optional_error_message)) || - (errors.shippingAddress().hasRegion() && - !IsValidErrorMsgFormat(errors.shippingAddress().region(), - optional_error_message)) || - (errors.shippingAddress().hasRegionCode() && - !IsValidErrorMsgFormat(errors.shippingAddress().regionCode(), - optional_error_message)) || - (errors.shippingAddress().hasSortingCode() && - !IsValidErrorMsgFormat(errors.shippingAddress().sortingCode(), - optional_error_message))) { - return false; - } - } - - return true; + return (!errors.hasPayer() || + IsValidPayerErrorsFormat(errors.payer(), optional_error_message)) && + (!errors.hasShippingAddress() || + IsValidAddressErrorsFormat(errors.shippingAddress(), + optional_error_message)); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/payments/payments_validators.h b/third_party/blink/renderer/modules/payments/payments_validators.h index c9c2f86..92d36e33 100644 --- a/third_party/blink/renderer/modules/payments/payments_validators.h +++ b/third_party/blink/renderer/modules/payments/payments_validators.h
@@ -12,6 +12,8 @@ namespace blink { +class AddressErrors; +class PayerErrorFields; class PaymentValidationErrors; class MODULES_EXPORT PaymentsValidators final { @@ -54,8 +56,15 @@ static bool IsValidErrorMsgFormat(const String& code, String* optional_error_message); - // Returns false if |payment_validation_errors| has too long string (greater - // than 2048). + // Returns false if |errors| has too long string (greater than 2048). + static bool IsValidAddressErrorsFormat(const AddressErrors& errors, + String* optional_error_message); + + // Returns false if |errors| has too long string (greater than 2048). + static bool IsValidPayerErrorsFormat(const PayerErrorFields& errors, + String* optional_error_message); + + // Returns false if |errors| has too long string (greater than 2048). static bool IsValidPaymentValidationErrorsFormat( const PaymentValidationErrors& errors, String* optional_error_message);
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc index 42711dda..bc1a049 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -166,17 +166,13 @@ } void PresentationConnection::OnMessage( - mojom::blink::PresentationConnectionMessagePtr message, - OnMessageCallback callback) { - DCHECK(!callback.is_null()); + mojom::blink::PresentationConnectionMessagePtr message) { if (message->is_data()) { const auto& data = message->get_data(); DidReceiveBinaryMessage(&data.front(), data.size()); } else { DidReceiveTextMessage(message->get_message()); } - - std::move(callback).Run(true); } void PresentationConnection::DidChangeState( @@ -520,10 +516,8 @@ void PresentationConnection::SendMessageToTargetConnection( mojom::blink::PresentationConnectionMessagePtr message) { - if (target_connection_) { - target_connection_->OnMessage(std::move(message), - base::OnceCallback<void(bool)>()); - } + if (target_connection_) + target_connection_->OnMessage(std::move(message)); } void PresentationConnection::DidReceiveTextMessage(const WebString& message) {
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.h b/third_party/blink/renderer/modules/presentation/presentation_connection.h index c6adf86..54291a5 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.h +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.h
@@ -73,8 +73,7 @@ const String& message); // mojom::blink::PresentationConnection implementation. - void OnMessage(mojom::blink::PresentationConnectionMessagePtr, - OnMessageCallback) override; + void OnMessage(mojom::blink::PresentationConnectionMessagePtr) override; void DidChangeState(mojom::blink::PresentationConnectionState) override; void RequestClose() override;
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc index 4f50a22..058e63e 100644 --- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc +++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -548,10 +548,8 @@ } void RemotePlayback::OnMessage( - mojom::blink::PresentationConnectionMessagePtr message, - OnMessageCallback callback) { + mojom::blink::PresentationConnectionMessagePtr message) { // Messages are ignored. - std::move(callback).Run(true); } void RemotePlayback::DidChangeState(
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.h b/third_party/blink/renderer/modules/remoteplayback/remote_playback.h index fdf5b79..ea491030 100644 --- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.h +++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.h
@@ -106,8 +106,7 @@ void OnConnectionError(const mojom::blink::PresentationError&); // mojom::blink::PresentationConnection implementation. - void OnMessage(mojom::blink::PresentationConnectionMessagePtr, - OnMessageCallback) override; + void OnMessage(mojom::blink::PresentationConnectionMessagePtr) override; void DidChangeState(mojom::blink::PresentationConnectionState) override; void RequestClose() override;
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc index 8138d1b4..29fcd169 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc
@@ -32,8 +32,7 @@ // This blocks until the script is received from the browser. std::unique_ptr<WebServiceWorkerInstalledScriptsManager::RawScriptData> raw_script_data = manager_->GetRawScriptData(script_url); - DCHECK(raw_script_data); - if (!raw_script_data->IsValid()) { + if (!raw_script_data) { *out_script_data = InstalledScriptsManager::ScriptData(); return ScriptStatus::kFailed; }
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc index b985bd42..d403aa4 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc +++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/dom/frame_request_callback_collection.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h" +#include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/modules/xr/xr.h" #include "third_party/blink/renderer/modules/xr/xr_device.h" #include "third_party/blink/renderer/modules/xr/xr_presentation_context.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 7b47402..facea47 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -430,6 +430,8 @@ "bindings/origin_trial_features.h", "bindings/parkable_string.cc", "bindings/parkable_string.h", + "bindings/parkable_string_manager.cc", + "bindings/parkable_string_manager.h", "bindings/runtime_call_stats.cc", "bindings/runtime_call_stats.h", "bindings/scoped_persistent.h",
diff --git a/third_party/blink/renderer/platform/bindings/callback_interface_base.h b/third_party/blink/renderer/platform/bindings/callback_interface_base.h index 4f86ee39..dd83a4e5 100644 --- a/third_party/blink/renderer/platform/bindings/callback_interface_base.h +++ b/third_party/blink/renderer/platform/bindings/callback_interface_base.h
@@ -38,9 +38,21 @@ virtual void Trace(blink::Visitor*); + // Check the identity of |callback_object_|. There can be multiple + // CallbackInterfaceBase objects that have the same |callback_object_| but + // have different |incumbent_script_state_|s. + bool HasTheSameCallbackObject(const CallbackInterfaceBase& other) const { + return callback_object_ == other.callback_object_; + } + + v8::Local<v8::Object> CallbackObject() { + return callback_object_.NewLocal(GetIsolate()); + } + v8::Isolate* GetIsolate() { return callback_relevant_script_state_->GetIsolate(); } + ScriptState* CallbackRelevantScriptState() { return callback_relevant_script_state_; } @@ -55,9 +67,6 @@ CallbackInterfaceBase(v8::Local<v8::Object> callback_object, SingleOperationOrNot); - v8::Local<v8::Object> CallbackObject() { - return callback_object_.NewLocal(GetIsolate()); - } // Returns true iff the callback interface is a single operation callback // interface and the callback interface type value is callable. bool IsCallbackObjectCallable() const { return is_callback_object_callable_; }
diff --git a/third_party/blink/renderer/platform/bindings/dom_data_store.h b/third_party/blink/renderer/platform/bindings/dom_data_store.h index 93285e6..dc7c2e74 100644 --- a/third_party/blink/renderer/platform/bindings/dom_data_store.h +++ b/third_party/blink/renderer/platform/bindings/dom_data_store.h
@@ -37,6 +37,7 @@ #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h" #include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" #include "third_party/blink/renderer/platform/wtf/noncopyable.h" #include "third_party/blink/renderer/platform/wtf/stack_util.h" @@ -137,6 +138,8 @@ if (updated) { ScriptWrappableMarkingVisitor::WriteBarrier( isolate, &wrapper_map_.value(), object); + UnifiedHeapMarkingVisitor::WriteBarrier(isolate, &wrapper_map_.value(), + object); } return updated; }
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string.cc b/third_party/blink/renderer/platform/bindings/parkable_string.cc index 21f9781..1a8c9bb1 100644 --- a/third_party/blink/renderer/platform/bindings/parkable_string.cc +++ b/third_party/blink/renderer/platform/bindings/parkable_string.cc
@@ -5,18 +5,13 @@ #include "third_party/blink/renderer/platform/bindings/parkable_string.h" #include "base/metrics/histogram_macros.h" +#include "third_party/blink/renderer/platform/bindings/parkable_string_manager.h" #include "third_party/blink/renderer/platform/wtf/thread_specific.h" namespace blink { namespace { -bool IsLargeEnough(const StringImpl* impl) { - // Don't attempt to park strings smaller than this size. - static constexpr unsigned int kSizeThreshold = 10000; - return impl && impl->length() > kSizeThreshold; -} - void RecordParkingAction(ParkableStringImpl::ParkingAction action) { UMA_HISTOGRAM_ENUMERATION("Memory.MovableStringParkingAction", action); } @@ -29,7 +24,8 @@ : string_(std::move(impl)), is_parked_(false) {} ParkableStringImpl::~ParkableStringImpl() { - ParkableStringTable::Instance().Remove(string_.Impl()); + if (ParkableStringManager::ShouldPark(string_.Impl())) + ParkableStringManager::Instance().Remove(string_.Impl()); } bool ParkableStringImpl::Is8Bit() const { @@ -62,16 +58,16 @@ if (!is_parked_) return; - bool backgrounded = ParkableStringTable::Instance().IsRendererBackgrounded(); + bool backgrounded = + ParkableStringManager::Instance().IsRendererBackgrounded(); RecordParkingAction(backgrounded ? ParkingAction::kUnparkedInBackground : ParkingAction::kUnparkedInForeground); is_parked_ = false; } ParkableString::ParkableString(scoped_refptr<StringImpl>&& impl) { - // Don't park small strings. - if (IsLargeEnough(impl.get())) { - impl_ = ParkableStringTable::Instance().Add(std::move(impl)); + if (ParkableStringManager::ShouldPark(impl.get())) { + impl_ = ParkableStringManager::Instance().Add(std::move(impl)); } else { impl_ = base::MakeRefCounted<ParkableStringImpl>(std::move(impl)); } @@ -94,61 +90,4 @@ return impl_->CharactersSizeInBytes(); } -// static -ParkableStringTable& ParkableStringTable::Instance() { - static auto* table = new WTF::ThreadSpecific<ParkableStringTable>(); - return **table; -} - -ParkableStringTable::ParkableStringTable() = default; -ParkableStringTable::~ParkableStringTable() = default; - -scoped_refptr<ParkableStringImpl> ParkableStringTable::Add( - scoped_refptr<StringImpl>&& string) { - StringImpl* raw_ptr = string.get(); - auto it = table_.find(raw_ptr); - if (it != table_.end()) { - return it->second; - } - auto new_parkable_string = - base::MakeRefCounted<ParkableStringImpl>(std::move(string)); - table_.emplace(raw_ptr, new_parkable_string.get()); - return new_parkable_string; -} - -void ParkableStringTable::Remove(StringImpl* string) { - if (!IsLargeEnough(string)) - return; - - auto it = table_.find(string); - DCHECK(it != table_.end()); - table_.erase(it); -} - -void ParkableStringTable::SetRendererBackgrounded(bool backgrounded) { - backgrounded_ = backgrounded; -} - -bool ParkableStringTable::IsRendererBackgrounded() const { - return backgrounded_; -} - -void ParkableStringTable::MaybeParkAll() { - if (!IsRendererBackgrounded()) - return; - - size_t total_size = 0, count = 0; - for (auto& kv : table_) { - ParkableStringImpl* str = kv.second; - str->Park(); - total_size += str->CharactersSizeInBytes(); - count += 1; - } - - size_t total_size_kb = total_size / 1000; - UMA_HISTOGRAM_COUNTS_100000("Memory.MovableStringsTotalSizeKb", - total_size_kb); - UMA_HISTOGRAM_COUNTS_1000("Memory.MovableStringsCount", table_.size()); -} - } // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string.h b/third_party/blink/renderer/platform/bindings/parkable_string.h index f4c6ea0a7..b7efdd3 100644 --- a/third_party/blink/renderer/platform/bindings/parkable_string.h +++ b/third_party/blink/renderer/platform/bindings/parkable_string.h
@@ -97,39 +97,6 @@ scoped_refptr<ParkableStringImpl> impl_; }; -// Per-thread registry of all ParkableString instances. NOT thread-safe. -class PLATFORM_EXPORT ParkableStringTable final { - public: - ParkableStringTable(); - ~ParkableStringTable(); - - static ParkableStringTable& Instance(); - - scoped_refptr<ParkableStringImpl> Add(scoped_refptr<StringImpl>&&); - - // This is for ~ParkableStringImpl to unregister a string before - // destruction since the table is holding raw pointers. It should not be used - // directly. - void Remove(StringImpl*); - - void SetRendererBackgrounded(bool backgrounded); - bool IsRendererBackgrounded() const; - - // Parks all the strings in the table if currently in background. - void MaybeParkAll(); - - private: - bool backgrounded_; - // Could bet a set where the hashing function is - // ParkableStringImpl::string_.Impl(), but clearer this way. - std::map<StringImpl*, ParkableStringImpl*> table_; - - FRIEND_TEST_ALL_PREFIXES(ParkableStringTest, TableSimple); - FRIEND_TEST_ALL_PREFIXES(ParkableStringTest, TableMultiple); - - DISALLOW_COPY_AND_ASSIGN(ParkableStringTable); -}; - } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_PARKABLE_STRING_H_
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc new file mode 100644 index 0000000..8b62019 --- /dev/null +++ b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc
@@ -0,0 +1,98 @@ +// 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 "third_party/blink/renderer/platform/bindings/parkable_string_manager.h" + +#include <utility> + +#include "base/bind.h" +#include "base/macros.h" +#include "base/metrics/histogram_macros.h" +#include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/public/platform/web_thread.h" +#include "third_party/blink/renderer/platform/bindings/parkable_string.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "third_party/blink/renderer/platform/wtf/wtf.h" + +namespace blink { + +ParkableStringManager& ParkableStringManager::Instance() { + DCHECK(IsMainThread()); + static ParkableStringManager instance; + return instance; +} + +ParkableStringManager::~ParkableStringManager() {} + +void ParkableStringManager::SetRendererBackgrounded(bool backgrounded) { + backgrounded_ = backgrounded; + + if (backgrounded_) { + scoped_refptr<base::SingleThreadTaskRunner> task_runner = + Platform::Current()->CurrentThread()->GetTaskRunner(); + if (task_runner) { // nullptr in tests. + task_runner->PostDelayedTask( + FROM_HERE, + base::BindOnce(&ParkableStringManager::ParkAllIfRendererBackgrounded, + base::Unretained(this)), + base::TimeDelta::FromSeconds(10)); + } + } +} + +bool ParkableStringManager::IsRendererBackgrounded() const { + return backgrounded_; +} + +// static +bool ParkableStringManager::ShouldPark(const StringImpl* string) { + // Don't attempt to park strings smaller than this size. + static constexpr unsigned int kSizeThreshold = 10000; + // TODO(lizeb): Consider parking non-main thread strings. + return string && string->length() > kSizeThreshold && IsMainThread(); +} + +scoped_refptr<ParkableStringImpl> ParkableStringManager::Add( + scoped_refptr<StringImpl>&& string) { + StringImpl* raw_ptr = string.get(); + auto it = table_.find(raw_ptr); + if (it != table_.end()) + return it->value; + + auto new_parkable_string = + base::MakeRefCounted<ParkableStringImpl>(std::move(string)); + table_.insert(raw_ptr, new_parkable_string.get()); + return new_parkable_string; +} + +void ParkableStringManager::Remove(StringImpl* string) { + DCHECK(ShouldPark(string)); + auto it = table_.find(string); + DCHECK(it != table_.end()); + table_.erase(it); +} + +void ParkableStringManager::ParkAllIfRendererBackgrounded() { + DCHECK(IsMainThread()); + if (!IsRendererBackgrounded()) + return; + + size_t total_size = 0, count = 0; + for (ParkableStringImpl* str : table_.Values()) { + str->Park(); + total_size += str->CharactersSizeInBytes(); + count += 1; + } + + size_t total_size_kb = total_size / 1000; + UMA_HISTOGRAM_COUNTS_100000("Memory.MovableStringsTotalSizeKb", + total_size_kb); + UMA_HISTOGRAM_COUNTS_1000("Memory.MovableStringsCount", table_.size()); +} + +ParkableStringManager::ParkableStringManager() + : backgrounded_(false), table_() {} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string_manager.h b/third_party/blink/renderer/platform/bindings/parkable_string_manager.h new file mode 100644 index 0000000..073893d --- /dev/null +++ b/third_party/blink/renderer/platform/bindings/parkable_string_manager.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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_PARKABLE_STRING_MANAGER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_PARKABLE_STRING_MANAGER_H_ + +#include "base/macros.h" +#include "base/memory/scoped_refptr.h" +#include "base/single_thread_task_runner.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/wtf/allocator.h" +#include "third_party/blink/renderer/platform/wtf/hash_functions.h" +#include "third_party/blink/renderer/platform/wtf/hash_map.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ParkableString; +class ParkableStringImpl; + +// Manages all the ParkableStrings, and parks eligible strings after the +// renderer has been backgrounded. +// Main Thread only. +class PLATFORM_EXPORT ParkableStringManager { + USING_FAST_MALLOC(ParkableStringManager); + + public: + static ParkableStringManager& Instance(); + ~ParkableStringManager(); + + void SetRendererBackgrounded(bool backgrounded); + bool IsRendererBackgrounded() const; + + // Whether a string is parkable or not. Can be called from any thread. + static bool ShouldPark(const StringImpl* string); + + private: + friend class ParkableString; + friend class ParkableStringImpl; + + scoped_refptr<ParkableStringImpl> Add(scoped_refptr<StringImpl>&&); + void Remove(StringImpl*); + + void ParkAllIfRendererBackgrounded(); + + ParkableStringManager(); + + bool backgrounded_; + HashMap<StringImpl*, ParkableStringImpl*, PtrHash<StringImpl>> table_; + + FRIEND_TEST_ALL_PREFIXES(ParkableStringTest, TableSimple); + FRIEND_TEST_ALL_PREFIXES(ParkableStringTest, TableMultiple); + DISALLOW_COPY_AND_ASSIGN(ParkableStringManager); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_PARKABLE_STRING_MANAGER_H_
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string_test.cc b/third_party/blink/renderer/platform/bindings/parkable_string_test.cc index 0e10354..640307c 100644 --- a/third_party/blink/renderer/platform/bindings/parkable_string_test.cc +++ b/third_party/blink/renderer/platform/bindings/parkable_string_test.cc
@@ -3,7 +3,9 @@ // found in the LICENSE file. #include "third_party/blink/renderer/platform/bindings/parkable_string.h" +#include "third_party/blink/renderer/platform/bindings/parkable_string_manager.h" +#include <thread> #include <vector> #include "base/test/metrics/histogram_tester.h" @@ -14,7 +16,7 @@ class ParkableStringTest : public ::testing::Test { protected: void SetUp() override { - ParkableStringTable::Instance().SetRendererBackgrounded(false); + ParkableStringManager::Instance().SetRendererBackgrounded(false); } }; @@ -81,43 +83,43 @@ ParkableString parkable(String(data.data(), data.size()).ReleaseImpl()); ASSERT_FALSE(parkable.Impl()->is_parked()); - auto& table = ParkableStringTable::Instance(); - EXPECT_EQ(1u, table.table_.size()); + auto& manager = ParkableStringManager::Instance(); + EXPECT_EQ(1u, manager.table_.size()); // Small strings are not in the table. ParkableString small(String("abc").ReleaseImpl()); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); // No parking as the current state is not "backgrounded". - table.SetRendererBackgrounded(false); - ASSERT_FALSE(table.IsRendererBackgrounded()); - table.MaybeParkAll(); + manager.SetRendererBackgrounded(false); + ASSERT_FALSE(manager.IsRendererBackgrounded()); + manager.ParkAllIfRendererBackgrounded(); EXPECT_FALSE(parkable.Impl()->is_parked()); histogram_tester.ExpectTotalCount("Memory.MovableStringsCount", 0); - table.SetRendererBackgrounded(true); - ASSERT_TRUE(table.IsRendererBackgrounded()); - table.MaybeParkAll(); + manager.SetRendererBackgrounded(true); + ASSERT_TRUE(manager.IsRendererBackgrounded()); + manager.ParkAllIfRendererBackgrounded(); EXPECT_TRUE(parkable.Impl()->is_parked()); histogram_tester.ExpectUniqueSample("Memory.MovableStringsCount", 1, 1); // Park and unpark. parkable.ToString(); EXPECT_FALSE(parkable.Impl()->is_parked()); - table.MaybeParkAll(); + manager.ParkAllIfRendererBackgrounded(); EXPECT_TRUE(parkable.Impl()->is_parked()); histogram_tester.ExpectUniqueSample("Memory.MovableStringsCount", 1, 2); // More than one reference, no parking. - table.SetRendererBackgrounded(false); + manager.SetRendererBackgrounded(false); String alive_unparked = parkable.ToString(); // Unparked in foreground. - table.SetRendererBackgrounded(true); - table.MaybeParkAll(); + manager.SetRendererBackgrounded(true); + manager.ParkAllIfRendererBackgrounded(); EXPECT_FALSE(parkable.Impl()->is_parked()); // Other reference is dropped, OK to park. alive_unparked = String(); - table.MaybeParkAll(); + manager.ParkAllIfRendererBackgrounded(); EXPECT_TRUE(parkable.Impl()->is_parked()); histogram_tester.ExpectTotalCount("Memory.MovableStringParkingAction", 5); @@ -140,38 +142,38 @@ ParkableString parkable(String(data.data(), data.size()).ReleaseImpl()); ParkableString parkable2(String(data.data(), data.size()).ReleaseImpl()); - auto& table = ParkableStringTable::Instance(); - EXPECT_EQ(2u, table.table_.size()); + auto& manager = ParkableStringManager::Instance(); + EXPECT_EQ(2u, manager.table_.size()); parkable2 = ParkableString(); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); ParkableString copy = parkable; parkable = ParkableString(); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); copy = ParkableString(); - EXPECT_EQ(0u, table.table_.size()); + EXPECT_EQ(0u, manager.table_.size()); String str(data.data(), data.size()); ParkableString parkable3(str.Impl()); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); // De-duplicated. ParkableString other_parkable3(str.Impl()); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); EXPECT_EQ(parkable3.Impl(), other_parkable3.Impl()); // If all the references to a string are in the table, park it. str = String(); - table.SetRendererBackgrounded(true); - ASSERT_TRUE(table.IsRendererBackgrounded()); - table.MaybeParkAll(); + manager.SetRendererBackgrounded(true); + ASSERT_TRUE(manager.IsRendererBackgrounded()); + manager.ParkAllIfRendererBackgrounded(); EXPECT_TRUE(parkable3.Impl()->is_parked()); // Only drop it from the table when the last one is gone. parkable3 = ParkableString(); - EXPECT_EQ(1u, table.table_.size()); + EXPECT_EQ(1u, manager.table_.size()); other_parkable3 = ParkableString(); - EXPECT_EQ(0u, table.table_.size()); + EXPECT_EQ(0u, manager.table_.size()); histogram_tester.ExpectUniqueSample("Memory.MovableStringsCount", 1, 1); histogram_tester.ExpectUniqueSample("Memory.MovableStringsTotalSizeKb", @@ -182,4 +184,22 @@ ParkableStringImpl::ParkingAction::kParkedInBackground, 1); } +TEST_F(ParkableStringTest, ShouldPark) { + String null_string; + EXPECT_FALSE(ParkableStringManager::ShouldPark(null_string.Impl())); + String empty_string(""); + EXPECT_FALSE(ParkableStringManager::ShouldPark(empty_string.Impl())); + std::vector<char> data(20 * 1000, 'a'); + + String parkable(String(data.data(), data.size()).ReleaseImpl()); + EXPECT_TRUE(ParkableStringManager::ShouldPark(parkable.Impl())); + + std::thread t([]() { + std::vector<char> data(20 * 1000, 'a'); + String parkable(String(data.data(), data.size()).ReleaseImpl()); + EXPECT_FALSE(ParkableStringManager::ShouldPark(parkable.Impl())); + }); + t.join(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h index 6b8aa95..78f0ba2 100644 --- a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h +++ b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_TRACE_WRAPPER_V8_REFERENCE_H_ #include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" namespace blink { @@ -27,6 +28,10 @@ ~TraceWrapperV8Reference() { Clear(); } + bool operator==(const TraceWrapperV8Reference& other) const { + return handle_ == other.handle_; + } + void Set(v8::Isolate* isolate, v8::Local<T> handle) { InternalSet(isolate, handle); handle_.SetWeak(); @@ -69,6 +74,7 @@ handle_.Reset(isolate, handle); ScriptWrappableMarkingVisitor::WriteBarrier(isolate, UnsafeCast<v8::Value>()); + UnifiedHeapMarkingVisitor::WriteBarrier(isolate, UnsafeCast<v8::Value>()); } v8::Persistent<T> handle_;
diff --git a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h index a98d4f0..a91198c 100644 --- a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h +++ b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h
@@ -39,6 +39,7 @@ #include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h" #include "third_party/blink/renderer/platform/bindings/v8_binding.h" #include "third_party/blink/renderer/platform/bindings/wrapper_creation_security_check.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/compiler.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" @@ -119,6 +120,8 @@ // allocated. ScriptWrappableMarkingVisitor::WriteBarrier(isolate, wrapper_type_info, wrappable); + UnifiedHeapMarkingVisitor::WriteBarrier(isolate, wrapper_type_info, + wrappable); } inline void V8DOMWrapper::ClearNativeInfo(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc index 481863a..6ec3f41 100644 --- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc +++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/platform/bindings/v8_object_constructor.h" #include "third_party/blink/renderer/platform/bindings/v8_private_property.h" #include "third_party/blink/renderer/platform/bindings/v8_value_cache.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h" #include "third_party/blink/renderer/platform/wtf/leak_annotations.h" #include "v8/include/v8.h" @@ -83,6 +84,8 @@ is_reporting_exception_(false), script_wrappable_visitor_( new ScriptWrappableMarkingVisitor(ThreadState::Current())), + unified_heap_controller_( + new UnifiedHeapController(ThreadState::Current())), runtime_call_stats_(base::DefaultTickClock::GetInstance()), handled_near_v8_heap_limit_(false) { // FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h index a01a447..62c3ab7 100644 --- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h +++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
@@ -36,6 +36,7 @@ #include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h" #include "third_party/blink/renderer/platform/bindings/v8_global_value_map.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" @@ -209,6 +210,10 @@ script_wrappable_visitor_.swap(other); } + UnifiedHeapController* GetUnifiedHeapController() const { + return unified_heap_controller_.get(); + } + int IsNearV8HeapLimitHandled() { return handled_near_v8_heap_limit_; } void HandledNearV8HeapLimit() { handled_near_v8_heap_limit_ = true; } @@ -281,6 +286,7 @@ Persistent<ActiveScriptWrappableSet> active_script_wrappables_; std::unique_ptr<ScriptWrappableMarkingVisitor> script_wrappable_visitor_; + std::unique_ptr<UnifiedHeapController> unified_heap_controller_; RuntimeCallStats runtime_call_stats_; bool handled_near_v8_heap_limit_;
diff --git a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc index 5c7bc7a..3a980dc7 100644 --- a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc +++ b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
@@ -96,7 +96,6 @@ return; } Platform::Current()->SuddenTerminationChanged(false); - Platform::Current()->AddRefProcess(); } void DecreaseChildProcessRefCount() { @@ -107,7 +106,6 @@ return; } Platform::Current()->SuddenTerminationChanged(true); - Platform::Current()->ReleaseRefProcess(); } } // namespace
diff --git a/third_party/blink/renderer/platform/exported/web_media_constraints.cc b/third_party/blink/renderer/platform/exported/web_media_constraints.cc index bcbcf060..a97a407 100644 --- a/third_party/blink/renderer/platform/exported/web_media_constraints.cc +++ b/third_party/blink/renderer/platform/exported/web_media_constraints.cc
@@ -404,8 +404,7 @@ goog_cpu_overuse_encode_usage("googCpuOveruseEncodeUsage"), goog_high_start_bitrate("googHighStartBitrate"), goog_payload_padding("googPayloadPadding"), - goog_latency_ms("latencyMs"), - goog_power_line_frequency("googPowerLineFrequency") {} + goog_latency_ms("latencyMs") {} std::vector<const BaseConstraint*> WebMediaTrackConstraintSet::AllConstraints() const { @@ -464,8 +463,7 @@ &goog_cpu_overuse_encode_usage, &goog_high_start_bitrate, &goog_payload_padding, - &goog_latency_ms, - &goog_power_line_frequency}; + &goog_latency_ms}; const int element_count = sizeof(temp) / sizeof(temp[0]); return std::vector<const BaseConstraint*>(&temp[0], &temp[element_count]); }
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc index edec0b41..b50174cd 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -572,4 +572,8 @@ RuntimeEnabledFeatures::SetHrefTranslateEnabled(enable); } +void WebRuntimeFeatures::EnableBackgroundFetch(bool enable) { + RuntimeEnabledFeatures::SetBackgroundFetchEnabled(enable); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/exported/web_service_worker_installed_scripts_manager.cc b/third_party/blink/renderer/platform/exported/web_service_worker_installed_scripts_manager.cc index 389e12f..6f886ad 100644 --- a/third_party/blink/renderer/platform/exported/web_service_worker_installed_scripts_manager.cc +++ b/third_party/blink/renderer/platform/exported/web_service_worker_installed_scripts_manager.cc
@@ -17,27 +17,15 @@ WebString encoding, WebVector<BytesChunk> script_text, WebVector<BytesChunk> meta_data) { - return base::WrapUnique( - new RawScriptData(std::move(encoding), std::move(script_text), - std::move(meta_data), true /* is_valid */)); -} - -// static -std::unique_ptr<WebServiceWorkerInstalledScriptsManager::RawScriptData> -WebServiceWorkerInstalledScriptsManager::RawScriptData:: - CreateInvalidInstance() { - return base::WrapUnique( - new RawScriptData(WebString() /* encoding */, WebVector<BytesChunk>(), - WebVector<BytesChunk>(), false /* is_valid */)); + return base::WrapUnique(new RawScriptData( + std::move(encoding), std::move(script_text), std::move(meta_data))); } WebServiceWorkerInstalledScriptsManager::RawScriptData::RawScriptData( WebString encoding, WebVector<BytesChunk> script_text, - WebVector<BytesChunk> meta_data, - bool is_valid) - : is_valid_(is_valid), - encoding_(std::move(encoding)), + WebVector<BytesChunk> meta_data) + : encoding_(std::move(encoding)), script_text_(std::move(script_text)), meta_data_(std::move(meta_data)), headers_(std::make_unique<CrossThreadHTTPHeaderMapData>()) {}
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h index 05a8805..779b8ea 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
@@ -286,6 +286,8 @@ // mapping from character index to x-position and O(log n) time, using binary // search, from x-position to character index. class CharacterPositionData { + USING_FAST_MALLOC(CharacterPositionData); + public: CharacterPositionData(unsigned num_characters, float width) : data_(num_characters), width_(width) {}
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index d5a63eb..747063c2 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -29,6 +29,7 @@ #include "third_party/blink/renderer/platform/testing/fake_display_item_client.h" #include "third_party/blink/renderer/platform/testing/layer_tree_host_embedder.h" #include "third_party/blink/renderer/platform/testing/paint_property_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/paint_test_configurations.h" #include "third_party/blink/renderer/platform/testing/picture_matchers.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" #include "third_party/blink/renderer/platform/testing/test_paint_artifact.h" @@ -67,11 +68,10 @@ }; class PaintArtifactCompositorTest : public testing::Test, - private ScopedSlimmingPaintV2ForTest { + public PaintTestConfigurations { protected: PaintArtifactCompositorTest() - : ScopedSlimmingPaintV2ForTest(true), - task_runner_(base::MakeRefCounted<base::TestSimpleTaskRunner>()), + : task_runner_(base::MakeRefCounted<base::TestSimpleTaskRunner>()), task_runner_handle_(task_runner_) {} void SetUp() override { @@ -152,6 +152,75 @@ cc::Layer* RootLayer() { return paint_artifact_compositor_->RootLayer(); } + // SlimmingPaintV2 creates scroll hit test display items (which create scroll + // hit test layers in PaintArtifactCompositor) whereas in + // BlinkGenPropertyTrees, scrollable foreign layers are created in + // ScrollingCoordinator and passed to PaintArtifactCompositor. This function + // is used to create a chunk representing the scrollable layer in either of + // these modes. + void CreateScrollableChunk(TestPaintArtifact& artifact, + const TransformPaintPropertyNode& scroll_offset, + const ClipPaintPropertyNode& clip, + const EffectPaintPropertyNode& effect) { + if (RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()) { + // Create a foreign layer for scrolling, roughly matching the layer + // created by ScrollingCoordinator. + const auto* scroll_node = scroll_offset.ScrollNode(); + scoped_refptr<cc::Layer> layer = cc::Layer::Create(); + auto rect = scroll_node->ContainerRect(); + layer->SetScrollable(gfx::Size(rect.Width(), rect.Height())); + layer->SetBounds(gfx::Size(rect.Width(), rect.Height())); + layer->SetElementId(scroll_node->GetCompositorElementId()); + layer->set_did_scroll_callback( + paint_artifact_compositor_->scroll_callback_); + artifact.Chunk(scroll_offset, clip, effect) + .ForeignLayer(FloatPoint(rect.Location()), rect.Size(), layer); + return; + } + // Scroll hit test layers are marked as scrollable for hit testing but are + // in the unscrolled transform space (scroll offset's parent). + artifact.Chunk(*scroll_offset.Parent(), clip, effect) + .ScrollHitTest(scroll_offset); + } + + // Returns the |num|th scrollable layer. In SlimmingPaintV2, this will be a + // scroll hit test layer, whereas in BlinkGenPropertyTrees this will be a + // content layer. + cc::Layer* ScrollableLayerAt(size_t num) { + if (RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()) { + for (size_t content_layer_index = 0; + content_layer_index < ContentLayerCount(); content_layer_index++) { + auto* content_layer = ContentLayerAt(content_layer_index); + if (content_layer->scrollable()) { + if (num == 0) + return content_layer; + num--; + } + } + return nullptr; + } + return paint_artifact_compositor_->GetExtraDataForTesting() + ->scroll_hit_test_layers[num] + .get(); + } + + // Returns the |num|th non-scrollable layer. In SlimmingPaintV2, content + // layers are not scrollable so this is the |num|th content layer. In + // BlinkGenPropertyTrees, content layers are scrollable and non-scrollable, so + // this will return the |num|th content layer that is not scrollable. + cc::Layer* NonScrollableLayerAt(size_t num) { + for (size_t content_layer_index = 0; + content_layer_index < ContentLayerCount(); content_layer_index++) { + auto* content_layer = ContentLayerAt(content_layer_index); + if (!content_layer->scrollable()) { + if (num == 0) + return content_layer; + num--; + } + } + return nullptr; + } + size_t ContentLayerCount() { return paint_artifact_compositor_->GetExtraDataForTesting() ->content_layers.size(); @@ -179,12 +248,6 @@ .get(); } - cc::Layer* ScrollHitTestLayerAt(unsigned index) { - return paint_artifact_compositor_->GetExtraDataForTesting() - ->scroll_hit_test_layers[index] - .get(); - } - // Return the index of |layer| in the root layer list, or -1 if not found. int LayerIndex(const cc::Layer* layer) { for (size_t i = 0; i < RootLayer()->children().size(); ++i) { @@ -229,14 +292,16 @@ std::unique_ptr<LayerTreeHostEmbedder> layer_tree_; }; +INSTANTIATE_LAYER_LIST_TEST_CASE_P(PaintArtifactCompositorTest); + const auto kNotScrollingOnMain = MainThreadScrollingReason::kNotScrollingOnMain; -TEST_F(PaintArtifactCompositorTest, EmptyPaintArtifact) { +TEST_P(PaintArtifactCompositorTest, EmptyPaintArtifact) { Update(PaintArtifact::Empty()); EXPECT_TRUE(RootLayer()->children().empty()); } -TEST_F(PaintArtifactCompositorTest, OneChunkWithAnOffset) { +TEST_P(PaintArtifactCompositorTest, OneChunkWithAnOffset) { TestPaintArtifact artifact; artifact.Chunk().RectDrawing(FloatRect(50, -50, 100, 100), Color::kWhite); Update(artifact.Build()); @@ -250,7 +315,7 @@ EXPECT_EQ(gfx::Size(100, 100), child->bounds()); } -TEST_F(PaintArtifactCompositorTest, OneTransform) { +TEST_P(PaintArtifactCompositorTest, OneTransform) { // A 90 degree clockwise rotation about (100, 100). auto transform = CreateTransform(t0(), TransformationMatrix().Rotate(90), FloatPoint3D(100, 100, 0), @@ -289,7 +354,7 @@ } } -TEST_F(PaintArtifactCompositorTest, TransformCombining) { +TEST_P(PaintArtifactCompositorTest, TransformCombining) { // A translation by (5, 5) within a 2x scale about (10, 10). auto transform1 = CreateTransform(t0(), TransformationMatrix().Scale(2), @@ -328,7 +393,7 @@ ContentLayerAt(1)->transform_tree_index()); } -TEST_F(PaintArtifactCompositorTest, BackfaceVisibility) { +TEST_P(PaintArtifactCompositorTest, BackfaceVisibility) { TransformPaintPropertyNode::State backface_hidden_state; backface_hidden_state.backface_visibility = TransformPaintPropertyNode::BackfaceVisibility::kHidden; @@ -364,7 +429,7 @@ Pointee(DrawsRectangle(FloatRect(0, 0, 300, 200), Color::kDarkGray))); } -TEST_F(PaintArtifactCompositorTest, FlattensInheritedTransform) { +TEST_P(PaintArtifactCompositorTest, FlattensInheritedTransform) { for (bool transform_is_flattened : {true, false}) { SCOPED_TRACE(transform_is_flattened); @@ -415,7 +480,7 @@ } } -TEST_F(PaintArtifactCompositorTest, SortingContextID) { +TEST_P(PaintArtifactCompositorTest, SortingContextID) { // Has no 3D rendering context. auto transform1 = CreateTransform(t0(), TransformationMatrix()); // Establishes a 3D rendering context. @@ -491,7 +556,7 @@ EXPECT_NE(light_gray_sorting_context_id, black_sorting_context_id); } -TEST_F(PaintArtifactCompositorTest, OneClip) { +TEST_P(PaintArtifactCompositorTest, OneClip) { auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(100, 100, 300, 200)); TestPaintArtifact artifact; @@ -515,7 +580,7 @@ EXPECT_EQ(gfx::RectF(100, 100, 300, 200), clip_node->clip); } -TEST_F(PaintArtifactCompositorTest, NestedClips) { +TEST_P(PaintArtifactCompositorTest, NestedClips) { auto clip1 = CreateClip(c0(), &t0(), FloatRoundedRect(100, 100, 700, 700), CompositingReason::kOverflowScrollingTouch); auto clip2 = CreateClip(*clip1, &t0(), FloatRoundedRect(200, 200, 700, 700), @@ -573,7 +638,7 @@ EXPECT_EQ(outer_clip->id, inner_clip->parent_id); } -TEST_F(PaintArtifactCompositorTest, DeeplyNestedClips) { +TEST_P(PaintArtifactCompositorTest, DeeplyNestedClips) { Vector<scoped_refptr<ClipPaintPropertyNode>> clips; for (unsigned i = 1; i <= 10; i++) { clips.push_back(CreateClip(clips.IsEmpty() ? c0() : *clips.back(), &t0(), @@ -606,7 +671,7 @@ } } -TEST_F(PaintArtifactCompositorTest, SiblingClips) { +TEST_P(PaintArtifactCompositorTest, SiblingClips) { auto common_clip = CreateClip(c0(), &t0(), FloatRoundedRect(0, 0, 800, 600)); auto clip1 = CreateClip(*common_clip, &t0(), FloatRoundedRect(0, 0, 400, 600)); @@ -652,7 +717,7 @@ ASSERT_EQ(gfx::RectF(0, 0, 800, 600), common_clip_node->clip); } -TEST_F(PaintArtifactCompositorTest, ForeignLayerPassesThrough) { +TEST_P(PaintArtifactCompositorTest, ForeignLayerPassesThrough) { scoped_refptr<cc::Layer> layer = cc::Layer::Create(); layer->SetIsDrawable(true); layer->SetBounds(gfx::Size(400, 300)); @@ -673,7 +738,7 @@ EXPECT_EQ(Translation(50, 60), layer->ScreenSpaceTransform()); } -TEST_F(PaintArtifactCompositorTest, EffectTreeConversion) { +TEST_P(PaintArtifactCompositorTest, EffectTreeConversion) { EffectPaintPropertyNode::State effect1_state; effect1_state.local_transform_space = &t0(); effect1_state.output_clip = &c0(); @@ -770,14 +835,14 @@ cc_scroll.main_thread_scrolling_reasons); } -TEST_F(PaintArtifactCompositorTest, OneScrollNode) { +TEST_P(PaintArtifactCompositorTest, OneScrollNode) { CompositorElementId scroll_element_id = ScrollElementId(2); auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), kNotScrollingOnMain, scroll_element_id); auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); TestPaintArtifact artifact; - artifact.Chunk().ScrollHitTest(*scroll_translation); + CreateScrollableChunk(artifact, *scroll_translation, c0(), e0()); artifact.Chunk(*scroll_translation, c0(), e0()) .RectDrawing(FloatRect(-110, 12, 170, 19), Color::kWhite); Update(artifact.Build()); @@ -788,7 +853,7 @@ const cc::ScrollNode& scroll_node = *scroll_tree.Node(2); CheckCcScrollNode(*scroll, scroll_node); EXPECT_EQ(1, scroll_node.parent_id); - EXPECT_EQ(scroll_element_id, ScrollHitTestLayerAt(0)->element_id()); + EXPECT_EQ(scroll_element_id, ScrollableLayerAt(0)->element_id()); EXPECT_EQ(scroll_node.id, ElementIdToScrollNodeIndex(scroll_element_id)); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree; @@ -798,7 +863,7 @@ EXPECT_EQ(gfx::ScrollOffset(-7, -9), transform_node.scroll_offset); EXPECT_EQ(kNotScrollingOnMain, scroll_node.main_thread_scrolling_reasons); - auto* layer = ContentLayerAt(0); + auto* layer = NonScrollableLayerAt(0); auto transform_node_index = layer->transform_tree_index(); EXPECT_EQ(transform_node_index, transform_node.id); auto scroll_node_index = layer->scroll_tree_index(); @@ -810,7 +875,7 @@ EXPECT_THAT(layer->GetPicture(), Pointee(DrawsRectangle(FloatRect(0, 0, 63, 19), Color::kWhite))); - auto* scroll_layer = ScrollHitTestLayerAt(0); + auto* scroll_layer = ScrollableLayerAt(0); EXPECT_TRUE(scroll_layer->scrollable()); // The scroll layer should be sized to the container bounds. // TODO(pdr): The container bounds will not include scrollbars but the scroll @@ -818,7 +883,6 @@ EXPECT_EQ(gfx::Size(11, 13), scroll_layer->bounds()); EXPECT_EQ(gfx::Vector2dF(3, 5), scroll_layer->offset_to_transform_parent()); EXPECT_EQ(scroll_layer->scroll_tree_index(), scroll_node.id); - EXPECT_EQ(scroll_layer->transform_tree_index(), transform_node.parent_id); EXPECT_EQ(0u, ScrollClient().did_scroll_count); scroll_layer->SetScrollOffsetFromImplSide(gfx::ScrollOffset(1, 2)); @@ -826,7 +890,7 @@ EXPECT_EQ(gfx::ScrollOffset(1, 2), ScrollClient().last_scroll_offset); } -TEST_F(PaintArtifactCompositorTest, TransformUnderScrollNode) { +TEST_P(PaintArtifactCompositorTest, TransformUnderScrollNode) { auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1()); auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); @@ -872,7 +936,7 @@ EXPECT_NE(scroll_transform_node.id, layer1->transform_tree_index()); } -TEST_F(PaintArtifactCompositorTest, NestedScrollNodes) { +TEST_P(PaintArtifactCompositorTest, NestedScrollNodes) { auto effect = CreateOpacityEffect(e0(), 0.5); CompositorElementId scroll_element_id_a = ScrollElementId(2); @@ -891,12 +955,10 @@ TestPaintArtifact artifact; artifact.Chunk(*scroll_translation_a, c0(), *effect) .RectDrawing(FloatRect(7, 11, 13, 17), Color::kWhite); - artifact.Chunk(*scroll_translation_a->Parent(), c0(), *effect) - .ScrollHitTest(*scroll_translation_a); + CreateScrollableChunk(artifact, *scroll_translation_a, c0(), *effect); artifact.Chunk(*scroll_translation_b, c0(), *effect) .RectDrawing(FloatRect(1, 2, 3, 5), Color::kWhite); - artifact.Chunk(*scroll_translation_b->Parent(), c0(), *effect) - .ScrollHitTest(*scroll_translation_b); + CreateScrollableChunk(artifact, *scroll_translation_b, c0(), *effect); Update(artifact.Build()); const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree; @@ -905,7 +967,7 @@ const cc::ScrollNode& scroll_node_a = *scroll_tree.Node(2); CheckCcScrollNode(*scroll_a, scroll_node_a); EXPECT_EQ(1, scroll_node_a.parent_id); - EXPECT_EQ(scroll_element_id_a, ScrollHitTestLayerAt(0)->element_id()); + EXPECT_EQ(scroll_element_id_a, ScrollableLayerAt(0)->element_id()); EXPECT_EQ(scroll_node_a.id, ElementIdToScrollNodeIndex(scroll_element_id_a)); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree; @@ -917,7 +979,7 @@ const cc::ScrollNode& scroll_node_b = *scroll_tree.Node(3); CheckCcScrollNode(*scroll_b, scroll_node_b); EXPECT_EQ(scroll_node_a.id, scroll_node_b.parent_id); - EXPECT_EQ(scroll_element_id_b, ScrollHitTestLayerAt(1)->element_id()); + EXPECT_EQ(scroll_element_id_b, ScrollableLayerAt(1)->element_id()); EXPECT_EQ(scroll_node_b.id, ElementIdToScrollNodeIndex(scroll_element_id_b)); const cc::TransformNode& transform_node_b = @@ -926,7 +988,7 @@ EXPECT_EQ(gfx::ScrollOffset(-37, -41), transform_node_b.scroll_offset); } -TEST_F(PaintArtifactCompositorTest, ScrollHitTestLayerOrder) { +TEST_P(PaintArtifactCompositorTest, ScrollHitTestLayerOrder) { auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(0, 0, 100, 100)); CompositorElementId scroll_element_id = ScrollElementId(2); @@ -942,30 +1004,31 @@ TestPaintArtifact artifact; artifact.Chunk(*scroll_translation, *clip, e0()) .RectDrawing(FloatRect(0, 0, 100, 100), Color::kWhite); - artifact.Chunk(*scroll_translation->Parent(), *clip, e0()) - .ScrollHitTest(*scroll_translation); + CreateScrollableChunk(artifact, *scroll_translation, *clip, e0()); artifact.Chunk(*transform, *clip, e0()) .RectDrawing(FloatRect(0, 0, 50, 50), Color::kBlack); Update(artifact.Build()); // The first content layer (background) should not have the scrolling element // id set. - EXPECT_EQ(CompositorElementId(), ContentLayerAt(0)->element_id()); + EXPECT_EQ(CompositorElementId(), NonScrollableLayerAt(0)->element_id()); // The scroll layer should be after the first content layer (background). - EXPECT_LT(LayerIndex(ContentLayerAt(0)), LayerIndex(ScrollHitTestLayerAt(0))); + EXPECT_LT(LayerIndex(NonScrollableLayerAt(0)), + LayerIndex(ScrollableLayerAt(0))); const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree; auto* scroll_node = - scroll_tree.Node(ScrollHitTestLayerAt(0)->scroll_tree_index()); + scroll_tree.Node(ScrollableLayerAt(0)->scroll_tree_index()); ASSERT_EQ(scroll_element_id, scroll_node->element_id); - EXPECT_EQ(scroll_element_id, ScrollHitTestLayerAt(0)->element_id()); + EXPECT_EQ(scroll_element_id, ScrollableLayerAt(0)->element_id()); // The second content layer should appear after the first. - EXPECT_LT(LayerIndex(ScrollHitTestLayerAt(0)), LayerIndex(ContentLayerAt(1))); - EXPECT_EQ(CompositorElementId(), ContentLayerAt(1)->element_id()); + EXPECT_LT(LayerIndex(ScrollableLayerAt(0)), + LayerIndex(NonScrollableLayerAt(1))); + EXPECT_EQ(CompositorElementId(), NonScrollableLayerAt(1)->element_id()); } -TEST_F(PaintArtifactCompositorTest, NestedScrollHitTestLayerOrder) { +TEST_P(PaintArtifactCompositorTest, NestedScrollableLayerOrder) { auto clip_1 = CreateClip(c0(), &t0(), FloatRoundedRect(0, 0, 100, 100)); CompositorElementId scroll_1_element_id = ScrollElementId(1); auto scroll_1 = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), @@ -982,10 +1045,10 @@ t0(), 0, 0, *scroll_2, CompositingReason::kWillChangeCompositingHint); TestPaintArtifact artifact; - artifact.Chunk(*scroll_translation_1->Parent(), *clip_1->Parent(), e0()) - .ScrollHitTest(*scroll_translation_1); - artifact.Chunk(*scroll_translation_2->Parent(), *clip_2->Parent(), e0()) - .ScrollHitTest(*scroll_translation_2); + CreateScrollableChunk(artifact, *scroll_translation_1, *clip_1->Parent(), + e0()); + CreateScrollableChunk(artifact, *scroll_translation_2, *clip_2->Parent(), + e0()); artifact.Chunk(*scroll_translation_2, *clip_2, e0()) .RectDrawing(FloatRect(0, 0, 50, 50), Color::kWhite); Update(artifact.Build()); @@ -994,32 +1057,32 @@ const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree; const cc::ClipTree& clip_tree = GetPropertyTrees().clip_tree; auto* scroll_1_node = - scroll_tree.Node(ScrollHitTestLayerAt(0)->scroll_tree_index()); + scroll_tree.Node(ScrollableLayerAt(0)->scroll_tree_index()); ASSERT_EQ(scroll_1_element_id, scroll_1_node->element_id); auto* scroll_1_clip_node = - clip_tree.Node(ScrollHitTestLayerAt(0)->clip_tree_index()); + clip_tree.Node(ScrollableLayerAt(0)->clip_tree_index()); // The scroll is not under clip_1. EXPECT_EQ(gfx::RectF(0, 0, 0, 0), scroll_1_clip_node->clip); auto* scroll_2_node = - scroll_tree.Node(ScrollHitTestLayerAt(1)->scroll_tree_index()); + scroll_tree.Node(ScrollableLayerAt(1)->scroll_tree_index()); ASSERT_EQ(scroll_2_element_id, scroll_2_node->element_id); auto* scroll_2_clip_node = - clip_tree.Node(ScrollHitTestLayerAt(1)->clip_tree_index()); + clip_tree.Node(ScrollableLayerAt(1)->clip_tree_index()); // The scroll is not under clip_2 but is under the parent clip, clip_1. EXPECT_EQ(gfx::RectF(0, 0, 100, 100), scroll_2_clip_node->clip); // The first layer should be before the second scroll layer. - EXPECT_LT(LayerIndex(ScrollHitTestLayerAt(0)), - LayerIndex(ScrollHitTestLayerAt(1))); + EXPECT_LT(LayerIndex(ScrollableLayerAt(0)), LayerIndex(ScrollableLayerAt(1))); - // The content layer should be after the second scroll layer. - EXPECT_LT(LayerIndex(ScrollHitTestLayerAt(1)), LayerIndex(ContentLayerAt(0))); + // The non-scrollable content layer should be after the second scroll layer. + EXPECT_LT(LayerIndex(ScrollableLayerAt(1)), + LayerIndex(NonScrollableLayerAt(0))); } // If a scroll node is encountered before its parent, ensure the parent scroll // node is correctly created. -TEST_F(PaintArtifactCompositorTest, AncestorScrollNodes) { +TEST_P(PaintArtifactCompositorTest, AncestorScrollNodes) { CompositorElementId scroll_element_id_a = ScrollElementId(2); auto scroll_a = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), kNotScrollingOnMain, scroll_element_id_a); @@ -1033,9 +1096,8 @@ CreateScrollTranslation(*scroll_translation_a, 37, 41, *scroll_b); TestPaintArtifact artifact; - artifact.Chunk().ScrollHitTest(*scroll_translation_b); - artifact.Chunk(*scroll_translation_b, c0(), e0()) - .ScrollHitTest(*scroll_translation_a); + CreateScrollableChunk(artifact, *scroll_translation_b, c0(), e0()); + CreateScrollableChunk(artifact, *scroll_translation_a, c0(), e0()); Update(artifact.Build()); const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree; @@ -1046,9 +1108,9 @@ EXPECT_EQ(1, scroll_node_a.parent_id); EXPECT_EQ(scroll_element_id_a, scroll_node_a.element_id); EXPECT_EQ(scroll_node_a.id, ElementIdToScrollNodeIndex(scroll_element_id_a)); - // The second scroll hit test layer should be associated with the first - // scroll node (a). - EXPECT_EQ(scroll_element_id_a, ScrollHitTestLayerAt(1)->element_id()); + // The second scrollable layer should be associated with the first scroll node + // (a). + EXPECT_EQ(scroll_element_id_a, ScrollableLayerAt(1)->element_id()); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree; const cc::TransformNode& transform_node_a = @@ -1060,9 +1122,9 @@ EXPECT_EQ(scroll_node_a.id, scroll_node_b.parent_id); EXPECT_EQ(scroll_element_id_b, scroll_node_b.element_id); EXPECT_EQ(scroll_node_b.id, ElementIdToScrollNodeIndex(scroll_element_id_b)); - // The first scroll hit test layer should be associated with the second scroll - // node (b). - EXPECT_EQ(scroll_element_id_b, ScrollHitTestLayerAt(0)->element_id()); + // The first scrollable layer should be associated with the second scroll node + // (b). + EXPECT_EQ(scroll_element_id_b, ScrollableLayerAt(0)->element_id()); const cc::TransformNode& transform_node_b = *transform_tree.Node(scroll_node_b.transform_id); @@ -1070,7 +1132,7 @@ EXPECT_EQ(gfx::ScrollOffset(-37, -41), transform_node_b.scroll_offset); } -TEST_F(PaintArtifactCompositorTest, MergeSimpleChunks) { +TEST_P(PaintArtifactCompositorTest, MergeSimpleChunks) { TestPaintArtifact test_artifact; test_artifact.Chunk().RectDrawing(FloatRect(0, 0, 100, 100), Color::kWhite); test_artifact.Chunk().RectDrawing(FloatRect(0, 0, 200, 300), Color::kGray); @@ -1093,7 +1155,7 @@ } } -TEST_F(PaintArtifactCompositorTest, MergeClip) { +TEST_P(PaintArtifactCompositorTest, MergeClip) { auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(10, 20, 50, 60)); TestPaintArtifact test_artifact; @@ -1123,7 +1185,7 @@ } } -TEST_F(PaintArtifactCompositorTest, Merge2DTransform) { +TEST_P(PaintArtifactCompositorTest, Merge2DTransform) { auto transform = CreateTransform(t0(), TransformationMatrix().Translate(50, 50), FloatPoint3D(100, 100, 0)); @@ -1155,7 +1217,7 @@ } } -TEST_F(PaintArtifactCompositorTest, Merge2DTransformDirectAncestor) { +TEST_P(PaintArtifactCompositorTest, Merge2DTransformDirectAncestor) { auto transform = CreateTransform(t0(), TransformationMatrix(), FloatPoint3D(), CompositingReason::k3DTransform); auto transform2 = @@ -1188,7 +1250,7 @@ } } -TEST_F(PaintArtifactCompositorTest, MergeTransformOrigin) { +TEST_P(PaintArtifactCompositorTest, MergeTransformOrigin) { auto transform = CreateTransform(t0(), TransformationMatrix().Rotate(45), FloatPoint3D(100, 100, 0)); @@ -1218,7 +1280,7 @@ } } -TEST_F(PaintArtifactCompositorTest, MergeOpacity) { +TEST_P(PaintArtifactCompositorTest, MergeOpacity) { float opacity = 2.0 / 255.0; auto effect = CreateOpacityEffect(e0(), opacity); @@ -1249,7 +1311,7 @@ } } -TEST_F(PaintArtifactCompositorTest, MergeNested) { +TEST_P(PaintArtifactCompositorTest, MergeNested) { // Tests merging of an opacity effect, inside of a clip, inside of a // transform. auto transform = @@ -1287,7 +1349,7 @@ } } -TEST_F(PaintArtifactCompositorTest, ClipPushedUp) { +TEST_P(PaintArtifactCompositorTest, ClipPushedUp) { // Tests merging of an element which has a clipapplied to it, // but has an ancestor transform of them. This can happen for fixed- // or absolute-position elements which escape scroll transforms. @@ -1330,7 +1392,7 @@ // TODO(crbug.com/696842): The effect refuses to "decomposite" because it's in // a deeper transform space than its chunk. We should allow decomposite if // the two transform nodes share the same direct compositing ancestor. -TEST_F(PaintArtifactCompositorTest, DISABLED_EffectPushedUp) { +TEST_P(PaintArtifactCompositorTest, DISABLED_EffectPushedUp) { // Tests merging of an element which has an effect applied to it, // but has an ancestor transform of them. This can happen for fixed- // or absolute-position elements which escape scroll transforms. @@ -1375,7 +1437,7 @@ // TODO(crbug.com/696842): The effect refuses to "decomposite" because it's in // a deeper transform space than its chunk. We should allow decomposite if // the two transform nodes share the same direct compositing ancestor. -TEST_F(PaintArtifactCompositorTest, DISABLED_EffectAndClipPushedUp) { +TEST_P(PaintArtifactCompositorTest, DISABLED_EffectAndClipPushedUp) { // Tests merging of an element which has an effect applied to it, // but has an ancestor transform of them. This can happen for fixed- // or absolute-position elements which escape scroll transforms. @@ -1420,7 +1482,7 @@ } } -TEST_F(PaintArtifactCompositorTest, ClipAndEffectNoTransform) { +TEST_P(PaintArtifactCompositorTest, ClipAndEffectNoTransform) { // Tests merging of an element which has a clip and effect in the root // transform space. auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(10, 20, 50, 60)); @@ -1453,7 +1515,7 @@ } } -TEST_F(PaintArtifactCompositorTest, TwoClips) { +TEST_P(PaintArtifactCompositorTest, TwoClips) { // Tests merging of an element which has two clips in the root // transform space. auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(20, 30, 10, 20)); @@ -1485,7 +1547,7 @@ } } -TEST_F(PaintArtifactCompositorTest, TwoTransformsClipBetween) { +TEST_P(PaintArtifactCompositorTest, TwoTransformsClipBetween) { auto transform = CreateTransform(t0(), TransformationMatrix().Translate(20, 25), FloatPoint3D(100, 100, 0)); @@ -1517,7 +1579,7 @@ } } -TEST_F(PaintArtifactCompositorTest, OverlapTransform) { +TEST_P(PaintArtifactCompositorTest, OverlapTransform) { auto transform = CreateTransform( t0(), TransformationMatrix().Translate(50, 50), FloatPoint3D(100, 100, 0), CompositingReason::k3DTransform); @@ -1537,7 +1599,7 @@ ASSERT_EQ(3u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, MightOverlap) { +TEST_P(PaintArtifactCompositorTest, MightOverlap) { PaintChunk paint_chunk = DefaultChunk(); paint_chunk.bounds = FloatRect(0, 0, 100, 100); PendingLayer pending_layer(paint_chunk, 0, false); @@ -1568,7 +1630,7 @@ } } -TEST_F(PaintArtifactCompositorTest, PendingLayer) { +TEST_P(PaintArtifactCompositorTest, PendingLayer) { PaintChunk chunk1 = DefaultChunk(); chunk1.properties = PropertyTreeState::Root(); chunk1.known_to_be_opaque = true; @@ -1602,7 +1664,7 @@ EXPECT_NE(pending_layer.bounds, pending_layer.rect_known_to_be_opaque); } -TEST_F(PaintArtifactCompositorTest, PendingLayerWithGeometry) { +TEST_P(PaintArtifactCompositorTest, PendingLayerWithGeometry) { auto transform = CreateTransform(t0(), TransformationMatrix().Translate(20, 25), FloatPoint3D(100, 100, 0)); @@ -1626,7 +1688,7 @@ // TODO(crbug.com/701991): // The test is disabled because opaque rect mapping is not implemented yet. -TEST_F(PaintArtifactCompositorTest, DISABLED_PendingLayerKnownOpaque) { +TEST_P(PaintArtifactCompositorTest, DISABLED_PendingLayerKnownOpaque) { PaintChunk chunk1 = DefaultChunk(); chunk1.properties = PropertyTreeState::Root(); chunk1.bounds = FloatRect(0, 0, 30, 40); @@ -1676,7 +1738,7 @@ return TransformPaintPropertyNode::Create(t0(), std::move(state)); } -TEST_F(PaintArtifactCompositorTest, TransformWithElementId) { +TEST_P(PaintArtifactCompositorTest, TransformWithElementId) { auto transform = CreateSampleTransformNodeWithElementId(); TestPaintArtifact artifact; artifact.Chunk(*transform, c0(), e0()) @@ -1687,7 +1749,7 @@ ElementIdToTransformNodeIndex(transform->GetCompositorElementId())); } -TEST_F(PaintArtifactCompositorTest, EffectWithElementId) { +TEST_P(PaintArtifactCompositorTest, EffectWithElementId) { auto effect = CreateSampleEffectNodeWithElementId(); TestPaintArtifact artifact; artifact.Chunk(t0(), c0(), *effect) @@ -1697,7 +1759,7 @@ EXPECT_EQ(2, ElementIdToEffectNodeIndex(effect->GetCompositorElementId())); } -TEST_F(PaintArtifactCompositorTest, CompositedLuminanceMask) { +TEST_P(PaintArtifactCompositorTest, CompositedLuminanceMask) { auto masked = CreateOpacityEffect( e0(), 1.0, CompositingReason::kIsolateCompositedDescendants); EffectPaintPropertyNode::State masking_state; @@ -1742,7 +1804,7 @@ masking_group->filters.at(0).type()); } -TEST_F(PaintArtifactCompositorTest, UpdateProducesNewSequenceNumber) { +TEST_P(PaintArtifactCompositorTest, UpdateProducesNewSequenceNumber) { // A 90 degree clockwise rotation about (100, 100). auto transform = CreateTransform(t0(), TransformationMatrix().Rotate(90), FloatPoint3D(100, 100, 0), @@ -1786,7 +1848,7 @@ } } -TEST_F(PaintArtifactCompositorTest, DecompositeClip) { +TEST_P(PaintArtifactCompositorTest, DecompositeClip) { // A clipped paint chunk that gets merged into a previous layer should // only contribute clipped bounds to the layer bound. auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(75, 75, 100, 100)); @@ -1803,7 +1865,7 @@ EXPECT_EQ(gfx::Size(125, 125), layer->bounds()); } -TEST_F(PaintArtifactCompositorTest, DecompositeEffect) { +TEST_P(PaintArtifactCompositorTest, DecompositeEffect) { // An effect node without direct compositing reason and does not need to // group compositing descendants should not be composited and can merge // with other chunks. @@ -1824,7 +1886,7 @@ EXPECT_EQ(1, layer->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, DirectlyCompositedEffect) { +TEST_P(PaintArtifactCompositorTest, DirectlyCompositedEffect) { // An effect node with direct compositing shall be composited. auto effect = CreateOpacityEffect(e0(), 0.5f, CompositingReason::kAll); @@ -1855,7 +1917,7 @@ EXPECT_EQ(1, layer3->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, DecompositeDeepEffect) { +TEST_P(PaintArtifactCompositorTest, DecompositeDeepEffect) { // A paint chunk may enter multiple level effects with or without compositing // reasons. This test verifies we still decomposite effects without a direct // reason, but stop at a directly composited effect. @@ -1893,7 +1955,7 @@ EXPECT_EQ(1, layer3->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, IndirectlyCompositedEffect) { +TEST_P(PaintArtifactCompositorTest, IndirectlyCompositedEffect) { // An effect node without direct compositing still needs to be composited // for grouping, if some chunks need to be composited. auto effect = CreateOpacityEffect(e0(), 0.5f); @@ -1928,7 +1990,7 @@ EXPECT_EQ(effect_node->id, layer3->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, DecompositedEffectNotMergingDueToOverlap) { +TEST_P(PaintArtifactCompositorTest, DecompositedEffectNotMergingDueToOverlap) { // This tests an effect that doesn't need to be composited, but needs // separate backing due to overlap with a previous composited effect. auto effect1 = CreateOpacityEffect(e0(), 0.1f); @@ -1978,7 +2040,7 @@ EXPECT_EQ(1, layer4->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, UpdatePopulatesCompositedElementIds) { +TEST_P(PaintArtifactCompositorTest, UpdatePopulatesCompositedElementIds) { auto transform = CreateSampleTransformNodeWithElementId(); auto effect = CreateSampleEffectNodeWithElementId(); TestPaintArtifact artifact; @@ -1997,97 +2059,97 @@ composited_element_ids.Contains(effect->GetCompositorElementId())); } -TEST_F(PaintArtifactCompositorTest, SkipChunkWithOpacityZero) { +TEST_P(PaintArtifactCompositorTest, SkipChunkWithOpacityZero) { UpdateWithArtifactWithOpacity(0, false, false); ASSERT_EQ(0u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithOpacityZeroWithPrecedingChunk) { UpdateWithArtifactWithOpacity(0, true, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, SkipChunkWithOpacityZeroSubsequentChunk) { +TEST_P(PaintArtifactCompositorTest, SkipChunkWithOpacityZeroSubsequentChunk) { UpdateWithArtifactWithOpacity(0, false, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithOpacityZeroWithPrecedingAndSubsequentChunk) { UpdateWithArtifactWithOpacity(0, true, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, SkipChunkWithTinyOpacity) { +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacity) { UpdateWithArtifactWithOpacity(0.0003f, false, false); ASSERT_EQ(0u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacityWithPrecedingChunk) { UpdateWithArtifactWithOpacity(0.0003f, true, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, SkipChunkWithTinyOpacitySubsequentChunk) { +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacitySubsequentChunk) { UpdateWithArtifactWithOpacity(0.0003f, false, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacityWithPrecedingAndSubsequentChunk) { UpdateWithArtifactWithOpacity(0.0003f, true, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, DontSkipChunkWithMinimumOpacity) { +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithMinimumOpacity) { UpdateWithArtifactWithOpacity(0.0004f, false, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithMinimumOpacityWithPrecedingChunk) { UpdateWithArtifactWithOpacity(0.0004f, true, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithMinimumOpacitySubsequentChunk) { UpdateWithArtifactWithOpacity(0.0004f, false, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithMinimumOpacityWithPrecedingAndSubsequentChunk) { UpdateWithArtifactWithOpacity(0.0004f, true, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, DontSkipChunkWithAboveMinimumOpacity) { +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithAboveMinimumOpacity) { UpdateWithArtifactWithOpacity(0.3f, false, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithAboveMinimumOpacityWithPrecedingChunk) { UpdateWithArtifactWithOpacity(0.3f, true, false); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithAboveMinimumOpacitySubsequentChunk) { UpdateWithArtifactWithOpacity(0.3f, false, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithAboveMinimumOpacityWithPrecedingAndSubsequentChunk) { UpdateWithArtifactWithOpacity(0.3f, true, true); ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, DontSkipChunkWithTinyOpacityAndDirectCompositingReason) { auto effect = CreateOpacityEffect(e0(), 0.0001f, CompositingReason::kCanvas); TestPaintArtifact artifact; @@ -2097,7 +2159,7 @@ ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacityAndVisibleChildEffectNode) { auto tiny_effect = CreateOpacityEffect(e0(), 0.0001f, CompositingReason::kNone); @@ -2110,7 +2172,7 @@ ASSERT_EQ(0u, ContentLayerCount()); } -TEST_F( +TEST_P( PaintArtifactCompositorTest, DontSkipChunkWithTinyOpacityAndVisibleChildEffectNodeWithCompositingParent) { auto tiny_effect = @@ -2123,7 +2185,7 @@ ASSERT_EQ(1u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SkipChunkWithTinyOpacityAndVisibleChildEffectNodeWithCompositingChild) { auto tiny_effect = CreateOpacityEffect(e0(), 0.0001f); auto visible_effect = @@ -2135,7 +2197,7 @@ ASSERT_EQ(0u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, UpdateManagesLayerElementIds) { +TEST_P(PaintArtifactCompositorTest, UpdateManagesLayerElementIds) { auto transform = CreateSampleTransformNodeWithElementId(); CompositorElementId element_id = transform->GetCompositorElementId(); @@ -2158,7 +2220,7 @@ } } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipSimple) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipSimple) { // This tests the simplist case that a single layer needs to be clipped // by a single composited rounded clip. FloatSize corner(5, 5); @@ -2209,7 +2271,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_0.blend_mode); } -TEST_F(PaintArtifactCompositorTest, +TEST_P(PaintArtifactCompositorTest, SynthesizedClipIndirectlyCompositedClipPath) { // This tests the case that a clip node needs to be synthesized due to // applying clip path to a composited effect. @@ -2264,7 +2326,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_0.blend_mode); } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipContiguous) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipContiguous) { // This tests the case that a two back-to-back composited layers having // the same composited rounded clip can share the synthesized mask. auto t1 = CreateTransform(t0(), TransformationMatrix(), FloatPoint3D(), @@ -2332,7 +2394,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_0.blend_mode); } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipDiscontiguous) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipDiscontiguous) { // This tests the case that a two composited layers having the same // composited rounded clip cannot share the synthesized mask if there is // another layer in the middle. @@ -2425,7 +2487,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_1.blend_mode); } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipAcrossChildEffect) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipAcrossChildEffect) { // This tests the case that an effect having the same output clip as the // layers before and after it can share the synthesized mask. FloatSize corner(5, 5); @@ -2494,7 +2556,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_0.blend_mode); } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipRespectOutputClip) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipRespectOutputClip) { // This tests the case that a layer cannot share the synthesized mask despite // having the same composited rounded clip if it's enclosed by an effect not // clipped by the common clip. @@ -2599,7 +2661,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_2.blend_mode); } -TEST_F(PaintArtifactCompositorTest, SynthesizedClipDelegateBlending) { +TEST_P(PaintArtifactCompositorTest, SynthesizedClipDelegateBlending) { // This tests the case that an effect with exotic blending cannot share // the synthesized mask with its siblings because its blending has to be // applied by the outermost mask. @@ -2707,7 +2769,7 @@ EXPECT_EQ(SkBlendMode::kDstIn, mask_effect_2.blend_mode); } -TEST_F(PaintArtifactCompositorTest, WillBeRemovedFromFrame) { +TEST_P(PaintArtifactCompositorTest, WillBeRemovedFromFrame) { auto effect = CreateSampleEffectNodeWithElementId(); TestPaintArtifact artifact; artifact.Chunk(t0(), c0(), *effect) @@ -2721,7 +2783,7 @@ EXPECT_EQ(0u, ContentLayerCount()); } -TEST_F(PaintArtifactCompositorTest, ContentsNonOpaque) { +TEST_P(PaintArtifactCompositorTest, ContentsNonOpaque) { TestPaintArtifact artifact; artifact.Chunk().RectDrawing(FloatRect(100, 100, 200, 200), Color::kBlack); Update(artifact.Build()); @@ -2729,7 +2791,7 @@ EXPECT_FALSE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, ContentsOpaque) { +TEST_P(PaintArtifactCompositorTest, ContentsOpaque) { TestPaintArtifact artifact; artifact.Chunk() .RectDrawing(FloatRect(100, 100, 200, 200), Color::kBlack) @@ -2739,7 +2801,7 @@ EXPECT_TRUE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, ContentsOpaqueSubpixel) { +TEST_P(PaintArtifactCompositorTest, ContentsOpaqueSubpixel) { TestPaintArtifact artifact; artifact.Chunk() .RectDrawing(FloatRect(100.5, 100.5, 200, 200), Color::kBlack) @@ -2750,7 +2812,7 @@ EXPECT_FALSE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, ContentsOpaqueUnitedNonOpaque) { +TEST_P(PaintArtifactCompositorTest, ContentsOpaqueUnitedNonOpaque) { TestPaintArtifact artifact; artifact.Chunk() .RectDrawing(FloatRect(100, 100, 200, 200), Color::kBlack) @@ -2764,7 +2826,7 @@ EXPECT_FALSE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, ContentsOpaqueUnitedOpaque1) { +TEST_P(PaintArtifactCompositorTest, ContentsOpaqueUnitedOpaque1) { TestPaintArtifact artifact; artifact.Chunk() .RectDrawing(FloatRect(100, 100, 300, 300), Color::kBlack) @@ -2778,7 +2840,7 @@ EXPECT_TRUE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, ContentsOpaqueUnitedOpaque2) { +TEST_P(PaintArtifactCompositorTest, ContentsOpaqueUnitedOpaque2) { TestPaintArtifact artifact; artifact.Chunk() .RectDrawing(FloatRect(100, 100, 200, 200), Color::kBlack) @@ -2794,7 +2856,7 @@ EXPECT_FALSE(ContentLayerAt(0)->contents_opaque()); } -TEST_F(PaintArtifactCompositorTest, DecompositeEffectWithNoOutputClip) { +TEST_P(PaintArtifactCompositorTest, DecompositeEffectWithNoOutputClip) { // This test verifies effect nodes with no output clip correctly decomposites // if there is no compositing reasons. auto clip1 = CreateClip(c0(), &t0(), FloatRoundedRect(75, 75, 100, 100)); @@ -2813,7 +2875,7 @@ EXPECT_EQ(1, layer->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, CompositedEffectWithNoOutputClip) { +TEST_P(PaintArtifactCompositorTest, CompositedEffectWithNoOutputClip) { // This test verifies effect nodes with no output clip but has compositing // reason correctly squash children chunks and assign clip node. auto clip1 = CreateClip(c0(), &t0(), FloatRoundedRect(75, 75, 100, 100)); @@ -2836,7 +2898,7 @@ EXPECT_EQ(2, layer->effect_tree_index()); } -TEST_F(PaintArtifactCompositorTest, LayerRasterInvalidationWithClip) { +TEST_P(PaintArtifactCompositorTest, LayerRasterInvalidationWithClip) { cc::FakeImplTaskRunnerProvider task_runner_provider_; cc::TestTaskGraphRunner task_graph_runner_; cc::FakeLayerTreeHostImpl host_impl(&task_runner_provider_, @@ -2908,7 +2970,7 @@ // Test that PaintArtifactCompositor creates the correct nodes for the visual // viewport's page scale and scroll layers to support pinch-zooming. -TEST_F(PaintArtifactCompositorTest, CreatesViewportNodes) { +TEST_P(PaintArtifactCompositorTest, CreatesViewportNodes) { TransformationMatrix matrix; matrix.Scale(2); TransformPaintPropertyNode::State transform_state{matrix, FloatPoint3D()};
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index 1b80b0a..f6d7101 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -377,11 +377,13 @@ void ConversionContext::StartClip( const FloatRoundedRect& combined_clip_rect, const ClipPaintPropertyNode* lowest_combined_clip_node) { - if (lowest_combined_clip_node->LocalTransformSpace() != current_transform_) + auto* local_transform = + lowest_combined_clip_node->LocalTransformSpace()->Unalias(); + if (local_transform != current_transform_) EndTransform(); cc_list_.StartPaint(); cc_list_.push<cc::SaveOp>(); - ApplyTransform(lowest_combined_clip_node->LocalTransformSpace()); + ApplyTransform(local_transform); const bool antialias = true; if (combined_clip_rect.IsRounded()) { cc_list_.push<cc::ClipRRectOp>(combined_clip_rect, SkClipOp::kIntersect, @@ -399,7 +401,7 @@ PushState(StateEntry::kClip, 1); current_clip_ = lowest_combined_clip_node; - current_transform_ = lowest_combined_clip_node->LocalTransformSpace(); + current_transform_ = local_transform; } void ConversionContext::SwitchToEffect( @@ -608,6 +610,7 @@ void ConversionContext::SwitchToTransform( const TransformPaintPropertyNode* target_transform) { + target_transform = target_transform->Unalias(); if (target_transform == current_transform_) return;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc index dd45221..bee7204 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc
@@ -963,5 +963,146 @@ cc::PaintOpType::Restore})); // </t1> } +TEST_F(PaintChunksToCcLayerTest, NoopTransformIsNotEmitted) { + auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); + auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); + auto noop_t3 = TransformPaintPropertyNode::CreateAlias(*noop_t2); + auto t4 = CreateTransform(*noop_t3, TransformationMatrix().Scale(2.f)); + auto noop_t5 = TransformPaintPropertyNode::CreateAlias(*t4); + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(*t1, c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + chunks.AddChunk(*noop_t3, c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + chunks.AddChunk(*t4, c0(), e0()); + chunks.AddChunk(*noop_t5, c0(), e0()); + chunks.AddChunk(*t4, c0(), e0()); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, + PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, // draw with t0 + cc::PaintOpType::Save, cc::PaintOpType::Concat, // t1 + cc::PaintOpType::DrawRecord, // draw with t1 + cc::PaintOpType::DrawRecord, // draw with noop_t2 + cc::PaintOpType::DrawRecord, // draw with noop_t3 + cc::PaintOpType::DrawRecord, // draw with noop_t2 + cc::PaintOpType::Restore, // end t1 + cc::PaintOpType::Save, cc::PaintOpType::Concat, // t4 + cc::PaintOpType::DrawRecord, // draw with t4 + cc::PaintOpType::DrawRecord, // draw with noop_t5 + cc::PaintOpType::DrawRecord, // draw with t4 + cc::PaintOpType::Restore // end t4 + })); +} + +TEST_F(PaintChunksToCcLayerTest, OnlyNoopTransformIsNotEmitted) { + auto noop_t1 = TransformPaintPropertyNode::CreateAlias(t0()); + auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*noop_t1); + + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(*noop_t1, c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord, + cc::PaintOpType::DrawRecord, + cc::PaintOpType::DrawRecord})); +} + +TEST_F(PaintChunksToCcLayerTest, NoopTransformFirstThenBackToParent) { + auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); + auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); + + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + chunks.AddChunk(*t1, c0(), e0()); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, // t0 + cc::PaintOpType::Save, + cc::PaintOpType::Concat, // t1 + noop_t2 + cc::PaintOpType::DrawRecord, // draw with above + cc::PaintOpType::DrawRecord, // draw with just t1 + cc::PaintOpType::Restore // end t1 + })); +} + +TEST_F(PaintChunksToCcLayerTest, ClipUndoesNoopTransform) { + auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); + auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); + auto c1 = CreateClip(c0(), t1.get(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + // The clip's local transform is t1, which is the parent of noop_t2. + chunks.AddChunk(*noop_t2, *c1, e0()); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, // t0 + cc::PaintOpType::Save, + cc::PaintOpType::Concat, // t1 + noop_t2 + cc::PaintOpType::DrawRecord, cc::PaintOpType::Save, + cc::PaintOpType::ClipRect, // c1 (with t1 space) + cc::PaintOpType::DrawRecord, + cc::PaintOpType::Restore, // end c1 + cc::PaintOpType::Restore // end t1 + })); +} + +TEST_F(PaintChunksToCcLayerTest, EffectUndoesNoopTransform) { + auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); + auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); + auto e1 = CreateOpacityEffect(e0(), t1.get(), &c0(), 0.5); + + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(*noop_t2, c0(), e0()); + // The effects's local transform is t1, which is the parent of noop_t2. + chunks.AddChunk(*noop_t2, c0(), *e1); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, // t0 + cc::PaintOpType::Save, + cc::PaintOpType::Concat, // t1 + noop_t2 + cc::PaintOpType::DrawRecord, + cc::PaintOpType::SaveLayerAlpha, // e1 + cc::PaintOpType::DrawRecord, + cc::PaintOpType::Restore, // end e1 + cc::PaintOpType::Restore // end t1 + })); +} } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h index 1e8cc85..390e29923 100644 --- a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h
@@ -41,8 +41,7 @@ // overlay scrollbars which is only used for hit testing. bool EqualIgnoringHitTestRects(const State& o) const { return local_transform_space == o.local_transform_space && - clip_rect == o.clip_rect && - clip_path == o.clip_path && + clip_rect == o.clip_rect && clip_path == o.clip_path && direct_compositing_reasons == o.direct_compositing_reasons; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h index def059e..058e0b1 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_property_node.h
@@ -74,6 +74,21 @@ n->changed_ = false; } + // Returns true if this node is an alias for its parent. A parent alias is a + // node which on its own does not contribute to the rendering output, and only + // exists to enforce a particular structure of the paint property tree. Its + // value is ignored during display item list generation, instead the parent + // value is used. See Unalias(). + bool IsParentAlias() const { return is_parent_alias_; } + // Returns the first node up the parent chain that is not an alias; return the + // root node if every node is an alias. + const NodeType* Unalias() const { + const auto* node = static_cast<const NodeType*>(this); + while (node->Parent() && node->IsParentAlias()) + node = node->Parent(); + return node; + } + String ToString() const { auto s = static_cast<const NodeType*>(this)->ToJSON()->ToJSONString(); #if DCHECK_IS_ON() @@ -91,8 +106,10 @@ #endif protected: - PaintPropertyNode(const NodeType* parent) - : parent_(parent), changed_(!!parent) {} + PaintPropertyNode(const NodeType* parent, bool is_parent_alias = false) + : parent_(parent), + is_parent_alias_(is_parent_alias), + changed_(!!parent) {} bool SetParent(const NodeType* parent) { DCHECK(!IsRoot()); @@ -115,7 +132,11 @@ friend class PaintPropertyNodeTest; scoped_refptr<const NodeType> parent_; - mutable bool changed_; + // Indicates whether this node is an alias for its parent. Parent aliases are + // nodes that do not affect rendering and are ignored for the purposes of + // display item list generation. + bool is_parent_alias_ = false; + mutable bool changed_ = true; #if DCHECK_IS_ON() String debug_name_;
diff --git a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc index 80a709b..a17f077 100644 --- a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc +++ b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc
@@ -15,7 +15,8 @@ nullptr, State{TransformationMatrix(), FloatPoint3D(), false, BackfaceVisibility::kVisible, 0, CompositingReason::kNone, - CompositorElementId(), &ScrollPaintPropertyNode::Root()}))); + CompositorElementId(), &ScrollPaintPropertyNode::Root()}, + true /* is_parent_alias */))); return *root; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h index f670c90..ff0ad144 100644 --- a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h
@@ -71,8 +71,13 @@ static scoped_refptr<TransformPaintPropertyNode> Create( const TransformPaintPropertyNode& parent, State&& state) { - return base::AdoptRef( - new TransformPaintPropertyNode(&parent, std::move(state))); + return base::AdoptRef(new TransformPaintPropertyNode( + &parent, std::move(state), false /* is_parent_alias */)); + } + static scoped_refptr<TransformPaintPropertyNode> CreateAlias( + const TransformPaintPropertyNode& parent) { + return base::AdoptRef(new TransformPaintPropertyNode( + &parent, State{}, true /* is_parent_alias */)); } bool Update(const TransformPaintPropertyNode& parent, State&& state) { @@ -80,6 +85,7 @@ if (state == state_) return parent_changed; + DCHECK(!IsParentAlias()) << "Changed the state of an alias node."; SetChanged(); state_ = std::move(state); Validate(); @@ -145,14 +151,15 @@ // The clone function is used by FindPropertiesNeedingUpdate.h for recording // a transform node before it has been updated, to later detect changes. scoped_refptr<TransformPaintPropertyNode> Clone() const { - return base::AdoptRef( - new TransformPaintPropertyNode(Parent(), State(state_))); + return base::AdoptRef(new TransformPaintPropertyNode( + Parent(), State(state_), IsParentAlias())); } // The equality operator is used by FindPropertiesNeedingUpdate.h for checking // if a transform node has changed. bool operator==(const TransformPaintPropertyNode& o) const { - return Parent() == o.Parent() && state_ == o.state_; + return Parent() == o.Parent() && state_ == o.state_ && + IsParentAlias() == o.IsParentAlias(); } #endif @@ -163,8 +170,9 @@ private: TransformPaintPropertyNode(const TransformPaintPropertyNode* parent, - State&& state) - : PaintPropertyNode(parent), state_(std::move(state)) { + State&& state, + bool is_parent_alias) + : PaintPropertyNode(parent, is_parent_alias), state_(std::move(state)) { Validate(); }
diff --git a/third_party/blink/renderer/platform/heap/BUILD.gn b/third_party/blink/renderer/platform/heap/BUILD.gn index 337d4cb..edaa941 100644 --- a/third_party/blink/renderer/platform/heap/BUILD.gn +++ b/third_party/blink/renderer/platform/heap/BUILD.gn
@@ -78,6 +78,10 @@ "thread_state.h", "threading_traits.h", "trace_traits.h", + "unified_heap_controller.cc", + "unified_heap_controller.h", + "unified_heap_marking_visitor.cc", + "unified_heap_marking_visitor.h", "visitor.h", "worklist.h", ]
diff --git a/third_party/blink/renderer/platform/heap/blink_gc.h b/third_party/blink/renderer/platform/heap/blink_gc.h index e4dd72eb..04dac69 100644 --- a/third_party/blink/renderer/platform/heap/blink_gc.h +++ b/third_party/blink/renderer/platform/heap/blink_gc.h
@@ -104,7 +104,8 @@ kTesting = 7, kIncrementalIdleGC = 8, kIncrementalV8FollowupGC = 9, - kMaxValue = kIncrementalV8FollowupGC, + kUnifiedHeapGC = 10, + kMaxValue = kUnifiedHeapGC, }; enum ArenaIndices {
diff --git a/third_party/blink/renderer/platform/heap/heap_test.cc b/third_party/blink/renderer/platform/heap/heap_test.cc index 4e7a71d..9905546 100644 --- a/third_party/blink/renderer/platform/heap/heap_test.cc +++ b/third_party/blink/renderer/platform/heap/heap_test.cc
@@ -5484,12 +5484,13 @@ } static ThreadCondition& MainThreadCondition() { - DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadCondition, main_condition, ()); + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadCondition, main_condition, + (MainThreadMutex())); return main_condition; } static void ParkMainThread() { - MainThreadCondition().Wait(MainThreadMutex()); + MainThreadCondition().Wait(); } static void WakeMainThread() { @@ -5503,12 +5504,13 @@ } static ThreadCondition& WorkerThreadCondition() { - DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadCondition, worker_condition, ()); + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadCondition, worker_condition, + (WorkerThreadMutex())); return worker_condition; } static void ParkWorkerThread() { - WorkerThreadCondition().Wait(WorkerThreadMutex()); + WorkerThreadCondition().Wait(); } static void WakeWorkerThread() {
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h index 18eedcdf..8a8d1e58 100644 --- a/third_party/blink/renderer/platform/heap/marking_visitor.h +++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -15,7 +15,7 @@ class BasePage; // Visitor used to mark Oilpan objects. -class PLATFORM_EXPORT MarkingVisitor final : public Visitor { +class PLATFORM_EXPORT MarkingVisitor : public Visitor { public: enum MarkingMode { // This is a default visitor. This is used for MarkingType=kAtomicMarking @@ -156,9 +156,9 @@ void RegisterWeakCallback(void* closure, WeakCallback) final; // Unused cross-component visit methods. - void Visit(const TraceWrapperV8Reference<v8::Value>&) final {} + void Visit(const TraceWrapperV8Reference<v8::Value>&) override {} void Visit(DOMWrapperMap<ScriptWrappable>*, - const ScriptWrappable* key) final {} + const ScriptWrappable* key) override {} private: // Exact version of the marking write barriers.
diff --git a/third_party/blink/renderer/platform/heap/persistent_node.cc b/third_party/blink/renderer/platform/heap/persistent_node.cc index e822627..921b5c9 100644 --- a/third_party/blink/renderer/platform/heap/persistent_node.cc +++ b/third_party/blink/renderer/platform/heap/persistent_node.cc
@@ -198,7 +198,7 @@ #if defined(ADDRESS_SANITIZER) void CrossThreadPersistentRegion::UnpoisonCrossThreadPersistents() { #if DCHECK_IS_ON() - DCHECK(ProcessHeap::CrossThreadPersistentMutex().Locked()); + ProcessHeap::CrossThreadPersistentMutex().AssertAcquired(); #endif int persistent_count = 0; for (PersistentNodeSlots* slots = persistent_region_.slots_; slots;
diff --git a/third_party/blink/renderer/platform/heap/persistent_node.h b/third_party/blink/renderer/platform/heap/persistent_node.h index d3234653..1401441 100644 --- a/third_party/blink/renderer/platform/heap/persistent_node.h +++ b/third_party/blink/renderer/platform/heap/persistent_node.h
@@ -183,7 +183,7 @@ void FreePersistentNode(PersistentNode*& persistent_node) { #if DCHECK_IS_ON() - DCHECK(ProcessHeap::CrossThreadPersistentMutex().Locked()); + ProcessHeap::CrossThreadPersistentMutex().AssertAcquired(); #endif // When the thread that holds the heap object that the cross-thread // persistent shuts down, prepareForThreadStateTermination() will clear out
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc index b5bf922..c41b7345 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -43,6 +43,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_thread.h" #include "third_party/blink/renderer/platform/bindings/runtime_call_stats.h" +#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" #include "third_party/blink/renderer/platform/heap/address_cache.h" #include "third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -52,6 +53,7 @@ #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h" #include "third_party/blink/renderer/platform/heap/marking_visitor.h" #include "third_party/blink/renderer/platform/heap/page_pool.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" #include "third_party/blink/renderer/platform/heap/visitor.h" #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" @@ -116,6 +118,8 @@ return "IncrementalIdleGC"; case BlinkGC::GCReason::kIncrementalV8FollowupGC: return "IncrementalV8FollowupGC"; + case BlinkGC::GCReason::kUnifiedHeapGC: + return "UnifiedHeapGC"; } return "<Unknown>"; } @@ -1199,6 +1203,7 @@ COUNT_BY_GC_REASON(Testing) COUNT_BY_GC_REASON(IncrementalIdleGC) COUNT_BY_GC_REASON(IncrementalV8FollowupGC) + COUNT_BY_GC_REASON(UnifiedHeapGC) #undef COUNT_BY_GC_REASON } @@ -1430,16 +1435,18 @@ } void ThreadState::IncrementalMarkingStep() { + DCHECK(IsMarkingInProgress()); + ThreadHeapStatsCollector::EnabledScope stats_scope( Heap().stats_collector(), ThreadHeapStatsCollector::kIncrementalMarkingStep); VLOG(2) << "[state:" << this << "] " - << "IncrementalMarking: Step"; + << "IncrementalMarking: Step " + << "Reason: " << GcReasonString(current_gc_data_.reason); AtomicPauseScope atomic_pause_scope(this); - DCHECK(IsMarkingInProgress()); bool complete = MarkPhaseAdvanceMarking( CurrentTimeTicks() + next_incremental_marking_step_duration_); - if (complete) + if (complete && !IsUnifiedGCMarkingInProgress()) ScheduleIncrementalMarkingFinalize(); else ScheduleIncrementalMarkingStep(); @@ -1447,17 +1454,42 @@ } void ThreadState::IncrementalMarkingFinalize() { + DCHECK(IsMarkingInProgress()); + DCHECK(!IsUnifiedGCMarkingInProgress()); + ThreadHeapStatsCollector::EnabledScope stats_scope( Heap().stats_collector(), ThreadHeapStatsCollector::kIncrementalMarkingFinalize); VLOG(2) << "[state:" << this << "] " - << "IncrementalMarking: Finalize"; + << "IncrementalMarking: Finalize " + << "Reason: " << GcReasonString(current_gc_data_.reason); // Call into the regular bottleneck instead of the internal version to get // UMA accounting and allow follow up GCs if necessary. CollectGarbage(BlinkGC::kNoHeapPointersOnStack, BlinkGC::kIncrementalMarking, BlinkGC::kLazySweeping, current_gc_data_.reason); } +bool ThreadState::FinishIncrementalMarkingIfRunning( + BlinkGC::StackState stack_state, + BlinkGC::MarkingType marking_type, + BlinkGC::SweepingType sweeping_type, + BlinkGC::GCReason reason) { + if (IsMarkingInProgress()) { + // TODO(mlippautz): Consider improving this mechanism as it will pull in + // finalization of V8 upon Oilpan GCs during a unified GC. Alternative + // include either breaking up the GCs or avoiding the call in first place. + if (IsUnifiedGCMarkingInProgress()) { + V8PerIsolateData::From(isolate_) + ->GetUnifiedHeapController() + ->FinalizeTracing(); + } else { + RunAtomicPause(stack_state, marking_type, sweeping_type, reason); + } + return true; + } + return false; +} + void ThreadState::CollectGarbage(BlinkGC::StackState stack_state, BlinkGC::MarkingType marking_type, BlinkGC::SweepingType sweeping_type, @@ -1473,14 +1505,8 @@ RUNTIME_CALL_TIMER_SCOPE_IF_ISOLATE_EXISTS( GetIsolate(), RuntimeCallStats::CounterId::kCollectGarbage); - const bool was_incremental_marking = IsMarkingInProgress(); - - if (was_incremental_marking) { - SetGCState(kNoGCScheduled); - DisableIncrementalMarkingBarrier(); - DCHECK(IsMarkingInProgress()); - RunAtomicPause(stack_state, marking_type, sweeping_type, reason); - } + const bool was_incremental_marking = FinishIncrementalMarkingIfRunning( + stack_state, marking_type, sweeping_type, reason); // We don't want floating garbage for the specific garbage collection types // mentioned below. In this case we will follow up with a regular full @@ -1519,6 +1545,7 @@ COUNT_BY_GC_REASON(Testing) COUNT_BY_GC_REASON(IncrementalIdleGC) COUNT_BY_GC_REASON(IncrementalV8FollowupGC) + COUNT_BY_GC_REASON(UnifiedHeapGC) } #undef COUNT_BY_GC_REASON @@ -1620,11 +1647,16 @@ !take_snapshot && Heap().Compaction()->ShouldCompact( &Heap(), stack_state, marking_type, reason); - current_gc_data_.visitor = MarkingVisitor::Create( - this, GetMarkingMode(should_compact, take_snapshot)); + current_gc_data_.reason = reason; + current_gc_data_.visitor = + IsUnifiedGCMarkingInProgress() + ? UnifiedHeapMarkingVisitor::Create( + this, GetMarkingMode(should_compact, take_snapshot), + GetIsolate()) + : MarkingVisitor::Create( + this, GetMarkingMode(should_compact, take_snapshot)); current_gc_data_.stack_state = stack_state; current_gc_data_.marking_type = marking_type; - current_gc_data_.reason = reason; if (should_compact) Heap().Compaction()->Initialize(this); @@ -1639,6 +1671,8 @@ current_gc_data_.reason = reason; current_gc_data_.stack_state = stack_state; Heap().stats_collector()->UpdateReason(reason); + SetGCState(kNoGCScheduled); + DisableIncrementalMarkingBarrier(); } else { MarkPhasePrologue(stack_state, marking_type, reason); } @@ -1663,7 +1697,12 @@ VisitPersistents(visitor); - VisitDOMWrappers(visitor); + // Unified garbage collections do not consider DOM wrapper references as + // roots. The cross-component references between V8<->Blink are found using + // collaborative tracing where both GCs report live references to each other. + if (!IsUnifiedGCMarkingInProgress()) { + VisitDOMWrappers(visitor); + } if (current_gc_data_.stack_state == BlinkGC::kHeapPointersOnStack) { ThreadHeapStatsCollector::Scope stats_scope(
diff --git a/third_party/blink/renderer/platform/heap/thread_state.h b/third_party/blink/renderer/platform/heap/thread_state.h index c77816c..cf9f6d3 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.h +++ b/third_party/blink/renderer/platform/heap/thread_state.h
@@ -286,6 +286,10 @@ void SetGCPhase(GCPhase); bool IsMarkingInProgress() const { return gc_phase_ == GCPhase::kMarking; } bool IsSweepingInProgress() const { return gc_phase_ == GCPhase::kSweeping; } + bool IsUnifiedGCMarkingInProgress() const { + return IsMarkingInProgress() && + current_gc_data_.reason == BlinkGC::GCReason::kUnifiedHeapGC; + } void EnableWrapperTracingBarrier(); void DisableWrapperTracingBarrier(); @@ -297,6 +301,10 @@ void IncrementalMarkingStart(BlinkGC::GCReason); void IncrementalMarkingStep(); void IncrementalMarkingFinalize(); + bool FinishIncrementalMarkingIfRunning(BlinkGC::StackState, + BlinkGC::MarkingType, + BlinkGC::SweepingType, + BlinkGC::GCReason); void EnableIncrementalMarkingBarrier(); void DisableIncrementalMarkingBarrier(); @@ -466,8 +474,6 @@ void (*perform_cleanup)(v8::Isolate*)) { isolate_ = isolate; DCHECK(!isolate_ || trace_dom_wrappers); - DCHECK(!isolate_ || invalidate_dead_objects_in_wrappers_marking_deque); - DCHECK(!isolate_ || perform_cleanup); trace_dom_wrappers_ = trace_dom_wrappers; invalidate_dead_objects_in_wrappers_marking_deque_ = invalidate_dead_objects_in_wrappers_marking_deque; @@ -554,7 +560,14 @@ // Implementation for WebRAILModeObserver void OnRAILModeChanged(v8::RAILMode new_mode) override { should_optimize_for_load_time_ = new_mode == v8::RAILMode::PERFORMANCE_LOAD; + // When switching RAIL mode to load we try to avoid incremental marking as + // the write barrier cost is noticeable on throughput and garbage + // accumulated during loading is likely to be alive during that phase. The + // same argument holds for unified heap garbage collections with the + // difference that these collections are triggered by V8 and should thus be + // avoided on that end. if (should_optimize_for_load_time_ && IsIncrementalMarking() && + !IsUnifiedGCMarkingInProgress() && GetGCState() == GCState::kIncrementalMarkingStepScheduled) ScheduleIncrementalMarkingFinalize(); } @@ -760,6 +773,7 @@ friend class PrefinalizerRegistration; friend class TestGCScope; friend class ThreadStateSchedulingTest; + friend class UnifiedHeapController; DISALLOW_COPY_AND_ASSIGN(ThreadState); };
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc new file mode 100644 index 0000000..d3a5611 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
@@ -0,0 +1,120 @@ +// 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 "third_party/blink/renderer/platform/heap/unified_heap_controller.h" + +#include "third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h" +#include "third_party/blink/renderer/platform/heap/marking_visitor.h" +#include "third_party/blink/renderer/platform/heap/thread_state.h" + +namespace blink { + +namespace { + +constexpr BlinkGC::StackState ToBlinkGCStackState( + v8::EmbedderHeapTracer::EmbedderStackState stack_state) { + return stack_state == v8::EmbedderHeapTracer::EmbedderStackState::kEmpty + ? BlinkGC::kNoHeapPointersOnStack + : BlinkGC::kHeapPointersOnStack; +} + +} // namespace + +UnifiedHeapController::UnifiedHeapController(ThreadState* thread_state) + : thread_state_(thread_state) {} + +void UnifiedHeapController::TracePrologue() { + VLOG(2) << "UnifiedHeapController::TracePrologue"; + + // Be conservative here as a new garbage collection gets started right away. + thread_state_->FinishIncrementalMarkingIfRunning( + BlinkGC::kHeapPointersOnStack, BlinkGC::kIncrementalMarking, + BlinkGC::kLazySweeping, thread_state_->current_gc_data_.reason); + // Reset any previously scheduled garbage collections. + thread_state_->SetGCState(ThreadState::kNoGCScheduled); + // Start incremental marking with unified tracing. + thread_state_->IncrementalMarkingStart(BlinkGC::GCReason::kUnifiedHeapGC); +} + +void UnifiedHeapController::EnterFinalPause(EmbedderStackState stack_state) { + VLOG(2) << "UnifiedHeapController::EnterFinalPause"; + + // ActiveScriptWrappable may not have persistents keeping them alive but rely + // on explicit tracing to be kept alive. + // TODO(mlippautz): Move to root scanning after stabilizing unified garbage + // collection. + ActiveScriptWrappableBase::TraceActiveScriptWrappables( + isolate_, thread_state_->CurrentVisitor()); + + thread_state_->EnterAtomicPause(); + thread_state_->EnterGCForbiddenScope(); + thread_state_->AtomicPauseMarkPrologue(ToBlinkGCStackState(stack_state), + BlinkGC::kIncrementalMarking, + BlinkGC::GCReason::kUnifiedHeapGC); +} + +void UnifiedHeapController::TraceEpilogue() { + VLOG(2) << "UnifiedHeapController::TraceEpilogue"; + + thread_state_->AtomicPauseMarkEpilogue(BlinkGC::kIncrementalMarking); + thread_state_->LeaveAtomicPause(); + thread_state_->LeaveGCForbiddenScope(); + thread_state_->AtomicPauseSweepAndCompact(BlinkGC::kIncrementalMarking, + BlinkGC::kLazySweeping); + if (!thread_state_->IsSweepingInProgress()) { + // Sweeping was finished during the atomic pause. Update statistics needs to + // run outside of the top-most stats scope. + thread_state_->UpdateStatisticsAfterSweeping(); + } +} + +void UnifiedHeapController::RegisterV8References( + const std::vector<std::pair<void*, void*>>& + internal_fields_of_potential_wrappers) { + VLOG(2) << "UnifiedHeapController::RegisterV8References"; + + DCHECK(thread_state()->IsMarkingInProgress()); + + const bool was_in_atomic_pause = thread_state()->in_atomic_pause(); + if (!was_in_atomic_pause) + ThreadState::Current()->EnterAtomicPause(); + for (auto& internal_fields : internal_fields_of_potential_wrappers) { + WrapperTypeInfo* wrapper_type_info = + reinterpret_cast<WrapperTypeInfo*>(internal_fields.first); + if (wrapper_type_info->gin_embedder != gin::GinEmbedder::kEmbedderBlink) { + continue; + } + wrapper_type_info->Trace(thread_state_->CurrentVisitor(), + internal_fields.second); + } + if (!was_in_atomic_pause) + ThreadState::Current()->LeaveAtomicPause(); +} + +bool UnifiedHeapController::AdvanceTracing(double deadline_in_ms) { + VLOG(2) << "UnifiedHeapController::AdvanceTracing"; + + if (!thread_state_->in_atomic_pause()) { + // V8 calls into embedder tracing from its own marking to ensure + // progress.Oilpan will additionally schedule marking steps. + ThreadState::AtomicPauseScope atomic_pause_scope(thread_state_); + TimeTicks deadline = + TimeTicks() + TimeDelta::FromMillisecondsD(deadline_in_ms); + return thread_state_->MarkPhaseAdvanceMarking(deadline); + } + thread_state_->AtomicPauseMarkTransitiveClosure(); + return true; +} + +void UnifiedHeapController::AbortTracing() { + VLOG(2) << "UnifiedHeapController::AbortTracing"; + + // TODO(mlippautz): Only needed when V8 aborts incremental marking which + // should be rare in non-production code. + LOG(FATAL) << "Not yet implemented"; +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.h b/third_party/blink/renderer/platform/heap/unified_heap_controller.h new file mode 100644 index 0000000..924c0f9 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.h
@@ -0,0 +1,54 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_CONTROLLER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_CONTROLLER_H_ + +#include "base/macros.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "v8/include/v8.h" + +namespace blink { + +class ThreadState; + +// UnifiedHeapController ties V8's garbage collector to Oilpan for performing a +// garbage collection across both managed heaps. +// +// Unified heap garbage collections are triggered by V8 and mark the full +// transitive closure of V8 and Blink (Oilpan) objects. The garbage collection +// is initially triggered by V8. Both collecters report live references using +// the EmbedderHeapTracer APIs. V8 and Blink both run separate incremental +// marking steps to compute their live closures, respectively. The final atomic +// pause is then initiated by V8 and triggers a fixed-point computation between +// V8 and Blink where both GCs report live references to each other and drain +// their marking work lists until they are empty and no new references are +// found. +// +// Oilpan does not consider references from DOM wrappers (JavaScript objects on +// V8's heap) as roots for such garbage collections. +class PLATFORM_EXPORT UnifiedHeapController final + : public v8::EmbedderHeapTracer { + DISALLOW_IMPLICIT_CONSTRUCTORS(UnifiedHeapController); + + public: + explicit UnifiedHeapController(ThreadState*); + + // v8::EmbedderHeapTracer implementation. + void TracePrologue() final; + void TraceEpilogue() final; + void AbortTracing() final; + void EnterFinalPause(EmbedderStackState) final; + void RegisterV8References(const std::vector<std::pair<void*, void*>>&) final; + bool AdvanceTracing(double) final; + + ThreadState* thread_state() const { return thread_state_; } + + private: + ThreadState* const thread_state_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_CONTROLLER_H_
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc new file mode 100644 index 0000000..d5a8881 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc
@@ -0,0 +1,87 @@ +// 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 "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" + +#include "third_party/blink/renderer/platform/bindings/dom_wrapper_map.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h" +#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" +#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h" + +namespace blink { + +std::unique_ptr<UnifiedHeapMarkingVisitor> UnifiedHeapMarkingVisitor::Create( + ThreadState* thread_state, + MarkingMode mode, + v8::Isolate* isolate) { + DCHECK(thread_state); + DCHECK(isolate); + return std::unique_ptr<UnifiedHeapMarkingVisitor>( + new UnifiedHeapMarkingVisitor(thread_state, mode, isolate)); +} + +UnifiedHeapMarkingVisitor::UnifiedHeapMarkingVisitor(ThreadState* thread_state, + MarkingMode mode, + v8::Isolate* isolate) + : MarkingVisitor(thread_state, mode), isolate_(isolate) {} + +void UnifiedHeapMarkingVisitor::WriteBarrier( + v8::Isolate* isolate, + const TraceWrapperV8Reference<v8::Value>& object) { + if (!ThreadState::IsAnyIncrementalMarking()) + return; + + ThreadState* thread_state = ThreadState::Current(); + if (!thread_state->IsIncrementalMarking()) + return; + + thread_state->CurrentVisitor()->Trace(object); +} + +void UnifiedHeapMarkingVisitor::WriteBarrier( + v8::Isolate* isolate, + DOMWrapperMap<ScriptWrappable>* wrapper_map, + ScriptWrappable* key) { + if (!ThreadState::IsAnyIncrementalMarking()) + return; + + ThreadState* thread_state = ThreadState::Current(); + if (!thread_state->IsIncrementalMarking()) + return; + + thread_state->CurrentVisitor()->Trace(wrapper_map, key); +} + +void UnifiedHeapMarkingVisitor::WriteBarrier( + v8::Isolate* isolate, + const WrapperTypeInfo* wrapper_type_info, + void* object) { + // |object| here is either ScriptWrappable or CustomWrappable. + + if (!ThreadState::IsAnyIncrementalMarking()) + return; + + ThreadState* thread_state = ThreadState::Current(); + if (!thread_state->IsIncrementalMarking()) + return; + + wrapper_type_info->Trace(thread_state->CurrentVisitor(), object); +} + +void UnifiedHeapMarkingVisitor::Visit( + const TraceWrapperV8Reference<v8::Value>& v8_reference) { + if (v8_reference.Get().IsEmpty()) + return; + DCHECK(isolate_); + v8_reference.Get().RegisterExternalReference(isolate_); +} + +void UnifiedHeapMarkingVisitor::Visit( + DOMWrapperMap<ScriptWrappable>* wrapper_map, + const ScriptWrappable* key) { + wrapper_map->MarkWrapper(const_cast<ScriptWrappable*>(key)); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h new file mode 100644 index 0000000..32c88b95 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h
@@ -0,0 +1,47 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_MARKING_VISITOR_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_MARKING_VISITOR_H_ + +#include "base/macros.h" +#include "third_party/blink/renderer/platform/heap/marking_visitor.h" + +namespace blink { + +struct WrapperTypeInfo; + +// Marking visitor for unified heap garbage collections. Extends the regular +// Oilpan marking visitor by also providing write barriers and visitation +// methods that allow for announcing reachable objects to V8. +class PLATFORM_EXPORT UnifiedHeapMarkingVisitor final : public MarkingVisitor { + public: + static std::unique_ptr<UnifiedHeapMarkingVisitor> Create(ThreadState*, + MarkingMode, + v8::Isolate*); + // Write barriers for annotating a write during incremental marking. + static void WriteBarrier(v8::Isolate*, + const TraceWrapperV8Reference<v8::Value>&); + static void WriteBarrier(v8::Isolate*, + DOMWrapperMap<ScriptWrappable>*, + ScriptWrappable*); + static void WriteBarrier(v8::Isolate*, const WrapperTypeInfo*, void*); + + ~UnifiedHeapMarkingVisitor() override = default; + + // Visitation methods that announce reachable wrappers to V8. + void Visit(const TraceWrapperV8Reference<v8::Value>&) final; + void Visit(DOMWrapperMap<ScriptWrappable>*, const ScriptWrappable*) final; + + private: + UnifiedHeapMarkingVisitor(ThreadState*, MarkingMode, v8::Isolate*); + + v8::Isolate* const isolate_; + + DISALLOW_COPY_AND_ASSIGN(UnifiedHeapMarkingVisitor); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_UNIFIED_HEAP_MARKING_VISITOR_H_
diff --git a/third_party/blink/renderer/platform/image-decoders/image_decoder.h b/third_party/blink/renderer/platform/image-decoders/image_decoder.h index 1242a2e..aba07d98 100644 --- a/third_party/blink/renderer/platform/image-decoders/image_decoder.h +++ b/third_party/blink/renderer/platform/image-decoders/image_decoder.h
@@ -41,9 +41,10 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/time.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -#include "third_party/skia/include/core/SkColorSpaceXform.h" #include "third_party/skia/third_party/skcms/skcms.h" +class SkColorSpace; + namespace blink { #if SK_B32_SHIFT
diff --git a/third_party/blink/renderer/platform/image-decoders/image_frame.cc b/third_party/blink/renderer/platform/image-decoders/image_frame.cc index 02ed602..1fde4f0 100644 --- a/third_party/blink/renderer/platform/image-decoders/image_frame.cc +++ b/third_party/blink/renderer/platform/image-decoders/image_frame.cc
@@ -29,7 +29,7 @@ #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h" #include "third_party/skia/include/core/SkCanvas.h" -#include "third_party/skia/include/core/SkColorSpaceXform.h" +#include "third_party/skia/include/core/SkColorSpace.h" #include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkSurface.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc index 3605966..1c3b224 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -29,7 +29,8 @@ const char kOutstandingLimitForBackgroundSubFrameName[] = "bg_sub_limit"; // Field trial default parameters. -constexpr size_t kOutstandingLimitForBackgroundFrameDefault = 16u; +constexpr size_t kOutstandingLimitForBackgroundMainFrameDefault = 3u; +constexpr size_t kOutstandingLimitForBackgroundSubFrameDefault = 2u; // Maximum request count that request count metrics assume. constexpr base::HistogramBase::Sample kMaximumReportSize10K = 10000; @@ -94,18 +95,14 @@ if (!RuntimeEnabledFeatures::ResourceLoadSchedulerEnabled()) return ResourceLoadScheduler::kOutstandingUnlimited; - uint32_t main_frame_limit = GetFieldTrialUint32Param( + static size_t main_frame_limit = GetFieldTrialUint32Param( kResourceLoadThrottlingTrial, kOutstandingLimitForBackgroundMainFrameName, - kOutstandingLimitForBackgroundFrameDefault); - if (context->IsMainFrame()) - return main_frame_limit; + kOutstandingLimitForBackgroundMainFrameDefault); + static size_t sub_frame_limit = GetFieldTrialUint32Param( + kResourceLoadThrottlingTrial, kOutstandingLimitForBackgroundSubFrameName, + kOutstandingLimitForBackgroundSubFrameDefault); - // We do not have a fixed default limit for sub-frames, but use the limit for - // the main frame so that it works as how previous versions that haven't - // consider sub-frames' specific limit work. - return GetFieldTrialUint32Param(kResourceLoadThrottlingTrial, - kOutstandingLimitForBackgroundSubFrameName, - main_frame_limit); + return context->IsMainFrame() ? main_frame_limit : sub_frame_limit; } int TakeWholeKilobytes(int64_t& bytes) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index 629cd559..f263954 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -31,6 +31,7 @@ #include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" +#include "third_party/blink/public/platform/code_cache_loader.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_cors.h" #include "third_party/blink/public/platform/web_data.h" @@ -77,6 +78,185 @@ } // namespace +// CodeCacheRequest handles the requests to fetch data from code cache. +// This owns CodeCacheLoader that actually loads the data from the +// code cache. This class performs the necessary checks of matching the +// resource response time and the code cache response time before sending +// the data to the resource. It caches the data returned from the code cache +// if the response wasn't received. One CodeCacheRequest handles only one +// request. On a restart new CodeCacheRequest is created. +class ResourceLoader::CodeCacheRequest { + public: + CodeCacheRequest(std::unique_ptr<CodeCacheLoader> code_cache_loader, + const KURL& url, + bool defers_loading) + : status_(kNoRequestSent), + code_cache_loader_(std::move(code_cache_loader)), + gurl_(url), + defers_loading_(defers_loading), + weak_ptr_factory_(this) { + DCHECK(RuntimeEnabledFeatures::IsolatedCodeCacheEnabled()); + } + + ~CodeCacheRequest() = default; + + // Request data from code cache. + bool FetchFromCodeCache(WebURLLoader* url_loader, + ResourceLoader* resource_loader); + bool FetchFromCodeCacheSynchronously(ResourceLoader* resource_loader); + + // Notifies about the response from webURLLoader. Stores the + // resource_response_time that is used to validate responses from + // code cache. Might send cached code if available. + void DidReceiveResponse(const base::Time& resource_response_time, + ResourceLoader* resource_loader); + + // Stores the value of defers that is needed to restore the state + // once fetching from code cache is finished. Returns true if the + // request is handled here and hence need not be handled by the loader. + // Returns false otherwise. + bool SetDefersLoading(bool defers); + + private: + enum CodeCacheRequestStatus { + kNoRequestSent, + kPendingResponse, + kReceivedResponse + }; + + // Callback to receive data from CodeCacheLoader. + void DidReceiveCachedCode(ResourceLoader* loader, + const base::Time& response_time, + const std::vector<uint8_t>& data); + + // Process the response from code cache. + void ProcessCodeCacheResponse(const base::Time& response_time, + const std::vector<uint8_t>& data, + ResourceLoader* resource_loader); + + // Send |cache_code| if we got a response from code_cache_loader and the + // web_url_loader. + void MaybeSendCachedCode(const std::vector<uint8_t>& cached_code, + ResourceLoader* resource_loader); + + CodeCacheRequestStatus status_; + std::unique_ptr<CodeCacheLoader> code_cache_loader_; + const GURL gurl_; + bool defers_loading_ = false; + std::vector<uint8_t> cached_code_; + base::Time cached_code_response_time_; + base::Time resource_response_time_; + base::WeakPtrFactory<CodeCacheRequest> weak_ptr_factory_; +}; + +bool ResourceLoader::CodeCacheRequest::FetchFromCodeCache( + WebURLLoader* url_loader, + ResourceLoader* resource_loader) { + if (!code_cache_loader_) + return false; + DCHECK_EQ(status_, kNoRequestSent); + status_ = kPendingResponse; + + // Set defers loading before fetching data from code cache. This is to + // ensure that the resource receives cached code before the response data. + // This directly calls the WebURLLoader's SetDefersLoading without going + // through ResourceLoader. + url_loader->SetDefersLoading(true); + + CodeCacheLoader::FetchCodeCacheCallback callback = + base::BindOnce(&ResourceLoader::CodeCacheRequest::DidReceiveCachedCode, + weak_ptr_factory_.GetWeakPtr(), resource_loader); + code_cache_loader_->FetchFromCodeCache(gurl_, std::move(callback)); + return true; +} + +bool ResourceLoader::CodeCacheRequest::FetchFromCodeCacheSynchronously( + ResourceLoader* resource_loader) { + if (!code_cache_loader_) + return false; + DCHECK_EQ(status_, kNoRequestSent); + status_ = kPendingResponse; + + base::Time response_time; + std::vector<uint8_t> data; + code_cache_loader_->FetchFromCodeCacheSynchronously(gurl_, &response_time, + &data); + ProcessCodeCacheResponse(response_time, data, resource_loader); + return true; +} + +// This is called when a response is received from the WebURLLoader. We buffer +// the response_time if the response from code cache is not available yet. +void ResourceLoader::CodeCacheRequest::DidReceiveResponse( + const base::Time& resource_response_time, + ResourceLoader* resource_loader) { + resource_response_time_ = resource_response_time; + MaybeSendCachedCode(cached_code_, resource_loader); +} + +// Returns true if |this| handles |defers| and therefore the callsite, i.e. the +// loader, doesn't need to take care of it). Returns false otherwise. +bool ResourceLoader::CodeCacheRequest::SetDefersLoading(bool defers) { + defers_loading_ = defers; + if (status_ == kPendingResponse) { + // The flag doesn't need to be handled by the loader. The value is stored + // in |defers_loading_| and set once the response from the code cache is + // received. + return true; + } + return false; +} + +void ResourceLoader::CodeCacheRequest::DidReceiveCachedCode( + ResourceLoader* resource_loader, + const base::Time& response_time, + const std::vector<uint8_t>& data) { + ProcessCodeCacheResponse(response_time, data, resource_loader); + // Reset the deferred value to its original state. + DCHECK(resource_loader); + resource_loader->SetDefersLoading(defers_loading_); +} + +// This is called when a response is received from code cache. If the +// resource response time is not available the response is buffered and +// will be processed when the response is received from the URLLoader. +void ResourceLoader::CodeCacheRequest::ProcessCodeCacheResponse( + const base::Time& response_time, + const std::vector<uint8_t>& data, + ResourceLoader* resource_loader) { + status_ = kReceivedResponse; + cached_code_response_time_ = response_time; + + if (resource_response_time_.is_null()) { + // Wait for the response before we can send the cached code. + // TODO(crbug.com/866889): Pass this as a handle to avoid the overhead of + // copying this data. + cached_code_ = data; + return; + } + + MaybeSendCachedCode(data, resource_loader); +} + +void ResourceLoader::CodeCacheRequest::MaybeSendCachedCode( + const std::vector<uint8_t>& cached_code, + ResourceLoader* resource_loader) { + if (status_ != kReceivedResponse || cached_code_response_time_.is_null() || + resource_response_time_.is_null()) { + return; + } + + if (resource_response_time_ != cached_code_response_time_) { + Platform::Current()->ClearCodeCacheEntry(gurl_); + return; + } + + if (cached_code.size() != 0) { + resource_loader->SendCachedCodeToResource( + reinterpret_cast<const char*>(cached_code.data()), cached_code.size()); + } +} + ResourceLoader* ResourceLoader::Create(ResourceFetcher* fetcher, ResourceLoadScheduler* scheduler, Resource* resource, @@ -114,6 +294,23 @@ ResourceLoadSchedulerClient::Trace(visitor); } +bool ResourceLoader::ShouldFetchCodeCache() { + if (!RuntimeEnabledFeatures::IsolatedCodeCacheEnabled()) + return false; + + const ResourceRequest& request = resource_->GetResourceRequest(); + if (!request.Url().ProtocolIsInHTTPFamily()) + return false; + if (request.GetRequestContext() == + WebURLRequest::kRequestContextServiceWorker) + return false; + if (request.DownloadToBlob()) + return false; + if (resource_->GetType() != Resource::Type::kScript) + return false; + return true; +} + void ResourceLoader::Start() { const ResourceRequest& request = resource_->GetResourceRequest(); ActivateCacheAwareLoadingIfNeeded(request); @@ -165,7 +362,13 @@ is_downloading_to_blob_ = request.DownloadToBlob(); - loader_->SetDefersLoading(Context().DefersLoading()); + SetDefersLoading(Context().DefersLoading()); + + if (ShouldFetchCodeCache()) { + code_cache_request_ = std::make_unique<CodeCacheRequest>( + Context().CreateCodeCacheLoader(), request.Url(), + Context().DefersLoading()); + } if (is_cache_aware_loading_activated_) { // Override cache policy for cache-aware loading. If this request fails, a @@ -175,13 +378,23 @@ mojom::FetchCacheMode::kUnspecifiedOnlyIfCachedStrict); loader_->LoadAsynchronously(WrappedResourceRequest(cache_aware_request), this); + if (code_cache_request_) { + // Sets defers loading and initiates a fetch from code cache. + code_cache_request_->FetchFromCodeCache(loader_.get(), this); + } return; } - if (resource_->Options().synchronous_policy == kRequestSynchronously) + if (resource_->Options().synchronous_policy == kRequestSynchronously) { RequestSynchronously(request); - else + } else { loader_->LoadAsynchronously(WrappedResourceRequest(request), this); + + if (code_cache_request_) { + // Sets defers loading and initiates a fetch from code cache. + code_cache_request_->FetchFromCodeCache(loader_.get(), this); + } + } } void ResourceLoader::Release( @@ -195,13 +408,16 @@ void ResourceLoader::Restart(const ResourceRequest& request) { CHECK_EQ(resource_->Options().synchronous_policy, kRequestAsynchronously); - loader_ = Context().CreateURLLoader(request, resource_->Options()); StartWith(request); } void ResourceLoader::SetDefersLoading(bool defers) { DCHECK(loader_); + // If CodeCacheRequest handles this, then no need to handle here. + if (code_cache_request_ && code_cache_request_->SetDefersLoading(defers)) + return; + loader_->SetDefersLoading(defers); if (defers) { resource_->VirtualTimePauser().UnpauseVirtualTime(); @@ -459,6 +675,15 @@ } void ResourceLoader::DidReceiveCachedMetadata(const char* data, int length) { + // TODO(mythria): HttpCache still sends the metadata when available. Just + // ignore it here. We have to modify HttpCache to not fetch metadata when + // this feature is enabled. + if (!RuntimeEnabledFeatures::IsolatedCodeCacheEnabled()) { + resource_->SetSerializedCachedMetadata(data, length); + } +} + +void ResourceLoader::SendCachedCodeToResource(const char* data, int length) { resource_->SetSerializedCachedMetadata(data, length); } @@ -594,6 +819,13 @@ FetchContext::ResourceResponseType::kNotFromMemoryCache); resource_->ResponseReceived(response_to_pass, std::move(handle)); + + // Send the cached code after we notify that the response is received. + // Resource expects that we receive the response first before the + // corresponding cached code. + if (code_cache_request_) + code_cache_request_->DidReceiveResponse(response.ResponseTime(), this); + if (!resource_->Loader()) return; @@ -671,6 +903,7 @@ ResourceLoadScheduler::TrafficReportHints(encoded_data_length, decoded_body_length)); loader_.reset(); + code_cache_request_.reset(); network_instrumentation::EndResourceLoad( resource_->Identifier(), @@ -711,6 +944,7 @@ Release(ResourceLoadScheduler::ReleaseOption::kReleaseAndSchedule, ResourceLoadScheduler::TrafficReportHints::InvalidInstance()); loader_.reset(); + code_cache_request_.reset(); network_instrumentation::EndResourceLoad( resource_->Identifier(), network_instrumentation::RequestOutcome::kFail); @@ -749,6 +983,10 @@ return; DCHECK_GE(response_out.ToResourceResponse().EncodedBodyLength(), 0); + if (code_cache_request_) { + code_cache_request_->FetchFromCodeCacheSynchronously(this); + } + // Follow the async case convention of not calling DidReceiveData or // appending data to m_resource if the response body is empty. Copying the // empty buffer is a noop in most cases, but is destructive in the case of @@ -774,6 +1012,7 @@ void ResourceLoader::Dispose() { loader_ = nullptr; progress_binding_.Close(); + code_cache_request_.reset(); // Release() should be called to release |scheduler_client_id_| beforehand in // DidFinishLoading() or DidFail(), but when a timer to call Cancel() is
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h index a0e7685..7d24b29 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -130,6 +130,8 @@ int64_t encoded_body_length, int64_t decoded_body_length) override; + void SendCachedCodeToResource(const char* data, int size); + void HandleError(const ResourceError&); void DidFinishLoadingFirstPartInMultipart(); @@ -141,6 +143,7 @@ private: friend class SubresourceIntegrityTest; + class CodeCacheRequest; // Assumes ResourceFetcher and Resource are non-null. ResourceLoader(ResourceFetcher*, @@ -148,6 +151,7 @@ Resource*, uint32_t inflight_keepalive_bytes); + bool ShouldFetchCodeCache(); void StartWith(const ResourceRequest&); void Release(ResourceLoadScheduler::ReleaseOption, @@ -184,6 +188,9 @@ Member<ResourceFetcher> fetcher_; Member<ResourceLoadScheduler> scheduler_; Member<Resource> resource_; + // code_cache_request_ is created only if required. It is required to check + // if it is valid before using it. + std::unique_ptr<CodeCacheRequest> code_cache_request_; // https://fetch.spec.whatwg.org/#concept-request-response-tainting network::mojom::FetchResponseType response_tainting_ =
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index d04d7d7..270f915 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -386,6 +386,10 @@ name: "EditingNG", }, { + name: "EncodingStreams", + status: "experimental", + }, + { name: "EncryptedMediaEncryptionSchemeQuery", status: "test", }, @@ -1371,11 +1375,11 @@ }, { name: "WorkerNosniffBlock", - status: "test", + status: "stable", }, { name: "WorkerNosniffWarn", - status: "test", + status: "stable", implied_by: ["WorkerNosniffBlock"], }, {
diff --git a/third_party/blink/renderer/platform/scheduler/DEPS b/third_party/blink/renderer/platform/scheduler/DEPS index 928da1b..cee8cd07 100644 --- a/third_party/blink/renderer/platform/scheduler/DEPS +++ b/third_party/blink/renderer/platform/scheduler/DEPS
@@ -47,7 +47,7 @@ "+components/scheduling_metrics", "+services/metrics", - "+third_party/blink/renderer/platform/bindings/parkable_string.h", + "+third_party/blink/renderer/platform/bindings/parkable_string_manager.h", "+third_party/blink/renderer/platform/cross_thread_functional.h", "+third_party/blink/renderer/platform/histogram.h", "+third_party/blink/renderer/platform/instrumentation",
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 4faa62d..0a67fa1 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
@@ -27,7 +27,7 @@ #include "third_party/blink/public/platform/scheduler/renderer_process_type.h" #include "third_party/blink/public/platform/web_mouse_wheel_event.h" #include "third_party/blink/public/platform/web_touch_event.h" -#include "third_party/blink/renderer/platform/bindings/parkable_string.h" +#include "third_party/blink/renderer/platform/bindings/parkable_string_manager.h" #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/blink_resource_coordinator_base.h" #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/renderer_resource_coordinator.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -1008,15 +1008,7 @@ main_thread_only().metrics_helper.OnRendererForegrounded(now); } - auto& parkable_string_table = ParkableStringTable::Instance(); - parkable_string_table.SetRendererBackgrounded(backgrounded); - if (backgrounded) { - DefaultTaskRunner()->PostDelayedTask( - FROM_HERE, base::BindOnce([]() { - ParkableStringTable::Instance().MaybeParkAll(); - }), - base::TimeDelta::FromSeconds(10)); - } + ParkableStringManager::Instance().SetRendererBackgrounded(backgrounded); } void MainThreadSchedulerImpl::SetSchedulerKeepActive(bool keep_active) {
diff --git a/third_party/blink/renderer/platform/testing/layer_tree_host_embedder.cc b/third_party/blink/renderer/platform/testing/layer_tree_host_embedder.cc index fdfcef59..792fa4c4 100644 --- a/third_party/blink/renderer/platform/testing/layer_tree_host_embedder.cc +++ b/third_party/blink/renderer/platform/testing/layer_tree_host_embedder.cc
@@ -33,7 +33,7 @@ layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( single_thread_client ? single_thread_client : &layer_tree_host_single_thread_client_, - ¶ms); + std::move(params)); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/threading_primitives.h b/third_party/blink/renderer/platform/wtf/threading_primitives.h index 7f1bbcc..2d6f306 100644 --- a/third_party/blink/renderer/platform/wtf/threading_primitives.h +++ b/third_party/blink/renderer/platform/wtf/threading_primitives.h
@@ -71,14 +71,11 @@ void lock(); void unlock(); + void AssertAcquired() const { #if DCHECK_IS_ON() - // Deprecated in favour of AssertAcquired. - bool Locked() const { return mutex_.recursion_count_ > 0; } - - void AssertAcquired() const { DCHECK(Locked()); } -#else - void AssertAcquired() const {} + DCHECK(mutex_.recursion_count_); #endif + } public: PlatformMutex& Impl() { return mutex_; } @@ -153,20 +150,16 @@ USING_FAST_MALLOC(ThreadCondition); // Only HeapTest.cpp requires. public: - ThreadCondition(); + explicit ThreadCondition(Mutex&); ~ThreadCondition(); - void Wait(Mutex&); - // Returns true if the condition was signaled before absoluteTime, false if - // the absoluteTime was reached or is in the past. - // The absoluteTime is in seconds, starting on January 1, 1970. The time is - // assumed to use the same time zone as WTF::currentTime(). - bool TimedWait(Mutex&, double absolute_time); + void Wait(); void Signal(); void Broadcast(); private: PlatformCondition condition_; + PlatformMutex& mutex_; DISALLOW_COPY_AND_ASSIGN(ThreadCondition); };
diff --git a/third_party/blink/renderer/platform/wtf/threading_primitives_test.cc b/third_party/blink/renderer/platform/wtf/threading_primitives_test.cc index fee226d..e9931aeb 100644 --- a/third_party/blink/renderer/platform/wtf/threading_primitives_test.cc +++ b/third_party/blink/renderer/platform/wtf/threading_primitives_test.cc
@@ -25,18 +25,13 @@ class ThreadConditionTest : public testing::Test { public: + ThreadConditionTest() : condition_(mutex_) {} + void RunOtherThreadInfiniteWait() { base::internal::SetBlockingObserverForCurrentThread(&observer_); MutexLocker lock(mutex_); ready_.Signal(); - condition_.Wait(mutex_); - } - - void RunOtherThreadTimedWait() { - base::internal::SetBlockingObserverForCurrentThread(&observer_); - MutexLocker lock(mutex_); - ready_.Signal(); - condition_.TimedWait(mutex_, CurrentTime() + 10.0); + condition_.Wait(); } protected: @@ -62,20 +57,5 @@ condition_.Signal(); } -TEST_F(ThreadConditionTest, TimedWaitReportsBlockingCall) { - EXPECT_CALL(observer_, BlockingStarted(base::BlockingType::MAY_BLOCK)); - EXPECT_CALL(observer_, BlockingEnded()); - - base::Thread other_thread("other thread"); - other_thread.StartAndWaitForTesting(); - other_thread.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ThreadConditionTest::RunOtherThreadTimedWait, - base::Unretained(this))); - - ready_.Wait(); - MutexLocker lock(mutex_); - condition_.Signal(); -} - } // namespace } // namespace WTF
diff --git a/third_party/blink/renderer/platform/wtf/threading_pthreads.cc b/third_party/blink/renderer/platform/wtf/threading_pthreads.cc index a49db17..4e7db8d 100644 --- a/third_party/blink/renderer/platform/wtf/threading_pthreads.cc +++ b/third_party/blink/renderer/platform/wtf/threading_pthreads.cc
@@ -142,7 +142,7 @@ return false; } -ThreadCondition::ThreadCondition() { +ThreadCondition::ThreadCondition(Mutex& mutex) : mutex_(mutex.Impl()) { pthread_cond_init(&condition_, nullptr); } @@ -150,48 +150,18 @@ pthread_cond_destroy(&condition_); } -void ThreadCondition::Wait(Mutex& mutex) { +void ThreadCondition::Wait() { base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK); - PlatformMutex& platform_mutex = mutex.Impl(); #if DCHECK_IS_ON() - --platform_mutex.recursion_count_; + --mutex_.recursion_count_; #endif - int result = pthread_cond_wait(&condition_, &platform_mutex.internal_mutex_); + int result = pthread_cond_wait(&condition_, &mutex_.internal_mutex_); DCHECK_EQ(result, 0); #if DCHECK_IS_ON() - ++platform_mutex.recursion_count_; + ++mutex_.recursion_count_; #endif } -bool ThreadCondition::TimedWait(Mutex& mutex, double absolute_time) { - if (absolute_time < CurrentTime()) - return false; - - if (absolute_time > INT_MAX) { - Wait(mutex); - return true; - } - - int time_seconds = static_cast<int>(absolute_time); - int time_nanoseconds = static_cast<int>((absolute_time - time_seconds) * 1E9); - - timespec target_time; - target_time.tv_sec = time_seconds; - target_time.tv_nsec = time_nanoseconds; - - base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK); - PlatformMutex& platform_mutex = mutex.Impl(); -#if DCHECK_IS_ON() - --platform_mutex.recursion_count_; -#endif - int result = pthread_cond_timedwait( - &condition_, &platform_mutex.internal_mutex_, &target_time); -#if DCHECK_IS_ON() - ++platform_mutex.recursion_count_; -#endif - return result == 0; -} - void ThreadCondition::Signal() { int result = pthread_cond_signal(&condition_); DCHECK_EQ(result, 0);
diff --git a/third_party/blink/renderer/platform/wtf/threading_win.cc b/third_party/blink/renderer/platform/wtf/threading_win.cc index 7d99436..4898e9a 100644 --- a/third_party/blink/renderer/platform/wtf/threading_win.cc +++ b/third_party/blink/renderer/platform/wtf/threading_win.cc
@@ -175,47 +175,19 @@ return true; } -ThreadCondition::ThreadCondition() { +ThreadCondition::ThreadCondition(Mutex& mutex) : mutex_(mutex.Impl()) { InitializeConditionVariable(&condition_); } ThreadCondition::~ThreadCondition() {} -void ThreadCondition::Wait(Mutex& mutex) { - PlatformMutex& platform_mutex = mutex.Impl(); +void ThreadCondition::Wait() { base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK); - --platform_mutex.recursion_count_; - BOOL result = SleepConditionVariableCS( - &condition_, &platform_mutex.internal_mutex_, INFINITE); + --mutex_.recursion_count_; + BOOL result = + SleepConditionVariableCS(&condition_, &mutex_.internal_mutex_, INFINITE); DCHECK_NE(result, 0); - ++platform_mutex.recursion_count_; -} - -bool ThreadCondition::TimedWait(Mutex& mutex, double absolute_time) { - double current_time = WTF::CurrentTime(); - - // Time is in the past - return immediately. - if (absolute_time <= current_time) { - // Consider the wait to have timed out, even if our condition has already - // been signaled, to match the pthreads implementation. - return false; - } - - // If time is too far in the future (and would overflow unsigned long), wait - // forever. - DWORD interval = - (absolute_time - current_time > static_cast<double>(INT_MAX) / 1000.0) - ? INFINITE - : ((absolute_time - current_time) * 1000.0); - - base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK); - PlatformMutex& platform_mutex = mutex.Impl(); - --platform_mutex.recursion_count_; - BOOL result = SleepConditionVariableCS( - &condition_, &platform_mutex.internal_mutex_, interval); - ++platform_mutex.recursion_count_; - - return result != 0; + ++mutex_.recursion_count_; } void ThreadCondition::Signal() {
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js index dfc6b4c..db219feb 100644 --- a/third_party/closure_compiler/externs/file_manager_private.js +++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -943,6 +943,15 @@ chrome.fileManagerPrivate.mountCrostiniContainer = function(callback) {}; /** + * Shares directory with crostini container. + * @param {!DirectoryEntry} entry Entry of the directory to share. + * @param {function()} callback Callback called after the folder is shared. + * chrome.runtime.lastError will be set if there was an error. + */ +chrome.fileManagerPrivate.sharePathWithCrostiniContainer = function( + entry, callback) {}; + +/** * Begin installation of a Linux package. * @param {!Entry} entry * @param {function(!chrome.fileManagerPrivate.InstallLinuxPackageResponse,
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index d2695d6..b916d29 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -37,3 +37,4 @@ Local Modifications: - codereview.settings has been excluded. - thread_log_messages.cc (using ThreadLocalStorage::Slot instead of StaticSlot) + - Add an additional rpath for crashpad_handler on Mac in component builds.
diff --git a/third_party/crashpad/crashpad/handler/BUILD.gn b/third_party/crashpad/crashpad/handler/BUILD.gn index e43619c4..9accbfe5 100644 --- a/third_party/crashpad/crashpad/handler/BUILD.gn +++ b/third_party/crashpad/crashpad/handler/BUILD.gn
@@ -147,6 +147,11 @@ # so set the rpath for that too. "-rpath", "@loader_path/../../../../../../..", + + # The handler can also be executed in an unbundled framework at + # Chromium Framework.framework/Versions/V/Helpers/ + "-rpath", + "@loader_path/../../../..", ] } }
diff --git a/third_party/feed/README.chromium b/third_party/feed/README.chromium index d6140ef..e108d94 100644 --- a/third_party/feed/README.chromium +++ b/third_party/feed/README.chromium
@@ -2,7 +2,7 @@ Short name: feed URL: https://chromium.googlesource.com/feed Version: 0 -Revision: 831b51c0ac199fea3278ceb9de361c22486da935 +Revision: b7306ddecfd12d00fad796c0db3425706850b973 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/feed/java_sources.gni b/third_party/feed/java_sources.gni index 9fd7083..905fe53 100644 --- a/third_party/feed/java_sources.gni +++ b/third_party/feed/java_sources.gni
@@ -29,6 +29,7 @@ "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/ModelProviderFactory.java", "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/ModelProviderObserver.java", "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/ModelToken.java", + "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/RemoveTracking.java", "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/TokenCompleted.java", "src/src/main/java/com/google/android/libraries/feed/api/modelprovider/TokenCompletedObserver.java", "src/src/main/java/com/google/android/libraries/feed/api/protocoladapter/ProtocolAdapter.java", @@ -53,7 +54,6 @@ "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemAnimator.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemTouchCallbacks.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamRecyclerViewAdapter.java", - "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamScrollMonitor.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/actions/StreamActionApiImpl.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/CardDriver.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ClusterDriver.java", @@ -71,6 +71,7 @@ "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/VisibilityListener.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/VisibilityMonitor.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/ScrollRestorer.java", + "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/scroll/StreamScrollMonitor.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/ContinuationViewHolder.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/FeedViewHolder.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/HeaderViewHolder.java", @@ -82,7 +83,6 @@ "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/ZeroStateViewHolder.java", "src/src/main/java/com/google/android/libraries/feed/common/Result.java", "src/src/main/java/com/google/android/libraries/feed/common/Validators.java", - "src/src/main/java/com/google/android/libraries/feed/common/concurrent/AbstractRunner.java", "src/src/main/java/com/google/android/libraries/feed/common/concurrent/DirectHostSupported.java", "src/src/main/java/com/google/android/libraries/feed/common/concurrent/MainThreadCaller.java", "src/src/main/java/com/google/android/libraries/feed/common/concurrent/MainThreadRunner.java", @@ -110,6 +110,7 @@ "src/src/main/java/com/google/android/libraries/feed/feedactionreader/FeedActionReader.java", "src/src/main/java/com/google/android/libraries/feed/feedapplifecyclelistener/FeedAppLifecycleListener.java", "src/src/main/java/com/google/android/libraries/feed/feedapplifecyclelistener/FeedLifecycleListener.java", + "src/src/main/java/com/google/android/libraries/feed/feedknowncontent/FeedKnownContentApi.java", "src/src/main/java/com/google/android/libraries/feed/feedmodelprovider/FeedModelProvider.java", "src/src/main/java/com/google/android/libraries/feed/feedmodelprovider/FeedModelProviderFactory.java", "src/src/main/java/com/google/android/libraries/feed/feedmodelprovider/internal/CursorProvider.java", @@ -128,6 +129,7 @@ "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/FeedSessionManager.java", "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/FeedSessionManagerFactory.java", "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/internal/ContentCache.java", + "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/internal/HeadAsStructure.java", "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/internal/HeadSessionImpl.java", "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/internal/InitializableSession.java", "src/src/main/java/com/google/android/libraries/feed/feedsessionmanager/internal/MutationCommitterFactory.java", @@ -221,6 +223,7 @@ "src/src/main/java/com/google/android/libraries/feed/piet/host/AssetProvider.java", "src/src/main/java/com/google/android/libraries/feed/piet/host/CustomElementProvider.java", "src/src/main/java/com/google/android/libraries/feed/piet/host/HostBindingProvider.java", + "src/src/main/java/com/google/android/libraries/feed/piet/ui/DrawableScalingHelper.java", "src/src/main/java/com/google/android/libraries/feed/piet/ui/RoundedCornerColorDrawable.java", "src/src/main/java/com/google/android/libraries/feed/piet/ui/RoundedCornerImageView.java", "src/src/main/java/com/google/android/libraries/feed/piet/ui/RoundedCornerViewHelper.java",
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 1c01c73..1e2468e7 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-9-1-204 -Revision: 2c8e6279a7bfc314f3934bc8d126ecb1e5e284f1 +Version: VER-2-9-1-232 +Revision: 9789c75b1a6faf01cbcc34d85bf1bb3f473743b1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/include/freetype-custom-config/ftconfig.h b/third_party/freetype/include/freetype-custom-config/ftconfig.h index d2d9317..1fbaaff 100644 --- a/third_party/freetype/include/freetype-custom-config/ftconfig.h +++ b/third_party/freetype/include/freetype-custom-config/ftconfig.h
@@ -26,11 +26,11 @@ * Note however that if some specific modifications are needed, we advise * you to place a modified copy in your build directory. * - * The build directory is usually 'builds/<system>', and contains + * The build directory is usually `builds/<system>`, and contains * system-specific files that are always included first when building the * library. * - * This ANSI version should stay in 'include/config/'. + * This ANSI version should stay in `include/config/`. * */ @@ -52,25 +52,25 @@ * These macros can be toggled to suit a specific system. The current ones * are defaults used to compile FreeType in an ANSI C environment (16bit * compilers are also supported). Copy this file to your own - * 'builds/<system>' directory, and edit it to port the engine. + * `builds/<system>` directory, and edit it to port the engine. * */ - /* There are systems (like the Texas Instruments 'C54x) where a `char' */ - /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ - /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ - /* `char' type. */ + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ #ifndef FT_CHAR_BIT #define FT_CHAR_BIT CHAR_BIT #endif - /* The size of an `int' type. */ + /* The size of an `int` type. */ #if FT_UINT_MAX == 0xFFFFUL #define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) #elif FT_UINT_MAX == 0xFFFFFFFFUL @@ -81,7 +81,7 @@ #error "Unsupported size of `int' type!" #endif - /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ /* DM642) is recognized but avoided. */ #if FT_ULONG_MAX == 0xFFFFFFFFUL #define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) @@ -94,8 +94,8 @@ #endif - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ + /* `FT_UNUSED` indicates that a given parameter is not used -- */ + /* this is only used to get rid of unpleasant compiler warnings. */ #ifndef FT_UNUSED #define FT_UNUSED( arg ) ( (arg) = (arg) ) #endif @@ -120,9 +120,9 @@ /* providing a new configuration file. */ /* */ #if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ - /* AvailabilityMacros.h is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion */ + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ #include <errno.h> #ifdef ECANCELED /* defined since 10.2 */ #include "AvailabilityMacros.h" @@ -142,7 +142,7 @@ #endif - /* Fix compiler warning with sgi compiler */ + /* Fix compiler warning with sgi compiler. */ #if defined( __sgi ) && !defined( __GNUC__ ) #if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) #pragma set woff 3505 @@ -250,7 +250,7 @@ #endif - /* look up an integer type that is at least 32 bits */ + /* look up an integer type that is at least 32~bits */ #if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) typedef int FT_Fast; @@ -268,7 +268,7 @@ /* Autoconf */ #if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) - /* FT_LONG64 must be defined if a 64-bit type is available */ + /* `FT_LONG64` must be defined if a 64-bit type is available */ #define FT_LONG64 #define FT_INT64 long #define FT_UINT64 unsigned long @@ -277,8 +277,8 @@ * * A 64-bit data type may create compilation problems if you compile in * strict ANSI mode. To avoid them, we disable other 64-bit data types if - * __STDC__ is defined. You can however ignore this rule by defining the - * FT_CONFIG_OPTION_FORCE_INT64 configuration macro. + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. */ #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) @@ -288,19 +288,19 @@ #define FT_INT64 long long int #define FT_UINT64 unsigned long long int -#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - /* this compiler provides the __int64 type */ + /* this compiler provides the `__int64` type */ #define FT_LONG64 #define FT_INT64 __int64 #define FT_UINT64 unsigned __int64 #elif defined( __BORLANDC__ ) /* Borland C++ */ - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ - /* this compiler provides the __int64 type */ + /* this compiler provides the `__int64` type */ #define FT_LONG64 #define FT_INT64 __int64 #define FT_UINT64 unsigned __int64 @@ -317,7 +317,7 @@ #elif defined( __GNUC__ ) - /* GCC provides the `long long' type */ + /* GCC provides the `long long` type */ #define FT_LONG64 #define FT_INT64 long long int #define FT_UINT64 unsigned long long int @@ -353,7 +353,7 @@ #define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - /* typeof condition taken from gnulib's `intprops.h' header file */ + /* `typeof` condition taken from gnulib's `intprops.h` header file */ #if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ defined( __IBM__TYPEOF__ ) ) || \ @@ -364,14 +364,14 @@ #endif - /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */ - /* a function that gets used only within the scope of a module. */ - /* Normally, both the header and source code files for such a */ - /* function are within a single module directory. */ - /* */ - /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and */ - /* FT_LOCAL_ARRAY_DEF. */ - /* */ + /* Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, */ + /* respectively, a function that gets used only within the scope of a */ + /* module. Normally, both the header and source code files for such a */ + /* function are within a single module directory. */ + /* */ + /* Intra-module arrays should be tagged with `FT_LOCAL_ARRAY` and */ + /* `FT_LOCAL_ARRAY_DEF`. */ + /* */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT #define FT_LOCAL( x ) static x @@ -393,12 +393,12 @@ #define FT_LOCAL_ARRAY_DEF( x ) const x - /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */ - /* functions that are used in more than a single module. In the */ - /* current setup this implies that the declaration is in a header */ - /* file in the `include/freetype/internal' directory, and the */ - /* function body is in a file in `src/base'. */ - /* */ + /* Use `FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, */ + /* functions that are used in more than a single module. In the */ + /* current setup this implies that the declaration is in a header file */ + /* in the `include/freetype/internal` directory, and the function body */ + /* is in a file in `src/base`. */ + /* */ #ifndef FT_BASE #ifdef __cplusplus @@ -421,37 +421,40 @@ #endif /* !FT_BASE_DEF */ - /* When compiling FreeType as a DLL or DSO with hidden visibility */ - /* some systems/compilers need a special attribute in front OR after */ - /* the return type of function declarations. */ - /* */ - /* Two macros are used within the FreeType source code to define */ - /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ - /* */ - /* FT_EXPORT( return_type ) */ - /* */ - /* is used in a function declaration, as in */ - /* */ - /* FT_EXPORT( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ); */ - /* */ - /* */ - /* FT_EXPORT_DEF( return_type ) */ - /* */ - /* is used in a function definition, as in */ - /* */ - /* FT_EXPORT_DEF( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ) */ - /* { */ - /* ... some code ... */ - /* return FT_Err_Ok; */ - /* } */ - /* */ - /* You can provide your own implementation of FT_EXPORT and */ - /* FT_EXPORT_DEF here if you want. */ - /* */ - /* To export a variable, use FT_EXPORT_VAR. */ - /* */ + /* When compiling FreeType as a DLL or DSO with hidden visibility */ + /* some systems/compilers need a special attribute in front OR after */ + /* the return type of function declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ + /* */ + /* - `FT_EXPORT( return_type )` */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* ``` */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* ``` */ + /* */ + /* - `FT_EXPORT_DEF( return_type )` */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* ``` */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* ``` */ + /* */ + /* You can provide your own implementation of `FT_EXPORT` and */ + /* `FT_EXPORT_DEF` here if you want. */ + /* */ + /* To export a variable, use `FT_EXPORT_VAR`. */ + /* */ #if defined(_WIN32) #if defined(FT2_BUILD_DLL) @@ -532,7 +535,7 @@ /* C++ compiler and with 16bit compilers. */ /* */ - /* This is special. Within C++, you must specify `extern "C"' for */ + /* This is special. Within C++, you must specify `extern "C"` for */ /* functions which are used via function pointers, and you also */ /* must do that for structures which contain function pointers to */ /* assure C linkage -- it's not possible to have (local) anonymous */ @@ -555,7 +558,7 @@ /* */ /* */ /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* the infamous `_cdecl` or `__fastcall` declarations. */ /* */ #ifndef FT_CALLBACK_DEF #ifdef __cplusplus
diff --git a/third_party/freetype/include/freetype-custom-config/ftoption.h b/third_party/freetype/include/freetype-custom-config/ftoption.h index 5f0fb3e..026e8be6 100644 --- a/third_party/freetype/include/freetype-custom-config/ftoption.h +++ b/third_party/freetype/include/freetype-custom-config/ftoption.h
@@ -38,16 +38,16 @@ * from a single source directory. * * - You can put a copy of this file in your build directory, more - * precisely in '$BUILD/freetype/config/ftoption.h', where '$BUILD' is + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is * the name of a directory that is included _before_ the FreeType include * path during compilation. * * The default FreeType Makefiles and Jamfiles use the build directory - * 'builds/<system>' by default, but you can easily change that for your + * `builds/<system>` by default, but you can easily change that for your * own projects. * - * - Copy the file <ft2build.h> to '$BUILD/ft2build.h' and modify it - * slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to locate + * - Copy the file <ft2build.h> to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate * this file during the build. For example, * * ``` @@ -55,13 +55,13 @@ * #include <freetype/config/ftheader.h> * ``` * - * will use '$BUILD/myftoptions.h' instead of this file for macro + * will use `$BUILD/myftoptions.h` instead of this file for macro * definitions. * * Note also that you can similarly pre-define the macro - * FT_CONFIG_MODULES_H used to locate the file listing of the modules + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules * that are statically linked to the library at compile time. By - * default, this file is <freetype/config/ftmodule.h>. + * default, this file is `<freetype/config/ftmodule.h>`. * * We highly recommend using the third method whenever possible. * @@ -80,18 +80,18 @@ /*#************************************************************************ * * If you enable this configuration option, FreeType recognizes an - * environment variable called `FREETYPE_PROPERTIES', which can be used to + * environment variable called `FREETYPE_PROPERTIES`, which can be used to * control the various font drivers and modules. The controllable * properties are listed in the section @properties. * * You have to undefine this configuration option on platforms that lack - * the concept of environment variables (and thus don't have the `getenv' + * the concept of environment variables (and thus don't have the `getenv` * function), for example Windows CE. * - * `FREETYPE_PROPERTIES' has the following syntax form (broken here into + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into * multiple lines for better readability). * - * { + * ``` * <optional whitespace> * <module-name1> ':' * <property-name1> '=' <property-value1> @@ -99,15 +99,15 @@ * <module-name2> ':' * <property-name2> '=' <property-value2> * ... - * } + * ``` * * Example: * - * { + * ``` * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ * cff:no-stem-darkening=1 \ * autofitter:warping=1 - * } + * ``` * */ #define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES @@ -136,14 +136,14 @@ * problems when compiling the library in strict ANSI mode. * * For this reason, the use of 64-bit integers is normally disabled when - * the __STDC__ macro is defined. You can however disable this by defining - * the macro FT_CONFIG_OPTION_FORCE_INT64 here. + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. * * For most compilers, this will only create compilation warnings when * building the library. * * ObNote: The compiler-specific 64-bit integers are detected in the - * file `ftconfig.h` either statically or through the 'configure' + * file `ftconfig.h` either statically or through the `configure` * script on supported platforms. */ #undef FT_CONFIG_OPTION_FORCE_INT64 @@ -152,7 +152,7 @@ /************************************************************************** * * If this macro is defined, do not try to use an assembler version of - * performance-critical functions (e.g. FT_MulFix). You should only do + * performance-critical functions (e.g., @FT_MulFix). You should only do * that to verify that the assembler function works properly, or to execute * benchmark tests of the various implementations. */ @@ -162,7 +162,7 @@ /************************************************************************** * * If this macro is defined, try to use an inlined assembler version of the - * `FT_MulFix` function, which is a 'hotspot' when loading and hinting + * @FT_MulFix function, which is a 'hotspot' when loading and hinting * glyphs, and which should be executed as fast as possible. * * Note that if your compiler or CPU is not supported, this will default to @@ -176,10 +176,10 @@ * LZW-compressed file support. * * FreeType now handles font files that have been compressed with the - * 'compress' program. This is mostly used to parse many of the PCF + * `compress` program. This is mostly used to parse many of the PCF * files that come with various X11 distributions. The implementation - * uses NetBSD's 'zopen' to partially uncompress the file on the fly (see - * src/lzw/ftgzip.c). + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). * * Define this macro if you want to enable this 'feature'. */ @@ -191,12 +191,12 @@ * Gzip-compressed file support. * * FreeType now handles font files that have been compressed with the - * 'gzip' program. This is mostly used to parse many of the PCF files + * `gzip` program. This is mostly used to parse many of the PCF files * that come with XFree86. The implementation uses 'zlib' to partially - * uncompress the file on the fly (see src/gzip/ftgzip.c). + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). * * Define this macro if you want to enable this 'feature'. See also the - * macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. */ #define FT_CONFIG_OPTION_USE_ZLIB @@ -205,10 +205,10 @@ * * ZLib library selection * - * This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. It - * allows FreeType's 'ftgzip' component to link to the system's - * installation of the ZLib library. This is useful on systems like Unix - * or VMS where it generally is already available. + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. * * If you let it undefined, the component will use its own copy of the * zlib sources instead. These have been modified to be included @@ -216,11 +216,11 @@ * names. This allows you to link any program with FreeType _and_ ZLib * without linking conflicts. * - * Do not #undef this macro here since the build system might define it - * for certain configurations only. + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. * - * If you use a build system like cmake or the 'configure' script, - * options set by those programs have precendence, overwriting the value + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value * here with the configured one. */ /* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ @@ -231,16 +231,16 @@ * Bzip2-compressed file support. * * FreeType now handles font files that have been compressed with the - * 'bzip2' program. This is mostly used to parse many of the PCF files - * that come with XFree86. The implementation uses 'libbz2' to partially - * uncompress the file on the fly (see src/bzip2/ftbzip2.c). Contrary to - * gzip, bzip2 currently is not included and need to use the system + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system * available bzip2 implementation. * * Define this macro if you want to enable this 'feature'. * - * If you use a build system like cmake or the 'configure' script, - * options set by those programs have precendence, overwriting the value + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value * here with the configured one. */ /* #define FT_CONFIG_OPTION_USE_BZIP2 */ @@ -248,8 +248,8 @@ /************************************************************************** * - * Define to disable the use of file stream functions and types, FILE, - * fopen() etc. Enables the use of smaller system libraries on embedded + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded * systems that have multiple system libraries, some with or without file * stream support, in the cases where file stream support is not necessary * such as memory loading of font files. @@ -268,8 +268,8 @@ * * Define this macro if you want to enable this 'feature'. * - * If you use a build system like cmake or the 'configure' script, - * options set by those programs have precendence, overwriting the value + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value * here with the configured one. */ #define FT_CONFIG_OPTION_USE_PNG @@ -285,8 +285,8 @@ * * Define this macro if you want to enable this 'feature'. * - * If you use a build system like cmake or the 'configure' script, - * options set by those programs have precendence, overwriting the value + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value * here with the configured one. */ #if !defined(WITHOUT_HARFBUZZ) @@ -301,20 +301,20 @@ * By default, FreeType 2 is compiled with the 'psnames' module. This * module is in charge of converting a glyph name string into a Unicode * value, or return a Macintosh standard glyph name for the use with the - * TrueType 'post' table. + * TrueType `post` table. * * Undefine this macro if you do not want 'psnames' compiled in your * build of FreeType. This has the following effects: * - * - The TrueType driver will provide its own set of glyph names, - * if you build it to support postscript names in the TrueType 'post' - * table, but will not synthesize a missing Unicode charmap. + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType `post` table, + * but will not synthesize a missing Unicode charmap. * - * - The Type 1 driver will not be able to synthesize a Unicode - * charmap out of the glyphs found in the fonts. + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. * * You would normally undefine this configuration macro when building a - * version of FreeType that doesn't contain a Type 1 or CFF driver. + * version of FreeType that doesn't contain a Type~1 or CFF driver. */ #define FT_CONFIG_OPTION_POSTSCRIPT_NAMES @@ -323,14 +323,14 @@ * * Postscript Names to Unicode Values support * - * By default, FreeType 2 is built with the 'PSNames' module compiled in. + * By default, FreeType~2 is built with the 'psnames' module compiled in. * Among other things, the module is used to convert a glyph name into a * Unicode value. This is especially useful in order to synthesize on - * the fly a Unicode charmap from the CFF/Type 1 driver through a big + * the fly a Unicode charmap from the CFF/Type~1 driver through a big * table named the 'Adobe Glyph List' (AGL). * * Undefine this macro if you do not want the Adobe Glyph List compiled - * in your 'PSNames' module. The Type 1 driver will not be able to + * in your 'psnames' module. The Type~1 driver will not be able to * synthesize a Unicode charmap out of the glyphs found in the fonts. */ #define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST @@ -344,7 +344,7 @@ * (mac dfont, mac resource, macbinary containing a mac resource) on * non-Mac platforms. * - * Note that the 'FOND' resource isn't checked. + * Note that the `FOND` resource isn't checked. */ /* #define FT_CONFIG_OPTION_MAC_FONTS */ @@ -363,7 +363,7 @@ * to guess whether such offsets or different file names must be used. * * Note that normal, direct access of resource forks is controlled via - * the FT_CONFIG_OPTION_MAC_FONTS option. + * the `FT_CONFIG_OPTION_MAC_FONTS` option. */ #ifdef FT_CONFIG_OPTION_MAC_FONTS #define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK @@ -372,9 +372,9 @@ /************************************************************************** * - * Allow the use of FT_Incremental_Interface to load typefaces that contain - * no glyph data, but supply it via a callback function. This is required - * by clients supporting document formats which supply font data + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data * incrementally as the document is parsed, such as the Ghostscript * interpreter for the PostScript language. */ @@ -394,7 +394,7 @@ * FT_MAX_MODULES * * The maximum number of modules that can be registered in a single - * FreeType library object. 32 is the default. + * FreeType library object. 32~is the default. */ #define FT_MAX_MODULES 32 @@ -407,12 +407,12 @@ * errors are reported through the 'ftdebug' component. In trace mode, * additional messages are sent to the standard output during execution. * - * Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. - * Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. * * Don't define any of these macros to compile in 'release' mode! * - * Do not #undef these macros here since the build system might define + * Do not `#undef` these macros here since the build system might define * them for certain configurations only. */ /* #define FT_DEBUG_LEVEL_ERROR */ @@ -423,7 +423,7 @@ * * Autofitter debugging * - * If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to * control the autofitter behaviour for debugging purposes with global * boolean variables (consequently, you should **never** enable this * while compiling in 'release' mode): @@ -435,7 +435,7 @@ * ``` * * Additionally, the following functions provide dumps of various - * internal autofit structures to stdout (using 'printf'): + * internal autofit structures to stdout (using `printf`): * * ``` * af_glyph_hints_dump_points @@ -451,10 +451,10 @@ * _af_debug_hints * ``` * - * Please have a look at the 'ftgrid' demo program to see how those + * Please have a look at the `ftgrid` demo program to see how those * variables and macros should be used. * - * Do not #undef these macros here since the build system might define + * Do not `#undef` these macros here since the build system might define * them for certain configurations only. */ /* #define FT_DEBUG_AUTOFIT */ @@ -467,12 +467,12 @@ * FreeType now comes with an integrated memory debugger that is capable * of detecting simple errors like memory leaks or double deletes. To * compile it within your build of the library, you should define - * FT_DEBUG_MEMORY here. + * `FT_DEBUG_MEMORY` here. * * Note that the memory debugger is only activated at runtime when when * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! * - * Do not #undef this macro here since the build system might define it + * Do not `#undef` this macro here since the build system might define it * for certain configurations only. */ /* #define FT_DEBUG_MEMORY */ @@ -487,41 +487,25 @@ * the lower byte is the real error code. * * Setting this macro makes sense for debugging purposes only, since it - * would break source compatibility of certain programs that use FreeType - * 2. + * would break source compatibility of certain programs that use + * FreeType~2. * - * More details can be found in the files ftmoderr.h and fterrors.h. + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. */ #undef FT_CONFIG_OPTION_USE_MODULE_ERRORS - /*************************************************************************/ - /* */ - /* Position Independent Code */ - /* */ - /* If this macro is set (which is _not_ the default), FreeType2 will */ - /* avoid creating constants that require address fixups. Instead the */ - /* constants will be moved into a struct and additional intialization */ - /* code will be used. */ - /* */ - /* Setting this macro is needed for systems that prohibit address */ - /* fixups, such as BREW. [Note that standard compilers like gcc or */ - /* clang handle PIC generation automatically; you don't have to set */ - /* FT_CONFIG_OPTION_PIC, which is only necessary for very special */ - /* compilers.] */ - /* */ - /* Note that FT_CONFIG_OPTION_PIC support is not available for all */ - /* modules (see `modules.cfg' for a complete list). For building with */ - /* FT_CONFIG_OPTION_PIC support, do the following. */ - /* */ - /* 0. Clone the repository. */ - /* 1. Define FT_CONFIG_OPTION_PIC. */ - /* 2. Remove all subdirectories in `src' that don't have */ - /* FT_CONFIG_OPTION_PIC support. */ - /* 3. Comment out the corresponding modules in `modules.cfg'. */ - /* 4. Compile. */ - /* */ -/* #define FT_CONFIG_OPTION_PIC */ + /************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +/* #define FT_CONFIG_OPTION_ERROR_STRINGS */ /*************************************************************************/ @@ -535,39 +519,40 @@ /************************************************************************** * - * Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support embedded - * bitmaps in all formats using the SFNT module (namely TrueType & - * OpenType). + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). */ #define TT_CONFIG_OPTION_EMBEDDED_BITMAPS /************************************************************************** * - * Define TT_CONFIG_OPTION_COLOR_LAYERS if you want to support coloured - * outlines (from the COLR/CPAL tables) in all formats using the SFNT - * module (namely TrueType & OpenType). + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support coloured + * outlines (from the `COLR`/`CPAL` tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). */ #define TT_CONFIG_OPTION_COLOR_LAYERS /************************************************************************** * - * Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to load - * and enumerate the glyph Postscript names in a TrueType or OpenType file. + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. * - * Note that when you do not compile the 'PSNames' module by undefining the - * above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the 'sfnt' module will contain - * additional code used to read the PS Names table from a font. + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. * - * (By default, the module uses 'PSNames' to extract glyph names.) + * (By default, the module uses 'psnames' to extract glyph names.) */ #define TT_CONFIG_OPTION_POSTSCRIPT_NAMES /************************************************************************** * - * Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to access + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access * the internal name table in a SFNT-based format like TrueType or * OpenType. The name table contains various strings used to describe the * font, like family name, copyright, version, etc. It does not contain @@ -607,23 +592,24 @@ /************************************************************************** * - * Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile a + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a * bytecode interpreter in the TrueType driver. * * By undefining this, you will only compile the code necessary to load * TrueType glyphs without hinting. * - * Do not #undef this macro here, since the build system might define it - * for certain configurations only. + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. */ #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER /************************************************************************** * - * Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile subpixel - * hinting support into the TrueType driver. This modifies the TrueType - * hinting mechanism when anything but FT_RENDER_MODE_MONO is requested. + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. * * In particular, it modifies the bytecode interpreter to interpret (or * not) instructions in a certain way so that all TrueType fonts look like @@ -648,8 +634,8 @@ * The new default mode for the TrueType driver. The Infinality code * base was stripped to the bare minimum and all configurability removed * in the name of speed and simplicity. The configurability was mainly - * aimed at legacy fonts like Arial, Times New Roman, or Courier. Legacy - * fonts are fonts that modify vertical stems to achieve clean + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean * black-and-white bitmaps. The new mode focuses on applying a minimal * set of rules to all fonts indiscriminately so that modern and web * fonts render well while legacy fonts render okay. @@ -667,7 +653,7 @@ * define one or both subpixel hinting options, you can switch between * between v35 and the ones you define (using `FT_Property_Set`). * - * This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be * defined. * * [1] @@ -680,9 +666,9 @@ /************************************************************************** * - * Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the TrueType - * glyph loader to use Apple's definition of how to handle component - * offsets in composite glyphs. + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. * * Apple and MS disagree on the default behavior of component offsets in * composites. Apple says that they should be scaled by the scaling @@ -699,32 +685,33 @@ /************************************************************************** * - * Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include support - * for Apple's distortable font technology (fvar, gvar, cvar, and avar - * tables). This has many similarities to Type 1 Multiple Masters support. + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology (`fvar`, `gvar`, `cvar`, and + * `avar` tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. */ #define TT_CONFIG_OPTION_GX_VAR_SUPPORT /************************************************************************** * - * Define TT_CONFIG_OPTION_BDF if you want to include support for an - * embedded 'BDF ' table within SFNT-based bitmap formats. + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded `BDF ` table within SFNT-based bitmap formats. */ /* #define TT_CONFIG_OPTION_BDF */ /************************************************************************** * - * Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum number - * of bytecode instructions executed for a single run of the bytecode - * interpreter, needed to prevent infinite loops. You don't want to change - * this except for very special situations (e.g., making a library fuzzer - * spend less time to handle broken fonts). + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). * * It is not expected that this value is ever modified by a configuring - * script; instead, it gets surrounded with #ifndef ... #endif so that the - * value can be set as a preprocessor option on the compiler's command + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command * line. */ #ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES @@ -743,15 +730,15 @@ /************************************************************************** * - * T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and arrays - * in the Type 1 stream (see t1load.c). A minimum of 4 is required. + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. */ #define T1_MAX_DICT_DEPTH 5 /************************************************************************** * - * T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine * calls during glyph loading. */ #define T1_MAX_SUBRS_CALLS 16 @@ -759,10 +746,11 @@ /************************************************************************** * - * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A - * minimum of 16 is required. + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. * - * The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. + * The Chinese font 'MingTiEG-Medium' (coverting a CNS 11643 character set) + * needs 256. */ #define T1_MAX_CHARSTRINGS_OPERANDS 512 @@ -770,9 +758,9 @@ /************************************************************************** * * Define this configuration macro if you want to prevent the compilation - * of 't1afm', which is in charge of reading Type 1 AFM files into an - * existing face. Note that if set, the T1 driver will be unable to - * produce kerning distances. + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. */ #undef T1_CONFIG_OPTION_NO_AFM @@ -780,17 +768,17 @@ /************************************************************************** * * Define this configuration macro if you want to prevent the compilation - * of the Multiple Masters font support in the Type 1 driver. + * of the Multiple Masters font support in the Type~1 driver. */ #undef T1_CONFIG_OPTION_NO_MM_SUPPORT /************************************************************************** * - * T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1 engine - * gets compiled into FreeType. If defined, it is possible to switch - * between the two engines using the 'hinting-engine' property of the type1 - * driver module. + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. */ /* #define T1_CONFIG_OPTION_OLD_ENGINE */ @@ -806,10 +794,10 @@ /************************************************************************** * - * Using CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} it is + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is * possible to set up the default values of the four control points that * define the stem darkening behaviour of the (new) CFF engine. For more - * details please read the documentation of the 'darkening-parameters' + * details please read the documentation of the `darkening-parameters` * property (file `ftdriver.h`), which allows the control at run-time. * * Do **not** undefine these macros! @@ -829,9 +817,9 @@ /************************************************************************** * - * CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF engine + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine * gets compiled into FreeType. If defined, it is possible to switch - * between the two engines using the 'hinting-engine' property of the cff + * between the two engines using the `hinting-engine` property of the 'cff' * driver module. */ /* #define CFF_CONFIG_OPTION_OLD_ENGINE */ @@ -852,14 +840,14 @@ * different, and which have nothing to do with each other. When selecting * 'Fixed' in KDE or Gnome one gets results that appear rather random, the * style changes often if one changes the size and one cannot select some - * fonts at all. This option makes the PCF module prepend the foundry name - * (plus a space) to the family name. + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. * * We also check whether we have 'wide' characters; all put together, we * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. * * If this option is activated, it can be controlled with the - * 'no-long-family-names' property of the pcf driver module. + * `no-long-family-names` property of the 'pcf' driver module. */ /* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ @@ -875,34 +863,39 @@ /************************************************************************** * - * Compile autofit module with CJK (Chinese, Japanese, Korean) script + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script * support. */ #define AF_CONFIG_OPTION_CJK - /************************************************************************** - * - * Compile autofit module with fallback Indic script support, covering some - * scripts that the 'latin' submodule of the autofit module doesn't (yet) - * handle. - */ -#define AF_CONFIG_OPTION_INDIC /************************************************************************** * - * Compile autofit module with warp hinting. The idea of the warping code - * is to slightly scale and shift a glyph within a single dimension so that - * as much of its segments are aligned (more or less) on the grid. To find - * out the optimal scaling and shifting value, various parameter + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. + */ +#define AF_CONFIG_OPTION_INDIC + + + /************************************************************************** + * + * Compile 'autofit' module with warp hinting. The idea of the warping + * code is to slightly scale and shift a glyph within a single dimension so + * that as much of its segments are aligned (more or less) on the grid. To + * find out the optimal scaling and shifting value, various parameter * combinations are tried and scored. * - * This experimental option is active only if the rendering mode is - * FT_RENDER_MODE_LIGHT; you can switch warping on and off with the - * 'warping' property of the auto-hinter (see file `ftdriver.h` for more - * information; by default it is switched off). + * You can switch warping on and off with the `warping` property of the + * auto-hinter (see file `ftdriver.h` for more information; by default it + * is switched off). + * + * This experimental option is not active if the rendering mode is + * `FT_RENDER_MODE_LIGHT`. */ /* #define AF_CONFIG_OPTION_USE_WARPER */ + /************************************************************************** * * Use TrueType-like size metrics for 'light' auto-hinting. @@ -936,8 +929,8 @@ /* - * This macro is defined if native TrueType hinting is requested by the - * definitions above. + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. */ #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER #define TT_USE_BYTECODE_INTERPRETER @@ -956,7 +949,7 @@ /* * Check CFF darkening parameters. The checks are the same as in function - * `cff_property_set' in file `cffdrivr.c'. + * `cff_property_set` in file `cffdrivr.c`. */ #if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \
diff --git a/third_party/freetype/roll-freetype.sh b/third_party/freetype/roll-freetype.sh index 5e7f927..2d60fd6 100755 --- a/third_party/freetype/roll-freetype.sh +++ b/third_party/freetype/roll-freetype.sh
@@ -6,11 +6,6 @@ roll-dep -r "${REVIEWERS}" "$@" src/third_party/freetype/src/ } -previousrev() { - STEP="original revision" && - PREVIOUS_FREETYPE_REV=$(git grep "'freetype_revision':" HEAD~1 -- DEPS | grep -Eho "[0-9a-fA-F]{32}") -} - addtrybots() { STEP="add trybots" && OLD_MSG=$(git show -s --format=%B HEAD) && @@ -24,21 +19,6 @@ PDFium-Issue: pdfium:" } -checkmodules() { - STEP="check modules.cfg: check list of modules and dependencies" && - ! git -C third_party/freetype/src/ diff --name-only ${PREVIOUS_FREETYPE_REV} | grep -q modules.cfg -} - -mergeinclude() { - INCLUDE=$1 && - STEP="merge ${INCLUDE}: check for merge conflicts" && - TMPFILE=$(mktemp) && - git -C third_party/freetype/src/ cat-file blob ${PREVIOUS_FREETYPE_REV}:include/freetype/config/${INCLUDE} >> ${TMPFILE} && - git merge-file third_party/freetype/include/freetype-custom-config/${INCLUDE} ${TMPFILE} third_party/freetype/src/include/freetype/config/${INCLUDE} && - rm ${TMPFILE} && - git add third_party/freetype/include/freetype-custom-config/${INCLUDE} -} - updatereadme() { STEP="update README.chromium" && FTVERSION=$(git -C third_party/freetype/src/ describe --long) && @@ -48,18 +28,39 @@ git add third_party/freetype/README.chromium } +previousrev() { + STEP="original revision" && + PREVIOUS_FREETYPE_REV=$(git grep "'freetype_revision':" HEAD~1 -- DEPS | grep -Eho "[0-9a-fA-F]{32}") +} + +mergeinclude() { + INCLUDE=$1 && + previousrev && + STEP="merge ${INCLUDE}: check for merge conflicts" && + TMPFILE=$(mktemp) && + git -C third_party/freetype/src/ cat-file blob ${PREVIOUS_FREETYPE_REV}:include/freetype/config/${INCLUDE} >> ${TMPFILE} && + git merge-file third_party/freetype/include/freetype-custom-config/${INCLUDE} ${TMPFILE} third_party/freetype/src/include/freetype/config/${INCLUDE} && + rm ${TMPFILE} && + git add third_party/freetype/include/freetype-custom-config/${INCLUDE} +} + +checkmodules() { + previousrev && + STEP="check modules.cfg: check list of modules and dependencies" && + ! git -C third_party/freetype/src/ diff --name-only ${PREVIOUS_FREETYPE_REV} | grep -q modules.cfg +} + commit() { STEP="commit" && git commit --quiet --amend --no-edit } rolldeps "$@" && -previousrev && addtrybots && addotherprojectbugs && -checkmodules && +updatereadme && mergeinclude ftoption.h && mergeinclude ftconfig.h && -updatereadme && +checkmodules && commit && true || echo "Failed step ${STEP}" && false
diff --git a/third_party/libpng/pngprefix.h b/third_party/libpng/pngprefix.h index 6fa8461..ad64f604 100644 --- a/third_party/libpng/pngprefix.h +++ b/third_party/libpng/pngprefix.h
@@ -24,6 +24,7 @@ #define png_calculate_crc cr_png_calculate_crc #define png_calloc cr_png_calloc #define png_check_IHDR cr_png_check_IHDR +#define png_check_chunk_length cr_png_check_chunk_length #define png_check_chunk_name cr_png_check_chunk_name #define png_check_fp_number cr_png_check_fp_number #define png_check_fp_string cr_png_check_fp_string @@ -455,6 +456,7 @@ #define png_write_zTXt cr_png_write_zTXt #define png_zalloc cr_png_zalloc #define png_zfree cr_png_zfree +#define png_zlib_inflate cr_png_zlib_inflate #define png_zstream_error cr_png_zstream_error #endif // PNGPREFIX_H
diff --git a/third_party/webdriver/OWNERS b/third_party/webdriver/OWNERS index 65e456d..9d982eb3 100644 --- a/third_party/webdriver/OWNERS +++ b/third_party/webdriver/OWNERS
@@ -1,6 +1,5 @@ # primary reviewer johnchen@chromium.org -kereliuk@chromium.org # backup reviewer jbudorick@chromium.org
diff --git a/third_party/zlib/google/compression_utils.cc b/third_party/zlib/google/compression_utils.cc index e7be1e9d..dfa42a17 100644 --- a/third_party/zlib/google/compression_utils.cc +++ b/third_party/zlib/google/compression_utils.cc
@@ -123,7 +123,7 @@ namespace compression { -bool GzipCompress(const std::string& input, std::string* output) { +bool GzipCompress(base::StringPiece input, std::string* output) { const uLongf input_size = static_cast<uLongf>(input.size()); std::vector<Bytef> compressed_data(kGzipZlibHeaderDifferenceBytes + compressBound(input_size));
diff --git a/third_party/zlib/google/compression_utils.h b/third_party/zlib/google/compression_utils.h index d496ef1..a29f5b1e 100644 --- a/third_party/zlib/google/compression_utils.h +++ b/third_party/zlib/google/compression_utils.h
@@ -12,8 +12,9 @@ namespace compression { // Compresses the data in |input| using gzip, storing the result in |output|. -// |input| and |output| are allowed to be the same string (in-place operation). -bool GzipCompress(const std::string& input, std::string* output); +// |input| and |output| are allowed to point to the same string (in-place +// operation). +bool GzipCompress(base::StringPiece input, std::string* output); // Uncompresses the data in |input| using gzip, storing the result in |output|. // |input| and |output| are allowed to be the same string (in-place operation).
diff --git a/tools/code_coverage/coverage_utils.py b/tools/code_coverage/coverage_utils.py index 09b1e226..9bbf8475 100644 --- a/tools/code_coverage/coverage_utils.py +++ b/tools/code_coverage/coverage_utils.py
@@ -636,8 +636,7 @@ def GetFullPath(path): """Return full absolute path.""" - return (os.path.abspath( - os.path.realpath(os.path.expandvars(os.path.expanduser(path))))) + return os.path.abspath(os.path.expandvars(os.path.expanduser(path))) def GetHostPlatform():
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 0c2848d..8260745 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -752,10 +752,13 @@ self.FlattenMixins(mixin_vals['mixins'], vals, visited) return vals - def RunGNGen(self, vals, compute_inputs_for_analyze=False): + def RunGNGen(self, vals, compute_inputs_for_analyze=False, check=True): build_dir = self.args.path - cmd = self.GNCmd('gen', build_dir, '--check') + if check: + cmd = self.GNCmd('gen', build_dir, '--check') + else: + cmd = self.GNCmd('gen', build_dir) gn_args = self.GNArgs(vals) if compute_inputs_for_analyze: gn_args += ' compute_inputs_for_analyze=true' @@ -1168,7 +1171,7 @@ def RunGNAnalyze(self, vals): # Analyze runs before 'gn gen' now, so we need to run gn gen # in order to ensure that we have a build directory. - ret = self.RunGNGen(vals, compute_inputs_for_analyze=True) + ret = self.RunGNGen(vals, compute_inputs_for_analyze=True, check=False) if ret: return ret
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index f6fa835..83351b5b 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -382,8 +382,6 @@ 'Android Compile Perf': 'official_goma_minimal_symbols_android', 'Android arm64 Compile Perf': 'official_goma_minimal_symbols_android_arm64', 'android-builder-perf': 'official_goma_minimal_symbols_android', - # TODO(crbug.com/828467): Remove 'Linux Builder Perf' - 'Linux Builder Perf': 'official_goma_perf', 'linux-builder-perf': 'official_goma_perf', # TODO(crbug.com/828468): Remove 'Mac Builder Perf' 'Mac Builder Perf': 'official_goma',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 1a2568e9..be3b603 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -1993,6 +1993,23 @@ <description>Please enter the description of this user action.</description> </action> +<action name="AppList_CurrentWindowToHomeLauncher"> + <owner>newcomer@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <description> + The current window was hidden to display the home launcher. + </description> +</action> + +<action name="AppList_CurrentWindowToHomeLauncherAttempt"> + <owner>newcomer@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <description> + User tried to hide the current window to display the home launcher by + swiping up on the shelf. + </description> +</action> + <action name="AppList_EnterSearch"> <owner>vadimt@chromium.org</owner> <description>CrOS Launcher entered search mode.</description> @@ -2003,6 +2020,23 @@ <description>CrOS Launcher went from full to peeking state.</description> </action> +<action name="AppList_HomeLauncherToMRUWindow"> + <owner>newcomer@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <description> + The home launcher was hidden to display the most recently used window. + </description> +</action> + +<action name="AppList_HomeLauncherToMRUWindowAttempt"> + <owner>newcomer@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <description> + User tried to bring down the most recently used window by swiping down on + the home launcher. + </description> +</action> + <action name="AppList_HotwordRecognized"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 02c499a..3562437c 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -9319,7 +9319,7 @@ D3D11 is not 11.1 or later. </int> <int value="2" label="kProfileNotSupported"> - A supported video codec is using the an unsupported profile. + A video codec is using an unsupported HDR profile. </int> <int value="3" label="kZeroCopyNv12Required"> The GPU is not configured to allow zero copy for nv12. @@ -9327,6 +9327,9 @@ <int value="4" label="kZeroCopyVideoRequired"> The GPU is not configured to allow zero copy for videos. </int> + <int value="5" label="kCodecNotSupported"> + Video is using an unsupported codec. + </int> </enum> <enum name="D3D12FeatureLevel"> @@ -10328,6 +10331,7 @@ <int value="29" label="Audits started"/> <int value="30" label="Audits finished"/> <int value="31" label="Showed third party badges"/> + <int value="32" label="Audits' view trace clicked"/> </enum> <enum name="DevToolsPanel"> @@ -14315,6 +14319,8 @@ <int value="478" label="PrintingDuplexDefault"/> <int value="479" label="PrintingSizeDefault"/> <int value="480" label="PrintHeaderFooter"/> + <int value="481" label="CrostiniAllowed"/> + <int value="482" label="DeviceUnaffiliatedCrostiniAllowed"/> </enum> <enum name="EnterprisePolicyInvalidations"> @@ -16584,6 +16590,9 @@ <int value="1270" label="ENTERPRISEREPORTINGPRIVATE_GETDEVICEID"/> <int value="1271" label="ENTERPRISE_HARDWAREPLATFORM_GETHARDWAREPLATFORMINFO"/> + <int value="1272" + label="FILEMANAGERPRIVATEINTERNAL_SHAREPATHWITHCROSTINICONTAINER"/> + <int value="1273" label="AUTOTESTPRIVATE_SETCROSTINIENABLED"/> </enum> <enum name="ExtensionIconState"> @@ -19929,6 +19938,10 @@ <int value="2534" label="CacheStorageAddAllSuccessWithDuplicate"/> <int value="2535" label="LegendDelegateFocusOrAccessKey"/> <int value="2536" label="FeaturePolicyReport"/> + <int value="2537" label="V8Window_WebkitRTCPeerConnection_ConstructorGetter"/> + <int value="2538" label="V8Window_WebkitMediaStream_ConstructorGetter"/> + <int value="2539" label="TextEncoderStreamConstructor"/> + <int value="2540" label="TextDecoderStreamConstructor"/> </enum> <enum name="FeedbackSource"> @@ -27653,6 +27666,7 @@ <int value="0" label="Not attempted"/> <int value="1" label="Failed"/> <int value="2" label="Copied everything"/> + <int value="3" label="The standard login database is encrypted"/> </enum> <enum name="LinuxSandboxStatus"> @@ -27859,6 +27873,13 @@ <int value="9" label="PRERENDER_LOAD">Speculative prerendering of a page</int> </enum> +<enum name="LocalCardMigrationPrompt"> + <int value="0" label="Intermediate bubble shown"/> + <int value="1" label="Intermediate bubble accepted"/> + <int value="2" label="Main dialog shown"/> + <int value="3" label="Main dialog accepted"/> +</enum> + <enum name="LocalRendererSinkStates"> <int value="0" label="SinkStarted"/> <int value="1" label="SinkNeverStarted"/> @@ -28150,6 +28171,8 @@ <int value="-1887862464" label="SpannableInlineAutocomplete:disabled"/> <int value="-1887053262" label="enable-zero-suggest-most-visited-without-serp"/> + <int value="-1886713568" + label="AutofillGetPaymentsIdentityFromSync:disabled"/> <int value="-1883170077" label="EnableHtmlBaseUsernameDetector:disabled"/> <int value="-1882330924" label="NTPArticleSuggestions:enabled"/> <int value="-1881250251" label="InterestFeedContentSuggestions:disabled"/> @@ -28633,6 +28656,7 @@ <int value="-1015006759" label="ImportantSitesInCBD:disabled"/> <int value="-1014936248" label="SyncUSSBookmarks:enabled"/> <int value="-1014649471" label="committed-interstitials"/> + <int value="-1010588306" label="SlideTopChromeWithPageScrolls:disabled"/> <int value="-998255750" label="ExperimentalKeyboardLockUI:enabled"/> <int value="-996673716" label="enable-web-app-frame"/> <int value="-994558985" label="EnableNotificationIndicator:disabled"/> @@ -28733,7 +28757,9 @@ label="AutofillToolkitViewsCreditCardDialogsMac:disabled"/> <int value="-810373609" label="ChromeModernFullRoll:enabled"/> <int value="-808486493" label="NewWallpaperPicker:disabled"/> + <int value="-803233334" label="AutofillRefreshStyleAndroid:disabled"/> <int value="-802348444" label="disable-site-engagement-service"/> + <int value="-799931058" label="UseMultiloginEndpoint:disabled"/> <int value="-798187384" label="try-supported-channel-layouts"/> <int value="-797310986" label="CSSFragmentIdentifiers:disabled"/> <int value="-795600188" label="disable-async-dns"/> @@ -29109,6 +29135,8 @@ label="NTPArticleSuggestionsExpandableHeader:disabled"/> <int value="-23090520" label="disable-search-button-in-omnibox"/> <int value="-22544408" label="enable-video-player-chromecast-support"/> + <int value="-20597579" label="UseMultiloginEndpoint:enabled"/> + <int value="-20438829" label="SyncUSSAutofillProfile:enabled"/> <int value="-20267582" label="ResourceLoadingHints:disabled"/> <int value="-18464041" label="AutofillPrefilledFields:disabled"/> <int value="-16824589" label="ash-shelf-color"/> @@ -29246,6 +29274,7 @@ <int value="303252119" label="AutofillExpandedPopupViews:disabled"/> <int value="304901781" label="NewUsbBackend:enabled"/> <int value="307543404" label="disable-team-drives"/> + <int value="313253630" label="AutofillRefreshStyleAndroid:enabled"/> <int value="313303258" label="WebPaymentsModifiers:disabled"/> <int value="316182183" label="MediaDocumentDownloadButton:disabled"/> <int value="319683583" label="ContentSuggestionsDebugLog:enabled"/> @@ -29507,6 +29536,7 @@ <int value="807734471" label="tab-management-experiment-type-disabled"/> <int value="809698565" label="WebRtcHybridAgc:enabled"/> <int value="811374216" label="disable-new-bookmark-apps"/> + <int value="811726957" label="SlideTopChromeWithPageScrolls:enabled"/> <int value="812710781" label="SyncUSSBookmarks:disabled"/> <int value="820650704" label="disable-ntp-popular-sites"/> <int value="821192723" label="show-fps-counter"/> @@ -29710,6 +29740,7 @@ <int value="1214455758" label="VideoRotateToFullscreen:disabled"/> <int value="1215531732" label="OmniboxUIExperiments:disabled"/> <int value="1215768255" label="AutofillCreditCardLocalCardMigration:enabled"/> + <int value="1216452475" label="SyncUSSAutofillProfile:disabled"/> <int value="1217907443" label="spurious-power-button-keyboard-accel"/> <int value="1219317631" label="ContextualSuggestionsAboveArticles:disabled"/> <int value="1219628795" label="PrintScaling:disabled"/> @@ -30121,6 +30152,7 @@ <int value="2003568209" label="TouchpadAndWheelScrollLatching:disabled"/> <int value="2003811018" label="enable-touch-support-for-screen-magnifier"/> <int value="2004483175" label="multi-instance-merge-tabs"/> + <int value="2004604350" label="AutofillGetPaymentsIdentityFromSync:enabled"/> <int value="2004829262" label="enable-webgl-draft-extensions"/> <int value="2005614493" label="tab-management-experiment-type-dill"/> <int value="2006413281" @@ -37190,6 +37222,7 @@ <int value="12" label="Generation triggered by autocomplete attributes"/> <int value="13" label="Generation item in the context menu accepted"/> <int value="14" label="Generation item in the context menu shown"/> + <int value="15" label="Generated password deleted by autofilling"/> </enum> <enum name="PasswordGenerationUserEvent"> @@ -46720,6 +46753,13 @@ <int value="1" label="Advanced setup with a custom passphrase"/> </enum> +<enum name="SyncCustomPassphraseKeyDerivationMethodState"> + <int value="0" label="Not set"/> + <int value="1" label="Unsupported method"/> + <int value="2" label="PBKDF2_HMAC_SHA1_1003"/> + <int value="3" label="SCRYPT_8192_8_11"/> +</enum> + <enum name="SyncDeferredInitTrigger"> <int value="0" label="Data type requested init."/> <int value="1" label="Fallback timer triggered init."/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 1268514..9115e65 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -6775,6 +6775,16 @@ <summary>Record how bubble is closed by different user interactions.</summary> </histogram> +<histogram name="Autofill.LocalCardMigrationOrigin" + enum="LocalCardMigrationPrompt"> + <owner>jiahuiguo@chromium.org</owner> + <owner>jsaul@google.com</owner> + <owner>siyua@chromium.org</owner> + <summary> + Records when local card migration prompts are shown and/or accepted. + </summary> +</histogram> + <histogram name="Autofill.MacAddressBook" enum="AutofillMacAddressBook"> <obsolete> Deprecated as of 8/2015. @@ -7739,6 +7749,15 @@ </summary> </histogram> +<histogram name="BackgroundFetch.HasDuplicateRequests" enum="Boolean"> + <owner>rayankans@chromium.org</owner> + <summary> + Records whether the fetch requests contains any duplicate URLs. This is + called after the provided requests are verified, but before the fetch is + started. + </summary> +</histogram> + <histogram base="true" name="BackgroundFetch.Manager" units="ms"> <!-- Name completed by histogram_suffixes name="BackgroundFetchManagerAPIsDuration" --> @@ -41809,6 +41828,16 @@ <summary>Duration in milliseconds of HTML5 media (when known).</summary> </histogram> +<histogram name="Media.DXVAVDA.CreateDecoderStatus" enum="BooleanSuccess" + expires_after="M73"> + <owner>dalecurtis@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + Did IsResolutionSupportedForDevice() succeed or fail during + ID3D11VideoDevice::CreateVideoDecoder(). + </summary> +</histogram> + <histogram name="Media.DXVAVDA.ErrorLine"> <owner>jbauman@chromium.org</owner> <owner>sandersd@chromium.org</owner> @@ -41818,6 +41847,16 @@ </summary> </histogram> +<histogram name="Media.DXVAVDA.GetDecoderConfigStatus" enum="BooleanSuccess" + expires_after="M73"> + <owner>dalecurtis@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + Did IsResolutionSupportedForDevice() succeed or fail during + ID3D11VideoDevice::GetVideoDecoderConfig(). + </summary> +</histogram> + <histogram name="Media.DXVAVDA.PictureBufferErrorLine"> <owner>jbauman@chromium.org</owner> <owner>sandersd@chromium.org</owner> @@ -84499,13 +84538,13 @@ </summary> </histogram> -<histogram name="ResourceLoadingHints.ResourceHints.ProcessedCount" +<histogram name="ResourceLoadingHints.PageHints.ProcessedCount" units="pattern count"> <owner>tbansal@chromium.org</owner> <summary> - The count of resource loading blocking patterns received by the browser from - the component updater. Recorded every time a non-empty page hint is received - by the browser from the optimization guide service. + The count of page hints received by the browser from the component updater. + Recorded every time a page hint is received by the browser from the + optimization guide service. </summary> </histogram> @@ -102428,6 +102467,54 @@ </summary> </histogram> +<histogram + name="Sync.Crypto.CustomPassphraseKeyDerivationMethodOnNewPassphrase" + enum="SyncCustomPassphraseKeyDerivationMethodState" expires_after="M73"> + <owner>vitaliii@chromium.org</owner> + <owner>treib@chromium.org</owner> + <summary> + Key derivation method used for sync custom passphrase when a new custom + passphrase is set. "Not set" will never be reported for this + metric, since we always have an explicit key derivation method when a new + passphrase is set. + </summary> +</histogram> + +<histogram + name="Sync.Crypto.CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption" + enum="SyncCustomPassphraseKeyDerivationMethodState" expires_after="M73"> + <owner>vitaliii@chromium.org</owner> + <owner>treib@chromium.org</owner> + <summary> + Key derivation method used for sync custom passphrase on successful + decryption of pending keys, i.e. when a passphrase is requested and the user + types in the correct one. "Not set" will never be reported for + this metric, since we always have an explicit key derivation method on + successful decryption. + </summary> +</histogram> + +<histogram name="Sync.Crypto.CustomPassphraseKeyDerivationMethodStateOnStartup" + enum="SyncCustomPassphraseKeyDerivationMethodState" expires_after="M73"> + <owner>vitaliii@chromium.org</owner> + <owner>treib@chromium.org</owner> + <summary> + State of the derivation method used for sync custom passphrase on startup. + Reported only when the passphrase type is CUSTOM_PASSPHRASE. + </summary> +</histogram> + +<histogram base="true" name="Sync.Crypto.NigoriKeyDerivationDuration" + units="ms" expires_after="2020-02-01"> + <owner>vitaliii@chromium.org</owner> + <owner>treib@chromium.org</owner> + <summary> + Time taken to derive keys in Nigori using a given key derivation method. + This histogram is always recorded with one of the key derivation method + suffixes. + </summary> +</histogram> + <histogram name="Sync.CryptographerPendingKeys" enum="SyncCryptographerPendingKeysState"> <owner>zea@chromium.org</owner> @@ -106465,7 +106552,8 @@ </summary> </histogram> -<histogram name="TextToSpeech.Utterance.HasGender" enum="TextToSpeechHasGender"> +<histogram name="TextToSpeech.Utterance.HasGender" enum="TextToSpeechHasGender" + expires_after="M73"> <owner>dmazzoni@chromium.org</owner> <summary> True if an utterance spoken via synthesized text-to-speech requested a @@ -109816,6 +109904,9 @@ </histogram> <histogram name="URLBlacklistManager.ConstructorBuildTime" units="ms"> + <obsolete> + Served its purpose; deprecated 9/2018 in M71 (https://crbug.com/827173). + </obsolete> <owner>grt@chromium.org</owner> <summary> The time it took to build and set the URL blacklist on the main thread @@ -110679,6 +110770,19 @@ <summary>Time spent in scavenging phase of GC.</summary> </histogram> +<histogram name="V8.GCScavenger.ScavengeMain" units="ms"> + <owner>mlippautz@chromium.org</owner> + <summary> + Wall time spent in the main scavenging phase that copies over all reachable + objects during a V8 scavenge. + </summary> +</histogram> + +<histogram name="V8.GCScavenger.ScavengeRoots" units="ms"> + <owner>mlippautz@chromium.org</owner> + <summary>Time spent in scavenging the roots during a V8 scavenge.</summary> +</histogram> + <histogram name="V8.GCScavengerBackground" units="ms"> <owner>hpayer@chromium.org</owner> <summary> @@ -119094,6 +119198,15 @@ <affected-histogram name="Autofill.LocalCardMigrationBubbleUserInteraction"/> </histogram_suffixes> +<histogram_suffixes name="AutofillLocalCardMigrationOrigin" separator="."> + <suffix name="SettingsPage" label="Trigger from settings page"/> + <suffix name="UseOfLocalCard" + label="Trigger from submitted form with local card"/> + <suffix name="UseOfServerCard" + label="Trigger from submitted form with server card"/> + <affected-histogram name="Autofill.LocalCardMigrationOrigin"/> +</histogram_suffixes> + <histogram_suffixes name="AutofillManageCardsPrompt" separator="."> <suffix name="Local" label="Card was saved locally"/> <suffix name="Upload" label="Card was uploaded to server"/> @@ -130138,6 +130251,12 @@ <affected-histogram name="WebCore.IndexedDB.TombstoneSweeper.TombstonesSize"/> </histogram_suffixes> +<histogram_suffixes name="SyncKeyDerivationMethod" separator="."> + <suffix name="Pbkdf2" label="PBKDF2_HMAC_SHA1_1003"/> + <suffix name="Scrypt8192" label="SCRYPT_8192_8_11"/> + <affected-histogram name="Sync.Crypto.NigoriKeyDerivationDuration"/> +</histogram_suffixes> + <histogram_suffixes name="SyncModelType" separator="."> <suffix name="APP" label="APP"/> <suffix name="APP_LIST" label="APP_LIST"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 5840bec..a703fdd 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -2531,6 +2531,48 @@ </metric> </event> +<event name="BackgroundFetch"> + <owner>nator@chromium.org</owner> + <owner>rayankans@chromium.org</owner> + <owner>peter@chromium.org</owner> + <summary> + A BackgroundFetch event is logged before a background fetch is started from + a document context. + </summary> + <metric name="DeniedDueToPermissions"> + <summary> + Boolean for whether the background fetch was denied due to permission. + This includes only the content setting permission. + </summary> + </metric> + <metric name="DownloadTotal"> + <summary> + The value of downloadTotal provided with the background fetch. This is the + number of bytes that the developer expects to be downloaded with the + background fetch. This number is exponentially bucketed for privacy + reasons, and uses the UKM GetExponentialBucketMin method with a value of + 2.0 for spacing. + </summary> + </metric> + <metric name="HasTitle"> + <summary> + Boolean for whether a title was provided with the background fetch. + </summary> + </metric> + <metric name="NumIcons"> + <summary> + Count of icons provided with the background fetch. + </summary> + </metric> + <metric name="NumRequestsInFetch"> + <summary> + Number of requests in the background fetch. This number is exponentially + bucketed for privacy reasons, and uses the UKM GetExponentialBucketMin + method with a value of 2.0 for spacing. + </summary> + </metric> +</event> + <event name="OfflinePages.SavePageRequested"> <owner>petewil@chromium.org</owner> <metric name="RequestedFromForeground">
diff --git a/tools/perf/benchmarks/memory.py b/tools/perf/benchmarks/memory.py index 4371357..4cf61ab5 100644 --- a/tools/perf/benchmarks/memory.py +++ b/tools/perf/benchmarks/memory.py
@@ -80,14 +80,17 @@ @benchmark.Info(emails=['erikchen@chromium.org']) -class MemoryBenchmarkTrivialSitesDesktop(_MemoryInfra): - """Measure memory usage on trivial sites.""" +class MemoryBenchmarkDesktop(_MemoryInfra): + """Measure memory usage on synthetic sites.""" options = {'pageset_repeat': 5} SUPPORTED_PLATFORMS = [story.expectations.ALL_DESKTOP] def CreateStorySet(self, options): - return page_sets.TrivialSitesStorySet(wait_in_seconds=0, - measure_memory=True) + story_set = page_sets.TrivialSitesStorySet(wait_in_seconds=0, + measure_memory=True) + for page in page_sets.WebWorkerStorySet(measure_memory=True): + story_set.AddStory(page) + return story_set @classmethod def Name(cls):
diff --git a/tools/perf/benchmarks/startup_mobile.py b/tools/perf/benchmarks/startup_mobile.py index 6cdb0cd4c..6e8ce74 100644 --- a/tools/perf/benchmarks/startup_mobile.py +++ b/tools/perf/benchmarks/startup_mobile.py
@@ -22,26 +22,9 @@ # Chrome Startup Benchmarks for mobile devices (running Android). # -# This set of benchmarks (experimental.startup.mobile) aims to replace -# the benchmark experimental.startup.android.coldish. It brings two -# improvements: -# 1. a name that is more aligned with the end state :) -# 2. uses the new shared state pattern as recommended by: -# third_party/catapult/telemetry/examples/benchmarks/android_go_benchmark.py -# The shared state allows starting the browser multiple times during a -# benchmark, properly evicting caches, populating caches, running as many -# iterations as needed without being affected by pageset-repeat being set by -# bisect/Pinpoint. -# -# Note: this benchmark is not yet ready for FYI bots. When we ensure that -# evicting OS pagecache happens at proper times, we will replace -# 'experimental.startup.android.coldish' with 'experimental.startup.mobile'. -# After adding warm starts the resulting benchmark can replace the -# 'start_with_url.*' family that has aged quite a bit. -# # The recommended way to run this benchmark is: # shell> CHROMIUM_OUTPUT_DIR=gn_android/Release tools/perf/run_benchmark \ -# -v experimental.startup.mobile --browser=android-chrome \ +# -v startup.mobile --browser=android-chrome \ # --output-dir=/tmp/avoid-polluting-chrome-tree class _MobileStartupSharedState(story_module.SharedState): @@ -79,11 +62,12 @@ self.platform.network_controller.Close() self.platform.SetFullPerformanceModeEnabled(False) - def LaunchBrowser(self, url): - self.platform.FlushDnsCache() - # TODO(crbug.com/811244): Determine whether this ensures the page cache is - # cleared after |FlushOsPageCaches()| returns. - self._possible_browser.FlushOsPageCaches() + def LaunchBrowser(self, url, flush_caches): + if flush_caches: + self.platform.FlushDnsCache() + # TODO(crbug.com/811244): Determine whether this ensures the page cache is + # cleared after |FlushOsPageCaches()| returns. + self._possible_browser.FlushOsPageCaches() self.platform.WaitForBatteryTemperature(35) self.platform.StartActivity( intent.Intent(package=self._possible_browser.settings.package, @@ -136,21 +120,32 @@ return True +def _DriveMobileStartupWithIntent(state, flush_caches): + for _ in xrange(10): + # TODO(pasko): Find a way to fail the benchmark when WPR is set up + # incorrectly and error pages get loaded. + state.LaunchBrowser('http://bbc.co.uk', flush_caches) + with state.FindBrowser() as browser: + action_runner = browser.foreground_tab.action_runner + action_runner.tab.WaitForDocumentReadyStateToBeComplete() + + class _MobileStartupWithIntentStory(story_module.Story): def __init__(self): super(_MobileStartupWithIntentStory, self).__init__( _MobileStartupSharedState, name='intent:coldish:bbc') - self._action_runner = None def Run(self, state): - """Drives the benchmark with repetitions.""" - # TODO(pasko): Find a way to fail the benchmark when WPR is set up - # incorrectly and error pages get loaded. - for _ in xrange(10): - state.LaunchBrowser('http://bbc.co.uk') - with state.FindBrowser() as browser: - action_runner = browser.foreground_tab.action_runner - action_runner.tab.WaitForDocumentReadyStateToBeComplete() + _DriveMobileStartupWithIntent(state, flush_caches=True) + + +class _MobileStartupWithIntentStoryWarm(story_module.Story): + def __init__(self): + super(_MobileStartupWithIntentStoryWarm, self).__init__( + _MobileStartupSharedState, name='intent:warm:bbc') + + def Run(self, state): + _DriveMobileStartupWithIntent(state, flush_caches=False) class _MobileStartupStorySet(story_module.StorySet): @@ -159,6 +154,7 @@ archive_data_file='../page_sets/data/startup_pages.json', cloud_storage_bucket=story_module.PARTNER_BUCKET) self.AddStory(_MobileStartupWithIntentStory()) + self.AddStory(_MobileStartupWithIntentStoryWarm()) # The mobile startup benchmark uses specifics of AndroidPlatform and hardcodes @@ -191,4 +187,4 @@ @classmethod def Name(cls): - return 'experimental.startup.mobile' + return 'startup.mobile'
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 8cdac1e..18f5620 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -9,7 +9,7 @@ UNSCHEDULED_TELEMETRY_BENCHMARKS = set([ 'experimental.startup.android.coldish', - 'experimental.startup.mobile', + 'startup.mobile', ]) @@ -30,8 +30,7 @@ 'system_health.memory_mobile', 'system_health.common_mobile', 'power.typical_10_mobile', - 'start_with_url.cold.startup_pages', - 'start_with_url.warm.startup_pages', + 'startup.mobile', 'system_health.webview_startup', 'v8.browsing_mobile', 'speedometer',
diff --git a/tools/perf/core/test_data/benchmarks_to_shard.json b/tools/perf/core/test_data/benchmarks_to_shard.json index 22a3424..441e477 100644 --- a/tools/perf/core/test_data/benchmarks_to_shard.json +++ b/tools/perf/core/test_data/benchmarks_to_shard.json
@@ -403,7 +403,7 @@ "stories": [ "intent:coldish:bbc" ], - "name": "experimental.startup.mobile" + "name": "startup.mobile" }, { "repeat": 1,
diff --git a/tools/perf/page_sets/data/startup_pages.json b/tools/perf/page_sets/data/startup_pages.json index ad533d9..5b94b91 100644 --- a/tools/perf/page_sets/data/startup_pages.json +++ b/tools/perf/page_sets/data/startup_pages.json
@@ -3,6 +3,9 @@ "intent:coldish:bbc": { "DEFAULT": "startup_pages_000.wprgo" }, + "intent:warm:bbc": { + "DEFAULT": "startup_pages_000.wprgo" + }, "http://bbc.co.uk": { "DEFAULT": "startup_pages_000.wprgo" },
diff --git a/tools/perf/page_sets/web_worker_stories.py b/tools/perf/page_sets/web_worker_stories.py new file mode 100644 index 0000000..8277cb12 --- /dev/null +++ b/tools/perf/page_sets/web_worker_stories.py
@@ -0,0 +1,32 @@ +# 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. + +from telemetry.page import page as page +from telemetry.page import shared_page_state +from telemetry import story + + +class WebWorkerStory(page.Page): + """This story creates 1000 web workers one after another.""" + NAME = 'WebWorker' + URL = 'file://web_workers/index.html?auto=1&workers=1000' + + def __init__(self, page_set, shared_page_state_class, measure_memory): + super(WebWorkerStory, self).__init__( + url=self.URL, page_set=page_set, name=self.NAME, + shared_page_state_class=shared_page_state_class) + self.measure_memory = measure_memory + + def RunPageInteractions(self, action_runner): + action_runner.WaitForJavaScriptCondition('done', timeout=100) + if self.measure_memory: + action_runner.MeasureMemory(deterministic_mode=True) + + +class WebWorkerStorySet(story.StorySet): + def __init__(self, shared_state = shared_page_state.SharedPageState, + measure_memory=False): + super(WebWorkerStorySet, self).__init__( + cloud_storage_bucket=story.PUBLIC_BUCKET) + self.AddStory(WebWorkerStory(self, shared_state, measure_memory))
diff --git a/tools/perf/page_sets/web_workers/index.html b/tools/perf/page_sets/web_workers/index.html new file mode 100644 index 0000000..0d8e1a0 --- /dev/null +++ b/tools/perf/page_sets/web_workers/index.html
@@ -0,0 +1,80 @@ +<!doctype html> +<!-- +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. +--> + +<html> +<script> +let done = false; +let index; +let numberOfWorkers; +let closeWorker; +let allocationsPerWorker; + +function spawnWorker() { + if (index === numberOfWorkers) { + done = true; + document.getElementById("counter").innerHTML = "Done"; + return; + } + let worker = new Worker("worker.js"); + worker.postMessage({ + index: index, + closeWorker: closeWorker, + allocationsPerWorker: allocationsPerWorker}); + document.getElementById("counter").innerHTML = + "Spawned " + index + " workers."; + ++index; + worker.onmessage = spawnWorker; +} + +function go() { + index = 0; + numberOfWorkers = parseInt(document.getElementById("numberOfWorkers").value); + closeWorker = document.getElementById("closeWorker").checked; + allocationsPerWorker = + parseInt(document.getElementById("allocationsPerWorker").value) * + 1024 * 1024; + spawnWorker(); +} + +function onLoad() { + let url = window.document.URL; + let workers = url.match(/workers=(\d+)/); + if (workers) { + document.getElementById("numberOfWorkers").value = workers[1]; + } + let allocations = url.match(/allocations=(\d+)/); + if (allocations) { + document.getElementById("allocationsPerWorker").value = allocations[1]; + } + if (url.indexOf("close=0") >= 0) { + document.getElementById("closeWorker").checked = false; + } + if (url.indexOf("auto=1") >= 0) { + go(); + } +} + +</script> +<body onload="onLoad()"> + <div> + Number of workers: + <input type="text" id="numberOfWorkers" value="1000" size="3"></input> + </div> + <div> + Allocations per worker in MB: + <input type="text" id="allocationsPerWorker" value="5" size="3"></input> + </div> + <div> + <input type="checkbox" id="closeWorker" checked> + Call <b>close()</b> on Worker + </div> + <div> + <button onclick="go()">Go</button> + </div> + <p id="counter"></p> +</body> +</html>
diff --git a/tools/perf/page_sets/web_workers/worker.js b/tools/perf/page_sets/web_workers/worker.js new file mode 100644 index 0000000..d568479 --- /dev/null +++ b/tools/perf/page_sets/web_workers/worker.js
@@ -0,0 +1,44 @@ +// 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. + +let targetBytes; +let closeWorker; +let garbageBytes = 0; +let garbage = []; +let timerId = null; + +function generateGarbage() { + if (timerId) { + clearTimeout(timerId); + } + const chunkBytes = 5 * 1024 * 1024; + const arrayLength = 10000; + const bytesPerElement = 8; + const bytesPerArray = arrayLength * bytesPerElement; + let generated = 0; + while (generated < chunkBytes) { + let array = new Array(arrayLength); + for (let j = 0; j < array.length; j++) { + array[j] = 1.0 / (garbageBytes + j + 1); + } + garbage.push(array); + generated += bytesPerArray; + } + + garbageBytes += generated; + if (garbageBytes < targetBytes) { + timerId = setTimeout(generateGarbage, 1); + } else { + postMessage("done"); + if (closeWorker) { + close(); + } + } +} + +onmessage = function(args) { + targetBytes = args.data.allocationsPerWorker; + closeWorker = args.data.closeWorker; + setTimeout(generateGarbage, 1); +}
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index f767189..bd12f59 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -233,6 +233,7 @@ <item id="service_worker_navigation_preload" hash_code="129872904" type="0" content_hash_code="79473248" os_list="linux,windows" file_path="content/browser/service_worker/service_worker_fetch_dispatcher.cc"/> <item id="service_worker_write_to_cache_job" hash_code="117963307" type="0" content_hash_code="18065724" os_list="linux,windows" file_path="content/browser/service_worker/service_worker_write_to_cache_job.cc"/> <item id="services_http_server_error_response" hash_code="59302801" type="0" content_hash_code="127774041" os_list="linux,windows" file_path="services/network/public/cpp/server/http_server.cc"/> + <item id="shared_worker_script_load" hash_code="107347227" type="0" content_hash_code="64293499" os_list="linux,mac,windows" file_path="content/browser/shared_worker/shared_worker_script_fetcher.cc"/> <item id="sigined_exchange_cert_fetcher" hash_code="79442849" type="0" content_hash_code="8138156" os_list="linux,windows" file_path="content/browser/web_package/signed_exchange_cert_fetcher.cc"/> <item id="signed_in_profile_avatar" hash_code="108903331" type="0" content_hash_code="72850619" os_list="linux,windows" file_path="chrome/browser/profiles/profile_downloader.cc"/> <item id="socket_bio_adapter" hash_code="516551" type="0" content_hash_code="21643352" os_list="linux,windows" file_path="net/socket/socket_bio_adapter.cc"/>
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index 6115ded5..eaf73aec 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h
@@ -63,7 +63,7 @@ // distinguish between "before text" and "after text" positions. To do this, if // the child index is 0 and the anchor is a leaf node, then it's an "after text" // position. If the child index is |BEFORE_TEXT| and the anchor is a leaf node, -// then his is a "before text" position. +// then this is a "before text" position. // It doesn't make sense to have a "before text" position on a text position, // because it is identical to setting its offset to the first character. //
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index db4b8a8a..e8235c33 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -245,6 +245,7 @@ java_files = [ "java/src/org/chromium/ui/AsyncViewStub.java", "java/src/org/chromium/ui/AsyncViewProvider.java", + "java/src/org/chromium/ui/DeferredViewStubInflationProvider.java", "java/src/org/chromium/ui/DropdownAdapter.java", "java/src/org/chromium/ui/DropdownDividerDrawable.java", "java/src/org/chromium/ui/DropdownItem.java", @@ -255,6 +256,7 @@ "java/src/org/chromium/ui/DropdownPopupWindowInterface.java", "java/src/org/chromium/ui/HorizontalListDividerDrawable.java", "java/src/org/chromium/ui/OverscrollRefreshHandler.java", + "java/src/org/chromium/ui/ViewProvider.java", "java/src/org/chromium/ui/VSyncMonitor.java", "java/src/org/chromium/ui/base/ActivityAndroidPermissionDelegate.java", "java/src/org/chromium/ui/base/ActivityWindowAndroid.java",
diff --git a/ui/android/delegated_frame_host_android.cc b/ui/android/delegated_frame_host_android.cc index 7ecf292c..ad43d117 100644 --- a/ui/android/delegated_frame_host_android.cc +++ b/ui/android/delegated_frame_host_android.cc
@@ -512,7 +512,6 @@ return; first_local_surface_id_after_navigation_ = pending_local_surface_id_; - received_frame_after_navigation_ = false; } } // namespace ui
diff --git a/ui/android/delegated_frame_host_android.h b/ui/android/delegated_frame_host_android.h index 13a83cf..ed91cad 100644 --- a/ui/android/delegated_frame_host_android.h +++ b/ui/android/delegated_frame_host_android.h
@@ -201,7 +201,6 @@ // Whether we've received a frame from the renderer since navigating. // Only used when surface synchronization is on. viz::LocalSurfaceId first_local_surface_id_after_navigation_; - bool received_frame_after_navigation_ = false; std::vector<std::unique_ptr<viz::CopyOutputRequest>> pending_first_frame_requests_;
diff --git a/ui/android/delegated_frame_host_android_unittest.cc b/ui/android/delegated_frame_host_android_unittest.cc index 013ebd2..9248c71 100644 --- a/ui/android/delegated_frame_host_android_unittest.cc +++ b/ui/android/delegated_frame_host_android_unittest.cc
@@ -8,6 +8,7 @@ #include "cc/layers/layer.h" #include "cc/layers/solid_color_layer.h" #include "cc/layers/surface_layer.h" +#include "cc/trees/layer_tree_host.h" #include "components/viz/common/hit_test/hit_test_region_list.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "components/viz/host/host_frame_sink_manager.h" @@ -69,18 +70,13 @@ } }; -class MockCompositorLockManagerClient : public ui::CompositorLockManagerClient { - public: - MOCK_METHOD1(OnCompositorLockStateChanged, void(bool)); -}; - class DelegatedFrameHostAndroidTest : public testing::Test { public: DelegatedFrameHostAndroidTest() : frame_sink_manager_impl_(&shared_bitmap_manager_), frame_sink_id_(1, 1), task_runner_(new base::TestMockTimeTaskRunner()), - lock_manager_(task_runner_, &lock_manager_client_) { + lock_manager_(task_runner_) { host_frame_sink_manager_.SetLocalManager(&frame_sink_manager_impl_); frame_sink_manager_impl_.SetLocalClient(&host_frame_sink_manager_); } @@ -98,9 +94,12 @@ ui::CompositorLock* GetLock(CompositorLockClient* client, base::TimeDelta time_delta) { - return lock_manager_.GetCompositorLock(client, time_delta).release(); + return lock_manager_.GetCompositorLock(client, time_delta, nullptr) + .release(); } + bool IsLocked() const { return lock_manager_.IsLocked(); } + void SubmitCompositorFrame(const gfx::Size& frame_size = gfx::Size(10, 10)) { viz::CompositorFrame frame = viz::CompositorFrameBuilder() @@ -115,13 +114,11 @@ .WillOnce(Return(true)); EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->AttachToCompositor(&compositor_); + EXPECT_TRUE(IsLocked()); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); SubmitCompositorFrame(frame_size); + EXPECT_FALSE(IsLocked()); } protected: @@ -134,7 +131,6 @@ viz::FrameSinkId frame_sink_id_; viz::ParentLocalSurfaceIdAllocator allocator_; std::unique_ptr<DelegatedFrameHostAndroid> frame_host_; - MockCompositorLockManagerClient lock_manager_client_; scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; CompositorLockManager lock_manager_; }; @@ -192,14 +188,12 @@ EXPECT_CALL(compositor_, IsDrawingFirstVisibleFrame()).WillOnce(Return(true)); EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->AttachToCompositor(&compositor_); + EXPECT_TRUE(IsLocked()); // Lock should be released when we submit a compositor frame. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); SubmitCompositorFrame(); + EXPECT_FALSE(IsLocked()); } TEST_F(DelegatedFrameHostAndroidTest, CompositorLockDuringLaterFrame) { @@ -226,14 +220,12 @@ EXPECT_CALL(compositor_, IsDrawingFirstVisibleFrame()).WillOnce(Return(true)); EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->AttachToCompositor(&compositor_); + EXPECT_TRUE(IsLocked()); // Lock should be released when we detach. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); frame_host_->DetachFromCompositor(); + EXPECT_FALSE(IsLocked()); } TEST_F(DelegatedFrameHostAndroidTest, ResizeLockBasic) { @@ -246,19 +238,16 @@ // Tell the frame host to resize, it should take a lock. EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->PixelSizeWillChange(gfx::Size(50, 50)); + EXPECT_TRUE(IsLocked()); // Submit a frame of the wrong size, nothing should change. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(0); SubmitCompositorFrame(gfx::Size(20, 20)); + EXPECT_TRUE(IsLocked()); // Submit a frame with the right size, the lock should release. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); SubmitCompositorFrame(gfx::Size(50, 50)); + EXPECT_FALSE(IsLocked()); } TEST_F(DelegatedFrameHostAndroidTest, ResizeLockNotTakenIfNoSizeChange) { @@ -269,9 +258,8 @@ SetUpValidFrame(gfx::Size(10, 10)); // Tell the frame host to resize to the existing size, nothing should happen. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(0); frame_host_->PixelSizeWillChange(gfx::Size(10, 10)); + EXPECT_FALSE(IsLocked()); } TEST_F(DelegatedFrameHostAndroidTest, ResizeLockReleasedWithDetach) { @@ -284,14 +272,12 @@ // Tell the frame host to resize, it should take a lock. EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->PixelSizeWillChange(gfx::Size(50, 50)); + EXPECT_TRUE(IsLocked()); // Lock should be released when we detach. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); frame_host_->DetachFromCompositor(); + EXPECT_FALSE(IsLocked()); } TEST_F(DelegatedFrameHostAndroidTest, TestBothCompositorLocks) { @@ -303,21 +289,18 @@ EXPECT_CALL(compositor_, IsDrawingFirstVisibleFrame()).WillOnce(Return(true)); EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(1); frame_host_->AttachToCompositor(&compositor_); + EXPECT_TRUE(IsLocked()); // Tell the frame host to resize, it should take a second lock. EXPECT_CALL(compositor_, DoGetCompositorLock(frame_host_.get(), _)) .WillOnce(Invoke(this, &DelegatedFrameHostAndroidTest::GetLock)); - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(true)) - .Times(0); frame_host_->PixelSizeWillChange(gfx::Size(50, 50)); + EXPECT_TRUE(IsLocked()); // Submit a compositor frame of the right size, both locks should release. - EXPECT_CALL(lock_manager_client_, OnCompositorLockStateChanged(false)) - .Times(1); SubmitCompositorFrame(gfx::Size(50, 50)); + EXPECT_FALSE(IsLocked()); } } // namespace
diff --git a/ui/android/java/src/org/chromium/ui/AsyncViewProvider.java b/ui/android/java/src/org/chromium/ui/AsyncViewProvider.java index 25da211..a979cf2 100644 --- a/ui/android/java/src/org/chromium/ui/AsyncViewProvider.java +++ b/ui/android/java/src/org/chromium/ui/AsyncViewProvider.java
@@ -15,7 +15,7 @@ * an {@link AsyncViewStub}. * @param <T> type of the {@link View} that this provider encapsulates. */ -public class AsyncViewProvider<T extends View> implements Callback<View> { +public class AsyncViewProvider<T extends View> implements Callback<View>, ViewProvider<T> { private int mResId; // Exactly one of mView and mViewStub is non-null at any point. private T mView; @@ -103,11 +103,12 @@ return of(mViewStub, resId); } - /** - * Add a callback that would be run (on the UI thread) once the {@link View} encapsulated by - * this provider is inflated. The callback runs immediately (blocking) if the view has - * already been inflated. - */ + @Override + public void inflate() { + mViewStub.inflate(); + } + + @Override public void whenLoaded(Callback<T> callback) { ThreadUtils.assertOnUiThread(); if (mDestroyed) return;
diff --git a/ui/android/java/src/org/chromium/ui/AsyncViewStub.java b/ui/android/java/src/org/chromium/ui/AsyncViewStub.java index 9451822..99e13eb 100644 --- a/ui/android/java/src/org/chromium/ui/AsyncViewStub.java +++ b/ui/android/java/src/org/chromium/ui/AsyncViewStub.java
@@ -32,6 +32,7 @@ private static AsyncLayoutInflater sAsyncLayoutInflater; private final ObserverList<Callback<View>> mListeners = new ObserverList<>(); + private boolean mOnBackground; public AsyncViewStub(Context context, AttributeSet attrs) { super(context, attrs); @@ -48,7 +49,7 @@ } /** - * Specifies the layout resource to inflate when {@link #inflate(boolean)} is invoked. The View + * Specifies the layout resource to inflate when {@link #inflate()} is invoked. The View * created by inflating the layout resource is used to replace this AsyncViewStub in its parent. * * @param layoutResource A valid layout resource identifier (different from 0.) @@ -79,17 +80,15 @@ /** * Starts background inflation for the stub, the AsyncViewStub must be attached to the window * (ie have a parent) before you call inflate on it. Must be called on the UI thread. - * @param onBackgroundThread if inflation should be tried on a background thread first, this is - * used for A/B testing. */ - public void inflate(boolean onBackgroundThread) { + public void inflate() { try (TraceEvent te = TraceEvent.scoped("AsyncViewStub.inflate")) { ThreadUtils.assertOnUiThread(); final ViewParent viewParent = getParent(); assert viewParent != null; assert viewParent instanceof ViewGroup; assert mLayoutResource != 0; - if (onBackgroundThread) { + if (mOnBackground) { // AsyncLayoutInflater uses its own thread and cannot inflate <merge> elements. It // might be a good idea to write our own version to use our scheduling primitives // and to handle <merge> inflations. @@ -150,4 +149,15 @@ } } } + + /** + * Sets whether the view should be inflated on a background thread or the UI thread (the + * default). This method should not be called after the view has been inflated. + * @param shouldInflateOnBackgroundThread True if the view should be inflated on a background + * thread, false otherwise. + */ + public void setShouldInflateOnBackgroundThread(boolean shouldInflateOnBackgroundThread) { + assert mInflatedView == null; + mOnBackground = shouldInflateOnBackgroundThread; + } }
diff --git a/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java b/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java index 67e7d52..52c15242 100644 --- a/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java +++ b/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java
@@ -19,7 +19,7 @@ /** * Called when the user has selected an action. For possible actions see above. * - * @param contacts The contacts that were selected. + * @param contacts The contacts that were selected (string contains json format). */ - void onContactsPickerUserAction(ContactsPickerAction action, String[] contacts); + void onContactsPickerUserAction(ContactsPickerAction action, String contacts); }
diff --git a/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java b/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java new file mode 100644 index 0000000..9c350b8 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java
@@ -0,0 +1,42 @@ +// 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.ui; + +import android.view.View; +import android.view.ViewStub; + +import org.chromium.base.Callback; +import org.chromium.base.Promise; + +/** + * View provider that inflates a ViewStub. This does not support inflation on a background thread, + * therefore {@link AsyncViewProvider} should be preferred. + * @param <T> The view type. + */ +public class DeferredViewStubInflationProvider<T extends View> implements ViewProvider<T> { + private final ViewStub mViewStub; + private Promise<T> mViewPromise = new Promise<>(); + + @SuppressWarnings("unchecked") + public DeferredViewStubInflationProvider(ViewStub viewStub) { + mViewStub = viewStub; + mViewStub.setOnInflateListener((stub, inflated) -> { mViewPromise.fulfill((T) inflated); }); + } + + @Override + public void inflate() { + mViewStub.inflate(); + } + + @Override + public void whenLoaded(Callback<T> callback) { + if (mViewPromise.isFulfilled()) { + callback.onResult(mViewPromise.getResult()); + return; + } + + mViewPromise.then(callback); + } +}
diff --git a/ui/android/java/src/org/chromium/ui/ViewProvider.java b/ui/android/java/src/org/chromium/ui/ViewProvider.java new file mode 100644 index 0000000..5d820c7 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/ViewProvider.java
@@ -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. + +package org.chromium.ui; + +import android.view.View; + +import org.chromium.base.Callback; + +/** + * Interface to support asynchronous inflation of views. + * @param <T> The view type. + */ +public interface ViewProvider<T extends View> { + /** + * Starts inflating the view. + */ + void inflate(); + + /** + * Add a callback that would be run (on the UI thread) once the {@link View} encapsulated by + * this provider is inflated. The callback runs immediately (blocking) if the view has + * already been inflated. + */ + void whenLoaded(Callback<T> callback); +}
diff --git a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java index a7bf215..f382d7f 100644 --- a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java +++ b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
@@ -431,7 +431,7 @@ } @Override - public void onContactsPickerUserAction(ContactsPickerAction action, String[] contacts) { + public void onContactsPickerUserAction(ContactsPickerAction action, String contacts) { switch (action) { case CANCEL: onFileNotSelected();
diff --git a/ui/android/junit/src/org/chromium/ui/AsyncViewProviderTest.java b/ui/android/junit/src/org/chromium/ui/AsyncViewProviderTest.java index 17c07a0..37e04ef6 100644 --- a/ui/android/junit/src/org/chromium/ui/AsyncViewProviderTest.java +++ b/ui/android/junit/src/org/chromium/ui/AsyncViewProviderTest.java
@@ -50,6 +50,7 @@ .inflate(MAIN_LAYOUT_RESOURCE_ID, null); mAsyncViewStub = mRoot.findViewById(STUB_ID); mAsyncViewStub.setLayoutResource(INFLATE_LAYOUT_RESOURCE_ID); + mAsyncViewStub.setShouldInflateOnBackgroundThread(true); mAsyncViewProvider = AsyncViewProvider.of(mAsyncViewStub, INFLATED_VIEW_ID); mAsyncViewStub.setId(STUB_ID); mEventCount.set(0); @@ -63,7 +64,7 @@ @Test public void testCreatesLoadedProviderIfInflated() { - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); AsyncViewProvider provider = AsyncViewProvider.of(mAsyncViewStub, INFLATED_VIEW_ID); assertNotNull(provider.get()); @@ -77,7 +78,7 @@ @Test public void testCreatesLoadedProviderUsingResourceIds() { - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); AsyncViewProvider provider = AsyncViewProvider.of(mRoot, STUB_ID, INFLATED_VIEW_ID); assertNotNull(provider.get()); @@ -92,7 +93,7 @@ @Test public void testRunsCallbackImmediatelyIfLoaded() { - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); AsyncViewProvider<View> provider = AsyncViewProvider.of(mAsyncViewStub, INFLATED_VIEW_ID); assertEquals(mEventCount.get(), 0); @@ -108,7 +109,7 @@ assertTrue(ThreadUtils.runningOnUiThread()); mEventCount.incrementAndGet(); }); - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); // ensure callback gets called. assertEquals(mEventCount.get(), 1); @@ -123,7 +124,7 @@ mAsyncViewProvider.whenLoaded( (View v) -> { assertEquals(mEventCount.decrementAndGet(), 1); }); assertEquals(mEventCount.get(), 0); - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); assertEquals(mEventCount.get(), 1); }
diff --git a/ui/android/junit/src/org/chromium/ui/AsyncViewStubTest.java b/ui/android/junit/src/org/chromium/ui/AsyncViewStubTest.java index 4f343d8f..4c3e9d8 100644 --- a/ui/android/junit/src/org/chromium/ui/AsyncViewStubTest.java +++ b/ui/android/junit/src/org/chromium/ui/AsyncViewStubTest.java
@@ -43,6 +43,7 @@ .inflate(MAIN_LAYOUT_RESOURCE_ID, null); mAsyncViewStub = mainView.findViewById(STUB_ID); mAsyncViewStub.setLayoutResource(INFLATE_LAYOUT_RESOURCE_ID); + mAsyncViewStub.setShouldInflateOnBackgroundThread(true); mEventCount.set(0); } @@ -52,7 +53,7 @@ assertTrue(ThreadUtils.runningOnUiThread()); mEventCount.incrementAndGet(); }); - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); // ensure callback gets called. assertEquals(mEventCount.get(), 1); @@ -67,7 +68,7 @@ mAsyncViewStub.addOnInflateListener( (View v) -> { assertEquals(mEventCount.decrementAndGet(), 1); }); assertEquals(mEventCount.get(), 0); - mAsyncViewStub.inflate(true); + mAsyncViewStub.inflate(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); assertEquals(mEventCount.get(), 1); }
diff --git a/ui/aura/hit_test_data_provider_aura_unittest.cc b/ui/aura/hit_test_data_provider_aura_unittest.cc index b120625..fd072153 100644 --- a/ui/aura/hit_test_data_provider_aura_unittest.cc +++ b/ui/aura/hit_test_data_provider_aura_unittest.cc
@@ -28,15 +28,15 @@ // | ---------- | // | hit hit | // ---------------------- -class TestHoleWindowTargeter : public aura::WindowTargeter { +class TestHoleWindowTargeter : public WindowTargeter { public: TestHoleWindowTargeter() = default; ~TestHoleWindowTargeter() override {} private: - // aura::WindowTargeter: - std::unique_ptr<aura::WindowTargeter::HitTestRects> GetExtraHitTestShapeRects( - aura::Window* target) const override { + // WindowTargeter: + std::unique_ptr<WindowTargeter::HitTestRects> GetExtraHitTestShapeRects( + Window* target) const override { gfx::Rect bounds = target->bounds(); int x0 = 0; int x1 = bounds.width() / 3; @@ -46,7 +46,7 @@ int y1 = bounds.height() / 3; int y2 = bounds.height() - bounds.height() / 3; int y3 = bounds.height(); - auto shape_rects = std::make_unique<aura::WindowTargeter::HitTestRects>(); + auto shape_rects = std::make_unique<WindowTargeter::HitTestRects>(); shape_rects->emplace_back(x0, y0, bounds.width(), y1 - y0); shape_rects->emplace_back(x0, y1, x1 - x0, y2 - y1); shape_rects->emplace_back(x2, y1, x3 - x2, y2 - y1); @@ -73,23 +73,23 @@ test::AuraTestBaseMus::SetUp(); root_ = std::make_unique<Window>(nullptr); - root_->SetProperty(aura::client::kEmbedType, - aura::client::WindowEmbedType::EMBED_IN_OWNER); + root_->SetProperty(client::kEmbedType, + client::WindowEmbedType::EMBED_IN_OWNER); root_->Init(ui::LAYER_NOT_DRAWN); root_->SetEventTargeter(std::make_unique<WindowTargeter>()); root_->SetBounds(gfx::Rect(0, 0, 300, 200)); root_->Show(); window2_ = new Window(nullptr); - window2_->SetProperty(aura::client::kEmbedType, - aura::client::WindowEmbedType::EMBED_IN_OWNER); + window2_->SetProperty(client::kEmbedType, + client::WindowEmbedType::EMBED_IN_OWNER); window2_->Init(ui::LAYER_TEXTURED); window2_->SetBounds(gfx::Rect(20, 30, 40, 60)); window2_->Show(); window3_ = new Window(nullptr); - window3_->SetProperty(aura::client::kEmbedType, - aura::client::WindowEmbedType::EMBED_IN_OWNER); + window3_->SetProperty(client::kEmbedType, + client::WindowEmbedType::EMBED_IN_OWNER); window3_->Init(ui::LAYER_TEXTURED); window3_->SetEventTargeter(std::make_unique<WindowTargeter>()); window3_->SetBounds(gfx::Rect(50, 60, 100, 40)); @@ -175,10 +175,14 @@ TEST_F(HitTestDataProviderAuraTest, CustomTargeter) { constexpr int kMouseInset = -5; constexpr int kTouchInset = -10; - auto targeter = std::make_unique<aura::WindowTargeter>(); + auto targeter = std::make_unique<WindowTargeter>(); targeter->SetInsets(gfx::Insets(kMouseInset), gfx::Insets(kTouchInset)); window3()->SetEventTargeter(std::move(targeter)); + targeter = std::make_unique<WindowTargeter>(); + targeter->SetInsets(gfx::Insets(kMouseInset), gfx::Insets(kTouchInset)); + window4()->SetEventTargeter(std::move(targeter)); + window2()->SetEmbedFrameSinkId(viz::FrameSinkId(1, 2)); const base::Optional<viz::HitTestRegionList> hit_test_data = hit_test_data_provider()->GetHitTestData(compositor_frame_);
diff --git a/ui/aura/mus/property_converter.cc b/ui/aura/mus/property_converter.cc index 51cd00e1..78c4fcb 100644 --- a/ui/aura/mus/property_converter.cc +++ b/ui/aura/mus/property_converter.cc
@@ -108,6 +108,9 @@ client::kAnimationsDisabledKey, ws::mojom::WindowManager::kAnimationsDisabled_Property, CreateAcceptAnyValueCallback()); + RegisterWindowPtrProperty( + client::kChildModalParentKey, + ws::mojom::WindowManager::kChildModalParent_Property); } PropertyConverter::~PropertyConverter() {} @@ -171,6 +174,14 @@ return true; } + // window_ptr_properties_ aren't processed here since Window* values aren't + // transferrable. A post processing step in WindowTree and WindowTreeClient + // takes care of the conversion. + if (IsWindowPtrPropertyRegistered( + static_cast<const WindowProperty<Window*>*>(key))) { + return true; + } + // Handle primitive property types generically. DCHECK_GT(primitive_properties_.count(key), 0u); PrimitiveType default_value = primitive_properties_[key].default_value; @@ -210,6 +221,10 @@ if (unguessable_token_properties_.count(unguessable_token_key) > 0) return unguessable_token_properties_[unguessable_token_key]; + auto* window_ptr_key = static_cast<const WindowProperty<Window*>*>(key); + if (window_ptr_properties_.count(window_ptr_key) > 0) + return window_ptr_properties_[window_ptr_key]; + return std::string(); } @@ -307,6 +322,17 @@ } } + // window_ptr_properties_ aren't processed here since Window* values aren't + // transferrable. A post processing step in WindowTree and WindowTreeClient + // takes care of the conversion. + for (const auto& window_ptr_property : window_ptr_properties_) { + if (window_ptr_property.second == transport_name) { + LOG(ERROR) << transport_name << " is a registered window property but " + << "should not be processed here."; + return; + } + } + DVLOG(2) << "Unknown mus property name: " << transport_name; } @@ -388,6 +414,29 @@ transport_names_.insert(transport_name); } +void PropertyConverter::RegisterWindowPtrProperty( + const WindowProperty<Window*>* property, + const char* transport_name) { + DCHECK(!IsTransportNameRegistered(transport_name)) + << "Property already registered: " << transport_name; + window_ptr_properties_[property] = transport_name; + transport_names_.insert(transport_name); +} + +const WindowProperty<Window*>* PropertyConverter::GetWindowPtrProperty( + const std::string& transport_name) const { + for (const auto& iter : window_ptr_properties_) { + if (transport_name == iter.second) + return iter.first; + } + return nullptr; +} + +bool PropertyConverter::IsWindowPtrPropertyRegistered( + const WindowProperty<Window*>* property) const { + return window_ptr_properties_.find(property) != window_ptr_properties_.end(); +} + base::flat_map<std::string, std::vector<uint8_t>> PropertyConverter::GetTransportProperties(Window* window) { base::flat_map<std::string, std::vector<uint8_t>> properties;
diff --git a/ui/aura/mus/property_converter.h b/ui/aura/mus/property_converter.h index 8d13b202..01fc9436 100644 --- a/ui/aura/mus/property_converter.h +++ b/ui/aura/mus/property_converter.h
@@ -114,6 +114,17 @@ void RegisterUnguessableTokenProperty( const WindowProperty<base::UnguessableToken*>* property, const char* transport_name); + void RegisterWindowPtrProperty(const WindowProperty<Window*>* property, + const char* transport_name); + + // Returns the window property key of Window* value which is registered with + // the transport_name. If the name is not registered or registered with a + // different type, returns nullptr. + const WindowProperty<Window*>* GetWindowPtrProperty( + const std::string& transport_name) const; + + bool IsWindowPtrPropertyRegistered( + const WindowProperty<Window*>* property) const; // Get a flat map of the window's registered properties, to use for transport. base::flat_map<std::string, std::vector<uint8_t>> GetTransportProperties( @@ -151,6 +162,7 @@ string16_properties_; std::map<const WindowProperty<base::UnguessableToken*>*, const char*> unguessable_token_properties_; + std::map<const WindowProperty<Window*>*, const char*> window_ptr_properties_; // Set of transport names supplied to RegisterProperty(). std::set<std::string> transport_names_;
diff --git a/ui/aura/mus/property_converter_unittest.cc b/ui/aura/mus/property_converter_unittest.cc index 50838071..6c246616 100644 --- a/ui/aura/mus/property_converter_unittest.cc +++ b/ui/aura/mus/property_converter_unittest.cc
@@ -53,6 +53,9 @@ DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(base::string16, kTestString16PropertyKey, nullptr); +DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kTestWindowPtrPropertyKey, nullptr); +DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kTestWindowPtrUnregisteredKey, nullptr); + const char kTestPropertyServerKey0[] = "test-property-server0"; const char kTestPropertyServerKey1[] = "test-property-server1"; const char kTestPropertyServerKey2[] = "test-property-server2"; @@ -69,6 +72,8 @@ const char kTestSizePropertyServerKey[] = "test-size-property-server"; const char kTestStringPropertyServerKey[] = "test-string-property-server"; const char kTestString16PropertyServerKey[] = "test-string16-property-server"; +const char kTestWindowPtrPropertyServerKey[] = + "test-window-ptr-property-server"; // Test registration, naming and value conversion for primitive property types. template <typename T> @@ -369,4 +374,47 @@ EXPECT_EQ(value_2, *window->GetProperty(kTestString16PropertyKey)); } +TEST_F(PropertyConverterTest, WindowPtrProperty) { + PropertyConverter property_converter; + property_converter.RegisterString16Property(kTestString16PropertyKey, + kTestString16PropertyServerKey); + property_converter.RegisterWindowPtrProperty(kTestWindowPtrPropertyKey, + kTestWindowPtrPropertyServerKey); + EXPECT_EQ(kTestWindowPtrPropertyServerKey, + property_converter.GetTransportNameForPropertyKey( + kTestWindowPtrPropertyKey)); + EXPECT_TRUE(property_converter.IsTransportNameRegistered( + kTestWindowPtrPropertyServerKey)); + + EXPECT_TRUE(property_converter.IsWindowPtrPropertyRegistered( + kTestWindowPtrPropertyKey)); + EXPECT_EQ(kTestWindowPtrPropertyKey, property_converter.GetWindowPtrProperty( + kTestWindowPtrPropertyServerKey)); + EXPECT_FALSE(property_converter.IsWindowPtrPropertyRegistered( + kTestWindowPtrUnregisteredKey)); + EXPECT_FALSE( + property_converter.GetWindowPtrProperty(kTestString16PropertyServerKey)); + + std::unique_ptr<Window> window1( + CreateNormalWindow(1, root_window(), nullptr)); + std::unique_ptr<Window> window2( + CreateNormalWindow(2, root_window(), nullptr)); + window1->SetProperty(kTestWindowPtrPropertyKey, window2.get()); + + std::string transport_name_out; + std::unique_ptr<std::vector<uint8_t>> transport_value_out; + EXPECT_TRUE(property_converter.ConvertPropertyForTransport( + window1.get(), kTestWindowPtrPropertyKey, &transport_name_out, + &transport_value_out)); + EXPECT_EQ(kTestWindowPtrPropertyServerKey, transport_name_out); + EXPECT_FALSE(transport_value_out); + + window1->ClearProperty(kTestWindowPtrPropertyKey); + std::vector<uint8_t> transport_value = mojo::ConvertTo<std::vector<uint8_t>>( + reinterpret_cast<uint64_t>(window2.get())); + property_converter.SetPropertyFromTransportValue( + window1.get(), kTestWindowPtrPropertyServerKey, &transport_value); + EXPECT_FALSE(window1->GetProperty(kTestWindowPtrPropertyKey)); +} + } // namespace aura
diff --git a/ui/aura/mus/window_port_mus.cc b/ui/aura/mus/window_port_mus.cc index 9db9865..c3b5573 100644 --- a/ui/aura/mus/window_port_mus.cc +++ b/ui/aura/mus/window_port_mus.cc
@@ -85,8 +85,9 @@ window_tree_client_->SetCanAcceptDrops(this, can_accept_drops); } -void WindowPortMus::SetHitTestMask(const base::Optional<gfx::Rect>& mask) { - window_tree_client_->SetHitTestMask(this, mask); +void WindowPortMus::SetHitTestInsets(const gfx::Insets& mouse, + const gfx::Insets& touch) { + window_tree_client_->SetHitTestInsets(this, mouse, touch); } void WindowPortMus::Embed(ws::mojom::WindowTreeClientPtr client,
diff --git a/ui/aura/mus/window_port_mus.h b/ui/aura/mus/window_port_mus.h index e6ec469..fa0629cf 100644 --- a/ui/aura/mus/window_port_mus.h +++ b/ui/aura/mus/window_port_mus.h
@@ -87,7 +87,7 @@ void SetCanAcceptDrops(bool can_accept_drops); // See description in mojom for details on this. - void SetHitTestMask(const base::Optional<gfx::Rect>& mask); + void SetHitTestInsets(const gfx::Insets& mouse, const gfx::Insets& touch); // Embeds a new client in this Window. See WindowTreeClient::Embed() for // details on arguments.
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc index 517bd13..d76cdbe 100644 --- a/ui/aura/mus/window_tree_client.cc +++ b/ui/aura/mus/window_tree_client.cc
@@ -121,7 +121,7 @@ } bool IsInternalProperty(const void* key) { - return key == client::kModalKey || key == client::kChildModalParentKey; + return key == client::kModalKey; } // Create and return a MouseEvent or TouchEvent from |event| if |event| is a @@ -273,11 +273,11 @@ tree_->SetImeVisibility(window->server_id(), visible, std::move(state)); } -void WindowTreeClient::SetHitTestMask( - WindowMus* window, - const base::Optional<gfx::Rect>& mask_rect) { +void WindowTreeClient::SetHitTestInsets(WindowMus* window, + const gfx::Insets& mouse, + const gfx::Insets& touch) { DCHECK(tree_); - tree_->SetHitTestMask(window->server_id(), mask_rect); + tree_->SetHitTestInsets(window->server_id(), mouse, touch); } void WindowTreeClient::Embed(Window* window, @@ -601,18 +601,6 @@ window->GetWindow()->GetProperty(client::kModalKey)); return true; } - if (key == client::kChildModalParentKey) { - const uint32_t change_id = - ScheduleInFlightChange(std::make_unique<CrashInFlightChange>( - window, ChangeType::CHILD_MODAL_PARENT)); - Window* child_modal_parent = - window->GetWindow()->GetProperty(client::kChildModalParentKey); - tree_->SetChildModalParent( - change_id, window->server_id(), - child_modal_parent ? WindowMus::Get(child_modal_parent)->server_id() - : kInvalidServerId); - return true; - } return false; } @@ -904,13 +892,24 @@ WindowPortPropertyDataMus* data_mus = static_cast<WindowPortPropertyDataMus*>(data.get()); + PropertyConverter* property_converter = delegate_->GetPropertyConverter(); std::string transport_name; std::unique_ptr<std::vector<uint8_t>> transport_value; - if (!delegate_->GetPropertyConverter()->ConvertPropertyForTransport( + if (!property_converter->ConvertPropertyForTransport( window->GetWindow(), key, &transport_name, &transport_value)) { return; } DCHECK_EQ(transport_name, data_mus->transport_name); + const auto* window_ptr_key = static_cast<const WindowProperty<Window*>*>(key); + if (property_converter->IsWindowPtrPropertyRegistered(window_ptr_key)) { + DCHECK(!transport_value); + Window* value = window->GetWindow()->GetProperty(window_ptr_key); + WindowMus* window_mus = WindowMus::Get(value); + if (window_mus) { + transport_value = std::make_unique<std::vector<uint8_t>>( + mojo::ConvertTo<std::vector<uint8_t>>(window_mus->server_id())); + } + } base::Optional<std::vector<uint8_t>> transport_value_mojo; if (transport_value)
diff --git a/ui/aura/mus/window_tree_client.h b/ui/aura/mus/window_tree_client.h index f4d0931..4963397 100644 --- a/ui/aura/mus/window_tree_client.h +++ b/ui/aura/mus/window_tree_client.h
@@ -136,7 +136,9 @@ void SetImeVisibility(WindowMus* window, bool visible, ui::mojom::TextInputStatePtr state); - void SetHitTestMask(WindowMus* window, const base::Optional<gfx::Rect>& rect); + void SetHitTestInsets(WindowMus* window, + const gfx::Insets& mouse, + const gfx::Insets& touch); // Embeds a new client in |window|. |flags| is a bitmask of the values defined // by kEmbedFlag*; 0 gives default behavior. |callback| is called to indicate
diff --git a/ui/aura/mus/window_tree_client_unittest.cc b/ui/aura/mus/window_tree_client_unittest.cc index e8c841c..1b3e2e5 100644 --- a/ui/aura/mus/window_tree_client_unittest.cc +++ b/ui/aura/mus/window_tree_client_unittest.cc
@@ -68,10 +68,12 @@ DEFINE_UI_CLASS_PROPERTY_KEY(uint8_t, kTestPropertyKey1, 0); DEFINE_UI_CLASS_PROPERTY_KEY(uint16_t, kTestPropertyKey2, 0); DEFINE_UI_CLASS_PROPERTY_KEY(bool, kTestPropertyKey3, false); +DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kTestPropertyKey4, nullptr); const char kTestPropertyServerKey1[] = "test-property-server1"; const char kTestPropertyServerKey2[] = "test-property-server2"; const char kTestPropertyServerKey3[] = "test-property-server3"; +const char kTestPropertyServerKey4[] = "test-property-server4"; ws::Id server_id(Window* window) { return window ? WindowMus::Get(window)->server_id() : 0; @@ -113,6 +115,8 @@ converter->RegisterPrimitiveProperty( kTestPropertyKey3, kTestPropertyServerKey3, PropertyConverter::CreateAcceptAnyValueCallback()); + converter->RegisterWindowPtrProperty(kTestPropertyKey4, + kTestPropertyServerKey4); } // Convert a primitive aura property value to a mus transport value. @@ -800,6 +804,26 @@ EXPECT_EQ(example, *root_window()->GetProperty(client::kNameKey)); } +TEST_F(WindowTreeClientTest, SetWindowPointerProperty) { + PropertyConverter* property_converter = GetPropertyConverter(); + RegisterTestProperties(property_converter); + + Window window(nullptr); + window.Init(ui::LAYER_NOT_DRAWN); + window.Show(); + root_window()->SetProperty(kTestPropertyKey4, &window); + base::Optional<std::vector<uint8_t>> value = + window_tree()->GetLastPropertyValue(); + ASSERT_TRUE(value.has_value()); + EXPECT_EQ(WindowMus::Get(&window)->server_id(), + mojo::ConvertTo<ws::Id>(*value)); + window_tree()->AckAllChanges(); + + root_window()->ClearProperty(kTestPropertyKey4); + value = window_tree()->GetLastPropertyValue(); + EXPECT_FALSE(value.has_value()); +} + // Verifies visible is reverted if the server replied that the change failed. TEST_F(WindowTreeClientTest, SetVisibleFailed) { const bool original_visible = root_window()->TargetVisibility();
diff --git a/ui/aura/mus/window_tree_host_mus_unittest.cc b/ui/aura/mus/window_tree_host_mus_unittest.cc index 39a7302..68aa0776 100644 --- a/ui/aura/mus/window_tree_host_mus_unittest.cc +++ b/ui/aura/mus/window_tree_host_mus_unittest.cc
@@ -23,22 +23,6 @@ EXPECT_EQ(new_insets, window_tree()->last_client_area()); } -TEST_F(WindowTreeHostMusTest, SetHitTestMask) { - std::unique_ptr<WindowTreeHostMus> window_tree_host_mus = - std::make_unique<WindowTreeHostMus>( - CreateInitParamsForTopLevel(window_tree_client_impl())); - - EXPECT_FALSE(window_tree()->last_hit_test_mask().has_value()); - gfx::Rect mask(10, 10, 10, 10); - WindowPortMus::Get(window_tree_host_mus->window())->SetHitTestMask(mask); - ASSERT_TRUE(window_tree()->last_hit_test_mask().has_value()); - EXPECT_EQ(mask, window_tree()->last_hit_test_mask()); - - WindowPortMus::Get(window_tree_host_mus->window()) - ->SetHitTestMask(base::nullopt); - ASSERT_FALSE(window_tree()->last_hit_test_mask().has_value()); -} - TEST_F(WindowTreeHostMusTest, PerformWmAction) { std::unique_ptr<WindowTreeHostMus> window_tree_host_mus = std::make_unique<WindowTreeHostMus>(
diff --git a/ui/aura/test/mus/test_window_tree.cc b/ui/aura/test/mus/test_window_tree.cc index 025d20d..ffc5bea94 100644 --- a/ui/aura/test/mus/test_window_tree.cc +++ b/ui/aura/test/mus/test_window_tree.cc
@@ -185,9 +185,11 @@ last_client_area_ = insets; } -void TestWindowTree::SetHitTestMask(ws::Id window_id, - const base::Optional<gfx::Rect>& mask) { - last_hit_test_mask_ = mask; +void TestWindowTree::SetHitTestInsets(ws::Id window_id, + const gfx::Insets& mouse, + const gfx::Insets& touch) { + last_mouse_hit_test_insets_ = mouse; + last_touch_hit_test_insets_ = touch; } void TestWindowTree::SetCanAcceptDrops(ws::Id window_id, bool accepts_drops) {} @@ -251,10 +253,6 @@ OnChangeReceived(change_id, WindowTreeChangeType::MODAL); } -void TestWindowTree::SetChildModalParent(uint32_t change_id, - ws::Id window_id, - ws::Id parent_window_id) {} - void TestWindowTree::ReorderWindow(uint32_t change_id, ws::Id window_id, ws::Id relative_window_id,
diff --git a/ui/aura/test/mus/test_window_tree.h b/ui/aura/test/mus/test_window_tree.h index 4def10f5f..03df792 100644 --- a/ui/aura/test/mus/test_window_tree.h +++ b/ui/aura/test/mus/test_window_tree.h
@@ -101,8 +101,12 @@ const gfx::Insets& last_client_area() const { return last_client_area_; } - const base::Optional<gfx::Rect>& last_hit_test_mask() const { - return last_hit_test_mask_; + const gfx::Insets& last_mouse_hit_test_insets() const { + return last_mouse_hit_test_insets_; + } + + const gfx::Insets& last_touch_hit_test_insets() const { + return last_touch_hit_test_insets_; } const base::Optional<viz::LocalSurfaceId>& last_local_surface_id() const { @@ -149,8 +153,9 @@ const gfx::Insets& insets, const base::Optional<std::vector<gfx::Rect>>& additional_client_areas) override; - void SetHitTestMask(ws::Id window_id, - const base::Optional<gfx::Rect>& mask) override; + void SetHitTestInsets(ws::Id window_id, + const gfx::Insets& mouse, + const gfx::Insets& touch) override; void SetCanAcceptDrops(ws::Id window_id, bool accepts_drags) override; void SetWindowVisibility(uint32_t change_id, ws::Id window_id, @@ -177,9 +182,6 @@ void SetModalType(uint32_t change_id, ws::Id window_id, ui::ModalType modal_type) override; - void SetChildModalParent(uint32_t change_id, - ws::Id window_id, - ws::Id parent_window_id) override; void ReorderWindow(uint32_t change_id, ws::Id window_id, ws::Id relative_window_id, @@ -263,7 +265,8 @@ gfx::Insets last_client_area_; - base::Optional<gfx::Rect> last_hit_test_mask_; + gfx::Insets last_mouse_hit_test_insets_; + gfx::Insets last_touch_hit_test_insets_; base::Optional<viz::LocalSurfaceId> last_local_surface_id_;
diff --git a/ui/aura/window.cc b/ui/aura/window.cc index 3ebec72c..47827a13 100644 --- a/ui/aura/window.cc +++ b/ui/aura/window.cc
@@ -308,7 +308,11 @@ std::unique_ptr<WindowTargeter> Window::SetEventTargeter( std::unique_ptr<WindowTargeter> targeter) { std::unique_ptr<WindowTargeter> old_targeter = std::move(targeter_); + if (old_targeter) + old_targeter->OnInstalled(nullptr); targeter_ = std::move(targeter); + if (targeter_) + targeter_->OnInstalled(this); return old_targeter; }
diff --git a/ui/aura/window_targeter.cc b/ui/aura/window_targeter.cc index 9555a1d7..8ef6631 100644 --- a/ui/aura/window_targeter.cc +++ b/ui/aura/window_targeter.cc
@@ -10,6 +10,8 @@ #include "ui/aura/client/focus_client.h" #include "ui/aura/client/screen_position_client.h" #include "ui/aura/env.h" +#include "ui/aura/mus/window_port_mus.h" +#include "ui/aura/mus/window_tree_client.h" #include "ui/aura/window.h" #include "ui/aura/window_delegate.h" #include "ui/aura/window_event_dispatcher.h" @@ -20,6 +22,14 @@ #include "ui/events/event_target_iterator.h" namespace aura { +namespace { + +bool AreInsetsEmptyOrPositive(const gfx::Insets& insets) { + return insets.left() >= 0 && insets.right() >= 0 && insets.top() >= 0 && + insets.bottom() >= 0; +} + +} // namespace WindowTargeter::WindowTargeter() {} WindowTargeter::~WindowTargeter() {} @@ -60,11 +70,9 @@ if (mouse_extend_ == mouse_extend && touch_extend_ == touch_extend) return; - const gfx::Insets last_mouse_extend_ = mouse_extend_; - const gfx::Insets last_touch_extend_ = touch_extend_; mouse_extend_ = mouse_extend; touch_extend_ = touch_extend; - OnSetInsets(last_mouse_extend_, last_touch_extend_); + UpdateMusIfNecessary(); } Window* WindowTargeter::GetPriorityTargetInRootWindow( @@ -189,6 +197,11 @@ return nullptr; } +void WindowTargeter::OnInstalled(Window* window) { + window_ = window; + UpdateMusIfNecessary(); +} + Window* WindowTargeter::FindTargetForLocatedEvent(Window* window, ui::LocatedEvent* event) { if (!window->parent()) { @@ -278,12 +291,34 @@ return false; } -bool WindowTargeter::ShouldUseExtendedBounds(const aura::Window* window) const { - return true; +bool WindowTargeter::ShouldUseExtendedBounds(const aura::Window* w) const { + // window() is null when this is used as the default targeter (by + // WindowEventDispatcher). Insets should never be set in this case, so the + // return should not matter. + if (!window()) { + DCHECK(mouse_extend_.IsEmpty()); + DCHECK(touch_extend_.IsEmpty()); + return false; + } + + // Insets should only apply to the window. Subclasses may enforce other + // policies. + return window() == w; } -void WindowTargeter::OnSetInsets(const gfx::Insets& last_mouse_extend, - const gfx::Insets& last_touch_extend) {} +// TODO: this function should go away once https://crbug.com/879308 is fixed. +void WindowTargeter::UpdateMusIfNecessary() { + if (!window_ || window_->env()->mode() != Env::Mode::MUS) + return; + + // Negative insets are used solely to extend the hit-test region of child + // windows, which is not needed by code using MUS (negative insets are only + // used in the server). + if (AreInsetsEmptyOrPositive(mouse_extend_) && + AreInsetsEmptyOrPositive(touch_extend_)) { + WindowPortMus::Get(window_)->SetHitTestInsets(mouse_extend_, touch_extend_); + } +} Window* WindowTargeter::FindTargetForKeyEvent(Window* window, const ui::KeyEvent& key) {
diff --git a/ui/aura/window_targeter.h b/ui/aura/window_targeter.h index 5f38c48..3d251b8 100644 --- a/ui/aura/window_targeter.h +++ b/ui/aura/window_targeter.h
@@ -88,6 +88,12 @@ ui::Event* event) override; protected: + aura::Window* window() { return window_; } + const aura::Window* window() const { return window_; } + + // This is called by Window when the targeter is set on a window. + virtual void OnInstalled(Window* window); + // Same as FindTargetForEvent(), but used for positional events. The location // etc. of |event| are in |window|'s coordinate system. When finding the // target for the event, the targeter can mutate the |event| (e.g. change the @@ -114,22 +120,26 @@ // Returns true if the hit testing (GetHitTestRects()) should use the // extended bounds. - virtual bool ShouldUseExtendedBounds(const aura::Window* window) const; - - // Called after the hit-test area has been extended with SetInsets(). The - // supplied insets are the values before the call to SetInsets(). - virtual void OnSetInsets(const gfx::Insets& last_mouse_extend, - const gfx::Insets& last_touch_extend); + virtual bool ShouldUseExtendedBounds(const aura::Window* w) const; const gfx::Insets& mouse_extend() const { return mouse_extend_; } const gfx::Insets& touch_extend() const { return touch_extend_; } private: + // To call OnInstalled(). + friend class Window; + + void UpdateMusIfNecessary(); + Window* FindTargetForKeyEvent(Window* root_window, const ui::KeyEvent& event); Window* FindTargetForNonKeyEvent(Window* root_window, ui::Event* event); Window* FindTargetForLocatedEventRecursively(Window* root_window, ui::LocatedEvent* event); + // The Window this WindowTargeter is installed on. Null if not attached to a + // Window. + aura::Window* window_ = nullptr; + gfx::Insets mouse_extend_; gfx::Insets touch_extend_;
diff --git a/ui/aura/window_targeter_unittest.cc b/ui/aura/window_targeter_unittest.cc index daeb852..1085c08 100644 --- a/ui/aura/window_targeter_unittest.cc +++ b/ui/aura/window_targeter_unittest.cc
@@ -8,7 +8,9 @@ #include "base/macros.h" #include "ui/aura/scoped_window_targeter.h" +#include "ui/aura/test/aura_mus_test_base.h" #include "ui/aura/test/aura_test_base.h" +#include "ui/aura/test/mus/test_window_tree.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" #include "ui/display/display.h" @@ -332,4 +334,33 @@ WindowTargeterTest, ::testing::Values(Env::Mode::LOCAL, Env::Mode::MUS)); +using WindowTargeterMus = aura::test::AuraMusClientTestBase; + +TEST_F(WindowTargeterMus, SetInsets) { + aura::Window window(nullptr); + window.Init(ui::LAYER_NOT_DRAWN); + std::unique_ptr<WindowTargeter> window_targeter_ptr = + std::make_unique<WindowTargeter>(); + WindowTargeter* window_targeter = window_targeter_ptr.get(); + window.SetEventTargeter(std::move(window_targeter_ptr)); + const gfx::Insets insets1(1, 2, 3, 4); + const gfx::Insets insets2(11, 12, 13, 14); + window_targeter->SetInsets(insets1, insets2); + EXPECT_EQ(insets1, window_tree()->last_mouse_hit_test_insets()); + EXPECT_EQ(insets2, window_tree()->last_touch_hit_test_insets()); +} + +TEST_F(WindowTargeterMus, SetInsetsBeforeInstall) { + aura::Window window(nullptr); + window.Init(ui::LAYER_NOT_DRAWN); + std::unique_ptr<WindowTargeter> window_targeter = + std::make_unique<WindowTargeter>(); + const gfx::Insets insets1(1, 2, 3, 4); + const gfx::Insets insets2(11, 12, 13, 14); + window_targeter->SetInsets(insets1, insets2); + window.SetEventTargeter(std::move(window_targeter)); + EXPECT_EQ(insets1, window_tree()->last_mouse_hit_test_insets()); + EXPECT_EQ(insets2, window_tree()->last_touch_hit_test_insets()); +} + } // namespace aura
diff --git a/ui/base/clipboard/clipboard_util_mac.h b/ui/base/clipboard/clipboard_util_mac.h index 1c4ff0a..8eb8d80 100644 --- a/ui/base/clipboard/clipboard_util_mac.h +++ b/ui/base/clipboard/clipboard_util_mac.h
@@ -13,6 +13,10 @@ namespace ui { +// A publicly-used UTI for the name of a URL. It really should be in a system +// header but isn't. +UI_BASE_EXPORT extern NSString* const kUTTypeURLName; + class UI_BASE_EXPORT UniquePasteboard : public base::RefCounted<UniquePasteboard> { public:
diff --git a/ui/base/clipboard/clipboard_util_mac.mm b/ui/base/clipboard/clipboard_util_mac.mm index 0db36b8..1fb0a58 100644 --- a/ui/base/clipboard/clipboard_util_mac.mm +++ b/ui/base/clipboard/clipboard_util_mac.mm
@@ -10,10 +10,10 @@ namespace ui { +NSString* const kUTTypeURLName = @"public.url-name"; + namespace { NSString* const kWebURLsWithTitlesPboardType = @"WebURLsWithTitlesPboardType"; -NSString* const kPublicUrl = @"public.url"; -NSString* const kPublicUrlName = @"public.url-name"; // It's much more convenient to return an NSString than a // base::ScopedCFTypeRef<CFStringRef>, since the methods on NSPasteboardItem @@ -75,8 +75,8 @@ } [item setString:urlString forType:NSPasteboardTypeString]; - [item setString:urlString forType:kPublicUrl]; - [item setString:title forType:kPublicUrlName]; + [item setString:urlString forType:base::mac::CFToNSCast(kUTTypeURL)]; + [item setString:title forType:kUTTypeURLName]; return item; } @@ -104,12 +104,12 @@ //static NSString* ClipboardUtil::GetTitleFromPasteboardURL(NSPasteboard* pboard) { - return [pboard stringForType:kPublicUrlName]; + return [pboard stringForType:kUTTypeURLName]; } //static NSString* ClipboardUtil::GetURLFromPasteboardURL(NSPasteboard* pboard) { - return [pboard stringForType:kPublicUrl]; + return [pboard stringForType:base::mac::CFToNSCast(kUTTypeURL)]; } // static
diff --git a/ui/base/ime/chromeos/input_method_manager.h b/ui/base/ime/chromeos/input_method_manager.h index 33cd1748..4050381 100644 --- a/ui/base/ime/chromeos/input_method_manager.h +++ b/ui/base/ime/chromeos/input_method_manager.h
@@ -88,7 +88,12 @@ bool is_extra_input_options_enabled, bool is_emoji_enabled, bool is_handwriting_enabled, - bool is_voice_enabled){}; + bool is_voice_enabled) {} + + // Called when an input method extension is added or removed. + virtual void OnInputMethodExtensionAdded(const std::string& extension_id) {} + virtual void OnInputMethodExtensionRemoved( + const std::string& extension_id) {} }; // CandidateWindowObserver is notified of events related to the candidate @@ -349,6 +354,12 @@ // Gets the implementation of the keyboard controller. virtual ui::InputMethodKeyboardController* GetInputMethodKeyboardController() = 0; + + // Notifies an input method extension is added or removed. + virtual void NotifyInputMethodExtensionAdded( + const std::string& extension_id) = 0; + virtual void NotifyInputMethodExtensionRemoved( + const std::string& extension_id) = 0; }; } // namespace input_method
diff --git a/ui/base/ime/chromeos/mock_input_method_manager.cc b/ui/base/ime/chromeos/mock_input_method_manager.cc index 6c052e2..f39e3d9 100644 --- a/ui/base/ime/chromeos/mock_input_method_manager.cc +++ b/ui/base/ime/chromeos/mock_input_method_manager.cc
@@ -221,6 +221,12 @@ return this; } +void MockInputMethodManager::NotifyInputMethodExtensionAdded( + const std::string& extension_id) {} + +void MockInputMethodManager::NotifyInputMethodExtensionRemoved( + const std::string& extension_id) {} + bool MockInputMethodManager::DisplayVirtualKeyboard() { return false; }
diff --git a/ui/base/ime/chromeos/mock_input_method_manager.h b/ui/base/ime/chromeos/mock_input_method_manager.h index 1a120a7..6bd58cc 100644 --- a/ui/base/ime/chromeos/mock_input_method_manager.h +++ b/ui/base/ime/chromeos/mock_input_method_manager.h
@@ -119,6 +119,10 @@ void NotifyObserversImeExtraInputStateChange() override; ui::InputMethodKeyboardController* GetInputMethodKeyboardController() override; + void NotifyInputMethodExtensionAdded( + const std::string& extension_id) override; + void NotifyInputMethodExtensionRemoved( + const std::string& extension_id) override; // ui::InputMethodKeyboardController overrides. bool DisplayVirtualKeyboard() override;
diff --git a/ui/base/l10n/l10n_util_win.h b/ui/base/l10n/l10n_util_win.h index 876a944..75bfe5d 100644 --- a/ui/base/l10n/l10n_util_win.h +++ b/ui/base/l10n/l10n_util_win.h
@@ -70,7 +70,7 @@ // Retrieve the locale override, or an empty vector if the locale has not been // or failed to be overridden. -UI_BASE_EXPORT const std::vector<std::string>& GetLocaleOverrides(); +const std::vector<std::string>& GetLocaleOverrides(); } // namespace l10n_util
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 46db789..c70252f2 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -75,7 +75,7 @@ force_software_compositor_(force_software_compositor), layer_animator_collection_(this), is_pixel_canvas_(enable_pixel_canvas), - lock_manager_(task_runner, this), + lock_manager_(task_runner), context_creation_weak_ptr_factory_(this) { if (context_factory_private) { auto* host_frame_sink_manager = @@ -201,7 +201,7 @@ params.settings = &settings; params.main_task_runner = task_runner_; params.mutator_host = animation_host_.get(); - host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); + host_ = cc::LayerTreeHost::CreateSingleThreaded(this, std::move(params)); if (base::FeatureList::IsEnabled(features::kUiCompositorScrollWithLayers) && host_->GetInputHandler()) { @@ -648,10 +648,6 @@ host_->SetDebugState(debug_state); } -void Compositor::OnCompositorLockStateChanged(bool locked) { - host_->SetDeferCommits(locked); -} - void Compositor::RequestPresentationTimeForNextFrame( PresentationTimeCallback callback) { host_->RequestPresentationTimeForNextFrame(std::move(callback));
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index a974ea654..11a4db2 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -19,6 +19,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "cc/trees/element_id.h" +#include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_host_client.h" #include "cc/trees/layer_tree_host_single_thread_client.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" @@ -49,7 +50,6 @@ class Layer; class LayerTreeDebugState; class LayerTreeFrameSink; -class LayerTreeHost; class TaskGraphRunner; } @@ -207,7 +207,6 @@ // view hierarchy. class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient, public cc::LayerTreeHostSingleThreadClient, - public CompositorLockManagerClient, public viz::HostFrameSinkClient, public ExternalBeginFrameClient { public: @@ -376,7 +375,8 @@ CompositorLockClient* client, base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(kCompositorLockTimeoutMs)) { - return lock_manager_.GetCompositorLock(client, timeout); + return lock_manager_.GetCompositorLock(client, timeout, + host_->DeferCommits()); } // Registers a callback that is run when the next frame successfully makes it @@ -426,9 +426,6 @@ void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override; void OnFrameTokenChanged(uint32_t frame_token) override; - // CompositorLockManagerClient implementation. - void OnCompositorLockStateChanged(bool locked) override; - bool IsLocked() { return lock_manager_.IsLocked(); } void SetOutputIsSecure(bool output_is_secure);
diff --git a/ui/compositor/compositor_lock.cc b/ui/compositor/compositor_lock.cc index 02c609b..69a3477 100644 --- a/ui/compositor/compositor_lock.cc +++ b/ui/compositor/compositor_lock.cc
@@ -6,14 +6,13 @@ #include "base/bind.h" #include "base/stl_util.h" +#include "cc/trees/layer_tree_host.h" namespace ui { CompositorLockManager::CompositorLockManager( - scoped_refptr<base::SingleThreadTaskRunner> task_runner, - CompositorLockManagerClient* client) + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : task_runner_(std::move(task_runner)), - client_(client), weak_ptr_factory_(this), lock_timeout_weak_ptr_factory_(this) {} @@ -21,11 +20,12 @@ std::unique_ptr<CompositorLock> CompositorLockManager::GetCompositorLock( CompositorLockClient* client, - base::TimeDelta timeout) { + base::TimeDelta timeout, + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits) { // This uses the main WeakPtrFactory to break the connection from the lock to // the CompositorLockManager when the CompositorLockManager is destroyed. - auto lock = - std::make_unique<CompositorLock>(client, weak_ptr_factory_.GetWeakPtr()); + auto lock = std::make_unique<CompositorLock>( + client, weak_ptr_factory_.GetWeakPtr(), std::move(scoped_defer_commits)); bool was_empty = active_locks_.empty(); active_locks_.push_back(lock.get()); @@ -42,9 +42,6 @@ } } - if (was_empty) - client_->OnCompositorLockStateChanged(true); - if (should_extend_timeout) { // The timeout task uses an independent WeakPtrFactory that is invalidated // when all locks are ended to prevent the timeout from leaking into @@ -61,7 +58,6 @@ void CompositorLockManager::RemoveCompositorLock(CompositorLock* lock) { base::Erase(active_locks_, lock); if (active_locks_.empty()) { - client_->OnCompositorLockStateChanged(false); lock_timeout_weak_ptr_factory_.InvalidateWeakPtrs(); scheduled_timeout_ = base::TimeTicks(); } @@ -75,16 +71,22 @@ DCHECK(active_locks_.empty()); } -CompositorLock::CompositorLock(CompositorLockClient* client, - base::WeakPtr<CompositorLockManager> manager) - : client_(client), manager_(std::move(manager)) {} +CompositorLock::CompositorLock( + CompositorLockClient* client, + base::WeakPtr<CompositorLockManager> manager, + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits) + : client_(client), + scoped_defer_commits_(std::move(scoped_defer_commits)), + manager_(std::move(manager)) {} CompositorLock::~CompositorLock() { + scoped_defer_commits_ = nullptr; if (manager_) manager_->RemoveCompositorLock(this); } void CompositorLock::TimeoutLock() { + scoped_defer_commits_ = nullptr; manager_->RemoveCompositorLock(this); manager_ = nullptr; if (client_)
diff --git a/ui/compositor/compositor_lock.h b/ui/compositor/compositor_lock.h index 370724c..2f08a19 100644 --- a/ui/compositor/compositor_lock.h +++ b/ui/compositor/compositor_lock.h
@@ -12,6 +12,10 @@ #include "base/single_thread_task_runner.h" #include "ui/compositor/compositor_export.h" +namespace cc { +class ScopedDeferCommits; +} + namespace ui { class Compositor; @@ -27,22 +31,12 @@ virtual void CompositorLockTimedOut() = 0; }; -// Implemented by clients which are locked by a compositor lock. Used by the -// CompositorLockManager to notify their parent that lock state has changed. -class CompositorLockManagerClient { - public: - virtual ~CompositorLockManagerClient() {} - - // Called when the lock state changes. - virtual void OnCompositorLockStateChanged(bool locked) = 0; -}; - // A helper class used to manage compositor locks. Should be created/used by // classes which want to provide out compositor locking. class COMPOSITOR_EXPORT CompositorLockManager { public: - CompositorLockManager(scoped_refptr<base::SingleThreadTaskRunner> task_runner, - CompositorLockManagerClient* client); + CompositorLockManager( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~CompositorLockManager(); // Creates a compositor lock. Returns NULL if it is not possible to lock at @@ -50,7 +44,8 @@ // timeout is null, then no timeout is used. std::unique_ptr<CompositorLock> GetCompositorLock( CompositorLockClient* client, - base::TimeDelta timeout); + base::TimeDelta timeout, + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits); void set_allow_locks_to_extend_timeout(bool allowed) { allow_locks_to_extend_timeout_ = allowed; @@ -71,8 +66,6 @@ // The TaskRunner on which timeouts are run. scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - // A client which is notified about lock state changes. - CompositorLockManagerClient* client_ = nullptr; // The estimated time that the locks will timeout. base::TimeTicks scheduled_timeout_; // If true, the |scheduled_timeout_| might be recalculated and extended. @@ -99,8 +92,10 @@ // The |client| is informed about events from the CompositorLock. The // |delegate| is used to perform actual unlocking. If |timeout| is zero then // no timeout is scheduled, else a timeout is scheduled on the |task_runner|. - explicit CompositorLock(CompositorLockClient* client, - base::WeakPtr<CompositorLockManager> manager); + explicit CompositorLock( + CompositorLockClient* client, + base::WeakPtr<CompositorLockManager> manager, + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits); ~CompositorLock(); private: @@ -110,6 +105,7 @@ void TimeoutLock(); CompositorLockClient* const client_; + std::unique_ptr<cc::ScopedDeferCommits> scoped_defer_commits_; base::WeakPtr<CompositorLockManager> manager_; DISALLOW_COPY_AND_ASSIGN(CompositorLock);
diff --git a/ui/compositor/compositor_lock_unittest.cc b/ui/compositor/compositor_lock_unittest.cc index 6ca8cf8..4589fd6 100644 --- a/ui/compositor/compositor_lock_unittest.cc +++ b/ui/compositor/compositor_lock_unittest.cc
@@ -5,6 +5,7 @@ #include <stdint.h> #include "base/test/test_mock_time_task_runner.h" +#include "cc/trees/layer_tree_host.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/compositor/compositor_lock.h" @@ -16,15 +17,14 @@ namespace { // For tests that control time. -class CompositorLockTest : public testing::Test, - public ui::CompositorLockManagerClient { +class CompositorLockTest : public testing::Test { protected: CompositorLockTest() {} ~CompositorLockTest() override {} void SetUp() override { task_runner_ = new base::TestMockTimeTaskRunner; - lock_manager_ = std::make_unique<CompositorLockManager>(task_runner_, this); + lock_manager_ = std::make_unique<CompositorLockManager>(task_runner_); } base::TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); } @@ -33,11 +33,6 @@ void DestroyLockManager() { lock_manager_.reset(); } - // ui::CompositorLockManagerClient implementation. - void OnCompositorLockStateChanged(bool locked) override { - EXPECT_EQ(locked, lock_manager_->IsLocked()); - } - protected: scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; std::unique_ptr<CompositorLockManager> lock_manager_; @@ -59,7 +54,7 @@ { testing::StrictMock<MockCompositorLockClient> lock_client; // This lock has a timeout. - lock = lock_manager()->GetCompositorLock(&lock_client, timeout); + lock = lock_manager()->GetCompositorLock(&lock_client, timeout, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); EXPECT_CALL(lock_client, CompositorLockTimedOut()).Times(1); task_runner()->FastForwardBy(timeout); @@ -70,7 +65,8 @@ { testing::StrictMock<MockCompositorLockClient> lock_client; // This lock has no timeout. - lock = lock_manager()->GetCompositorLock(&lock_client, base::TimeDelta()); + lock = lock_manager()->GetCompositorLock(&lock_client, base::TimeDelta(), + nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); EXPECT_CALL(lock_client, CompositorLockTimedOut()).Times(0); task_runner()->FastForwardBy(timeout); @@ -87,8 +83,8 @@ base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(1); // Both locks are grabbed from the Compositor with a separate client. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout); - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout, nullptr); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // Both clients get notified of timeout. EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(1); @@ -108,11 +104,11 @@ // One lock is grabbed from the compositor with a client. The other // extends its lifetime past that of the first. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // This also locks the compositor and will do so past |lock1| ending. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout, nullptr); // |lock1| is destroyed, so it won't timeout but |lock2| will. lock1 = nullptr; @@ -134,12 +130,12 @@ base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(10); // The first lock has a short timeout. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // The second lock has a longer timeout, but since a lock is active, // the first one is used for both. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(1); EXPECT_CALL(lock_client2, CompositorLockTimedOut()).Times(1); @@ -158,13 +154,13 @@ base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(10); // The first lock has a short timeout. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // Allow locks to extend timeout. lock_manager()->set_allow_locks_to_extend_timeout(true); // The second lock has a longer timeout, so the second one is used for both. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); lock_manager()->set_allow_locks_to_extend_timeout(false); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(0); @@ -190,7 +186,7 @@ base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(10); // The first lock has a short timeout. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); base::TimeDelta time_elapse = base::TimeDelta::FromMilliseconds(1); @@ -201,7 +197,7 @@ lock_manager()->set_allow_locks_to_extend_timeout(true); // The second lock has a longer timeout, so the second one is used for both // and start from the time second lock created. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); lock_manager()->set_allow_locks_to_extend_timeout(false); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(0); @@ -227,13 +223,13 @@ base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(1); // The first lock has a longer timeout. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // Allow locks to extend timeout. lock_manager()->set_allow_locks_to_extend_timeout(true); // The second lock has a short timeout, so the first one is used for both. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); lock_manager()->set_allow_locks_to_extend_timeout(false); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(0); @@ -258,7 +254,7 @@ base::TimeDelta timeout1 = base::TimeDelta::FromMilliseconds(1); base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(10); - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(1); EXPECT_CALL(lock_client2, CompositorLockTimedOut()).Times(0); @@ -269,7 +265,7 @@ // Allow locks to extend timeout. lock_manager()->set_allow_locks_to_extend_timeout(true); // |lock1| is timed out already. The second lock can timeout on its own. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); lock_manager()->set_allow_locks_to_extend_timeout(false); EXPECT_TRUE(lock_manager()->IsLocked()); EXPECT_CALL(lock_client1, CompositorLockTimedOut()).Times(0); @@ -284,7 +280,7 @@ testing::StrictMock<MockCompositorLockClient> lock_client1; std::unique_ptr<CompositorLock> lock1; - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // The CompositorLockClient is destroyed when |lock1| is released. lock1 = nullptr; @@ -305,7 +301,7 @@ base::TimeDelta timeout2 = base::TimeDelta::FromMilliseconds(10); // The first lock has a short timeout. - lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, timeout1, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); // But the first lock is ended before timeout. lock1 = nullptr; @@ -313,7 +309,7 @@ // The second lock has a longer timeout, and it should use that timeout, // since the first lock is done. - lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2); + lock2 = lock_manager()->GetCompositorLock(&lock_client2, timeout2, nullptr); EXPECT_TRUE(lock_manager()->IsLocked()); { @@ -337,7 +333,8 @@ testing::StrictMock<MockCompositorLockClient> lock_client1; std::unique_ptr<CompositorLock> lock1; - lock1 = lock_manager()->GetCompositorLock(&lock_client1, base::TimeDelta()); + lock1 = lock_manager()->GetCompositorLock(&lock_client1, base::TimeDelta(), + nullptr); // The compositor is destroyed before the lock. DestroyLockManager(); // This doesn't crash.
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index 13d6cc7..4635f5c 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -355,7 +355,14 @@ chrome.commandLinePrivate.hasSwitch( 'disable-zip-archiver-packer', function(disabled) { CommandHandler.IS_ZIP_ARCHIVER_PACKER_ENABLED_ = !disabled; - }.bind(this)); + }); + chrome.fileManagerPrivate.isCrostiniEnabled((enabled) => { + if (enabled) { + chrome.commandLinePrivate.hasSwitch('crostini-files', (enabled) => { + CommandHandler.IS_CROSTINI_FILES_ENABLED_ = enabled; + }); + } + }); }; /** @@ -366,6 +373,13 @@ CommandHandler.IS_ZIP_ARCHIVER_PACKER_ENABLED_ = false; /** + * A flag that determines whether crostini file sharing is enabled. + * @type {boolean} + * @private + */ +CommandHandler.IS_CROSTINI_FILES_ENABLED_ = false; + +/** * Supported disk file system types for renaming. * @type {!Array<!VolumeManagerCommon.FileSystemType>} * @const @@ -1630,6 +1644,39 @@ /** + * Shares the selected (single only) folder with crostini container. + * @type {Command} + */ +CommandHandler.COMMANDS_['share-with-linux'] = /** @type {Command} */ ({ + /** + * @param {!Event} event Command event. + * @param {!CommandHandlerDeps} fileManager CommandHandlerDeps to use. + */ + execute: function(event, fileManager) { + const entry = CommandUtil.getCommandEntry(event.target); + if (entry && entry.isDirectory) { + chrome.fileManagerPrivate.sharePathWithCrostiniContainer( + /** @type {!DirectoryEntry} */ (entry), () => { + if (chrome.runtime.lastError) + console.error( + 'Error sharing with linux: ' + + chrome.runtime.lastError.message); + }); + } + }, + /** + * @param {!Event} event Command event. + * @param {!CommandHandlerDeps} fileManager CommandHandlerDeps to use. + */ + canExecute: function(event, fileManager) { + const entries = CommandUtil.getCommandEntries(event.target); + event.canExecute = CommandHandler.IS_CROSTINI_FILES_ENABLED_ && + entries.length === 1 && entries[0].isDirectory; + event.command.setHidden(!event.canExecute); + } +}); + +/** * Creates a shortcut of the selected folder (single only). * @type {Command} */
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set.js index 1badaaf..9c1272f 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set.js
@@ -61,29 +61,37 @@ /** * Stores results from MetadataProvider with the request Id. * @param {number} requestId Request ID. If a newer operation has already been - * done, the results must be ingored. + * done, the results must be ignored. * @param {!Array<!Entry>} entries * @param {!Array<!MetadataItem>} results + * @param {!Array<string>} names Property names that have been requested and + * updated. * @return {boolean} Whether at least one result is stored or not. */ MetadataCacheSet.prototype.storeProperties = function( - requestId, entries, results) { + requestId, entries, results, names) { var changedEntries = []; var urls = util.entriesToURLs(entries); + const entriesMap = new Map(); + for (var i = 0; i < entries.length; i++) { var url = urls[i]; var item = this.items_.peek(url); - if (item && item.storeProperties(requestId, results[i])) + if (item && item.storeProperties(requestId, results[i])) { changedEntries.push(entries[i]); + entriesMap.set(url, entries[i]); + } } - if (changedEntries.length) { - var event = new Event('update'); - event.entries = changedEntries; - this.dispatchEvent(event); - return true; - } else { + + if (!changedEntries.length) return false; - } + + var event = new Event('update'); + event.entries = changedEntries; + event.entriesMap = entriesMap; + event.names = new Set(names); + this.dispatchEvent(event); + return true; }; /** @@ -306,4 +314,4 @@ */ MetadataCacheSetStorageForLRUCache.prototype.removeAll = function() { assertNotReached('Not implemented.'); -}; \ No newline at end of file +};
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set_unittest.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set_unittest.js index af815086..1653b267 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_set_unittest.js
@@ -2,12 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var entryA = { - toURL: function() { return "filesystem://A"; } +const entryA = { + toURL: function() { + return 'filesystem://A'; + } }; -var entryB = { - toURL: function() { return "filesystem://B"; } +const entryB = { + toURL: function() { + return 'filesystem://B'; + } }; function testMetadataCacheSetBasic() { @@ -144,8 +148,8 @@ } function testMetadataCacheSetUpdateEvent() { - var set = new MetadataCacheSet(new MetadataCacheSetStorageForObject({})); - var event = null; + const set = new MetadataCacheSet(new MetadataCacheSetStorageForObject({})); + let event = null; set.addEventListener('update', function(inEvent) { event = inEvent; }); @@ -153,6 +157,9 @@ set.storeProperties(1, [entryA], [{propertyA: 'value'}]); assertEquals(1, event.entries.length); assertEquals(entryA, event.entries[0]); + assertTrue(event.entriesMap.has(entryA.toURL())); + assertFalse(event.entriesMap.has(entryB.toURL())); + assertFalse(event.names.has('propertyA')); } function testMetadataCacheSetClearAll() {
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_model.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_model.js index 1ce996e0..1d90c12e 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_model.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_model.js
@@ -90,7 +90,7 @@ } // Store cache. - this.cache_.storeProperties(requestId, requestedEntries, list); + this.cache_.storeProperties(requestId, requestedEntries, list, names); // Invoke callbacks. var i = 0; @@ -206,7 +206,7 @@ */ MetadataProviderCallbackRequest.prototype.storeProperties = function( requestId, entries, objects) { - this.cache_.storeProperties(requestId, entries, objects); + this.cache_.storeProperties(requestId, entries, objects, this.names_); if (this.cache_.hasFreshCache(this.entries_, this.names_)) { this.fulfill_(this.cache_.get(this.entries_, this.names_)); return true;
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html index 45bbcd6..de1bc1f 100644 --- a/ui/file_manager/file_manager/main.html +++ b/ui/file_manager/file_manager/main.html
@@ -167,6 +167,7 @@ shortcut="." hide-shortcut-text> <command id="manage-in-drive" i18n-values="label:MANAGE_IN_DRIVE_BUTTON_LABEL" disabled hidden> + <command id="share-with-linux" i18n-values="label:SHARE_WITH_LINUX_BUTTON_LABEL" disabled hidden> <command id="zoom-in" shortcut="=|Ctrl"> <command id="zoom-out" shortcut="-|Ctrl"> @@ -210,6 +211,7 @@ <cr-menu-item command="#delete" i18n-content="DELETE_BUTTON_LABEL" class="hide-on-toolbar"></cr-menu-item> <cr-menu-item command="#zip-selection"></cr-menu-item> + <cr-menu-item command="#share-with-linux"></cr-menu-item> <cr-menu-item command="#set-wallpaper"></cr-menu-item> <hr visibleif="saveas-file full-page" class="hide-on-toolbar"> <cr-menu-item command="#new-folder" visibleif="saveas-file full-page" @@ -294,6 +296,7 @@ <cr-menu id="share-menu" class="chrome-menu files-menu" menu-item-selector="cr-menu-item, hr"> <cr-menu-item command="#share"></cr-menu-item> + <cr-menu-item command="#share-with-linux"></cr-menu-item> <hr id="drive-share-separator"> </cr-menu>
diff --git a/ui/file_manager/file_manager/test/crostini.js b/ui/file_manager/file_manager/test/crostini.js index 2034e0e..bd97730d 100644 --- a/ui/file_manager/file_manager/test/crostini.js +++ b/ui/file_manager/file_manager/test/crostini.js
@@ -19,7 +19,7 @@ }); }; -crostini.testCrostiniSuccess = (done) => { +crostini.testMountCrostiniSuccess = (done) => { const oldMount = chrome.fileManagerPrivate.mountCrostiniContainer; let mountCallback = null; chrome.fileManagerPrivate.mountCrostiniContainer = (callback) => { @@ -75,7 +75,7 @@ }); }; -crostini.testCrostiniError = (done) => { +crostini.testMountCrostiniError = (done) => { const oldMount = chrome.fileManagerPrivate.mountCrostiniContainer; // Override fileManagerPrivate.mountCrostiniContainer to return error. chrome.fileManagerPrivate.mountCrostiniContainer = (callback) => { @@ -194,3 +194,35 @@ done(); }); }; + +crostini.testSharePathCrostiniSuccess = (done) => { + let sharePathCalled = false; + chrome.fileManagerPrivate.sharePathWithCrostiniContainer = (callback) => { + sharePathCalled = true; + }; + test.setupAndWaitUntilReady() + .then(() => { + // Right-click 'photos' directory. + // Check 'Share with Linux' is shown in menu. + test.selectFile('photos'); + assertTrue( + test.fakeMouseRightClick('#file-list li[selected]'), + 'right-click photos'); + return test.waitForElement( + '#file-context-menu:not([hidden]) ' + + '[command="#share-with-linux"]:not([hidden]):not([disabled])'); + }) + .then(() => { + // Click on 'Start with Linux'. + assertTrue( + test.fakeMouseClick( + '#file-context-menu [command="#share-with-linux"]'), + 'Share with Linux'); + return test.waitForElement('#file-context-menu[hidden]'); + }) + .then(() => { + // Check sharePathWithCrostiniContainer is called. + assertTrue(sharePathCalled); + done(); + }); +};
diff --git a/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js b/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js index fe4cc384..cc3aa9e3 100644 --- a/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js +++ b/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js
@@ -176,6 +176,9 @@ // highlightedBaseName: string } setTimeout(callback, 0, []); }, + sharePathWithCrostiniContainer: (entry, callback) => { + setTimeout(callback, 0); + }, nextCopyId_: 0, startCopy: (entry, parentEntry, newName, callback) => { // Returns copyId immediately.
diff --git a/ui/file_manager/file_manager/test/js/strings.js b/ui/file_manager/file_manager/test/js/strings.js index 924e6254..f4b165c 100644 --- a/ui/file_manager/file_manager/test/js/strings.js +++ b/ui/file_manager/file_manager/test/js/strings.js
@@ -61,6 +61,7 @@ INSTALL_LINUX_PACKAGE_INSTALL_BUTTON: 'Install', INSTALL_NEW_EXTENSION_LABEL: 'Install new service', LINUX_FILES_ROOT_LABEL: 'Linux files', + MANY_DIRECTORIES_SELECTED: '$1 folders selected', MANY_ENTRIES_SELECTED: '$1 items selected', MANY_FILES_SELECTED: '$1 files selected', METADATA_BOX_ALBUM_TITLE: 'Album', @@ -81,6 +82,7 @@ PREPARING_LABEL: 'Preparing', SEE_MENU_FOR_ACTIONS: 'More options available on the action bar. ' + 'Press Alt + A to focus the action bar.', + SHARE_WITH_LINUX_BUTTON_LABEL: 'Share with Linux', SIZE_COLUMN_LABEL: 'Size', SPACE_AVAILABLE: '$1 available', STATUS_COLUMN_LABEL: 'Status',
diff --git a/ui/file_manager/gallery/js/BUILD.gn b/ui/file_manager/gallery/js/BUILD.gn index 02347f8e..4462d03 100644 --- a/ui/file_manager/gallery/js/BUILD.gn +++ b/ui/file_manager/gallery/js/BUILD.gn
@@ -240,6 +240,6 @@ group("closure_compile") { deps = [ ":closure_compile_module", - ":unit_tests", + ":unit_tests_type_check", ] }
diff --git a/ui/file_manager/gallery/js/image_editor/BUILD.gn b/ui/file_manager/gallery/js/image_editor/BUILD.gn index 86440b6..daf3888 100644 --- a/ui/file_manager/gallery/js/image_editor/BUILD.gn +++ b/ui/file_manager/gallery/js/image_editor/BUILD.gn
@@ -209,6 +209,6 @@ group("closure_compile") { deps = [ ":closure_compile_module", - ":unit_tests", + ":unit_tests_type_check", ] }
diff --git a/ui/file_manager/integration_tests/file_manager/drive_specific.js b/ui/file_manager/integration_tests/file_manager/drive_specific.js index 42d37f0..4f2104b8 100644 --- a/ui/file_manager/integration_tests/file_manager/drive_specific.js +++ b/ui/file_manager/integration_tests/file_manager/drive_specific.js
@@ -344,3 +344,75 @@ ]; StepsRunner.run(steps); }; + +testcase.PRE_driveMigratePinnedFile = function() { + // Pin a file. + testPromise( + setupAndWaitUntilReady(null, RootPath.DRIVE).then(function(results) { + var windowId = results.windowId; + return remoteCall + .callRemoteTestUtil('selectFile', windowId, ['hello.txt']) + .then(function() { + return remoteCall.waitForElement( + windowId, ['.table-row[selected]']); + }) + .then(function() { + return remoteCall.callRemoteTestUtil( + 'fakeMouseRightClick', windowId, ['.table-row[selected]']); + }) + .then(function(result) { + chrome.test.assertTrue(result); + return remoteCall.waitForElement( + windowId, '#file-context-menu:not([hidden])'); + }) + .then(function() { + return remoteCall.waitForElement( + windowId, ['[command="#toggle-pinned"]']); + }) + .then(function() { + return remoteCall.callRemoteTestUtil( + 'fakeMouseClick', windowId, ['[command="#toggle-pinned"]']); + }) + .then(function(result) { + return remoteCall.waitForElement( + windowId, '#file-context-menu[hidden]'); + }) + .then(function() { + return remoteCall.callRemoteTestUtil( + 'fakeEvent', windowId, ['#file-list', 'contextmenu']); + }) + .then(function(result) { + chrome.test.assertTrue(result); + return remoteCall.waitForElement( + windowId, '[command="#toggle-pinned"][checked]'); + }); + })); +}; + +testcase.driveMigratePinnedFile = function() { + // After enabling DriveFS, ensure the file is still pinned. + testPromise( + setupAndWaitUntilReady(null, RootPath.DRIVE).then(function(results) { + var windowId = results.windowId; + return remoteCall + .callRemoteTestUtil('selectFile', windowId, ['hello.txt']) + .then(function() { + return remoteCall.waitForElement( + windowId, ['.table-row[selected]']); + }) + .then(function() { + return remoteCall.callRemoteTestUtil( + 'fakeMouseRightClick', windowId, ['.table-row[selected]']); + }) + .then(function(result) { + chrome.test.assertTrue(result); + return remoteCall.waitForElement( + windowId, '#file-context-menu:not([hidden])'); + }) + .then(function() { + return remoteCall.waitForElement( + windowId, '[command="#toggle-pinned"][checked]'); + }); + })); + +};
diff --git a/ui/file_manager/integration_tests/file_manager/file_display.js b/ui/file_manager/integration_tests/file_manager/file_display.js index 1e2dd423..b9daf77 100644 --- a/ui/file_manager/integration_tests/file_manager/file_display.js +++ b/ui/file_manager/integration_tests/file_manager/file_display.js
@@ -69,7 +69,8 @@ testcase.fileDisplayDriveOffline = function() { var appId; - const driveFiles = [ENTRIES.hello, ENTRIES.pinned, ENTRIES.photos]; + const driveFiles = + [ENTRIES.hello, ENTRIES.pinned, ENTRIES.photos, ENTRIES.testDocument]; StepsRunner.run([ // Open Files app on Drive with the given test files. @@ -102,7 +103,7 @@ }, // Check: these files should have 'available offline' CSS style. function(elements) { - chrome.test.assertEq(2, elements.length); + chrome.test.assertEq(3, elements.length); function checkRenderedInAvailableOfflineStyle(element, fileName) { chrome.test.assertEq(0, element.text.indexOf(fileName)); @@ -112,8 +113,11 @@ // Directories are shown as 'available offline'. checkRenderedInAvailableOfflineStyle(elements[0], 'photos'); + // Hosted documents are shown as 'available offline'. + checkRenderedInAvailableOfflineStyle(elements[1], 'Test Document.gdoc'); + // Pinned files are shown as 'available offline'. - checkRenderedInAvailableOfflineStyle(elements[1], 'pinned'); + checkRenderedInAvailableOfflineStyle(elements[2], 'pinned'); this.next(); },
diff --git a/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js b/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js index 2a241cb4..33a71dd6 100644 --- a/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js +++ b/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js
@@ -16,10 +16,6 @@ const TREEITEM_D = TREEITEM_DRIVE + ' [entry-label="D"] '; const TREEITEM_E = TREEITEM_D + '[entry-label="E"] '; -const EXPAND_ICON = '> .tree-row > .expand-icon'; -const ITEM_ICON = '> .tree-row > .item-icon'; -const EXPANDED_SUBTREE = '> .tree-children[expanded]'; - /** * Entry set used for the folder shortcut tests. * @type {Array<TestEntryInfo>} @@ -35,7 +31,7 @@ /** * Constants for each folder. - * @type {Array<Object>} + * @type {Object} */ const DIRECTORY = { Drive: { @@ -77,260 +73,226 @@ }; /** - * Opens two file manager windows. - * @return {Promise} Promise fulfilled with an array containing two window IDs. - */ -function openWindows() { - return Promise.all([ - openNewWindow(null, RootPath.DRIVE), - openNewWindow(null, RootPath.DRIVE) - ]).then(function(windowIds) { - return Promise.all([ - remoteCall.waitForElement(windowIds[0], '#detail-table'), - remoteCall.waitForElement(windowIds[1], '#detail-table') - ]).then(function() { - return windowIds; - }); - }); -} - -/** - * Expands tree item on the directory tree by clicking expand icon. - * @param {string} windowId ID of target window. + * Expands a directory tree item by clicking on its expand icon. + * + * @param {string} appId Files app windowId. * @param {Object} directory Directory whose tree item should be expanded. * @return {Promise} Promise fulfilled on success. */ -function expandTreeItem(windowId, directory) { - return remoteCall.waitForElement( - windowId, directory.treeItem + EXPAND_ICON).then(function() { - return remoteCall.callRemoteTestUtil( - 'fakeMouseClick', windowId, [directory.treeItem + EXPAND_ICON]); +function expandTreeItem(appId, directory) { + const expandIcon = directory.treeItem + '> .tree-row > .expand-icon'; + return remoteCall.waitForElement(appId, expandIcon).then(function() { + return remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [expandIcon]); }).then(function(result) { chrome.test.assertTrue(result); - return remoteCall.waitForElement(windowId, - directory.treeItem + EXPANDED_SUBTREE); + const expandedSubtree = directory.treeItem + '> .tree-children[expanded]'; + return remoteCall.waitForElement(appId, expandedSubtree); }); } /** - * Expands whole directory tree. - * @param {string} windowId ID of target window. + * Expands whole directory tree under DIRECTORY.Drive. + * + * @param {string} appId Files app windowId. * @return {Promise} Promise fulfilled on success. */ -function expandDirectoryTree(windowId) { - return expandTreeItem(windowId, DIRECTORY.Drive).then(function() { - return expandTreeItem(windowId, DIRECTORY.A); +function expandDirectoryTree(appId) { + return expandTreeItem(appId, DIRECTORY.Drive).then(function() { + return expandTreeItem(appId, DIRECTORY.A); }).then(function() { - return expandTreeItem(windowId, DIRECTORY.B); + return expandTreeItem(appId, DIRECTORY.B); }).then(function() { - return expandTreeItem(windowId, DIRECTORY.D); + return expandTreeItem(appId, DIRECTORY.D); }); } /** - * Makes |directory| the current directory. - * @param {string} windowId ID of target window. - * @param {Object} directory Directory which should be a current directory. + * Navigate to |directory| (makes |directory| the current directory). + * + * @param {string} appId Files app windowId. + * @param {Object} directory Directory to navigate to. * @return {Promise} Promise fulfilled on success. */ -function navigateToDirectory(windowId, directory) { - return remoteCall.waitForElement( - windowId, directory.treeItem + ITEM_ICON).then(function() { - return remoteCall.callRemoteTestUtil( - 'fakeMouseClick', windowId, [directory.treeItem + ITEM_ICON]); +function navigateToDirectory(appId, directory) { + const itemIcon = directory.treeItem + '> .tree-row > .item-icon'; + return remoteCall.waitForElement(appId, itemIcon).then(function() { + return remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [itemIcon]); }).then(function(result) { chrome.test.assertTrue(result); - return remoteCall.waitForFiles(windowId, directory.contents); + return remoteCall.waitForFiles(appId, directory.contents); }); } /** - * Creates folder shortcut to |directory|. - * The current directory must be a parent of the |directory|. - * @param {string} windowId ID of target window. + * Creates a folder shortcut to |directory| using the context menu. Note the + * current directory must be a parent of the given |directory|. + * + * @param {string} appId Files app windowId. * @param {Object} directory Directory of shortcut to be created. * @return {Promise} Promise fulfilled on success. */ -function createShortcut(windowId, directory) { +function createShortcut(appId, directory) { return remoteCall.callRemoteTestUtil( - 'selectFile', windowId, [directory.name]).then(function(result) { + 'selectFile', appId, [directory.name]).then(function(result) { chrome.test.assertTrue(result); - return remoteCall.waitForElement(windowId, ['.table-row[selected]']); + return remoteCall.waitForElement(appId, ['.table-row[selected]']); }).then(function() { return remoteCall.callRemoteTestUtil( - 'fakeMouseRightClick', windowId, ['.table-row[selected]']); + 'fakeMouseRightClick', appId, ['.table-row[selected]']); }).then(function(result) { chrome.test.assertTrue(result); return remoteCall.waitForElement( - windowId, '#file-context-menu:not([hidden])'); + appId, '#file-context-menu:not([hidden])'); }).then(function() { return remoteCall.waitForElement( - windowId, + appId, '[command="#create-folder-shortcut"]:not([hidden]):not([disabled])'); }).then(function() { return remoteCall.callRemoteTestUtil( - 'fakeMouseClick', windowId, + 'fakeMouseClick', appId, ['[command="#create-folder-shortcut"]:not([hidden]):not([disabled])']); }).then(function(result) { chrome.test.assertTrue(result); - return remoteCall.waitForElement(windowId, directory.navItem); + return remoteCall.waitForElement(appId, directory.navItem); }); } /** - * Removes folder shortcut to |directory|. - * The current directory must be a parent of the |directory|. - * @param {string} windowId ID of target window. - * @param {Object} directory Directory of shortcut ot be removed. - * @return {Promise} Promise fullfilled on success. + * Removes the folder shortcut to |directory|. Note the current directory must + * be a parent of the given |directory|. + * + * @param {string} appId Files app windowId. + * @param {Object} directory Directory of shortcut to be removed. + * @return {Promise} Promise fulfilled on success. */ -function removeShortcut(windowId, directory) { +function removeShortcut(appId, directory) { // Focus the item first since actions are calculated asynchronously. The // context menu wouldn't show if there are no visible items. Focusing first, // will force the actions controller to refresh actions. // TODO(mtomasz): Remove this hack (if possible). - return remoteCall.callRemoteTestUtil('focus', - windowId, [directory.navItem]).then(function(result) { + return remoteCall.callRemoteTestUtil( + 'focus', appId, [directory.navItem]).then(function(result) { chrome.test.assertTrue(result); return remoteCall.callRemoteTestUtil( - 'fakeMouseRightClick', - windowId, - [directory.navItem]); + 'fakeMouseRightClick', appId, [directory.navItem]); }).then(function(result) { chrome.test.assertTrue(result); return remoteCall.waitForElement( - windowId, '#roots-context-menu:not([hidden])'); + appId, '#roots-context-menu:not([hidden])'); }).then(function() { return remoteCall.waitForElement( - windowId, + appId, '[command="#remove-folder-shortcut"]:not([hidden]):not([disabled])'); }).then(function() { return remoteCall.callRemoteTestUtil( - 'fakeMouseClick', windowId, + 'fakeMouseClick', appId, ['#roots-context-menu [command="#remove-folder-shortcut"]:' + 'not([hidden])']); }).then(function(result) { chrome.test.assertTrue(result); - return remoteCall.waitForElementLost(windowId, directory.navItem); + return remoteCall.waitForElementLost(appId, directory.navItem); }); } /** - * Waits until the current directory become |currentDir| and folder shortcut to - * |shortcutDir| is selected. - * @param {string} windowId ID of target window. + * Waits until the current directory becomes |currentDir| and current selection + * becomes the shortcut to |shortcutDir|. + * + * @param {string} appId Files app windowId. * @param {Object} currentDir Directory which should be a current directory. * @param {Object} shortcutDir Directory whose shortcut should be selected. - * @return {Promise} Promise fullfilled on success. + * @return {Promise} Promise fulfilled on success. */ -function expectSelection(windowId, currentDir, shortcutDir) { - return remoteCall.waitForFiles(windowId, currentDir.contents). - then(function() { - return remoteCall.waitForElement( - windowId, shortcutDir.navItem + '[selected]'); - }); +function expectSelection(appId, currentDir, shortcutDir) { + const shortcut = shortcutDir.navItem; + return remoteCall.waitForFiles(appId, currentDir.contents).then(function() { + return remoteCall.waitForElement(appId, shortcut + '[selected]'); + }); } /** * Clicks folder shortcut to |directory|. - * @param {string} windowId ID of target window. + * + * @param {string} appId Files app windowId. * @param {Object} directory Directory whose shortcut will be clicked. - * @return {Promise} Promise fullfilled with result of fakeMouseClick. + * @return {Promise} Promise fulfilled on success. */ -function clickShortcut(windowId, directory) { - return remoteCall.waitForElement(windowId, directory.navItem). - then(function() { - return remoteCall.callRemoteTestUtil( - 'fakeMouseClick', windowId, [directory.navItem]); - }); +function clickShortcut(appId, directory) { + const shortcut = directory.navItem; + return remoteCall.waitForElement(appId, shortcut).then(function() { + return remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [shortcut]); + }).then(function(result) { + chrome.test.assertTrue(result); + }); } /** * Creates some shortcuts and traverse them and some other directories. */ testcase.traverseFolderShortcuts = function() { - var windowId; + let appId; + StepsRunner.run([ - // Set up each window. + // Open Files app on Drive. function() { - addEntries(['drive'], FOLDER_ENTRY_SET, this.next); + setupAndWaitUntilReady( + null, RootPath.DRIVE, this.next, [], FOLDER_ENTRY_SET); }, + // Expand the directory tree. + function(results) { + appId = results.windowId; + expandDirectoryTree(appId).then(this.next); + }, + // Create a shortcut to directory D. + function() { + createShortcut(appId, DIRECTORY.D).then(this.next); + }, + // Navigate to directory B. + function() { + navigateToDirectory(appId, DIRECTORY.B).then(this.next); + }, + // Create a shortcut to directory C. + function() { + createShortcut(appId, DIRECTORY.C).then(this.next); + }, + // Click the Drive root (My Drive) shortcut. + function() { + clickShortcut(appId, DIRECTORY.Drive).then(this.next); + }, + // Check: current directory and selection should be the Drive root. + function() { + expectSelection(appId, DIRECTORY.Drive, DIRECTORY.Drive).then(this.next); + }, + // Send Ctrl+3 key to file-list to select 3rd shortcut. + function() { + const key = ['#file-list', '3', '3', true, false, false]; + remoteCall.callRemoteTestUtil('fakeKeyDown', appId, key, this.next); + }, + // Check: current directory and selection should be D. function(result) { chrome.test.assertTrue(result); - openNewWindow(null, RootPath.DRIVE).then(this.next); + expectSelection(appId, DIRECTORY.D, DIRECTORY.D).then(this.next); }, - function(inWindowId) { - windowId = inWindowId; - remoteCall.waitForElement(windowId, '#detail-table').then(this.next); - }, + // Send UpArrow key to directory tree to select the shortcut above D. function() { - expandDirectoryTree(windowId).then(this.next); + const key = ['#directory-tree', 'ArrowUp', 'Up', false, false, false]; + remoteCall.callRemoteTestUtil('fakeKeyDown', appId, key, this.next); }, - function() { - remoteCall.waitForFiles(windowId, DIRECTORY.Drive.contents). - then(this.next); - }, - - // Create shortcut to D - function() { - createShortcut(windowId, DIRECTORY.D).then(this.next); - }, - - // Create sortcut to C - function() { - navigateToDirectory(windowId, DIRECTORY.B).then(this.next); - }, - function() { - createShortcut(windowId, DIRECTORY.C).then(this.next); - }, - - // Click shortcut to drive. - // Current directory should be Drive root. - // Shortcut to Drive root should be selected. - function() { - clickShortcut(windowId, DIRECTORY.Drive).then(this.next); - }, - function() { - expectSelection( - windowId, DIRECTORY.Drive, DIRECTORY.Drive).then(this.next); - }, - // Press Ctrl+3 to select 3d shortcut. - function() { - remoteCall.callRemoteTestUtil( - 'fakeKeyDown', windowId, ['#file-list', '3', '3', true, false, false], - this.next); - }, - // Current directory should be D. + // Check: current directory should be D, with shortcut C selected. function(result) { chrome.test.assertTrue(result); - expectSelection(windowId, DIRECTORY.D, DIRECTORY.D).then(this.next); + expectSelection(appId, DIRECTORY.D, DIRECTORY.C).then(this.next); }, - // Press UP to select shortcut (above D). - // Current directory should remain D. - // But Shortcut to C should be selected. + // Send Enter key to the directory tree to change to directory C. function() { - remoteCall.callRemoteTestUtil('fakeKeyDown', windowId, - ['#directory-tree', 'ArrowUp', 'Up', false, false, false], this.next); + const key = ['#directory-tree', 'Enter', 'Enter', false, false, false]; + remoteCall.callRemoteTestUtil('fakeKeyDown', appId, key, this.next); }, - // Current directory should remain D. + // Check: current directory and selection should be C. function(result) { chrome.test.assertTrue(result); - expectSelection(windowId, DIRECTORY.D, DIRECTORY.C).then(this.next); + expectSelection(appId, DIRECTORY.C, DIRECTORY.C).then(this.next); }, - // Press Enter to change the directory to C. - // Then current directory should change to C. - function() { - remoteCall.callRemoteTestUtil('fakeKeyDown', windowId, - ['#directory-tree', 'Enter', 'Enter', false, false, false], - this.next); - }, - - // Current directory should be C. - function(result) { - chrome.test.assertTrue(result); - expectSelection(windowId, DIRECTORY.C, DIRECTORY.C).then(this.next); - }, - function() { checkIfNoErrorsOccured(this.next); } @@ -342,72 +304,68 @@ * directories and selected navigation items are correct. */ testcase.addRemoveFolderShortcuts = function() { - var windowId1; - var windowId2; + let appId1; + let appId2; + + function openFilesAppOnDrive() { + let appId; + return new Promise(function(resolve) { + return openNewWindow(null, RootPath.DRIVE, resolve); + }).then(function(windowId) { + appId = windowId; + return remoteCall.waitForElement(appId, '#file-list'); + }).then(function() { + return remoteCall.waitForFiles(appId, DIRECTORY.Drive.contents); + }).then(function() { + return appId; + }); + } + StepsRunner.run([ - // Set up each window. + // Add entries to Drive. function() { addEntries(['drive'], FOLDER_ENTRY_SET, this.next); }, + // Open one Files app window on Drive. function(result) { chrome.test.assertTrue(result); - openWindows().then(this.next); + openFilesAppOnDrive().then(this.next); }, - function(windowIds) { - windowId1 = windowIds[0]; - windowId2 = windowIds[1]; - expandDirectoryTree(windowId1).then(this.next); + // Open another Files app window on Drive. + function(windowId) { + appId1 = windowId; + openFilesAppOnDrive().then(this.next); }, + // Create a shortcut to D. + function(windowId) { + appId2 = windowId; + createShortcut(appId1, DIRECTORY.D).then(this.next); + }, + // Click the shortcut to D. function() { - expandDirectoryTree(windowId2).then(this.next); + clickShortcut(appId1, DIRECTORY.D).then(this.next); }, + // Check: current directory and selection should be D. function() { - remoteCall.waitForFiles(windowId1, DIRECTORY.Drive.contents). - then(this.next); + expectSelection(appId1, DIRECTORY.D, DIRECTORY.D).then(this.next); }, + // Create a shortcut to A from the other window. function() { - remoteCall.waitForFiles(windowId2, DIRECTORY.Drive.contents). - then(this.next); + createShortcut(appId2, DIRECTORY.A).then(this.next); }, - - // Create shortcut to D + // Check: current directory and selection should still be D. function() { - createShortcut(windowId1, DIRECTORY.D).then(this.next); + expectSelection(appId1, DIRECTORY.D, DIRECTORY.D).then(this.next); }, - - // Click D. - // Current directory should be D. - // Shortcut to D should be selected. + // Remove shortcut to D from the other window. function() { - clickShortcut(windowId1, DIRECTORY.D).then(this.next); + removeShortcut(appId2, DIRECTORY.D).then(this.next); }, + // Check: directory D in the directory tree should be selected. function() { - expectSelection(windowId1, DIRECTORY.D, DIRECTORY.D).then(this.next); + const selection = TREEITEM_D + '[selected]'; + remoteCall.waitForElement(appId1, selection).then(this.next); }, - - // Create shortcut to A in another window. - function() { - createShortcut(windowId2, DIRECTORY.A).then(this.next); - }, - - // The index of shortcut to D is changed. - // Current directory should remain D. - // Shortcut to D should keep selected. - function() { - expectSelection(windowId1, DIRECTORY.D, DIRECTORY.D).then(this.next); - }, - - // Remove shortcut to D in another window. - function() { - removeShortcut(windowId2, DIRECTORY.D).then(this.next); - }, - - // Directory D in the directory tree should be selected. - function() { - remoteCall.waitForElement(windowId1, TREEITEM_D + '[selected]'). - then(this.next); - }, - function() { checkIfNoErrorsOccured(this.next); }
diff --git a/ui/file_manager/js_unit_tests.gni b/ui/file_manager/js_unit_tests.gni index edb9a07..7d7cb65 100644 --- a/ui/file_manager/js_unit_tests.gni +++ b/ui/file_manager/js_unit_tests.gni
@@ -6,8 +6,15 @@ # Describes a list of js_library targets that will each have an html file # written listing all its (flattened) js dependencies, for loading as a test. +# +# A companion group target with a "_type_check" suffix is also generated with +# this template. This depends on a list of js_type_check(..) targets -- one for +# each test -- that will type check the test js file and its dependency subtree. +# # Must be declared after the js_library targets it depends on. # +# Note js_type_check(..) is a no-op unless `closure_compile` is set in gn args. +# # Variables: # deps: # List of js_library targets to depend on @@ -24,6 +31,14 @@ # ] # mocks = [ "my_mocks.js" ] # } +# group("closure_compile") { +# # ... +# ":folder_tests_type_check". +# } +# test("browser_tests") { +# # ... +# data_deps += [ "//folder:folder_tests" ] +# } template("js_unit_tests") { html_gen_target_name = target_name + "_html_gen" @@ -61,8 +76,14 @@ ] } } + type_check_group_name = target_name + "_type_check" + group(type_check_group_name) { + deps = type_check_deps + } group(target_name) { data = get_target_outputs(":$html_gen_target_name") - deps = [ ":$html_gen_target_name" ] + type_check_deps + deps = [ + ":$html_gen_target_name", + ] } }
diff --git a/ui/gfx/color_transform_unittest.cc b/ui/gfx/color_transform_unittest.cc index 59407f4e..f04bd3b6 100644 --- a/ui/gfx/color_transform_unittest.cc +++ b/ui/gfx/color_transform_unittest.cc
@@ -492,9 +492,9 @@ " color.r = TransferFn1(color.r);\n" " color.g = TransferFn1(color.g);\n" " color.b = TransferFn1(color.b);\n" - " color = mat3(6.27403915e-01, 6.90973178e-02, 1.63914412e-02,\n" - " 3.29283148e-01, 9.19540286e-01, 8.80132914e-02,\n" - " 4.33131084e-02, 1.13623003e-02, 8.95595253e-01) " + " color = mat3(6.27404153e-01, 6.90974146e-02, 1.63914431e-02,\n" + " 3.29283088e-01, 9.19540644e-01, 8.80132765e-02,\n" + " 4.33131084e-02, 1.13623096e-02, 8.95595253e-01) " "* color;\n" " color.r = TransferFn3(color.r);\n" " color.g = TransferFn3(color.g);\n"
diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc index a126363..6c9df79 100644 --- a/ui/gfx/icc_profile.cc +++ b/ui/gfx/icc_profile.cc
@@ -12,7 +12,7 @@ #include "base/lazy_instance.h" #include "base/metrics/histogram_macros.h" #include "base/synchronization/lock.h" -#include "third_party/skia/include/core/SkColorSpaceXform.h" +#include "third_party/skia/include/core/SkColorSpace.h" #include "third_party/skia/third_party/skcms/skcms.h" #include "ui/gfx/skia_color_space_util.h"
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py index e1ae48e..c6b5d45 100755 --- a/ui/gl/generate_bindings.py +++ b/ui/gl/generate_bindings.py
@@ -1340,6 +1340,9 @@ 'extensions': ['GL_EXT_shader_image_load_store'] }], 'arguments': 'GLbitfield barriers', }, { 'return_type': 'void', + 'names': ['glMinSampleShading'], + 'arguments': 'GLfloat value', }, +{ 'return_type': 'void', 'versions': [{ 'name': 'glObjectLabel' }, { 'name': 'glObjectLabelKHR', 'extensions': ['GL_KHR_debug'] }],
diff --git a/ui/gl/gl_bindings_api_autogen_gl.h b/ui/gl/gl_bindings_api_autogen_gl.h index 1c1d2ce0..c6c69b1 100644 --- a/ui/gl/gl_bindings_api_autogen_gl.h +++ b/ui/gl/gl_bindings_api_autogen_gl.h
@@ -870,6 +870,7 @@ void glMatrixLoadIdentityEXTFn(GLenum matrixMode) override; void glMemoryBarrierByRegionFn(GLbitfield barriers) override; void glMemoryBarrierEXTFn(GLbitfield barriers) override; +void glMinSampleShadingFn(GLfloat value) override; void glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length,
diff --git a/ui/gl/gl_bindings_autogen_gl.cc b/ui/gl/gl_bindings_autogen_gl.cc index 0157c7cc..6fca919e1 100644 --- a/ui/gl/gl_bindings_autogen_gl.cc +++ b/ui/gl/gl_bindings_autogen_gl.cc
@@ -1854,6 +1854,11 @@ GetGLProcAddress("glMemoryBarrierEXT")); } + if (ver->IsAtLeastGLES(3u, 2u) || ver->IsAtLeastGL(4u, 0u)) { + fn.glMinSampleShadingFn = reinterpret_cast<glMinSampleShadingProc>( + GetGLProcAddress("glMinSampleShading")); + } + if (ver->IsAtLeastGL(4u, 3u) || ver->IsAtLeastGLES(3u, 2u)) { fn.glObjectLabelFn = reinterpret_cast<glObjectLabelProc>(GetGLProcAddress("glObjectLabel")); @@ -4481,6 +4486,10 @@ driver_->fn.glMemoryBarrierEXTFn(barriers); } +void GLApiBase::glMinSampleShadingFn(GLfloat value) { + driver_->fn.glMinSampleShadingFn(value); +} + void GLApiBase::glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length, @@ -7837,6 +7846,11 @@ gl_api_->glMemoryBarrierEXTFn(barriers); } +void TraceGLApi::glMinSampleShadingFn(GLfloat value) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glMinSampleShading") + gl_api_->glMinSampleShadingFn(value); +} + void TraceGLApi::glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length, @@ -12092,6 +12106,12 @@ gl_api_->glMemoryBarrierEXTFn(barriers); } +void DebugGLApi::glMinSampleShadingFn(GLfloat value) { + GL_SERVICE_LOG("glMinSampleShading" + << "(" << value << ")"); + gl_api_->glMinSampleShadingFn(value); +} + void DebugGLApi::glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length, @@ -15728,6 +15748,10 @@ NoContextHelper("glMemoryBarrierEXT"); } +void NoContextGLApi::glMinSampleShadingFn(GLfloat value) { + NoContextHelper("glMinSampleShading"); +} + void NoContextGLApi::glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length,
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h index 4958597..fe9742a 100644 --- a/ui/gl/gl_bindings_autogen_gl.h +++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -1025,6 +1025,7 @@ typedef void(GL_BINDING_CALL* glMatrixLoadIdentityEXTProc)(GLenum matrixMode); typedef void(GL_BINDING_CALL* glMemoryBarrierByRegionProc)(GLbitfield barriers); typedef void(GL_BINDING_CALL* glMemoryBarrierEXTProc)(GLbitfield barriers); +typedef void(GL_BINDING_CALL* glMinSampleShadingProc)(GLfloat value); typedef void(GL_BINDING_CALL* glObjectLabelProc)(GLenum identifier, GLuint name, GLsizei length, @@ -2117,6 +2118,7 @@ glMatrixLoadIdentityEXTProc glMatrixLoadIdentityEXTFn; glMemoryBarrierByRegionProc glMemoryBarrierByRegionFn; glMemoryBarrierEXTProc glMemoryBarrierEXTFn; + glMinSampleShadingProc glMinSampleShadingFn; glObjectLabelProc glObjectLabelFn; glObjectPtrLabelProc glObjectPtrLabelFn; glPathCommandsNVProc glPathCommandsNVFn; @@ -3194,6 +3196,7 @@ virtual void glMatrixLoadIdentityEXTFn(GLenum matrixMode) = 0; virtual void glMemoryBarrierByRegionFn(GLbitfield barriers) = 0; virtual void glMemoryBarrierEXTFn(GLbitfield barriers) = 0; + virtual void glMinSampleShadingFn(GLfloat value) = 0; virtual void glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length, @@ -4269,6 +4272,7 @@ #define glMemoryBarrierByRegion \ ::gl::g_current_gl_context->glMemoryBarrierByRegionFn #define glMemoryBarrierEXT ::gl::g_current_gl_context->glMemoryBarrierEXTFn +#define glMinSampleShading ::gl::g_current_gl_context->glMinSampleShadingFn #define glObjectLabel ::gl::g_current_gl_context->glObjectLabelFn #define glObjectPtrLabel ::gl::g_current_gl_context->glObjectPtrLabelFn #define glPathCommandsNV ::gl::g_current_gl_context->glPathCommandsNVFn
diff --git a/ui/gl/gl_bindings_autogen_mock.cc b/ui/gl/gl_bindings_autogen_mock.cc index 669d77e..0be76ca 100644 --- a/ui/gl/gl_bindings_autogen_mock.cc +++ b/ui/gl/gl_bindings_autogen_mock.cc
@@ -2959,6 +2959,11 @@ interface_->MemoryBarrierEXT(barriers); } +void GL_BINDING_CALL MockGLInterface::Mock_glMinSampleShading(GLfloat value) { + MakeGlMockFunctionUnique("glMinSampleShading"); + interface_->MinSampleShading(value); +} + void GL_BINDING_CALL MockGLInterface::Mock_glObjectLabel(GLenum identifier, GLuint name, GLsizei length, @@ -5652,6 +5657,8 @@ Mock_glMemoryBarrierByRegion); if (strcmp(name, "glMemoryBarrierEXT") == 0) return reinterpret_cast<GLFunctionPointerType>(Mock_glMemoryBarrierEXT); + if (strcmp(name, "glMinSampleShading") == 0) + return reinterpret_cast<GLFunctionPointerType>(Mock_glMinSampleShading); if (strcmp(name, "glObjectLabel") == 0) return reinterpret_cast<GLFunctionPointerType>(Mock_glObjectLabel); if (strcmp(name, "glObjectLabelKHR") == 0)
diff --git a/ui/gl/gl_bindings_autogen_mock.h b/ui/gl/gl_bindings_autogen_mock.h index b80c9d7..f6e48b21 100644 --- a/ui/gl/gl_bindings_autogen_mock.h +++ b/ui/gl/gl_bindings_autogen_mock.h
@@ -1237,6 +1237,7 @@ static void GL_BINDING_CALL Mock_glMemoryBarrier(GLbitfield barriers); static void GL_BINDING_CALL Mock_glMemoryBarrierByRegion(GLbitfield barriers); static void GL_BINDING_CALL Mock_glMemoryBarrierEXT(GLbitfield barriers); +static void GL_BINDING_CALL Mock_glMinSampleShading(GLfloat value); static void GL_BINDING_CALL Mock_glObjectLabel(GLenum identifier, GLuint name, GLsizei length,
diff --git a/ui/gl/gl_mock_autogen_gl.h b/ui/gl/gl_mock_autogen_gl.h index cdfe7a30..f5a8375 100644 --- a/ui/gl/gl_mock_autogen_gl.h +++ b/ui/gl/gl_mock_autogen_gl.h
@@ -872,6 +872,7 @@ MOCK_METHOD1(MatrixLoadIdentityEXT, void(GLenum matrixMode)); MOCK_METHOD1(MemoryBarrierByRegion, void(GLbitfield barriers)); MOCK_METHOD1(MemoryBarrierEXT, void(GLbitfield barriers)); +MOCK_METHOD1(MinSampleShading, void(GLfloat value)); MOCK_METHOD4( ObjectLabel, void(GLenum identifier, GLuint name, GLsizei length, const char* label));
diff --git a/ui/gl/gl_stub_autogen_gl.h b/ui/gl/gl_stub_autogen_gl.h index bdbe9ae8..a2b5583 100644 --- a/ui/gl/gl_stub_autogen_gl.h +++ b/ui/gl/gl_stub_autogen_gl.h
@@ -880,6 +880,7 @@ void glMatrixLoadIdentityEXTFn(GLenum matrixMode) override {} void glMemoryBarrierByRegionFn(GLbitfield barriers) override {} void glMemoryBarrierEXTFn(GLbitfield barriers) override {} +void glMinSampleShadingFn(GLfloat value) override {} void glObjectLabelFn(GLenum identifier, GLuint name, GLsizei length,
diff --git a/ui/gl/init/create_gr_gl_interface.cc b/ui/gl/init/create_gr_gl_interface.cc index edabf27a..005e6eb 100644 --- a/ui/gl/init/create_gr_gl_interface.cc +++ b/ui/gl/init/create_gr_gl_interface.cc
@@ -60,19 +60,19 @@ // Depending on the advertised version and extensions, skia checks for // existence of entrypoints. However some of those we don't yet handle in // gl_bindings, so we need to fake the version to the maximum fully supported - // by the bindings (GL 3.2 or ES 3.0), and blacklist extensions that skia + // by the bindings (GL 4.1 or ES 3.0), and blacklist extensions that skia // handles but bindings don't. // TODO(piman): add bindings for missing entrypoints. GrGLFunction<GrGLGetStringProc> get_string; const bool apply_version_override = use_version_es2 || - version_info.IsAtLeastGL(3, 3) || + version_info.IsAtLeastGL(4, 2) || version_info.IsAtLeastGLES(3, 1); if (apply_version_override) { const char* fake_version = nullptr; if (use_version_es2) { fake_version = "OpenGL ES 2.0"; } else { - fake_version = version_info.is_es ? "OpenGL ES 3.0" : "3.2"; + fake_version = version_info.is_es ? "OpenGL ES 3.0" : "4.1"; } get_string = [fake_version](GLenum name) { return GetStringHook(fake_version, name); @@ -144,8 +144,8 @@ functions->fDrawElementsInstanced = gl->glDrawElementsInstancedANGLEFn; // GL 4.0 or GL_ARB_draw_indirect or ES 3.1 - // functions->fDrawArraysIndirect = gl->glDrawArraysIndirectFn; - // functions->fDrawElementsIndirect = gl->glDrawElementsIndirectFn; + functions->fDrawArraysIndirect = gl->glDrawArraysIndirectFn; + functions->fDrawElementsIndirect = gl->glDrawElementsIndirectFn; functions->fDrawRangeElements = gl->glDrawRangeElementsFn; functions->fEnable = gl->glEnableFn; @@ -488,7 +488,7 @@ // functions->fDestroyImage = nullptr; // GL 4.0 or GL_ARB_sample_shading or ES+GL_OES_sample_shading - // functions->fMinSampleShading = gl->glMinSampleShadingFn; + functions->fMinSampleShading = gl->glMinSampleShadingFn; functions->fFenceSync = gl->glFenceSyncFn; functions->fIsSync = gl->glIsSyncFn;
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index 1d4f863..c5f90ab37 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc
@@ -170,7 +170,8 @@ }; KeyboardController::KeyboardController() - : weak_factory_report_lingering_state_(this), + : ime_observer_(this), + weak_factory_report_lingering_state_(this), weak_factory_will_hide_(this) { DCHECK_EQ(g_keyboard_controller, nullptr); g_keyboard_controller = this; @@ -195,12 +196,12 @@ show_on_keyboard_window_load_ = false; keyboard_locked_ = false; state_ = KeyboardControllerState::UNKNOWN; - ui_->GetInputMethod()->AddObserver(this); ui_->SetController(this); SetContainerBehaviorInternal(ContainerType::FULL_WIDTH); ChangeState(KeyboardControllerState::INITIAL); visual_bounds_in_screen_ = gfx::Rect(); time_of_last_blur_ = base::Time::UnixEpoch(); + UpdateInputMethodObserver(); } void KeyboardController::DisableKeyboard() { @@ -222,7 +223,7 @@ container_behavior_.reset(); animation_observer_.reset(); - ui_->GetInputMethod()->RemoveObserver(this); + ime_observer_.RemoveAll(); for (KeyboardControllerObserver& observer : observer_list_) observer.OnKeyboardDisabled(); ui_->SetController(nullptr); @@ -236,8 +237,7 @@ // Observe changes to root window bounds. parent_container_->GetRootWindow()->AddObserver(this); - // TODO(https://crbug.com/845780): Investigate whether this does anything. - OnTextInputStateChanged(ui_->GetInputMethod()->GetTextInputClient()); + UpdateInputMethodObserver(); if (GetKeyboardWindow()) { DCHECK(!GetKeyboardWindow()->parent()); @@ -554,6 +554,12 @@ } } +void KeyboardController::OnInputMethodDestroyed( + const ui::InputMethod* input_method) { + ime_observer_.RemoveAll(); + OnTextInputStateChanged(nullptr); +} + void KeyboardController::OnTextInputStateChanged( const ui::TextInputClient* client) { TRACE_EVENT0("vk", "OnTextInputStateChanged"); @@ -626,6 +632,7 @@ void KeyboardController::ShowKeyboardInternal(const display::Display& display) { keyboard::MarkKeyboardLoadStarted(); PopulateKeyboardContent(display, true); + UpdateInputMethodObserver(); } void KeyboardController::PopulateKeyboardContent( @@ -902,4 +909,23 @@ return state_ == KeyboardControllerState::SHOWN; } +void KeyboardController::UpdateInputMethodObserver() { + ui::InputMethod* ime = ui_->GetInputMethod(); + + // IME could be null during initialization. Ignoring the case is okay because + // UpdateInputMethodObserver() will be called later on. + if (!ime) + return; + + if (ime_observer_.IsObserving(ime)) + return; + + // Only observes the current active IME. + ime_observer_.RemoveAll(); + ime_observer_.Add(ime); + + // TODO(https://crbug.com/845780): Investigate whether this does anything. + OnTextInputStateChanged(ime->GetTextInputClient()); +} + } // namespace keyboard
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index bac50bc..101b932c 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/observer_list.h" +#include "base/scoped_observer.h" #include "base/time/time.h" #include "ui/aura/window_observer.h" #include "ui/base/ime/input_method_keyboard_controller.h" @@ -275,7 +276,7 @@ void OnBlur() override {} void OnCaretBoundsChanged(const ui::TextInputClient* client) override {} void OnFocus() override {} - void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {} + void OnInputMethodDestroyed(const ui::InputMethod* input_method) override; void OnTextInputStateChanged(const ui::TextInputClient* client) override; void OnShowVirtualKeyboardIfEnabled() override; @@ -327,8 +328,12 @@ // Records that keyboard was shown on the currently focused UKM source. void RecordUkmKeyboardShown(); + // Ensures that the current IME is observed if it is changed. + void UpdateInputMethodObserver(); + std::unique_ptr<KeyboardUI> ui_; - KeyboardLayoutDelegate* layout_delegate_; + KeyboardLayoutDelegate* layout_delegate_ = nullptr; + ScopedObserver<ui::InputMethod, ui::InputMethodObserver> ime_observer_; // Container window that the keyboard window is a child of. aura::Window* parent_container_ = nullptr; @@ -344,10 +349,10 @@ std::unique_ptr<QueuedDisplayChange> queued_display_change_; // If true, show the keyboard window when it loads. - bool show_on_keyboard_window_load_; + bool show_on_keyboard_window_load_ = false; // If true, the keyboard is always visible even if no window has input focus. - bool keyboard_locked_; + bool keyboard_locked_ = false; KeyboardEventFilter event_filter_; base::ObserverList<KeyboardControllerObserver>::Unchecked observer_list_; @@ -357,7 +362,7 @@ // keyboard window. If not, this should be empty. gfx::Rect visual_bounds_in_screen_; - KeyboardControllerState state_; + KeyboardControllerState state_ = KeyboardControllerState::UNKNOWN; NotificationManager notification_manager_;
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc index cfd9bef4..21a5ed0e 100644 --- a/ui/message_center/views/message_view.cc +++ b/ui/message_center/views/message_view.cc
@@ -289,6 +289,9 @@ } SlideOutController::SlideMode MessageView::CalculateSlideMode() const { + if (disable_slide_) + return SlideOutController::SlideMode::NO_SLIDE; + switch (GetMode()) { case Mode::SETTING: return SlideOutController::SlideMode::NO_SLIDE; @@ -323,6 +326,11 @@ slide_out_controller_.set_slide_mode(CalculateSlideMode()); } +void MessageView::DisableSlideForcibly(bool disable) { + disable_slide_ = disable; + slide_out_controller_.set_slide_mode(CalculateSlideMode()); +} + void MessageView::OnCloseButtonPressed() { MessageCenter::Get()->RemoveNotification(notification_id_, true /* by_user */);
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h index e49366d..62840da0 100644 --- a/ui/message_center/views/message_view.h +++ b/ui/message_center/views/message_view.h
@@ -132,6 +132,10 @@ // MessageView::Mode enum for detail. void SetSettingMode(bool setting_mode); + // Disables slide by vertical swipe regardless of the current notification + // mode. + void DisableSlideForcibly(bool disable); + void set_scroller(views::ScrollView* scroller) { scroller_ = scroller; } std::string notification_id() const { return notification_id_; } @@ -175,6 +179,9 @@ // MessageViewFactory parlance. bool is_nested_ = false; + // True if the slide is disabled forcibly. + bool disable_slide_ = false; + DISALLOW_COPY_AND_ASSIGN(MessageView); };
diff --git a/ui/message_center/views/notification_swipe_control_view.cc b/ui/message_center/views/notification_swipe_control_view.cc index d1f8b01ff..4cba6ed 100644 --- a/ui/message_center/views/notification_swipe_control_view.cc +++ b/ui/message_center/views/notification_swipe_control_view.cc
@@ -37,12 +37,11 @@ NotificationSwipeControlView::~NotificationSwipeControlView() = default; -void NotificationSwipeControlView::ShowButtons(bool is_right, +void NotificationSwipeControlView::ShowButtons(ButtonPosition button_position, bool show_settings, bool show_snooze) { views::BoxLayout* layout = static_cast<views::BoxLayout*>(GetLayoutManager()); - if (is_right) { - // TODO: Flip the arrangement if current UI language is RTL. + if ((button_position == ButtonPosition::RIGHT) != base::i18n::IsRTL()) { layout->set_main_axis_alignment(views::BoxLayout::MAIN_AXIS_ALIGNMENT_END); } else { layout->set_main_axis_alignment(
diff --git a/ui/message_center/views/notification_swipe_control_view.h b/ui/message_center/views/notification_swipe_control_view.h index 2f9ab48..e97e10d 100644 --- a/ui/message_center/views/notification_swipe_control_view.h +++ b/ui/message_center/views/notification_swipe_control_view.h
@@ -28,6 +28,11 @@ virtual void OnSnoozeButtonPressed(const ui::Event& event) = 0; }; + // Physical positions to show buttons in the swipe control. This is invariant + // across RTL/LTR languages because buttons should be shown on one side which + // is made uncovered by the overlapping view after user's swipe action. + enum class ButtonPosition { RIGHT, LEFT }; + // String to be returned by GetClassName() method. static const char kViewClassName[]; @@ -41,7 +46,9 @@ void ButtonPressed(views::Button* sender, const ui::Event& event) override; // Change the visibility of the settings button. - void ShowButtons(bool is_right, bool has_settings, bool has_snooze); + void ShowButtons(ButtonPosition button_position, + bool has_settings, + bool has_snooze); void HideButtons(); void AddObserver(Observer* observer);
diff --git a/ui/message_center/views/notification_view_md_unittest.cc b/ui/message_center/views/notification_view_md_unittest.cc index b99770a0f..e30fac2 100644 --- a/ui/message_center/views/notification_view_md_unittest.cc +++ b/ui/message_center/views/notification_view_md_unittest.cc
@@ -629,6 +629,30 @@ EXPECT_TRUE(IsRemoved(kDefaultNotificationId)); } +TEST_F(NotificationViewMDTest, DisableSlideForcibly) { + ui::ScopedAnimationDurationScaleMode zero_duration_scope( + ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); + + notification_view()->DisableSlideForcibly(true); + + BeginScroll(); + ScrollBy(-10); + EXPECT_FALSE(IsRemoved(kDefaultNotificationId)); + EXPECT_EQ(0.f, GetNotificationSlideAmount()); + EndScroll(); + EXPECT_FALSE(IsRemoved(kDefaultNotificationId)); + EXPECT_EQ(0.f, GetNotificationSlideAmount()); + + notification_view()->DisableSlideForcibly(false); + + BeginScroll(); + ScrollBy(-10); + EXPECT_FALSE(IsRemoved(kDefaultNotificationId)); + EXPECT_EQ(-10.f, GetNotificationSlideAmount()); + EndScroll(); + EXPECT_FALSE(IsRemoved(kDefaultNotificationId)); +} + // Pinning notification is ChromeOS only feature. #if defined(OS_CHROMEOS)
diff --git a/ui/message_center/views/slidable_message_view.cc b/ui/message_center/views/slidable_message_view.cc index e8f17f7..51bfc20 100644 --- a/ui/message_center/views/slidable_message_view.cc +++ b/ui/message_center/views/slidable_message_view.cc
@@ -47,12 +47,14 @@ if (gesture_amount == 0) { control_view_->HideButtons(); } else { - bool on_right = gesture_amount < 0; + NotificationSwipeControlView::ButtonPosition button_position = + gesture_amount < 0 ? NotificationSwipeControlView::ButtonPosition::RIGHT + : NotificationSwipeControlView::ButtonPosition::LEFT; NotificationControlButtonsView* buttons = message_view_->GetControlButtonsView(); bool has_settings_button = buttons->settings_button(); bool has_snooze_button = buttons->snooze_button(); - control_view_->ShowButtons(on_right, has_settings_button, + control_view_->ShowButtons(button_position, has_settings_button, has_snooze_button); } }
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc index 0a041d8..5c54b6c2 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
@@ -42,6 +42,19 @@ return 0; } +// Rotations are dependent on modifiers. Tiled formats can be rotated, +// linear formats cannot. Atomic tests currently ignore modifiers, so there +// isn't a way of determining if the rotation is supported. +// TODO(https://crbug/880464): Remove this. +bool IsRotationTransformSupported(gfx::OverlayTransform transform) { + if ((transform == gfx::OVERLAY_TRANSFORM_ROTATE_90) || + (transform == gfx::OVERLAY_TRANSFORM_ROTATE_270)) { + return false; + } + + return true; +} + } // namespace HardwareDisplayPlaneAtomic::HardwareDisplayPlaneAtomic(uint32_t id) @@ -75,6 +88,9 @@ if (transform != gfx::OVERLAY_TRANSFORM_NONE && !properties_.rotation.id) return false; + if (!IsRotationTransformSupported(transform)) + return false; + properties_.crtc_id.value = crtc_id; properties_.crtc_x.value = crtc_rect.x(); properties_.crtc_y.value = crtc_rect.y();
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager.cc b/ui/ozone/platform/wayland/wayland_buffer_manager.cc index 3dc7a12..71e71d06 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager.cc +++ b/ui/ozone/platform/wayland/wayland_buffer_manager.cc
@@ -15,6 +15,12 @@ namespace ui { +WaylandBufferManager::Buffer::Buffer() = default; +WaylandBufferManager::Buffer::Buffer(uint32_t id, + zwp_linux_buffer_params_v1* zwp_params) + : buffer_id(id), params(zwp_params) {} +WaylandBufferManager::Buffer::~Buffer() = default; + WaylandBufferManager::WaylandBufferManager( zwp_linux_dmabuf_v1* zwp_linux_dmabuf, WaylandConnection* connection) @@ -31,8 +37,7 @@ } WaylandBufferManager::~WaylandBufferManager() { - DCHECK(pending_buffer_map_.empty() && params_to_id_map_.empty() && - buffers_.empty()); + DCHECK(buffers_.empty()); } bool WaylandBufferManager::CreateBuffer(base::File file, @@ -64,9 +69,11 @@ DCHECK(zwp_linux_dmabuf_); struct zwp_linux_buffer_params_v1* params = zwp_linux_dmabuf_v1_create_params(zwp_linux_dmabuf_.get()); - params_to_id_map_.insert( - std::pair<struct zwp_linux_buffer_params_v1*, uint32_t>(params, - buffer_id)); + + std::unique_ptr<Buffer> buffer = std::make_unique<Buffer>(buffer_id, params); + buffers_.insert(std::pair<uint32_t, std::unique_ptr<Buffer>>( + buffer_id, std::move(buffer))); + uint32_t fd = file.TakePlatformFile(); for (size_t i = 0; i < planes_count; i++) { zwp_linux_buffer_params_v1_add(params, fd, i /* plane id */, offsets[i], @@ -81,8 +88,8 @@ } // TODO(msisov): handle buffer swap failure or success. -bool WaylandBufferManager::SwapBuffer(gfx::AcceleratedWidget widget, - uint32_t buffer_id) { +bool WaylandBufferManager::ScheduleBufferSwap(gfx::AcceleratedWidget widget, + uint32_t buffer_id) { TRACE_EVENT1("Wayland", "WaylandBufferManager::SwapBuffer", "Buffer id", buffer_id); @@ -90,39 +97,24 @@ return false; auto it = buffers_.find(buffer_id); - // A buffer might not exist by this time. So, store the request and process - // it once it is created. if (it == buffers_.end()) { - auto pending_buffers_it = pending_buffer_map_.find(buffer_id); - if (pending_buffers_it != pending_buffer_map_.end()) { - // If a buffer didn't exist and second call for a swap comes, buffer must - // be associated with the same widget. - DCHECK_EQ(pending_buffers_it->second, widget); - } else { - pending_buffer_map_.insert( - std::pair<uint32_t, gfx::AcceleratedWidget>(buffer_id, widget)); - } - return true; - } - struct wl_buffer* buffer = it->second.get(); - - WaylandWindow* window = connection_->GetWindow(widget); - if (!window) { - error_message_ = "A WaylandWindow with current widget does not exist"; + error_message_ = + "Buffer with " + std::to_string(buffer_id) + " id does not exist"; return false; } - // TODO(msisov): it would be beneficial to use real damage regions to improve - // performance. - // - // TODO(msisov): also start using wl_surface_frame callbacks for better - // performance. - wl_surface_damage(window->surface(), 0, 0, window->GetBounds().width(), - window->GetBounds().height()); - wl_surface_attach(window->surface(), buffer, 0, 0); - wl_surface_commit(window->surface()); + Buffer* buffer = it->second.get(); + DCHECK(buffer); - connection_->ScheduleFlush(); + // Assign a widget to this buffer, which is used to find a corresponding + // WaylandWindow. + buffer->widget = widget; + + if (buffer->wl_buffer) { + // A wl_buffer might not exist by this time. Silently return. + // TODO: check this. + return SwapBuffer(buffer); + } return true; } @@ -143,8 +135,28 @@ void WaylandBufferManager::ClearState() { buffers_.clear(); - params_to_id_map_.clear(); - pending_buffer_map_.clear(); +} + +// TODO(msisov): handle buffer swap failure or success. +bool WaylandBufferManager::SwapBuffer(Buffer* buffer) { + WaylandWindow* window = connection_->GetWindow(buffer->widget); + if (!window) { + error_message_ = "A WaylandWindow with current widget does not exist"; + return false; + } + + // TODO(msisov): it would be beneficial to use real damage regions to improve + // performance. + // + // TODO(msisov): also start using wl_surface_frame callbacks for better + // performance. + wl_surface_damage(window->surface(), 0, 0, window->GetBounds().width(), + window->GetBounds().height()); + wl_surface_attach(window->surface(), buffer->wl_buffer.get(), 0, 0); + wl_surface_commit(window->surface()); + + connection_->ScheduleFlush(); + return true; } bool WaylandBufferManager::ValidateDataFromGpu( @@ -187,6 +199,12 @@ if (buffer_id < 1) reason = "Invalid buffer id: " + std::to_string(buffer_id); + auto it = buffers_.find(buffer_id); + if (it != buffers_.end()) { + reason = "A buffer with " + std::to_string(buffer_id) + + " id has already existed"; + } + if (!reason.empty()) { error_message_ = std::move(reason); return false; @@ -218,24 +236,21 @@ struct wl_buffer* new_buffer) { // Find which buffer id |params| belong to and store wl_buffer // with that id. - auto it = params_to_id_map_.find(params); - CHECK(it != params_to_id_map_.end()); - uint32_t buffer_id = it->second; - params_to_id_map_.erase(params); + Buffer* buffer = nullptr; + for (auto& item : buffers_) { + if (item.second.get()->params == params) { + buffer = item.second.get(); + break; + } + } + + DCHECK(buffer); + buffer->wl_buffer.reset(new_buffer); + buffer->params = nullptr; zwp_linux_buffer_params_v1_destroy(params); - buffers_.insert(std::pair<uint32_t, wl::Object<wl_buffer>>( - buffer_id, wl::Object<wl_buffer>(new_buffer))); - - TRACE_EVENT1("Wayland", "WaylandBufferManager::CreateSucceeded", "Buffer id", - buffer_id); - - auto pending_buffers_it = pending_buffer_map_.find(buffer_id); - if (pending_buffers_it != pending_buffer_map_.end()) { - gfx::AcceleratedWidget widget = pending_buffers_it->second; - pending_buffer_map_.erase(pending_buffers_it); - SwapBuffer(widget, buffer_id); - } + if (buffer->widget != gfx::kNullAcceleratedWidget) + ScheduleBufferSwap(buffer->widget, buffer->buffer_id); } // static
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager.h b/ui/ozone/platform/wayland/wayland_buffer_manager.h index a12b6565..d52d508 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager.h +++ b/ui/ozone/platform/wayland/wayland_buffer_manager.h
@@ -53,7 +53,7 @@ // Assigns a wl_buffer with |buffer_id| to a window with the same |widget|. On // error, false is returned and |error_message_| is set. - bool SwapBuffer(gfx::AcceleratedWidget widget, uint32_t buffer_id); + bool ScheduleBufferSwap(gfx::AcceleratedWidget widget, uint32_t buffer_id); // Destroys a buffer with |buffer_id| in |buffers_|. On error, false is // returned and |error_message_| is set. @@ -63,6 +63,35 @@ void ClearState(); private: + // This is an internal helper representation of a wayland buffer object, which + // the GPU process creates when CreateBuffer is called. It's used for + // asynchronous buffer creation and stores |params| parameter to find out, + // which Buffer the wl_buffer corresponds to when CreateSucceeded is called. + // What is more, the Buffer stores such information as a widget it is attached + // to, its buffer id for simplier buffer management and other members specific + // to this Buffer object on run-time. + struct Buffer { + Buffer(); + Buffer(uint32_t id, zwp_linux_buffer_params_v1* zwp_params); + ~Buffer(); + + // GPU GbmPixmapWayland corresponding buffer id. + uint32_t buffer_id = 0; + + // Widget to attached/being attach WaylandWindow. + gfx::AcceleratedWidget widget = gfx::kNullAcceleratedWidget; + + // Params that are used to create a wl_buffer. + zwp_linux_buffer_params_v1* params = nullptr; + + // A wl_buffer backed by a dmabuf created on the GPU side. + wl::Object<wl_buffer> wl_buffer; + + DISALLOW_COPY_AND_ASSIGN(Buffer); + }; + + bool SwapBuffer(Buffer* buffer); + // Validates data sent from GPU. If invalid, returns false and sets an error // message to |error_message_|. bool ValidateDataFromGpu(const base::File& file, @@ -97,25 +126,12 @@ static void CreateFailed(void* data, struct zwp_linux_buffer_params_v1* params); - // Stores a wl_buffer and it's id provided by the GbmBuffer object on the - // GPU process side. - base::flat_map<uint32_t, wl::Object<wl_buffer>> buffers_; - - // A temporary params-to-buffer id map, which is used to identify which - // id wl_buffer should be assigned when storing it in the |buffers_| map - // during CreateSucceeded call. - base::flat_map<struct zwp_linux_buffer_params_v1*, uint32_t> - params_to_id_map_; - - // It might happen that GPU asks to swap buffers, when a wl_buffer hasn't - // been created yet. Thus, store the request in a pending map. Once a buffer - // is created, it will be attached to the requested WaylandWindow based on the - // gfx::AcceleratedWidget. - base::flat_map<uint32_t, gfx::AcceleratedWidget> pending_buffer_map_; - // Stores announced buffer formats supported by the compositor. std::vector<gfx::BufferFormat> supported_buffer_formats_; + // A container of created buffers. + base::flat_map<uint32_t, std::unique_ptr<Buffer>> buffers_; + // Set when invalid data is received from the GPU process. std::string error_message_;
diff --git a/ui/ozone/platform/wayland/wayland_connection.cc b/ui/ozone/platform/wayland/wayland_connection.cc index 690504f..2f836c76 100644 --- a/ui/ozone/platform/wayland/wayland_connection.cc +++ b/ui/ozone/platform/wayland/wayland_connection.cc
@@ -177,7 +177,7 @@ void WaylandConnection::ScheduleBufferSwap(gfx::AcceleratedWidget widget, uint32_t buffer_id) { DCHECK(base::MessageLoopForUI::IsCurrent()); - if (!buffer_manager_->SwapBuffer(widget, buffer_id)) { + if (!buffer_manager_->ScheduleBufferSwap(widget, buffer_id)) { TerminateGpuProcess(buffer_manager_->error_message()); } }
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb index 7a360dd..e42bc43 100644 --- a/ui/strings/translations/ui_strings_am.xtb +++ b/ui/strings/translations/ui_strings_am.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">የላይ ቀስት</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> ጊባ/ሰ</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> ጊባ</translation> +<translation id="3842239759367498783">ከእርስዎ ተንቀሳቃሽ መሣሪያ <ph name="TITLE" /> ማንበብ ይቀጥሉ</translation> <translation id="385051799172605136">ተመለስ</translation> <translation id="3889424535448813030">ቀኝ ቀስት</translation> <translation id="3892641579809465218">የውስጥ ማሳያ</translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb index ebb8ff18..9eadb7b9 100644 --- a/ui/strings/translations/ui_strings_ar.xtb +++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">مفتاح سهم إلى أعلى</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> غيغابايت/ثانية</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> غيغابايت</translation> +<translation id="3842239759367498783">تابع القراءة من جهازك الجوّال <ph name="TITLE" /></translation> <translation id="385051799172605136">الرجوع إلى الوراء</translation> <translation id="3889424535448813030">مفتاح سهم إلى اليمين</translation> <translation id="3892641579809465218">العرض الداخلي</translation>
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb index 2b4f2797..9103061 100644 --- a/ui/strings/translations/ui_strings_bg.xtb +++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Стрелка нагоре</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/сек</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> ГБ</translation> +<translation id="3842239759367498783">Продължете четенето от мобилното си устройство <ph name="TITLE" /></translation> <translation id="385051799172605136">Назад</translation> <translation id="3889424535448813030">Стрелка надясно</translation> <translation id="3892641579809465218">Показване на вътрешна информация</translation>
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb index 137f702..0af6eff 100644 --- a/ui/strings/translations/ui_strings_ca.xtb +++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Fletxa amunt</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continua la lectura des del dispositiu mòbil <ph name="TITLE" /></translation> <translation id="385051799172605136">Enrere</translation> <translation id="3889424535448813030">Fletxa dreta</translation> <translation id="3892641579809465218">Pantalla interna</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb index 84a767e..f8c70bf 100644 --- a/ui/strings/translations/ui_strings_cs.xtb +++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Klávesa šipka nahoru</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Pokračujte ve čtení v mobilním zařízení <ph name="TITLE" /></translation> <translation id="385051799172605136">Zpět</translation> <translation id="3889424535448813030">Klávesa šipka vpravo</translation> <translation id="3892641579809465218">Interní displej</translation>
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb index 9f5e339..5a55c142 100644 --- a/ui/strings/translations/ui_strings_da.xtb +++ b/ui/strings/translations/ui_strings_da.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Pil opad</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sek.</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Fortsæt med at læse via din mobilenhed <ph name="TITLE" /></translation> <translation id="385051799172605136">Tilbage</translation> <translation id="3889424535448813030">Højrepil</translation> <translation id="3892641579809465218">Intern skærm</translation>
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb index 4084298..c6017c8 100644 --- a/ui/strings/translations/ui_strings_de.xtb +++ b/ui/strings/translations/ui_strings_de.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Aufwärtspfeil</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783"><ph name="TITLE" /> auf meinem Mobilgerät weiterlesen</translation> <translation id="385051799172605136">Zurück</translation> <translation id="3889424535448813030">Rechtspfeil</translation> <translation id="3892641579809465218">Interne Anzeige</translation>
diff --git a/ui/strings/translations/ui_strings_el.xtb b/ui/strings/translations/ui_strings_el.xtb index 24258db..fadfbd9 100644 --- a/ui/strings/translations/ui_strings_el.xtb +++ b/ui/strings/translations/ui_strings_el.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Πάνω βέλος</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Συνέχεια ανάγνωσης από την κινητή συσκευή σας <ph name="TITLE" /></translation> <translation id="385051799172605136">Πίσω</translation> <translation id="3889424535448813030">Δεξιό βέλος</translation> <translation id="3892641579809465218">Εσωτερική οθόνη</translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb index b443fa9..f18b69cb 100644 --- a/ui/strings/translations/ui_strings_es.xtb +++ b/ui/strings/translations/ui_strings_es.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Flecha arriba</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continúa leyendo en tu dispositivo móvil <ph name="TITLE" /></translation> <translation id="385051799172605136">Atrás</translation> <translation id="3889424535448813030">Flecha derecha</translation> <translation id="3892641579809465218">Pantalla interna</translation>
diff --git a/ui/strings/translations/ui_strings_et.xtb b/ui/strings/translations/ui_strings_et.xtb index 77f23f1..c2fbec2 100644 --- a/ui/strings/translations/ui_strings_et.xtb +++ b/ui/strings/translations/ui_strings_et.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Ülesnool</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Jätkake lugemist mobiilseadmes <ph name="TITLE" /></translation> <translation id="385051799172605136">Tagasi</translation> <translation id="3889424535448813030">Paremnool</translation> <translation id="3892641579809465218">Sisemine kuva</translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb index 6961be2..8d27b72 100644 --- a/ui/strings/translations/ui_strings_fa.xtb +++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">پیکان بالا</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> گیگابایت/ثانیه</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> گیگابایت</translation> +<translation id="3842239759367498783">ادامه خواندن در دستگاه همراه <ph name="TITLE" /></translation> <translation id="385051799172605136">بازگشت</translation> <translation id="3889424535448813030">پیکان راست</translation> <translation id="3892641579809465218">صفحه نمایش داخلی</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb index 754b1dc6..cb5b518 100644 --- a/ui/strings/translations/ui_strings_fil.xtb +++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Up Arrow</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> (na) GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> (na) GB</translation> +<translation id="3842239759367498783">Magpatuloy sa pagbabasa mula sa iyong mobile device na <ph name="TITLE" /></translation> <translation id="385051799172605136">Bumalik</translation> <translation id="3889424535448813030">Right Arrow</translation> <translation id="3892641579809465218">Panloob na Display</translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb index b592eb1..c82f3222 100644 --- a/ui/strings/translations/ui_strings_fr.xtb +++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Haut</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> Go/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> Go</translation> +<translation id="3842239759367498783">Poursuivre la lecture de "<ph name="TITLE" />" depuis votre appareil mobile</translation> <translation id="385051799172605136">Retour</translation> <translation id="3889424535448813030">Droite</translation> <translation id="3892641579809465218">Affichage interne</translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb index 7777753c..dc93dd0 100644 --- a/ui/strings/translations/ui_strings_gu.xtb +++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">ઉપર એરો</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">તમારા મોબાઇલ ઉપકરણ <ph name="TITLE" />માંથી વાંચવાનું ચાલુ રાખો</translation> <translation id="385051799172605136">પાછળ</translation> <translation id="3889424535448813030">જમણો એરો</translation> <translation id="3892641579809465218">આંતરિક પ્રદર્શન</translation> @@ -85,6 +86,7 @@ <translation id="4971687151119236543">મીડિયા પહેલાંનું ટ્રૅક</translation> <translation id="5046499563572181734">અહીં ટૅપ કરો</translation> <translation id="5076340679995252485">પેસ્ટ કરો</translation> +<translation id="5137751499640340777">Google આસિસ્ટંટ શરૂ કરો</translation> <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">પ્રકટીકરણ ત્રિકોણ</translation> <translation id="528468243742722775">સમાપ્ત</translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb index f7cd711..de30c11d 100644 --- a/ui/strings/translations/ui_strings_hi.xtb +++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">ऊपर तीर</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> जीबी/सेकंड</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> जीबी</translation> +<translation id="3842239759367498783">अपने मोबाइल डिवाइस से <ph name="TITLE" /> पढ़ना जारी रखें</translation> <translation id="385051799172605136">वापस</translation> <translation id="3889424535448813030">दायां तीर</translation> <translation id="3892641579809465218">आंतरिक डिस्प्ले</translation>
diff --git a/ui/strings/translations/ui_strings_hr.xtb b/ui/strings/translations/ui_strings_hr.xtb index 0bc875d4..172f324 100644 --- a/ui/strings/translations/ui_strings_hr.xtb +++ b/ui/strings/translations/ui_strings_hr.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Strelica prema gore</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Nastavite čitati s mobilnog uređaja <ph name="TITLE" /></translation> <translation id="385051799172605136">Natrag</translation> <translation id="3889424535448813030">Strelica desno</translation> <translation id="3892641579809465218">Unutarnji zaslon</translation>
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb index ceab60f1..ee1cdcb 100644 --- a/ui/strings/translations/ui_strings_hu.xtb +++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Felfelé nyíl</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783"><ph name="TITLE" /> olvasásának folytatása a mobileszközön</translation> <translation id="385051799172605136">Vissza</translation> <translation id="3889424535448813030">Jobb nyíl</translation> <translation id="3892641579809465218">Belső kijelző</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb index 9a263e3..0bb689be 100644 --- a/ui/strings/translations/ui_strings_id.xtb +++ b/ui/strings/translations/ui_strings_id.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Panah Atas</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/dtk</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Lanjutkan membaca dari perangkat seluler <ph name="TITLE" /></translation> <translation id="385051799172605136">Mundur</translation> <translation id="3889424535448813030">Panah Kanan</translation> <translation id="3892641579809465218">Tampilan Internal</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb index 581ebb5..dffa76c 100644 --- a/ui/strings/translations/ui_strings_it.xtb +++ b/ui/strings/translations/ui_strings_it.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Freccia SU</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continua a leggere dal tuo dispositivo mobile <ph name="TITLE" /></translation> <translation id="385051799172605136">Indietro</translation> <translation id="3889424535448813030">Freccia destra</translation> <translation id="3892641579809465218">Display interno</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb index e880b9cc..9fb17de 100644 --- a/ui/strings/translations/ui_strings_iw.xtb +++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">חץ למעלה</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">אפשר להמשיך לקרוא מהמכשיר הנייד <ph name="TITLE" /></translation> <translation id="385051799172605136">חזור</translation> <translation id="3889424535448813030">חץ לימין</translation> <translation id="3892641579809465218">תצוגה פנימית</translation>
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb index 97be1638..64e3f226 100644 --- a/ui/strings/translations/ui_strings_ja.xtb +++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">上矢印キー</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/秒</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">モバイル端末で読む: <ph name="TITLE" /></translation> <translation id="385051799172605136">戻る</translation> <translation id="3889424535448813030">右矢印キー</translation> <translation id="3892641579809465218">内蔵ディスプレイ</translation>
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb index d285667..4fdba064 100644 --- a/ui/strings/translations/ui_strings_kn.xtb +++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನ <ph name="TITLE" /> ನಿಂದ ಓದುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="385051799172605136">ಹಿಂದೆ</translation> <translation id="3889424535448813030">ಬಲ ಬಾಣದ ಗುರುತು</translation> <translation id="3892641579809465218">ಆಂತರಿಕ ಪ್ರದರ್ಶನ</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb index fa16177a..72f0471 100644 --- a/ui/strings/translations/ui_strings_ko.xtb +++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">위쪽 화살표</translation> <translation id="3740362395218339114"><ph name="QUANTITY" />GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" />GB</translation> +<translation id="3842239759367498783">휴대기기에서 <ph name="TITLE" /> 계속 읽기</translation> <translation id="385051799172605136">뒤로</translation> <translation id="3889424535448813030">오른쪽 화살표</translation> <translation id="3892641579809465218">내부 디스플레이</translation>
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb index da1831ec..d251920 100644 --- a/ui/strings/translations/ui_strings_lt.xtb +++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Rodyklė „Aukštyn“</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Toliau skaityti iš mobiliojo įrenginio „<ph name="TITLE" />“</translation> <translation id="385051799172605136">Grįžti</translation> <translation id="3889424535448813030">Rodyklė į dešinę</translation> <translation id="3892641579809465218">Vidinė pateiktis</translation>
diff --git a/ui/strings/translations/ui_strings_lv.xtb b/ui/strings/translations/ui_strings_lv.xtb index dedae20..9fa2d176 100644 --- a/ui/strings/translations/ui_strings_lv.xtb +++ b/ui/strings/translations/ui_strings_lv.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Bulta augšup</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Turpiniet lasīt no savas mobilās ierīces <ph name="TITLE" /></translation> <translation id="385051799172605136">Atpakaļ</translation> <translation id="3889424535448813030">Labā bulta</translation> <translation id="3892641579809465218">Iekšējais displejs</translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb index f6a909cc..782c6f3 100644 --- a/ui/strings/translations/ui_strings_ml.xtb +++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">നിങ്ങളുടെ <ph name="TITLE" /> എന്ന മൊബൈലിൽ നിന്ന് വായന തുടരുക</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> <translation id="3889424535448813030">വലതുഭാഗത്തെ അമ്പടയാളം</translation> <translation id="3892641579809465218">ആന്തരിക പ്രദർശനം</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb index 9ee1ad4d..b7b8912c 100644 --- a/ui/strings/translations/ui_strings_mr.xtb +++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Up Arrow</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">तुमच्या मोबाइल डिव्हाइसवरून वाचणे सुरू ठेवा <ph name="TITLE" /></translation> <translation id="385051799172605136">मागील</translation> <translation id="3889424535448813030">Right Arrow</translation> <translation id="3892641579809465218">अंतर्गत डिस्प्ले</translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb index d7ef5c15..6079a3a 100644 --- a/ui/strings/translations/ui_strings_nl.xtb +++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Pijl-omhoog</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Verder lezen vanaf je mobiele apparaat <ph name="TITLE" /></translation> <translation id="385051799172605136">Vorige</translation> <translation id="3889424535448813030">Pijl-rechts</translation> <translation id="3892641579809465218">Interne display</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb index a50c658..a4d4506 100644 --- a/ui/strings/translations/ui_strings_no.xtb +++ b/ui/strings/translations/ui_strings_no.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Pil opp</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB per sek</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Fortsett lesingen på mobilenheten <ph name="TITLE" /></translation> <translation id="385051799172605136">Tilbake</translation> <translation id="3889424535448813030">Pil høyre</translation> <translation id="3892641579809465218">Innebygd skjerm</translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb index d870552..84a8870 100644 --- a/ui/strings/translations/ui_strings_pl.xtb +++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Strzałka w górę</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Kontynuuj czytanie przerwane na urządzeniu mobilnym <ph name="TITLE" /></translation> <translation id="385051799172605136">Wstecz</translation> <translation id="3889424535448813030">Strzałka w prawo</translation> <translation id="3892641579809465218">Wyświetlacz wewnętrzny</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb index b37ec86..65c884f 100644 --- a/ui/strings/translations/ui_strings_pt-BR.xtb +++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Seta para cima</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continuar lendo no dispositivo móvel <ph name="TITLE" /></translation> <translation id="385051799172605136">Voltar</translation> <translation id="3889424535448813030">Seta para a direita</translation> <translation id="3892641579809465218">Display interno</translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb index 52e3d3ac..5a7b03f 100644 --- a/ui/strings/translations/ui_strings_pt-PT.xtb +++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Seta para cima</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continuar a ler no dispositivo móvel <ph name="TITLE" /></translation> <translation id="385051799172605136">Anterior</translation> <translation id="3889424535448813030">Seta para a direita</translation> <translation id="3892641579809465218">Ecrã interno</translation>
diff --git a/ui/strings/translations/ui_strings_ro.xtb b/ui/strings/translations/ui_strings_ro.xtb index a524bdf0..facf907 100644 --- a/ui/strings/translations/ui_strings_ro.xtb +++ b/ui/strings/translations/ui_strings_ro.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Săgeată în sus</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Continuă să citești de pe dispozitivul mobil <ph name="TITLE" /></translation> <translation id="385051799172605136">Înapoi</translation> <translation id="3889424535448813030">Săgeată spre dreapta</translation> <translation id="3892641579809465218">Afișaj intern</translation>
diff --git a/ui/strings/translations/ui_strings_ru.xtb b/ui/strings/translations/ui_strings_ru.xtb index 18e807d4..b86ba9e 100644 --- a/ui/strings/translations/ui_strings_ru.xtb +++ b/ui/strings/translations/ui_strings_ru.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Стрелка вверх</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/с</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> ГБ</translation> +<translation id="3842239759367498783">Продолжить чтение с мобильного устройства "<ph name="TITLE" />"</translation> <translation id="385051799172605136">Назад</translation> <translation id="3889424535448813030">Стрелка вправо</translation> <translation id="3892641579809465218">Встроенный дисплей</translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb index d32de5c2..e8c5b5d2 100644 --- a/ui/strings/translations/ui_strings_sk.xtb +++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Šípka nahor</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Pokračujte v čítaní v mobilnom zariadení <ph name="TITLE" /></translation> <translation id="385051799172605136">Naspäť</translation> <translation id="3889424535448813030">Šípka doprava</translation> <translation id="3892641579809465218">Interný displej</translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb index 6ad48fe8..f31aaace 100644 --- a/ui/strings/translations/ui_strings_sr.xtb +++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Стрелица нагоре</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Наставите да читате на мобилном уређају <ph name="TITLE" /></translation> <translation id="385051799172605136">Назад</translation> <translation id="3889424535448813030">Стрелица надесно</translation> <translation id="3892641579809465218">Интерни екран</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb index 65b21241..ea50a3ed 100644 --- a/ui/strings/translations/ui_strings_sv.xtb +++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Uppil</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sek</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Fortsätt att läsa på din mobila enhet <ph name="TITLE" /></translation> <translation id="385051799172605136">Bakåt</translation> <translation id="3889424535448813030">Högerpil</translation> <translation id="3892641579809465218">Intern bildskärm</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb index 88ad2f9..970247d9 100644 --- a/ui/strings/translations/ui_strings_sw.xtb +++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Mshale Juu</translation> <translation id="3740362395218339114">GB/s <ph name="QUANTITY" /></translation> <translation id="3757388668994797779">GB <ph name="QUANTITY" /></translation> +<translation id="3842239759367498783">Endelea kusoma kwenye kifaa chako cha mkononi <ph name="TITLE" /></translation> <translation id="385051799172605136">Nyuma</translation> <translation id="3889424535448813030">Mshale Kulia</translation> <translation id="3892641579809465218">Onyesho la Ndani</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index 06b6993..f11a783 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> ஜி.பை/வி</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">உங்கள் மொபைல் ஃபோனில் தொடர்ந்து <ph name="TITLE" />ஐப் படிக்கவும்</translation> <translation id="385051799172605136">முந்தைய பக்கம்</translation> <translation id="3889424535448813030">வலது அம்பு</translation> <translation id="3892641579809465218">இணையக் காட்சி</translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb index 56ac3c8..341051a4 100644 --- a/ui/strings/translations/ui_strings_te.xtb +++ b/ui/strings/translations/ui_strings_te.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">ఎగువ బాణం</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">మీ మొబైల్ పరికరం <ph name="TITLE" /> నుండి చదవడం కొనసాగించండి</translation> <translation id="385051799172605136">వెనుకకు</translation> <translation id="3889424535448813030">కుడి బాణం</translation> <translation id="3892641579809465218">అంతర్గత ప్రదర్శన</translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb index ac1ce6fa..9d4594cc 100644 --- a/ui/strings/translations/ui_strings_th.xtb +++ b/ui/strings/translations/ui_strings_th.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">ลูกศรขึ้น</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/วินาที</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">อ่านต่อจากอุปกรณ์เคลื่อนที่ <ph name="TITLE" /></translation> <translation id="385051799172605136">กลับ</translation> <translation id="3889424535448813030">ลูกศรขวา</translation> <translation id="3892641579809465218">จอแสดงผลภายใน</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb index 48dd87e..9520ba8f 100644 --- a/ui/strings/translations/ui_strings_tr.xtb +++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Yukarı Ok</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sn</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783"><ph name="TITLE" /> adlı mobil cihazınızdan okumaya devam edin</translation> <translation id="385051799172605136">Geri</translation> <translation id="3889424535448813030">Sağ Ok</translation> <translation id="3892641579809465218">Dahili Ekran</translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb index da4c56d..80f1ca64 100644 --- a/ui/strings/translations/ui_strings_uk.xtb +++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Курсор угору</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/сек.</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> ГБ</translation> +<translation id="3842239759367498783">Продовжити читати "<ph name="TITLE" />" на мобільному пристрої</translation> <translation id="385051799172605136">Назад</translation> <translation id="3889424535448813030">Курсор праворуч</translation> <translation id="3892641579809465218">Внутрішній екран</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb index 72ba938..427de99c7 100644 --- a/ui/strings/translations/ui_strings_vi.xtb +++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">Phím mũi tên Lên</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/giây</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">Tiếp tục đọc bằng thiết bị di động <ph name="TITLE" /></translation> <translation id="385051799172605136">Quay lại</translation> <translation id="3889424535448813030">Mũi tên phải</translation> <translation id="3892641579809465218">Màn hình nội bộ</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb index e51ed97a..9dfa3f6 100644 --- a/ui/strings/translations/ui_strings_zh-CN.xtb +++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">向上箭头</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">继续在移动设备“<ph name="TITLE" />”上阅读</translation> <translation id="385051799172605136">后退</translation> <translation id="3889424535448813030">向右箭头</translation> <translation id="3892641579809465218">内部显示屏</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb index 50e384ee..b172356 100644 --- a/ui/strings/translations/ui_strings_zh-TW.xtb +++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -65,6 +65,7 @@ <translation id="3660179305079774227">向上鍵</translation> <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/秒</translation> <translation id="3757388668994797779"><ph name="QUANTITY" /> GB</translation> +<translation id="3842239759367498783">你可以在行動裝置「<ph name="TITLE" />」上繼續閱讀</translation> <translation id="385051799172605136">返回</translation> <translation id="3889424535448813030">向右鍵</translation> <translation id="3892641579809465218">內建顯示器</translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index d49ca288..62b8973 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -54,6 +54,7 @@ public = [ "accessibility/view_accessibility.h", + "accessibility/view_accessibility_utils.h", "accessible_pane_view.h", "animation/bounds_animator.h", "animation/bounds_animator_observer.h", @@ -256,6 +257,7 @@ sources = [ "accessibility/view_accessibility.cc", + "accessibility/view_accessibility_utils.cc", "accessible_pane_view.cc", "animation/bounds_animator.cc", "animation/flood_fill_ink_drop_ripple.cc",
diff --git a/ui/views/accessibility/view_accessibility_utils.cc b/ui/views/accessibility/view_accessibility_utils.cc new file mode 100644 index 0000000..1074424 --- /dev/null +++ b/ui/views/accessibility/view_accessibility_utils.cc
@@ -0,0 +1,45 @@ +// 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/accessibility/view_accessibility_utils.h" + +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" + +namespace views { + +// static +Widget* ViewAccessibilityUtils::GetFocusedChildWidgetForAccessibility( + const View* view) { + const FocusManager* focus_manager = view->GetFocusManager(); + if (!focus_manager) + return nullptr; + const View* focused_view = view->GetFocusManager()->GetFocusedView(); + if (!focused_view) + return nullptr; + + std::set<Widget*> child_widgets; + Widget::GetAllOwnedWidgets(view->GetWidget()->GetNativeView(), + &child_widgets); + for (auto iter = child_widgets.begin(); iter != child_widgets.end(); ++iter) { + Widget* child_widget = *iter; + DCHECK_NE(view->GetWidget(), child_widget); + + if (IsFocusedChildWidget(child_widget, focused_view)) + return child_widget; + } + + return nullptr; +} + +// static +bool ViewAccessibilityUtils::IsFocusedChildWidget(Widget* widget, + const View* focused_view) { + return widget->widget_delegate()->GetModalType() == ui::MODAL_TYPE_CHILD && + widget->IsVisible() && + widget->GetContentsView()->Contains(focused_view); +}; + +} // namespace views
diff --git a/ui/views/accessibility/view_accessibility_utils.h b/ui/views/accessibility/view_accessibility_utils.h new file mode 100644 index 0000000..e08b4107 --- /dev/null +++ b/ui/views/accessibility/view_accessibility_utils.h
@@ -0,0 +1,30 @@ +// 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_ACCESSIBILITY_VIEW_ACCESSIBILITY_UTILS_H_ +#define UI_VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_UTILS_H_ + +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" + +namespace views { + +class VIEWS_EXPORT ViewAccessibilityUtils { + public: + // Returns a focused child widget if the view has a child that should be + // treated as a special case. For example, if a tab modal dialog is visible + // and focused, this will return the dialog when called on the BrowserView. + // This helper function is used to treat such widgets as separate windows for + // accessibility. Returns nullptr if no such widget is present. + static Widget* GetFocusedChildWidgetForAccessibility(const View* view); + + // Used by GetFocusedChildWidgetForAccessibility to determine if a Widget + // should be handled separately. When visible and focused, these include: + // - tab modal dialogs + static bool IsFocusedChildWidget(Widget* widget, const View* focused_view); +}; + +} // namespace views + +#endif // UI_VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_UTILS_H_
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.cc b/ui/views/accessibility/view_ax_platform_node_delegate.cc index 846e1345..4f212d0 100644 --- a/ui/views/accessibility/view_ax_platform_node_delegate.cc +++ b/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -12,6 +12,7 @@ #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/events/event_utils.h" #include "ui/gfx/native_widget_types.h" +#include "ui/views/accessibility/view_accessibility_utils.h" #include "ui/views/controls/native/native_view_host.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -400,12 +401,10 @@ if (widget->GetNativeWindowProperty(kWidgetNativeViewHostKey)) continue; - // Focused tab-modal dialogs should take the place of the web page they - // cover in the accessibility tree. - if (child_widget->widget_delegate()->GetModalType() == - ui::MODAL_TYPE_CHILD && - focused_view && - child_widget->GetContentsView()->Contains(focused_view)) { + // Focused child widgets should take the place of the web page they cover in + // the accessibility tree. + if (ViewAccessibilityUtils::IsFocusedChildWidget(child_widget, + focused_view)) { result_child_widgets->clear(); result_child_widgets->push_back(child_widget); *is_tab_modal_showing = true;
diff --git a/ui/views/cocoa/bridged_content_view.h b/ui/views/cocoa/bridged_content_view.h index a09f701..5843597a 100644 --- a/ui/views/cocoa/bridged_content_view.h +++ b/ui/views/cocoa/bridged_content_view.h
@@ -16,7 +16,7 @@ } namespace views { -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; } // The NSView that sits as the root contentView of the NSWindow, whilst it has @@ -28,7 +28,7 @@ NSServicesMenuRequestor> { @private // Weak, reset by clearView. - views::BridgedNativeWidget* bridge_; + views::BridgedNativeWidgetImpl* bridge_; // Weak. If non-null the TextInputClient of the currently focused View in the // hierarchy rooted at |hostedView_|. Owned by the focused View. @@ -54,12 +54,13 @@ base::string16 lastTooltipText_; } -@property(readonly, nonatomic) views::BridgedNativeWidget* bridge; +@property(readonly, nonatomic) views::BridgedNativeWidgetImpl* bridge; @property(assign, nonatomic) ui::TextInputClient* textInputClient; @property(assign, nonatomic) BOOL drawMenuBackgroundForBlur; // Initialize the NSView -> views::View bridge. |viewToHost| must be non-NULL. -- (id)initWithBridge:(views::BridgedNativeWidget*)bridge bounds:(gfx::Rect)rect; +- (id)initWithBridge:(views::BridgedNativeWidgetImpl*)bridge + bounds:(gfx::Rect)rect; // Clear the hosted view. For example, if it is about to be destroyed. - (void)clearView;
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm index c030b12..8af88bc 100644 --- a/ui/views/cocoa/bridged_content_view.mm +++ b/ui/views/cocoa/bridged_content_view.mm
@@ -273,7 +273,7 @@ @synthesize textInputClient = textInputClient_; @synthesize drawMenuBackgroundForBlur = drawMenuBackgroundForBlur_; -- (id)initWithBridge:(views::BridgedNativeWidget*)bridge +- (id)initWithBridge:(views::BridgedNativeWidgetImpl*)bridge bounds:(gfx::Rect)bounds { // To keep things simple, assume the origin is (0, 0) until there exists a use // case for something other than that.
diff --git a/ui/views/cocoa/bridged_native_widget.h b/ui/views/cocoa/bridged_native_widget.h index bcb255f..e9553b2 100644 --- a/ui/views/cocoa/bridged_native_widget.h +++ b/ui/views/cocoa/bridged_native_widget.h
@@ -52,7 +52,7 @@ // A bridge to an NSWindow managed by an instance of NativeWidgetMac or // DesktopNativeWidgetMac. Serves as a helper class to bridge requests from the // NativeWidgetMac to the Cocoa window. Behaves a bit like an aura::Window. -class VIEWS_EXPORT BridgedNativeWidget +class VIEWS_EXPORT BridgedNativeWidgetImpl : public views_bridge_mac::mojom::BridgedNativeWidget, public display::DisplayObserver, public ui::CATransactionCoordinator::PreCommitObserver, @@ -68,15 +68,15 @@ const gfx::Size& size); // Creates one side of the bridge. |host| and |parent| must not be NULL. - BridgedNativeWidget(BridgedNativeWidgetHost* host, - BridgedNativeWidgetHostHelper* host_helper, - NativeWidgetMac* parent); - ~BridgedNativeWidget() override; + BridgedNativeWidgetImpl(BridgedNativeWidgetHost* host, + BridgedNativeWidgetHostHelper* host_helper, + NativeWidgetMac* parent); + ~BridgedNativeWidgetImpl() override; // Initialize the NSWindow by taking ownership of the specified object. - // TODO(ccameron): When a BridgedNativeWidget is allocated across a process - // boundary, it will not be possible to explicitly set an NSWindow in this - // way. + // TODO(ccameron): When a BridgedNativeWidgetImpl is allocated across a + // process boundary, it will not be possible to explicitly set an NSWindow in + // this way. void SetWindow(base::scoped_nsobject<NativeWidgetMacNSWindow> window); // Create the drag drop client for this widget. @@ -173,7 +173,7 @@ // parent will close children before the parent closes, and children will be // raised above their parent when window z-order changes. BridgedNativeWidgetOwner* parent() { return parent_; } - const std::vector<BridgedNativeWidget*>& child_windows() { + const std::vector<BridgedNativeWidgetImpl*>& child_windows() { return child_windows_; } @@ -253,7 +253,8 @@ private: friend class test::BridgedNativeWidgetTestApi; - // Closes all child windows. BridgedNativeWidget children will be destroyed. + // Closes all child windows. BridgedNativeWidgetImpl children will be + // destroyed. void RemoveOrDestroyChildren(); // Notify descendants of a visibility change. @@ -289,7 +290,7 @@ NSWindow* GetNSWindow() override; gfx::Vector2d GetChildWindowOffset() const override; bool IsVisibleParent() const override; - void RemoveChildWindow(BridgedNativeWidget* child) override; + void RemoveChildWindow(BridgedNativeWidgetImpl* child) override; BridgedNativeWidgetHost* const host_; // Weak. Owns this. BridgedNativeWidgetHostHelper* const host_helper_; // Weak, owned by |host_|. @@ -306,7 +307,7 @@ bool is_translucent_window_ = false; BridgedNativeWidgetOwner* parent_ = nullptr; // Weak. If non-null, owns this. - std::vector<BridgedNativeWidget*> child_windows_; + std::vector<BridgedNativeWidgetImpl*> child_windows_; // The size of the content area of the window most recently sent to |host_| // (and its compositor). @@ -355,7 +356,7 @@ AssociatedViews associated_views_; - DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidget); + DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidgetImpl); }; } // namespace views
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm index 6b65cb2..881dcc2 100644 --- a/ui/views/cocoa/bridged_native_widget.mm +++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -107,10 +107,10 @@ @implementation ModalShowAnimationWithLayer { // This is the "real" delegate, but this class acts as the NSAnimationDelegate // to avoid a separate object. - views::BridgedNativeWidget* bridgedNativeWidget_; + views::BridgedNativeWidgetImpl* bridgedNativeWidget_; } - (instancetype)initWithBridgedNativeWidget: - (views::BridgedNativeWidget*)widget { + (views::BridgedNativeWidgetImpl*)widget { if ((self = [super initWithWindow:widget->ns_window()])) { bridgedNativeWidget_ = widget; [self setDelegate:self]; @@ -179,7 +179,7 @@ } void RankNSViews(views::View* view, - const views::BridgedNativeWidget::AssociatedViews& hosts, + const views::BridgedNativeWidgetImpl::AssociatedViews& hosts, RankMap* rank) { auto it = hosts.find(view); if (it != hosts.end()) @@ -212,7 +212,7 @@ return NSOrderedSame; } -// Counts windows managed by a BridgedNativeWidget instance in the +// Counts windows managed by a BridgedNativeWidgetImpl instance in the // |child_windows| array ignoring the windows added by AppKit. NSUInteger CountBridgedWindows(NSArray* child_windows) { NSUInteger count = 0; @@ -228,7 +228,7 @@ namespace views { // static -gfx::Size BridgedNativeWidget::GetWindowSizeForClientSize( +gfx::Size BridgedNativeWidgetImpl::GetWindowSizeForClientSize( NSWindow* window, const gfx::Size& content_size) { NSRect content_rect = @@ -237,7 +237,7 @@ return gfx::Size(NSWidth(frame_rect), NSHeight(frame_rect)); } -BridgedNativeWidget::BridgedNativeWidget( +BridgedNativeWidgetImpl::BridgedNativeWidgetImpl( BridgedNativeWidgetHost* host, BridgedNativeWidgetHostHelper* host_helper, NativeWidgetMac* parent) @@ -248,7 +248,7 @@ ui::CATransactionCoordinator::Get().AddPreCommitObserver(this); } -BridgedNativeWidget::~BridgedNativeWidget() { +BridgedNativeWidgetImpl::~BridgedNativeWidgetImpl() { // The delegate should be cleared already. Note this enforces the precondition // that -[NSWindow close] is invoked on the hosted window before the // destructor is called. @@ -260,7 +260,7 @@ DestroyContentView(); } -void BridgedNativeWidget::SetWindow( +void BridgedNativeWidgetImpl::SetWindow( base::scoped_nsobject<NativeWidgetMacNSWindow> window) { DCHECK(!window_); window_ = std::move(window); @@ -268,9 +268,9 @@ [window_ setDelegate:window_delegate_]; } -void BridgedNativeWidget::SetParent(NSView* new_parent) { - BridgedNativeWidget* bridged_native_widget_parent = - NativeWidgetMac::GetBridgeForNativeWindow([new_parent window]); +void BridgedNativeWidgetImpl::SetParent(NSView* new_parent) { + BridgedNativeWidgetImpl* bridged_native_widget_parent = + NativeWidgetMac::GetBridgeImplForNativeWindow([new_parent window]); // Remove from the old parent. if (parent_) { parent_->RemoveChildWindow(this); @@ -283,9 +283,10 @@ // Disallow creating child windows of views not currently in an NSWindow. CHECK([new_parent window]); - // If the parent is another BridgedNativeWidget, just add to the collection - // of child windows it owns and manages. Otherwise, create an adapter to - // anchor the child widget and observe when the parent NSWindow is closed. + // If the parent is another BridgedNativeWidgetImpl, just add to the + // collection of child windows it owns and manages. Otherwise, create an + // adapter to anchor the child widget and observe when the parent NSWindow is + // closed. if (bridged_native_widget_parent) { parent_ = bridged_native_widget_parent; bridged_native_widget_parent->child_windows_.push_back(this); @@ -301,7 +302,7 @@ NSWindowCollectionBehaviorTransient]; } -void BridgedNativeWidget::InitWindow( +void BridgedNativeWidgetImpl::InitWindow( views_bridge_mac::mojom::BridgedNativeWidgetInitParamsPtr params) { modal_type_ = params->modal_type; is_translucent_window_ = params->is_translucent; @@ -341,7 +342,7 @@ tooltip_manager_.reset(new TooltipManagerMac(this)); } -void BridgedNativeWidget::SetInitialBounds( +void BridgedNativeWidgetImpl::SetInitialBounds( const gfx::Rect& new_bounds, const gfx::Size& minimum_content_size, const gfx::Vector2d& bounds_offset_for_parent) { @@ -365,8 +366,8 @@ SetBounds(adjusted_bounds, minimum_content_size); } -void BridgedNativeWidget::SetBounds(const gfx::Rect& new_bounds, - const gfx::Size& minimum_content_size) { +void BridgedNativeWidgetImpl::SetBounds(const gfx::Rect& new_bounds, + const gfx::Size& minimum_content_size) { // -[NSWindow contentMinSize] is only checked by Cocoa for user-initiated // resizes. This is not what toolkit-views expects, so clamp. Note there is // no check for maximum size (consistent with aura::Window::SetBounds()). @@ -398,7 +399,7 @@ animate:NO]; } -void BridgedNativeWidget::DestroyContentView() { +void BridgedNativeWidgetImpl::DestroyContentView() { if (!bridged_view_) return; drag_drop_client_.reset(); @@ -407,7 +408,7 @@ [window_ setContentView:nil]; } -void BridgedNativeWidget::CreateContentView(const gfx::Rect& bounds) { +void BridgedNativeWidgetImpl::CreateContentView(const gfx::Rect& bounds) { DCHECK(!bridged_view_); // The compositor needs to point at the new content view created here. DCHECK(!compositor_superview_); @@ -426,11 +427,11 @@ [window_ setContentView:bridged_view_]; } -void BridgedNativeWidget::CreateDragDropClient(views::View* view) { +void BridgedNativeWidgetImpl::CreateDragDropClient(views::View* view) { drag_drop_client_.reset(new DragDropClientMac(this, view)); } -void BridgedNativeWidget::CloseWindow() { +void BridgedNativeWidgetImpl::CloseWindow() { // Keep |window| on the stack so that the ObjectiveC block below can capture // it and properly increment the reference count bound to the posted task. NSWindow* window = ns_window(); @@ -475,7 +476,7 @@ }))); } -void BridgedNativeWidget::CloseWindowNow() { +void BridgedNativeWidgetImpl::CloseWindowNow() { // NSWindows must be retained until -[NSWindow close] returns. auto window_retain = window_; @@ -485,7 +486,8 @@ // Note: |this| will be deleted here. } -void BridgedNativeWidget::SetVisibilityState(WindowVisibilityState new_state) { +void BridgedNativeWidgetImpl::SetVisibilityState( + WindowVisibilityState new_state) { // Ensure that: // - A window with an invisible parent is not made visible. // - A parent changing visibility updates child window visibility. @@ -578,7 +580,7 @@ } } -void BridgedNativeWidget::AcquireCapture() { +void BridgedNativeWidgetImpl::AcquireCapture() { if (HasCapture()) return; if (!window_visible_) @@ -596,16 +598,16 @@ [window_ cursorUpdate:[NSApp currentEvent]]; } -void BridgedNativeWidget::ReleaseCapture() { +void BridgedNativeWidgetImpl::ReleaseCapture() { mouse_capture_.reset(); } -bool BridgedNativeWidget::HasCapture() { +bool BridgedNativeWidgetImpl::HasCapture() { return mouse_capture_ && mouse_capture_->IsActive(); } -Widget::MoveLoopResult BridgedNativeWidget::RunMoveLoop( - const gfx::Vector2d& drag_offset) { +Widget::MoveLoopResult BridgedNativeWidgetImpl::RunMoveLoop( + const gfx::Vector2d& drag_offset) { DCHECK(!HasCapture()); DCHECK(!window_move_loop_); @@ -631,14 +633,14 @@ // function returns. But don't DCHECK since |this| might not be valid. } -void BridgedNativeWidget::EndMoveLoop() { +void BridgedNativeWidgetImpl::EndMoveLoop() { DCHECK(window_move_loop_); window_move_loop_->End(); window_move_loop_.reset(); } -void BridgedNativeWidget::SetNativeWindowProperty(const char* name, - void* value) { +void BridgedNativeWidgetImpl::SetNativeWindowProperty(const char* name, + void* value) { NSString* key = [NSString stringWithUTF8String:name]; if (value) { [GetWindowProperties() setObject:[NSValue valueWithPointer:value] @@ -648,19 +650,19 @@ } } -void* BridgedNativeWidget::GetNativeWindowProperty(const char* name) const { +void* BridgedNativeWidgetImpl::GetNativeWindowProperty(const char* name) const { NSString* key = [NSString stringWithUTF8String:name]; return [[GetWindowProperties() objectForKey:key] pointerValue]; } -void BridgedNativeWidget::SetCursor(NSCursor* cursor) { +void BridgedNativeWidgetImpl::SetCursor(NSCursor* cursor) { [window_delegate_ setCursor:cursor]; } -void BridgedNativeWidget::OnWindowWillClose() { +void BridgedNativeWidgetImpl::OnWindowWillClose() { host_->OnWindowWillClose(); - // Ensure BridgedNativeWidget does not have capture, otherwise + // Ensure BridgedNativeWidgetImpl does not have capture, otherwise // OnMouseCaptureLost() may reference a deleted |host_| when called via // ~CocoaMouseCapture() upon the destruction of |mouse_capture_|. See // https://crbug.com/622201. Also we do this before setting the delegate to @@ -682,7 +684,7 @@ // Note: |this| and its host will be deleted here. } -void BridgedNativeWidget::OnFullscreenTransitionStart( +void BridgedNativeWidgetImpl::OnFullscreenTransitionStart( bool target_fullscreen_state) { // Note: This can fail for fullscreen changes started externally, but a user // shouldn't be able to do that if the window is invisible to begin with. @@ -695,7 +697,7 @@ host_->OnWindowFullscreenTransitionStart(target_fullscreen_state); } -void BridgedNativeWidget::OnFullscreenTransitionComplete( +void BridgedNativeWidgetImpl::OnFullscreenTransitionComplete( bool actual_fullscreen_state) { in_fullscreen_transition_ = false; @@ -712,7 +714,7 @@ ToggleDesiredFullscreenState(true /* async */); } -void BridgedNativeWidget::ToggleDesiredFullscreenState(bool async) { +void BridgedNativeWidgetImpl::ToggleDesiredFullscreenState(bool async) { // If there is currently an animation into or out of fullscreen, then AppKit // emits the string "not in fullscreen state" to stdio and does nothing. For // this case, schedule a transition back into the desired state when the @@ -761,15 +763,15 @@ } } -void BridgedNativeWidget::OnSizeChanged() { +void BridgedNativeWidgetImpl::OnSizeChanged() { UpdateWindowGeometry(); } -void BridgedNativeWidget::OnPositionChanged() { +void BridgedNativeWidgetImpl::OnPositionChanged() { UpdateWindowGeometry(); } -void BridgedNativeWidget::OnVisibilityChanged() { +void BridgedNativeWidgetImpl::OnVisibilityChanged() { const bool window_visible = [window_ isVisible]; if (window_visible_ == window_visible) return; @@ -812,24 +814,24 @@ [window_ setAutodisplay:window_visible_]; } -void BridgedNativeWidget::OnSystemControlTintChanged() { +void BridgedNativeWidgetImpl::OnSystemControlTintChanged() { ui::NativeTheme::GetInstanceForNativeUi()->NotifyObservers(); } -void BridgedNativeWidget::OnBackingPropertiesChanged() { +void BridgedNativeWidgetImpl::OnBackingPropertiesChanged() { UpdateWindowDisplay(); } -void BridgedNativeWidget::OnWindowKeyStatusChangedTo(bool is_key) { +void BridgedNativeWidgetImpl::OnWindowKeyStatusChangedTo(bool is_key) { host_->OnWindowKeyStatusChanged( is_key, [window_ contentView] == [window_ firstResponder], [NSApp isFullKeyboardAccessEnabled]); } -void BridgedNativeWidget::SetSizeConstraints(const gfx::Size& min_size, - const gfx::Size& max_size, - bool is_resizable, - bool is_maximizable) { +void BridgedNativeWidgetImpl::SetSizeConstraints(const gfx::Size& min_size, + const gfx::Size& max_size, + bool is_resizable, + bool is_maximizable) { // Don't modify the size constraints or fullscreen collection behavior while // in fullscreen or during a transition. OnFullscreenTransitionComplete will // reset these after leaving fullscreen. @@ -845,11 +847,11 @@ shows_fullscreen_controls); } -void BridgedNativeWidget::OnShowAnimationComplete() { +void BridgedNativeWidgetImpl::OnShowAnimationComplete() { show_animation_.reset(); } -void BridgedNativeWidget::InitCompositorView() { +void BridgedNativeWidgetImpl::InitCompositorView() { AddCompositorSuperview(); // Use the regular window background for window modal sheets. The layer will @@ -878,20 +880,20 @@ UpdateWindowGeometry(); } -void BridgedNativeWidget::SetAssociationForView(const views::View* view, - NSView* native_view) { +void BridgedNativeWidgetImpl::SetAssociationForView(const views::View* view, + NSView* native_view) { DCHECK_EQ(0u, associated_views_.count(view)); associated_views_[view] = native_view; native_widget_mac_->GetWidget()->ReorderNativeViews(); } -void BridgedNativeWidget::ClearAssociationForView(const views::View* view) { +void BridgedNativeWidgetImpl::ClearAssociationForView(const views::View* view) { auto it = associated_views_.find(view); DCHECK(it != associated_views_.end()); associated_views_.erase(it); } -void BridgedNativeWidget::ReorderChildViews() { +void BridgedNativeWidgetImpl::ReorderChildViews() { // Ignore layer manipulation during a Close(). This can be reached during the // orderOut: in Close(), which notifies visibility changes to Views. if (!bridged_view_) @@ -908,14 +910,14 @@ [bridged_view_ sortSubviewsUsingFunction:&SubviewSorter context:&rank]; } -void BridgedNativeWidget::ReparentNativeView(NSView* native_view, - NSView* new_parent) { +void BridgedNativeWidgetImpl::ReparentNativeView(NSView* native_view, + NSView* new_parent) { DCHECK([new_parent window]); DCHECK([native_view isDescendantOf:bridged_view_]); DCHECK(window_ && ![window_ isSheet]); - BridgedNativeWidget* parent_bridge = - NativeWidgetMac::GetBridgeForNativeWindow([new_parent window]); + BridgedNativeWidgetImpl* parent_bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow([new_parent window]); if (native_view == bridged_view_.get() && parent_bridge != parent_) { SetParent(new_parent); @@ -940,13 +942,13 @@ } } -void BridgedNativeWidget::SetAnimationEnabled(bool animate) { +void BridgedNativeWidgetImpl::SetAnimationEnabled(bool animate) { [window_ setAnimationBehavior:(animate ? NSWindowAnimationBehaviorDocumentWindow : NSWindowAnimationBehaviorNone)]; } -bool BridgedNativeWidget::ShouldRunCustomAnimationFor( +bool BridgedNativeWidgetImpl::ShouldRunCustomAnimationFor( Widget::VisibilityTransition transition) const { // The logic around this needs to change if new transition types are set. // E.g. it would be nice to distinguish "hide" from "close". Mac currently @@ -977,23 +979,23 @@ return true; } -NSWindow* BridgedNativeWidget::ns_window() { +NSWindow* BridgedNativeWidgetImpl::ns_window() { return window_.get(); } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, ui::CATransactionObserver +// BridgedNativeWidgetImpl, ui::CATransactionObserver -void BridgedNativeWidget::OnDisplayMetricsChanged( +void BridgedNativeWidgetImpl::OnDisplayMetricsChanged( const display::Display& display, uint32_t metrics) { UpdateWindowDisplay(); } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, ui::CATransactionObserver +// BridgedNativeWidgetImpl, ui::CATransactionObserver -bool BridgedNativeWidget::ShouldWaitInPreCommit() { +bool BridgedNativeWidgetImpl::ShouldWaitInPreCommit() { if (!window_visible_) return false; if (ca_transaction_sync_suppressed_) @@ -1003,40 +1005,40 @@ return content_dip_size_ != compositor_frame_dip_size_; } -base::TimeDelta BridgedNativeWidget::PreCommitTimeout() { +base::TimeDelta BridgedNativeWidgetImpl::PreCommitTimeout() { return kUIPaintTimeout; } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, CocoaMouseCaptureDelegate: +// BridgedNativeWidgetImpl, CocoaMouseCaptureDelegate: -void BridgedNativeWidget::PostCapturedEvent(NSEvent* event) { +void BridgedNativeWidgetImpl::PostCapturedEvent(NSEvent* event) { [bridged_view_ processCapturedMouseEvent:event]; } -void BridgedNativeWidget::OnMouseCaptureLost() { +void BridgedNativeWidgetImpl::OnMouseCaptureLost() { host_->OnMouseCaptureActiveChanged(false); } -NSWindow* BridgedNativeWidget::GetWindow() const { +NSWindow* BridgedNativeWidgetImpl::GetWindow() const { return window_; } //////////////////////////////////////////////////////////////////////////////// // TODO(ccameron): Update class names to: -// BridgedNativeWidgetImpl, BridgedNativeWidget: +// BridgedNativeWidgetImpl, BridgedNativeWidgetImpl: -void BridgedNativeWidget::SetVisibleOnAllSpaces(bool always_visible) { +void BridgedNativeWidgetImpl::SetVisibleOnAllSpaces(bool always_visible) { gfx::SetNSWindowVisibleOnAllWorkspaces(window_, always_visible); } -void BridgedNativeWidget::SetFullscreen(bool fullscreen) { +void BridgedNativeWidgetImpl::SetFullscreen(bool fullscreen) { if (fullscreen == target_fullscreen_state_) return; ToggleDesiredFullscreenState(); } -void BridgedNativeWidget::SetMiniaturized(bool miniaturized) { +void BridgedNativeWidgetImpl::SetMiniaturized(bool miniaturized) { if (miniaturized) { // Calling performMiniaturize: will momentarily highlight the button, but // AppKit will reject it if there is no miniaturize button. @@ -1049,17 +1051,17 @@ } } -void BridgedNativeWidget::SetOpacity(float opacity) { +void BridgedNativeWidgetImpl::SetOpacity(float opacity) { [window_ setAlphaValue:opacity]; } -void BridgedNativeWidget::SetContentAspectRatio( +void BridgedNativeWidgetImpl::SetContentAspectRatio( const gfx::SizeF& aspect_ratio) { [window_ setContentAspectRatio:NSMakeSize(aspect_ratio.width(), aspect_ratio.height())]; } -void BridgedNativeWidget::SetCALayerParams( +void BridgedNativeWidgetImpl::SetCALayerParams( const gfx::CALayerParams& ca_layer_params) { // Ignore frames arriving "late" for an old size. A frame at the new size // should arrive soon. @@ -1082,44 +1084,45 @@ } } -void BridgedNativeWidget::MakeFirstResponder() { +void BridgedNativeWidgetImpl::MakeFirstResponder() { [window_ makeFirstResponder:bridged_view_]; } -void BridgedNativeWidget::SetWindowTitle(const base::string16& title) { +void BridgedNativeWidgetImpl::SetWindowTitle(const base::string16& title) { NSString* new_title = base::SysUTF16ToNSString(title); [window_ setTitle:new_title]; } -void BridgedNativeWidget::ClearTouchBar() { +void BridgedNativeWidgetImpl::ClearTouchBar() { if (@available(macOS 10.12.2, *)) { if ([bridged_view_ respondsToSelector:@selector(setTouchBar:)]) [bridged_view_ setTouchBar:nil]; } } -void BridgedNativeWidget::SetTextInputClient( +void BridgedNativeWidgetImpl::SetTextInputClient( ui::TextInputClient* text_input_client) { [bridged_view_ setTextInputClient:text_input_client]; } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, BridgedNativeWidgetOwner: +// BridgedNativeWidgetImpl, BridgedNativeWidgetOwner: -NSWindow* BridgedNativeWidget::GetNSWindow() { +NSWindow* BridgedNativeWidgetImpl::GetNSWindow() { return window_; } -gfx::Vector2d BridgedNativeWidget::GetChildWindowOffset() const { +gfx::Vector2d BridgedNativeWidgetImpl::GetChildWindowOffset() const { return gfx::ScreenRectFromNSRect([window_ frame]).OffsetFromOrigin(); } -bool BridgedNativeWidget::IsVisibleParent() const { +bool BridgedNativeWidgetImpl::IsVisibleParent() const { return parent_ ? window_visible_ && parent_->IsVisibleParent() : window_visible_; } -void BridgedNativeWidget::RemoveChildWindow(BridgedNativeWidget* child) { +void BridgedNativeWidgetImpl::RemoveChildWindow( + BridgedNativeWidgetImpl* child) { auto location = std::find( child_windows_.begin(), child_windows_.end(), child); DCHECK(location != child_windows_.end()); @@ -1132,9 +1135,9 @@ } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, private: +// BridgedNativeWidgetImpl, private: -void BridgedNativeWidget::RemoveOrDestroyChildren() { +void BridgedNativeWidgetImpl::RemoveOrDestroyChildren() { // TODO(tapted): Implement unowned child windows if required. while (!child_windows_.empty()) { // The NSWindow can only be destroyed after -[NSWindow close] is complete. @@ -1146,13 +1149,13 @@ } } -void BridgedNativeWidget::NotifyVisibilityChangeDown() { +void BridgedNativeWidgetImpl::NotifyVisibilityChangeDown() { // Child windows sometimes like to close themselves in response to visibility // changes. That's supported, but only with the asynchronous Widget::Close(). // Perform a heuristic to detect child removal that would break these loops. const size_t child_count = child_windows_.size(); if (!window_visible_) { - for (BridgedNativeWidget* child : child_windows_) { + for (BridgedNativeWidgetImpl* child : child_windows_) { if (child->window_visible_) [child->ns_window() orderOut:nil]; @@ -1163,7 +1166,7 @@ // in each child. There, children will remove themselves from the NSWindow // childWindow list as well as propagate NotifyVisibilityChangeDown() calls // to any children of their own. However this is only true for windows - // managed by the BridgedNativeWidget i.e. windows which have + // managed by the BridgedNativeWidgetImpl i.e. windows which have // ViewsNSWindowDelegate as the delegate. DCHECK_EQ(0u, CountBridgedWindows([window_ childWindows])); return; @@ -1171,7 +1174,7 @@ NSUInteger visible_bridged_children = 0; // For a DCHECK below. NSInteger parent_window_number = [window_ windowNumber]; - for (BridgedNativeWidget* child: child_windows_) { + for (BridgedNativeWidgetImpl* child : child_windows_) { // Note: order the child windows on top, regardless of whether or not they // are currently visible. They probably aren't, since the parent was hidden // prior to this, but they could have been made visible in other ways. @@ -1195,7 +1198,7 @@ CountBridgedWindows([window_ childWindows])); } -void BridgedNativeWidget::AddCompositorSuperview() { +void BridgedNativeWidgetImpl::AddCompositorSuperview() { DCHECK(!compositor_superview_); compositor_superview_.reset( [[ViewsCompositorSuperview alloc] initWithFrame:[bridged_view_ bounds]]); @@ -1224,7 +1227,7 @@ [bridged_view_ addSubview:compositor_superview_]; } -void BridgedNativeWidget::UpdateWindowGeometry() { +void BridgedNativeWidgetImpl::UpdateWindowGeometry() { gfx::Rect window_in_screen = gfx::ScreenRectFromNSRect([window_ frame]); gfx::Rect content_in_screen = gfx::ScreenRectFromNSRect( [window_ contentRectForFrameRect:[window_ frame]]); @@ -1242,16 +1245,16 @@ invalidate_shadow_on_frame_swap_ = true; } -void BridgedNativeWidget::UpdateWindowDisplay() { +void BridgedNativeWidgetImpl::UpdateWindowDisplay() { host_->OnWindowDisplayChanged( display::Screen::GetScreen()->GetDisplayNearestWindow(window_)); } -bool BridgedNativeWidget::IsWindowModalSheet() const { +bool BridgedNativeWidgetImpl::IsWindowModalSheet() const { return parent_ && modal_type_ == ui::MODAL_TYPE_WINDOW; } -void BridgedNativeWidget::ShowAsModalSheet() { +void BridgedNativeWidgetImpl::ShowAsModalSheet() { // -[NSApp beginSheet:] will block the UI thread while the animation runs. // So that it doesn't animate a fully transparent window, first wait for a // frame. The first step is to pretend that the window is already visible. @@ -1272,7 +1275,7 @@ contextInfo:nullptr]; } -NSMutableDictionary* BridgedNativeWidget::GetWindowProperties() const { +NSMutableDictionary* BridgedNativeWidgetImpl::GetWindowProperties() const { NSMutableDictionary* properties = objc_getAssociatedObject( window_, &kWindowPropertiesKey); if (!properties) {
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h index 9fdaabd4..3cdc3304 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.h +++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -30,11 +30,11 @@ namespace views { -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; class NativeWidgetMac; // The portion of NativeWidgetMac that lives in the browser process. This -// communicates to the BridgedNativeWidget, which interacts with the Cocoa +// communicates to the BridgedNativeWidgetImpl, which interacts with the Cocoa // APIs, and which may live in an app shim process. class VIEWS_EXPORT BridgedNativeWidgetHostImpl : public BridgedNativeWidgetHostHelper, @@ -50,10 +50,10 @@ explicit BridgedNativeWidgetHostImpl(NativeWidgetMac* parent); ~BridgedNativeWidgetHostImpl() override; - // Provide direct access to the BridgedNativeWidget that this is hosting. + // Provide direct access to the BridgedNativeWidgetImpl that this is hosting. // TODO(ccameron): Remove all accesses to this member, and replace them // with methods that may be sent across processes. - BridgedNativeWidget* bridge_impl() const { return bridge_impl_.get(); } + BridgedNativeWidgetImpl* bridge_impl() const { return bridge_impl_.get(); } views_bridge_mac::mojom::BridgedNativeWidget* bridge() const; void InitWindow(const Widget::InitParams& params); @@ -217,10 +217,10 @@ views::View* root_view_ = nullptr; // Weak. Owned by |native_widget_mac_|. - // TODO(ccameron): Rather than instantiate a BridgedNativeWidget here, - // we will instantiate a mojo BridgedNativeWidget interface to a Cocoa + // TODO(ccameron): Rather than instantiate a BridgedNativeWidgetImpl here, + // we will instantiate a mojo BridgedNativeWidgetImpl interface to a Cocoa // instance that may be in another process. - std::unique_ptr<BridgedNativeWidget> bridge_impl_; + std::unique_ptr<BridgedNativeWidgetImpl> bridge_impl_; std::unique_ptr<ui::InputMethod> input_method_; FocusManager* focus_manager_ = nullptr; // Weak. Owned by our Widget.
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm index d9845fe..1ba281e 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.mm +++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -45,7 +45,7 @@ BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl( NativeWidgetMac* parent) : native_widget_mac_(parent), - bridge_impl_(new BridgedNativeWidget(this, this, parent)) {} + bridge_impl_(new BridgedNativeWidgetImpl(this, this, parent)) {} BridgedNativeWidgetHostImpl::~BridgedNativeWidgetHostImpl() { // Destroy the bridge first to prevent any calls back into this during @@ -202,7 +202,7 @@ if (layer()) { // LayerOwner supports a change in ownership, e.g., to animate a closing // window, but that won't work as expected for the root layer in - // BridgedNativeWidget. + // BridgedNativeWidgetImpl. DCHECK_EQ(this, layer()->owner()); layer()->CompleteAllAnimations(); layer()->SuppressPaint(); @@ -685,7 +685,7 @@ } //////////////////////////////////////////////////////////////////////////////// -// BridgedNativeWidget, internal::InputMethodDelegate: +// BridgedNativeWidgetImpl, internal::InputMethodDelegate: ui::EventDispatchDetails BridgedNativeWidgetHostImpl::DispatchKeyEventPostIME( ui::KeyEvent* key) {
diff --git a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm index 53c32814..37c289d 100644 --- a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm +++ b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -251,7 +251,7 @@ } // namespace // This is used to inject test versions of NativeFrameView and -// BridgedNativeWidget. +// BridgedNativeWidgetImpl. class HitTestNativeWidgetMac : public NativeWidgetMac { public: HitTestNativeWidgetMac(internal::NativeWidgetDelegate* delegate,
diff --git a/ui/views/cocoa/bridged_native_widget_owner.h b/ui/views/cocoa/bridged_native_widget_owner.h index 9869ed5..c9e15b5e 100644 --- a/ui/views/cocoa/bridged_native_widget_owner.h +++ b/ui/views/cocoa/bridged_native_widget_owner.h
@@ -13,7 +13,7 @@ namespace views { -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; // An abstract interface wrapping an NSWindow that ties the lifetime of one or // more child BridgedNativeWidgets to the lifetime of that NSWindow. This is not @@ -32,7 +32,7 @@ // Removes a child window. Note |this| may be deleted after calling, so the // caller should immediately null out the pointer used to make the call. - virtual void RemoveChildWindow(BridgedNativeWidget* child) = 0; + virtual void RemoveChildWindow(BridgedNativeWidgetImpl* child) = 0; protected: // Instances of this class may be self-deleting.
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index a79f61f5..7213a28 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -290,12 +290,12 @@ namespace views { namespace test { -// Provides the |parent| argument to construct a BridgedNativeWidget. +// Provides the |parent| argument to construct a BridgedNativeWidgetImpl. class MockNativeWidgetMac : public NativeWidgetMac { public: explicit MockNativeWidgetMac(internal::NativeWidgetDelegate* delegate) : NativeWidgetMac(delegate) {} - using NativeWidgetMac::bridge; + using NativeWidgetMac::bridge_impl; using NativeWidgetMac::bridge_host_for_testing; // internal::NativeWidgetPrivate: @@ -308,7 +308,7 @@ styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]); - bridge()->SetWindow(window); + bridge_impl()->SetWindow(window); bridge_host_for_testing()->InitWindow(params); // Usually the bridge gets initialized here. It is skipped to run extra @@ -327,7 +327,7 @@ DISALLOW_COPY_AND_ASSIGN(MockNativeWidgetMac); }; -// Helper test base to construct a BridgedNativeWidget with a valid parent. +// Helper test base to construct a BridgedNativeWidgetImpl with a valid parent. class BridgedNativeWidgetTestBase : public ui::CocoaTest { public: struct SkipInitialization {}; @@ -339,7 +339,9 @@ explicit BridgedNativeWidgetTestBase(SkipInitialization tag) : native_widget_mac_(nullptr) {} - BridgedNativeWidget* bridge() { return native_widget_mac_->bridge(); } + BridgedNativeWidgetImpl* bridge() { + return native_widget_mac_->bridge_impl(); + } BridgedNativeWidgetHostImpl* bridge_host() { return native_widget_mac_->bridge_host_for_testing(); } @@ -382,7 +384,7 @@ } NSWindow* bridge_window() const { - return native_widget_mac_->bridge()->ns_window(); + return native_widget_mac_->bridge_impl()->ns_window(); } protected: @@ -833,7 +835,7 @@ DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidgetInitTest); }; -// Test that BridgedNativeWidget remains sane if Init() is never called. +// Test that BridgedNativeWidgetImpl remains sane if Init() is never called. TEST_F(BridgedNativeWidgetInitTest, InitNotCalled) { // Don't use a Widget* as the delegate. ~Widget() checks for Widget:: // |native_widget_destroyed_| being set to true. That can only happen with a @@ -1605,8 +1607,8 @@ object:window]; // On a failure, Cocoa starts by sending an unexpected *exit* fullscreen, and - // BridgedNativeWidget will think it's just a delayed transition and try to go - // back into fullscreen but get ignored by Cocoa. + // BridgedNativeWidgetImpl will think it's just a delayed transition and try + // to go back into fullscreen but get ignored by Cocoa. EXPECT_EQ(0, [window ignoredToggleFullScreenCount]); EXPECT_TRUE(bridge()->target_fullscreen_state()); [center postNotificationName:NSWindowDidExitFullScreenNotification
diff --git a/ui/views/cocoa/cocoa_window_move_loop.h b/ui/views/cocoa/cocoa_window_move_loop.h index e688884..3ddfa701 100644 --- a/ui/views/cocoa/cocoa_window_move_loop.h +++ b/ui/views/cocoa/cocoa_window_move_loop.h
@@ -12,12 +12,12 @@ #include "ui/views/widget/widget.h" namespace views { -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; -// Used by views::BridgedNativeWidget when dragging detached tabs. +// Used by views::BridgedNativeWidgetImpl when dragging detached tabs. class CocoaWindowMoveLoop { public: - CocoaWindowMoveLoop(BridgedNativeWidget* owner, + CocoaWindowMoveLoop(BridgedNativeWidgetImpl* owner, const NSPoint& initial_mouse_in_screen); ~CocoaWindowMoveLoop(); @@ -32,7 +32,7 @@ WINDOW_DESTROYED, }; - BridgedNativeWidget* owner_; // Weak. Owns this. + BridgedNativeWidgetImpl* owner_; // Weak. Owns this. // Initial mouse location at the time before the CocoaWindowMoveLoop is // created.
diff --git a/ui/views/cocoa/cocoa_window_move_loop.mm b/ui/views/cocoa/cocoa_window_move_loop.mm index a306f9c..a7f21dc 100644 --- a/ui/views/cocoa/cocoa_window_move_loop.mm +++ b/ui/views/cocoa/cocoa_window_move_loop.mm
@@ -39,13 +39,11 @@ namespace views { -CocoaWindowMoveLoop::CocoaWindowMoveLoop( - BridgedNativeWidget* owner, - const NSPoint& initial_mouse_in_screen) +CocoaWindowMoveLoop::CocoaWindowMoveLoop(BridgedNativeWidgetImpl* owner, + const NSPoint& initial_mouse_in_screen) : owner_(owner), initial_mouse_in_screen_(initial_mouse_in_screen), - weak_factory_(this) { -} + weak_factory_(this) {} CocoaWindowMoveLoop::~CocoaWindowMoveLoop() { // Handle the pathological case, where |this| is destroyed while running.
diff --git a/ui/views/cocoa/drag_drop_client_mac.h b/ui/views/cocoa/drag_drop_client_mac.h index 2e11299..f4044b7 100644 --- a/ui/views/cocoa/drag_drop_client_mac.h +++ b/ui/views/cocoa/drag_drop_client_mac.h
@@ -32,7 +32,7 @@ class DragDropClientMacTest; } -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; class View; // Implements drag and drop on MacViews. This class acts as a bridge between @@ -40,7 +40,7 @@ // DesktopDragDropClientAuraX11. class VIEWS_EXPORT DragDropClientMac { public: - explicit DragDropClientMac(BridgedNativeWidget* bridge, View* root_view); + DragDropClientMac(BridgedNativeWidgetImpl* bridge, View* root_view); ~DragDropClientMac(); // Initiates a drag and drop session. Returns the drag operation that was @@ -80,7 +80,7 @@ int operation_; // The bridge between the content view and the drag drop client. - BridgedNativeWidget* bridge_; // Weak. Owns |this|. + BridgedNativeWidgetImpl* bridge_; // Weak. Owns |this|. // The closure for the drag and drop's run loop. base::Closure quit_closure_;
diff --git a/ui/views/cocoa/drag_drop_client_mac.mm b/ui/views/cocoa/drag_drop_client_mac.mm index 78e7b0b..7a4741e 100644 --- a/ui/views/cocoa/drag_drop_client_mac.mm +++ b/ui/views/cocoa/drag_drop_client_mac.mm
@@ -57,7 +57,7 @@ namespace views { -DragDropClientMac::DragDropClientMac(BridgedNativeWidget* bridge, +DragDropClientMac::DragDropClientMac(BridgedNativeWidgetImpl* bridge, View* root_view) : drop_helper_(root_view), operation_(0),
diff --git a/ui/views/cocoa/drag_drop_client_mac_unittest.mm b/ui/views/cocoa/drag_drop_client_mac_unittest.mm index 9f3559de..ff1a53a 100644 --- a/ui/views/cocoa/drag_drop_client_mac_unittest.mm +++ b/ui/views/cocoa/drag_drop_client_mac_unittest.mm
@@ -186,8 +186,8 @@ gfx::Rect bounds(0, 0, 100, 100); widget_->SetBounds(bounds); - bridge_ = - NativeWidgetMac::GetBridgeForNativeWindow(widget_->GetNativeWindow()); + bridge_ = NativeWidgetMac::GetBridgeImplForNativeWindow( + widget_->GetNativeWindow()); bridge_host_ = NativeWidgetMac::GetBridgeHostImplForNativeWindow( widget_->GetNativeWindow()); widget_->Show(); @@ -207,7 +207,7 @@ protected: Widget* widget_ = nullptr; - BridgedNativeWidget* bridge_ = nullptr; + BridgedNativeWidgetImpl* bridge_ = nullptr; BridgedNativeWidgetHostImpl* bridge_host_ = nullptr; DragDropView* target_ = nullptr; base::scoped_nsobject<MockDraggingInfo> dragging_info_;
diff --git a/ui/views/cocoa/native_widget_mac_nswindow.mm b/ui/views/cocoa/native_widget_mac_nswindow.mm index 3e5775b..9801529 100644 --- a/ui/views/cocoa/native_widget_mac_nswindow.mm +++ b/ui/views/cocoa/native_widget_mac_nswindow.mm
@@ -114,9 +114,9 @@ - (void)sheetDidEnd:(NSWindow*)sheet returnCode:(NSInteger)returnCode contextInfo:(void*)contextInfo { - // Note BridgedNativeWidget may have cleared [self delegate], in which case - // this will no-op. This indirection is necessary to handle AppKit invoking - // this selector via a posted task. See https://crbug.com/851376. + // Note BridgedNativeWidgetImpl may have cleared [self delegate], in which + // case this will no-op. This indirection is necessary to handle AppKit + // invoking this selector via a posted task. See https://crbug.com/851376. [[self viewsNSWindowDelegate] sheetDidEnd:sheet returnCode:returnCode contextInfo:contextInfo]; @@ -189,7 +189,7 @@ // Dialogs and bubbles shouldn't take large shadows away from their parent. views::Widget* widget = [self viewsWidget]; return widget->CanActivate() && - !views::NativeWidgetMac::GetBridgeForNativeWindow(self)->parent(); + !views::NativeWidgetMac::GetBridgeImplForNativeWindow(self)->parent(); } // Lets the traffic light buttons on the parent window keep their active state.
diff --git a/ui/views/cocoa/tooltip_manager_mac.h b/ui/views/cocoa/tooltip_manager_mac.h index 208fb4e..3160b62 100644 --- a/ui/views/cocoa/tooltip_manager_mac.h +++ b/ui/views/cocoa/tooltip_manager_mac.h
@@ -9,12 +9,12 @@ #include "ui/views/widget/tooltip_manager.h" namespace views { -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; -// Manages native Cocoa tooltips for the given BridgedNativeWidget. +// Manages native Cocoa tooltips for the given BridgedNativeWidgetImpl. class TooltipManagerMac : public TooltipManager { public: - explicit TooltipManagerMac(BridgedNativeWidget* widget); + explicit TooltipManagerMac(BridgedNativeWidgetImpl* widget); ~TooltipManagerMac() override; // TooltipManager: @@ -24,7 +24,7 @@ void TooltipTextChanged(View* view) override; private: - BridgedNativeWidget* widget_; // Weak. Owns this. + BridgedNativeWidgetImpl* widget_; // Weak. Owns this. DISALLOW_COPY_AND_ASSIGN(TooltipManagerMac); };
diff --git a/ui/views/cocoa/tooltip_manager_mac.mm b/ui/views/cocoa/tooltip_manager_mac.mm index 99a1fb5..4cb46db 100644 --- a/ui/views/cocoa/tooltip_manager_mac.mm +++ b/ui/views/cocoa/tooltip_manager_mac.mm
@@ -19,9 +19,8 @@ namespace views { -TooltipManagerMac::TooltipManagerMac(BridgedNativeWidget* widget) - : widget_(widget) { -} +TooltipManagerMac::TooltipManagerMac(BridgedNativeWidgetImpl* widget) + : widget_(widget) {} TooltipManagerMac::~TooltipManagerMac() { }
diff --git a/ui/views/cocoa/views_nswindow_delegate.h b/ui/views/cocoa/views_nswindow_delegate.h index 00c2e13..245eb66 100644 --- a/ui/views/cocoa/views_nswindow_delegate.h +++ b/ui/views/cocoa/views_nswindow_delegate.h
@@ -12,15 +12,15 @@ namespace views { class NativeWidgetMac; -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; } -// The delegate set on the NSWindow when a views::BridgedNativeWidget is +// The delegate set on the NSWindow when a views::BridgedNativeWidgetImpl is // initialized. VIEWS_EXPORT @interface ViewsNSWindowDelegate : NSObject<NSWindowDelegate> { @private - views::BridgedNativeWidget* parent_; // Weak. Owns this. + views::BridgedNativeWidgetImpl* parent_; // Weak. Owns this. base::scoped_nsobject<NSCursor> cursor_; } @@ -33,7 +33,7 @@ @property(retain, nonatomic) NSCursor* cursor; // Initialize with the given |parent|. -- (id)initWithBridgedNativeWidget:(views::BridgedNativeWidget*)parent; +- (id)initWithBridgedNativeWidget:(views::BridgedNativeWidgetImpl*)parent; // Notify that the window has been reordered in (or removed from) the window // server's screen list. This is a substitute for -[NSWindowDelegate
diff --git a/ui/views/cocoa/views_nswindow_delegate.mm b/ui/views/cocoa/views_nswindow_delegate.mm index 9d63bdb..b8bd9292 100644 --- a/ui/views/cocoa/views_nswindow_delegate.mm +++ b/ui/views/cocoa/views_nswindow_delegate.mm
@@ -15,7 +15,7 @@ @implementation ViewsNSWindowDelegate -- (id)initWithBridgedNativeWidget:(views::BridgedNativeWidget*)parent { +- (id)initWithBridgedNativeWidget:(views::BridgedNativeWidgetImpl*)parent { DCHECK(parent); if ((self = [super init])) { parent_ = parent;
diff --git a/ui/views/cocoa/widget_owner_nswindow_adapter.h b/ui/views/cocoa/widget_owner_nswindow_adapter.h index 8240bea..76d84c5 100644 --- a/ui/views/cocoa/widget_owner_nswindow_adapter.h +++ b/ui/views/cocoa/widget_owner_nswindow_adapter.h
@@ -16,13 +16,14 @@ namespace views { // An adapter that allows a views::Widget to be owned by an NSWindow that is not -// backed by another BridgedNativeWidget. +// backed by another BridgedNativeWidgetImpl. class WidgetOwnerNSWindowAdapter : public BridgedNativeWidgetOwner { public: // Create an adapter that will own |child|, tying its lifetime with the // NSWindow containing |anchor_view|. The object is self-deleting, via a call // to RemoveChildWindow() made in child->OnWindowWillClose(). - WidgetOwnerNSWindowAdapter(BridgedNativeWidget* child, NSView* anchor_view); + WidgetOwnerNSWindowAdapter(BridgedNativeWidgetImpl* child, + NSView* anchor_view); // Called when the owning window is closing. void OnWindowWillClose(); @@ -34,13 +35,13 @@ NSWindow* GetNSWindow() override; gfx::Vector2d GetChildWindowOffset() const override; bool IsVisibleParent() const override; - void RemoveChildWindow(BridgedNativeWidget* child) override; + void RemoveChildWindow(BridgedNativeWidgetImpl* child) override; private: // Self-deleting. ~WidgetOwnerNSWindowAdapter() override; - BridgedNativeWidget* child_; // Weak. Owned by its NativeWidgetMac. + BridgedNativeWidgetImpl* child_; // Weak. Owned by its NativeWidgetMac. base::scoped_nsobject<NSView> anchor_view_; base::scoped_nsobject<NSWindow> anchor_window_; base::scoped_nsobject<WidgetOwnerNSWindowAdapterBridge> observer_bridge_;
diff --git a/ui/views/cocoa/widget_owner_nswindow_adapter.mm b/ui/views/cocoa/widget_owner_nswindow_adapter.mm index 3585b783..cbaabaf8 100644 --- a/ui/views/cocoa/widget_owner_nswindow_adapter.mm +++ b/ui/views/cocoa/widget_owner_nswindow_adapter.mm
@@ -45,13 +45,12 @@ namespace views { WidgetOwnerNSWindowAdapter::WidgetOwnerNSWindowAdapter( - BridgedNativeWidget* child, + BridgedNativeWidgetImpl* child, NSView* anchor_view) : child_(child), anchor_view_([anchor_view retain]), observer_bridge_( [[WidgetOwnerNSWindowAdapterBridge alloc] initWithAdapter:this]) { - // Although the |anchor_view| must be in an NSWindow when the child dialog is // created, it's permitted for the |anchor_view| to be removed from its view // hierarchy before the child dialog window is fully removed from screen. When @@ -65,8 +64,8 @@ name:NSWindowWillCloseNotification object:anchor_window_]; - // BridgedNativeWidget removes NSWindow parent/child relationships for hidden - // windows. Observe when the parent's visibility changes so they can be + // BridgedNativeWidgetImpl removes NSWindow parent/child relationships for + // hidden windows. Observe when the parent's visibility changes so they can be // reconnected. [[NSNotificationCenter defaultCenter] addObserver:observer_bridge_ @@ -153,7 +152,8 @@ return [anchor_window_ isVisible]; } -void WidgetOwnerNSWindowAdapter::RemoveChildWindow(BridgedNativeWidget* child) { +void WidgetOwnerNSWindowAdapter::RemoveChildWindow( + BridgedNativeWidgetImpl* child) { DCHECK_EQ(child, child_); [GetNSWindow() removeChildWindow:child->ns_window()]; delete this;
diff --git a/ui/views/controls/native/native_view_host.cc b/ui/views/controls/native/native_view_host.cc index 32019ba..a0c853b 100644 --- a/ui/views/controls/native/native_view_host.cc +++ b/ui/views/controls/native/native_view_host.cc
@@ -67,6 +67,10 @@ InvalidateLayout(); } +gfx::NativeView NativeViewHost::GetNativeViewContainer() const { + return native_view_ ? native_wrapper_->GetNativeViewContainer() : nullptr; +} + void NativeViewHost::NativeViewDestroyed() { // Detach so we can clear our state and notify the native_wrapper_ to release // ref on the native view.
diff --git a/ui/views/controls/native/native_view_host.h b/ui/views/controls/native/native_view_host.h index 5bd897cf..ec0b8e9 100644 --- a/ui/views/controls/native/native_view_host.h +++ b/ui/views/controls/native/native_view_host.h
@@ -63,6 +63,10 @@ // NatieView's size always equals this View's size. void SetNativeViewSize(const gfx::Size& size); + // Returns the container that contains this host's native view. Returns null + // if there's no attached native view or it has no container. + gfx::NativeView GetNativeViewContainer() const; + // Fast resizing will move the native view and clip its visible region, this // will result in white areas and will not resize the content (so scrollbars // will be all wrong and content will flow offscreen). Only use this
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc index 4bd67c7a..6c31922 100644 --- a/ui/views/controls/native/native_view_host_aura.cc +++ b/ui/views/controls/native/native_view_host_aura.cc
@@ -212,6 +212,10 @@ client->FocusWindow(window); } +gfx::NativeView NativeViewHostAura::GetNativeViewContainer() const { + return clipping_window_.get(); +} + gfx::NativeViewAccessible NativeViewHostAura::GetNativeViewAccessible() { return NULL; }
diff --git a/ui/views/controls/native/native_view_host_aura.h b/ui/views/controls/native/native_view_host_aura.h index a607299..0adf8fb3 100644 --- a/ui/views/controls/native/native_view_host_aura.h +++ b/ui/views/controls/native/native_view_host_aura.h
@@ -41,6 +41,7 @@ override; void HideWidget() override; void SetFocus() override; + gfx::NativeView GetNativeViewContainer() const override; gfx::NativeViewAccessible GetNativeViewAccessible() override; gfx::NativeCursor GetCursor(int x, int y) override;
diff --git a/ui/views/controls/native/native_view_host_mac.h b/ui/views/controls/native/native_view_host_mac.h index 69659c9..de09f5b 100644 --- a/ui/views/controls/native/native_view_host_mac.h +++ b/ui/views/controls/native/native_view_host_mac.h
@@ -37,6 +37,7 @@ override; void HideWidget() override; void SetFocus() override; + gfx::NativeView GetNativeViewContainer() const override; gfx::NativeViewAccessible GetNativeViewAccessible() override; gfx::NativeCursor GetCursor(int x, int y) override;
diff --git a/ui/views/controls/native/native_view_host_mac.mm b/ui/views/controls/native/native_view_host_mac.mm index debbe51f..9ff1ff4c 100644 --- a/ui/views/controls/native/native_view_host_mac.mm +++ b/ui/views/controls/native/native_view_host_mac.mm
@@ -93,8 +93,9 @@ } EnsureNativeViewHasNoChildWidgets(native_view_); - BridgedNativeWidget* bridge = NativeWidgetMac::GetBridgeForNativeWindow( - host_->GetWidget()->GetNativeWindow()); + BridgedNativeWidgetImpl* bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow( + host_->GetWidget()->GetNativeWindow()); DCHECK(bridge); [bridge->ns_view() addSubview:native_view_]; bridge->SetAssociationForView(host_, native_view_); @@ -126,9 +127,10 @@ } EnsureNativeViewHasNoChildWidgets(host_->native_view()); - BridgedNativeWidget* bridge = NativeWidgetMac::GetBridgeForNativeWindow( - host_->GetWidget()->GetNativeWindow()); - // BridgedNativeWidget can be null when Widget is closing. + BridgedNativeWidgetImpl* bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow( + host_->GetWidget()->GetNativeWindow()); + // BridgedNativeWidgetImpl can be null when Widget is closing. if (bridge) bridge->ClearAssociationForView(host_); @@ -202,6 +204,11 @@ [[host_->native_view() window] makeFirstResponder:host_->native_view()]; } +gfx::NativeView NativeViewHostMac::GetNativeViewContainer() const { + NOTIMPLEMENTED(); + return nullptr; +} + gfx::NativeViewAccessible NativeViewHostMac::GetNativeViewAccessible() { return nullptr; }
diff --git a/ui/views/controls/native/native_view_host_wrapper.h b/ui/views/controls/native/native_view_host_wrapper.h index 513c35f..07cf9f1 100644 --- a/ui/views/controls/native/native_view_host_wrapper.h +++ b/ui/views/controls/native/native_view_host_wrapper.h
@@ -78,6 +78,10 @@ // Sets focus to the gfx::NativeView. virtual void SetFocus() = 0; + // Returns the container that contains the NativeViewHost's native view if + // any. + virtual gfx::NativeView GetNativeViewContainer() const = 0; + // Return the native view accessible corresponding to the wrapped native // view. virtual gfx::NativeViewAccessible GetNativeViewAccessible() = 0;
diff --git a/ui/views/linux_ui/linux_ui.h b/ui/views/linux_ui/linux_ui.h index 86a3c0a7..dd6ee1e 100644 --- a/ui/views/linux_ui/linux_ui.h +++ b/ui/views/linux_ui/linux_ui.h
@@ -104,9 +104,6 @@ // Returns the preferences that we pass to WebKit. virtual SkColor GetFocusRingColor() const = 0; - virtual SkColor GetThumbActiveColor() const = 0; - virtual SkColor GetThumbInactiveColor() const = 0; - virtual SkColor GetTrackColor() const = 0; virtual SkColor GetActiveSelectionBgColor() const = 0; virtual SkColor GetActiveSelectionFgColor() const = 0; virtual SkColor GetInactiveSelectionBgColor() const = 0;
diff --git a/ui/views/mus/desktop_window_tree_host_mus.cc b/ui/views/mus/desktop_window_tree_host_mus.cc index 93d30122..e0ef802 100644 --- a/ui/views/mus/desktop_window_tree_host_mus.cc +++ b/ui/views/mus/desktop_window_tree_host_mus.cc
@@ -43,7 +43,7 @@ namespace { // As the window manager renderers the non-client decorations this class does -// very little but honor the client area insets from the window manager. +// very little but honor kTopViewInset. class ClientSideNonClientFrameView : public NonClientFrameView, public aura::WindowObserver { public: @@ -58,11 +58,11 @@ ~ClientSideNonClientFrameView() override {} private: - // Returns the default values of client area insets from the window manager. - static gfx::Insets GetDefaultWindowManagerInsets(bool is_maximized) { - const WindowManagerFrameValues& values = - WindowManagerFrameValues::instance(); - return is_maximized ? values.maximized_insets : values.normal_insets; + gfx::Insets GetClientInsets() const { + const int top_inset = + widget_->GetNativeWindow()->GetRootWindow()->GetProperty( + aura::client::kTopViewInset); + return gfx::Insets(top_inset, 0, 0, 0); } // View: @@ -75,7 +75,7 @@ gfx::Rect result(GetLocalBounds()); if (widget_->IsFullscreen()) return result; - result.Inset(GetDefaultWindowManagerInsets(widget_->IsMaximized())); + result.Inset(GetClientInsets()); return result; } gfx::Rect GetWindowBoundsForClientBounds( @@ -83,12 +83,9 @@ if (widget_->IsFullscreen()) return client_bounds; - const gfx::Insets insets( - GetDefaultWindowManagerInsets(widget_->IsMaximized())); - return gfx::Rect(client_bounds.x() - insets.left(), - client_bounds.y() - insets.top(), - client_bounds.width() + insets.width(), - client_bounds.height() + insets.height()); + gfx::Rect outset_bounds = client_bounds; + outset_bounds.Inset(-GetClientInsets()); + return outset_bounds; } int NonClientHitTest(const gfx::Point& point) override { return HTNOWHERE; } void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override { @@ -136,17 +133,9 @@ void OnWindowPropertyChanged(aura::Window* window, const void* key, intptr_t old) override { - // Do a re-layout on state changes which affect GetBoundsForClientView(). - // The associated bounds change would also cause a re-layout, but there may - // not be a bounds change or it may come from the server before the state is - // updated. - if (key == aura::client::kShowStateKey) { - if (GetBoundsForClientView() != widget_->client_view()->bounds() && - window->GetProperty(aura::client::kShowStateKey) != - ui::SHOW_STATE_MINIMIZED) { - InvalidateLayout(); - widget_->GetRootView()->Layout(); - } + if (key == aura::client::kTopViewInset) { + InvalidateLayout(); + widget_->GetRootView()->Layout(); } } @@ -286,20 +275,6 @@ std::vector<gfx::Rect>()); } -void DesktopWindowTreeHostMus::SendHitTestMaskToServer() { - if (!native_widget_delegate_->HasHitTestMask()) { - aura::WindowPortMus::Get(window())->SetHitTestMask(base::nullopt); - return; - } - - gfx::Path mask_path; - native_widget_delegate_->GetHitTestMask(&mask_path); - // TODO(jamescook): Use the full path for the mask. - gfx::Rect mask_rect = - gfx::ToEnclosingRect(gfx::SkRectToRectF(mask_path.getBounds())); - aura::WindowPortMus::Get(window())->SetHitTestMask(mask_rect); -} - bool DesktopWindowTreeHostMus::IsFocusClientInstalledOnFocusSynchronizer() const { return MusClient::Get() @@ -428,7 +403,6 @@ // the NonClientView was created, which means we may not have sent the // client-area and hit-test-mask. SendClientAreaToServer(); - SendHitTestMaskToServer(); MusClient::Get()->OnCaptureClientSet( aura::client::GetCaptureClient(window())); @@ -871,7 +845,6 @@ } SendClientAreaToServer(); - SendHitTestMaskToServer(); } void DesktopWindowTreeHostMus::OnActiveFocusClientChanged( @@ -946,7 +919,6 @@ native_widget_delegate_->AsWidget()->non_client_view()->frame_view()); SendClientAreaToServer(); - SendHitTestMaskToServer(); } void DesktopWindowTreeHostMus::OnViewIsDeleting(View* observed_view) {
diff --git a/ui/views/mus/desktop_window_tree_host_mus.h b/ui/views/mus/desktop_window_tree_host_mus.h index a93e0c29..17c0655e 100644 --- a/ui/views/mus/desktop_window_tree_host_mus.h +++ b/ui/views/mus/desktop_window_tree_host_mus.h
@@ -49,7 +49,6 @@ private: void SendClientAreaToServer(); - void SendHitTestMaskToServer(); // Returns true if the FocusClient associated with our window is installed on // the FocusSynchronizer.
diff --git a/ui/views/mus/desktop_window_tree_host_mus_unittest.cc b/ui/views/mus/desktop_window_tree_host_mus_unittest.cc index 85bfbad..159770b 100644 --- a/ui/views/mus/desktop_window_tree_host_mus_unittest.cc +++ b/ui/views/mus/desktop_window_tree_host_mus_unittest.cc
@@ -24,7 +24,6 @@ #include "ui/views/mus/mus_client.h" #include "ui/views/mus/mus_client_test_api.h" #include "ui/views/mus/screen_mus.h" -#include "ui/views/mus/window_manager_frame_values.h" #include "ui/views/test/views_test_base.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" @@ -240,42 +239,24 @@ ->active_focus_client()); } -// Tests that changes to a widget's show state will cause the client area to be -// updated. -TEST_F(DesktopWindowTreeHostMusTest, ServerShowStateChangeUpdatesClientArea) { - WindowManagerFrameValues test_frame_values; - test_frame_values.normal_insets = {3, 0, 0, 0}; - test_frame_values.maximized_insets = {7, 0, 0, 0}; - WindowManagerFrameValues::SetInstance(test_frame_values); - +// Tests that changes to kTopViewInset will cause the client area to be updated. +TEST_F(DesktopWindowTreeHostMusTest, ServerTopInsetChangeUpdatesClientArea) { std::unique_ptr<Widget> widget(CreateWidget()); widget->Show(); - // Simulate state changes from the server. - auto set_widget_state = - [&widget](ui::WindowShowState state) { - widget->GetNativeWindow()->GetRootWindow()->SetProperty( - aura::client::kShowStateKey, state); - }; + auto set_top_inset = [&widget](int value) { + widget->GetNativeWindow()->GetRootWindow()->SetProperty( + aura::client::kTopViewInset, value); + }; - // A restored window respects normal_insets (the client area is inset from the - // root view). - gfx::Rect expected_restored_bounds = widget->GetRootView()->bounds(); - expected_restored_bounds.Inset(test_frame_values.normal_insets); - EXPECT_EQ(expected_restored_bounds, widget->client_view()->bounds()); - - // A fullscreen window has no insets. - EXPECT_FALSE(widget->IsFullscreen()); - set_widget_state(ui::SHOW_STATE_FULLSCREEN); - EXPECT_TRUE(widget->IsFullscreen()); EXPECT_EQ(widget->GetRootView()->bounds(), widget->client_view()->bounds()); - // A maximized window respects maximized_insets. - gfx::Rect expected_maximized_bounds = widget->GetRootView()->bounds(); - expected_maximized_bounds.Inset(test_frame_values.maximized_insets); - set_widget_state(ui::SHOW_STATE_MAXIMIZED); - EXPECT_FALSE(widget->IsFullscreen()); - EXPECT_EQ(expected_maximized_bounds, widget->client_view()->bounds()); + set_top_inset(3); + gfx::Rect root_bounds = widget->GetRootView()->bounds(); + root_bounds.Inset(gfx::Insets(3, 0, 0, 0)); + + set_top_inset(0); + EXPECT_EQ(widget->GetRootView()->bounds(), widget->client_view()->bounds()); } TEST_F(DesktopWindowTreeHostMusTest, CursorClientDuringTearDown) {
diff --git a/ui/views/test/widget_test_mac.mm b/ui/views/test/widget_test_mac.mm index 62f0311..d818b9f9 100644 --- a/ui/views/test/widget_test_mac.mm +++ b/ui/views/test/widget_test_mac.mm
@@ -82,7 +82,8 @@ // static ui::internal::InputMethodDelegate* WidgetTest::GetInputMethodDelegateForWidget( Widget* widget) { - return NativeWidgetMac::GetBridgeForNativeWindow(widget->GetNativeWindow()) + return NativeWidgetMac::GetBridgeImplForNativeWindow( + widget->GetNativeWindow()) ->native_widget_mac() ->bridge_host_for_testing(); }
diff --git a/ui/views/touchui/touch_selection_controller_impl.cc b/ui/views/touchui/touch_selection_controller_impl.cc index ae97f19..7a7b111 100644 --- a/ui/views/touchui/touch_selection_controller_impl.cc +++ b/ui/views/touchui/touch_selection_controller_impl.cc
@@ -202,34 +202,6 @@ bound.edge_bottom_rounded()); } -// A WindowTargeter that insets the top of the touch handle's hit-test region. -// This ensures that the client receives touch events above the painted image. -// The widget extends its height to handle touch events below the painted image. -class TouchHandleWindowTargeter : public aura::WindowTargeter { - public: - explicit TouchHandleWindowTargeter(aura::Window* window) : window_(window) {} - ~TouchHandleWindowTargeter() override = default; - - void SetTopInset(int inset) { SetInsets(gfx::Insets(inset, 0, 0, 0)); } - - // aura::WindowTargeter: - void OnSetInsets(const gfx::Insets& last_mouse_extend, - const gfx::Insets& last_touch_extend) override { - // Send the targeter insets to the window service if this is a mus client. - // This helps the window service send events directly to the text window. - // OnSetInsets is generally only called when the insets actually change. - if (window_->env()->mode() == aura::Env::Mode::MUS) { - gfx::Rect mask(window_->bounds().size()); - mask.Inset(touch_extend()); - aura::WindowPortMus::Get(window_->GetRootWindow())->SetHitTestMask(mask); - } - } - - private: - aura::Window* window_; - DISALLOW_COPY_AND_ASSIGN(TouchHandleWindowTargeter); -}; - } // namespace namespace views { @@ -251,7 +223,7 @@ widget_.reset(CreateTouchSelectionPopupWidget(context, this)); aura::Window* window = widget_->GetNativeWindow(); - targeter_ = new TouchHandleWindowTargeter(window); + targeter_ = new aura::WindowTargeter(); window->SetEventTargeter(std::unique_ptr<aura::WindowTargeter>(targeter_)); // We are owned by the TouchSelectionControllerImpl. @@ -379,8 +351,10 @@ selection_bound_.SetEdge(gfx::PointF(edge_top), gfx::PointF(edge_bottom)); } - targeter_->SetTopInset(selection_bound_.GetHeight() + - kSelectionHandleVerticalVisualOffset); + const gfx::Insets insets( + selection_bound_.GetHeight() + kSelectionHandleVerticalVisualOffset, 0, + 0, 0); + targeter_->SetInsets(insets, insets); } void SetDrawInvisible(bool draw_invisible) { @@ -394,11 +368,11 @@ std::unique_ptr<Widget> widget_; TouchSelectionControllerImpl* controller_; - // A custom targeter that shifts the hit-test target below the apparent bounds + // A WindowTargeter that shifts the hit-test target below the apparent bounds // to make dragging easier. The |widget_|'s NativeWindow takes ownership over // the |targeter_| but since the |widget_|'s lifetime is known to this class, // it can safely access the |targeter_|. - TouchHandleWindowTargeter* targeter_; + aura::WindowTargeter* targeter_; // In local coordinates gfx::SelectionBound selection_bound_;
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h index 5bb34bd..bb189ce 100644 --- a/ui/views/widget/native_widget_mac.h +++ b/ui/views/widget/native_widget_mac.h
@@ -15,6 +15,12 @@ class NativeWidgetMacNSWindow; #endif +namespace views_bridge_mac { +namespace mojom { +class BridgedNativeWidget; +} // namespace mojom +} // namespace views_bridge_mac + namespace views { namespace test { class HitTestNativeWidgetMac; @@ -22,7 +28,7 @@ class WidgetTest; } -class BridgedNativeWidget; +class BridgedNativeWidgetImpl; class BridgedNativeWidgetHostImpl; class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate { @@ -34,11 +40,11 @@ // the supplied handle has no associated Widget. static BridgedNativeWidgetHostImpl* GetBridgeHostImplForNativeWindow( gfx::NativeWindow window); - static BridgedNativeWidget* GetBridgeForNativeWindow( + static BridgedNativeWidgetImpl* GetBridgeImplForNativeWindow( gfx::NativeWindow window); // Informs |delegate_| that the native widget is about to be destroyed. - // BridgedNativeWidget::OnWindowWillClose() invokes this early when the + // BridgedNativeWidgetImpl::OnWindowWillClose() invokes this early when the // NSWindowDelegate informs the bridge that the window is being closed (later, // invoking OnWindowDestroyed()). void WindowDestroying(); @@ -144,7 +150,7 @@ std::string GetName() const override; protected: - // Creates the NSWindow that will be passed to the BridgedNativeWidget. + // Creates the NSWindow that will be passed to the BridgedNativeWidgetImpl. // Called by InitNativeWidget. The return value will be autoreleased. // Note that some tests (in particular, views_unittests that interact // with ScopedFakeNSWindowFullscreen, on 10.10) assume that these windows @@ -157,7 +163,8 @@ virtual void OnWindowDestroying(NSWindow* window) {} internal::NativeWidgetDelegate* delegate() { return delegate_; } - BridgedNativeWidget* bridge() const; + views_bridge_mac::mojom::BridgedNativeWidget* bridge() const; + BridgedNativeWidgetImpl* bridge_impl() const; BridgedNativeWidgetHostImpl* bridge_host_for_testing() const { return bridge_host_.get(); }
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index decbcdf..18c095e 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -93,10 +93,10 @@ } // static -BridgedNativeWidget* NativeWidgetMac::GetBridgeForNativeWindow( +BridgedNativeWidgetImpl* NativeWidgetMac::GetBridgeImplForNativeWindow( gfx::NativeWindow window) { if (NativeWidgetMac* widget = GetNativeWidgetMacForNativeWindow(window)) - return widget->bridge(); + return widget->bridge_impl(); return nullptr; // Not created by NativeWidgetMac. } @@ -139,7 +139,7 @@ name_ = params.name; base::scoped_nsobject<NativeWidgetMacNSWindow> window( [CreateNSWindow(params) retain]); - bridge()->SetWindow(window); + bridge_impl()->SetWindow(window); bridge_host_->InitWindow(params); // Only set always-on-top here if it is true since setting it may affect how @@ -152,7 +152,7 @@ DCHECK(GetWidget()->GetRootView()); bridge_host_->SetRootView(GetWidget()->GetRootView()); bridge()->CreateContentView(GetWidget()->GetRootView()->bounds()); - bridge()->CreateDragDropClient(GetWidget()->GetRootView()); + bridge_impl()->CreateDragDropClient(GetWidget()->GetRootView()); if (auto* focus_manager = GetWidget()->GetFocusManager()) { bridge()->MakeFirstResponder(); bridge_host_->SetFocusManager(focus_manager); @@ -201,7 +201,7 @@ } gfx::NativeWindow NativeWidgetMac::GetNativeWindow() const { - return bridge() ? bridge()->ns_window() : nil; + return bridge_impl() ? bridge_impl()->ns_window() : nil; } Widget* NativeWidgetMac::GetTopLevelWidget() { @@ -220,31 +220,32 @@ } void NativeWidgetMac::ReorderNativeViews() { - if (bridge()) - bridge()->ReorderChildViews(); + if (bridge_impl()) + bridge_impl()->ReorderChildViews(); } void NativeWidgetMac::ViewRemoved(View* view) { - DragDropClientMac* client = bridge() ? bridge()->drag_drop_client() : nullptr; + DragDropClientMac* client = + bridge_impl() ? bridge_impl()->drag_drop_client() : nullptr; if (client) client->drop_helper()->ResetTargetViewIfEquals(view); } void NativeWidgetMac::SetNativeWindowProperty(const char* name, void* value) { - if (bridge()) - bridge()->SetNativeWindowProperty(name, value); + if (bridge_impl()) + bridge_impl()->SetNativeWindowProperty(name, value); } void* NativeWidgetMac::GetNativeWindowProperty(const char* name) const { - if (bridge()) - return bridge()->GetNativeWindowProperty(name); + if (bridge_impl()) + return bridge_impl()->GetNativeWindowProperty(name); return nullptr; } TooltipManager* NativeWidgetMac::GetTooltipManager() const { - if (bridge()) - return bridge()->tooltip_manager(); + if (bridge_impl()) + return bridge_impl()->tooltip_manager(); return nullptr; } @@ -268,8 +269,8 @@ } void NativeWidgetMac::CenterWindow(const gfx::Size& size) { - SetSize( - BridgedNativeWidget::GetWindowSizeForClientSize(GetNativeWindow(), size)); + SetSize(BridgedNativeWidgetImpl::GetWindowSizeForClientSize(GetNativeWindow(), + size)); // Note that this is not the precise center of screen, but it is the standard // location for windows like dialogs to appear on screen for Mac. // TODO(tapted): If there is a parent window, center in that instead. @@ -311,7 +312,7 @@ // A peculiarity of the constrained window framework is that it permits a // dialog of MODAL_TYPE_WINDOW to have a null parent window; falling back to // a non-modal window in this case. - DCHECK(bridge()->parent() || modal_type == ui::MODAL_TYPE_WINDOW); + DCHECK(bridge_impl()->parent() || modal_type == ui::MODAL_TYPE_WINDOW); // Everything happens upon show. } @@ -338,14 +339,15 @@ } void NativeWidgetMac::SetBoundsConstrained(const gfx::Rect& bounds) { - if (!bridge()) + if (!bridge_impl()) return; gfx::Rect new_bounds(bounds); - NativeWidgetPrivate* ancestor = - bridge() && bridge()->parent() - ? GetNativeWidgetForNativeWindow(bridge()->parent()->GetNSWindow()) - : nullptr; + NativeWidgetPrivate* ancestor = nullptr; + if (bridge_impl() && bridge_impl()->parent()) { + ancestor = + GetNativeWidgetForNativeWindow(bridge_impl()->parent()->GetNSWindow()); + } if (!ancestor) { new_bounds = ConstrainBoundsToDisplayWorkArea(new_bounds); } else { @@ -517,7 +519,8 @@ const gfx::Point& location, int operation, ui::DragDropTypes::DragEventSource source) { - bridge()->drag_drop_client()->StartDragAndDrop(view, data, operation, source); + bridge_impl()->drag_drop_client()->StartDragAndDrop(view, data, operation, + source); } void NativeWidgetMac::SchedulePaintInRect(const gfx::Rect& rect) { @@ -535,8 +538,8 @@ } void NativeWidgetMac::SetCursor(gfx::NativeCursor cursor) { - if (bridge()) - bridge()->SetCursor(cursor); + if (bridge_impl()) + bridge_impl()->SetCursor(cursor); } bool NativeWidgetMac::IsMouseEventsEnabled() const { @@ -568,20 +571,20 @@ const gfx::Vector2d& drag_offset, Widget::MoveLoopSource source, Widget::MoveLoopEscapeBehavior escape_behavior) { - if (!bridge()) + if (!bridge_impl()) return Widget::MOVE_LOOP_CANCELED; - return bridge()->RunMoveLoop(drag_offset); + return bridge_impl()->RunMoveLoop(drag_offset); } void NativeWidgetMac::EndMoveLoop() { - if (bridge()) - bridge()->EndMoveLoop(); + if (bridge_impl()) + bridge_impl()->EndMoveLoop(); } void NativeWidgetMac::SetVisibilityChangedAnimationsEnabled(bool value) { - if (bridge()) - bridge()->SetAnimationEnabled(value); + if (bridge_impl()) + bridge_impl()->SetAnimationEnabled(value); } void NativeWidgetMac::SetVisibilityAnimationDuration( @@ -591,8 +594,8 @@ void NativeWidgetMac::SetVisibilityAnimationTransition( Widget::VisibilityTransition transition) { - if (bridge()) - bridge()->set_transitions_to_animate(transition); + if (bridge_impl()) + bridge_impl()->set_transitions_to_animate(transition); } bool NativeWidgetMac::IsTranslucentWindowOpacitySupported() const { @@ -631,7 +634,11 @@ defer:NO] autorelease]; } -BridgedNativeWidget* NativeWidgetMac::bridge() const { +views_bridge_mac::mojom::BridgedNativeWidget* NativeWidgetMac::bridge() const { + return bridge_host_ ? bridge_host_->bridge() : nullptr; +} + +BridgedNativeWidgetImpl* NativeWidgetMac::bridge_impl() const { return bridge_host_ ? bridge_host_->bridge_impl() : nullptr; } @@ -698,24 +705,25 @@ // static NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( gfx::NativeView native_view) { - BridgedNativeWidget* bridge = - NativeWidgetMac::GetBridgeForNativeWindow([native_view window]); - if (!bridge) + BridgedNativeWidgetImpl* bridge_impl = + NativeWidgetMac::GetBridgeImplForNativeWindow([native_view window]); + if (!bridge_impl) return nullptr; NativeWidgetPrivate* ancestor = - bridge->parent() ? GetTopLevelNativeWidget( - [bridge->parent()->GetNSWindow() contentView]) - : nullptr; - return ancestor ? ancestor : bridge->native_widget_mac(); + bridge_impl->parent() + ? GetTopLevelNativeWidget( + [bridge_impl->parent()->GetNSWindow() contentView]) + : nullptr; + return ancestor ? ancestor : bridge_impl->native_widget_mac(); } // static void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, Widget::Widgets* children) { - BridgedNativeWidget* bridge = - NativeWidgetMac::GetBridgeForNativeWindow([native_view window]); - if (!bridge) { + BridgedNativeWidgetImpl* bridge_impl = + NativeWidgetMac::GetBridgeImplForNativeWindow([native_view window]); + if (!bridge_impl) { // The NSWindow is not itself a views::Widget, but it may have children that // are. Support returning Widgets that are parented to the NSWindow, except: // - Ignore requests for children of an NSView that is not a contentView. @@ -738,37 +746,37 @@ // If |native_view| is a subview of the contentView, it will share an // NSWindow, but will itself be a native child of the Widget. That is, adding - // bridge->..->GetWidget() to |children| would be adding the _parent_ of + // bridge_impl->..->GetWidget() to |children| would be adding the _parent_ of // |native_view|, not the Widget for |native_view|. |native_view| doesn't have // a corresponding Widget of its own in this case (and so can't have Widget // children of its own on Mac). - if (bridge->ns_view() != native_view) + if (bridge_impl->ns_view() != native_view) return; // Code expects widget for |native_view| to be added to |children|. - if (bridge->native_widget_mac()->GetWidget()) - children->insert(bridge->native_widget_mac()->GetWidget()); + if (bridge_impl->native_widget_mac()->GetWidget()) + children->insert(bridge_impl->native_widget_mac()->GetWidget()); // When the NSWindow *is* a Widget, only consider child_windows(). I.e. do not - // look through -[NSWindow childWindows] as done for the (!bridge) case above. - // -childWindows does not support hidden windows, and anything in there which - // is not in child_windows() would have been added by AppKit. - for (BridgedNativeWidget* child : bridge->child_windows()) + // look through -[NSWindow childWindows] as done for the (!bridge_impl) case + // above. -childWindows does not support hidden windows, and anything in there + // which is not in child_windows() would have been added by AppKit. + for (BridgedNativeWidgetImpl* child : bridge_impl->child_windows()) GetAllChildWidgets(child->ns_view(), children); } // static void NativeWidgetPrivate::GetAllOwnedWidgets(gfx::NativeView native_view, Widget::Widgets* owned) { - BridgedNativeWidget* bridge = - NativeWidgetMac::GetBridgeForNativeWindow([native_view window]); + BridgedNativeWidgetImpl* bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow([native_view window]); if (!bridge) { GetAllChildWidgets(native_view, owned); return; } if (bridge->ns_view() != native_view) return; - for (BridgedNativeWidget* child : bridge->child_windows()) + for (BridgedNativeWidgetImpl* child : bridge->child_windows()) GetAllChildWidgets(child->ns_view(), owned); } @@ -781,10 +789,10 @@ return; } - BridgedNativeWidget* bridge = - NativeWidgetMac::GetBridgeForNativeWindow([native_view window]); - BridgedNativeWidget* parent_bridge = - NativeWidgetMac::GetBridgeForNativeWindow([new_parent window]); + BridgedNativeWidgetImpl* bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow([native_view window]); + BridgedNativeWidgetImpl* parent_bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow([new_parent window]); DCHECK(bridge); if (Widget::GetWidgetForNativeView(native_view)->is_top_level() && bridge->parent() == parent_bridge)
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index ebb9ea6..f75695b 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -93,11 +93,11 @@ namespace views { namespace test { -// BridgedNativeWidget friend to access private members. +// BridgedNativeWidgetImpl friend to access private members. class BridgedNativeWidgetTestApi { public: explicit BridgedNativeWidgetTestApi(NSWindow* window) { - bridge_ = NativeWidgetMac::GetBridgeForNativeWindow(window); + bridge_ = NativeWidgetMac::GetBridgeImplForNativeWindow(window); } // Simulate a frame swap from the compositor. @@ -116,7 +116,7 @@ } private: - BridgedNativeWidget* bridge_; + BridgedNativeWidgetImpl* bridge_; DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidgetTestApi); }; @@ -148,8 +148,8 @@ DISALLOW_COPY_AND_ASSIGN(TestWindowNativeWidgetMac); }; -// Tests for parts of NativeWidgetMac not covered by BridgedNativeWidget, which -// need access to Cocoa APIs. +// Tests for parts of NativeWidgetMac not covered by BridgedNativeWidgetImpl, +// which need access to Cocoa APIs. class NativeWidgetMacTest : public WidgetTest { public: NativeWidgetMacTest() {} @@ -757,8 +757,8 @@ EXPECT_EQ(child, top_level_widget->GetWidget()); // To verify the parent, we need to use NativeWidgetMac APIs. - BridgedNativeWidget* bridged_native_widget = - NativeWidgetMac::GetBridgeForNativeWindow(child->GetNativeWindow()); + BridgedNativeWidgetImpl* bridged_native_widget = + NativeWidgetMac::GetBridgeImplForNativeWindow(child->GetNativeWindow()); EXPECT_EQ(native_parent, bridged_native_widget->parent()->GetNSWindow()); const gfx::Rect child_bounds(50, 50, 200, 100); @@ -1247,7 +1247,7 @@ EXPECT_TRUE([retained_animation isAnimating]); // Hide without waiting for the animation to complete. Animation should cancel - // and clear references from BridgedNativeWidget. + // and clear references from BridgedNativeWidgetImpl. modal_dialog_widget->Hide(); EXPECT_FALSE([retained_animation isAnimating]); EXPECT_FALSE(test_api.show_animation()); @@ -1348,9 +1348,9 @@ // TODO(tapted): Ideally [native_parent orderOut:nil] would also work here. // But it does not. AppKit's childWindow management breaks down after an - // -orderOut: (see BridgedNativeWidget::OnVisibilityChanged()). For regular - // child windows, BridgedNativeWidget fixes the behavior with its own - // management. However, it can't do that for sheets without encountering + // -orderOut: (see BridgedNativeWidgetImpl::OnVisibilityChanged()). For + // regular child windows, BridgedNativeWidgetImpl fixes the behavior with its + // own management. However, it can't do that for sheets without encountering // http://crbug.com/605098 and http://crbug.com/667602. -[NSApp hide:] makes // the NSWindow hidden in a different way, which does not break like // -orderOut: does. Which is good, because a user can always do -[NSApp @@ -1546,8 +1546,8 @@ NSWindow* parent = MakeNativeParent(); Widget* dialog = views::DialogDelegate::CreateDialogWidget( new DialogDelegateView, nullptr, [parent contentView]); - BridgedNativeWidget* bridge = - NativeWidgetMac::GetBridgeForNativeWindow(dialog->GetNativeWindow()); + BridgedNativeWidgetImpl* bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow(dialog->GetNativeWindow()); EXPECT_EQ(bridge->parent()->GetNSWindow(), parent); Widget::ReparentNativeView(dialog->GetNativeView(), [parent contentView]); @@ -1559,7 +1559,8 @@ parent = parent_widget->GetNativeWindow(); dialog = views::DialogDelegate::CreateDialogWidget( new DialogDelegateView, nullptr, [parent contentView]); - bridge = NativeWidgetMac::GetBridgeForNativeWindow(dialog->GetNativeWindow()); + bridge = + NativeWidgetMac::GetBridgeImplForNativeWindow(dialog->GetNativeWindow()); EXPECT_EQ(bridge->parent()->GetNSWindow(), parent); Widget::ReparentNativeView(dialog->GetNativeView(), [parent contentView]); @@ -2106,8 +2107,8 @@ NativeWidgetMacTest::SetUp(); widget_ = CreateTopLevelPlatformWidget(); - bridge_ = - NativeWidgetMac::GetBridgeForNativeWindow(widget_->GetNativeWindow()); + bridge_ = NativeWidgetMac::GetBridgeImplForNativeWindow( + widget_->GetNativeWindow()); fake_full_keyboard_access_ = ui::test::ScopedFakeFullKeyboardAccess::GetInstance(); DCHECK(fake_full_keyboard_access_); @@ -2120,7 +2121,7 @@ } Widget* widget_ = nullptr; - BridgedNativeWidget* bridge_ = nullptr; + BridgedNativeWidgetImpl* bridge_ = nullptr; ui::test::ScopedFakeFullKeyboardAccess* fake_full_keyboard_access_ = nullptr; };
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc index 24c23336..90c36c70 100644 --- a/ui/views/widget/widget_unittest.cc +++ b/ui/views/widget/widget_unittest.cc
@@ -4080,7 +4080,7 @@ const Widget::InitParams::WindowOpacity opacity) { for (const auto& widget_type : widget_types_) { #if defined(OS_MACOSX) - // Tooltips are native on Mac. See BridgedNativeWidget::Init. + // Tooltips are native on Mac. See BridgedNativeWidgetImpl::Init. if (widget_type == Widget::InitParams::TYPE_TOOLTIP) continue; #elif defined(OS_WIN)
diff --git a/ui/views/widget/widget_utils_mac.mm b/ui/views/widget/widget_utils_mac.mm index 58d0a437..37eb7bf 100644 --- a/ui/views/widget/widget_utils_mac.mm +++ b/ui/views/widget/widget_utils_mac.mm
@@ -10,7 +10,7 @@ gfx::Size GetWindowSizeForClientSize(Widget* widget, const gfx::Size& size) { DCHECK(widget); - return BridgedNativeWidget::GetWindowSizeForClientSize( + return BridgedNativeWidgetImpl::GetWindowSizeForClientSize( widget->GetNativeWindow(), size); }
diff --git a/ui/wm/BUILD.gn b/ui/wm/BUILD.gn index 3df69ca..e7295a2f 100644 --- a/ui/wm/BUILD.gn +++ b/ui/wm/BUILD.gn
@@ -130,7 +130,6 @@ "core/compound_event_filter_unittest.cc", "core/coordinate_conversion_unittest.cc", "core/cursor_manager_unittest.cc", - "core/easy_resize_window_targeter_unittest.cc", "core/focus_controller_unittest.cc", "core/shadow_controller_unittest.cc", "core/transient_window_manager_unittest.cc",
diff --git a/ui/wm/core/easy_resize_window_targeter.cc b/ui/wm/core/easy_resize_window_targeter.cc index 2ada017..7707c2d2 100644 --- a/ui/wm/core/easy_resize_window_targeter.cc +++ b/ui/wm/core/easy_resize_window_targeter.cc
@@ -6,104 +6,23 @@ #include <algorithm> -#include "services/ws/public/mojom/window_manager.mojom.h" +#include "services/ws/public/mojom/window_tree_constants.mojom.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/transient_window_client.h" -#include "ui/aura/env.h" -#include "ui/aura/mus/window_port_mus.h" -#include "ui/aura/mus/window_tree_client.h" #include "ui/aura/window.h" #include "ui/events/event.h" -#include "ui/gfx/geometry/insets_f.h" -#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/insets.h" namespace wm { -namespace { - -gfx::Insets InsetsWithOnlyPositiveValues(const gfx::Insets& insets) { - return gfx::Insets(std::max(0, insets.top()), std::max(0, insets.left()), - std::max(0, insets.bottom()), std::max(0, insets.right())); -} - -} // namespace - -// HitMaskSetter is responsible for setting the hit-test mask on a Window. -class EasyResizeWindowTargeter::HitMaskSetter : public aura::WindowObserver { - public: - explicit HitMaskSetter(aura::Window* window) : window_(window) { - window_->AddObserver(this); - } - ~HitMaskSetter() override { - if (window_) { - aura::WindowPortMus::Get(window_)->SetHitTestMask(base::nullopt); - window_->RemoveObserver(this); - } - } - - void SetHitMaskInsets(const gfx::Insets& insets) { - if (insets == insets_) - return; - - insets_ = insets; - ApplyHitTestMask(); - } - - private: - void ApplyHitTestMask() { - base::Optional<gfx::Rect> hit_test_mask( - gfx::Rect(window_->bounds().size())); - hit_test_mask->Inset(insets_); - aura::WindowPortMus::Get(window_)->SetHitTestMask(hit_test_mask); - } - - // aura::WindowObserver: - void OnWindowDestroying(aura::Window* window) override { - window_->RemoveObserver(this); - window_ = nullptr; - } - void OnWindowBoundsChanged(aura::Window* window, - const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds, - ui::PropertyChangeReason reason) override { - ApplyHitTestMask(); - } - - private: - aura::Window* window_; - gfx::Insets insets_; - - DISALLOW_COPY_AND_ASSIGN(HitMaskSetter); -}; EasyResizeWindowTargeter::EasyResizeWindowTargeter( - aura::Window* container, const gfx::Insets& mouse_extend, - const gfx::Insets& touch_extend) - : container_(container) { - DCHECK(container_); + const gfx::Insets& touch_extend) { SetInsets(mouse_extend, touch_extend); } EasyResizeWindowTargeter::~EasyResizeWindowTargeter() {} -void EasyResizeWindowTargeter::OnSetInsets( - const gfx::Insets& last_mouse_extend, - const gfx::Insets& last_touch_extend) { - if (container_->env()->mode() != aura::Env::Mode::MUS) - return; - - // Positive values equate to a hit test mask. - const gfx::Insets positive_mouse_insets = - InsetsWithOnlyPositiveValues(mouse_extend()); - if (positive_mouse_insets.IsEmpty()) { - hit_mask_setter_.reset(); - } else { - if (!hit_mask_setter_) - hit_mask_setter_ = std::make_unique<HitMaskSetter>(container_); - hit_mask_setter_->SetHitMaskInsets(positive_mouse_insets); - } -} - bool EasyResizeWindowTargeter::EventLocationInsideBounds( aura::Window* target, const ui::LocatedEvent& event) const { @@ -111,28 +30,28 @@ } bool EasyResizeWindowTargeter::ShouldUseExtendedBounds( - const aura::Window* window) const { - // Use the extended bounds only for immediate child windows of |container_|. + const aura::Window* w) const { + DCHECK(window()); + // Use the extended bounds only for immediate child windows of window(). // Use the default targeter otherwise. - if (window->parent() != container_) + if (w->parent() != window()) return false; // Only resizable windows benefit from the extended hit-test region. - if ((window->GetProperty(aura::client::kResizeBehaviorKey) & + if ((w->GetProperty(aura::client::kResizeBehaviorKey) & ws::mojom::kResizeBehaviorCanResize) == 0) { return false; } // For transient children use extended bounds if a transient parent or if - // transient parent's parent is a top level window in |container_|. + // transient parent's parent is a top level window in window(). aura::client::TransientWindowClient* transient_window_client = aura::client::GetTransientWindowClient(); const aura::Window* transient_parent = - transient_window_client - ? transient_window_client->GetTransientParent(window) - : nullptr; - return !transient_parent || transient_parent == container_ || - transient_parent->parent() == container_; + transient_window_client ? transient_window_client->GetTransientParent(w) + : nullptr; + return !transient_parent || transient_parent == window() || + transient_parent->parent() == window(); } } // namespace wm
diff --git a/ui/wm/core/easy_resize_window_targeter.h b/ui/wm/core/easy_resize_window_targeter.h index d8ffa70..c54c91fc 100644 --- a/ui/wm/core/easy_resize_window_targeter.h +++ b/ui/wm/core/easy_resize_window_targeter.h
@@ -7,44 +7,33 @@ #include "base/macros.h" #include "ui/aura/window_targeter.h" -#include "ui/gfx/geometry/insets.h" #include "ui/wm/core/wm_core_export.h" +namespace gfx { +class Insets; +} + namespace wm { // An EventTargeter for a container window that uses a slightly larger // hit-target region for easier resize. -// TODO(sky): make this class final. class WM_CORE_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter { public: - // |container| window is the owner of this targeter. // NOTE: the insets must be negative. - EasyResizeWindowTargeter(aura::Window* container, - const gfx::Insets& mouse_extend, + EasyResizeWindowTargeter(const gfx::Insets& mouse_extend, const gfx::Insets& touch_extend); ~EasyResizeWindowTargeter() override; - protected: - // aura::WindowTargeter: - void OnSetInsets(const gfx::Insets& last_mouse_extend, - const gfx::Insets& last_touch_extend) override; - private: - class HitMaskSetter; - // aura::WindowTargeter: // Delegates to WindowTargeter's impl and prevents overriding in subclasses. bool EventLocationInsideBounds(aura::Window* target, - const ui::LocatedEvent& event) const final; + const ui::LocatedEvent& event) const override; // Returns true if the hit testing (GetHitTestRects()) should use the // extended bounds. - bool ShouldUseExtendedBounds(const aura::Window* window) const override; - - aura::Window* container_; - - std::unique_ptr<HitMaskSetter> hit_mask_setter_; + bool ShouldUseExtendedBounds(const aura::Window* w) const override; DISALLOW_COPY_AND_ASSIGN(EasyResizeWindowTargeter); };
diff --git a/ui/wm/core/easy_resize_window_targeter_unittest.cc b/ui/wm/core/easy_resize_window_targeter_unittest.cc deleted file mode 100644 index a8cb4ed..0000000 --- a/ui/wm/core/easy_resize_window_targeter_unittest.cc +++ /dev/null
@@ -1,66 +0,0 @@ -// 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. - -#include "ui/wm/core/easy_resize_window_targeter.h" - -#include "ui/aura/mus/window_port_mus.h" -#include "ui/aura/test/aura_mus_test_base.h" -#include "ui/aura/test/mus/test_window_tree.h" -#include "ui/aura/window.h" -#include "ui/compositor/layer_type.h" -#include "ui/gfx/geometry/insets.h" -#include "ui/gfx/geometry/rect.h" - -namespace wm { - -namespace { - -class TestEasyResizeWindowTargeter : public EasyResizeWindowTargeter { - public: - explicit TestEasyResizeWindowTargeter(aura::Window* window) - : EasyResizeWindowTargeter(window, gfx::Insets(), gfx::Insets()) {} -}; - -} // namespace - -using EasyResizeWindowTargeterTest = aura::test::AuraMusClientTestBase; - -TEST_F(EasyResizeWindowTargeterTest, SetHitTestMask) { - aura::Window window(nullptr); - window.Init(ui::LAYER_NOT_DRAWN); - TestEasyResizeWindowTargeter window_targeter(&window); - const gfx::Rect bounds1 = gfx::Rect(10, 20, 200, 300); - window.SetBounds(bounds1); - const gfx::Insets insets1(1, 2, 3, 4); - window_targeter.SetInsets(insets1, insets1); - ASSERT_TRUE(window_tree()->last_hit_test_mask().has_value()); - EXPECT_EQ(gfx::Rect(insets1.left(), insets1.top(), - bounds1.width() - insets1.width(), - bounds1.height() - insets1.height()), - *window_tree()->last_hit_test_mask()); - - // Adjusting the bounds should trigger resetting the mask. - const gfx::Rect bounds2 = gfx::Rect(10, 20, 300, 400); - window.SetBounds(bounds2); - ASSERT_TRUE(window_tree()->last_hit_test_mask().has_value()); - EXPECT_EQ(gfx::Rect(insets1.left(), insets1.top(), - bounds2.width() - insets1.width(), - bounds2.height() - insets1.height()), - *window_tree()->last_hit_test_mask()); - - // Empty insets should reset the mask. - window_targeter.SetInsets(gfx::Insets(), gfx::Insets()); - EXPECT_FALSE(window_tree()->last_hit_test_mask().has_value()); - - const gfx::Insets insets2(-1, 3, 4, 5); - const gfx::Insets effective_insets2(0, 3, 4, 5); - window_targeter.SetInsets(insets2, insets2); - ASSERT_TRUE(window_tree()->last_hit_test_mask().has_value()); - EXPECT_EQ(gfx::Rect(effective_insets2.left(), effective_insets2.top(), - bounds2.width() - effective_insets2.width(), - bounds2.height() - effective_insets2.height()), - *window_tree()->last_hit_test_mask()); -} - -} // namespace wm
diff --git a/webrunner/BUILD.gn b/webrunner/BUILD.gn index 916674e7..c026221 100644 --- a/webrunner/BUILD.gn +++ b/webrunner/BUILD.gn
@@ -82,6 +82,7 @@ "//ui/ozone", "//ui/platform_window", "//ui/wm", + "//ui/wm/public", ] data_deps = [
diff --git a/webrunner/app/component_controller_impl.cc b/webrunner/app/component_controller_impl.cc index 29ed7fb..c0bbfe5 100644 --- a/webrunner/app/component_controller_impl.cc +++ b/webrunner/app/component_controller_impl.cc
@@ -41,9 +41,9 @@ } ComponentControllerImpl::~ComponentControllerImpl() { - for (WaitCallback& next_callback : termination_wait_callbacks_) { - next_callback(did_terminate_abnormally_ ? 1 : 0); - } + // Send process termination details to the client. + controller_binding_.events().OnTerminated(termination_exit_code_, + termination_reason_); } bool ComponentControllerImpl::BindToRequest( @@ -62,8 +62,10 @@ if (controller_request.is_valid()) { controller_binding_.Bind(std::move(controller_request)); - controller_binding_.set_error_handler( - fit::bind_member(this, &ComponentControllerImpl::Kill)); + controller_binding_.set_error_handler([this] { + // Signal graceful process termination. + RequestTermination(0, fuchsia::sys::TerminationReason::EXITED); + }); } runner_->context()->CreateFrame(frame_.NewRequest()); @@ -85,18 +87,14 @@ } void ComponentControllerImpl::Kill() { - did_terminate_abnormally_ = true; - runner_->DestroyComponent(this); + // Signal abnormal process termination. + RequestTermination(1, fuchsia::sys::TerminationReason::RUNNER_TERMINATED); } void ComponentControllerImpl::Detach() { controller_binding_.set_error_handler(nullptr); } -void ComponentControllerImpl::Wait(WaitCallback callback) { - termination_wait_callbacks_.push_back(std::move(callback)); -} - void ComponentControllerImpl::CreateView( fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner, fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) { @@ -107,4 +105,12 @@ view_is_bound_ = true; } +void ComponentControllerImpl::RequestTermination( + int termination_exit_code, + fuchsia::sys::TerminationReason reason) { + termination_reason_ = reason; + termination_exit_code_ = termination_exit_code; + runner_->DestroyComponent(this); +} + } // namespace webrunner
diff --git a/webrunner/app/component_controller_impl.h b/webrunner/app/component_controller_impl.h index d7b9459..f3504f63 100644 --- a/webrunner/app/component_controller_impl.h +++ b/webrunner/app/component_controller_impl.h
@@ -6,6 +6,7 @@ #define WEBRUNNER_APP_COMPONENT_CONTROLLER_IMPL_H_ #include <fuchsia/sys/cpp/fidl.h> +#include <fuchsia/ui/viewsv1/cpp/fidl.h> #include <lib/fidl/cpp/binding.h> #include <lib/fidl/cpp/binding_set.h> #include <memory> @@ -43,7 +44,6 @@ // fuchsia::sys::ComponentController implementation. void Kill() override; void Detach() override; - void Wait(WaitCallback callback) override; // fuchsia::ui::viewsv1::ViewProvider implementation. void CreateView( @@ -54,6 +54,11 @@ private: explicit ComponentControllerImpl(WebContentRunner* runner); + // Registers the termination reason for this Component and requests its + // termination from the parent WebContentRunner. + void RequestTermination(int termination_exit_code, + fuchsia::sys::TerminationReason reason); + // Binds |this| to a Runner::StartComponent() call. Returns false on failure // (e.g. when the URL in |startup_info| is invalid). bool BindToRequest(fuchsia::sys::Package package, @@ -75,9 +80,12 @@ base::fuchsia::ScopedServiceBinding<fuchsia::ui::viewsv1::ViewProvider>> view_provider_binding_; - std::vector<WaitCallback> termination_wait_callbacks_; + // Termination reason and exit-code to be reported via the + // sys::ComponentController::OnTerminated event. + fuchsia::sys::TerminationReason termination_reason_ = + fuchsia::sys::TerminationReason::UNKNOWN; + int termination_exit_code_ = 0; - bool did_terminate_abnormally_ = false; bool view_is_bound_ = false; DISALLOW_COPY_AND_ASSIGN(ComponentControllerImpl);
diff --git a/webrunner/fidl/frame.fidl b/webrunner/fidl/frame.fidl index 362db3ab..c7fdca92 100644 --- a/webrunner/fidl/frame.fidl +++ b/webrunner/fidl/frame.fidl
@@ -5,7 +5,7 @@ library chromium.web; using fuchsia.sys; -using fuchsia.ui; +using fuchsia.ui.viewsv1token; interface Frame { // Creates and registers a view with the view manager and returns its